diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2023-10-14 15:05:55 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2023-10-14 15:05:55 +0800 |
| commit | c06f7ee0a40255214c477e13d9b956a7e07c2900 (patch) | |
| tree | f5982a568ef8fab865d0142e71c7494fea3e4c1b /node_modules/stylehacks | |
| parent | 3fd9400d4dccc25aa29b5702216732e0b7542073 (diff) | |
postcss,(plugins): nanocss, postcss-preset-env
Diffstat (limited to 'node_modules/stylehacks')
45 files changed, 1144 insertions, 0 deletions
diff --git a/node_modules/stylehacks/LICENSE-MIT b/node_modules/stylehacks/LICENSE-MIT new file mode 100644 index 00000000..fd0e863a --- /dev/null +++ b/node_modules/stylehacks/LICENSE-MIT @@ -0,0 +1,22 @@ +Copyright (c) Ben Briggs <beneb.info@gmail.com> (http://beneb.info) + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/stylehacks/README.md b/node_modules/stylehacks/README.md new file mode 100644 index 00000000..a4eed7d5 --- /dev/null +++ b/node_modules/stylehacks/README.md @@ -0,0 +1,91 @@ +# stylehacks + +> Detect/remove browser hacks from CSS files. + + +## Install + +With [npm](https://npmjs.org/package/stylehacks) do: + +``` +npm install stylehacks --save +``` + + +## Example + +In its default mode, stylehacks will remove hacks from your CSS file, based on +the browsers that you wish to support. + +### Input + +```css +h1 { + _color: white; + color: rgba(255, 255, 255, 0.5); +} +``` + +### Output + +```css +h1 { + color: rgba(255, 255, 255, 0.5); +} +``` + + +## API + +### `stylehacks.detect(node)` + +Type: `function` +Returns: `boolean` + +This method will take any PostCSS *node*, run applicable plugins depending on +its type, then will return a boolean depending on whether it found any of +the supported hacks. For example, if the `decl` node found below is passed to +the `detect` function, it will return `true`. But if the `rule` node is passed, +it will return `false` instead. + +```css +h1 { _color: red } +``` + +### `postcss([ stylehacks(opts) ])` + +stylehacks can also be consumed as a PostCSS plugin. See the +[documentation](https://github.com/postcss/postcss#usage) for examples for +your environment. + +#### options + +##### lint + +Type: `boolean` +Default: `false` + +If lint mode is enabled, stylehacks will not remove hacks from the CSS; instead, +it will add warnings to `Result#messages`. + + +## Related + +stylehacks works well with your existing PostCSS setup: + +* [stylelint] - Comprehensive & modern CSS linter, to ensure that your code + style rules are respected. + + +## Contributing + +Pull requests are welcome. If you add functionality, then please add unit tests +to cover it. + + +## License + +MIT © [Ben Briggs](http://beneb.info) + + +[stylelint]: https://github.com/stylelint/stylelint diff --git a/node_modules/stylehacks/package.json b/node_modules/stylehacks/package.json new file mode 100644 index 00000000..661b93ba --- /dev/null +++ b/node_modules/stylehacks/package.json @@ -0,0 +1,46 @@ +{ + "name": "stylehacks", + "version": "6.0.0", + "description": "Detect/remove browser hacks from CSS files.", + "main": "src/index.js", + "types": "types/index.d.ts", + "files": [ + "LICENSE-MIT", + "src", + "types" + ], + "keywords": [ + "browsers", + "css", + "hack", + "hacks", + "optimise", + "postcss", + "postcss-plugin", + "stylehacks" + ], + "license": "MIT", + "homepage": "https://github.com/cssnano/cssnano", + "author": { + "name": "Ben Briggs", + "email": "beneb.info@gmail.com", + "url": "http://beneb.info" + }, + "repository": "cssnano/cssnano", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "bugs": { + "url": "https://github.com/cssnano/cssnano/issues" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "devDependencies": { + "postcss": "^8.2.15" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } +}
\ No newline at end of file diff --git a/node_modules/stylehacks/src/dictionary/browsers.js b/node_modules/stylehacks/src/dictionary/browsers.js new file mode 100644 index 00000000..0aeb59fd --- /dev/null +++ b/node_modules/stylehacks/src/dictionary/browsers.js @@ -0,0 +1,9 @@ +'use strict'; +const FF_2 = 'firefox 2'; +const IE_5_5 = 'ie 5.5'; +const IE_6 = 'ie 6'; +const IE_7 = 'ie 7'; +const IE_8 = 'ie 8'; +const OP_9 = 'opera 9'; + +module.exports = { FF_2, IE_5_5, IE_6, IE_7, IE_8, OP_9 }; diff --git a/node_modules/stylehacks/src/dictionary/identifiers.js b/node_modules/stylehacks/src/dictionary/identifiers.js new file mode 100644 index 00000000..dcdcd40d --- /dev/null +++ b/node_modules/stylehacks/src/dictionary/identifiers.js @@ -0,0 +1,7 @@ +'use strict'; +const MEDIA_QUERY = 'media query'; +const PROPERTY = 'property'; +const SELECTOR = 'selector'; +const VALUE = 'value'; + +module.exports = { MEDIA_QUERY, PROPERTY, SELECTOR, VALUE }; diff --git a/node_modules/stylehacks/src/dictionary/postcss.js b/node_modules/stylehacks/src/dictionary/postcss.js new file mode 100644 index 00000000..1c547247 --- /dev/null +++ b/node_modules/stylehacks/src/dictionary/postcss.js @@ -0,0 +1,6 @@ +'use strict'; +const ATRULE = 'atrule'; +const DECL = 'decl'; +const RULE = 'rule'; + +module.exports = { ATRULE, DECL, RULE }; diff --git a/node_modules/stylehacks/src/dictionary/tags.js b/node_modules/stylehacks/src/dictionary/tags.js new file mode 100644 index 00000000..87a2c48b --- /dev/null +++ b/node_modules/stylehacks/src/dictionary/tags.js @@ -0,0 +1,5 @@ +'use strict'; +const BODY = 'body'; +const HTML = 'html'; + +module.exports = { BODY, HTML }; diff --git a/node_modules/stylehacks/src/exists.js b/node_modules/stylehacks/src/exists.js new file mode 100644 index 00000000..ba1c2ed6 --- /dev/null +++ b/node_modules/stylehacks/src/exists.js @@ -0,0 +1,13 @@ +'use strict'; + +/** + * @param {import('postcss-selector-parser').Selector} selector + * @param {number} index + * @param {string} value + * @return {boolean | undefined | ''} + */ +module.exports = function exists(selector, index, value) { + const node = selector.at(index); + + return node && node.value && node.value.toLowerCase() === value; +}; diff --git a/node_modules/stylehacks/src/index.js b/node_modules/stylehacks/src/index.js new file mode 100644 index 00000000..6b8ce94c --- /dev/null +++ b/node_modules/stylehacks/src/index.js @@ -0,0 +1,60 @@ +'use strict'; +const browserslist = require('browserslist'); +const plugins = require('./plugins'); + +/** @typedef {{lint?: boolean}} Options */ + +/** + * @type {import('postcss').PluginCreator<Options>} + * @param {Options} opts + * @return {import('postcss').Plugin} + */ +function pluginCreator(opts = {}) { + return { + postcssPlugin: 'stylehacks', + + OnceExit(css, { result }) { + /** @type {typeof result.opts & browserslist.Options} */ + const resultOpts = result.opts || {}; + const browsers = browserslist(null, { + stats: resultOpts.stats, + path: __dirname, + env: resultOpts.env, + }); + + /** @type {import('./plugin').Plugin[]} */ + const processors = []; + for (const Plugin of plugins) { + const hack = new Plugin(result); + if (!browsers.some((browser) => hack.targets.has(browser))) { + processors.push(hack); + } + } + css.walk((node) => { + processors.forEach((proc) => { + if (!proc.nodeTypes.has(node.type)) { + return; + } + + if (opts.lint) { + return proc.detectAndWarn(node); + } + + return proc.detectAndResolve(node); + }); + }); + }, + }; +} + +/** @type {(node: import('postcss').Node) => boolean} */ +pluginCreator.detect = (node) => { + return plugins.some((Plugin) => { + const hack = new Plugin(); + + return hack.any(node); + }); +}; + +pluginCreator.postcss = true; +module.exports = pluginCreator; diff --git a/node_modules/stylehacks/src/isMixin.js b/node_modules/stylehacks/src/isMixin.js new file mode 100644 index 00000000..5a08c409 --- /dev/null +++ b/node_modules/stylehacks/src/isMixin.js @@ -0,0 +1,15 @@ +'use strict'; +/** + * @param {import('postcss').Rule} node + * @return {boolean} + */ +module.exports = function isMixin(node) { + const { selector } = node; + + // If the selector ends with a ':' it is likely a part of a custom mixin. + if (!selector || selector[selector.length - 1] === ':') { + return true; + } + + return false; +}; diff --git a/node_modules/stylehacks/src/plugin.js b/node_modules/stylehacks/src/plugin.js new file mode 100644 index 00000000..15c6b5a9 --- /dev/null +++ b/node_modules/stylehacks/src/plugin.js @@ -0,0 +1,108 @@ +'use strict'; +/** + * @typedef {object} Plugin + * @prop {Set<string>} targets + * @prop {Set<string>} nodeTypes + * @prop {(node: import('postcss').Node) => void} detectAndResolve + * @prop {(node: import('postcss').Node) => void} detectAndWarn + */ + +/** + * @typedef {import('postcss').Node & {_stylehacks: { + message: string, + browsers: Set<string>, + identifier: string, + hack: string }}} NodeWithInfo + */ + +module.exports = class BasePlugin { + /** + * @param {string[]} targets + * @param {string[]} nodeTypes + * @param {import('postcss').Result=} result + */ + constructor(targets, nodeTypes, result) { + /** @type {NodeWithInfo[]} */ + this.nodes = []; + this.targets = new Set(targets); + this.nodeTypes = new Set(nodeTypes); + this.result = result; + } + + /** + * @param {import('postcss').Node} node + * @param {{identifier: string, hack: string}} metadata + * @return {void} + */ + push(node, metadata) { + /** @type {NodeWithInfo} */ (node)._stylehacks = Object.assign( + {}, + metadata, + { + message: `Bad ${metadata.identifier}: ${metadata.hack}`, + browsers: this.targets, + } + ); + + this.nodes.push(/** @type {NodeWithInfo} */ (node)); + } + + /** + * @param {import('postcss').Node} node + * @return {boolean} + */ + any(node) { + if (this.nodeTypes.has(node.type)) { + this.detect(node); + + return /** @type {NodeWithInfo} */ (node)._stylehacks !== undefined; + } + + return false; + } + + /** + * @param {import('postcss').Node} node + * @return {void} + */ + detectAndResolve(node) { + this.nodes = []; + + this.detect(node); + + return this.resolve(); + } + + /** + * @param {import('postcss').Node} node + * @return {void} + */ + detectAndWarn(node) { + this.nodes = []; + + this.detect(node); + + return this.warn(); + } + /** @param {import('postcss').Node} node */ + // eslint-disable-next-line no-unused-vars + detect(node) { + throw new Error('You need to implement this method in a subclass.'); + } + + /** @return {void} */ + resolve() { + return this.nodes.forEach((node) => node.remove()); + } + + warn() { + return this.nodes.forEach((node) => { + const { message, browsers, identifier, hack } = node._stylehacks; + + return node.warn( + /** @type {import('postcss').Result} */ (this.result), + message + JSON.stringify({ browsers, identifier, hack }) + ); + }); + } +}; diff --git a/node_modules/stylehacks/src/plugins/bodyEmpty.js b/node_modules/stylehacks/src/plugins/bodyEmpty.js new file mode 100644 index 00000000..edb40406 --- /dev/null +++ b/node_modules/stylehacks/src/plugins/bodyEmpty.js @@ -0,0 +1,49 @@ +'use strict'; +const parser = require('postcss-selector-parser'); +const exists = require('../exists'); +const isMixin = require('../isMixin'); +const BasePlugin = require('../plugin'); +const { FF_2 } = require('../dictionary/browsers'); +const { SELECTOR } = require('../dictionary/identifiers'); +const { RULE } = require('../dictionary/postcss'); +const { BODY } = require('../dictionary/tags'); + +module.exports = class BodyEmpty extends BasePlugin { + /** @param {import('postcss').Result} result */ + constructor(result) { + super([FF_2], [RULE], result); + } + + /** + * @param {import('postcss').Rule} rule + * @return {void} + */ + detect(rule) { + if (isMixin(rule)) { + return; + } + parser(this.analyse(rule)).processSync(rule.selector); + } + + /** + * @param {import('postcss').Rule} rule + * @return {parser.SyncProcessor<void>} + */ + analyse(rule) { + return (selectors) => { + selectors.each((selector) => { + if ( + exists(selector, 0, BODY) && + exists(selector, 1, ':empty') && + exists(selector, 2, ' ') && + selector.at(3) + ) { + this.push(rule, { + identifier: SELECTOR, + hack: selector.toString(), + }); + } + }); + }; + } +}; diff --git a/node_modules/stylehacks/src/plugins/htmlCombinatorCommentBody.js b/node_modules/stylehacks/src/plugins/htmlCombinatorCommentBody.js new file mode 100644 index 00000000..e20d5535 --- /dev/null +++ b/node_modules/stylehacks/src/plugins/htmlCombinatorCommentBody.js @@ -0,0 +1,54 @@ +'use strict'; +const parser = require('postcss-selector-parser'); +const exists = require('../exists'); +const isMixin = require('../isMixin'); +const BasePlugin = require('../plugin'); +const { IE_5_5, IE_6, IE_7 } = require('../dictionary/browsers'); +const { SELECTOR } = require('../dictionary/identifiers'); +const { RULE } = require('../dictionary/postcss'); +const { BODY, HTML } = require('../dictionary/tags'); + +module.exports = class HtmlCombinatorCommentBody extends BasePlugin { + /** @param {import('postcss').Result} result */ + constructor(result) { + super([IE_5_5, IE_6, IE_7], [RULE], result); + } + + /** + * @param {import('postcss').Rule} rule + * @return {void} + */ + detect(rule) { + if (isMixin(rule)) { + return; + } + if (rule.raws.selector && rule.raws.selector.raw) { + parser(this.analyse(rule)).processSync(rule.raws.selector.raw); + } + } + + /** @param {import('postcss').Rule} rule + * @return {parser.SyncProcessor<void>} + */ + analyse(rule) { + return (selectors) => { + selectors.each((selector) => { + if ( + exists(selector, 0, HTML) && + (exists(selector, 1, '>') || exists(selector, 1, '~')) && + selector.at(2) && + selector.at(2).type === 'comment' && + exists(selector, 3, ' ') && + exists(selector, 4, BODY) && + exists(selector, 5, ' ') && + selector.at(6) + ) { + this.push(rule, { + identifier: SELECTOR, + hack: selector.toString(), + }); + } + }); + }; + } +}; diff --git a/node_modules/stylehacks/src/plugins/htmlFirstChild.js b/node_modules/stylehacks/src/plugins/htmlFirstChild.js new file mode 100644 index 00000000..f772786b --- /dev/null +++ b/node_modules/stylehacks/src/plugins/htmlFirstChild.js @@ -0,0 +1,50 @@ +'use strict'; +const parser = require('postcss-selector-parser'); +const exists = require('../exists'); +const isMixin = require('../isMixin'); +const BasePlugin = require('../plugin'); +const { OP_9 } = require('../dictionary/browsers'); +const { SELECTOR } = require('../dictionary/identifiers'); +const { RULE } = require('../dictionary/postcss'); +const { HTML } = require('../dictionary/tags'); + +module.exports = class HtmlFirstChild extends BasePlugin { + /** @param {import('postcss').Result} result */ + constructor(result) { + super([OP_9], [RULE], result); + } + + /** + * @param {import('postcss').Rule} rule + * @return {void} + */ + detect(rule) { + if (isMixin(rule)) { + return; + } + + parser(this.analyse(rule)).processSync(rule.selector); + } + + /** + * @param {import('postcss').Rule} rule + * @return {parser.SyncProcessor<void>} + */ + analyse(rule) { + return (selectors) => { + selectors.each((selector) => { + if ( + exists(selector, 0, HTML) && + exists(selector, 1, ':first-child') && + exists(selector, 2, ' ') && + selector.at(3) + ) { + this.push(rule, { + identifier: SELECTOR, + hack: selector.toString(), + }); + } + }); + }; + } +}; diff --git a/node_modules/stylehacks/src/plugins/important.js b/node_modules/stylehacks/src/plugins/important.js new file mode 100644 index 00000000..ab3745c9 --- /dev/null +++ b/node_modules/stylehacks/src/plugins/important.js @@ -0,0 +1,25 @@ +'use strict'; +const BasePlugin = require('../plugin'); +const { IE_5_5, IE_6, IE_7 } = require('../dictionary/browsers'); +const { DECL } = require('../dictionary/postcss'); + +module.exports = class Important extends BasePlugin { + /** @param {import('postcss').Result=} result */ + constructor(result) { + super([IE_5_5, IE_6, IE_7], [DECL], result); + } + /** + * @param {import('postcss').Declaration} decl + * @return {void} + */ + detect(decl) { + const match = decl.value.match(/!\w/); + if (match && match.index) { + const hack = decl.value.substr(match.index, decl.value.length - 1); + this.push(decl, { + identifier: '!important', + hack, + }); + } + } +}; diff --git a/node_modules/stylehacks/src/plugins/index.js b/node_modules/stylehacks/src/plugins/index.js new file mode 100644 index 00000000..d09ad206 --- /dev/null +++ b/node_modules/stylehacks/src/plugins/index.js @@ -0,0 +1,28 @@ +'use strict'; +const bodyEmpty = require('./bodyEmpty'); +const htmlCombinatorCommentBody = require('./htmlCombinatorCommentBody'); +const htmlFirstChild = require('./htmlFirstChild'); +const important = require('./important'); +const leadingStar = require('./leadingStar'); +const leadingUnderscore = require('./leadingUnderscore'); +const mediaSlash0 = require('./mediaSlash0'); +const mediaSlash0Slash9 = require('./mediaSlash0Slash9'); +const mediaSlash9 = require('./mediaSlash9'); +const slash9 = require('./slash9'); +const starHtml = require('./starHtml'); +const trailingSlashComma = require('./trailingSlashComma'); + +module.exports = [ + bodyEmpty, + htmlCombinatorCommentBody, + htmlFirstChild, + important, + leadingStar, + leadingUnderscore, + mediaSlash0, + mediaSlash0Slash9, + mediaSlash9, + slash9, + starHtml, + trailingSlashComma, +]; diff --git a/node_modules/stylehacks/src/plugins/leadingStar.js b/node_modules/stylehacks/src/plugins/leadingStar.js new file mode 100644 index 00000000..62064409 --- /dev/null +++ b/node_modules/stylehacks/src/plugins/leadingStar.js @@ -0,0 +1,55 @@ +'use strict'; +const BasePlugin = require('../plugin'); +const { IE_5_5, IE_6, IE_7 } = require('../dictionary/browsers'); +const { PROPERTY } = require('../dictionary/identifiers'); +const { ATRULE, DECL } = require('../dictionary/postcss'); + +const hacks = '!_$_&_*_)_=_%_+_,_._/_`_]_#_~_?_:_|'.split('_'); + +module.exports = class LeadingStar extends BasePlugin { + /** @param {import('postcss').Result=} result */ + constructor(result) { + super([IE_5_5, IE_6, IE_7], [ATRULE, DECL], result); + } + + /** + * @param {import('postcss').Declaration | import('postcss').AtRule} node + * @return {void} + */ + detect(node) { + if (node.type === DECL) { + // some values are not picked up by before, so ensure they are + // at the beginning of the value + hacks.forEach((hack) => { + if (!node.prop.indexOf(hack)) { + this.push(node, { + identifier: PROPERTY, + hack: node.prop, + }); + } + }); + const { before } = node.raws; + if (!before) { + return; + } + hacks.forEach((hack) => { + if (before.includes(hack)) { + this.push(node, { + identifier: PROPERTY, + hack: `${before.trim()}${node.prop}`, + }); + } + }); + } else { + // test for the @property: value; hack + const { name } = node; + const len = name.length - 1; + if (name.lastIndexOf(':') === len) { + this.push(node, { + identifier: PROPERTY, + hack: `@${name.substr(0, len)}`, + }); + } + } + } +}; diff --git a/node_modules/stylehacks/src/plugins/leadingUnderscore.js b/node_modules/stylehacks/src/plugins/leadingUnderscore.js new file mode 100644 index 00000000..ad09354f --- /dev/null +++ b/node_modules/stylehacks/src/plugins/leadingUnderscore.js @@ -0,0 +1,51 @@ +'use strict'; +const BasePlugin = require('../plugin'); +const { IE_6 } = require('../dictionary/browsers'); +const { PROPERTY } = require('../dictionary/identifiers'); +const { DECL } = require('../dictionary/postcss'); + +/** + * @param {string} prop + * @return {string} + */ +function vendorPrefix(prop) { + let match = prop.match(/^(-\w+-)/); + if (match) { + return match[0]; + } + + return ''; +} + +module.exports = class LeadingUnderscore extends BasePlugin { + /** @param {import('postcss').Result=} result */ + constructor(result) { + super([IE_6], [DECL], result); + } + + /** + * @param {import('postcss').Declaration} decl + * @return {void} + */ + detect(decl) { + const { before } = decl.raws; + + if (before && before.includes('_')) { + this.push(decl, { + identifier: PROPERTY, + hack: `${before.trim()}${decl.prop}`, + }); + } + + if ( + decl.prop[0] === '-' && + decl.prop[1] !== '-' && + vendorPrefix(decl.prop) === '' + ) { + this.push(decl, { + identifier: PROPERTY, + hack: decl.prop, + }); + } + } +}; diff --git a/node_modules/stylehacks/src/plugins/mediaSlash0.js b/node_modules/stylehacks/src/plugins/mediaSlash0.js new file mode 100644 index 00000000..c16b1828 --- /dev/null +++ b/node_modules/stylehacks/src/plugins/mediaSlash0.js @@ -0,0 +1,26 @@ +'use strict'; +const BasePlugin = require('../plugin'); +const { IE_8 } = require('../dictionary/browsers'); +const { MEDIA_QUERY } = require('../dictionary/identifiers'); +const { ATRULE } = require('../dictionary/postcss'); + +module.exports = class MediaSlash0 extends BasePlugin { + /** @param {import('postcss').Result} result */ + constructor(result) { + super([IE_8], [ATRULE], result); + } + /** + * @param {import('postcss').AtRule} rule + * @return {void} + */ + detect(rule) { + const params = rule.params.trim(); + + if (params.toLowerCase() === '\\0screen') { + this.push(rule, { + identifier: MEDIA_QUERY, + hack: params, + }); + } + } +}; diff --git a/node_modules/stylehacks/src/plugins/mediaSlash0Slash9.js b/node_modules/stylehacks/src/plugins/mediaSlash0Slash9.js new file mode 100644 index 00000000..6f610023 --- /dev/null +++ b/node_modules/stylehacks/src/plugins/mediaSlash0Slash9.js @@ -0,0 +1,27 @@ +'use strict'; +const BasePlugin = require('../plugin'); +const { IE_5_5, IE_6, IE_7, IE_8 } = require('../dictionary/browsers'); +const { MEDIA_QUERY } = require('../dictionary/identifiers'); +const { ATRULE } = require('../dictionary/postcss'); + +module.exports = class MediaSlash0Slash9 extends BasePlugin { + /** @param {import('postcss').Result} result */ + constructor(result) { + super([IE_5_5, IE_6, IE_7, IE_8], [ATRULE], result); + } + + /** + * @param {import('postcss').AtRule} rule + * @return {void} + */ + detect(rule) { + const params = rule.params.trim(); + + if (params.toLowerCase() === '\\0screen\\,screen\\9') { + this.push(rule, { + identifier: MEDIA_QUERY, + hack: params, + }); + } + } +}; diff --git a/node_modules/stylehacks/src/plugins/mediaSlash9.js b/node_modules/stylehacks/src/plugins/mediaSlash9.js new file mode 100644 index 00000000..ddad451e --- /dev/null +++ b/node_modules/stylehacks/src/plugins/mediaSlash9.js @@ -0,0 +1,27 @@ +'use strict'; +const BasePlugin = require('../plugin'); +const { IE_5_5, IE_6, IE_7 } = require('../dictionary/browsers'); +const { MEDIA_QUERY } = require('../dictionary/identifiers'); +const { ATRULE } = require('../dictionary/postcss'); + +module.exports = class MediaSlash9 extends BasePlugin { + /** @param {import('postcss').Result} result */ + constructor(result) { + super([IE_5_5, IE_6, IE_7], [ATRULE], result); + } + + /** + * @param {import('postcss').AtRule} rule + * @return {void} + */ + detect(rule) { + const params = rule.params.trim(); + + if (params.toLowerCase() === 'screen\\9') { + this.push(rule, { + identifier: MEDIA_QUERY, + hack: params, + }); + } + } +}; diff --git a/node_modules/stylehacks/src/plugins/slash9.js b/node_modules/stylehacks/src/plugins/slash9.js new file mode 100644 index 00000000..08e94626 --- /dev/null +++ b/node_modules/stylehacks/src/plugins/slash9.js @@ -0,0 +1,26 @@ +'use strict'; +const BasePlugin = require('../plugin.js'); +const { IE_6, IE_7, IE_8 } = require('../dictionary/browsers'); +const { VALUE } = require('../dictionary/identifiers'); +const { DECL } = require('../dictionary/postcss'); + +module.exports = class Slash9 extends BasePlugin { + /** @param {import('postcss').Result=} result */ + constructor(result) { + super([IE_6, IE_7, IE_8], [DECL], result); + } + + /** + * @param {import('postcss').Declaration} decl + * @return {void} + */ + detect(decl) { + let v = decl.value; + if (v && v.length > 2 && v.indexOf('\\9') === v.length - 2) { + this.push(decl, { + identifier: VALUE, + hack: v, + }); + } + } +}; diff --git a/node_modules/stylehacks/src/plugins/starHtml.js b/node_modules/stylehacks/src/plugins/starHtml.js new file mode 100644 index 00000000..3de73d3c --- /dev/null +++ b/node_modules/stylehacks/src/plugins/starHtml.js @@ -0,0 +1,50 @@ +'use strict'; +const parser = require('postcss-selector-parser'); +const exists = require('../exists'); +const isMixin = require('../isMixin'); +const BasePlugin = require('../plugin'); +const { IE_5_5, IE_6 } = require('../dictionary/browsers'); +const { SELECTOR } = require('../dictionary/identifiers'); +const { RULE } = require('../dictionary/postcss'); +const { HTML } = require('../dictionary/tags'); + +module.exports = class StarHtml extends BasePlugin { + /** @param {import('postcss').Result=} result */ + constructor(result) { + super([IE_5_5, IE_6], [RULE], result); + } + + /** + * @param {import('postcss').Rule} rule + * @return {void} + */ + detect(rule) { + if (isMixin(rule)) { + return; + } + parser(this.analyse(rule)).processSync(rule.selector); + } + + /** + * @param {import('postcss').Rule} rule + * @return {parser.SyncProcessor<void>} + */ + analyse(rule) { + return (selectors) => { + selectors.each((selector) => { + if ( + exists(selector, 0, '*') && + exists(selector, 1, ' ') && + exists(selector, 2, HTML) && + exists(selector, 3, ' ') && + selector.at(4) + ) { + this.push(rule, { + identifier: SELECTOR, + hack: selector.toString(), + }); + } + }); + }; + } +}; diff --git a/node_modules/stylehacks/src/plugins/trailingSlashComma.js b/node_modules/stylehacks/src/plugins/trailingSlashComma.js new file mode 100644 index 00000000..0d75c47b --- /dev/null +++ b/node_modules/stylehacks/src/plugins/trailingSlashComma.js @@ -0,0 +1,36 @@ +'use strict'; +const BasePlugin = require('../plugin'); +const isMixin = require('../isMixin'); +const { IE_5_5, IE_6, IE_7 } = require('../dictionary/browsers'); +const { SELECTOR } = require('../dictionary/identifiers'); +const { RULE } = require('../dictionary/postcss'); + +module.exports = class TrailingSlashComma extends BasePlugin { + /** @param {import('postcss').Result=} result */ + constructor(result) { + super([IE_5_5, IE_6, IE_7], [RULE], result); + } + + /** + * @param {import('postcss').Rule} rule + * @return {void} + */ + detect(rule) { + if (isMixin(rule)) { + return; + } + + const { selector } = rule; + const trim = selector.trim(); + + if ( + trim.lastIndexOf(',') === selector.length - 1 || + trim.lastIndexOf('\\') === selector.length - 1 + ) { + this.push(rule, { + identifier: SELECTOR, + hack: selector, + }); + } + } +}; diff --git a/node_modules/stylehacks/types/dictionary/browsers.d.ts b/node_modules/stylehacks/types/dictionary/browsers.d.ts new file mode 100644 index 00000000..297d830c --- /dev/null +++ b/node_modules/stylehacks/types/dictionary/browsers.d.ts @@ -0,0 +1,6 @@ +export const FF_2: "firefox 2"; +export const IE_5_5: "ie 5.5"; +export const IE_6: "ie 6"; +export const IE_7: "ie 7"; +export const IE_8: "ie 8"; +export const OP_9: "opera 9"; diff --git a/node_modules/stylehacks/types/dictionary/identifiers.d.ts b/node_modules/stylehacks/types/dictionary/identifiers.d.ts new file mode 100644 index 00000000..6d8e0f4d --- /dev/null +++ b/node_modules/stylehacks/types/dictionary/identifiers.d.ts @@ -0,0 +1,4 @@ +export const MEDIA_QUERY: "media query"; +export const PROPERTY: "property"; +export const SELECTOR: "selector"; +export const VALUE: "value"; diff --git a/node_modules/stylehacks/types/dictionary/postcss.d.ts b/node_modules/stylehacks/types/dictionary/postcss.d.ts new file mode 100644 index 00000000..02d3005a --- /dev/null +++ b/node_modules/stylehacks/types/dictionary/postcss.d.ts @@ -0,0 +1,3 @@ +export const ATRULE: "atrule"; +export const DECL: "decl"; +export const RULE: "rule"; diff --git a/node_modules/stylehacks/types/dictionary/tags.d.ts b/node_modules/stylehacks/types/dictionary/tags.d.ts new file mode 100644 index 00000000..06fdc70b --- /dev/null +++ b/node_modules/stylehacks/types/dictionary/tags.d.ts @@ -0,0 +1,2 @@ +export const BODY: "body"; +export const HTML: "html"; diff --git a/node_modules/stylehacks/types/exists.d.ts b/node_modules/stylehacks/types/exists.d.ts new file mode 100644 index 00000000..b3adc065 --- /dev/null +++ b/node_modules/stylehacks/types/exists.d.ts @@ -0,0 +1,2 @@ +declare function _exports(selector: import('postcss-selector-parser').Selector, index: number, value: string): boolean | undefined | ''; +export = _exports; diff --git a/node_modules/stylehacks/types/index.d.ts b/node_modules/stylehacks/types/index.d.ts new file mode 100644 index 00000000..9c12a566 --- /dev/null +++ b/node_modules/stylehacks/types/index.d.ts @@ -0,0 +1,16 @@ +export = pluginCreator; +/** @typedef {{lint?: boolean}} Options */ +/** + * @type {import('postcss').PluginCreator<Options>} + * @param {Options} opts + * @return {import('postcss').Plugin} + */ +declare function pluginCreator(opts?: Options): import('postcss').Plugin; +declare namespace pluginCreator { + export { detect, postcss, Options }; +} +type Options = { + lint?: boolean; +}; +declare function detect(node: import('postcss').Node): boolean; +declare var postcss: true; diff --git a/node_modules/stylehacks/types/isMixin.d.ts b/node_modules/stylehacks/types/isMixin.d.ts new file mode 100644 index 00000000..c15c4b0e --- /dev/null +++ b/node_modules/stylehacks/types/isMixin.d.ts @@ -0,0 +1,2 @@ +declare function _exports(node: import('postcss').Rule): boolean; +export = _exports; diff --git a/node_modules/stylehacks/types/plugin.d.ts b/node_modules/stylehacks/types/plugin.d.ts new file mode 100644 index 00000000..abbfeb48 --- /dev/null +++ b/node_modules/stylehacks/types/plugin.d.ts @@ -0,0 +1,60 @@ +export = BasePlugin; +declare class BasePlugin { + /** + * @param {string[]} targets + * @param {string[]} nodeTypes + * @param {import('postcss').Result=} result + */ + constructor(targets: string[], nodeTypes: string[], result?: import('postcss').Result | undefined); + /** @type {NodeWithInfo[]} */ + nodes: NodeWithInfo[]; + targets: Set<string>; + nodeTypes: Set<string>; + result: import("postcss").Result | undefined; + /** + * @param {import('postcss').Node} node + * @param {{identifier: string, hack: string}} metadata + * @return {void} + */ + push(node: import('postcss').Node, metadata: { + identifier: string; + hack: string; + }): void; + /** + * @param {import('postcss').Node} node + * @return {boolean} + */ + any(node: import('postcss').Node): boolean; + /** + * @param {import('postcss').Node} node + * @return {void} + */ + detectAndResolve(node: import('postcss').Node): void; + /** + * @param {import('postcss').Node} node + * @return {void} + */ + detectAndWarn(node: import('postcss').Node): void; + /** @param {import('postcss').Node} node */ + detect(node: import('postcss').Node): void; + /** @return {void} */ + resolve(): void; + warn(): void; +} +declare namespace BasePlugin { + export { Plugin, NodeWithInfo }; +} +type NodeWithInfo = import('postcss').Node & { + _stylehacks: { + message: string; + browsers: Set<string>; + identifier: string; + hack: string; + }; +}; +type Plugin = { + targets: Set<string>; + nodeTypes: Set<string>; + detectAndResolve: (node: import('postcss').Node) => void; + detectAndWarn: (node: import('postcss').Node) => void; +}; diff --git a/node_modules/stylehacks/types/plugins/bodyEmpty.d.ts b/node_modules/stylehacks/types/plugins/bodyEmpty.d.ts new file mode 100644 index 00000000..46c43b40 --- /dev/null +++ b/node_modules/stylehacks/types/plugins/bodyEmpty.d.ts @@ -0,0 +1,17 @@ +export = BodyEmpty; +declare class BodyEmpty extends BasePlugin { + /** @param {import('postcss').Result} result */ + constructor(result: import('postcss').Result); + /** + * @param {import('postcss').Rule} rule + * @return {void} + */ + detect(rule: import('postcss').Rule): void; + /** + * @param {import('postcss').Rule} rule + * @return {parser.SyncProcessor<void>} + */ + analyse(rule: import('postcss').Rule): parser.SyncProcessor<void>; +} +import BasePlugin = require("../plugin"); +import parser = require("postcss-selector-parser"); diff --git a/node_modules/stylehacks/types/plugins/htmlCombinatorCommentBody.d.ts b/node_modules/stylehacks/types/plugins/htmlCombinatorCommentBody.d.ts new file mode 100644 index 00000000..b5284974 --- /dev/null +++ b/node_modules/stylehacks/types/plugins/htmlCombinatorCommentBody.d.ts @@ -0,0 +1,16 @@ +export = HtmlCombinatorCommentBody; +declare class HtmlCombinatorCommentBody extends BasePlugin { + /** @param {import('postcss').Result} result */ + constructor(result: import('postcss').Result); + /** + * @param {import('postcss').Rule} rule + * @return {void} + */ + detect(rule: import('postcss').Rule): void; + /** @param {import('postcss').Rule} rule + * @return {parser.SyncProcessor<void>} + */ + analyse(rule: import('postcss').Rule): parser.SyncProcessor<void>; +} +import BasePlugin = require("../plugin"); +import parser = require("postcss-selector-parser"); diff --git a/node_modules/stylehacks/types/plugins/htmlFirstChild.d.ts b/node_modules/stylehacks/types/plugins/htmlFirstChild.d.ts new file mode 100644 index 00000000..f5f20f37 --- /dev/null +++ b/node_modules/stylehacks/types/plugins/htmlFirstChild.d.ts @@ -0,0 +1,17 @@ +export = HtmlFirstChild; +declare class HtmlFirstChild extends BasePlugin { + /** @param {import('postcss').Result} result */ + constructor(result: import('postcss').Result); + /** + * @param {import('postcss').Rule} rule + * @return {void} + */ + detect(rule: import('postcss').Rule): void; + /** + * @param {import('postcss').Rule} rule + * @return {parser.SyncProcessor<void>} + */ + analyse(rule: import('postcss').Rule): parser.SyncProcessor<void>; +} +import BasePlugin = require("../plugin"); +import parser = require("postcss-selector-parser"); diff --git a/node_modules/stylehacks/types/plugins/important.d.ts b/node_modules/stylehacks/types/plugins/important.d.ts new file mode 100644 index 00000000..42d6c456 --- /dev/null +++ b/node_modules/stylehacks/types/plugins/important.d.ts @@ -0,0 +1,11 @@ +export = Important; +declare class Important extends BasePlugin { + /** @param {import('postcss').Result=} result */ + constructor(result?: import('postcss').Result | undefined); + /** + * @param {import('postcss').Declaration} decl + * @return {void} + */ + detect(decl: import('postcss').Declaration): void; +} +import BasePlugin = require("../plugin"); diff --git a/node_modules/stylehacks/types/plugins/index.d.ts b/node_modules/stylehacks/types/plugins/index.d.ts new file mode 100644 index 00000000..8a43eeff --- /dev/null +++ b/node_modules/stylehacks/types/plugins/index.d.ts @@ -0,0 +1,8 @@ +declare const _exports: ({ + new (result?: import("postcss").Result | undefined): important; +} | { + new (result?: import("postcss").Result | undefined): trailingSlashComma; +})[]; +export = _exports; +import important = require("./important"); +import trailingSlashComma = require("./trailingSlashComma"); diff --git a/node_modules/stylehacks/types/plugins/leadingStar.d.ts b/node_modules/stylehacks/types/plugins/leadingStar.d.ts new file mode 100644 index 00000000..a9ea9683 --- /dev/null +++ b/node_modules/stylehacks/types/plugins/leadingStar.d.ts @@ -0,0 +1,11 @@ +export = LeadingStar; +declare class LeadingStar extends BasePlugin { + /** @param {import('postcss').Result=} result */ + constructor(result?: import('postcss').Result | undefined); + /** + * @param {import('postcss').Declaration | import('postcss').AtRule} node + * @return {void} + */ + detect(node: import('postcss').Declaration | import('postcss').AtRule): void; +} +import BasePlugin = require("../plugin"); diff --git a/node_modules/stylehacks/types/plugins/leadingUnderscore.d.ts b/node_modules/stylehacks/types/plugins/leadingUnderscore.d.ts new file mode 100644 index 00000000..f973a648 --- /dev/null +++ b/node_modules/stylehacks/types/plugins/leadingUnderscore.d.ts @@ -0,0 +1,11 @@ +export = LeadingUnderscore; +declare class LeadingUnderscore extends BasePlugin { + /** @param {import('postcss').Result=} result */ + constructor(result?: import('postcss').Result | undefined); + /** + * @param {import('postcss').Declaration} decl + * @return {void} + */ + detect(decl: import('postcss').Declaration): void; +} +import BasePlugin = require("../plugin"); diff --git a/node_modules/stylehacks/types/plugins/mediaSlash0.d.ts b/node_modules/stylehacks/types/plugins/mediaSlash0.d.ts new file mode 100644 index 00000000..70ad4bf1 --- /dev/null +++ b/node_modules/stylehacks/types/plugins/mediaSlash0.d.ts @@ -0,0 +1,11 @@ +export = MediaSlash0; +declare class MediaSlash0 extends BasePlugin { + /** @param {import('postcss').Result} result */ + constructor(result: import('postcss').Result); + /** + * @param {import('postcss').AtRule} rule + * @return {void} + */ + detect(rule: import('postcss').AtRule): void; +} +import BasePlugin = require("../plugin"); diff --git a/node_modules/stylehacks/types/plugins/mediaSlash0Slash9.d.ts b/node_modules/stylehacks/types/plugins/mediaSlash0Slash9.d.ts new file mode 100644 index 00000000..920d22ef --- /dev/null +++ b/node_modules/stylehacks/types/plugins/mediaSlash0Slash9.d.ts @@ -0,0 +1,11 @@ +export = MediaSlash0Slash9; +declare class MediaSlash0Slash9 extends BasePlugin { + /** @param {import('postcss').Result} result */ + constructor(result: import('postcss').Result); + /** + * @param {import('postcss').AtRule} rule + * @return {void} + */ + detect(rule: import('postcss').AtRule): void; +} +import BasePlugin = require("../plugin"); diff --git a/node_modules/stylehacks/types/plugins/mediaSlash9.d.ts b/node_modules/stylehacks/types/plugins/mediaSlash9.d.ts new file mode 100644 index 00000000..acbe9fb4 --- /dev/null +++ b/node_modules/stylehacks/types/plugins/mediaSlash9.d.ts @@ -0,0 +1,11 @@ +export = MediaSlash9; +declare class MediaSlash9 extends BasePlugin { + /** @param {import('postcss').Result} result */ + constructor(result: import('postcss').Result); + /** + * @param {import('postcss').AtRule} rule + * @return {void} + */ + detect(rule: import('postcss').AtRule): void; +} +import BasePlugin = require("../plugin"); diff --git a/node_modules/stylehacks/types/plugins/slash9.d.ts b/node_modules/stylehacks/types/plugins/slash9.d.ts new file mode 100644 index 00000000..ed514481 --- /dev/null +++ b/node_modules/stylehacks/types/plugins/slash9.d.ts @@ -0,0 +1,11 @@ +export = Slash9; +declare class Slash9 extends BasePlugin { + /** @param {import('postcss').Result=} result */ + constructor(result?: import('postcss').Result | undefined); + /** + * @param {import('postcss').Declaration} decl + * @return {void} + */ + detect(decl: import('postcss').Declaration): void; +} +import BasePlugin = require("../plugin.js"); diff --git a/node_modules/stylehacks/types/plugins/starHtml.d.ts b/node_modules/stylehacks/types/plugins/starHtml.d.ts new file mode 100644 index 00000000..5e5a495c --- /dev/null +++ b/node_modules/stylehacks/types/plugins/starHtml.d.ts @@ -0,0 +1,17 @@ +export = StarHtml; +declare class StarHtml extends BasePlugin { + /** @param {import('postcss').Result=} result */ + constructor(result?: import('postcss').Result | undefined); + /** + * @param {import('postcss').Rule} rule + * @return {void} + */ + detect(rule: import('postcss').Rule): void; + /** + * @param {import('postcss').Rule} rule + * @return {parser.SyncProcessor<void>} + */ + analyse(rule: import('postcss').Rule): parser.SyncProcessor<void>; +} +import BasePlugin = require("../plugin"); +import parser = require("postcss-selector-parser"); diff --git a/node_modules/stylehacks/types/plugins/trailingSlashComma.d.ts b/node_modules/stylehacks/types/plugins/trailingSlashComma.d.ts new file mode 100644 index 00000000..17f81fab --- /dev/null +++ b/node_modules/stylehacks/types/plugins/trailingSlashComma.d.ts @@ -0,0 +1,11 @@ +export = TrailingSlashComma; +declare class TrailingSlashComma extends BasePlugin { + /** @param {import('postcss').Result=} result */ + constructor(result?: import('postcss').Result | undefined); + /** + * @param {import('postcss').Rule} rule + * @return {void} + */ + detect(rule: import('postcss').Rule): void; +} +import BasePlugin = require("../plugin"); |
