mirror of
https://github.com/facebook/docusaurus.git
synced 2025-05-23 22:17:00 +02:00
refactor(cssnano-preset): migrate to TS (#7440)
* refactor(cssnano-preset): migrate to TS * fix
This commit is contained in:
parent
c8b5f230ab
commit
71b5901bcd
9 changed files with 76 additions and 43 deletions
|
@ -1 +1,4 @@
|
||||||
|
copyUntypedFiles.mjs
|
||||||
|
.tsbuildinfo*
|
||||||
|
tsconfig*
|
||||||
__tests__
|
__tests__
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
||||||
*
|
|
||||||
* This source code is licensed under the MIT license found in the
|
|
||||||
* LICENSE file in the root directory of this source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const advancedBasePreset = require('cssnano-preset-advanced');
|
|
||||||
const postCssSortMediaQueries = require('postcss-sort-media-queries');
|
|
||||||
const postCssRemoveOverriddenCustomProperties = require('./src/remove-overridden-custom-properties');
|
|
||||||
|
|
||||||
module.exports = function docusaurusCssnanoPreset(opts) {
|
|
||||||
const advancedPreset = advancedBasePreset({
|
|
||||||
autoprefixer: {add: false},
|
|
||||||
discardComments: {removeAll: true},
|
|
||||||
...opts,
|
|
||||||
});
|
|
||||||
|
|
||||||
advancedPreset.plugins.unshift(
|
|
||||||
[postCssSortMediaQueries],
|
|
||||||
[postCssRemoveOverriddenCustomProperties],
|
|
||||||
);
|
|
||||||
|
|
||||||
return advancedPreset;
|
|
||||||
};
|
|
|
@ -2,11 +2,15 @@
|
||||||
"name": "@docusaurus/cssnano-preset",
|
"name": "@docusaurus/cssnano-preset",
|
||||||
"version": "2.0.0-beta.20",
|
"version": "2.0.0-beta.20",
|
||||||
"description": "Advanced cssnano preset for maximum optimization.",
|
"description": "Advanced cssnano preset for maximum optimization.",
|
||||||
"main": "index.js",
|
"main": "lib/index.js",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
},
|
},
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc",
|
||||||
|
"watch": "tsc --watch"
|
||||||
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/facebook/docusaurus.git",
|
"url": "https://github.com/facebook/docusaurus.git",
|
||||||
|
@ -15,7 +19,8 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cssnano-preset-advanced": "^5.3.4",
|
"cssnano-preset-advanced": "^5.3.4",
|
||||||
"postcss": "^8.4.13",
|
"postcss": "^8.4.13",
|
||||||
"postcss-sort-media-queries": "^4.2.1"
|
"postcss-sort-media-queries": "^4.2.1",
|
||||||
|
"tslib": "^2.4.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"to-vfile": "^6.1.0"
|
"to-vfile": "^6.1.0"
|
||||||
|
|
11
packages/docusaurus-cssnano-preset/src/deps.d.ts
vendored
Normal file
11
packages/docusaurus-cssnano-preset/src/deps.d.ts
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare module 'postcss-sort-media-queries' {
|
||||||
|
const plugin: import('postcss').PluginCreator<object>;
|
||||||
|
export default plugin;
|
||||||
|
}
|
27
packages/docusaurus-cssnano-preset/src/index.ts
Normal file
27
packages/docusaurus-cssnano-preset/src/index.ts
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import advancedBasePreset from 'cssnano-preset-advanced';
|
||||||
|
import postCssSortMediaQueries from 'postcss-sort-media-queries';
|
||||||
|
import postCssRemoveOverriddenCustomProperties from './remove-overridden-custom-properties';
|
||||||
|
|
||||||
|
const preset: typeof advancedBasePreset = function preset(opts) {
|
||||||
|
const advancedPreset = advancedBasePreset({
|
||||||
|
autoprefixer: {add: false},
|
||||||
|
discardComments: {removeAll: true},
|
||||||
|
...opts,
|
||||||
|
});
|
||||||
|
|
||||||
|
advancedPreset.plugins.unshift(
|
||||||
|
[postCssSortMediaQueries, undefined],
|
||||||
|
[postCssRemoveOverriddenCustomProperties, undefined],
|
||||||
|
);
|
||||||
|
|
||||||
|
return advancedPreset;
|
||||||
|
};
|
||||||
|
|
||||||
|
export = preset;
|
|
@ -5,12 +5,12 @@
|
||||||
* LICENSE file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const path = require('path');
|
import path from 'path';
|
||||||
const vfile = require('to-vfile');
|
import vfile from 'to-vfile';
|
||||||
const postcss = require('postcss');
|
import postcss from 'postcss';
|
||||||
const postCssRemoveOverriddenCustomProperties = require('../index');
|
import postCssRemoveOverriddenCustomProperties from '../index';
|
||||||
|
|
||||||
const processFixture = (name) => {
|
const processFixture = (name: string) => {
|
||||||
const input = vfile.readSync(
|
const input = vfile.readSync(
|
||||||
path.join(__dirname, '__fixtures__', `${name}.css`),
|
path.join(__dirname, '__fixtures__', `${name}.css`),
|
||||||
'utf8',
|
'utf8',
|
|
@ -5,6 +5,10 @@
|
||||||
* LICENSE file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import type {Plugin, Rule, Node} from 'postcss';
|
||||||
|
|
||||||
|
const isRule = (node: Node | undefined): node is Rule => node?.type === 'rule';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This PostCSS plugin will remove duplicate/same custom properties (which are
|
* This PostCSS plugin will remove duplicate/same custom properties (which are
|
||||||
* actually overridden ones) **only** from `:root` selector.
|
* actually overridden ones) **only** from `:root` selector.
|
||||||
|
@ -17,32 +21,31 @@
|
||||||
* applied).
|
* applied).
|
||||||
* - If the same custom properties have at least one `!important` rule, then
|
* - If the same custom properties have at least one `!important` rule, then
|
||||||
* only those properties that do not have this rule will be removed.
|
* only those properties that do not have this rule will be removed.
|
||||||
* @returns {import('postcss').Plugin}
|
|
||||||
*/
|
*/
|
||||||
module.exports = function creator() {
|
function creator(): Plugin {
|
||||||
return {
|
return {
|
||||||
postcssPlugin: 'postcss-remove-overridden-custom-properties',
|
postcssPlugin: 'postcss-remove-overridden-custom-properties',
|
||||||
Declaration(decl) {
|
Declaration(decl) {
|
||||||
if (decl.parent.selector !== ':root') {
|
if (!isRule(decl.parent) || decl.parent.selector !== ':root') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const sameProperties = decl.parent.nodes.filter(
|
const sameProperties = decl.parent.nodes.filter(
|
||||||
(n) => n.prop === decl.prop,
|
(n) => 'prop' in n && n.prop === decl.prop,
|
||||||
);
|
);
|
||||||
const hasImportantProperties = sameProperties.some((p) =>
|
const hasImportantProperties = sameProperties.some(
|
||||||
Object.prototype.hasOwnProperty.call(p, 'important'),
|
(p) => 'important' in p,
|
||||||
);
|
);
|
||||||
|
|
||||||
const overriddenProperties = hasImportantProperties
|
const overriddenProperties = hasImportantProperties
|
||||||
? sameProperties.filter(
|
? sameProperties.filter((p) => !('important' in p))
|
||||||
(p) => !Object.prototype.hasOwnProperty.call(p, 'important'),
|
|
||||||
)
|
|
||||||
: sameProperties.slice(0, -1);
|
: sameProperties.slice(0, -1);
|
||||||
|
|
||||||
overriddenProperties.map((p) => p.remove());
|
overriddenProperties.map((p) => p.remove());
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
module.exports.postcss = true;
|
creator.postcss = true as const;
|
||||||
|
|
||||||
|
export default creator;
|
9
packages/docusaurus-cssnano-preset/tsconfig.json
Normal file
9
packages/docusaurus-cssnano-preset/tsconfig.json
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"extends": "../../tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"incremental": true,
|
||||||
|
"tsBuildInfoFile": "./lib/.tsbuildinfo",
|
||||||
|
"rootDir": "src",
|
||||||
|
"outDir": "lib"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue