refactor(cssnano-preset): migrate to TS (#7440)

* refactor(cssnano-preset): migrate to TS

* fix
This commit is contained in:
Joshua Chen 2022-05-17 21:41:30 +08:00 committed by GitHub
parent c8b5f230ab
commit 71b5901bcd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 76 additions and 43 deletions

View file

@ -1 +1,4 @@
copyUntypedFiles.mjs
.tsbuildinfo*
tsconfig*
__tests__ __tests__

View file

@ -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;
};

View file

@ -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"

View 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;
}

View 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;

View file

@ -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',

View file

@ -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;

View file

@ -0,0 +1,9 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"incremental": true,
"tsBuildInfoFile": "./lib/.tsbuildinfo",
"rootDir": "src",
"outDir": "lib"
}
}