├── .editorconfig ├── .github ├── funding.yml └── workflows │ ├── audit.yaml │ └── publish.yaml ├── .gitignore ├── changelog.md ├── contributing.md ├── eslint.config.mjs ├── examples ├── custom-order-function.md └── with-gulp.md ├── license.md ├── logo.svg ├── mise.toml ├── package-lock.json ├── package.json ├── readme.md ├── rollup.config.mjs ├── security.md └── src ├── core ├── bubble-sort.mjs ├── main.d.cts ├── main.d.mts ├── main.mjs ├── main.test.mjs └── shorthand-data.mjs ├── orders ├── alphabetical.mjs ├── concentric-css.mjs └── smacss.mjs ├── property-scraper.mjs └── property-scraper.test.mjs /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://editorconfig.org/ 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | insert_final_newline = true 11 | trim_trailing_whitespace = true 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /.github/funding.yml: -------------------------------------------------------------------------------- 1 | github: Siilwyn 2 | tidelift: "npm/css-declaration-sorter" 3 | -------------------------------------------------------------------------------- /.github/workflows/audit.yaml: -------------------------------------------------------------------------------- 1 | name: Code Audit 2 | 3 | on: pull_request 4 | 5 | jobs: 6 | audit: 7 | runs-on: ubuntu-latest 8 | timeout-minutes: 10 9 | permissions: {} 10 | strategy: 11 | matrix: 12 | node-version: [ '18', '20' ] 13 | steps: 14 | - uses: actions/checkout@v3 15 | 16 | - name: Setup Node.js 17 | uses: actions/setup-node@v3 18 | with: 19 | node-version: ${{ matrix.node-version }} 20 | 21 | - name: Use dependencies cache 22 | uses: actions/cache@v3 23 | with: 24 | path: ~/.npm 25 | key: npm-${{ hashFiles('package-lock.json') }} 26 | restore-keys: npm- 27 | 28 | - name: Install dependencies 29 | run: npm ci --ignore-scripts --no-audit --no-fund 30 | 31 | - name: Update CSS properties 32 | if: contains(github.head_ref, 'mdn-browser-compat-data') 33 | run: npm run scrape 34 | 35 | - run: npm run test:ci 36 | -------------------------------------------------------------------------------- /.github/workflows/publish.yaml: -------------------------------------------------------------------------------- 1 | name: Publish Package 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v**' 7 | 8 | jobs: 9 | publish: 10 | runs-on: ubuntu-latest 11 | timeout-minutes: 10 12 | permissions: 13 | id-token: write 14 | steps: 15 | - uses: actions/checkout@v3 16 | 17 | - name: Setup Node.js 18 | uses: actions/setup-node@v3 19 | with: 20 | node-version: '20' 21 | registry-url: 'https://registry.npmjs.org' 22 | 23 | - name: Use dependencies cache 24 | uses: actions/cache@v3 25 | with: 26 | path: ~/.npm 27 | key: npm-${{ hashFiles('package-lock.json') }} 28 | restore-keys: npm- 29 | 30 | - name: Install dependencies 31 | run: npm ci --ignore-scripts --no-audit --no-fund 32 | 33 | - name: Publish package 34 | run: npm publish --provenance 35 | env: 36 | NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | -------------------------------------------------------------------------------- /changelog.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this project will be documented in this file. 3 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and follows [Semantic Versioning](http://semver.org/spec/v2.0.0.html). 4 | 5 | ## [7.2.0] - 2024-03-25 6 | ### Added 7 | - New properties related to: offset, transition and text wrapping. 8 | ### Fixed 9 | - Gap properties `column-gap` and `row-gap` moving unsafely. 10 | 11 | ## [7.1.1] - 2023-10-01 12 | ### Fixed 13 | - Regression with TypeScript types resolution for CommonJS. 14 | 15 | ## [7.1.0] - 2023-09-23 16 | ### Added 17 | - New font and math related properties. 18 | ### Fixed 19 | - Keep unknown properties in the same position to prevent overrides. 20 | 21 | ## [7.0.3] - 2023-07-27 22 | ### Fixed 23 | - TypeScript types resolution for Node.js 16 and up, thanks to @amiller-gh and @privatenumber! 24 | 25 | ## [7.0.2] - 2023-07-08 26 | ### Fixed 27 | - Missing bubble sort code in npm package. 28 | 29 | ## [7.0.0] - 2023-05-29 30 | ### Fixed 31 | - Border properties `border-end` and `border-start` radius moving unsafely. 32 | ### Removed 33 | - Node.js 12 support. 34 | 35 | ## [6.4.1] - 2023-07-08 36 | ### Fixed 37 | - Backport: Missing bubble sort code in npm package. 38 | 39 | ## [6.4.0] - 2023-03-23 40 | ### Added 41 | - New container, overflow and font related properties. 42 | ### Fixed 43 | - Order of shorthand properties between overrides that are already changing position with `keepOverrides`. 44 | 45 | ## [6.3.1] - 2022-09-02 46 | ### Fixed 47 | - Logical border properties moving with `keepOverrides`. 48 | 49 | ## [6.3.0] - 2022-06-09 50 | ### Added 51 | - New properties: `content-visibility` and `image-orientation`. 52 | ### Fixed 53 | - Logical properties like `padding-block` moved unsafely with `keepOverrides`. 54 | 55 | ## [6.2.2] - 2022-03-27 56 | ### Fixed 57 | - Types export for CommonJS. 58 | - Expected plugin type, now using PostCSS `PluginCreator` type. 59 | 60 | ## [6.2.1] - 2022-03-26 61 | ### Fixed 62 | - Include types in npm package files. 63 | 64 | ## [6.2.0] - 2022-03-26 65 | ### Added 66 | - TypesScript types, special thanks to @peterblazejewicz. 67 | - Named exports. 68 | - New properties regarding font hyphens, print color and scrollbar gutter. 69 | ### Fixed 70 | - Dynamic imports in CommonJS output. 71 | ### Changed 72 | - No more dependencies, smaller ESM package. 73 | 74 | ## [6.1.4] - 2022-01-08 75 | ### Fixed 76 | - Crash on missing paired comment node from invalid SCSS parsing. 77 | 78 | ## [6.1.3] - 2021-09-06 79 | ### Fixed 80 | - Crash on missing node raws before content. 81 | 82 | ## [6.1.2] - 2021-09-06 83 | ### Fixed 84 | - Crash on two comments in the same line. 85 | 86 | ## [6.1.1] - 2021-07-24 87 | ### Fixed 88 | - Usage of built-in orders with CommonJS. 89 | 90 | ## [6.1.0] - 2021-07-24 91 | ### Changed 92 | - Internal code to load built-in orders using dynamic import instead of using Node.js `fs`. Enables usage in other environments such as the browser. 93 | ### Added 94 | - New properties regarding mask border, forced color adjustment & font styling overrides. 95 | 96 | ## [6.0.3] - 2021-05-11 97 | ### Fixed 98 | - Sorting padding and border shorthands with `keepOverrides` enabled. 99 | - Property reset with `all`, the property is moved to the top. 100 | ### Changed 101 | - Add back Node.js 10 support. 102 | 103 | ## [6.0.2] - 2020-11-04 104 | ### Fixed 105 | - Loading built-in order using a relative path. 106 | 107 | ## [6.0.1] - 2020-10-26 108 | ### Added 109 | - ES module export type, both CommonJS and ES module importing are supported. 110 | - Newer font and grid CSS properties like `row-gap` and `font-display`. 111 | ### Changed 112 | - Scraping of CSS properties now comes from MDN browser compatibility package. 113 | - PostCSS upgraded to version eight which changes PostCSS to a peer dependency. 114 | - Order declarations to be ordered in the precendece of their shorthand counterparts. Special thanks to @DiemenDesign. 115 | ### Removed 116 | - Node.js 10 support. 117 | 118 | ## [5.1.2] - 2020-02-21 119 | ### Fixed 120 | - Experimental Node.js warning from showing up on some versions. 121 | 122 | ## [5.1.1] - 2020-02-07 123 | ### Fixed 124 | - Handling vendor prefixed declarations such as `-moz-animation` when sorting with `keepOverrides` enabled. 125 | 126 | ## [5.1.0] - 2020-02-06 127 | ### Changed 128 | - Sorting of unknown properties when sorting alphabetically now works the same as the other orders. Instead of sorting all properties only known properties will be sorted and unknown properties will retain their respective order. 129 | 130 | ## [5.0.0] - 2019-12-16 131 | ### Added 132 | - Option `keepOverrides` to keep overrides in place, useful for legacy CSS where shorthand declarations override longhand declarations. 133 | 134 | ### Changed 135 | - Default sorting order renamed to `alphabetical`. 136 | - Custom sorting order as a JSON file replaced in favor of the option to pass a custom sorting function. 137 | 138 | ### Removed 139 | - Node.js 6 and 8 support. 140 | 141 | ## [4.0.1] - 2018-07-30 142 | ### Fixed 143 | - Invalid package engines node version range. 144 | 145 | ## [4.0.0] - 2018-07-24 146 | ### Added 147 | - New flex box shorthand properties which can conflict with existing flex box properties. 148 | - New ruby, transform and text related properties. 149 | 150 | ### Removed 151 | - Node.js 4 support. 152 | - Deprecated grid properties. 153 | 154 | ## [3.0.1] - 2018-01-11 155 | ### Fixed 156 | - Keep at-rules at the same position. 157 | 158 | ## [3.0.0] - 2017-12-14 159 | ### Added 160 | - Flexbox justify self properties. 161 | 162 | ### Changed 163 | - SMACSS order so it is more in line with Stylelint. 164 | 165 | ### Removed 166 | - Command line interface in favor of [postcss-cli](https://github.com/postcss/postcss-cli). 167 | 168 | ## [2.1.0] - 2017-08-25 169 | ### Added 170 | - New text style and interaction related properties. 171 | 172 | ## [2.0.1] - 2017-06-19 173 | ### Fixed 174 | - Prevent comments outside CSS selectors from being moved. 175 | 176 | ## [2.0.0] - 2017-03-16 177 | ### Changed 178 | - Put declarations before nested declarations. 179 | 180 | [7.2.0]: https://github.com/Siilwyn/css-declaration-sorter/compare/v7.1.1...v7.2.0 181 | [7.1.1]: https://github.com/Siilwyn/css-declaration-sorter/compare/v7.1.0...v7.1.1 182 | [7.1.0]: https://github.com/Siilwyn/css-declaration-sorter/compare/v7.0.3...v7.1.0 183 | [7.0.3]: https://github.com/Siilwyn/css-declaration-sorter/compare/v7.0.2...v7.0.3 184 | [7.0.2]: https://github.com/Siilwyn/css-declaration-sorter/compare/v7.0.0...v7.0.2 185 | [7.0.0]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.4.1...v7.0.0 186 | [6.4.1]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.4.0...v6.4.1 187 | [6.4.0]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.3.1...v6.4.0 188 | [6.3.1]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.3.0...v6.3.1 189 | [6.3.0]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.2.2...v6.3.0 190 | [6.2.2]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.2.1...v6.2.2 191 | [6.2.1]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.2.0...v6.2.1 192 | [6.2.0]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.1.4...v6.2.0 193 | [6.1.4]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.1.3...v6.1.4 194 | [6.1.3]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.1.2...v6.1.3 195 | [6.1.2]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.1.1...v6.1.2 196 | [6.1.1]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.1.0...v6.1.1 197 | [6.1.0]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.0.3...v6.1.0 198 | [6.0.3]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.0.2...v6.0.3 199 | [6.0.2]: https://github.com/Siilwyn/css-declaration-sorter/compare/v6.0.1...v6.0.2 200 | [6.0.1]: https://github.com/Siilwyn/css-declaration-sorter/compare/v5.1.2...v6.0.1 201 | [5.1.2]: https://github.com/Siilwyn/css-declaration-sorter/compare/v5.1.1...v5.1.2 202 | [5.1.1]: https://github.com/Siilwyn/css-declaration-sorter/compare/v5.1.0...v5.1.1 203 | [5.1.0]: https://github.com/Siilwyn/css-declaration-sorter/compare/v5.0.0...v5.1.0 204 | [5.0.0]: https://github.com/Siilwyn/css-declaration-sorter/compare/v4.0.1...v5.0.0 205 | [4.0.1]: https://github.com/Siilwyn/css-declaration-sorter/compare/v4.0.0...v4.0.1 206 | [4.0.0]: https://github.com/Siilwyn/css-declaration-sorter/compare/v3.0.1...v4.0.0 207 | [3.0.1]: https://github.com/Siilwyn/css-declaration-sorter/compare/v3.0.0...v3.0.1 208 | [3.0.0]: https://github.com/Siilwyn/css-declaration-sorter/compare/v2.1.0...v3.0.0 209 | [2.1.0]: https://github.com/Siilwyn/css-declaration-sorter/compare/v2.0.1...v2.1.0 210 | [2.0.1]: https://github.com/Siilwyn/css-declaration-sorter/compare/v2.0.1...v2.0.0 211 | [2.0.0]: https://github.com/Siilwyn/css-declaration-sorter/compare/v1.7.1...v2.0.0 212 | -------------------------------------------------------------------------------- /contributing.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | To setup and test, follow these steps: 3 | 4 | ```sh 5 | git clone https://github.com/Siilwyn/css-declaration-sorter.git 6 | cd css-declaration-sorter 7 | npm ci 8 | npm test 9 | ``` 10 | 11 | ## General Prerequisites 12 | Node.js, [latest LTS is recommended](https://nodejs.org/en/about/releases/). 13 | 14 | ### Tips 15 | 1. Try out a change to this package in another project with `npm link`. 16 | 17 | 1. Tests are run with uvu, read [the docs](https://github.com/lukeed/uvu#readme). 18 | 19 | 1. To add a new CSS property it first needs to be included in [@mdn/browser-compat-data](https://github.com/mdn/browser-compat-data). 20 | 21 | ## Git Commit Messages 22 | Write the message in present tense beginning with an uppercase letter, structured like this: 23 | 24 | ``` 25 | 26 | 27 | 28 | ``` 29 | 30 | Example 31 | 32 | ``` 33 | Test if shorthand data properties are known 34 | 35 | Closes #1 36 | ``` 37 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js'; 2 | 3 | export default [ 4 | js.configs.recommended, 5 | ]; 6 | -------------------------------------------------------------------------------- /examples/custom-order-function.md: -------------------------------------------------------------------------------- 1 | # Custom order function 2 | A custom order can be achieved by passing in a compare function. You can do anything in the function but let us use sorting by the order of an array as an example: 3 | 4 | ```js 5 | import postcss from 'postcss'; 6 | import { cssDeclarationSorter } from 'css-declaration-sorter'; 7 | 8 | const myOrder = ['margin', 'border', 'padding']; 9 | 10 | const myCompareFunction = (a, b) => myOrder.indexOf(a) - myOrder.indexOf(b); 11 | 12 | postcss([cssDeclarationSorter({ order: myCompareFunction })]) 13 | .process('a { padding: 0; border: 0; margin: 0; }') 14 | .then(result => 15 | console.log(result.css === 'a { margin: 0; border: 0; padding: 0; }') 16 | ); 17 | ``` 18 | -------------------------------------------------------------------------------- /examples/with-gulp.md: -------------------------------------------------------------------------------- 1 | # With Gulp 2 | 3 | ```js 4 | import gulp from 'gulp'; 5 | import gulpPostcss from 'gulp-postcss'; 6 | import { cssDeclarationSorter } from 'css-declaration-sorter'; 7 | 8 | gulp.task('css', function () { 9 | return gulp.src('some.css') 10 | .pipe(gulpPostcss([ 11 | cssDeclarationSorter({ order: 'smacss' }) 12 | ])) 13 | .pipe(gulp.dest('./')); 14 | }); 15 | ``` 16 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | ISC License 2 | 3 | Copyright (c) 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 | -------------------------------------------------------------------------------- /logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /mise.toml: -------------------------------------------------------------------------------- 1 | [tools] 2 | node = "latest" 3 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-declaration-sorter", 3 | "version": "7.2.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "css-declaration-sorter", 9 | "version": "7.2.0", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "@eslint/js": "^9.1.1", 13 | "@mdn/browser-compat-data": "^6.0.7", 14 | "@rollup/plugin-dynamic-import-vars": "^2.1.2", 15 | "eslint": "^9.0.0", 16 | "postcss": "^8.4.38", 17 | "rollup": "^3.29.4", 18 | "uvu": "^0.5.6" 19 | }, 20 | "engines": { 21 | "node": "^14 || ^16 || >=18" 22 | }, 23 | "peerDependencies": { 24 | "postcss": "^8.0.9" 25 | } 26 | }, 27 | "node_modules/@aashutoshrathi/word-wrap": { 28 | "version": "1.2.6", 29 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", 30 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", 31 | "dev": true, 32 | "engines": { 33 | "node": ">=0.10.0" 34 | } 35 | }, 36 | "node_modules/@eslint-community/eslint-utils": { 37 | "version": "4.4.0", 38 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 39 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 40 | "dev": true, 41 | "dependencies": { 42 | "eslint-visitor-keys": "^3.3.0" 43 | }, 44 | "engines": { 45 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 46 | }, 47 | "peerDependencies": { 48 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 49 | } 50 | }, 51 | "node_modules/@eslint-community/regexpp": { 52 | "version": "4.12.1", 53 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 54 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 55 | "dev": true, 56 | "license": "MIT", 57 | "engines": { 58 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 59 | } 60 | }, 61 | "node_modules/@eslint/config-array": { 62 | "version": "0.20.0", 63 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", 64 | "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", 65 | "dev": true, 66 | "license": "Apache-2.0", 67 | "dependencies": { 68 | "@eslint/object-schema": "^2.1.6", 69 | "debug": "^4.3.1", 70 | "minimatch": "^3.1.2" 71 | }, 72 | "engines": { 73 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 74 | } 75 | }, 76 | "node_modules/@eslint/config-helpers": { 77 | "version": "0.2.1", 78 | "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", 79 | "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", 80 | "dev": true, 81 | "license": "Apache-2.0", 82 | "engines": { 83 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 84 | } 85 | }, 86 | "node_modules/@eslint/core": { 87 | "version": "0.13.0", 88 | "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", 89 | "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", 90 | "dev": true, 91 | "license": "Apache-2.0", 92 | "dependencies": { 93 | "@types/json-schema": "^7.0.15" 94 | }, 95 | "engines": { 96 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 97 | } 98 | }, 99 | "node_modules/@eslint/eslintrc": { 100 | "version": "3.3.1", 101 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", 102 | "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", 103 | "dev": true, 104 | "license": "MIT", 105 | "dependencies": { 106 | "ajv": "^6.12.4", 107 | "debug": "^4.3.2", 108 | "espree": "^10.0.1", 109 | "globals": "^14.0.0", 110 | "ignore": "^5.2.0", 111 | "import-fresh": "^3.2.1", 112 | "js-yaml": "^4.1.0", 113 | "minimatch": "^3.1.2", 114 | "strip-json-comments": "^3.1.1" 115 | }, 116 | "engines": { 117 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 118 | }, 119 | "funding": { 120 | "url": "https://opencollective.com/eslint" 121 | } 122 | }, 123 | "node_modules/@eslint/js": { 124 | "version": "9.25.0", 125 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.25.0.tgz", 126 | "integrity": "sha512-iWhsUS8Wgxz9AXNfvfOPFSW4VfMXdVhp1hjkZVhXCrpgh/aLcc45rX6MPu+tIVUWDw0HfNwth7O28M1xDxNf9w==", 127 | "dev": true, 128 | "license": "MIT", 129 | "engines": { 130 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 131 | } 132 | }, 133 | "node_modules/@eslint/object-schema": { 134 | "version": "2.1.6", 135 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", 136 | "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", 137 | "dev": true, 138 | "license": "Apache-2.0", 139 | "engines": { 140 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 141 | } 142 | }, 143 | "node_modules/@eslint/plugin-kit": { 144 | "version": "0.2.8", 145 | "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", 146 | "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", 147 | "dev": true, 148 | "license": "Apache-2.0", 149 | "dependencies": { 150 | "@eslint/core": "^0.13.0", 151 | "levn": "^0.4.1" 152 | }, 153 | "engines": { 154 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 155 | } 156 | }, 157 | "node_modules/@humanfs/core": { 158 | "version": "0.19.1", 159 | "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 160 | "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 161 | "dev": true, 162 | "license": "Apache-2.0", 163 | "engines": { 164 | "node": ">=18.18.0" 165 | } 166 | }, 167 | "node_modules/@humanfs/node": { 168 | "version": "0.16.6", 169 | "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", 170 | "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 171 | "dev": true, 172 | "license": "Apache-2.0", 173 | "dependencies": { 174 | "@humanfs/core": "^0.19.1", 175 | "@humanwhocodes/retry": "^0.3.0" 176 | }, 177 | "engines": { 178 | "node": ">=18.18.0" 179 | } 180 | }, 181 | "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 182 | "version": "0.3.1", 183 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", 184 | "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", 185 | "dev": true, 186 | "license": "Apache-2.0", 187 | "engines": { 188 | "node": ">=18.18" 189 | }, 190 | "funding": { 191 | "type": "github", 192 | "url": "https://github.com/sponsors/nzakas" 193 | } 194 | }, 195 | "node_modules/@humanwhocodes/module-importer": { 196 | "version": "1.0.1", 197 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 198 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 199 | "dev": true, 200 | "engines": { 201 | "node": ">=12.22" 202 | }, 203 | "funding": { 204 | "type": "github", 205 | "url": "https://github.com/sponsors/nzakas" 206 | } 207 | }, 208 | "node_modules/@humanwhocodes/retry": { 209 | "version": "0.4.2", 210 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", 211 | "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", 212 | "dev": true, 213 | "license": "Apache-2.0", 214 | "engines": { 215 | "node": ">=18.18" 216 | }, 217 | "funding": { 218 | "type": "github", 219 | "url": "https://github.com/sponsors/nzakas" 220 | } 221 | }, 222 | "node_modules/@jridgewell/sourcemap-codec": { 223 | "version": "1.4.15", 224 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 225 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 226 | "dev": true 227 | }, 228 | "node_modules/@mdn/browser-compat-data": { 229 | "version": "6.0.7", 230 | "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-6.0.7.tgz", 231 | "integrity": "sha512-GHgM/93/yVYufcl+mvQxSVilWZcbOYeavpWjGhsAteKIa6bkbVQYoGoB4SrV9OAQjWvQLbQKaN/LLu6a4KpGuA==", 232 | "dev": true, 233 | "license": "CC0-1.0" 234 | }, 235 | "node_modules/@nodelib/fs.scandir": { 236 | "version": "2.1.5", 237 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 238 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 239 | "dev": true, 240 | "dependencies": { 241 | "@nodelib/fs.stat": "2.0.5", 242 | "run-parallel": "^1.1.9" 243 | }, 244 | "engines": { 245 | "node": ">= 8" 246 | } 247 | }, 248 | "node_modules/@nodelib/fs.stat": { 249 | "version": "2.0.5", 250 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 251 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 252 | "dev": true, 253 | "engines": { 254 | "node": ">= 8" 255 | } 256 | }, 257 | "node_modules/@nodelib/fs.walk": { 258 | "version": "1.2.8", 259 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 260 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 261 | "dev": true, 262 | "dependencies": { 263 | "@nodelib/fs.scandir": "2.1.5", 264 | "fastq": "^1.6.0" 265 | }, 266 | "engines": { 267 | "node": ">= 8" 268 | } 269 | }, 270 | "node_modules/@rollup/plugin-dynamic-import-vars": { 271 | "version": "2.1.2", 272 | "resolved": "https://registry.npmjs.org/@rollup/plugin-dynamic-import-vars/-/plugin-dynamic-import-vars-2.1.2.tgz", 273 | "integrity": "sha512-4lr2oXxs9hcxtGGaK8s0i9evfjzDrAs7ngw28TqruWKTEm0+U4Eljb+F6HXGYdFv8xRojQlrQwV7M/yxeh3yzQ==", 274 | "dev": true, 275 | "dependencies": { 276 | "@rollup/pluginutils": "^5.0.1", 277 | "astring": "^1.8.5", 278 | "estree-walker": "^2.0.2", 279 | "fast-glob": "^3.2.12", 280 | "magic-string": "^0.30.3" 281 | }, 282 | "engines": { 283 | "node": ">=14.0.0" 284 | }, 285 | "peerDependencies": { 286 | "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" 287 | }, 288 | "peerDependenciesMeta": { 289 | "rollup": { 290 | "optional": true 291 | } 292 | } 293 | }, 294 | "node_modules/@rollup/pluginutils": { 295 | "version": "5.0.2", 296 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", 297 | "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", 298 | "dev": true, 299 | "dependencies": { 300 | "@types/estree": "^1.0.0", 301 | "estree-walker": "^2.0.2", 302 | "picomatch": "^2.3.1" 303 | }, 304 | "engines": { 305 | "node": ">=14.0.0" 306 | }, 307 | "peerDependencies": { 308 | "rollup": "^1.20.0||^2.0.0||^3.0.0" 309 | }, 310 | "peerDependenciesMeta": { 311 | "rollup": { 312 | "optional": true 313 | } 314 | } 315 | }, 316 | "node_modules/@types/estree": { 317 | "version": "1.0.7", 318 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", 319 | "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", 320 | "dev": true, 321 | "license": "MIT" 322 | }, 323 | "node_modules/@types/json-schema": { 324 | "version": "7.0.15", 325 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 326 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 327 | "dev": true, 328 | "license": "MIT" 329 | }, 330 | "node_modules/acorn": { 331 | "version": "8.14.1", 332 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", 333 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 334 | "dev": true, 335 | "license": "MIT", 336 | "bin": { 337 | "acorn": "bin/acorn" 338 | }, 339 | "engines": { 340 | "node": ">=0.4.0" 341 | } 342 | }, 343 | "node_modules/acorn-jsx": { 344 | "version": "5.3.2", 345 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 346 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 347 | "dev": true, 348 | "license": "MIT", 349 | "peerDependencies": { 350 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 351 | } 352 | }, 353 | "node_modules/ajv": { 354 | "version": "6.12.6", 355 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 356 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 357 | "dev": true, 358 | "license": "MIT", 359 | "dependencies": { 360 | "fast-deep-equal": "^3.1.1", 361 | "fast-json-stable-stringify": "^2.0.0", 362 | "json-schema-traverse": "^0.4.1", 363 | "uri-js": "^4.2.2" 364 | }, 365 | "funding": { 366 | "type": "github", 367 | "url": "https://github.com/sponsors/epoberezkin" 368 | } 369 | }, 370 | "node_modules/ansi-styles": { 371 | "version": "4.3.0", 372 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 373 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 374 | "dev": true, 375 | "dependencies": { 376 | "color-convert": "^2.0.1" 377 | }, 378 | "engines": { 379 | "node": ">=8" 380 | }, 381 | "funding": { 382 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 383 | } 384 | }, 385 | "node_modules/argparse": { 386 | "version": "2.0.1", 387 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 388 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 389 | "dev": true, 390 | "license": "Python-2.0" 391 | }, 392 | "node_modules/astring": { 393 | "version": "1.8.6", 394 | "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", 395 | "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", 396 | "dev": true, 397 | "bin": { 398 | "astring": "bin/astring" 399 | } 400 | }, 401 | "node_modules/balanced-match": { 402 | "version": "1.0.2", 403 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 404 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 405 | "dev": true, 406 | "license": "MIT" 407 | }, 408 | "node_modules/brace-expansion": { 409 | "version": "1.1.11", 410 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 411 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 412 | "dev": true, 413 | "license": "MIT", 414 | "dependencies": { 415 | "balanced-match": "^1.0.0", 416 | "concat-map": "0.0.1" 417 | } 418 | }, 419 | "node_modules/braces": { 420 | "version": "3.0.2", 421 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 422 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 423 | "dev": true, 424 | "dependencies": { 425 | "fill-range": "^7.0.1" 426 | }, 427 | "engines": { 428 | "node": ">=8" 429 | } 430 | }, 431 | "node_modules/callsites": { 432 | "version": "3.1.0", 433 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 434 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 435 | "dev": true, 436 | "license": "MIT", 437 | "engines": { 438 | "node": ">=6" 439 | } 440 | }, 441 | "node_modules/chalk": { 442 | "version": "4.1.2", 443 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 444 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 445 | "dev": true, 446 | "dependencies": { 447 | "ansi-styles": "^4.1.0", 448 | "supports-color": "^7.1.0" 449 | }, 450 | "engines": { 451 | "node": ">=10" 452 | }, 453 | "funding": { 454 | "url": "https://github.com/chalk/chalk?sponsor=1" 455 | } 456 | }, 457 | "node_modules/color-convert": { 458 | "version": "2.0.1", 459 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 460 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 461 | "dev": true, 462 | "dependencies": { 463 | "color-name": "~1.1.4" 464 | }, 465 | "engines": { 466 | "node": ">=7.0.0" 467 | } 468 | }, 469 | "node_modules/color-name": { 470 | "version": "1.1.4", 471 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 472 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 473 | "dev": true 474 | }, 475 | "node_modules/concat-map": { 476 | "version": "0.0.1", 477 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 478 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 479 | "dev": true, 480 | "license": "MIT" 481 | }, 482 | "node_modules/cross-spawn": { 483 | "version": "7.0.6", 484 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 485 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 486 | "dev": true, 487 | "license": "MIT", 488 | "dependencies": { 489 | "path-key": "^3.1.0", 490 | "shebang-command": "^2.0.0", 491 | "which": "^2.0.1" 492 | }, 493 | "engines": { 494 | "node": ">= 8" 495 | } 496 | }, 497 | "node_modules/debug": { 498 | "version": "4.4.0", 499 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 500 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 501 | "dev": true, 502 | "license": "MIT", 503 | "dependencies": { 504 | "ms": "^2.1.3" 505 | }, 506 | "engines": { 507 | "node": ">=6.0" 508 | }, 509 | "peerDependenciesMeta": { 510 | "supports-color": { 511 | "optional": true 512 | } 513 | } 514 | }, 515 | "node_modules/deep-is": { 516 | "version": "0.1.4", 517 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 518 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 519 | "dev": true 520 | }, 521 | "node_modules/dequal": { 522 | "version": "2.0.3", 523 | "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 524 | "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 525 | "dev": true, 526 | "engines": { 527 | "node": ">=6" 528 | } 529 | }, 530 | "node_modules/diff": { 531 | "version": "5.1.0", 532 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", 533 | "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", 534 | "dev": true, 535 | "engines": { 536 | "node": ">=0.3.1" 537 | } 538 | }, 539 | "node_modules/escape-string-regexp": { 540 | "version": "4.0.0", 541 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 542 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 543 | "dev": true, 544 | "engines": { 545 | "node": ">=10" 546 | }, 547 | "funding": { 548 | "url": "https://github.com/sponsors/sindresorhus" 549 | } 550 | }, 551 | "node_modules/eslint": { 552 | "version": "9.25.0", 553 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.25.0.tgz", 554 | "integrity": "sha512-MsBdObhM4cEwkzCiraDv7A6txFXEqtNXOb877TsSp2FCkBNl8JfVQrmiuDqC1IkejT6JLPzYBXx/xAiYhyzgGA==", 555 | "dev": true, 556 | "license": "MIT", 557 | "dependencies": { 558 | "@eslint-community/eslint-utils": "^4.2.0", 559 | "@eslint-community/regexpp": "^4.12.1", 560 | "@eslint/config-array": "^0.20.0", 561 | "@eslint/config-helpers": "^0.2.1", 562 | "@eslint/core": "^0.13.0", 563 | "@eslint/eslintrc": "^3.3.1", 564 | "@eslint/js": "9.25.0", 565 | "@eslint/plugin-kit": "^0.2.8", 566 | "@humanfs/node": "^0.16.6", 567 | "@humanwhocodes/module-importer": "^1.0.1", 568 | "@humanwhocodes/retry": "^0.4.2", 569 | "@types/estree": "^1.0.6", 570 | "@types/json-schema": "^7.0.15", 571 | "ajv": "^6.12.4", 572 | "chalk": "^4.0.0", 573 | "cross-spawn": "^7.0.6", 574 | "debug": "^4.3.2", 575 | "escape-string-regexp": "^4.0.0", 576 | "eslint-scope": "^8.3.0", 577 | "eslint-visitor-keys": "^4.2.0", 578 | "espree": "^10.3.0", 579 | "esquery": "^1.5.0", 580 | "esutils": "^2.0.2", 581 | "fast-deep-equal": "^3.1.3", 582 | "file-entry-cache": "^8.0.0", 583 | "find-up": "^5.0.0", 584 | "glob-parent": "^6.0.2", 585 | "ignore": "^5.2.0", 586 | "imurmurhash": "^0.1.4", 587 | "is-glob": "^4.0.0", 588 | "json-stable-stringify-without-jsonify": "^1.0.1", 589 | "lodash.merge": "^4.6.2", 590 | "minimatch": "^3.1.2", 591 | "natural-compare": "^1.4.0", 592 | "optionator": "^0.9.3" 593 | }, 594 | "bin": { 595 | "eslint": "bin/eslint.js" 596 | }, 597 | "engines": { 598 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 599 | }, 600 | "funding": { 601 | "url": "https://eslint.org/donate" 602 | }, 603 | "peerDependencies": { 604 | "jiti": "*" 605 | }, 606 | "peerDependenciesMeta": { 607 | "jiti": { 608 | "optional": true 609 | } 610 | } 611 | }, 612 | "node_modules/eslint-scope": { 613 | "version": "8.3.0", 614 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", 615 | "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", 616 | "dev": true, 617 | "license": "BSD-2-Clause", 618 | "dependencies": { 619 | "esrecurse": "^4.3.0", 620 | "estraverse": "^5.2.0" 621 | }, 622 | "engines": { 623 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 624 | }, 625 | "funding": { 626 | "url": "https://opencollective.com/eslint" 627 | } 628 | }, 629 | "node_modules/eslint-visitor-keys": { 630 | "version": "3.4.3", 631 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 632 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 633 | "dev": true, 634 | "engines": { 635 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 636 | }, 637 | "funding": { 638 | "url": "https://opencollective.com/eslint" 639 | } 640 | }, 641 | "node_modules/eslint/node_modules/eslint-visitor-keys": { 642 | "version": "4.2.0", 643 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 644 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 645 | "dev": true, 646 | "license": "Apache-2.0", 647 | "engines": { 648 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 649 | }, 650 | "funding": { 651 | "url": "https://opencollective.com/eslint" 652 | } 653 | }, 654 | "node_modules/espree": { 655 | "version": "10.3.0", 656 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", 657 | "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", 658 | "dev": true, 659 | "license": "BSD-2-Clause", 660 | "dependencies": { 661 | "acorn": "^8.14.0", 662 | "acorn-jsx": "^5.3.2", 663 | "eslint-visitor-keys": "^4.2.0" 664 | }, 665 | "engines": { 666 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 667 | }, 668 | "funding": { 669 | "url": "https://opencollective.com/eslint" 670 | } 671 | }, 672 | "node_modules/espree/node_modules/eslint-visitor-keys": { 673 | "version": "4.2.0", 674 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", 675 | "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", 676 | "dev": true, 677 | "license": "Apache-2.0", 678 | "engines": { 679 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 680 | }, 681 | "funding": { 682 | "url": "https://opencollective.com/eslint" 683 | } 684 | }, 685 | "node_modules/esquery": { 686 | "version": "1.5.0", 687 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 688 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 689 | "dev": true, 690 | "dependencies": { 691 | "estraverse": "^5.1.0" 692 | }, 693 | "engines": { 694 | "node": ">=0.10" 695 | } 696 | }, 697 | "node_modules/esrecurse": { 698 | "version": "4.3.0", 699 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 700 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 701 | "dev": true, 702 | "license": "BSD-2-Clause", 703 | "dependencies": { 704 | "estraverse": "^5.2.0" 705 | }, 706 | "engines": { 707 | "node": ">=4.0" 708 | } 709 | }, 710 | "node_modules/estraverse": { 711 | "version": "5.3.0", 712 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 713 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 714 | "dev": true, 715 | "engines": { 716 | "node": ">=4.0" 717 | } 718 | }, 719 | "node_modules/estree-walker": { 720 | "version": "2.0.2", 721 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 722 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 723 | "dev": true 724 | }, 725 | "node_modules/esutils": { 726 | "version": "2.0.3", 727 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 728 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 729 | "dev": true, 730 | "engines": { 731 | "node": ">=0.10.0" 732 | } 733 | }, 734 | "node_modules/fast-deep-equal": { 735 | "version": "3.1.3", 736 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 737 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 738 | "dev": true, 739 | "license": "MIT" 740 | }, 741 | "node_modules/fast-glob": { 742 | "version": "3.2.12", 743 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 744 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 745 | "dev": true, 746 | "dependencies": { 747 | "@nodelib/fs.stat": "^2.0.2", 748 | "@nodelib/fs.walk": "^1.2.3", 749 | "glob-parent": "^5.1.2", 750 | "merge2": "^1.3.0", 751 | "micromatch": "^4.0.4" 752 | }, 753 | "engines": { 754 | "node": ">=8.6.0" 755 | } 756 | }, 757 | "node_modules/fast-glob/node_modules/glob-parent": { 758 | "version": "5.1.2", 759 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 760 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 761 | "dev": true, 762 | "dependencies": { 763 | "is-glob": "^4.0.1" 764 | }, 765 | "engines": { 766 | "node": ">= 6" 767 | } 768 | }, 769 | "node_modules/fast-json-stable-stringify": { 770 | "version": "2.1.0", 771 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 772 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 773 | "dev": true, 774 | "license": "MIT" 775 | }, 776 | "node_modules/fast-levenshtein": { 777 | "version": "2.0.6", 778 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 779 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 780 | "dev": true 781 | }, 782 | "node_modules/fastq": { 783 | "version": "1.15.0", 784 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 785 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 786 | "dev": true, 787 | "dependencies": { 788 | "reusify": "^1.0.4" 789 | } 790 | }, 791 | "node_modules/file-entry-cache": { 792 | "version": "8.0.0", 793 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 794 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 795 | "dev": true, 796 | "dependencies": { 797 | "flat-cache": "^4.0.0" 798 | }, 799 | "engines": { 800 | "node": ">=16.0.0" 801 | } 802 | }, 803 | "node_modules/fill-range": { 804 | "version": "7.0.1", 805 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 806 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 807 | "dev": true, 808 | "dependencies": { 809 | "to-regex-range": "^5.0.1" 810 | }, 811 | "engines": { 812 | "node": ">=8" 813 | } 814 | }, 815 | "node_modules/find-up": { 816 | "version": "5.0.0", 817 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 818 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 819 | "dev": true, 820 | "dependencies": { 821 | "locate-path": "^6.0.0", 822 | "path-exists": "^4.0.0" 823 | }, 824 | "engines": { 825 | "node": ">=10" 826 | }, 827 | "funding": { 828 | "url": "https://github.com/sponsors/sindresorhus" 829 | } 830 | }, 831 | "node_modules/flat-cache": { 832 | "version": "4.0.1", 833 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 834 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 835 | "dev": true, 836 | "dependencies": { 837 | "flatted": "^3.2.9", 838 | "keyv": "^4.5.4" 839 | }, 840 | "engines": { 841 | "node": ">=16" 842 | } 843 | }, 844 | "node_modules/flatted": { 845 | "version": "3.3.1", 846 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", 847 | "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", 848 | "dev": true 849 | }, 850 | "node_modules/fsevents": { 851 | "version": "2.3.2", 852 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 853 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 854 | "dev": true, 855 | "hasInstallScript": true, 856 | "optional": true, 857 | "os": [ 858 | "darwin" 859 | ], 860 | "engines": { 861 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 862 | } 863 | }, 864 | "node_modules/glob-parent": { 865 | "version": "6.0.2", 866 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 867 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 868 | "dev": true, 869 | "dependencies": { 870 | "is-glob": "^4.0.3" 871 | }, 872 | "engines": { 873 | "node": ">=10.13.0" 874 | } 875 | }, 876 | "node_modules/globals": { 877 | "version": "14.0.0", 878 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 879 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 880 | "dev": true, 881 | "license": "MIT", 882 | "engines": { 883 | "node": ">=18" 884 | }, 885 | "funding": { 886 | "url": "https://github.com/sponsors/sindresorhus" 887 | } 888 | }, 889 | "node_modules/has-flag": { 890 | "version": "4.0.0", 891 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 892 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 893 | "dev": true, 894 | "engines": { 895 | "node": ">=8" 896 | } 897 | }, 898 | "node_modules/ignore": { 899 | "version": "5.3.2", 900 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 901 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 902 | "dev": true, 903 | "license": "MIT", 904 | "engines": { 905 | "node": ">= 4" 906 | } 907 | }, 908 | "node_modules/import-fresh": { 909 | "version": "3.3.1", 910 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 911 | "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 912 | "dev": true, 913 | "license": "MIT", 914 | "dependencies": { 915 | "parent-module": "^1.0.0", 916 | "resolve-from": "^4.0.0" 917 | }, 918 | "engines": { 919 | "node": ">=6" 920 | }, 921 | "funding": { 922 | "url": "https://github.com/sponsors/sindresorhus" 923 | } 924 | }, 925 | "node_modules/imurmurhash": { 926 | "version": "0.1.4", 927 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 928 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 929 | "dev": true, 930 | "engines": { 931 | "node": ">=0.8.19" 932 | } 933 | }, 934 | "node_modules/is-extglob": { 935 | "version": "2.1.1", 936 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 937 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 938 | "dev": true, 939 | "engines": { 940 | "node": ">=0.10.0" 941 | } 942 | }, 943 | "node_modules/is-glob": { 944 | "version": "4.0.3", 945 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 946 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 947 | "dev": true, 948 | "dependencies": { 949 | "is-extglob": "^2.1.1" 950 | }, 951 | "engines": { 952 | "node": ">=0.10.0" 953 | } 954 | }, 955 | "node_modules/is-number": { 956 | "version": "7.0.0", 957 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 958 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 959 | "dev": true, 960 | "engines": { 961 | "node": ">=0.12.0" 962 | } 963 | }, 964 | "node_modules/isexe": { 965 | "version": "2.0.0", 966 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 967 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 968 | "dev": true, 969 | "license": "ISC" 970 | }, 971 | "node_modules/js-yaml": { 972 | "version": "4.1.0", 973 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 974 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 975 | "dev": true, 976 | "license": "MIT", 977 | "dependencies": { 978 | "argparse": "^2.0.1" 979 | }, 980 | "bin": { 981 | "js-yaml": "bin/js-yaml.js" 982 | } 983 | }, 984 | "node_modules/json-buffer": { 985 | "version": "3.0.1", 986 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 987 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 988 | "dev": true 989 | }, 990 | "node_modules/json-schema-traverse": { 991 | "version": "0.4.1", 992 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 993 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 994 | "dev": true, 995 | "license": "MIT" 996 | }, 997 | "node_modules/json-stable-stringify-without-jsonify": { 998 | "version": "1.0.1", 999 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1000 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1001 | "dev": true 1002 | }, 1003 | "node_modules/keyv": { 1004 | "version": "4.5.4", 1005 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 1006 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1007 | "dev": true, 1008 | "dependencies": { 1009 | "json-buffer": "3.0.1" 1010 | } 1011 | }, 1012 | "node_modules/kleur": { 1013 | "version": "4.1.5", 1014 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 1015 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 1016 | "dev": true, 1017 | "engines": { 1018 | "node": ">=6" 1019 | } 1020 | }, 1021 | "node_modules/levn": { 1022 | "version": "0.4.1", 1023 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1024 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1025 | "dev": true, 1026 | "dependencies": { 1027 | "prelude-ls": "^1.2.1", 1028 | "type-check": "~0.4.0" 1029 | }, 1030 | "engines": { 1031 | "node": ">= 0.8.0" 1032 | } 1033 | }, 1034 | "node_modules/locate-path": { 1035 | "version": "6.0.0", 1036 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1037 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1038 | "dev": true, 1039 | "dependencies": { 1040 | "p-locate": "^5.0.0" 1041 | }, 1042 | "engines": { 1043 | "node": ">=10" 1044 | }, 1045 | "funding": { 1046 | "url": "https://github.com/sponsors/sindresorhus" 1047 | } 1048 | }, 1049 | "node_modules/lodash.merge": { 1050 | "version": "4.6.2", 1051 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1052 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1053 | "dev": true 1054 | }, 1055 | "node_modules/magic-string": { 1056 | "version": "0.30.10", 1057 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", 1058 | "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", 1059 | "dev": true, 1060 | "dependencies": { 1061 | "@jridgewell/sourcemap-codec": "^1.4.15" 1062 | } 1063 | }, 1064 | "node_modules/merge2": { 1065 | "version": "1.4.1", 1066 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1067 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1068 | "dev": true, 1069 | "engines": { 1070 | "node": ">= 8" 1071 | } 1072 | }, 1073 | "node_modules/micromatch": { 1074 | "version": "4.0.5", 1075 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1076 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1077 | "dev": true, 1078 | "dependencies": { 1079 | "braces": "^3.0.2", 1080 | "picomatch": "^2.3.1" 1081 | }, 1082 | "engines": { 1083 | "node": ">=8.6" 1084 | } 1085 | }, 1086 | "node_modules/minimatch": { 1087 | "version": "3.1.2", 1088 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1089 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1090 | "dev": true, 1091 | "license": "ISC", 1092 | "dependencies": { 1093 | "brace-expansion": "^1.1.7" 1094 | }, 1095 | "engines": { 1096 | "node": "*" 1097 | } 1098 | }, 1099 | "node_modules/mri": { 1100 | "version": "1.2.0", 1101 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 1102 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 1103 | "dev": true, 1104 | "engines": { 1105 | "node": ">=4" 1106 | } 1107 | }, 1108 | "node_modules/ms": { 1109 | "version": "2.1.3", 1110 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1111 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1112 | "dev": true, 1113 | "license": "MIT" 1114 | }, 1115 | "node_modules/nanoid": { 1116 | "version": "3.3.11", 1117 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 1118 | "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 1119 | "dev": true, 1120 | "funding": [ 1121 | { 1122 | "type": "github", 1123 | "url": "https://github.com/sponsors/ai" 1124 | } 1125 | ], 1126 | "license": "MIT", 1127 | "bin": { 1128 | "nanoid": "bin/nanoid.cjs" 1129 | }, 1130 | "engines": { 1131 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1132 | } 1133 | }, 1134 | "node_modules/natural-compare": { 1135 | "version": "1.4.0", 1136 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1137 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1138 | "dev": true 1139 | }, 1140 | "node_modules/optionator": { 1141 | "version": "0.9.3", 1142 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", 1143 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", 1144 | "dev": true, 1145 | "dependencies": { 1146 | "@aashutoshrathi/word-wrap": "^1.2.3", 1147 | "deep-is": "^0.1.3", 1148 | "fast-levenshtein": "^2.0.6", 1149 | "levn": "^0.4.1", 1150 | "prelude-ls": "^1.2.1", 1151 | "type-check": "^0.4.0" 1152 | }, 1153 | "engines": { 1154 | "node": ">= 0.8.0" 1155 | } 1156 | }, 1157 | "node_modules/p-limit": { 1158 | "version": "3.1.0", 1159 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1160 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1161 | "dev": true, 1162 | "dependencies": { 1163 | "yocto-queue": "^0.1.0" 1164 | }, 1165 | "engines": { 1166 | "node": ">=10" 1167 | }, 1168 | "funding": { 1169 | "url": "https://github.com/sponsors/sindresorhus" 1170 | } 1171 | }, 1172 | "node_modules/p-locate": { 1173 | "version": "5.0.0", 1174 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1175 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1176 | "dev": true, 1177 | "dependencies": { 1178 | "p-limit": "^3.0.2" 1179 | }, 1180 | "engines": { 1181 | "node": ">=10" 1182 | }, 1183 | "funding": { 1184 | "url": "https://github.com/sponsors/sindresorhus" 1185 | } 1186 | }, 1187 | "node_modules/parent-module": { 1188 | "version": "1.0.1", 1189 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1190 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1191 | "dev": true, 1192 | "license": "MIT", 1193 | "dependencies": { 1194 | "callsites": "^3.0.0" 1195 | }, 1196 | "engines": { 1197 | "node": ">=6" 1198 | } 1199 | }, 1200 | "node_modules/path-exists": { 1201 | "version": "4.0.0", 1202 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1203 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1204 | "dev": true, 1205 | "engines": { 1206 | "node": ">=8" 1207 | } 1208 | }, 1209 | "node_modules/path-key": { 1210 | "version": "3.1.1", 1211 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1212 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1213 | "dev": true, 1214 | "license": "MIT", 1215 | "engines": { 1216 | "node": ">=8" 1217 | } 1218 | }, 1219 | "node_modules/picocolors": { 1220 | "version": "1.1.1", 1221 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1222 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1223 | "dev": true, 1224 | "license": "ISC" 1225 | }, 1226 | "node_modules/picomatch": { 1227 | "version": "2.3.1", 1228 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1229 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1230 | "dev": true, 1231 | "engines": { 1232 | "node": ">=8.6" 1233 | }, 1234 | "funding": { 1235 | "url": "https://github.com/sponsors/jonschlinkert" 1236 | } 1237 | }, 1238 | "node_modules/postcss": { 1239 | "version": "8.5.3", 1240 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", 1241 | "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", 1242 | "dev": true, 1243 | "funding": [ 1244 | { 1245 | "type": "opencollective", 1246 | "url": "https://opencollective.com/postcss/" 1247 | }, 1248 | { 1249 | "type": "tidelift", 1250 | "url": "https://tidelift.com/funding/github/npm/postcss" 1251 | }, 1252 | { 1253 | "type": "github", 1254 | "url": "https://github.com/sponsors/ai" 1255 | } 1256 | ], 1257 | "license": "MIT", 1258 | "dependencies": { 1259 | "nanoid": "^3.3.8", 1260 | "picocolors": "^1.1.1", 1261 | "source-map-js": "^1.2.1" 1262 | }, 1263 | "engines": { 1264 | "node": "^10 || ^12 || >=14" 1265 | } 1266 | }, 1267 | "node_modules/prelude-ls": { 1268 | "version": "1.2.1", 1269 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1270 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1271 | "dev": true, 1272 | "engines": { 1273 | "node": ">= 0.8.0" 1274 | } 1275 | }, 1276 | "node_modules/punycode": { 1277 | "version": "2.3.1", 1278 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1279 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1280 | "dev": true, 1281 | "license": "MIT", 1282 | "engines": { 1283 | "node": ">=6" 1284 | } 1285 | }, 1286 | "node_modules/queue-microtask": { 1287 | "version": "1.2.3", 1288 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1289 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1290 | "dev": true, 1291 | "funding": [ 1292 | { 1293 | "type": "github", 1294 | "url": "https://github.com/sponsors/feross" 1295 | }, 1296 | { 1297 | "type": "patreon", 1298 | "url": "https://www.patreon.com/feross" 1299 | }, 1300 | { 1301 | "type": "consulting", 1302 | "url": "https://feross.org/support" 1303 | } 1304 | ] 1305 | }, 1306 | "node_modules/resolve-from": { 1307 | "version": "4.0.0", 1308 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1309 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1310 | "dev": true, 1311 | "license": "MIT", 1312 | "engines": { 1313 | "node": ">=4" 1314 | } 1315 | }, 1316 | "node_modules/reusify": { 1317 | "version": "1.0.4", 1318 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1319 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1320 | "dev": true, 1321 | "engines": { 1322 | "iojs": ">=1.0.0", 1323 | "node": ">=0.10.0" 1324 | } 1325 | }, 1326 | "node_modules/rollup": { 1327 | "version": "3.29.4", 1328 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", 1329 | "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", 1330 | "dev": true, 1331 | "bin": { 1332 | "rollup": "dist/bin/rollup" 1333 | }, 1334 | "engines": { 1335 | "node": ">=14.18.0", 1336 | "npm": ">=8.0.0" 1337 | }, 1338 | "optionalDependencies": { 1339 | "fsevents": "~2.3.2" 1340 | } 1341 | }, 1342 | "node_modules/run-parallel": { 1343 | "version": "1.2.0", 1344 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1345 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1346 | "dev": true, 1347 | "funding": [ 1348 | { 1349 | "type": "github", 1350 | "url": "https://github.com/sponsors/feross" 1351 | }, 1352 | { 1353 | "type": "patreon", 1354 | "url": "https://www.patreon.com/feross" 1355 | }, 1356 | { 1357 | "type": "consulting", 1358 | "url": "https://feross.org/support" 1359 | } 1360 | ], 1361 | "dependencies": { 1362 | "queue-microtask": "^1.2.2" 1363 | } 1364 | }, 1365 | "node_modules/sade": { 1366 | "version": "1.8.1", 1367 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 1368 | "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 1369 | "dev": true, 1370 | "dependencies": { 1371 | "mri": "^1.1.0" 1372 | }, 1373 | "engines": { 1374 | "node": ">=6" 1375 | } 1376 | }, 1377 | "node_modules/shebang-command": { 1378 | "version": "2.0.0", 1379 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1380 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1381 | "dev": true, 1382 | "license": "MIT", 1383 | "dependencies": { 1384 | "shebang-regex": "^3.0.0" 1385 | }, 1386 | "engines": { 1387 | "node": ">=8" 1388 | } 1389 | }, 1390 | "node_modules/shebang-regex": { 1391 | "version": "3.0.0", 1392 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1393 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1394 | "dev": true, 1395 | "license": "MIT", 1396 | "engines": { 1397 | "node": ">=8" 1398 | } 1399 | }, 1400 | "node_modules/source-map-js": { 1401 | "version": "1.2.1", 1402 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1403 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1404 | "dev": true, 1405 | "license": "BSD-3-Clause", 1406 | "engines": { 1407 | "node": ">=0.10.0" 1408 | } 1409 | }, 1410 | "node_modules/strip-json-comments": { 1411 | "version": "3.1.1", 1412 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1413 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1414 | "dev": true, 1415 | "license": "MIT", 1416 | "engines": { 1417 | "node": ">=8" 1418 | }, 1419 | "funding": { 1420 | "url": "https://github.com/sponsors/sindresorhus" 1421 | } 1422 | }, 1423 | "node_modules/supports-color": { 1424 | "version": "7.2.0", 1425 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1426 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1427 | "dev": true, 1428 | "dependencies": { 1429 | "has-flag": "^4.0.0" 1430 | }, 1431 | "engines": { 1432 | "node": ">=8" 1433 | } 1434 | }, 1435 | "node_modules/to-regex-range": { 1436 | "version": "5.0.1", 1437 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1438 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1439 | "dev": true, 1440 | "dependencies": { 1441 | "is-number": "^7.0.0" 1442 | }, 1443 | "engines": { 1444 | "node": ">=8.0" 1445 | } 1446 | }, 1447 | "node_modules/type-check": { 1448 | "version": "0.4.0", 1449 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1450 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1451 | "dev": true, 1452 | "dependencies": { 1453 | "prelude-ls": "^1.2.1" 1454 | }, 1455 | "engines": { 1456 | "node": ">= 0.8.0" 1457 | } 1458 | }, 1459 | "node_modules/uri-js": { 1460 | "version": "4.4.1", 1461 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1462 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1463 | "dev": true, 1464 | "license": "BSD-2-Clause", 1465 | "dependencies": { 1466 | "punycode": "^2.1.0" 1467 | } 1468 | }, 1469 | "node_modules/uvu": { 1470 | "version": "0.5.6", 1471 | "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", 1472 | "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", 1473 | "dev": true, 1474 | "dependencies": { 1475 | "dequal": "^2.0.0", 1476 | "diff": "^5.0.0", 1477 | "kleur": "^4.0.3", 1478 | "sade": "^1.7.3" 1479 | }, 1480 | "bin": { 1481 | "uvu": "bin.js" 1482 | }, 1483 | "engines": { 1484 | "node": ">=8" 1485 | } 1486 | }, 1487 | "node_modules/which": { 1488 | "version": "2.0.2", 1489 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1490 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1491 | "dev": true, 1492 | "license": "ISC", 1493 | "dependencies": { 1494 | "isexe": "^2.0.0" 1495 | }, 1496 | "bin": { 1497 | "node-which": "bin/node-which" 1498 | }, 1499 | "engines": { 1500 | "node": ">= 8" 1501 | } 1502 | }, 1503 | "node_modules/yocto-queue": { 1504 | "version": "0.1.0", 1505 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1506 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1507 | "dev": true, 1508 | "engines": { 1509 | "node": ">=10" 1510 | }, 1511 | "funding": { 1512 | "url": "https://github.com/sponsors/sindresorhus" 1513 | } 1514 | } 1515 | } 1516 | } 1517 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-declaration-sorter", 3 | "version": "7.2.0", 4 | "description": "Sorts CSS declarations fast and automatically in a certain order.", 5 | "type": "module", 6 | "exports": { 7 | "import": { 8 | "types": "./src/core/main.d.mts", 9 | "default": "./src/core/main.mjs" 10 | }, 11 | "require": { 12 | "types": "./src/core/main.d.cts", 13 | "default": "./dist/main.cjs" 14 | } 15 | }, 16 | "types": "./src/core/main.d.cts", 17 | "main": "./dist/main.cjs", 18 | "files": [ 19 | "src/core/", 20 | "src/orders/", 21 | "dist/" 22 | ], 23 | "scripts": { 24 | "build": "rollup -c", 25 | "preversion": "npm test", 26 | "test": "uvu src .+\\.test\\.mjs", 27 | "test:ci": "npm test && npm run lint -- --max-warnings 0", 28 | "lint": "eslint src/core/*.mjs", 29 | "scrape": "node src/property-scraper.mjs", 30 | "prepack": "npm run build" 31 | }, 32 | "devDependencies": { 33 | "@eslint/js": "^9.1.1", 34 | "@mdn/browser-compat-data": "^6.0.7", 35 | "@rollup/plugin-dynamic-import-vars": "^2.1.2", 36 | "eslint": "^9.0.0", 37 | "postcss": "^8.4.38", 38 | "rollup": "^3.29.4", 39 | "uvu": "^0.5.6" 40 | }, 41 | "peerDependencies": { 42 | "postcss": "^8.0.9" 43 | }, 44 | "engines": { 45 | "node": "^14 || ^16 || >=18" 46 | }, 47 | "repository": { 48 | "type": "git", 49 | "url": "https://github.com/Siilwyn/css-declaration-sorter.git" 50 | }, 51 | "author": "Selwyn (https://selwyn.cc/)", 52 | "license": "ISC", 53 | "keywords": [ 54 | "postcss", 55 | "postcss-plugin", 56 | "css", 57 | "declaration", 58 | "sorter", 59 | "property", 60 | "order" 61 | ] 62 | } 63 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | CSS declaration sorter logo 2 | 3 | # CSS Declaration Sorter 4 | [![npm][npm-badge]][npm] 5 | 6 | A Node.js module and [PostCSS] plugin to sort CSS, SCSS or Less declarations based on their property names. Ensuring styling is organized, more consistent and in order... The goal of this package is to sort the source code of a project in the build process or to decrease the distributed CSS gzipped size. 7 | 8 | Check out [the Prettier plugin](https://github.com/Siilwyn/prettier-plugin-css-order) for usage with a variety of file formats. 9 | 10 | ## Niceness 11 | - Up-to-date CSS properties fetched from the [MDN Compatibility Data](https://github.com/mdn/browser-compat-data/) project. 12 | - Choose your wanted order or provide your own. 13 | - Nested rules sorting support. 14 | - SCSS and Less support when combined with either [postcss-scss](https://github.com/postcss/postcss-scss) or [postcss-less](https://github.com/webschik/postcss-less). 15 | - Thought-out sorting orders out of the box, **approved by their authors**. 16 | 17 | ## Alphabetical example 18 | Input: 19 | ```css 20 | body { 21 | display: block; 22 | animation: none; 23 | color: #C55; 24 | border: 0; 25 | } 26 | ``` 27 | 28 | Output: 29 | ```css 30 | body { 31 | animation: none; 32 | border: 0; 33 | color: #C55; 34 | display: block; 35 | } 36 | ``` 37 | 38 | ## Built-in sorting orders 39 | - Alphabetical 40 | `alphabetical` 41 | *Default, order in a simple alphabetical manner from a - z.* 42 | 43 | - [SMACSS](http://smacss.com/book/formatting#grouping) 44 | `smacss` 45 | *Order from most important, flow affecting properties, to least important properties.* 46 | 1. Box 47 | 2. Border 48 | 3. Background 49 | 4. Text 50 | 5. Other 51 | 52 | - [Concentric CSS](https://github.com/brandon-rhodes/Concentric-CSS) 53 | `concentric-css` 54 | *Order properties applying outside the box model, moving inward to intrinsic changes.* 55 | 1. Positioning 56 | 2. Visibility 57 | 3. Box model 58 | 4. Dimensions 59 | 5. Text 60 | 61 | ## Usage 62 | Following the PostCSS plugin guidelines, this package depends on PostCSS as a peer dependency: 63 | `npm install postcss css-declaration-sorter --save-dev` 64 | 65 | ### CLI 66 | This module does not include its own CLI but works with the official [PostCSS CLI](https://github.com/postcss/postcss-cli). To use the examples below, the `postcss-cli` package is a required dependency. 67 | 68 | Piping out result from file: 69 | `postcss input.css --use css-declaration-sorter | cat` 70 | 71 | Sorting multiple files by overwriting: 72 | `postcss *.css --use css-declaration-sorter --replace --no-map` 73 | 74 | Sorting all files in a directory with SCSS syntax using [postcss-scss](https://github.com/postcss/postcss-scss) by overwriting: 75 | `postcss ./src/**/*.scss --syntax postcss-scss --use css-declaration-sorter --replace --no-map` 76 | 77 | Sorting all files in the directory with SCSS syntax and SMACSS order by overwriting, using `package.json` configuration: 78 | ```json 79 | "postcss": { 80 | "syntax": "postcss-scss", 81 | "map": false, 82 | "plugins": { 83 | "css-declaration-sorter": { "order": "smacss" } 84 | } 85 | } 86 | ``` 87 | 88 | `postcss ./src/**/*.scss --replace --config package.json` 89 | 90 | ### Vanilla JS 91 | ```js 92 | import postcss from 'postcss'; 93 | import { cssDeclarationSorter } from 'css-declaration-sorter'; 94 | 95 | postcss([cssDeclarationSorter({ order: 'smacss' })]) 96 | .process('a { color: hyperblue; display: block; }', { from: undefined }) 97 | .then(result => console.log( 98 | result.css === 'a { display: block; color: hyperblue; }' 99 | )); 100 | ``` 101 | ___ 102 | 103 | **[View more usage examples](/examples) in combination with other tools.** 104 | 105 | ___ 106 | 107 | ## API 108 | ### cssDeclarationSorter({ order, keepOverrides }) 109 | 110 | #### order 111 | Type: `string` or `function` 112 | Default: `alphabetical` 113 | Options: `alphabetical`, `smacss`, `concentric-css` 114 | 115 | Provide the name of one of the built-in sort orders or a comparison function that is passed to ([`Array.sort`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)). This function receives two declaration names and is expected to return `-1`, `0` or `1` depending on the wanted order. 116 | 117 | #### keepOverrides 118 | Type: `Boolean` 119 | Default: `false` 120 | 121 | To prevent breaking legacy CSS where shorthand declarations override longhand declarations (also taking into account vendor prefixes) this option can enabled. For example `animation-name: some; animation: greeting;` will be kept in this order when `keepOverrides` is `true`. 122 | 123 | [PostCSS]: https://github.com/postcss/postcss 124 | 125 | [npm]: https://www.npmjs.com/package/css-declaration-sorter 126 | [npm-badge]: https://tinyshields.dev/npm/css-declaration-sorter.svg 127 | -------------------------------------------------------------------------------- /rollup.config.mjs: -------------------------------------------------------------------------------- 1 | import dynamicImportVars from '@rollup/plugin-dynamic-import-vars'; 2 | 3 | export default [ 4 | { 5 | input: 'src/core/main.mjs', 6 | output: { 7 | dir: 'dist', 8 | format: 'cjs', 9 | entryFileNames: '[name].cjs', 10 | interop: 'default', 11 | exports: 'named', 12 | inlineDynamicImports: true, 13 | outro: 'module.exports = cssDeclarationSorter;', 14 | }, 15 | plugins: [ 16 | dynamicImportVars(), 17 | ], 18 | }, 19 | ]; 20 | -------------------------------------------------------------------------------- /security.md: -------------------------------------------------------------------------------- 1 | # Security 2 | 3 | ## Contact 4 | To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). 5 | Tidelift will coordinate the fix and disclosure. 6 | -------------------------------------------------------------------------------- /src/core/bubble-sort.mjs: -------------------------------------------------------------------------------- 1 | export function bubbleSort (list, comparator) { 2 | let upperIndex = list.length - 1; 3 | 4 | while (upperIndex > 0) { 5 | let swapIndex = 0; 6 | 7 | for (let i = 0; i < upperIndex; i += 1) { 8 | if (comparator(list[i], list[i + 1]) > 0) { 9 | const temp = list[i + 1]; 10 | list[i + 1] = list[i]; 11 | list[i] = temp; 12 | swapIndex = i; 13 | } 14 | } 15 | 16 | upperIndex = swapIndex; 17 | } 18 | 19 | return list; 20 | } 21 | -------------------------------------------------------------------------------- /src/core/main.d.cts: -------------------------------------------------------------------------------- 1 | import type { PluginCreator } from 'postcss'; 2 | 3 | declare const cssDeclarationSorter: PluginCreator<{ 4 | /** 5 | Provide the name of one of the built-in sort orders or a comparison function that is passed to `Array.sort`. 6 | 7 | @default 'alphabetical' 8 | */ 9 | order?: SortOrder | SortFunction | undefined; 10 | 11 | /** 12 | To prevent breaking legacy CSS where shorthand declarations override longhand declarations. For example `animation-name: some; animation: greeting;` will be kept in this order. 13 | 14 | @default false 15 | */ 16 | keepOverrides?: boolean; 17 | }>; 18 | 19 | export = cssDeclarationSorter; 20 | 21 | type SortOrder = 'alphabetical' | 'concentric-css' | 'smacss'; 22 | 23 | /** 24 | * This function receives two declaration property names and is expected 25 | * to return -1, 0 or 1 depending on the wanted order. 26 | */ 27 | type SortFunction = (propertyNameA: string, propertyNameB: string) => -1 | 0 | 1; 28 | -------------------------------------------------------------------------------- /src/core/main.d.mts: -------------------------------------------------------------------------------- 1 | import type { PluginCreator } from 'postcss'; 2 | 3 | export const cssDeclarationSorter: PluginCreator<{ 4 | /** 5 | Provide the name of one of the built-in sort orders or a comparison function that is passed to `Array.sort`. 6 | 7 | @default 'alphabetical' 8 | */ 9 | order?: SortOrder | SortFunction | undefined; 10 | 11 | /** 12 | To prevent breaking legacy CSS where shorthand declarations override longhand declarations. For example `animation-name: some; animation: greeting;` will be kept in this order. 13 | 14 | @default false 15 | */ 16 | keepOverrides?: boolean; 17 | }>; 18 | 19 | export default cssDeclarationSorter; 20 | 21 | type SortOrder = 'alphabetical' | 'concentric-css' | 'smacss'; 22 | 23 | /** 24 | * This function receives two declaration property names and is expected 25 | * to return -1, 0 or 1 depending on the wanted order. 26 | */ 27 | type SortFunction = (propertyNameA: string, propertyNameB: string) => -1 | 0 | 1; 28 | -------------------------------------------------------------------------------- /src/core/main.mjs: -------------------------------------------------------------------------------- 1 | import { shorthandData } from './shorthand-data.mjs'; 2 | import { bubbleSort } from './bubble-sort.mjs'; 3 | 4 | const builtInOrders = [ 5 | 'alphabetical', 6 | 'concentric-css', 7 | 'smacss', 8 | ]; 9 | 10 | export const cssDeclarationSorter = ({ order = 'alphabetical', keepOverrides = false } = {}) => ({ 11 | postcssPlugin: 'css-declaration-sorter', 12 | OnceExit (css) { 13 | let withKeepOverrides = comparator => comparator; 14 | if (keepOverrides) { 15 | withKeepOverrides = withOverridesComparator(shorthandData); 16 | } 17 | 18 | if (typeof order === 'function') { 19 | return processCss({ css, comparator: withKeepOverrides(order) }); 20 | } 21 | 22 | if (!builtInOrders.includes(order)) 23 | return Promise.reject( 24 | Error([ 25 | `Invalid built-in order '${order}' provided.`, 26 | `Available built-in orders are: ${builtInOrders}`, 27 | ].join('\n')) 28 | ); 29 | 30 | return import(`../orders/${order}.mjs`) 31 | .then(({ properties }) => processCss({ 32 | css, 33 | comparator: withKeepOverrides(orderComparator(properties)), 34 | })); 35 | }, 36 | }); 37 | 38 | cssDeclarationSorter.postcss = true; 39 | 40 | // Kept for backward compatibility 41 | export default cssDeclarationSorter; 42 | 43 | function processCss ({ css, comparator }) { 44 | const comments = []; 45 | const rulesCache = []; 46 | 47 | css.walk(node => { 48 | const nodes = node.nodes; 49 | const type = node.type; 50 | 51 | if (type === 'comment') { 52 | // Don't do anything to root comments or the last newline comment 53 | const isNewlineNode = node.raws.before && node.raws.before.includes('\n'); 54 | const lastNewlineNode = isNewlineNode && !node.next(); 55 | const onlyNode = !node.prev() && !node.next() || !node.parent; 56 | 57 | if (lastNewlineNode || onlyNode || node.parent.type === 'root') { 58 | return; 59 | } 60 | 61 | if (isNewlineNode) { 62 | const pairedNode = node.next() || node.prev(); 63 | if (pairedNode) { 64 | comments.unshift({ 65 | 'comment': node, 66 | 'pairedNode': pairedNode, 67 | 'insertPosition': node.next() ? 'Before' : 'After', 68 | }); 69 | node.remove(); 70 | } 71 | } else { 72 | const pairedNode = node.prev() || node.next(); 73 | if (pairedNode) { 74 | comments.push({ 75 | 'comment': node, 76 | 'pairedNode': pairedNode, 77 | 'insertPosition': 'After', 78 | }); 79 | node.remove(); 80 | } 81 | } 82 | return; 83 | } 84 | 85 | // Add rule-like nodes to a cache so that we can remove all 86 | // comment nodes before we start sorting. 87 | const isRule = type === 'rule' || type === 'atrule'; 88 | if (isRule && nodes && nodes.length > 1) { 89 | rulesCache.push(nodes); 90 | } 91 | }); 92 | 93 | // Perform a sort once all comment nodes are removed 94 | rulesCache.forEach(nodes => { 95 | sortCssDeclarations({ nodes, comparator }); 96 | }); 97 | 98 | // Add comments back to the nodes they are paired with 99 | comments.forEach(node => { 100 | const pairedNode = node.pairedNode; 101 | node.comment.remove(); 102 | pairedNode.parent && pairedNode.parent['insert' + node.insertPosition](pairedNode, node.comment); 103 | }); 104 | } 105 | 106 | function sortCssDeclarations ({ nodes, comparator }) { 107 | bubbleSort(nodes, (a, b) => { 108 | if (a.type === 'decl' && b.type === 'decl') { 109 | return comparator(a.prop, b.prop); 110 | } else { 111 | return compareDifferentType(a, b); 112 | } 113 | }); 114 | } 115 | 116 | function withOverridesComparator (shorthandData) { 117 | return function (comparator) { 118 | return function (a, b) { 119 | a = removeVendorPrefix(a); 120 | b = removeVendorPrefix(b); 121 | 122 | if (shorthandData[a] && shorthandData[a].includes(b)) return 0; 123 | if (shorthandData[b] && shorthandData[b].includes(a)) return 0; 124 | 125 | return comparator(a, b); 126 | }; 127 | }; 128 | } 129 | 130 | function orderComparator (order) { 131 | return function (a, b) { 132 | const bIndex = order.indexOf(b); 133 | 134 | if (bIndex === -1) { 135 | return 0; 136 | } 137 | 138 | return order.indexOf(a) - bIndex; 139 | }; 140 | } 141 | 142 | function compareDifferentType (a, b) { 143 | if (b.type === 'atrule' || a.type === 'atrule') { 144 | return 0; 145 | } 146 | 147 | return a.type === 'decl' ? -1 : b.type === 'decl' ? 1 : 0; 148 | } 149 | 150 | function removeVendorPrefix (property) { 151 | return property.replace(/^-\w+-/, ''); 152 | } 153 | -------------------------------------------------------------------------------- /src/core/main.test.mjs: -------------------------------------------------------------------------------- 1 | import { test } from 'uvu'; 2 | import * as assert from 'uvu/assert'; 3 | import postcss from 'postcss'; 4 | import { cssDeclarationSorter as plugin } from './main.mjs'; 5 | 6 | const testCssFixtures = (testMessage, tests) => { 7 | test(testMessage, () => ( 8 | Promise.all(tests.map(({ message, fixture, expected, options }) => ( 9 | postcss(plugin(options)) 10 | .process(fixture, { from: undefined }) 11 | .then((result) => { 12 | assert.is(result.css, expected, message); 13 | assert.is(result.warnings().length, 0); 14 | }) 15 | ))) 16 | )); 17 | }; 18 | 19 | const sortOrderTests = [ 20 | { 21 | message: 'Keep same order for identical properties.', 22 | fixture: 'a{flex: 0;flex: 2;}', 23 | expected: 'a{flex: 0;flex: 2;}', 24 | }, 25 | { 26 | message: 'Sort alphabetically with no order defined.', 27 | fixture: 'a{flex: 0;border: 0;}', 28 | expected: 'a{border: 0;flex: 0;}', 29 | }, 30 | { 31 | message: 'Sort alphabetically with a defined order.', 32 | fixture: 'a{flex: 0;border: 0;}', 33 | expected: 'a{border: 0;flex: 0;}', 34 | options: { order: 'alphabetical' }, 35 | }, 36 | { 37 | message: 'Sort according to custom order, changed.', 38 | fixture: 'a{border: 0;z-index: 0;}', 39 | expected: 'a{z-index: 0;border: 0;}', 40 | options: { order: () => 1 }, 41 | }, 42 | { 43 | message: 'Sort according to custom order, retained.', 44 | fixture: 'a{border: 0;z-index: 0;}', 45 | expected: 'a{border: 0;z-index: 0;}', 46 | options: { order: () => -1 }, 47 | }, 48 | { 49 | message: 'Sort according to SMACSS.', 50 | fixture: 'a{border: 0;flex: 0;}', 51 | expected: 'a{flex: 0;border: 0;}', 52 | options: { order: 'smacss' }, 53 | }, 54 | { 55 | message: 'Sort according to Concentric CSS.', 56 | fixture: 'a{border: 0;flex: 0;}', 57 | expected: 'a{flex: 0;border: 0;}', 58 | options: { order: 'concentric-css' }, 59 | }, 60 | { 61 | message: 'Keep at-rule at the same position.', 62 | fixture: 'a{border: 0;@import sii;flex:0;}', 63 | expected: 'a{border: 0;@import sii;flex:0;}', 64 | }, 65 | { 66 | message: 'Retain unknown properties, left to right.', 67 | fixture: 'a{unknown-a: 0;unknown-b: 0;}', 68 | expected: 'a{unknown-a: 0;unknown-b: 0;}', 69 | }, 70 | { 71 | message: 'Retain unknown properties, right to left.', 72 | fixture: 'a{unknown-b: 0;unknown-a: 0;}', 73 | expected: 'a{unknown-b: 0;unknown-a: 0;}', 74 | }, 75 | { 76 | message: 'Retain unknown next to known properties, left to right.', 77 | fixture: 'a{animation: 0;animation-timeline: none;}', 78 | expected: 'a{animation: 0;animation-timeline: none;}', 79 | }, 80 | { 81 | message: 'Retain unknown next to known properties, right to left.', 82 | fixture: 'a{animation-timeline: none;animation: 0;}', 83 | expected: 'a{animation-timeline: none;animation: 0;}', 84 | }, 85 | { 86 | message: 'Sort shorthand, resulting in impactful ordering.', 87 | fixture: 'a{border-width: 0;border-radius: 0;border-bottom: 1px;}', 88 | expected: 'a{border-bottom: 1px;border-radius: 0;border-width: 0;}', 89 | }, 90 | ]; 91 | 92 | const commentOrderTests = [ 93 | { 94 | message: 'Keep comment intact.', 95 | fixture: 'a{flex: 0;/*flex*/}', 96 | expected: 'a{flex: 0;/*flex*/}', 97 | }, 98 | { 99 | message: 'Keep root comments intact.', 100 | fixture: '/*a*/\na{}\n/*b*/\nb{}', 101 | expected: '/*a*/\na{}\n/*b*/\nb{}', 102 | }, 103 | { 104 | message: 'Handle declaration with one comment.', 105 | fixture: 'a{/*comment*/}', 106 | expected: 'a{/*comment*/}', 107 | }, 108 | { 109 | message: 'Keep dangling comment intact.', 110 | fixture: 'a{flex: 0;\n/*end*/}', 111 | expected: 'a{flex: 0;\n/*end*/}', 112 | }, 113 | { 114 | message: 'Keep multiple comments intact.', 115 | fixture: 'a{flex: 0;\n/*flex*/\n/*flex 2*/}', 116 | expected: 'a{flex: 0;\n/*flex*/\n/*flex 2*/}', 117 | }, 118 | { 119 | message: 'Keep newline comment above declaration.', 120 | fixture: 'a{flex: 0;\n/*border*/\nborder: 0;}', 121 | expected: 'a{\n/*border*/\nborder: 0;flex: 0;}', 122 | }, 123 | { 124 | message: 'Handle multiple newline comments.', 125 | fixture: 'a{flex: 0;\n/*border a*/\n/*border b*/\nborder: 0;}', 126 | expected: 'a{\n/*border a*/\n/*border b*/\nborder: 0;flex: 0;}', 127 | }, 128 | { 129 | message: 'Keep inline comment beside declaration.', 130 | fixture: 'a{flex: 0;\nborder: 0; /*border*/}', 131 | expected: 'a{\nborder: 0; /*border*/flex: 0;}', 132 | }, 133 | { 134 | message: 'Do not lose reference to paired comment node on one line.', 135 | fixture: 'body{/*a*/border:0;/*b*/}', 136 | expected: 'body{border:0;/*b*//*a*/}', 137 | }, 138 | ]; 139 | 140 | const nestedDeclarationTests = [ 141 | { 142 | message: 'Sort nested declarations.', 143 | fixture: 'a{a{flex: 0;border: 0;}}', 144 | expected: 'a{a{border: 0;flex: 0;}}', 145 | }, 146 | { 147 | message: 'Sort nested at-rule declarations.', 148 | fixture: 'a{@media(){flex: 0;border: 0;}}', 149 | expected: 'a{@media(){border: 0;flex: 0;}}', 150 | }, 151 | { 152 | message: 'Keep nested newline comment above declaration.', 153 | fixture: 'a{&:hover{flex: 0;\n/*border*/\nborder: 0;}}', 154 | expected: 'a{&:hover{\n/*border*/\nborder: 0;flex: 0;}}', 155 | }, 156 | { 157 | message: 'Keep nested inline comment beside declaration.', 158 | fixture: 'a{&:hover{flex: 0;\nborder: 0; /*border*/}}', 159 | expected: 'a{&:hover{\nborder: 0; /*border*/flex: 0;}}', 160 | }, 161 | { 162 | message: 'Put declarations before nested selector.', 163 | fixture: 'a{margin: 0;&:hover{color: red;}padding: 0;}', 164 | expected: 'a{margin: 0;padding: 0;&:hover{color: red;}}', 165 | }, 166 | ]; 167 | 168 | const keepOverridesTests = [ 169 | { 170 | message: 'Keep shorthand overrides in place.', 171 | fixture: 'a{animation-name: hi;animation: hey 1s ease;}', 172 | expected: 'a{animation-name: hi;animation: hey 1s ease;}', 173 | options: { keepOverrides: true }, 174 | }, 175 | { 176 | message: 'Keep longhand overrides in place.', 177 | fixture: 'a{flex: 1;flex-grow: -1;}', 178 | expected: 'a{flex: 1;flex-grow: -1;}', 179 | options: { keepOverrides: true, order: () => -1 }, 180 | }, 181 | { 182 | message: 'Sort overrides with other declarations.', 183 | fixture: 'a{z-index: 1;animation: hey 1s ease;}', 184 | expected: 'a{animation: hey 1s ease;z-index: 1;}', 185 | options: { keepOverrides: true }, 186 | }, 187 | { 188 | message: 'Keep overrides in place mixed with declaration.', 189 | fixture: 'a{z-index: 1;animation: hey 1s ease;animation-name: hi;}', 190 | expected: 'a{animation: hey 1s ease;animation-name: hi;z-index: 1;}', 191 | options: { keepOverrides: true }, 192 | }, 193 | { 194 | message: 'Keep vendor prefixed declarations in place.', 195 | fixture: 'a{animation: a;-moz-animation:b;}', 196 | expected: 'a{animation: a;-moz-animation:b;}', 197 | options: { keepOverrides: true }, 198 | }, 199 | { 200 | message: 'Keep border declarations in place.', 201 | fixture: 'a{border-top: 1px solid;border-color: purple;}', 202 | expected:'a{border-top: 1px solid;border-color: purple;}', 203 | options: { keepOverrides: true }, 204 | }, 205 | { 206 | message: 'Keep padding declarations in place.', 207 | fixture: 'a{padding-left: unset;padding-inline-start: 0;}', 208 | expected:'a{padding-left: unset;padding-inline-start: 0;}', 209 | options: { keepOverrides: true }, 210 | }, 211 | { 212 | message: 'Keep border block declarations in place.', 213 | fixture: 'a{border-block-end: 1px solid purple;border-block: none;}', 214 | expected: 'a{border-block-end: 1px solid purple;border-block: none;}', 215 | options: { keepOverrides: true }, 216 | }, 217 | { 218 | message: 'Keep border block style declarations in place.', 219 | fixture: 'a{border-style: none;border-block-end: 1px solid purple;}', 220 | expected: 'a{border-style: none;border-block-end: 1px solid purple;}', 221 | options: { keepOverrides: true }, 222 | }, 223 | { 224 | message: 'Keep border width logical property declarations in place.', 225 | fixture: 'a{background: grey;border-width: 0;border-top-width: 1px;border-inline-start-width: 1px;}', 226 | expected: 'a{background: grey;border-width: 0;border-inline-start-width: 1px;border-top-width: 1px;}', 227 | options: { keepOverrides: true }, 228 | }, 229 | { 230 | message: 'Keep longhand border style declaration in place.', 231 | fixture: 'a{border-width: 0;border-radius: 0;border-bottom: 1px;}', 232 | expected: 'a{border-radius: 0;border-width: 0;border-bottom: 1px;}', 233 | options: { keepOverrides: true }, 234 | }, 235 | { 236 | message: 'Keep longhand border logical declaration in place.', 237 | fixture: 'a{border-radius: 5px;border-end-start-radius: 0;border-end-end-radius: 0;}', 238 | expected: 'a{border-radius: 5px;border-end-end-radius: 0;border-end-start-radius: 0;}', 239 | options: { keepOverrides: true }, 240 | }, 241 | ]; 242 | 243 | testCssFixtures('Should order declarations.', sortOrderTests); 244 | 245 | testCssFixtures('Should retain comments.', commentOrderTests); 246 | 247 | testCssFixtures('Should order nested declarations.', nestedDeclarationTests); 248 | 249 | testCssFixtures('Should keep shorthand override order.', keepOverridesTests); 250 | 251 | test('Should use the PostCSS plugin API.', () => { 252 | assert.is(plugin().postcssPlugin, 'css-declaration-sorter', 'Able to access name.'); 253 | }); 254 | 255 | test.run(); 256 | -------------------------------------------------------------------------------- /src/core/shorthand-data.mjs: -------------------------------------------------------------------------------- 1 | export const shorthandData = { 2 | 'animation': [ 3 | 'animation-name', 4 | 'animation-duration', 5 | 'animation-timing-function', 6 | 'animation-delay', 7 | 'animation-iteration-count', 8 | 'animation-direction', 9 | 'animation-fill-mode', 10 | 'animation-play-state', 11 | ], 12 | 'background': [ 13 | 'background-image', 14 | 'background-size', 15 | 'background-position', 16 | 'background-repeat', 17 | 'background-origin', 18 | 'background-clip', 19 | 'background-attachment', 20 | 'background-color', 21 | ], 22 | 'columns': [ 23 | 'column-width', 24 | 'column-count', 25 | ], 26 | 'column-rule': [ 27 | 'column-rule-width', 28 | 'column-rule-style', 29 | 'column-rule-color', 30 | ], 31 | 'contain-intrinsic-size': [ 32 | 'contain-intrinsic-width', 33 | 'contain-intrinsic-height', 34 | ], 35 | 'flex': [ 36 | 'flex-grow', 37 | 'flex-shrink', 38 | 'flex-basis', 39 | ], 40 | 'flex-flow': [ 41 | 'flex-direction', 42 | 'flex-wrap', 43 | ], 44 | 'font': [ 45 | 'font-style', 46 | 'font-variant', 47 | 'font-weight', 48 | 'font-stretch', 49 | 'font-size', 50 | 'font-family', 51 | 'line-height', 52 | ], 53 | 'gap': [ 54 | 'column-gap', 55 | 'row-gap', 56 | ], 57 | 'grid': [ 58 | 'grid-template-rows', 59 | 'grid-template-columns', 60 | 'grid-template-areas', 61 | 'grid-auto-rows', 62 | 'grid-auto-columns', 63 | 'grid-auto-flow', 64 | 'column-gap', 65 | 'row-gap', 66 | ], 67 | 'grid-area': [ 68 | 'grid-row-start', 69 | 'grid-column-start', 70 | 'grid-row-end', 71 | 'grid-column-end', 72 | ], 73 | 'grid-column': [ 74 | 'grid-column-start', 75 | 'grid-column-end', 76 | ], 77 | 'grid-row': [ 78 | 'grid-row-start', 79 | 'grid-row-end', 80 | ], 81 | 'grid-template': [ 82 | 'grid-template-columns', 83 | 'grid-template-rows', 84 | 'grid-template-areas', 85 | ], 86 | 'list-style': [ 87 | 'list-style-type', 88 | 'list-style-position', 89 | 'list-style-image', 90 | ], 91 | 'offset': [ 92 | 'offset-anchor', 93 | 'offset-distance', 94 | 'offset-path', 95 | 'offset-position', 96 | 'offset-rotate', 97 | ], 98 | 'padding': [ 99 | 'padding-block', 100 | 'padding-block-start', 101 | 'padding-block-end', 102 | 'padding-inline', 103 | 'padding-inline-start', 104 | 'padding-inline-end', 105 | 'padding-top', 106 | 'padding-right', 107 | 'padding-bottom', 108 | 'padding-left', 109 | ], 110 | 'padding-block': [ 111 | 'padding-block-start', 112 | 'padding-block-end', 113 | 'padding-top', 114 | 'padding-right', 115 | 'padding-bottom', 116 | 'padding-left', 117 | ], 118 | 'padding-block-start': [ 119 | 'padding-top', 120 | 'padding-right', 121 | 'padding-left', 122 | ], 123 | 'padding-block-end': [ 124 | 'padding-right', 125 | 'padding-bottom', 126 | 'padding-left', 127 | ], 128 | 'padding-inline': [ 129 | 'padding-inline-start', 130 | 'padding-inline-end', 131 | 'padding-top', 132 | 'padding-right', 133 | 'padding-bottom', 134 | 'padding-left', 135 | ], 136 | 'padding-inline-start': [ 137 | 'padding-top', 138 | 'padding-right', 139 | 'padding-left', 140 | ], 141 | 'padding-inline-end': [ 142 | 'padding-right', 143 | 'padding-bottom', 144 | 'padding-left', 145 | ], 146 | 'margin': [ 147 | 'margin-block', 148 | 'margin-block-start', 149 | 'margin-block-end', 150 | 'margin-inline', 151 | 'margin-inline-start', 152 | 'margin-inline-end', 153 | 'margin-top', 154 | 'margin-right', 155 | 'margin-bottom', 156 | 'margin-left', 157 | ], 158 | 'margin-block': [ 159 | 'margin-block-start', 160 | 'margin-block-end', 161 | 'margin-top', 162 | 'margin-right', 163 | 'margin-bottom', 164 | 'margin-left', 165 | ], 166 | 'margin-inline': [ 167 | 'margin-inline-start', 168 | 'margin-inline-end', 169 | 'margin-top', 170 | 'margin-right', 171 | 'margin-bottom', 172 | 'margin-left', 173 | ], 174 | 'margin-inline-start': [ 175 | 'margin-top', 176 | 'margin-right', 177 | 'margin-bottom', 178 | 'margin-left', 179 | ], 180 | 'margin-inline-end': [ 181 | 'margin-top', 182 | 'margin-right', 183 | 'margin-bottom', 184 | 'margin-left', 185 | ], 186 | 'marker': [ 187 | 'marker-start', 188 | 'marker-mid', 189 | 'marker-end', 190 | ], 191 | 'border': [ 192 | 'border-top', 193 | 'border-right', 194 | 'border-bottom', 195 | 'border-left', 196 | 'border-width', 197 | 'border-style', 198 | 'border-color', 199 | 'border-top-width', 200 | 'border-right-width', 201 | 'border-bottom-width', 202 | 'border-left-width', 203 | 'border-inline-start-width', 204 | 'border-inline-end-width', 205 | 'border-block-start-width', 206 | 'border-block-end-width', 207 | 'border-top-style', 208 | 'border-right-style', 209 | 'border-bottom-style', 210 | 'border-left-style', 211 | 'border-inline-start-style', 212 | 'border-inline-end-style', 213 | 'border-block-start-style', 214 | 'border-block-end-style', 215 | 'border-top-color', 216 | 'border-right-color', 217 | 'border-bottom-color', 218 | 'border-left-color', 219 | 'border-inline-start-color', 220 | 'border-inline-end-color', 221 | 'border-block-start-color', 222 | 'border-block-end-color', 223 | 'border-block', 224 | 'border-block-start', 225 | 'border-block-end', 226 | 'border-block-width', 227 | 'border-block-style', 228 | 'border-block-color', 229 | 'border-inline', 230 | 'border-inline-start', 231 | 'border-inline-end', 232 | 'border-inline-width', 233 | 'border-inline-style', 234 | 'border-inline-color', 235 | ], 236 | 'border-top': [ 237 | 'border-width', 238 | 'border-style', 239 | 'border-color', 240 | 'border-top-width', 241 | 'border-top-style', 242 | 'border-top-color', 243 | ], 244 | 'border-right': [ 245 | 'border-width', 246 | 'border-style', 247 | 'border-color', 248 | 'border-right-width', 249 | 'border-right-style', 250 | 'border-right-color', 251 | ], 252 | 'border-bottom': [ 253 | 'border-width', 254 | 'border-style', 255 | 'border-color', 256 | 'border-bottom-width', 257 | 'border-bottom-style', 258 | 'border-bottom-color', 259 | ], 260 | 'border-left': [ 261 | 'border-width', 262 | 'border-style', 263 | 'border-color', 264 | 'border-left-width', 265 | 'border-left-style', 266 | 'border-left-color', 267 | ], 268 | 'border-color': [ 269 | 'border-top-color', 270 | 'border-bottom-color', 271 | 'border-left-color', 272 | 'border-right-color', 273 | 'border-inline-start-color', 274 | 'border-inline-end-color', 275 | 'border-block-start-color', 276 | 'border-block-end-color', 277 | ], 278 | 'border-width': [ 279 | 'border-top-width', 280 | 'border-bottom-width', 281 | 'border-left-width', 282 | 'border-right-width', 283 | 'border-inline-start-width', 284 | 'border-inline-end-width', 285 | 'border-block-start-width', 286 | 'border-block-end-width', 287 | ], 288 | 'border-style': [ 289 | 'border-top-style', 290 | 'border-bottom-style', 291 | 'border-left-style', 292 | 'border-right-style', 293 | 'border-inline-start-style', 294 | 'border-inline-end-style', 295 | 'border-block-start-style', 296 | 'border-block-end-style', 297 | ], 298 | 'border-radius': [ 299 | 'border-top-right-radius', 300 | 'border-top-left-radius', 301 | 'border-bottom-right-radius', 302 | 'border-bottom-left-radius', 303 | 'border-end-end-radius', 304 | 'border-end-start-radius', 305 | 'border-start-end-radius', 306 | 'border-start-start-radius', 307 | ], 308 | 'border-block': [ 309 | 'border-block-start', 310 | 'border-block-end', 311 | 'border-block-width', 312 | 'border-width', 313 | 'border-block-style', 314 | 'border-style', 315 | 'border-block-color', 316 | 'border-color', 317 | ], 318 | 'border-block-start': [ 319 | 'border-block-start-width', 320 | 'border-width', 321 | 'border-block-start-style', 322 | 'border-style', 323 | 'border-block-start-color', 324 | 'border-color', 325 | ], 326 | 'border-block-end': [ 327 | 'border-block-end-width', 328 | 'border-width', 329 | 'border-block-end-style', 330 | 'border-style', 331 | 'border-block-end-color', 332 | 'border-color', 333 | ], 334 | 'border-inline': [ 335 | 'border-inline-start', 336 | 'border-inline-end', 337 | 'border-inline-width', 338 | 'border-width', 339 | 'border-inline-style', 340 | 'border-style', 341 | 'border-inline-color', 342 | 'border-color', 343 | ], 344 | 'border-inline-start': [ 345 | 'border-inline-start-width', 346 | 'border-width', 347 | 'border-inline-start-style', 348 | 'border-style', 349 | 'border-inline-start-color', 350 | 'border-color', 351 | ], 352 | 'border-inline-end': [ 353 | 'border-inline-end-width', 354 | 'border-width', 355 | 'border-inline-end-style', 356 | 'border-style', 357 | 'border-inline-end-color', 358 | 'border-color', 359 | ], 360 | 'border-image': [ 361 | 'border-image-source', 362 | 'border-image-slice', 363 | 'border-image-width', 364 | 'border-image-outset', 365 | 'border-image-repeat', 366 | ], 367 | 'mask': [ 368 | 'mask-image', 369 | 'mask-mode', 370 | 'mask-position', 371 | 'mask-size', 372 | 'mask-repeat', 373 | 'mask-origin', 374 | 'mask-clip', 375 | 'mask-composite', 376 | ], 377 | 'inline-size': [ 378 | 'width', 379 | 'height', 380 | ], 381 | 'block-size': [ 382 | 'width', 383 | 'height', 384 | ], 385 | 'max-inline-size': [ 386 | 'max-width', 387 | 'max-height', 388 | ], 389 | 'max-block-size': [ 390 | 'max-width', 391 | 'max-height', 392 | ], 393 | 'inset': [ 394 | 'inset-block', 395 | 'inset-block-start', 396 | 'inset-block-end', 397 | 'inset-inline', 398 | 'inset-inline-start', 399 | 'inset-inline-end', 400 | 'top', 401 | 'right', 402 | 'bottom', 403 | 'left', 404 | ], 405 | 'inset-block': [ 406 | 'inset-block-start', 407 | 'inset-block-end', 408 | 'top', 409 | 'right', 410 | 'bottom', 411 | 'left', 412 | ], 413 | 'inset-inline': [ 414 | 'inset-inline-start', 415 | 'inset-inline-end', 416 | 'top', 417 | 'right', 418 | 'bottom', 419 | 'left', 420 | ], 421 | 'outline': [ 422 | 'outline-color', 423 | 'outline-style', 424 | 'outline-width', 425 | ], 426 | 'overflow': [ 427 | 'overflow-x', 428 | 'overflow-y', 429 | ], 430 | 'place-content': [ 431 | 'align-content', 432 | 'justify-content', 433 | ], 434 | 'place-items': [ 435 | 'align-items', 436 | 'justify-items', 437 | ], 438 | 'place-self': [ 439 | 'align-self', 440 | 'justify-self', 441 | ], 442 | 'text-box': [ 443 | 'text-box-trim', 444 | 'text-box-edge', 445 | ], 446 | 'text-decoration': [ 447 | 'text-decoration-color', 448 | 'text-decoration-style', 449 | 'text-decoration-line', 450 | ], 451 | 'text-wrap': [ 452 | 'text-wrap-mode', 453 | 'text-wrap-style', 454 | ], 455 | 'transition': [ 456 | 'transition-delay', 457 | 'transition-duration', 458 | 'transition-property', 459 | 'transition-timing-function', 460 | ], 461 | 'text-emphasis': [ 462 | 'text-emphasis-style', 463 | 'text-emphasis-color', 464 | ], 465 | 'font-synthesis': [ 466 | 'font-synthesis-weight', 467 | 'font-synthesis-style', 468 | 'font-synthesis-small-caps', 469 | 'font-synthesis-position', 470 | ], 471 | '-webkit-text-stroke': [ 472 | '-webkit-text-stroke-color', 473 | '-webkit-text-stroke-width', 474 | ], 475 | }; 476 | -------------------------------------------------------------------------------- /src/orders/alphabetical.mjs: -------------------------------------------------------------------------------- 1 | export const properties = [ 2 | 'all', 3 | '-webkit-text-fill-color', 4 | '-webkit-text-stroke', 5 | '-webkit-text-stroke-color', 6 | '-webkit-text-stroke-width', 7 | 'accent-color', 8 | 'align-content', 9 | 'align-items', 10 | 'align-self', 11 | 'alignment-baseline', 12 | 'animation', 13 | 'animation-composition', 14 | 'animation-delay', 15 | 'animation-direction', 16 | 'animation-duration', 17 | 'animation-fill-mode', 18 | 'animation-iteration-count', 19 | 'animation-name', 20 | 'animation-play-state', 21 | 'animation-timing-function', 22 | 'appearance', 23 | 'ascent-override', 24 | 'aspect-ratio', 25 | 'backdrop-filter', 26 | 'backface-visibility', 27 | 'background', 28 | 'background-attachment', 29 | 'background-blend-mode', 30 | 'background-clip', 31 | 'background-color', 32 | 'background-image', 33 | 'background-origin', 34 | 'background-position', 35 | 'background-position-x', 36 | 'background-position-y', 37 | 'background-repeat', 38 | 'background-size', 39 | 'block-size', 40 | 'border', 41 | 'border-block', 42 | 'border-block-color', 43 | 'border-block-end', 44 | 'border-block-end-color', 45 | 'border-block-end-style', 46 | 'border-block-end-width', 47 | 'border-block-start', 48 | 'border-block-start-color', 49 | 'border-block-start-style', 50 | 'border-block-start-width', 51 | 'border-block-style', 52 | 'border-block-width', 53 | 'border-bottom', 54 | 'border-bottom-color', 55 | 'border-bottom-left-radius', 56 | 'border-bottom-right-radius', 57 | 'border-bottom-style', 58 | 'border-bottom-width', 59 | 'border-collapse', 60 | 'border-color', 61 | 'border-end-end-radius', 62 | 'border-end-start-radius', 63 | 'border-image', 64 | 'border-image-outset', 65 | 'border-image-repeat', 66 | 'border-image-slice', 67 | 'border-image-source', 68 | 'border-image-width', 69 | 'border-inline', 70 | 'border-inline-color', 71 | 'border-inline-end', 72 | 'border-inline-end-color', 73 | 'border-inline-end-style', 74 | 'border-inline-end-width', 75 | 'border-inline-start', 76 | 'border-inline-start-color', 77 | 'border-inline-start-style', 78 | 'border-inline-start-width', 79 | 'border-inline-style', 80 | 'border-inline-width', 81 | 'border-left', 82 | 'border-left-color', 83 | 'border-left-style', 84 | 'border-left-width', 85 | 'border-radius', 86 | 'border-right', 87 | 'border-right-color', 88 | 'border-right-style', 89 | 'border-right-width', 90 | 'border-spacing', 91 | 'border-start-end-radius', 92 | 'border-start-start-radius', 93 | 'border-style', 94 | 'border-top', 95 | 'border-top-color', 96 | 'border-top-left-radius', 97 | 'border-top-right-radius', 98 | 'border-top-style', 99 | 'border-top-width', 100 | 'border-width', 101 | 'bottom', 102 | 'box-decoration-break', 103 | 'box-shadow', 104 | 'box-sizing', 105 | 'break-after', 106 | 'break-before', 107 | 'break-inside', 108 | 'caption-side', 109 | 'caret-color', 110 | 'clear', 111 | 'clip-path', 112 | 'clip-rule', 113 | 'color', 114 | 'color-interpolation', 115 | 'color-interpolation-filters', 116 | 'color-scheme', 117 | 'column-count', 118 | 'column-fill', 119 | 'column-gap', 120 | 'column-rule', 121 | 'column-rule-color', 122 | 'column-rule-style', 123 | 'column-rule-width', 124 | 'column-span', 125 | 'column-width', 126 | 'columns', 127 | 'contain', 128 | 'contain-intrinsic-block-size', 129 | 'contain-intrinsic-height', 130 | 'contain-intrinsic-inline-size', 131 | 'contain-intrinsic-size', 132 | 'contain-intrinsic-width', 133 | 'container', 134 | 'container-name', 135 | 'container-type', 136 | 'content', 137 | 'content-visibility', 138 | 'counter-increment', 139 | 'counter-reset', 140 | 'counter-set', 141 | 'cursor', 142 | 'cx', 143 | 'cy', 144 | 'd', 145 | 'descent-override', 146 | 'direction', 147 | 'display', 148 | 'dominant-baseline', 149 | 'empty-cells', 150 | 'fill', 151 | 'fill-opacity', 152 | 'fill-rule', 153 | 'filter', 154 | 'flex', 155 | 'flex-basis', 156 | 'flex-direction', 157 | 'flex-flow', 158 | 'flex-grow', 159 | 'flex-shrink', 160 | 'flex-wrap', 161 | 'float', 162 | 'flood-color', 163 | 'flood-opacity', 164 | 'font', 165 | 'font-display', 166 | 'font-family', 167 | 'font-feature-settings', 168 | 'font-kerning', 169 | 'font-language-override', 170 | 'font-optical-sizing', 171 | 'font-palette', 172 | 'font-size', 173 | 'font-size-adjust', 174 | 'font-stretch', 175 | 'font-style', 176 | 'font-synthesis', 177 | 'font-synthesis-position', 178 | 'font-synthesis-small-caps', 179 | 'font-synthesis-style', 180 | 'font-synthesis-weight', 181 | 'font-variant', 182 | 'font-variant-alternates', 183 | 'font-variant-caps', 184 | 'font-variant-east-asian', 185 | 'font-variant-emoji', 186 | 'font-variant-ligatures', 187 | 'font-variant-numeric', 188 | 'font-variant-position', 189 | 'font-variation-settings', 190 | 'font-weight', 191 | 'forced-color-adjust', 192 | 'gap', 193 | 'grid', 194 | 'grid-area', 195 | 'grid-auto-columns', 196 | 'grid-auto-flow', 197 | 'grid-auto-rows', 198 | 'grid-column', 199 | 'grid-column-end', 200 | 'grid-column-start', 201 | 'grid-row', 202 | 'grid-row-end', 203 | 'grid-row-start', 204 | 'grid-template', 205 | 'grid-template-areas', 206 | 'grid-template-columns', 207 | 'grid-template-rows', 208 | 'hanging-punctuation', 209 | 'height', 210 | 'hyphenate-character', 211 | 'hyphenate-limit-chars', 212 | 'hyphens', 213 | 'image-orientation', 214 | 'image-rendering', 215 | 'initial-letter', 216 | 'inline-size', 217 | 'inset', 218 | 'inset-block', 219 | 'inset-block-end', 220 | 'inset-block-start', 221 | 'inset-inline', 222 | 'inset-inline-end', 223 | 'inset-inline-start', 224 | 'isolation', 225 | 'justify-content', 226 | 'justify-items', 227 | 'justify-self', 228 | 'left', 229 | 'letter-spacing', 230 | 'lighting-color', 231 | 'line-break', 232 | 'line-clamp', 233 | 'line-gap-override', 234 | 'line-height', 235 | 'list-style', 236 | 'list-style-image', 237 | 'list-style-position', 238 | 'list-style-type', 239 | 'margin', 240 | 'margin-block', 241 | 'margin-block-end', 242 | 'margin-block-start', 243 | 'margin-bottom', 244 | 'margin-inline', 245 | 'margin-inline-end', 246 | 'margin-inline-start', 247 | 'margin-left', 248 | 'margin-right', 249 | 'margin-top', 250 | 'marker', 251 | 'marker-end', 252 | 'marker-mid', 253 | 'marker-start', 254 | 'mask', 255 | 'mask-border', 256 | 'mask-border-outset', 257 | 'mask-border-repeat', 258 | 'mask-border-slice', 259 | 'mask-border-source', 260 | 'mask-border-width', 261 | 'mask-clip', 262 | 'mask-composite', 263 | 'mask-image', 264 | 'mask-mode', 265 | 'mask-origin', 266 | 'mask-position', 267 | 'mask-repeat', 268 | 'mask-size', 269 | 'mask-type', 270 | 'math-depth', 271 | 'math-style', 272 | 'max-block-size', 273 | 'max-height', 274 | 'max-inline-size', 275 | 'max-width', 276 | 'min-block-size', 277 | 'min-height', 278 | 'min-inline-size', 279 | 'min-width', 280 | 'mix-blend-mode', 281 | 'object-fit', 282 | 'object-position', 283 | 'offset', 284 | 'offset-anchor', 285 | 'offset-distance', 286 | 'offset-path', 287 | 'offset-position', 288 | 'offset-rotate', 289 | 'opacity', 290 | 'order', 291 | 'orphans', 292 | 'outline', 293 | 'outline-color', 294 | 'outline-offset', 295 | 'outline-style', 296 | 'outline-width', 297 | 'overflow', 298 | 'overflow-anchor', 299 | 'overflow-block', 300 | 'overflow-clip-margin', 301 | 'overflow-inline', 302 | 'overflow-wrap', 303 | 'overflow-x', 304 | 'overflow-y', 305 | 'overscroll-behavior', 306 | 'overscroll-behavior-block', 307 | 'overscroll-behavior-inline', 308 | 'overscroll-behavior-x', 309 | 'overscroll-behavior-y', 310 | 'padding', 311 | 'padding-block', 312 | 'padding-block-end', 313 | 'padding-block-start', 314 | 'padding-bottom', 315 | 'padding-inline', 316 | 'padding-inline-end', 317 | 'padding-inline-start', 318 | 'padding-left', 319 | 'padding-right', 320 | 'padding-top', 321 | 'page', 322 | 'paint-order', 323 | 'perspective', 324 | 'perspective-origin', 325 | 'place-content', 326 | 'place-items', 327 | 'place-self', 328 | 'pointer-events', 329 | 'position', 330 | 'print-color-adjust', 331 | 'quotes', 332 | 'r', 333 | 'resize', 334 | 'right', 335 | 'rotate', 336 | 'row-gap', 337 | 'ruby-align', 338 | 'ruby-position', 339 | 'rx', 340 | 'ry', 341 | 'scale', 342 | 'scroll-behavior', 343 | 'scroll-margin', 344 | 'scroll-margin-block', 345 | 'scroll-margin-block-end', 346 | 'scroll-margin-block-start', 347 | 'scroll-margin-bottom', 348 | 'scroll-margin-inline', 349 | 'scroll-margin-inline-end', 350 | 'scroll-margin-inline-start', 351 | 'scroll-margin-left', 352 | 'scroll-margin-right', 353 | 'scroll-margin-top', 354 | 'scroll-padding', 355 | 'scroll-padding-block', 356 | 'scroll-padding-block-end', 357 | 'scroll-padding-block-start', 358 | 'scroll-padding-bottom', 359 | 'scroll-padding-inline', 360 | 'scroll-padding-inline-end', 361 | 'scroll-padding-inline-start', 362 | 'scroll-padding-left', 363 | 'scroll-padding-right', 364 | 'scroll-padding-top', 365 | 'scroll-snap-align', 366 | 'scroll-snap-stop', 367 | 'scroll-snap-type', 368 | 'scrollbar-color', 369 | 'scrollbar-gutter', 370 | 'scrollbar-width', 371 | 'shape-image-threshold', 372 | 'shape-margin', 373 | 'shape-outside', 374 | 'shape-rendering', 375 | 'size-adjust', 376 | 'src', 377 | 'stop-color', 378 | 'stop-opacity', 379 | 'stroke', 380 | 'stroke-dasharray', 381 | 'stroke-dashoffset', 382 | 'stroke-linecap', 383 | 'stroke-linejoin', 384 | 'stroke-miterlimit', 385 | 'stroke-opacity', 386 | 'stroke-width', 387 | 'tab-size', 388 | 'table-layout', 389 | 'text-align', 390 | 'text-align-last', 391 | 'text-anchor', 392 | 'text-box', 393 | 'text-box-edge', 394 | 'text-box-trim', 395 | 'text-combine-upright', 396 | 'text-decoration', 397 | 'text-decoration-color', 398 | 'text-decoration-line', 399 | 'text-decoration-skip-ink', 400 | 'text-decoration-style', 401 | 'text-decoration-thickness', 402 | 'text-emphasis', 403 | 'text-emphasis-color', 404 | 'text-emphasis-position', 405 | 'text-emphasis-style', 406 | 'text-indent', 407 | 'text-justify', 408 | 'text-orientation', 409 | 'text-overflow', 410 | 'text-rendering', 411 | 'text-shadow', 412 | 'text-transform', 413 | 'text-underline-offset', 414 | 'text-underline-position', 415 | 'text-wrap', 416 | 'text-wrap-mode', 417 | 'text-wrap-style', 418 | 'top', 419 | 'touch-action', 420 | 'transform', 421 | 'transform-box', 422 | 'transform-origin', 423 | 'transform-style', 424 | 'transition', 425 | 'transition-behavior', 426 | 'transition-delay', 427 | 'transition-duration', 428 | 'transition-property', 429 | 'transition-timing-function', 430 | 'translate', 431 | 'unicode-bidi', 432 | 'unicode-range', 433 | 'user-select', 434 | 'vector-effect', 435 | 'vertical-align', 436 | 'view-transition-name', 437 | 'visibility', 438 | 'white-space', 439 | 'white-space-collapse', 440 | 'widows', 441 | 'width', 442 | 'will-change', 443 | 'word-break', 444 | 'word-spacing', 445 | 'writing-mode', 446 | 'x', 447 | 'y', 448 | 'z-index', 449 | 'zoom', 450 | ]; 451 | -------------------------------------------------------------------------------- /src/orders/concentric-css.mjs: -------------------------------------------------------------------------------- 1 | export const properties = [ 2 | 'all', 3 | 'display', 4 | 'position', 5 | 'top', 6 | 'right', 7 | 'bottom', 8 | 'left', 9 | 'offset', 10 | 'offset-anchor', 11 | 'offset-distance', 12 | 'offset-path', 13 | 'offset-position', 14 | 'offset-rotate', 15 | 'grid', 16 | 'grid-template-rows', 17 | 'grid-template-columns', 18 | 'grid-template-areas', 19 | 'grid-auto-rows', 20 | 'grid-auto-columns', 21 | 'grid-auto-flow', 22 | 'column-gap', 23 | 'row-gap', 24 | 'grid-area', 25 | 'grid-row', 26 | 'grid-row-start', 27 | 'grid-row-end', 28 | 'grid-column', 29 | 'grid-column-start', 30 | 'grid-column-end', 31 | 'grid-template', 32 | 'flex', 33 | 'flex-grow', 34 | 'flex-shrink', 35 | 'flex-basis', 36 | 'flex-direction', 37 | 'flex-flow', 38 | 'flex-wrap', 39 | 'box-decoration-break', 40 | 'place-content', 41 | 'align-content', 42 | 'justify-content', 43 | 'place-items', 44 | 'align-items', 45 | 'justify-items', 46 | 'place-self', 47 | 'align-self', 48 | 'justify-self', 49 | 'vertical-align', 50 | 'order', 51 | 'float', 52 | 'clear', 53 | 'shape-margin', 54 | 'shape-outside', 55 | 'shape-rendering', 56 | 'shape-image-threshold', 57 | 'orphans', 58 | 'gap', 59 | 'columns', 60 | 'column-fill', 61 | 'column-rule', 62 | 'column-rule-width', 63 | 'column-rule-style', 64 | 'column-rule-color', 65 | 'column-width', 66 | 'column-span', 67 | 'column-count', 68 | 'break-before', 69 | 'break-after', 70 | 'break-inside', 71 | 'page', 72 | 'transform', 73 | 'transform-box', 74 | 'transform-origin', 75 | 'transform-style', 76 | 'vector-effect', 77 | 'translate', 78 | 'rotate', 79 | 'scale', 80 | 'zoom', 81 | 82 | 'perspective', 83 | 'perspective-origin', 84 | 'appearance', 85 | 'visibility', 86 | 'content-visibility', 87 | 'opacity', 88 | 'z-index', 89 | 'paint-order', 90 | 'mix-blend-mode', 91 | 'backface-visibility', 92 | 'backdrop-filter', 93 | 'clip-path', 94 | 'clip-rule', 95 | 'mask', 96 | 'mask-border', 97 | 'mask-border-outset', 98 | 'mask-border-repeat', 99 | 'mask-border-slice', 100 | 'mask-border-source', 101 | 'mask-border-width', 102 | 'mask-image', 103 | 'mask-mode', 104 | 'mask-position', 105 | 'mask-size', 106 | 'mask-repeat', 107 | 'mask-origin', 108 | 'mask-clip', 109 | 'mask-composite', 110 | 'mask-type', 111 | 'filter', 112 | 'animation', 113 | 'animation-composition', 114 | 'animation-duration', 115 | 'animation-timing-function', 116 | 'animation-delay', 117 | 'animation-iteration-count', 118 | 'animation-direction', 119 | 'animation-fill-mode', 120 | 'animation-play-state', 121 | 'animation-name', 122 | 'view-transition-name', 123 | 'transition', 124 | 'transition-behavior', 125 | 'transition-delay', 126 | 'transition-duration', 127 | 'transition-property', 128 | 'transition-timing-function', 129 | 'will-change', 130 | 'counter-increment', 131 | 'counter-reset', 132 | 'counter-set', 133 | 'cursor', 134 | 'fill', 135 | 'fill-opacity', 136 | 'fill-rule', 137 | 'flood-color', 138 | 'flood-opacity', 139 | 'lighting-color', 140 | 'marker', 141 | 'marker-end', 142 | 'marker-mid', 143 | 'marker-start', 144 | 'x', 145 | 'y', 146 | 'r', 147 | 'rx', 148 | 'ry', 149 | 'stop-color', 150 | 'stop-opacity', 151 | 'stroke', 152 | 'stroke-dasharray', 153 | 'stroke-dashoffset', 154 | 'stroke-linecap', 155 | 'stroke-linejoin', 156 | 'stroke-miterlimit', 157 | 'stroke-opacity', 158 | 'stroke-width', 159 | 160 | 'box-sizing', 161 | 'contain', 162 | 'contain-intrinsic-size', 163 | 'contain-intrinsic-width', 164 | 'contain-intrinsic-height', 165 | 'contain-intrinsic-inline-size', 166 | 'contain-intrinsic-block-size', 167 | 'container', 168 | 'container-name', 169 | 'container-type', 170 | 'cx', 171 | 'cy', 172 | 'd', 173 | 'margin', 174 | 'margin-top', 175 | 'margin-right', 176 | 'margin-bottom', 177 | 'margin-left', 178 | 'margin-inline', 179 | 'margin-inline-start', 180 | 'margin-inline-end', 181 | 'margin-block', 182 | 'margin-block-start', 183 | 'margin-block-end', 184 | 'inset', 185 | 'inset-block', 186 | 'inset-block-end', 187 | 'inset-block-start', 188 | 'inset-inline', 189 | 'inset-inline-end', 190 | 'inset-inline-start', 191 | 'outline', 192 | 'outline-color', 193 | 'outline-style', 194 | 'outline-width', 195 | 'outline-offset', 196 | 'box-shadow', 197 | 'border', 198 | 'border-top', 199 | 'border-right', 200 | 'border-bottom', 201 | 'border-left', 202 | 'border-width', 203 | 'border-top-width', 204 | 'border-right-width', 205 | 'border-bottom-width', 206 | 'border-left-width', 207 | 'border-style', 208 | 'border-top-style', 209 | 'border-right-style', 210 | 'border-bottom-style', 211 | 'border-left-style', 212 | 'border-color', 213 | 'border-top-color', 214 | 'border-right-color', 215 | 'border-bottom-color', 216 | 'border-left-color', 217 | 'border-radius', 218 | 'border-top-right-radius', 219 | 'border-top-left-radius', 220 | 'border-bottom-right-radius', 221 | 'border-bottom-left-radius', 222 | 'border-inline', 223 | 'border-inline-width', 224 | 'border-inline-style', 225 | 'border-inline-color', 226 | 'border-inline-start', 227 | 'border-inline-start-width', 228 | 'border-inline-start-style', 229 | 'border-inline-start-color', 230 | 'border-inline-end', 231 | 'border-inline-end-width', 232 | 'border-inline-end-style', 233 | 'border-inline-end-color', 234 | 'border-block', 235 | 'border-block-width', 236 | 'border-block-style', 237 | 'border-block-color', 238 | 'border-block-start', 239 | 'border-block-start-width', 240 | 'border-block-start-style', 241 | 'border-block-start-color', 242 | 'border-block-end', 243 | 'border-block-end-width', 244 | 'border-block-end-style', 245 | 'border-block-end-color', 246 | 'border-image', 247 | 'border-image-source', 248 | 'border-image-slice', 249 | 'border-image-width', 250 | 'border-image-outset', 251 | 'border-image-repeat', 252 | 'border-collapse', 253 | 'border-spacing', 254 | 'border-start-start-radius', 255 | 'border-start-end-radius', 256 | 'border-end-start-radius', 257 | 'border-end-end-radius', 258 | 'background', 259 | 'background-image', 260 | 'background-position', 261 | 'background-size', 262 | 'background-repeat', 263 | 'background-origin', 264 | 'background-clip', 265 | 'background-attachment', 266 | 'background-color', 267 | 'background-blend-mode', 268 | 'background-position-x', 269 | 'background-position-y', 270 | 'isolation', 271 | 'padding', 272 | 'padding-top', 273 | 'padding-right', 274 | 'padding-bottom', 275 | 'padding-left', 276 | 'padding-inline', 277 | 'padding-inline-start', 278 | 'padding-inline-end', 279 | 'padding-block', 280 | 'padding-block-start', 281 | 'padding-block-end', 282 | 'image-orientation', 283 | 'image-rendering', 284 | 285 | 'aspect-ratio', 286 | 'width', 287 | 'min-width', 288 | 'max-width', 289 | 'height', 290 | 'min-height', 291 | 'max-height', 292 | 'line-clamp', 293 | '-webkit-text-fill-color', 294 | '-webkit-text-stroke', 295 | '-webkit-text-stroke-width', 296 | '-webkit-text-stroke-color', 297 | 'inline-size', 298 | 'min-inline-size', 299 | 'max-inline-size', 300 | 'block-size', 301 | 'min-block-size', 302 | 'max-block-size', 303 | 'table-layout', 304 | 'caption-side', 305 | 'empty-cells', 306 | 'overflow', 307 | 'overflow-anchor', 308 | 'overflow-block', 309 | 'overflow-clip-margin', 310 | 'overflow-inline', 311 | 'overflow-x', 312 | 'overflow-y', 313 | 'overscroll-behavior', 314 | 'overscroll-behavior-block', 315 | 'overscroll-behavior-inline', 316 | 'overscroll-behavior-x', 317 | 'overscroll-behavior-y', 318 | 'resize', 319 | 'object-fit', 320 | 'object-position', 321 | 'scroll-behavior', 322 | 'scroll-margin', 323 | 'scroll-margin-block', 324 | 'scroll-margin-block-end', 325 | 'scroll-margin-block-start', 326 | 'scroll-margin-bottom', 327 | 'scroll-margin-inline', 328 | 'scroll-margin-inline-end', 329 | 'scroll-margin-inline-start', 330 | 'scroll-margin-left', 331 | 'scroll-margin-right', 332 | 'scroll-margin-top', 333 | 'scroll-padding', 334 | 'scroll-padding-block', 335 | 'scroll-padding-block-end', 336 | 'scroll-padding-block-start', 337 | 'scroll-padding-bottom', 338 | 'scroll-padding-inline', 339 | 'scroll-padding-inline-end', 340 | 'scroll-padding-inline-start', 341 | 'scroll-padding-left', 342 | 'scroll-padding-right', 343 | 'scroll-padding-top', 344 | 'scroll-snap-align', 345 | 'scroll-snap-stop', 346 | 'scroll-snap-type', 347 | 'scrollbar-color', 348 | 'scrollbar-gutter', 349 | 'scrollbar-width', 350 | 'touch-action', 351 | 'pointer-events', 352 | 353 | 'content', 354 | 'quotes', 355 | 'hanging-punctuation', 356 | 'color', 357 | 'color-interpolation', 358 | 'color-interpolation-filters', 359 | 'accent-color', 360 | 'print-color-adjust', 361 | 'forced-color-adjust', 362 | 'color-scheme', 363 | 'caret-color', 364 | 'font', 365 | 'font-style', 366 | 'font-variant', 367 | 'font-weight', 368 | 'font-stretch', 369 | 'font-size', 370 | 'size-adjust', 371 | 'line-height', 372 | 'src', 373 | 'font-family', 374 | 'font-display', 375 | 'font-kerning', 376 | 'font-language-override', 377 | 'font-optical-sizing', 378 | 'font-palette', 379 | 'font-size-adjust', 380 | 'font-synthesis', 381 | 'font-synthesis-weight', 382 | 'font-synthesis-style', 383 | 'font-synthesis-small-caps', 384 | 'font-synthesis-position', 385 | 'font-variant-alternates', 386 | 'font-variant-caps', 387 | 'font-variant-east-asian', 388 | 'font-variant-emoji', 389 | 'font-variant-ligatures', 390 | 'font-variant-numeric', 391 | 'font-variant-position', 392 | 'font-variation-settings', 393 | 'font-feature-settings', 394 | 'alignment-baseline', 395 | 'dominant-baseline', 396 | 'text-anchor', 397 | 'text-box', 398 | 'text-box-trim', 399 | 'text-box-edge', 400 | 'ascent-override', 401 | 'descent-override', 402 | 'line-gap-override', 403 | 'hyphens', 404 | 'hyphenate-character', 405 | 'hyphenate-limit-chars', 406 | 'initial-letter', 407 | 'letter-spacing', 408 | 'line-break', 409 | 'list-style', 410 | 'list-style-type', 411 | 'list-style-image', 412 | 'list-style-position', 413 | 'writing-mode', 414 | 'direction', 415 | 'unicode-bidi', 416 | 'unicode-range', 417 | 'user-select', 418 | 'ruby-align', 419 | 'ruby-position', 420 | 'math-depth', 421 | 'math-style', 422 | 'text-combine-upright', 423 | 'text-align', 424 | 'text-align-last', 425 | 'text-decoration', 426 | 'text-decoration-line', 427 | 'text-decoration-style', 428 | 'text-decoration-color', 429 | 'text-decoration-thickness', 430 | 'text-decoration-skip-ink', 431 | 'text-emphasis', 432 | 'text-emphasis-style', 433 | 'text-emphasis-color', 434 | 'text-emphasis-position', 435 | 'text-indent', 436 | 'text-justify', 437 | 'text-underline-position', 438 | 'text-underline-offset', 439 | 'text-orientation', 440 | 'text-overflow', 441 | 'text-rendering', 442 | 'text-shadow', 443 | 'text-transform', 444 | 'text-wrap', 445 | 'text-wrap-mode', 446 | 'text-wrap-style', 447 | 'white-space', 448 | 'white-space-collapse', 449 | 'word-break', 450 | 'word-spacing', 451 | 'overflow-wrap', 452 | 'tab-size', 453 | 'widows', 454 | ]; 455 | -------------------------------------------------------------------------------- /src/orders/smacss.mjs: -------------------------------------------------------------------------------- 1 | export const properties = [ 2 | 'all', 3 | 'box-sizing', 4 | 'contain', 5 | 'contain-intrinsic-size', 6 | 'contain-intrinsic-width', 7 | 'contain-intrinsic-height', 8 | 'contain-intrinsic-inline-size', 9 | 'contain-intrinsic-block-size', 10 | 'container', 11 | 'container-name', 12 | 'container-type', 13 | 'cx', 14 | 'cy', 15 | 'd', 16 | 'display', 17 | 'appearance', 18 | 'visibility', 19 | 'content-visibility', 20 | 'z-index', 21 | 'paint-order', 22 | 'position', 23 | 'top', 24 | 'right', 25 | 'bottom', 26 | 'left', 27 | 'offset', 28 | 'offset-anchor', 29 | 'offset-distance', 30 | 'offset-path', 31 | 'offset-position', 32 | 'offset-rotate', 33 | 34 | 'grid', 35 | 'grid-template-rows', 36 | 'grid-template-columns', 37 | 'grid-template-areas', 38 | 'grid-auto-rows', 39 | 'grid-auto-columns', 40 | 'grid-auto-flow', 41 | 'column-gap', 42 | 'row-gap', 43 | 'grid-area', 44 | 'grid-row', 45 | 'grid-row-start', 46 | 'grid-row-end', 47 | 'grid-column', 48 | 'grid-column-start', 49 | 'grid-column-end', 50 | 'grid-template', 51 | 'flex', 52 | 'flex-grow', 53 | 'flex-shrink', 54 | 'flex-basis', 55 | 'flex-direction', 56 | 'flex-flow', 57 | 'flex-wrap', 58 | 'box-decoration-break', 59 | 'place-content', 60 | 'place-items', 61 | 'place-self', 62 | 'align-content', 63 | 'align-items', 64 | 'align-self', 65 | 'justify-content', 66 | 'justify-items', 67 | 'justify-self', 68 | 'order', 69 | 'aspect-ratio', 70 | 'width', 71 | 'min-width', 72 | 'max-width', 73 | 'height', 74 | 'min-height', 75 | 'max-height', 76 | 'line-clamp', 77 | '-webkit-text-fill-color', 78 | '-webkit-text-stroke', 79 | '-webkit-text-stroke-width', 80 | '-webkit-text-stroke-color', 81 | 'inline-size', 82 | 'min-inline-size', 83 | 'max-inline-size', 84 | 'block-size', 85 | 'min-block-size', 86 | 'max-block-size', 87 | 'margin', 88 | 'margin-top', 89 | 'margin-right', 90 | 'margin-bottom', 91 | 'margin-left', 92 | 'margin-inline', 93 | 'margin-inline-start', 94 | 'margin-inline-end', 95 | 'margin-block', 96 | 'margin-block-start', 97 | 'margin-block-end', 98 | 'inset', 99 | 'inset-block', 100 | 'inset-block-end', 101 | 'inset-block-start', 102 | 'inset-inline', 103 | 'inset-inline-end', 104 | 'inset-inline-start', 105 | 'padding', 106 | 'padding-top', 107 | 'padding-right', 108 | 'padding-bottom', 109 | 'padding-left', 110 | 'padding-inline', 111 | 'padding-inline-start', 112 | 'padding-inline-end', 113 | 'padding-block', 114 | 'padding-block-start', 115 | 'padding-block-end', 116 | 'float', 117 | 'clear', 118 | 'overflow', 119 | 'overflow-anchor', 120 | 'overflow-block', 121 | 'overflow-clip-margin', 122 | 'overflow-inline', 123 | 'overflow-x', 124 | 'overflow-y', 125 | 'overscroll-behavior', 126 | 'overscroll-behavior-block', 127 | 'overscroll-behavior-inline', 128 | 'overscroll-behavior-x', 129 | 'overscroll-behavior-y', 130 | 'orphans', 131 | 'gap', 132 | 'columns', 133 | 'column-fill', 134 | 'column-rule', 135 | 'column-rule-color', 136 | 'column-rule-style', 137 | 'column-rule-width', 138 | 'column-span', 139 | 'column-count', 140 | 'column-width', 141 | 'object-fit', 142 | 'object-position', 143 | 'transform', 144 | 'transform-box', 145 | 'transform-origin', 146 | 'transform-style', 147 | 'vector-effect', 148 | 'translate', 149 | 'rotate', 150 | 'scale', 151 | 'zoom', 152 | 153 | 'border', 154 | 'border-top', 155 | 'border-right', 156 | 'border-bottom', 157 | 'border-left', 158 | 'border-width', 159 | 'border-top-width', 160 | 'border-right-width', 161 | 'border-bottom-width', 162 | 'border-left-width', 163 | 'border-style', 164 | 'border-top-style', 165 | 'border-right-style', 166 | 'border-bottom-style', 167 | 'border-left-style', 168 | 'border-radius', 169 | 'border-top-right-radius', 170 | 'border-top-left-radius', 171 | 'border-bottom-right-radius', 172 | 'border-bottom-left-radius', 173 | 'border-inline', 174 | 'border-inline-color', 175 | 'border-inline-style', 176 | 'border-inline-width', 177 | 'border-inline-start', 178 | 'border-inline-start-color', 179 | 'border-inline-start-style', 180 | 'border-inline-start-width', 181 | 'border-inline-end', 182 | 'border-inline-end-color', 183 | 'border-inline-end-style', 184 | 'border-inline-end-width', 185 | 'border-block', 186 | 'border-block-color', 187 | 'border-block-style', 188 | 'border-block-width', 189 | 'border-block-start', 190 | 'border-block-start-color', 191 | 'border-block-start-style', 192 | 'border-block-start-width', 193 | 'border-block-end', 194 | 'border-block-end-color', 195 | 'border-block-end-style', 196 | 'border-block-end-width', 197 | 'border-color', 198 | 'border-image', 199 | 'border-image-outset', 200 | 'border-image-repeat', 201 | 'border-image-slice', 202 | 'border-image-source', 203 | 'border-image-width', 204 | 'border-top-color', 205 | 'border-right-color', 206 | 'border-bottom-color', 207 | 'border-left-color', 208 | 'border-collapse', 209 | 'border-spacing', 210 | 'border-start-start-radius', 211 | 'border-start-end-radius', 212 | 'border-end-start-radius', 213 | 'border-end-end-radius', 214 | 'outline', 215 | 'outline-color', 216 | 'outline-style', 217 | 'outline-width', 218 | 'outline-offset', 219 | 220 | 'backdrop-filter', 221 | 'backface-visibility', 222 | 'background', 223 | 'background-image', 224 | 'background-position', 225 | 'background-size', 226 | 'background-repeat', 227 | 'background-origin', 228 | 'background-clip', 229 | 'background-attachment', 230 | 'background-color', 231 | 'background-blend-mode', 232 | 'background-position-x', 233 | 'background-position-y', 234 | 'box-shadow', 235 | 'isolation', 236 | 'fill', 237 | 'fill-opacity', 238 | 'fill-rule', 239 | 'flood-color', 240 | 'flood-opacity', 241 | 'lighting-color', 242 | 'marker', 243 | 'marker-end', 244 | 'marker-mid', 245 | 'marker-start', 246 | 'x', 247 | 'y', 248 | 'r', 249 | 'rx', 250 | 'ry', 251 | 'stop-color', 252 | 'stop-opacity', 253 | 'stroke', 254 | 'stroke-dasharray', 255 | 'stroke-dashoffset', 256 | 'stroke-linecap', 257 | 'stroke-linejoin', 258 | 'stroke-miterlimit', 259 | 'stroke-opacity', 260 | 'stroke-width', 261 | 262 | 'content', 263 | 'quotes', 264 | 'hanging-punctuation', 265 | 'color', 266 | 'color-interpolation', 267 | 'color-interpolation-filters', 268 | 'accent-color', 269 | 'print-color-adjust', 270 | 'forced-color-adjust', 271 | 'color-scheme', 272 | 'caret-color', 273 | 'font', 274 | 'font-style', 275 | 'font-variant', 276 | 'font-weight', 277 | 'src', 278 | 'font-stretch', 279 | 'font-size', 280 | 'size-adjust', 281 | 'line-height', 282 | 'font-family', 283 | 'font-display', 284 | 'font-kerning', 285 | 'font-language-override', 286 | 'font-optical-sizing', 287 | 'font-palette', 288 | 'font-size-adjust', 289 | 'font-synthesis', 290 | 'font-synthesis-weight', 291 | 'font-synthesis-style', 292 | 'font-synthesis-small-caps', 293 | 'font-synthesis-position', 294 | 'font-variant-alternates', 295 | 'font-variant-caps', 296 | 'font-variant-east-asian', 297 | 'font-variant-emoji', 298 | 'font-variant-ligatures', 299 | 'font-variant-numeric', 300 | 'font-variant-position', 301 | 'font-variation-settings', 302 | 'font-feature-settings', 303 | 'alignment-baseline', 304 | 'dominant-baseline', 305 | 'text-anchor', 306 | 'text-box', 307 | 'text-box-trim', 308 | 'text-box-edge', 309 | 'ascent-override', 310 | 'descent-override', 311 | 'line-gap-override', 312 | 'hyphens', 313 | 'hyphenate-character', 314 | 'hyphenate-limit-chars', 315 | 'initial-letter', 316 | 'letter-spacing', 317 | 'line-break', 318 | 'list-style', 319 | 'list-style-image', 320 | 'list-style-position', 321 | 'list-style-type', 322 | 'direction', 323 | 'text-align', 324 | 'text-align-last', 325 | 'text-decoration', 326 | 'text-decoration-line', 327 | 'text-decoration-style', 328 | 'text-decoration-color', 329 | 'text-decoration-thickness', 330 | 'text-decoration-skip-ink', 331 | 'text-emphasis', 332 | 'text-emphasis-style', 333 | 'text-emphasis-color', 334 | 'text-emphasis-position', 335 | 'text-indent', 336 | 'text-justify', 337 | 'text-underline-position', 338 | 'text-underline-offset', 339 | 'text-orientation', 340 | 'text-overflow', 341 | 'text-rendering', 342 | 'text-shadow', 343 | 'text-transform', 344 | 'text-wrap', 345 | 'text-wrap-mode', 346 | 'text-wrap-style', 347 | 'vertical-align', 348 | 'white-space', 349 | 'white-space-collapse', 350 | 'word-break', 351 | 'word-spacing', 352 | 'overflow-wrap', 353 | 354 | 'animation', 355 | 'animation-composition', 356 | 'animation-duration', 357 | 'animation-timing-function', 358 | 'animation-delay', 359 | 'animation-iteration-count', 360 | 'animation-direction', 361 | 'animation-fill-mode', 362 | 'animation-play-state', 363 | 'animation-name', 364 | 'view-transition-name', 365 | 'mix-blend-mode', 366 | 'break-before', 367 | 'break-after', 368 | 'break-inside', 369 | 'page', 370 | 'caption-side', 371 | 'clip-path', 372 | 'clip-rule', 373 | 'counter-increment', 374 | 'counter-reset', 375 | 'counter-set', 376 | 'cursor', 377 | 'empty-cells', 378 | 'filter', 379 | 'image-orientation', 380 | 'image-rendering', 381 | 'mask', 382 | 'mask-border', 383 | 'mask-border-outset', 384 | 'mask-border-repeat', 385 | 'mask-border-slice', 386 | 'mask-border-source', 387 | 'mask-border-width', 388 | 'mask-clip', 389 | 'mask-composite', 390 | 'mask-image', 391 | 'mask-mode', 392 | 'mask-origin', 393 | 'mask-position', 394 | 'mask-repeat', 395 | 'mask-size', 396 | 'mask-type', 397 | 'opacity', 398 | 'perspective', 399 | 'perspective-origin', 400 | 'pointer-events', 401 | 'resize', 402 | 'scroll-behavior', 403 | 'scroll-margin', 404 | 'scroll-margin-block', 405 | 'scroll-margin-block-end', 406 | 'scroll-margin-block-start', 407 | 'scroll-margin-bottom', 408 | 'scroll-margin-inline', 409 | 'scroll-margin-inline-end', 410 | 'scroll-margin-inline-start', 411 | 'scroll-margin-left', 412 | 'scroll-margin-right', 413 | 'scroll-margin-top', 414 | 'scroll-padding', 415 | 'scroll-padding-block', 416 | 'scroll-padding-block-end', 417 | 'scroll-padding-block-start', 418 | 'scroll-padding-bottom', 419 | 'scroll-padding-inline', 420 | 'scroll-padding-inline-end', 421 | 'scroll-padding-inline-start', 422 | 'scroll-padding-left', 423 | 'scroll-padding-right', 424 | 'scroll-padding-top', 425 | 'scroll-snap-align', 426 | 'scroll-snap-stop', 427 | 'scroll-snap-type', 428 | 'scrollbar-color', 429 | 'scrollbar-gutter', 430 | 'scrollbar-width', 431 | 'shape-image-threshold', 432 | 'shape-margin', 433 | 'shape-outside', 434 | 'shape-rendering', 435 | 'tab-size', 436 | 'table-layout', 437 | 'ruby-align', 438 | 'ruby-position', 439 | 'math-depth', 440 | 'math-style', 441 | 'text-combine-upright', 442 | 'touch-action', 443 | 'transition', 444 | 'transition-behavior', 445 | 'transition-delay', 446 | 'transition-duration', 447 | 'transition-property', 448 | 'transition-timing-function', 449 | 'will-change', 450 | 'unicode-bidi', 451 | 'unicode-range', 452 | 'user-select', 453 | 'widows', 454 | 'writing-mode', 455 | ]; 456 | -------------------------------------------------------------------------------- /src/property-scraper.mjs: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs/promises'; 2 | 3 | const { css } = await fs.readFile(new URL(import.meta.resolve('@mdn/browser-compat-data'))) 4 | .then(JSON.parse); 5 | 6 | const isStandardProperty = (name) => (property) => Boolean( 7 | property.__compat?.status.standard_track === true && 8 | property.__compat?.status.experimental === false && 9 | property.__compat?.status.deprecated === false && 10 | ( 11 | property.__compat?.mdn_url && 12 | !property.__compat?.mdn_url.includes('Guide') && 13 | [...property.__compat.mdn_url.split('/')].pop() === name 14 | ), 15 | ); 16 | 17 | const cssProperties = Object.entries({ ...css.properties, ...css['at-rules']['font-face'] }) 18 | .filter(([name, data]) => 19 | isStandardProperty (name) (data) || 20 | Object.values(data).some(isStandardProperty(name)), 21 | ) 22 | .map(([name]) => name) 23 | .sort((nameA, nameB) => ( 24 | nameA === 'all' 25 | ? -1 26 | : nameA.localeCompare(nameB) 27 | )); 28 | 29 | fs.writeFile( 30 | 'src/orders/alphabetical.mjs', 31 | `export const properties = ${JSON.stringify(cssProperties, null, 2)}\n`, 32 | ); 33 | -------------------------------------------------------------------------------- /src/property-scraper.test.mjs: -------------------------------------------------------------------------------- 1 | import { promises as fs } from 'node:fs'; 2 | import { test } from 'uvu'; 3 | import * as assert from 'uvu/assert'; 4 | import { shorthandData } from './core/shorthand-data.mjs'; 5 | import { properties as sourceProperties } from './orders/alphabetical.mjs'; 6 | 7 | const cssOrdersDir = './src/orders/'; 8 | 9 | test('CSS properties are up-to-date.', () => ( 10 | fs.readdir(cssOrdersDir).then(async (files) => { 11 | const customOrderFiles = await Promise.all(files 12 | .filter((fileName) => fileName !== 'alphabetical.mjs') 13 | // Pair filenames and amount of properties from each CSS order file 14 | .map(async (fileName) => ({ 15 | fileName: fileName, 16 | properties: (await import(`../${cssOrdersDir}/${fileName}`)).properties, 17 | }))); 18 | 19 | return customOrderFiles.forEach((customOrderFile) => { 20 | assert.equal( 21 | customOrderFile.properties.sort(), 22 | sourceProperties.sort(), 23 | `${customOrderFile.fileName} has the same properties as source.` 24 | ); 25 | }); 26 | }) 27 | )); 28 | 29 | test('Shorthand data matches known CSS properties', () => { 30 | Object.keys(shorthandData).map((property) => 31 | assert.is(sourceProperties.includes(property), true, `${property} not found.`) 32 | ); 33 | 34 | Object.values(shorthandData).flat().map((property) => ( 35 | assert.is(sourceProperties.includes(property), true, `${property} not found.`) 36 | )); 37 | }); 38 | 39 | test.run(); 40 | --------------------------------------------------------------------------------