├── .editorconfig ├── .github └── workflows │ └── test.yml ├── .gitignore ├── .gogenrc.js ├── .npmignore ├── CHANGELOG.md ├── README.md ├── cli.js ├── package.json ├── pnpm-lock.yaml └── template ├── .github └── workflows │ └── test.yml ├── .t.editorconfig ├── .t.gitignore ├── .t.npmignore ├── CHANGELOG.md ├── LICENSE.t ├── README.t.md ├── index.t.js ├── index.test.t.js └── package.t.json /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | on: 3 | push: 4 | branches: 5 | - main 6 | pull_request: 7 | permissions: 8 | contents: read 9 | jobs: 10 | test: 11 | name: Test 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout the repository 15 | uses: actions/checkout@v4 16 | - name: Install pnpm 17 | uses: pnpm/action-setup@v2 18 | with: 19 | version: 8 20 | - name: Install Node.js 21 | uses: actions/setup-node@v3 22 | with: 23 | node-version: 20 24 | cache: pnpm 25 | - name: Install all dependencies 26 | run: pnpm install --frozen-lockfile --ignore-scripts 27 | - name: Run tests 28 | run: pnpm test 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | 3 | coverage/ 4 | -------------------------------------------------------------------------------- /.gogenrc.js: -------------------------------------------------------------------------------- 1 | let { Snippet } = require('enquirer') 2 | let { EventEmitter } = require('events') 3 | let { execSync } = require('child_process') 4 | 5 | let isTest = process.env.CI || process.env.NODE_ENV === 'test' 6 | let command = (cmd) => execSync(cmd).toString().trim() 7 | let emitter = new EventEmitter() 8 | 9 | /** 10 | * @type {import('gogen').Generator} 11 | */ 12 | module.exports = async ( 13 | { src, dest, pipeline, template, install, gitInit }, 14 | { name, argv } 15 | ) => { 16 | let pluginPrefix = 'postcss-' 17 | let pluginName = name.startsWith(pluginPrefix) ? name : pluginPrefix + name 18 | let autodetects = { 19 | authorName: isTest ? ':name' : command('git config user.name'), 20 | authorEmail: isTest ? ':email' : command('git config user.email'), 21 | } 22 | let prompt = new Snippet({ 23 | name: 'pkg', 24 | message: 'Fill out the fields in package.json', 25 | required: true, 26 | values: { 27 | ...autodetects, 28 | }, 29 | fields: [{ name: 'gitHubName', message: 'GitHub login' }], 30 | template: `{ 31 | "name": "${pluginName}", 32 | "description": "PostCSS plugin \${description}", 33 | "repository": "\${gitHubName}/${pluginName}", 34 | "author": "\${authorName} <\${authorEmail}>", 35 | } 36 | `, 37 | }) 38 | prompt.on('run', () => emitter.emit('prompt:run', prompt)) 39 | let { values } = await prompt.run() 40 | 41 | await pipeline( 42 | src('template/**'), 43 | template({ 44 | ...values, 45 | pluginName, 46 | currentYear: new Date().getFullYear(), 47 | }), 48 | dest(pluginName) 49 | ) 50 | // handle `--no-install` 51 | if (argv.install !== false) { 52 | // handle `--npm` 53 | await install([], { client: argv.npm ? 'npm' : 'auto' }) 54 | } 55 | await gitInit() 56 | } 57 | 58 | module.exports.emitter = emitter 59 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | pnpm-lock.yaml 2 | 3 | .editorconfig 4 | .github/ 5 | coverage/ 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## 3.0 4 | * Replaced `uvu` to `node --test`. 5 | 6 | ## 2.0.1 7 | * Fixed CI config. 8 | 9 | ## 2.0 10 | * Replaced `jest` to `uvu`. 11 | * Updated Node.js version on CI. 12 | * Updated `node_modules` cache on CI. 13 | 14 | ## 1.0 15 | * Initial release. 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PostCSS Plugin Boilerplate 2 | 3 | 6 | 7 | Сreate new PostCSS plugins in a few steps: 8 | 9 | 1. Execute the wizard script. It will ask you a few questions 10 | and fill all files with your data. 11 | 12 | ```sh 13 | npx postcss-plugin-boilerplate 14 | ``` 15 | 16 | Call it with `--npm` argument, if you have [yarn](https://yarnpkg.com/) installed, but prefer to use npm as the package manager 17 | (by default, it will automatically decide whether to use yarn or npm): 18 | 19 | ```sh 20 | node postcss-plugin-boilerplate --npm 21 | ``` 22 | 23 | Or use `--no-install` if you want to skip dependencies installation. 24 | 25 | 2. Your plugin repository will now have a clean Git history. 26 | [Create the GitHub repository](https://github.com/new) 27 | and push your project there. 28 | 29 | 3. Add your project to [Travis CI](https://travis-ci.org). 30 | 31 | 4. Write some code to `index.js` and tests to `index.test.js`. 32 | 33 | 5. Execute `npm test` command 34 | 35 | 6. Add input and output CSS examples to `README.md`. 36 | 37 | 7. Add options descriptions if your plugin has them. 38 | 39 | 8. Fill `CHANGELOG.md` with initial version. 40 | 41 | 9. Release by calling `npx clean-publish` 42 | (this tool will remove development configs from `package.json`). 43 | 44 | 10. Fork [PostCSS](https://github.com/postcss/postcss), add your plugin to the 45 | [Plugins list](https://github.com/postcss/postcss/blob/main/docs/plugins.md) 46 | and send a pull request. 47 | 48 | 11. Follow [@PostCSS](https://twitter.com/postcss) to get the latest updates. 49 | -------------------------------------------------------------------------------- /cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | let { run } = require('gogen') 4 | 5 | run( 6 | [__dirname, ...process.argv.slice(2)], 7 | 'Usage: npx postcss-plugin-boilerplate ', 8 | { boolean: ['install', 'npm'] } 9 | ) 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "postcss-plugin-boilerplate", 3 | "description": "PostCSS plugin boilerplate", 4 | "repository": "postcss/postcss-plugin-boilerplate", 5 | "version": "3.0.1", 6 | "license": "MIT", 7 | "bin": "cli.js", 8 | "keywords": [ 9 | "postcss", 10 | "boilerplate" 11 | ], 12 | "scripts": { 13 | "test": "eslint ." 14 | }, 15 | "dependencies": { 16 | "enquirer": "^2.4.1", 17 | "gogen": "^2.3.0" 18 | }, 19 | "devDependencies": { 20 | "clean-publish": "^4.2.0", 21 | "eslint": "^8.55.0" 22 | }, 23 | "eslintConfig": { 24 | "parserOptions": { 25 | "ecmaVersion": 2017 26 | }, 27 | "env": { 28 | "node": true, 29 | "es6": true 30 | }, 31 | "extends": [ 32 | "eslint:recommended" 33 | ], 34 | "rules": { 35 | "no-unused-vars": "off" 36 | } 37 | }, 38 | "prettier": { 39 | "arrowParens": "avoid", 40 | "jsxSingleQuote": false, 41 | "quoteProps": "consistent", 42 | "semi": false, 43 | "singleQuote": true, 44 | "trailingComma": "none" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | enquirer: 9 | specifier: ^2.4.1 10 | version: 2.4.1 11 | gogen: 12 | specifier: ^2.3.0 13 | version: 2.3.0 14 | 15 | devDependencies: 16 | clean-publish: 17 | specifier: ^4.2.0 18 | version: 4.2.0 19 | eslint: 20 | specifier: ^8.55.0 21 | version: 8.55.0 22 | 23 | packages: 24 | 25 | /@aashutoshrathi/word-wrap@1.2.6: 26 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 27 | engines: {node: '>=0.10.0'} 28 | dev: true 29 | 30 | /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): 31 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 32 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 33 | peerDependencies: 34 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 35 | dependencies: 36 | eslint: 8.55.0 37 | eslint-visitor-keys: 3.4.3 38 | dev: true 39 | 40 | /@eslint-community/regexpp@4.10.0: 41 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} 42 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 43 | dev: true 44 | 45 | /@eslint/eslintrc@2.1.4: 46 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 47 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 48 | dependencies: 49 | ajv: 6.12.6 50 | debug: 4.3.4 51 | espree: 9.6.1 52 | globals: 13.23.0 53 | ignore: 5.3.0 54 | import-fresh: 3.3.0 55 | js-yaml: 4.1.0 56 | minimatch: 3.1.2 57 | strip-json-comments: 3.1.1 58 | transitivePeerDependencies: 59 | - supports-color 60 | dev: true 61 | 62 | /@eslint/js@8.55.0: 63 | resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} 64 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 65 | dev: true 66 | 67 | /@humanwhocodes/config-array@0.11.13: 68 | resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} 69 | engines: {node: '>=10.10.0'} 70 | dependencies: 71 | '@humanwhocodes/object-schema': 2.0.1 72 | debug: 4.3.4 73 | minimatch: 3.1.2 74 | transitivePeerDependencies: 75 | - supports-color 76 | dev: true 77 | 78 | /@humanwhocodes/module-importer@1.0.1: 79 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 80 | engines: {node: '>=12.22'} 81 | dev: true 82 | 83 | /@humanwhocodes/object-schema@2.0.1: 84 | resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} 85 | dev: true 86 | 87 | /@nodelib/fs.scandir@2.1.5: 88 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 89 | engines: {node: '>= 8'} 90 | dependencies: 91 | '@nodelib/fs.stat': 2.0.5 92 | run-parallel: 1.2.0 93 | dev: true 94 | 95 | /@nodelib/fs.stat@2.0.5: 96 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 97 | engines: {node: '>= 8'} 98 | dev: true 99 | 100 | /@nodelib/fs.walk@1.2.8: 101 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 102 | engines: {node: '>= 8'} 103 | dependencies: 104 | '@nodelib/fs.scandir': 2.1.5 105 | fastq: 1.15.0 106 | dev: true 107 | 108 | /@ungap/structured-clone@1.2.0: 109 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 110 | dev: true 111 | 112 | /acorn-jsx@5.3.2(acorn@8.11.2): 113 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 114 | peerDependencies: 115 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 116 | dependencies: 117 | acorn: 8.11.2 118 | dev: true 119 | 120 | /acorn@8.11.2: 121 | resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} 122 | engines: {node: '>=0.4.0'} 123 | hasBin: true 124 | dev: true 125 | 126 | /ajv@6.12.6: 127 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 128 | dependencies: 129 | fast-deep-equal: 3.1.3 130 | fast-json-stable-stringify: 2.1.0 131 | json-schema-traverse: 0.4.1 132 | uri-js: 4.4.1 133 | dev: true 134 | 135 | /ansi-colors@4.1.3: 136 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 137 | engines: {node: '>=6'} 138 | dev: false 139 | 140 | /ansi-regex@5.0.1: 141 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 142 | engines: {node: '>=8'} 143 | 144 | /ansi-styles@4.3.0: 145 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 146 | engines: {node: '>=8'} 147 | dependencies: 148 | color-convert: 2.0.1 149 | dev: true 150 | 151 | /argparse@2.0.1: 152 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 153 | dev: true 154 | 155 | /balanced-match@1.0.2: 156 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 157 | dev: true 158 | 159 | /brace-expansion@1.1.11: 160 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 161 | dependencies: 162 | balanced-match: 1.0.2 163 | concat-map: 0.0.1 164 | dev: true 165 | 166 | /braces@3.0.2: 167 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 168 | engines: {node: '>=8'} 169 | dependencies: 170 | fill-range: 7.0.1 171 | dev: true 172 | 173 | /callsites@3.1.0: 174 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 175 | engines: {node: '>=6'} 176 | dev: true 177 | 178 | /chalk@4.1.2: 179 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 180 | engines: {node: '>=10'} 181 | dependencies: 182 | ansi-styles: 4.3.0 183 | supports-color: 7.2.0 184 | dev: true 185 | 186 | /clean-publish@4.2.0: 187 | resolution: {integrity: sha512-dqZF5y6KtlkYhbnJoXiOCP4L1TPdI7HtuDysslUrbI8vLPu65ZjVO3pu5xp4qH0X2cWdDN/La04woe6fg4LNSw==} 188 | engines: {node: '>= 16.0.0'} 189 | hasBin: true 190 | dependencies: 191 | cross-spawn: 7.0.3 192 | fast-glob: 3.3.2 193 | lilconfig: 2.1.0 194 | micromatch: 4.0.5 195 | dev: true 196 | 197 | /color-convert@2.0.1: 198 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 199 | engines: {node: '>=7.0.0'} 200 | dependencies: 201 | color-name: 1.1.4 202 | dev: true 203 | 204 | /color-name@1.1.4: 205 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 206 | dev: true 207 | 208 | /concat-map@0.0.1: 209 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 210 | dev: true 211 | 212 | /cross-spawn@7.0.3: 213 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 214 | engines: {node: '>= 8'} 215 | dependencies: 216 | path-key: 3.1.1 217 | shebang-command: 2.0.0 218 | which: 2.0.2 219 | dev: true 220 | 221 | /debug@4.3.4: 222 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 223 | engines: {node: '>=6.0'} 224 | peerDependencies: 225 | supports-color: '*' 226 | peerDependenciesMeta: 227 | supports-color: 228 | optional: true 229 | dependencies: 230 | ms: 2.1.2 231 | dev: true 232 | 233 | /deep-is@0.1.4: 234 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 235 | dev: true 236 | 237 | /doctrine@3.0.0: 238 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 239 | engines: {node: '>=6.0.0'} 240 | dependencies: 241 | esutils: 2.0.3 242 | dev: true 243 | 244 | /enquirer@2.4.1: 245 | resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} 246 | engines: {node: '>=8.6'} 247 | dependencies: 248 | ansi-colors: 4.1.3 249 | strip-ansi: 6.0.1 250 | dev: false 251 | 252 | /escape-string-regexp@4.0.0: 253 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 254 | engines: {node: '>=10'} 255 | dev: true 256 | 257 | /eslint-scope@7.2.2: 258 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 259 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 260 | dependencies: 261 | esrecurse: 4.3.0 262 | estraverse: 5.3.0 263 | dev: true 264 | 265 | /eslint-visitor-keys@3.4.3: 266 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 267 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 268 | dev: true 269 | 270 | /eslint@8.55.0: 271 | resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} 272 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 273 | hasBin: true 274 | dependencies: 275 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) 276 | '@eslint-community/regexpp': 4.10.0 277 | '@eslint/eslintrc': 2.1.4 278 | '@eslint/js': 8.55.0 279 | '@humanwhocodes/config-array': 0.11.13 280 | '@humanwhocodes/module-importer': 1.0.1 281 | '@nodelib/fs.walk': 1.2.8 282 | '@ungap/structured-clone': 1.2.0 283 | ajv: 6.12.6 284 | chalk: 4.1.2 285 | cross-spawn: 7.0.3 286 | debug: 4.3.4 287 | doctrine: 3.0.0 288 | escape-string-regexp: 4.0.0 289 | eslint-scope: 7.2.2 290 | eslint-visitor-keys: 3.4.3 291 | espree: 9.6.1 292 | esquery: 1.5.0 293 | esutils: 2.0.3 294 | fast-deep-equal: 3.1.3 295 | file-entry-cache: 6.0.1 296 | find-up: 5.0.0 297 | glob-parent: 6.0.2 298 | globals: 13.23.0 299 | graphemer: 1.4.0 300 | ignore: 5.3.0 301 | imurmurhash: 0.1.4 302 | is-glob: 4.0.3 303 | is-path-inside: 3.0.3 304 | js-yaml: 4.1.0 305 | json-stable-stringify-without-jsonify: 1.0.1 306 | levn: 0.4.1 307 | lodash.merge: 4.6.2 308 | minimatch: 3.1.2 309 | natural-compare: 1.4.0 310 | optionator: 0.9.3 311 | strip-ansi: 6.0.1 312 | text-table: 0.2.0 313 | transitivePeerDependencies: 314 | - supports-color 315 | dev: true 316 | 317 | /espree@9.6.1: 318 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 319 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 320 | dependencies: 321 | acorn: 8.11.2 322 | acorn-jsx: 5.3.2(acorn@8.11.2) 323 | eslint-visitor-keys: 3.4.3 324 | dev: true 325 | 326 | /esquery@1.5.0: 327 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 328 | engines: {node: '>=0.10'} 329 | dependencies: 330 | estraverse: 5.3.0 331 | dev: true 332 | 333 | /esrecurse@4.3.0: 334 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 335 | engines: {node: '>=4.0'} 336 | dependencies: 337 | estraverse: 5.3.0 338 | dev: true 339 | 340 | /estraverse@5.3.0: 341 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 342 | engines: {node: '>=4.0'} 343 | dev: true 344 | 345 | /esutils@2.0.3: 346 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 347 | engines: {node: '>=0.10.0'} 348 | dev: true 349 | 350 | /fast-deep-equal@3.1.3: 351 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 352 | dev: true 353 | 354 | /fast-glob@3.3.2: 355 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 356 | engines: {node: '>=8.6.0'} 357 | dependencies: 358 | '@nodelib/fs.stat': 2.0.5 359 | '@nodelib/fs.walk': 1.2.8 360 | glob-parent: 5.1.2 361 | merge2: 1.4.1 362 | micromatch: 4.0.5 363 | dev: true 364 | 365 | /fast-json-stable-stringify@2.1.0: 366 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 367 | dev: true 368 | 369 | /fast-levenshtein@2.0.6: 370 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 371 | dev: true 372 | 373 | /fastq@1.15.0: 374 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 375 | dependencies: 376 | reusify: 1.0.4 377 | dev: true 378 | 379 | /file-entry-cache@6.0.1: 380 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 381 | engines: {node: ^10.12.0 || >=12.0.0} 382 | dependencies: 383 | flat-cache: 3.2.0 384 | dev: true 385 | 386 | /fill-range@7.0.1: 387 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 388 | engines: {node: '>=8'} 389 | dependencies: 390 | to-regex-range: 5.0.1 391 | dev: true 392 | 393 | /find-up@5.0.0: 394 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 395 | engines: {node: '>=10'} 396 | dependencies: 397 | locate-path: 6.0.0 398 | path-exists: 4.0.0 399 | dev: true 400 | 401 | /flat-cache@3.2.0: 402 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 403 | engines: {node: ^10.12.0 || >=12.0.0} 404 | dependencies: 405 | flatted: 3.2.9 406 | keyv: 4.5.4 407 | rimraf: 3.0.2 408 | dev: true 409 | 410 | /flatted@3.2.9: 411 | resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} 412 | dev: true 413 | 414 | /fs.realpath@1.0.0: 415 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 416 | dev: true 417 | 418 | /glob-parent@5.1.2: 419 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 420 | engines: {node: '>= 6'} 421 | dependencies: 422 | is-glob: 4.0.3 423 | dev: true 424 | 425 | /glob-parent@6.0.2: 426 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 427 | engines: {node: '>=10.13.0'} 428 | dependencies: 429 | is-glob: 4.0.3 430 | dev: true 431 | 432 | /glob@7.2.3: 433 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 434 | dependencies: 435 | fs.realpath: 1.0.0 436 | inflight: 1.0.6 437 | inherits: 2.0.4 438 | minimatch: 3.1.2 439 | once: 1.4.0 440 | path-is-absolute: 1.0.1 441 | dev: true 442 | 443 | /globals@13.23.0: 444 | resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} 445 | engines: {node: '>=8'} 446 | dependencies: 447 | type-fest: 0.20.2 448 | dev: true 449 | 450 | /gogen@2.3.0: 451 | resolution: {integrity: sha512-hivdyxFSGh1pkr5812UxC947+tufj5CkAQD5s9k48Wh0yQ5acngFn1pTX8LF+y+aoiIXL2sijRCOM2Ek2SQkXQ==} 452 | engines: {node: '>= 10.3'} 453 | hasBin: true 454 | dev: false 455 | 456 | /graphemer@1.4.0: 457 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 458 | dev: true 459 | 460 | /has-flag@4.0.0: 461 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 462 | engines: {node: '>=8'} 463 | dev: true 464 | 465 | /ignore@5.3.0: 466 | resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} 467 | engines: {node: '>= 4'} 468 | dev: true 469 | 470 | /import-fresh@3.3.0: 471 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 472 | engines: {node: '>=6'} 473 | dependencies: 474 | parent-module: 1.0.1 475 | resolve-from: 4.0.0 476 | dev: true 477 | 478 | /imurmurhash@0.1.4: 479 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 480 | engines: {node: '>=0.8.19'} 481 | dev: true 482 | 483 | /inflight@1.0.6: 484 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 485 | dependencies: 486 | once: 1.4.0 487 | wrappy: 1.0.2 488 | dev: true 489 | 490 | /inherits@2.0.4: 491 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 492 | dev: true 493 | 494 | /is-extglob@2.1.1: 495 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 496 | engines: {node: '>=0.10.0'} 497 | dev: true 498 | 499 | /is-glob@4.0.3: 500 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 501 | engines: {node: '>=0.10.0'} 502 | dependencies: 503 | is-extglob: 2.1.1 504 | dev: true 505 | 506 | /is-number@7.0.0: 507 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 508 | engines: {node: '>=0.12.0'} 509 | dev: true 510 | 511 | /is-path-inside@3.0.3: 512 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 513 | engines: {node: '>=8'} 514 | dev: true 515 | 516 | /isexe@2.0.0: 517 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 518 | dev: true 519 | 520 | /js-yaml@4.1.0: 521 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 522 | hasBin: true 523 | dependencies: 524 | argparse: 2.0.1 525 | dev: true 526 | 527 | /json-buffer@3.0.1: 528 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 529 | dev: true 530 | 531 | /json-schema-traverse@0.4.1: 532 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 533 | dev: true 534 | 535 | /json-stable-stringify-without-jsonify@1.0.1: 536 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 537 | dev: true 538 | 539 | /keyv@4.5.4: 540 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 541 | dependencies: 542 | json-buffer: 3.0.1 543 | dev: true 544 | 545 | /levn@0.4.1: 546 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 547 | engines: {node: '>= 0.8.0'} 548 | dependencies: 549 | prelude-ls: 1.2.1 550 | type-check: 0.4.0 551 | dev: true 552 | 553 | /lilconfig@2.1.0: 554 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 555 | engines: {node: '>=10'} 556 | dev: true 557 | 558 | /locate-path@6.0.0: 559 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 560 | engines: {node: '>=10'} 561 | dependencies: 562 | p-locate: 5.0.0 563 | dev: true 564 | 565 | /lodash.merge@4.6.2: 566 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 567 | dev: true 568 | 569 | /merge2@1.4.1: 570 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 571 | engines: {node: '>= 8'} 572 | dev: true 573 | 574 | /micromatch@4.0.5: 575 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 576 | engines: {node: '>=8.6'} 577 | dependencies: 578 | braces: 3.0.2 579 | picomatch: 2.3.1 580 | dev: true 581 | 582 | /minimatch@3.1.2: 583 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 584 | dependencies: 585 | brace-expansion: 1.1.11 586 | dev: true 587 | 588 | /ms@2.1.2: 589 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 590 | dev: true 591 | 592 | /natural-compare@1.4.0: 593 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 594 | dev: true 595 | 596 | /once@1.4.0: 597 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 598 | dependencies: 599 | wrappy: 1.0.2 600 | dev: true 601 | 602 | /optionator@0.9.3: 603 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 604 | engines: {node: '>= 0.8.0'} 605 | dependencies: 606 | '@aashutoshrathi/word-wrap': 1.2.6 607 | deep-is: 0.1.4 608 | fast-levenshtein: 2.0.6 609 | levn: 0.4.1 610 | prelude-ls: 1.2.1 611 | type-check: 0.4.0 612 | dev: true 613 | 614 | /p-limit@3.1.0: 615 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 616 | engines: {node: '>=10'} 617 | dependencies: 618 | yocto-queue: 0.1.0 619 | dev: true 620 | 621 | /p-locate@5.0.0: 622 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 623 | engines: {node: '>=10'} 624 | dependencies: 625 | p-limit: 3.1.0 626 | dev: true 627 | 628 | /parent-module@1.0.1: 629 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 630 | engines: {node: '>=6'} 631 | dependencies: 632 | callsites: 3.1.0 633 | dev: true 634 | 635 | /path-exists@4.0.0: 636 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 637 | engines: {node: '>=8'} 638 | dev: true 639 | 640 | /path-is-absolute@1.0.1: 641 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 642 | engines: {node: '>=0.10.0'} 643 | dev: true 644 | 645 | /path-key@3.1.1: 646 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 647 | engines: {node: '>=8'} 648 | dev: true 649 | 650 | /picomatch@2.3.1: 651 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 652 | engines: {node: '>=8.6'} 653 | dev: true 654 | 655 | /prelude-ls@1.2.1: 656 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 657 | engines: {node: '>= 0.8.0'} 658 | dev: true 659 | 660 | /punycode@2.3.1: 661 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 662 | engines: {node: '>=6'} 663 | dev: true 664 | 665 | /queue-microtask@1.2.3: 666 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 667 | dev: true 668 | 669 | /resolve-from@4.0.0: 670 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 671 | engines: {node: '>=4'} 672 | dev: true 673 | 674 | /reusify@1.0.4: 675 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 676 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 677 | dev: true 678 | 679 | /rimraf@3.0.2: 680 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 681 | hasBin: true 682 | dependencies: 683 | glob: 7.2.3 684 | dev: true 685 | 686 | /run-parallel@1.2.0: 687 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 688 | dependencies: 689 | queue-microtask: 1.2.3 690 | dev: true 691 | 692 | /shebang-command@2.0.0: 693 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 694 | engines: {node: '>=8'} 695 | dependencies: 696 | shebang-regex: 3.0.0 697 | dev: true 698 | 699 | /shebang-regex@3.0.0: 700 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 701 | engines: {node: '>=8'} 702 | dev: true 703 | 704 | /strip-ansi@6.0.1: 705 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 706 | engines: {node: '>=8'} 707 | dependencies: 708 | ansi-regex: 5.0.1 709 | 710 | /strip-json-comments@3.1.1: 711 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 712 | engines: {node: '>=8'} 713 | dev: true 714 | 715 | /supports-color@7.2.0: 716 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 717 | engines: {node: '>=8'} 718 | dependencies: 719 | has-flag: 4.0.0 720 | dev: true 721 | 722 | /text-table@0.2.0: 723 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 724 | dev: true 725 | 726 | /to-regex-range@5.0.1: 727 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 728 | engines: {node: '>=8.0'} 729 | dependencies: 730 | is-number: 7.0.0 731 | dev: true 732 | 733 | /type-check@0.4.0: 734 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 735 | engines: {node: '>= 0.8.0'} 736 | dependencies: 737 | prelude-ls: 1.2.1 738 | dev: true 739 | 740 | /type-fest@0.20.2: 741 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 742 | engines: {node: '>=10'} 743 | dev: true 744 | 745 | /uri-js@4.4.1: 746 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 747 | dependencies: 748 | punycode: 2.3.1 749 | dev: true 750 | 751 | /which@2.0.2: 752 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 753 | engines: {node: '>= 8'} 754 | hasBin: true 755 | dependencies: 756 | isexe: 2.0.0 757 | dev: true 758 | 759 | /wrappy@1.0.2: 760 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 761 | dev: true 762 | 763 | /yocto-queue@0.1.0: 764 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 765 | engines: {node: '>=10'} 766 | dev: true 767 | -------------------------------------------------------------------------------- /template/.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | on: 3 | push: 4 | branches: 5 | - main 6 | pull_request: 7 | permissions: 8 | contents: read 9 | jobs: 10 | full: 11 | name: Node.js Latest Full 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout the repository 15 | uses: actions/checkout@v4 16 | - name: Install Node.js 17 | uses: actions/setup-node@v3 18 | with: 19 | node-version: 20 20 | cache: npm 21 | - name: Install dependencies 22 | run: npm ci --ignore-scripts 23 | - name: Run tests 24 | run: yarn test 25 | short: 26 | runs-on: ubuntu-latest 27 | strategy: 28 | matrix: 29 | node-version: 30 | - 18 31 | name: Node.js ${{ matrix.node-version }} Quick 32 | steps: 33 | - name: Checkout the repository 34 | uses: actions/checkout@v3 35 | - name: Install Node.js ${{ matrix.node-version }} 36 | uses: actions/setup-node@v3 37 | with: 38 | node-version: ${{ matrix.node-version }} 39 | cache: npm 40 | - name: Install dependencies 41 | run: npm ci --ignore-scripts 42 | - name: Run unit tests 43 | run: npm run unit 44 | -------------------------------------------------------------------------------- /template/.t.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | -------------------------------------------------------------------------------- /template/.t.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | npm-debug.log 3 | yarn-error.log 4 | 5 | coverage/ 6 | -------------------------------------------------------------------------------- /template/.t.npmignore: -------------------------------------------------------------------------------- 1 | yarn-error.log 2 | npm-debug.log 3 | package-lock.json 4 | yarn.lock 5 | 6 | *.test.js 7 | .github 8 | .editorconfig 9 | coverage/ 10 | -------------------------------------------------------------------------------- /template/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | This project adheres to [Semantic Versioning](http://semver.org/). 4 | -------------------------------------------------------------------------------- /template/LICENSE.t: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright ${currentYear} ${authorName} <${authorEmail}> 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /template/README.t.md: -------------------------------------------------------------------------------- 1 | # ${pluginName} 2 | 3 | [PostCSS] plugin ${description}. 4 | 5 | [PostCSS]: https://github.com/postcss/postcss 6 | 7 | ```css 8 | .foo { 9 | /* Input example */ 10 | } 11 | ``` 12 | 13 | ```css 14 | .foo { 15 | /* Output example */ 16 | } 17 | ``` 18 | 19 | ## Usage 20 | 21 | **Step 1:** Install plugin: 22 | 23 | ```sh 24 | npm install --save-dev postcss ${pluginName} 25 | ``` 26 | 27 | **Step 2:** Check your project for existing PostCSS config: `postcss.config.js` 28 | in the project root, `"postcss"` section in `package.json` 29 | or `postcss` in bundle config. 30 | 31 | If you do not use PostCSS, add it according to [official docs] 32 | and set this plugin in settings. 33 | 34 | **Step 3:** Add the plugin to plugins list: 35 | 36 | ```diff 37 | module.exports = { 38 | plugins: [ 39 | + require('${pluginName}'), 40 | require('autoprefixer') 41 | ] 42 | } 43 | ``` 44 | 45 | [official docs]: https://github.com/postcss/postcss#usage 46 | -------------------------------------------------------------------------------- /template/index.t.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @type {import('postcss').PluginCreator} 3 | */ 4 | module.exports = (opts = {}) => { 5 | // Work with options here 6 | 7 | return { 8 | postcssPlugin: '${pluginName}', 9 | /* 10 | Root (root, postcss) { 11 | // Transform CSS AST here 12 | } 13 | */ 14 | 15 | /* 16 | Declaration (decl, postcss) { 17 | // The faster way to find Declaration node 18 | } 19 | */ 20 | 21 | /* 22 | Declaration: { 23 | color: (decl, postcss) { 24 | // The fastest way find Declaration node if you know property name 25 | } 26 | } 27 | */ 28 | } 29 | } 30 | 31 | module.exports.postcss = true 32 | -------------------------------------------------------------------------------- /template/index.test.t.js: -------------------------------------------------------------------------------- 1 | const postcss = require('postcss') 2 | const { equal } = require('node:assert') 3 | const { test } = require('node:test') 4 | 5 | const plugin = require('./') 6 | 7 | async function run(input, output, opts = {}) { 8 | let result = await postcss([plugin(opts)]).process(input, { from: undefined }) 9 | equal(result.css, output) 10 | equal(result.warnings().length, 0) 11 | } 12 | 13 | /* Write tests here 14 | 15 | test('does something', async () => { 16 | await run('a{ }', 'a{ }', { }) 17 | }) 18 | 19 | */ 20 | -------------------------------------------------------------------------------- /template/package.t.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "${pluginName}", 3 | "version": "0.0.0", 4 | "description": "PostCSS plugin ${description}", 5 | "keywords": ["postcss", "css", "postcss-plugin", "${pluginName}"], 6 | "scripts": { 7 | "unit": "node --test index.test.js", 8 | "test": "npm run unit && eslint ." 9 | }, 10 | "author": "${authorName} <${authorEmail}>", 11 | "license": "MIT", 12 | "repository": "${gitHubName}/${pluginName}", 13 | "engines": { 14 | "node": ">=18.0.0" 15 | }, 16 | "peerDependencies": { 17 | "postcss": "^8.4.27" 18 | }, 19 | "devDependencies": { 20 | "eslint": "^8.47.0", 21 | "postcss": "^8.4.27" 22 | }, 23 | "eslintConfig": { 24 | "parserOptions": { 25 | "ecmaVersion": 2017 26 | }, 27 | "env": { 28 | "node": true, 29 | "es6": true 30 | }, 31 | "extends": ["eslint:recommended"] 32 | } 33 | } 34 | --------------------------------------------------------------------------------