pax_global_header00006660000000000000000000000064150424125710014513gustar00rootroot0000000000000052 comment=6ba62e45254d2c90d2b0888103313d75beee1964 sugarss-5.0.1/000077500000000000000000000000001504241257100132055ustar00rootroot00000000000000sugarss-5.0.1/.editorconfig000066400000000000000000000002231504241257100156570ustar00rootroot00000000000000root = true [*] indent_style = space indent_size = 2 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true sugarss-5.0.1/.github/000077500000000000000000000000001504241257100145455ustar00rootroot00000000000000sugarss-5.0.1/.github/FUNDING.yml000066400000000000000000000000441504241257100163600ustar00rootroot00000000000000open_collective: postcss github: ai sugarss-5.0.1/.github/workflows/000077500000000000000000000000001504241257100166025ustar00rootroot00000000000000sugarss-5.0.1/.github/workflows/release.yml000066400000000000000000000027071504241257100207530ustar00rootroot00000000000000name: Release on: push: tags: - '*' permissions: contents: write jobs: release: name: Release On Tag if: startsWith(github.ref, 'refs/tags/') runs-on: ubuntu-latest steps: - name: Checkout the repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Extract the changelog id: changelog run: | TAG_NAME=${GITHUB_REF/refs\/tags\//} READ_SECTION=false CHANGELOG="" while IFS= read -r line; do if [[ "$line" =~ ^#+\ +(.*) ]]; then if [[ "${BASH_REMATCH[1]}" == "$TAG_NAME" ]]; then READ_SECTION=true elif [[ "$READ_SECTION" == true ]]; then break fi elif [[ "$READ_SECTION" == true ]]; then CHANGELOG+="$line"$'\n' fi done < "CHANGELOG.md" CHANGELOG=$(echo "$CHANGELOG" | awk '/./ {$1=$1;print}') echo "changelog_content<> $GITHUB_OUTPUT echo "$CHANGELOG" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: Create the release if: steps.changelog.outputs.changelog_content != '' uses: softprops/action-gh-release@72f2c25fcb47643c292f7107632f7a47c1df5cd8 # v2.3.2 with: name: ${{ github.ref_name }} body: '${{ steps.changelog.outputs.changelog_content }}' draft: false prerelease: false sugarss-5.0.1/.github/workflows/test.yml000066400000000000000000000030521504241257100203040ustar00rootroot00000000000000name: Test on: push: branches: - main pull_request: permissions: contents: read jobs: full: name: Node.js Latest Full runs-on: ubuntu-latest steps: - name: Checkout the repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 with: version: 10 - name: Install Node.js uses: actions/setup-node@3235b876344d2a9aa001b8d1453c930bba69e610 # v3.9.1 with: node-version: 24 cache: pnpm - name: Install dependencies run: pnpm install --frozen-lockfile --ignore-scripts - name: Run tests run: pnpm test short: runs-on: ubuntu-latest strategy: matrix: node-version: - 22 - 20 name: Node.js ${{ matrix.node-version }} Quick steps: - name: Checkout the repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 with: version: 10 - name: Install Node.js ${{ matrix.node-version }} uses: actions/setup-node@3235b876344d2a9aa001b8d1453c930bba69e610 # v3.9.1 with: node-version: ${{ matrix.node-version }} cache: pnpm - name: Install dependencies run: pnpm install --frozen-lockfile --ignore-scripts - name: Run unit tests run: pnpm unit sugarss-5.0.1/.gitignore000066400000000000000000000000311504241257100151670ustar00rootroot00000000000000node_modules/ coverage/ sugarss-5.0.1/.npmignore000066400000000000000000000000241504241257100152000ustar00rootroot00000000000000*.test.js coverage/ sugarss-5.0.1/CHANGELOG.md000066400000000000000000000025101504241257100150140ustar00rootroot00000000000000# Change Log This project adheres to [Semantic Versioning](http://semver.org/). ## 5.0.1 * Fixed `Invalid mapping` errors (by @BaliBalo). ## 5.0.0 * Added `source.offset` (by @RamazanIttiev). * Removed Node.js 16 support. ## 4.0.1 * Added `package.json` export. ## 4.0 * Removed Node.js 10 support. * Moved `postcss` to `peerDependencies`. ## 3.0.3 * Reverted `package.exports` Node.js 15 fix. ## 3.0.2 * Fixed Node.js 15 warning. ## 3.0.1 * Added funding links. ## 3.0 * Removed support for Node.js 6.x, 8.x, 11.x, and 13.x versions. * Moved to PostCSS 8.0. * Added ES modules support. ## 2.0 * Remove Node.js 9 and Node.js 4 support (by Aleks Hudochenkov). * Remove IE and “dead” browsers from Babel. * Use PostCSS 7.0 (by Aleks Hudochenkov). ## 1.0.1 * Fix nested inline comments parsing. ## 1.0 * Use PostCSS 6.0. * Use `babel-preset-env`. ## 0.2 * Show error on semicolons and curly brackets. * Fix source map mappings. ## 0.1.6 * Fix empty comments parsing. ## 0.1.5 * Put comments after declaration semicolon. * Use PostCSS 5.1. ## 0.1.4 * Fix parsing nested properties. ## 0.1.3 * Fix source map generation. ## 0.1.2 * Fix rule/declaration selection in nested rules. ## 0.1.1 * Fix comment between declaration case. * Add logo (by Maria Keller). ## 0.1 * Add selector pseudo-classes support. ## 0.0.1 * Initial release. sugarss-5.0.1/LICENSE000066400000000000000000000021071504241257100142120ustar00rootroot00000000000000The MIT License (MIT) Copyright 2016 Andrey Sitnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. sugarss-5.0.1/README.md000066400000000000000000000170471504241257100144750ustar00rootroot00000000000000# SugarSS Indent-based CSS syntax for [PostCSS]. ```sass a color: blue .multiline, .selector box-shadow: 1px 0 9px rgba(0, 0, 0, .4), 1px 0 3px rgba(0, 0, 0, .6) // Mobile @media (max-width: 400px) .body padding: 0 10px ``` As any PostCSS custom syntax, SugarSS has source map, [stylelint] and [postcss-sorting] support out-of-box. It was designed to be used with [postcss-simple-vars] and [postcss-nested]. But you can use it with any PostCSS plugins or use it without any PostCSS plugins. With [postcss-mixins] you can use `@mixin` syntax as in Sass. Sponsored by Evil Martians [postcss-mixins]: https://github.com/postcss/postcss-mixins [postcss-nested]: https://github.com/postcss/postcss-nested [postcss-simple-vars]: https://github.com/postcss/postcss-simple-vars [postcss-sorting]: https://github.com/hudochenkov/postcss-sorting [stylelint]: http://stylelint.io/ [PostCSS]: https://github.com/postcss/postcss ## Syntax SugarSS MIME-type is `text/x-sugarss` with `.sss` file extension. ### Indent We recommend 2 spaces indent. However, SugarSS autodetects indent and can be used with tabs or spaces. But it is prohibited to mix spaces and tabs in SugarSS sources. ### Multiline SugarSS was designed to have intuitively multiline selectors and declaration values. There are 3 rules for any types of nodes: ```sass // 1. New line inside brackets will be ignored @supports ( (display: flex) and (display: grid) ) // 2. Comma at the end of the line @media (max-width: 400px), (max-height: 800px) // 3. Backslash before new line @media screen and \ (min-width: 600px) ``` In a selector you can put a new line anywhere. Just keep same indent for every line of selector: ```sass .parent > .child color: black ``` In a declaration value you can put a new line anywhere. Just keep a bigger indent for the value: ```sass .one background: linear-gradient(rgba(0, 0, 0, 0), black) linear-gradient(red, rgba(255, 0, 0, 0)) .two background: linear-gradient(rgba(0, 0, 0, 0), black) linear-gradient(red, rgba(255, 0, 0, 0)) ``` ### Comments SugarSS supports two types of comments: ```sass /* Multiline comments */ // Inline comments ``` There is no “silent” comment in SugarSS. Output CSS will contain all comments from `.sss` source. But you can use [postcss-discard-comments] for Sass’s silent/loud comments behaviour. [postcss-discard-comments]: https://www.npmjs.com/package/postcss-discard-comments ### Rule and Declarations SugarSS separates selectors and declarations by `:\s` or `:\n` token. So you must write a space after the property name: `color: black` is good, `color:black` is prohibited. ### Other SugarSS is just a syntax, it change the way how you write CSS, but do not add preprocessor features build-in. Here are PostCSS plugins which could add you preprocessor features: * **[postcss-simple-vars]** adds variables. * **[postcss-nested]** adds nested rules. * **[postcss-import]** adds `@import` directive support. * **[postcss-import-ext-glob]** extends [postcss-import] path resolver to allow glob usage as a path. * **[postcss-mixins]** add `@mixin` support. * **[postcss-functions]** allows you to define own CSS functions in JS. [postcss-functions]: https://github.com/andyjansson/postcss-functions [postcss-mixins]: https://github.com/postcss/postcss-mixins [postcss-import-ext-glob]: https://github.com/dimitrinicolas/postcss-import-ext-glob [postcss-import]: https://github.com/postcss/postcss-import [postcss-nested]: https://github.com/postcss/postcss-nested [postcss-simple-vars]: https://github.com/postcss/postcss-simple-vars ## Text Editors * SublimeText: [Syntax Highlighting for .SSS SugarSS] * Atom: [language-postcss], [source-preview-postcss] and [build-sugarss] * Vim: [vim-sugarss] * VSCode: [vetur](https://vuejs.github.io/vetur/), and [postcss-sugarss-language](https://github.com/MhMadHamster/vscode-postcss-language) We are working on syntax highlight support in text editors. Right now, you can set `Sass` or `Stylus` syntax highlight for `.sss` files. [Syntax Highlighting for .SSS SugarSS]: https://packagecontrol.io/packages/Syntax%20Highlighting%20for%20SSS%20SugarSS [source-preview-postcss]: https://atom.io/packages/source-preview-postcss [language-postcss]: https://atom.io/packages/language-postcss [build-sugarss]: https://atom.io/packages/build-sugarss [vim-sugarss]: https://github.com/hhsnopek/vim-sugarss ## Usage SugarSS needs PostCSS compiler. Install [`postcss-loader`] for webpack, [`gulp-postcss`] for Gulp, [`postcss-cli`] for npm scripts. [Parcel] has build-in support for PostCSS. Then install SugarSS: `npm install --save-dev postcss sugarss` if you use npm and `yarn add --dev postcss sugarss` if you use Yarn. Then create `.postcssrc` file: ```json { "parser": "sugarss", "plugins": { "postcss-simple-vars": {} } } ``` [`postcss-loader`]: https://github.com/postcss/postcss-loader [`gulp-postcss`]: https://github.com/postcss/gulp-postcss [`postcss-cli`]: https://github.com/postcss/postcss-cli [Parcel]: https://parceljs.org/transforms.html ### Imports If you doesn’t use Webpack or Parcel, you need some PostCSS plugin to process `@import` directives. If you want `@import`, install [postcss-import] and add it to `.postcssrc` file: ```diff js { "parser": "sugarss", "plugins": { + "postcss-import": {}, "postcss-simple-vars": {} } } ``` [postcss-import]: https://github.com/postcss/postcss-import ### Mixins For mixins support, install [postcss-mixins] and add it to `.postcssrc` file: ```diff js { "parser": "sugarss", "plugins": { + "postcss-mixins": { + "mixinsDir": "./mixins" + }, "postcss-simple-vars": {} } } ``` Now you can define your mixins in `mixins/` dir. For example create `mixins/circle.sss` with: ```sss @define-mixin circle $size border-radius: 50% width: $size height: $size ``` ### Functions To define custom functions you need to install [postcss-functions] and add it to `.postcssrc` file: ```diff js { "parser": "sugarss", "plugins": { + "postcss-functions": { + "glob": "./functions" + }, "postcss-simple-vars": {} } } ``` Then you can define functions in `functions/` dir. For example, `functions/foo.js` will define `foo()` function in CSS: ```js module.exports = function (args) { return 'foo' } ``` ### SugarSS to SugarSS Sometimes we use PostCSS not to build CSS, but to fix source files. For example, to sort properties by [postcss-sorting]. For this cases use the `syntax` option, instead of `parser`: ```js gulp.task('sort', function () { return gulp.src('src/**/*.sss') .pipe(postcss([sorting], { syntax: sugarss })) .pipe(gulp.dest('src')); }); ``` [postcss-sorting]: https://github.com/hudochenkov/postcss-sorting ### CSS to SugarSS You can even compile existing CSS sources to SugarSS syntax. Just use `stringifier` option instead of `parser`: ```js postcss().process(css, { stringifier: sugarss }).then(function (result) { result.content // Converted SugarSS content }); ``` ## Thanks Cute project logo was made by [Maria Keller](http://www.mariakellerac.com/). sugarss-5.0.1/eslint.config.mjs000066400000000000000000000002361504241257100164630ustar00rootroot00000000000000import loguxConfig from '@logux/eslint-config' export default [ ...loguxConfig, { rules: { 'perfectionist/sort-switch-case': 'off' } } ] sugarss-5.0.1/index.js000066400000000000000000000001551504241257100146530ustar00rootroot00000000000000let parse = require('./parse') let stringify = require('./stringify') module.exports = { parse, stringify } sugarss-5.0.1/index.mjs000066400000000000000000000002001504241257100150170ustar00rootroot00000000000000import index from "./index.js" export default index export const stringify = index.stringify export const parse = index.parse sugarss-5.0.1/liner.js000066400000000000000000000005741504241257100146620ustar00rootroot00000000000000module.exports = function liner(tokens) { let line = [] let result = [line] let brackets = 0 for (let token of tokens) { line.push(token) if (token[0] === '(') { brackets += 1 } else if (token[0] === ')') { brackets -= 1 } else if (token[0] === 'newline' && brackets === 0) { line = [] result.push(line) } } return result } sugarss-5.0.1/logo.svg000066400000000000000000002075241504241257100147000ustar00rootroot00000000000000sugarcss-logosugarss-5.0.1/package.json000066400000000000000000000030441504241257100154740ustar00rootroot00000000000000{ "name": "sugarss", "version": "5.0.1", "description": "Indent-based CSS syntax for PostCSS", "keywords": [ "css", "postcss", "postcss-syntax", "syntax", "indent", "parser" ], "author": "Andrey Sitnik ", "license": "MIT", "repository": "postcss/sugarss", "scripts": { "unit": "node --test test/*.test.js", "test:coverage": "c8 pnpm unit", "test:lint": "eslint .", "test": "pnpm run /^test:/" }, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "engines": { "node": ">=18.0" }, "exports": { ".": { "require": "./index.js", "import": "./index.mjs" }, "./parse": "./parse.js", "./stringify": "./stringify.js", "./tokenize": "./tokenize.js", "./package.json": "./package.json" }, "peerDependencies": { "postcss": "^8.3.3" }, "devDependencies": { "@logux/eslint-config": "^56.1.0", "c8": "^10.1.3", "clean-publish": "^5.2.2", "eslint": "^9.32.0", "postcss": "^8.5.6", "postcss-parser-tests": "^8.9.0" }, "prettier": { "arrowParens": "avoid", "jsxSingleQuote": false, "quoteProps": "consistent", "semi": false, "singleQuote": true, "trailingComma": "none" }, "c8": { "exclude": [ "**/*.test.*" ], "lines": 96.36, "reporter": "lcov", "check-coverage": true }, "clean-publish": { "cleanDocs": true } } sugarss-5.0.1/parse.js000066400000000000000000000006601504241257100146570ustar00rootroot00000000000000let { Input } = require('postcss') let liner = require('./liner') let Parser = require('./parser') let preprocess = require('./preprocess') let tokenizer = require('./tokenize') module.exports = function parse(source, opts) { let input = new Input(source, opts) let parser = new Parser(input) parser.tokens = tokenizer(input) parser.parts = preprocess(input, liner(parser.tokens)) parser.loop() return parser.root } sugarss-5.0.1/parser.js000066400000000000000000000233771504241257100150530ustar00rootroot00000000000000let { AtRule, Comment, Declaration, Root, Rule } = require('postcss') module.exports = class Parser { constructor(input) { this.input = input this.pos = 0 this.root = new Root() this.current = this.root this.spaces = '' this.extraIndent = false this.prevIndent = undefined this.step = undefined this.root.source = { input, start: { column: 1, line: 1, offset: 0 } } } atrule(part) { let atword = part.tokens[0] let params = part.tokens.slice(1) let node = new AtRule() node.name = atword[1].slice(1) this.init(node, part) if (node.name === '') this.unnamedAtrule(atword) while (!part.end && part.lastComma) { this.pos += 1 part = this.parts[this.pos] params.push(['space', part.before + part.indent]) params = params.concat(part.tokens) } node.raws.afterName = this.firstSpaces(params) this.keepTrailingSpace(node, params) this.checkSemicolon(params) this.checkCurly(params) this.raw(node, 'params', params, atword) } badProp(token) { let pos = this.getPosition(token[2]) this.error('Unexpected separator in property', pos.offset) } checkCurly(tokens) { for (let token of tokens) { if (token[0] === '{') { let pos = this.getPosition(token[2]) this.error('Unnecessary curly bracket', pos.offset) } } } checkSemicolon(tokens) { for (let token of tokens) { if (token[0] === ';') { let pos = this.getPosition(token[2]) this.error('Unnecessary semicolon', pos.offset) } } } comment(part) { let token = part.tokens[0] let node = new Comment() this.init(node, part) node.source.end = this.getPosition(token[3]) this.commentText(node, token) } /* Helpers */ commentText(node, token) { let text = token[1] if (token[4] === 'inline') { node.raws.inline = true text = text.slice(2) } else { text = text.slice(2, -2) } let match = text.match(/^(\s*)([^]*\S)(\s*)\n?$/) if (match) { node.text = match[2] node.raws.left = match[1] node.raws.inlineRight = match[3] } else { node.text = '' node.raws.left = '' node.raws.inlineRight = '' } } decl(part) { let node = new Declaration() this.init(node, part) let between = '' let colon = 0 let value = [] let prop = '' for (let i = 0; i < part.tokens.length; i++) { let token = part.tokens[i] if (token[0] === ':') { between += token[1] colon = token value = part.tokens.slice(i + 1) break } else if (token[0] === 'comment' || token[0] === 'space') { between += token[1] } else if (between !== '') { this.badProp(token) } else { prop += token[1] } } if (prop === '') this.unnamedDecl(part.tokens[0]) node.prop = prop let next = this.parts[this.pos + 1] while ( !next.end && !next.atrule && !next.colon && next.indent.length > part.indent.length ) { value.push(['space', next.before + next.indent]) value = value.concat(next.tokens) this.pos += 1 next = this.parts[this.pos + 1] } let last = value[value.length - 1] if (last && last[0] === 'comment') { value.pop() let comment = new Comment() this.current.push(comment) comment.source = { end: this.getPosition(last[3]), input: this.input, start: this.getPosition(last[2]) } let prev = value[value.length - 1] if (prev && prev[0] === 'space') { value.pop() comment.raws.before = prev[1] } this.commentText(comment, last) } for (let i = value.length - 1; i > 0; i--) { let t = value[i][0] if (t === 'word' && value[i][1] === '!important') { node.important = true if (i > 0 && value[i - 1][0] === 'space') { node.raws.important = value[i - 1][1] + '!important' value.splice(i - 1, 2) } else { node.raws.important = '!important' value.splice(i, 1) } break } else if (t !== 'space' && t !== 'newline' && t !== 'comment') { break } } node.raws.between = between + this.firstSpaces(value) this.checkSemicolon(value) this.raw(node, 'value', value, colon) } error(msg, offset) { let pos = this.getPosition(offset) throw this.input.error(msg, pos.line, pos.column) } firstSpaces(tokens) { let result = '' for (let i = 0; i < tokens.length; i++) { if (tokens[i][0] === 'space' || tokens[i][0] === 'newline') { result += tokens.shift()[1] i -= 1 } else { break } } return result } getPosition(offset) { let pos = this.input.fromOffset(offset) return { column: pos.col, line: pos.line, offset } } indent(part) { let indent = part.indent.length let isPrev = typeof this.prevIndent !== 'undefined' if (!isPrev && indent) this.indentedFirstLine(part) if (!this.step && indent) { this.step = indent this.root.raws.indent = part.indent } if (isPrev && this.prevIndent !== indent) { let diff = indent - this.prevIndent if (diff > 0) { if (diff !== this.step) { this.wrongIndent(this.prevIndent + this.step, indent, part) } else if (this.current.last.push) { this.current = this.current.last } else { this.extraIndent = '' for (let i = 0; i < diff; i++) { this.extraIndent += ' ' } } } else if (diff % this.step !== 0) { let m = indent + (diff % this.step) this.wrongIndent(`${m} or ${m + this.step}`, indent, part) } else { for (let i = 0; i < -diff / this.step; i++) { this.current = this.current.parent } } } this.prevIndent = indent } indentedFirstLine(part) { let pos = this.getPosition(part.tokens[0][2]) this.error('First line should not have indent', pos.offset) } init(node, part) { this.indent(part) if (!this.current.nodes) this.current.nodes = [] this.current.push(node) node.raws.before = part.before + part.indent if (this.extraIndent) { node.raws.extraIndent = this.extraIndent this.extraIndent = false } node.source = { input: this.input, start: this.getPosition(part.tokens[0][2]) } } keepTrailingSpace(node, tokens) { let lastSpace = tokens[tokens.length - 1] if (lastSpace && lastSpace[0] === 'space') { tokens.pop() node.raws.sssBetween = lastSpace[1] } } loop() { let part while (this.pos < this.parts.length) { part = this.parts[this.pos] if (part.comment) { this.comment(part) } else if (part.atrule) { this.atrule(part) } else if (part.colon) { let next = this.nextNonComment(this.pos) if (next.end || next.atrule) { this.decl(part) } else { let moreIndent = next.indent.length > part.indent.length if (!moreIndent) { this.decl(part) } else if (moreIndent && next.colon) { this.rule(part) } else if (moreIndent && !next.colon) { this.decl(part) } } } else if (part.end) { this.root.raws.after = part.before } else { this.rule(part) } this.pos += 1 } for (let i = this.tokens.length - 1; i >= 0; i--) { if (this.tokens[i].length > 3) { let last = this.tokens[i] this.root.source.end = this.getPosition(last[3]) break } } } // Errors nextNonComment(pos) { let next = pos let part while (next < this.parts.length) { next += 1 part = this.parts[next] if (part.end || !part.comment) break } return part } raw(node, prop, tokens, altLast) { let token, type let length = tokens.length let value = '' let clean = true for (let i = 0; i < length; i += 1) { token = tokens[i] type = token[0] if (type === 'comment' || (type === 'space' && i === length - 1)) { clean = false } else { value += token[1] } } if (!clean) { let sss = tokens.reduce((all, i) => all + i[1], '') let raw = tokens.reduce((all, i) => { if (i[0] === 'comment' && i[4] === 'inline') { return all + '/* ' + i[1].slice(2).trim() + ' */' } else { return all + i[1] } }, '') node.raws[prop] = { raw, value } if (sss !== raw) node.raws[prop].sss = sss } node[prop] = value let last for (let i = tokens.length - 1; i >= 0; i--) { if (tokens[i].length > 2) { last = tokens[i] break } } if (!last) last = altLast node.source.end = this.getPosition(last[3]) } rule(part) { let node = new Rule() this.init(node, part) let selector = part.tokens let next = this.parts[this.pos + 1] while (!next.end && next.indent.length === part.indent.length) { selector.push(['space', next.before + next.indent]) selector = selector.concat(next.tokens) this.pos += 1 next = this.parts[this.pos + 1] } this.keepTrailingSpace(node, selector) this.checkCurly(selector) this.raw(node, 'selector', selector) } unnamedAtrule(token) { let pos = this.getPosition(token[2]) this.error('At-rule without name', pos.offset) } unnamedDecl(token) { let pos = this.getPosition(token[2]) this.error('Declaration without name', pos.offset) } wrongIndent(expected, real, part) { let pos = this.getPosition(part.tokens[0][2]) let msg = `Expected ${expected} indent, but get ${real}` this.error(msg, pos.offset) } } sugarss-5.0.1/pnpm-lock.yaml000066400000000000000000002033201504241257100157710ustar00rootroot00000000000000lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false importers: .: devDependencies: '@logux/eslint-config': specifier: ^56.1.0 version: 56.1.0(@typescript-eslint/utils@8.38.0(eslint@9.32.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0)(typescript@5.2.2) c8: specifier: ^10.1.3 version: 10.1.3 clean-publish: specifier: ^5.2.2 version: 5.2.2 eslint: specifier: ^9.32.0 version: 9.32.0 postcss: specifier: ^8.5.6 version: 8.5.6 postcss-parser-tests: specifier: ^8.9.0 version: 8.9.0 packages: '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} '@emnapi/core@1.4.5': resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} '@emnapi/runtime@1.4.5': resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} '@emnapi/wasi-threads@1.0.4': resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/config-array@0.21.0': resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.3.0': resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.15.1': resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.32.0': resolution: {integrity: sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/plugin-kit@0.3.4': resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} '@humanfs/node@0.16.6': resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} '@humanwhocodes/retry@0.3.1': resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} '@isaacs/brace-expansion@5.0.0': resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} engines: {node: 20 || >=22} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} '@jridgewell/sourcemap-codec@1.5.4': resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} '@logux/eslint-config@56.1.0': resolution: {integrity: sha512-o0fsiWHpj0T+ZgnHg2T/wBjLTztYkhQnk6cckZ8zmGA9hz+wX2Y+s34u2VB/AaxOxFOrOF+bQIUGacOzPCledA==} engines: {node: '>=18.0.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 eslint-plugin-svelte: ^3.0.0 svelte: ^4.2.12 || ^5.0.0 svelte-eslint-parser: ^1.0.0 peerDependenciesMeta: eslint-plugin-svelte: optional: true svelte: optional: true svelte-eslint-parser: optional: true '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} '@tybys/wasm-util@0.10.0': resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@typescript-eslint/eslint-plugin@8.38.0': resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.38.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/parser@8.38.0': resolution: {integrity: sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/project-service@8.38.0': resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/scope-manager@8.38.0': resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/tsconfig-utils@8.38.0': resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/type-utils@8.38.0': resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/types@8.38.0': resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.38.0': resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/utils@8.38.0': resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/visitor-keys@8.38.0': resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] os: [android] '@unrs/resolver-binding-android-arm64@1.11.1': resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} cpu: [arm64] os: [android] '@unrs/resolver-binding-darwin-arm64@1.11.1': resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} cpu: [arm64] os: [darwin] '@unrs/resolver-binding-darwin-x64@1.11.1': resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} cpu: [x64] os: [darwin] '@unrs/resolver-binding-freebsd-x64@1.11.1': resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} cpu: [x64] os: [freebsd] '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} cpu: [arm] os: [linux] '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} cpu: [arm] os: [linux] '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} cpu: [arm64] os: [win32] '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} cpu: [ia32] os: [win32] '@unrs/resolver-binding-win32-x64-msvc@1.11.1': resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} cpu: [x64] os: [win32] acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} ansi-regex@6.1.0: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} c8@10.1.3: resolution: {integrity: sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==} engines: {node: '>=18'} hasBin: true peerDependencies: monocart-coverage-reports: ^2 peerDependenciesMeta: monocart-coverage-reports: optional: true callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} clean-publish@5.2.2: resolution: {integrity: sha512-sqM9uAXG+K7QzEn0Ur00otEHfbQTsyle4enj/388ZZQhG6daXMJ15dfD/ALsFCQCJvMZPxYwDx/QrdcdzWVPyg==} engines: {node: '>= 18.0.0'} hasBin: true cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} comment-parser@1.4.1: resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} engines: {node: '>= 12.0.0'} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} enhanced-resolve@5.18.2: resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} engines: {node: '>=10.13.0'} escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} eslint-compat-utils@0.5.1: resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' eslint-import-context@0.1.9: resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} peerDependencies: unrs-resolver: ^1.0.0 peerDependenciesMeta: unrs-resolver: optional: true eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} eslint-plugin-es-x@7.8.0: resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' eslint-plugin-import-x@4.16.1: resolution: {integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/utils': ^8.0.0 eslint: ^8.57.0 || ^9.0.0 eslint-import-resolver-node: '*' peerDependenciesMeta: '@typescript-eslint/utils': optional: true eslint-import-resolver-node: optional: true eslint-plugin-n@17.21.3: resolution: {integrity: sha512-MtxYjDZhMQgsWRm/4xYLL0i2EhusWT7itDxlJ80l1NND2AL2Vi5Mvneqv/ikG9+zpran0VsVRXTEHrpLmUZRNw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' eslint-plugin-perfectionist@4.15.0: resolution: {integrity: sha512-pC7PgoXyDnEXe14xvRUhBII8A3zRgggKqJFx2a82fjrItDs1BSI7zdZnQtM2yQvcyod6/ujmzb7ejKPx8lZTnw==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: eslint: '>=8.45.0' eslint-plugin-prefer-let@4.0.0: resolution: {integrity: sha512-X4ep5PMO1320HKaNC9DM5+p6XvOhwv+RcqGjhv3aiw9iAtHhiFtdIUB5l0Zya0iM22ys2BGKzrNI9Xpw/ZHooQ==} engines: {node: '>=0.10.0'} eslint-plugin-promise@7.2.1: resolution: {integrity: sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-visitor-keys@4.2.1: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint@9.32.0: resolution: {integrity: sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: jiti: '*' peerDependenciesMeta: jiti: optional: true espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} globals@15.15.0: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} globals@16.3.0: resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} engines: {node: '>=18'} globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} ignore@7.0.5: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} istanbul-reports@3.1.7: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} minimatch@10.0.3: resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true napi-postinstall@0.3.2: resolution: {integrity: sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} natural-orderby@5.0.0: resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} engines: {node: '>=18'} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} postcss-parser-tests@8.9.0: resolution: {integrity: sha512-WGbGB0FMGoaaBz5AVLXscO76ibgm1ZjBD2weWHhFQSrQ8HyVhNqZDLZSVejIZSd7pQ7SX73EUTHZjx3Jbg60zw==} postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} requireindex@1.2.0: resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} engines: {node: '>=0.10.5'} resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} hasBin: true reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} semver@7.7.2: resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} stable-hash-x@0.2.0: resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} engines: {node: '>=12.0.0'} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} strip-ansi@7.1.0: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} tapable@2.2.2: resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} engines: {node: '>=6'} test-exclude@7.0.1: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' ts-declaration-location@1.0.7: resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} peerDependencies: typescript: '>=4.0.0' tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} typescript-eslint@8.38.0: resolution: {integrity: sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' typescript@5.2.2: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} hasBin: true unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} v8-to-istanbul@9.3.0: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} wrap-ansi@8.1.0: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} snapshots: '@bcoe/v8-coverage@1.0.2': {} '@emnapi/core@1.4.5': dependencies: '@emnapi/wasi-threads': 1.0.4 tslib: 2.8.1 optional: true '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 optional: true '@emnapi/wasi-threads@1.0.4': dependencies: tslib: 2.8.1 optional: true '@eslint-community/eslint-utils@4.7.0(eslint@9.32.0)': dependencies: eslint: 9.32.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@eslint/config-helpers@0.3.0': {} '@eslint/core@0.15.1': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.1 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color '@eslint/js@9.32.0': {} '@eslint/object-schema@2.1.6': {} '@eslint/plugin-kit@0.3.4': dependencies: '@eslint/core': 0.15.1 levn: 0.4.1 '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': dependencies: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.3.1 '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.3.1': {} '@humanwhocodes/retry@0.4.3': {} '@isaacs/balanced-match@4.0.1': {} '@isaacs/brace-expansion@5.0.0': dependencies: '@isaacs/balanced-match': 4.0.1 '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 '@istanbuljs/schema@0.1.3': {} '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.4': {} '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.4 '@logux/eslint-config@56.1.0(@typescript-eslint/utils@8.38.0(eslint@9.32.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0)(typescript@5.2.2)': dependencies: '@eslint/eslintrc': 3.3.1 eslint: 9.32.0 eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0) eslint-plugin-n: 17.21.3(eslint@9.32.0)(typescript@5.2.2) eslint-plugin-perfectionist: 4.15.0(eslint@9.32.0)(typescript@5.2.2) eslint-plugin-prefer-let: 4.0.0 eslint-plugin-promise: 7.2.1(eslint@9.32.0) globals: 16.3.0 typescript-eslint: 8.38.0(eslint@9.32.0)(typescript@5.2.2) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint-import-resolver-node - supports-color - typescript '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.4.5 '@emnapi/runtime': 1.4.5 '@tybys/wasm-util': 0.10.0 optional: true '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 '@nodelib/fs.stat@2.0.5': {} '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 '@pkgjs/parseargs@0.11.0': optional: true '@tybys/wasm-util@0.10.0': dependencies: tslib: 2.8.1 optional: true '@types/estree@1.0.8': {} '@types/istanbul-lib-coverage@2.0.6': {} '@types/json-schema@7.0.15': {} '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.2.2))(eslint@9.32.0)(typescript@5.2.2)': dependencies: '@eslint-community/regexpp': 4.12.1 '@typescript-eslint/parser': 8.38.0(eslint@9.32.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 8.38.0 '@typescript-eslint/type-utils': 8.38.0(eslint@9.32.0)(typescript@5.2.2) '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 8.38.0 eslint: 9.32.0 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.1.0(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color '@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.2.2)': dependencies: '@typescript-eslint/scope-manager': 8.38.0 '@typescript-eslint/types': 8.38.0 '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.2.2) '@typescript-eslint/visitor-keys': 8.38.0 debug: 4.4.1 eslint: 9.32.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color '@typescript-eslint/project-service@8.38.0(typescript@5.2.2)': dependencies: '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.2.2) '@typescript-eslint/types': 8.38.0 debug: 4.4.1 typescript: 5.2.2 transitivePeerDependencies: - supports-color '@typescript-eslint/scope-manager@8.38.0': dependencies: '@typescript-eslint/types': 8.38.0 '@typescript-eslint/visitor-keys': 8.38.0 '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.2.2)': dependencies: typescript: 5.2.2 '@typescript-eslint/type-utils@8.38.0(eslint@9.32.0)(typescript@5.2.2)': dependencies: '@typescript-eslint/types': 8.38.0 '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.2.2) '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.2.2) debug: 4.4.1 eslint: 9.32.0 ts-api-utils: 2.1.0(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.38.0': {} '@typescript-eslint/typescript-estree@8.38.0(typescript@5.2.2)': dependencies: '@typescript-eslint/project-service': 8.38.0(typescript@5.2.2) '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.2.2) '@typescript-eslint/types': 8.38.0 '@typescript-eslint/visitor-keys': 8.38.0 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 ts-api-utils: 2.1.0(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color '@typescript-eslint/utils@8.38.0(eslint@9.32.0)(typescript@5.2.2)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0) '@typescript-eslint/scope-manager': 8.38.0 '@typescript-eslint/types': 8.38.0 '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.2.2) eslint: 9.32.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color '@typescript-eslint/visitor-keys@8.38.0': dependencies: '@typescript-eslint/types': 8.38.0 eslint-visitor-keys: 4.2.1 '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true '@unrs/resolver-binding-android-arm64@1.11.1': optional: true '@unrs/resolver-binding-darwin-arm64@1.11.1': optional: true '@unrs/resolver-binding-darwin-x64@1.11.1': optional: true '@unrs/resolver-binding-freebsd-x64@1.11.1': optional: true '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': optional: true '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': optional: true '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': optional: true '@unrs/resolver-binding-linux-arm64-musl@1.11.1': optional: true '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': optional: true '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': optional: true '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': optional: true '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': optional: true '@unrs/resolver-binding-linux-x64-gnu@1.11.1': optional: true '@unrs/resolver-binding-linux-x64-musl@1.11.1': optional: true '@unrs/resolver-binding-wasm32-wasi@1.11.1': dependencies: '@napi-rs/wasm-runtime': 0.2.12 optional: true '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': optional: true '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': optional: true '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 acorn@8.15.0: {} ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 ansi-styles@6.2.1: {} argparse@2.0.1: {} balanced-match@1.0.2: {} brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 braces@3.0.3: dependencies: fill-range: 7.1.1 c8@10.1.3: dependencies: '@bcoe/v8-coverage': 1.0.2 '@istanbuljs/schema': 0.1.3 find-up: 5.0.0 foreground-child: 3.3.1 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.1.7 test-exclude: 7.0.1 v8-to-istanbul: 9.3.0 yargs: 17.7.2 yargs-parser: 21.1.1 callsites@3.1.0: {} chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 clean-publish@5.2.2: dependencies: cross-spawn: 7.0.6 fast-glob: 3.3.3 lilconfig: 3.1.3 micromatch: 4.0.8 cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} comment-parser@1.4.1: {} concat-map@0.0.1: {} convert-source-map@2.0.0: {} cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 debug@3.2.7: dependencies: ms: 2.1.3 optional: true debug@4.4.1: dependencies: ms: 2.1.3 deep-is@0.1.4: {} eastasianwidth@0.2.0: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} enhanced-resolve@5.18.2: dependencies: graceful-fs: 4.2.11 tapable: 2.2.2 escalade@3.2.0: {} escape-string-regexp@4.0.0: {} eslint-compat-utils@0.5.1(eslint@9.32.0): dependencies: eslint: 9.32.0 semver: 7.7.2 eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: get-tsconfig: 4.10.1 stable-hash-x: 0.2.0 optionalDependencies: unrs-resolver: 1.11.1 eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.16.1 resolve: 1.22.10 transitivePeerDependencies: - supports-color optional: true eslint-plugin-es-x@7.8.0(eslint@9.32.0): dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0) '@eslint-community/regexpp': 4.12.1 eslint: 9.32.0 eslint-compat-utils: 0.5.1(eslint@9.32.0) eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.38.0(eslint@9.32.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0): dependencies: '@typescript-eslint/types': 8.38.0 comment-parser: 1.4.1 debug: 4.4.1 eslint: 9.32.0 eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 minimatch: 10.0.3 semver: 7.7.2 stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.2.2) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color eslint-plugin-n@17.21.3(eslint@9.32.0)(typescript@5.2.2): dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0) enhanced-resolve: 5.18.2 eslint: 9.32.0 eslint-plugin-es-x: 7.8.0(eslint@9.32.0) get-tsconfig: 4.10.1 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 semver: 7.7.2 ts-declaration-location: 1.0.7(typescript@5.2.2) transitivePeerDependencies: - typescript eslint-plugin-perfectionist@4.15.0(eslint@9.32.0)(typescript@5.2.2): dependencies: '@typescript-eslint/types': 8.38.0 '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.2.2) eslint: 9.32.0 natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript eslint-plugin-prefer-let@4.0.0: dependencies: requireindex: 1.2.0 eslint-plugin-promise@7.2.1(eslint@9.32.0): dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0) eslint: 9.32.0 eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.1: {} eslint@9.32.0: dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.0 '@eslint/core': 0.15.1 '@eslint/eslintrc': 3.3.1 '@eslint/js': 9.32.0 '@eslint/plugin-kit': 0.3.4 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.1 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 transitivePeerDependencies: - supports-color espree@10.4.0: dependencies: acorn: 8.15.0 acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 esquery@1.6.0: dependencies: estraverse: 5.3.0 esrecurse@4.3.0: dependencies: estraverse: 5.3.0 estraverse@5.3.0: {} esutils@2.0.3: {} fast-deep-equal@3.1.3: {} fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} fastq@1.19.1: dependencies: reusify: 1.1.0 file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 flat-cache@4.0.1: dependencies: flatted: 3.3.3 keyv: 4.5.4 flatted@3.3.3: {} foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 function-bind@1.1.2: optional: true get-caller-file@2.0.5: {} get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 glob-parent@5.1.2: dependencies: is-glob: 4.0.3 glob-parent@6.0.2: dependencies: is-glob: 4.0.3 glob@10.4.5: dependencies: foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 globals@14.0.0: {} globals@15.15.0: {} globals@16.3.0: {} globrex@0.1.2: {} graceful-fs@4.2.11: {} graphemer@1.4.0: {} has-flag@4.0.0: {} hasown@2.0.2: dependencies: function-bind: 1.1.2 optional: true html-escaper@2.0.2: {} ignore@5.3.2: {} ignore@7.0.5: {} import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 imurmurhash@0.1.4: {} is-core-module@2.16.1: dependencies: hasown: 2.0.2 optional: true is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} is-glob@4.0.3: dependencies: is-extglob: 2.1.1 is-number@7.0.0: {} isexe@2.0.0: {} istanbul-lib-coverage@3.2.2: {} istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 js-yaml@4.1.0: dependencies: argparse: 2.0.1 json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} keyv@4.5.4: dependencies: json-buffer: 3.0.1 levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 lilconfig@3.1.3: {} locate-path@6.0.0: dependencies: p-locate: 5.0.0 lodash.merge@4.6.2: {} lru-cache@10.4.3: {} make-dir@4.0.0: dependencies: semver: 7.7.2 merge2@1.4.1: {} micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 minimatch@10.0.3: dependencies: '@isaacs/brace-expansion': 5.0.0 minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 minipass@7.1.2: {} ms@2.1.3: {} nanoid@3.3.11: {} napi-postinstall@0.3.2: {} natural-compare@1.4.0: {} natural-orderby@5.0.0: {} optionator@0.9.4: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.5 p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 p-locate@5.0.0: dependencies: p-limit: 3.1.0 package-json-from-dist@1.0.1: {} parent-module@1.0.1: dependencies: callsites: 3.1.0 path-exists@4.0.0: {} path-key@3.1.1: {} path-parse@1.0.7: optional: true path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 minipass: 7.1.2 picocolors@1.1.1: {} picomatch@2.3.1: {} picomatch@4.0.3: {} postcss-parser-tests@8.9.0: dependencies: picocolors: 1.1.1 postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} punycode@2.3.1: {} queue-microtask@1.2.3: {} require-directory@2.1.1: {} requireindex@1.2.0: {} resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} resolve@1.22.10: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 optional: true reusify@1.1.0: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 semver@7.7.2: {} shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} signal-exit@4.1.0: {} source-map-js@1.2.1: {} stable-hash-x@0.2.0: {} string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 strip-ansi@7.1.0: dependencies: ansi-regex: 6.1.0 strip-json-comments@3.1.1: {} supports-color@7.2.0: dependencies: has-flag: 4.0.0 supports-preserve-symlinks-flag@1.0.0: optional: true tapable@2.2.2: {} test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 glob: 10.4.5 minimatch: 9.0.5 to-regex-range@5.0.1: dependencies: is-number: 7.0.0 ts-api-utils@2.1.0(typescript@5.2.2): dependencies: typescript: 5.2.2 ts-declaration-location@1.0.7(typescript@5.2.2): dependencies: picomatch: 4.0.3 typescript: 5.2.2 tslib@2.8.1: optional: true type-check@0.4.0: dependencies: prelude-ls: 1.2.1 typescript-eslint@8.38.0(eslint@9.32.0)(typescript@5.2.2): dependencies: '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0)(typescript@5.2.2))(eslint@9.32.0)(typescript@5.2.2) '@typescript-eslint/parser': 8.38.0(eslint@9.32.0)(typescript@5.2.2) '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.2.2) '@typescript-eslint/utils': 8.38.0(eslint@9.32.0)(typescript@5.2.2) eslint: 9.32.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color typescript@5.2.2: {} unrs-resolver@1.11.1: dependencies: napi-postinstall: 0.3.2 optionalDependencies: '@unrs/resolver-binding-android-arm-eabi': 1.11.1 '@unrs/resolver-binding-android-arm64': 1.11.1 '@unrs/resolver-binding-darwin-arm64': 1.11.1 '@unrs/resolver-binding-darwin-x64': 1.11.1 '@unrs/resolver-binding-freebsd-x64': 1.11.1 '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 '@unrs/resolver-binding-linux-x64-musl': 1.11.1 '@unrs/resolver-binding-wasm32-wasi': 1.11.1 '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 uri-js@4.4.1: dependencies: punycode: 2.3.1 v8-to-istanbul@9.3.0: dependencies: '@jridgewell/trace-mapping': 0.3.29 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 which@2.0.2: dependencies: isexe: 2.0.0 word-wrap@1.2.5: {} wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 y18n@5.0.8: {} yargs-parser@21.1.1: {} yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 yocto-queue@0.1.0: {} sugarss-5.0.1/preprocess.js000066400000000000000000000055061504241257100157360ustar00rootroot00000000000000function indentError(input, l, p) { throw input.error('Mixed tabs and spaces are not allowed', l, p + 1) } module.exports = function preprocess(input, lines) { let indentType let prevNumber = 0 let parts = lines.map(line => { let lastComma = false let comment = false let number = prevNumber + 1 let atrule = false let indent = '' let tokens = [] let colon = false if (line.length > 0) { if (line[0][0] === 'space') { indent = line[0][1] tokens = line.slice(1) } else { indent = '' tokens = line } if (!indentType && indent.length) { indentType = indent[0] === ' ' ? 'space' : 'tab' } if (indentType === 'space') { if (indent.includes('\t')) { indentError(input, number, indent.indexOf('\t')) } } else if (indentType === 'tab') { if (indent.includes(' ')) { indentError(input, number, indent.indexOf(' ')) } } if (tokens.length) { for (let i = tokens.length - 1; i >= 0; i--) { let type = tokens[i][0] if (type === ',') { lastComma = true break } else if (type === 'space') { continue } else if (type === 'comment') { continue } else if (type === 'newline') { continue } else { break } } comment = tokens[0][0] === 'comment' atrule = tokens[0][0] === 'at-word' let brackets = 0 for (let i = 0; i < tokens.length - 1; i++) { let type = tokens[i][0] let next = tokens[i + 1][0] if (type === '(') { brackets += 1 } else if (type === ')') { brackets -= 1 } else if ( type === ':' && brackets === 0 && (next === 'space' || next === 'newline') ) { colon = true } } } let last = tokens[tokens.length - 1] if (last && last[0] === 'newline') prevNumber = last[2] } return { atrule, before: '', colon, comment, indent, lastComma, number, tokens } }) parts = parts.reduceRight( (all, i) => { if (!i.tokens.length || i.tokens.every(j => j[0] === 'newline')) { let prev = all[0] let before = i.indent + i.tokens.map(j => j[1]).join('') prev.before = before + prev.before } else { all.unshift(i) } return all }, [{ before: '', end: true }] ) parts.forEach((part, i) => { if (i === 0) return let prev = parts[i - 1] let last = prev.tokens[prev.tokens.length - 1] if (last && last[0] === 'newline') { part.before = last[1] + part.before prev.tokens.pop() } }) return parts } sugarss-5.0.1/stringifier.js000066400000000000000000000050551504241257100160750ustar00rootroot00000000000000const DEFAULT_RAWS = { colon: ': ', commentLeft: ' ', commentRight: ' ', indent: ' ' } module.exports = class Stringifier { constructor(builder) { this.builder = builder } atrule(node) { let name = '@' + node.name let params = node.params ? this.rawValue(node, 'params') : '' if (this.has(node.raws.afterName)) { name += node.raws.afterName } else if (params) { name += ' ' } this.block(node, name + params) } block(node, start) { let between = node.raws.sssBetween || '' this.builder(start + between, node, 'start') if (this.has(node.nodes)) this.body(node) } body(node) { let indent = node.root().raws.indent || DEFAULT_RAWS.indent for (let i = 0; i < node.nodes.length; i++) { let child = node.nodes[i] let before = child.raws.before.replace(/[^\n]*$/, '') + this.indent(node, indent) if (child.type === 'comment' && !child.raws.before.includes('\n')) { before = child.raws.before } if (before) this.builder(before) this.stringify(child) } } comment(node) { let left = DEFAULT_RAWS.commentLeft let right = DEFAULT_RAWS.commentRight if (this.has(node.raws.left)) left = node.raws.left if (node.raws.inline) { if (this.has(node.raws.inlineRight)) { right = node.raws.inlineRight } else { right = '' } if (node.raws.extraIndent) { this.builder(node.raws.extraIndent) } this.builder('//' + left + node.text + right, node) } else { if (this.has(node.raws.right)) right = node.raws.right this.builder('/*' + left + node.text + right + '*/', node) } } decl(node) { let between = node.raws.between || DEFAULT_RAWS.colon let string = node.prop + between + this.rawValue(node, 'value') if (node.important) { string += node.raws.important || ' !important' } this.builder(string, node) } has(value) { return typeof value !== 'undefined' } indent(node, step) { let result = '' while (node.parent) { result += step node = node.parent } return result } rawValue(node, prop) { let value = node[prop] let raw = node.raws[prop] if (raw && raw.value === value) { return raw.sss || raw.raw } else { return value } } root(node) { this.body(node) if (node.raws.after) this.builder(node.raws.after) } rule(node) { this.block(node, this.rawValue(node, 'selector')) } stringify(node, semicolon) { this[node.type](node, semicolon) } } sugarss-5.0.1/stringify.js000066400000000000000000000002361504241257100155620ustar00rootroot00000000000000let Stringifier = require('./stringifier') module.exports = function stringify(node, builder) { let str = new Stringifier(builder) str.stringify(node) } sugarss-5.0.1/test/000077500000000000000000000000001504241257100141645ustar00rootroot00000000000000sugarss-5.0.1/test/cases/000077500000000000000000000000001504241257100152625ustar00rootroot00000000000000sugarss-5.0.1/test/cases/all.css000066400000000000000000000005001504241257100165370ustar00rootroot00000000000000a { color: blue } @media (max-width: 400px) { .body { padding: 0 10px } } .page { font-family: 'Open Sans', Arial, serif; /* transform: rotate(90deg) */ background: black } .phone { width: 100px; &_title { width: 500px } } :root { --black: { color: black; background: white } } sugarss-5.0.1/test/cases/all.json000066400000000000000000000174601504241257100167350ustar00rootroot00000000000000{ "raws": { "indent": " ", "after": "\n" }, "type": "root", "nodes": [ { "raws": { "before": "" }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 2, "column": 3, "offset": 4 }, "end": { "line": 2, "column": 14, "offset": 15 } }, "prop": "color", "value": "blue" } ], "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 1, "column": 2, "offset": 1 } }, "selector": "a" }, { "raws": { "before": "\n\n", "afterName": " " }, "type": "atrule", "name": "media", "source": { "start": { "line": 4, "column": 1, "offset": 17 }, "end": { "line": 4, "column": 26, "offset": 42 } }, "params": "(max-width: 400px)", "nodes": [ { "raws": { "before": "\n " }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 6, "column": 5, "offset": 55 }, "end": { "line": 6, "column": 20, "offset": 70 } }, "prop": "padding", "value": "0 10px" } ], "source": { "start": { "line": 5, "column": 3, "offset": 45 }, "end": { "line": 5, "column": 8, "offset": 50 } }, "selector": ".body" } ] }, { "raws": { "before": "\n\n" }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 9, "column": 3, "offset": 80 }, "end": { "line": 9, "column": 41, "offset": 118 } }, "prop": "font-family", "value": "'Open Sans', Arial, serif" }, { "raws": { "before": "\n ", "left": " ", "inlineRight": " " }, "type": "comment", "source": { "start": { "line": 10, "column": 3, "offset": 121 }, "end": { "line": 10, "column": 33, "offset": 151 } }, "text": "transform: rotate(90deg)" }, { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 11, "column": 3, "offset": 154 }, "end": { "line": 11, "column": 20, "offset": 171 } }, "prop": "background", "value": "black" } ], "source": { "start": { "line": 8, "column": 1, "offset": 72 }, "end": { "line": 8, "column": 6, "offset": 77 } }, "selector": ".page" }, { "raws": { "before": "\n\n" }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 14, "column": 3, "offset": 182 }, "end": { "line": 14, "column": 15, "offset": 194 } }, "prop": "width", "value": "100px" }, { "raws": { "before": "\n " }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 16, "column": 5, "offset": 209 }, "end": { "line": 16, "column": 17, "offset": 221 } }, "prop": "width", "value": "500px" } ], "source": { "start": { "line": 15, "column": 3, "offset": 197 }, "end": { "line": 15, "column": 10, "offset": 204 } }, "selector": "&_title" } ], "source": { "start": { "line": 13, "column": 1, "offset": 173 }, "end": { "line": 13, "column": 7, "offset": 179 } }, "selector": ".phone" }, { "raws": { "before": "\n\n" }, "type": "rule", "nodes": [ { "raws": { "before": "\n " }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 20, "column": 5, "offset": 244 }, "end": { "line": 20, "column": 17, "offset": 256 } }, "prop": "color", "value": "black" }, { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 21, "column": 5, "offset": 261 }, "end": { "line": 21, "column": 22, "offset": 278 } }, "prop": "background", "value": "white" } ], "source": { "start": { "line": 19, "column": 3, "offset": 231 }, "end": { "line": 19, "column": 11, "offset": 239 } }, "selector": "--black:" } ], "source": { "start": { "line": 18, "column": 1, "offset": 223 }, "end": { "line": 18, "column": 6, "offset": 228 } }, "selector": ":root" } ], "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 22, "column": 1, "offset": 279 } } } sugarss-5.0.1/test/cases/all.sss000066400000000000000000000004271504241257100165670ustar00rootroot00000000000000a color: blue @media (max-width: 400px) .body padding: 0 10px .page font-family: 'Open Sans', Arial, serif /* transform: rotate(90deg) */ background: black .phone width: 100px &_title width: 500px :root --black: color: black background: white sugarss-5.0.1/test/cases/atrules.css000066400000000000000000000002471504241257100174560ustar00rootroot00000000000000@test; @charset "UTF-8"; @supports (color: black), (background: black) { @media (max-width: /*<=*/ 400px) /* mobile */ { /* write code here */ } } sugarss-5.0.1/test/cases/atrules.json000066400000000000000000000053231504241257100176370ustar00rootroot00000000000000{ "raws": { "indent": " ", "after": "\n" }, "type": "root", "nodes": [ { "raws": { "before": "", "afterName": "" }, "type": "atrule", "name": "test", "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 1, "column": 6, "offset": 5 } }, "params": "" }, { "raws": { "before": "\n\n", "afterName": " " }, "type": "atrule", "name": "charset", "source": { "start": { "line": 3, "column": 1, "offset": 7 }, "end": { "line": 3, "column": 17, "offset": 23 } }, "params": "\"UTF-8\"" }, { "raws": { "before": "\n\n", "afterName": " " }, "type": "atrule", "name": "supports", "source": { "start": { "line": 5, "column": 1, "offset": 25 }, "end": { "line": 6, "column": 30, "offset": 80 } }, "params": "(color: black),\n (background: black)", "nodes": [ { "raws": { "before": "\n ", "afterName": " ", "params": { "value": "(max-width: 400px) ", "raw": "(max-width: /*<=*/ 400px) /* mobile */", "sss": "(max-width: /*<=*/ 400px) // mobile" } }, "type": "atrule", "name": "media", "source": { "start": { "line": 7, "column": 3, "offset": 83 }, "end": { "line": 7, "column": 45, "offset": 125 } }, "params": "(max-width: 400px) ", "nodes": [ { "raws": { "before": "\n ", "inline": true, "left": " ", "inlineRight": "" }, "type": "comment", "source": { "start": { "line": 8, "column": 5, "offset": 130 }, "end": { "line": 8, "column": 23, "offset": 148 } }, "text": "write code here" } ] } ] } ], "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 9, "column": 1, "offset": 149 } } } sugarss-5.0.1/test/cases/atrules.sss000066400000000000000000000002251504241257100174720ustar00rootroot00000000000000@test @charset "UTF-8" @supports (color: black), (background: black) @media (max-width: /*<=*/ 400px) // mobile // write code here sugarss-5.0.1/test/cases/colons.css000066400000000000000000000004711504241257100172730ustar00rootroot00000000000000@custom-selector :--heading h1, h2; .test { margin: { top: 0; left: 0 } font: { size: 16px; weight: 300 } } a:--any-link { color: blue } a:--any-link { &.is-disabled { color: gray } } article :--heading { color: #000 } :root { --red: #F00 } body { color: var(--red) } sugarss-5.0.1/test/cases/colons.json000066400000000000000000000210331504241257100174510ustar00rootroot00000000000000{ "raws": { "indent": " ", "after": "\n" }, "type": "root", "nodes": [ { "raws": { "before": "", "afterName": " " }, "type": "atrule", "name": "custom-selector", "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 1, "column": 35, "offset": 34 } }, "params": ":--heading h1, h2" }, { "raws": { "before": "\n\n" }, "type": "rule", "nodes": [ { "raws": { "before": "\n " }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 5, "column": 5, "offset": 56 }, "end": { "line": 5, "column": 11, "offset": 62 } }, "prop": "top", "value": "0" }, { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 6, "column": 5, "offset": 67 }, "end": { "line": 6, "column": 12, "offset": 74 } }, "prop": "left", "value": "0" } ], "source": { "start": { "line": 4, "column": 3, "offset": 44 }, "end": { "line": 4, "column": 10, "offset": 51 } }, "selector": "margin:" }, { "raws": { "before": "\n " }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 8, "column": 5, "offset": 87 }, "end": { "line": 8, "column": 15, "offset": 97 } }, "prop": "size", "value": "16px" }, { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 9, "column": 5, "offset": 102 }, "end": { "line": 9, "column": 16, "offset": 113 } }, "prop": "weight", "value": "300" } ], "source": { "start": { "line": 7, "column": 3, "offset": 77 }, "end": { "line": 7, "column": 8, "offset": 82 } }, "selector": "font:" } ], "source": { "start": { "line": 3, "column": 1, "offset": 36 }, "end": { "line": 3, "column": 6, "offset": 41 } }, "selector": ".test" }, { "raws": { "before": "\n\n" }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 12, "column": 3, "offset": 130 }, "end": { "line": 12, "column": 14, "offset": 141 } }, "prop": "color", "value": "blue" } ], "source": { "start": { "line": 11, "column": 1, "offset": 115 }, "end": { "line": 11, "column": 13, "offset": 127 } }, "selector": "a:--any-link" }, { "raws": { "before": "\n" }, "type": "rule", "nodes": [ { "raws": { "before": "\n " }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 15, "column": 5, "offset": 175 }, "end": { "line": 15, "column": 16, "offset": 186 } }, "prop": "color", "value": "gray" } ], "source": { "start": { "line": 14, "column": 3, "offset": 157 }, "end": { "line": 14, "column": 16, "offset": 170 } }, "selector": "&.is-disabled" } ], "source": { "start": { "line": 13, "column": 1, "offset": 142 }, "end": { "line": 13, "column": 13, "offset": 154 } }, "selector": "a:--any-link" }, { "raws": { "before": "\n\n" }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 18, "column": 3, "offset": 209 }, "end": { "line": 18, "column": 14, "offset": 220 } }, "prop": "color", "value": "#000" } ], "source": { "start": { "line": 17, "column": 1, "offset": 188 }, "end": { "line": 17, "column": 19, "offset": 206 } }, "selector": "article :--heading" }, { "raws": { "before": "\n\n" }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 21, "column": 3, "offset": 230 }, "end": { "line": 21, "column": 14, "offset": 241 } }, "prop": "--red", "value": "#F00" } ], "source": { "start": { "line": 20, "column": 1, "offset": 222 }, "end": { "line": 20, "column": 6, "offset": 227 } }, "selector": ":root" }, { "raws": { "before": "\n\n" }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 24, "column": 3, "offset": 250 }, "end": { "line": 24, "column": 20, "offset": 267 } }, "prop": "color", "value": "var(--red)" } ], "source": { "start": { "line": 23, "column": 1, "offset": 243 }, "end": { "line": 23, "column": 5, "offset": 247 } }, "selector": "body" } ], "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 25, "column": 1, "offset": 268 } } } sugarss-5.0.1/test/cases/colons.sss000066400000000000000000000004141504241257100173100ustar00rootroot00000000000000@custom-selector :--heading h1, h2 .test margin: top: 0 left: 0 font: size: 16px weight: 300 a:--any-link color: blue a:--any-link &.is-disabled color: gray article :--heading color: #000 :root --red: #F00 body color: var(--red) sugarss-5.0.1/test/cases/comments.css000066400000000000000000000001551504241257100176220ustar00rootroot00000000000000/* multi line */ /* inline */ a { color: black; /* last */ z-index: 1 } /* a */ /* color: black */ sugarss-5.0.1/test/cases/comments.json000066400000000000000000000070541504241257100200100ustar00rootroot00000000000000{ "raws": { "indent": " ", "after": "\n" }, "type": "root", "nodes": [ { "raws": { "before": "", "left": " ", "inlineRight": " " }, "type": "comment", "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 2, "column": 11, "offset": 19 } }, "text": "multi\n line" }, { "raws": { "before": "\n", "inline": true, "left": " ", "inlineRight": "" }, "type": "comment", "source": { "start": { "line": 3, "column": 1, "offset": 20 }, "end": { "line": 3, "column": 10, "offset": 29 } }, "text": "inline" }, { "raws": { "before": "\n" }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 5, "column": 3, "offset": 34 }, "end": { "line": 5, "column": 15, "offset": 46 } }, "prop": "color", "value": "black" }, { "raws": { "before": " ", "inline": true, "left": " ", "inlineRight": "" }, "type": "comment", "source": { "start": { "line": 5, "column": 16, "offset": 47 }, "end": { "line": 5, "column": 23, "offset": 54 } }, "text": "last" }, { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 6, "column": 3, "offset": 57 }, "end": { "line": 6, "column": 13, "offset": 67 } }, "prop": "z-index", "value": "1" } ], "source": { "start": { "line": 4, "column": 1, "offset": 30 }, "end": { "line": 4, "column": 2, "offset": 31 } }, "selector": "a" }, { "raws": { "before": "\n\n", "inline": true, "left": " ", "inlineRight": "" }, "type": "comment", "source": { "start": { "line": 8, "column": 1, "offset": 69 }, "end": { "line": 8, "column": 5, "offset": 73 } }, "text": "a" }, { "raws": { "before": "\n ", "extraIndent": " ", "inline": true, "left": " ", "inlineRight": "" }, "type": "comment", "source": { "start": { "line": 9, "column": 3, "offset": 76 }, "end": { "line": 9, "column": 18, "offset": 91 } }, "text": "color: black" } ], "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 10, "column": 1, "offset": 92 } } } sugarss-5.0.1/test/cases/comments.sss000066400000000000000000000001341504241257100176370ustar00rootroot00000000000000/* multi line */ // inline a color: black // last z-index: 1 // a // color: black sugarss-5.0.1/test/cases/decls.css000066400000000000000000000002541504241257100170670ustar00rootroot00000000000000color: black; background: linear-gradient(white, black), linear-gradient(black, white); box-shadow: 1px solid black, 10px solid red; $(var)-color: black sugarss-5.0.1/test/cases/decls.json000066400000000000000000000035061504241257100172530ustar00rootroot00000000000000{ "raws": { "after": "\n" }, "type": "root", "nodes": [ { "raws": { "before": "", "between": ": " }, "type": "decl", "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 1, "column": 13, "offset": 12 } }, "prop": "color", "value": "black" }, { "raws": { "before": "\n\n", "between": ": " }, "type": "decl", "source": { "start": { "line": 3, "column": 1, "offset": 14 }, "end": { "line": 4, "column": 42, "offset": 98 } }, "prop": "background", "value": "linear-gradient(white, black),\n linear-gradient(black, white)" }, { "raws": { "before": "\n\n", "between": ":\n " }, "type": "decl", "source": { "start": { "line": 6, "column": 1, "offset": 100 }, "end": { "line": 8, "column": 17, "offset": 147 } }, "prop": "box-shadow", "value": "1px solid black,\n 10px solid red" }, { "raws": { "before": "\n\n", "between": ": " }, "type": "decl", "source": { "start": { "line": 10, "column": 1, "offset": 149 }, "end": { "line": 10, "column": 20, "offset": 168 } }, "prop": "$(var)-color", "value": "black" } ], "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 11, "column": 1, "offset": 169 } } } sugarss-5.0.1/test/cases/decls.sss000066400000000000000000000002511504241257100171040ustar00rootroot00000000000000color: black background: linear-gradient(white, black), linear-gradient(black, white) box-shadow: 1px solid black, 10px solid red $(var)-color: black sugarss-5.0.1/test/cases/empty.css000066400000000000000000000000061504241257100171260ustar00rootroot00000000000000/* */ sugarss-5.0.1/test/cases/empty.json000066400000000000000000000011651504241257100173160ustar00rootroot00000000000000{ "raws": { "after": "\n" }, "type": "root", "nodes": [ { "raws": { "before": "", "inline": true, "left": "", "inlineRight": "" }, "type": "comment", "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 1, "column": 3, "offset": 2 } }, "text": "" } ], "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 2, "column": 1, "offset": 3 } } } sugarss-5.0.1/test/cases/empty.sss000066400000000000000000000000031504241257100171430ustar00rootroot00000000000000// sugarss-5.0.1/test/cases/important.css000066400000000000000000000000571504241257100200130ustar00rootroot00000000000000long: black !important; short: black!important sugarss-5.0.1/test/cases/important.json000066400000000000000000000021211504241257100201660ustar00rootroot00000000000000{ "raws": { "after": "\n" }, "type": "root", "nodes": [ { "raws": { "before": "", "important": " !important", "between": ": " }, "type": "decl", "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 1, "column": 12, "offset": 11 } }, "prop": "long", "important": true, "value": "black" }, { "raws": { "before": "\n", "important": "!important", "between": ": " }, "type": "decl", "source": { "start": { "line": 2, "column": 1, "offset": 23 }, "end": { "line": 2, "column": 13, "offset": 35 } }, "prop": "short", "important": true, "value": "black" } ], "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 3, "column": 1, "offset": 46 } } } sugarss-5.0.1/test/cases/important.sss000066400000000000000000000000561504241257100200320ustar00rootroot00000000000000long: black !important short: black!important sugarss-5.0.1/test/cases/rules.css000066400000000000000000000002441504241257100171260ustar00rootroot00000000000000a { b { color: black } } a, b { color: black } a /* -> */ b /* go down */ em { color: black } font: { family: serif } [attr=;] { color: black } sugarss-5.0.1/test/cases/rules.json000066400000000000000000000116401504241257100173110ustar00rootroot00000000000000{ "raws": { "indent": " ", "after": "\n" }, "type": "root", "nodes": [ { "raws": { "before": "" }, "type": "rule", "nodes": [ { "raws": { "before": "\n " }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 3, "column": 5, "offset": 10 }, "end": { "line": 3, "column": 17, "offset": 22 } }, "prop": "color", "value": "black" } ], "source": { "start": { "line": 2, "column": 3, "offset": 4 }, "end": { "line": 2, "column": 4, "offset": 5 } }, "selector": "b" } ], "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 1, "column": 2, "offset": 1 } }, "selector": "a" }, { "raws": { "before": "\n\n" }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 7, "column": 3, "offset": 31 }, "end": { "line": 7, "column": 15, "offset": 43 } }, "prop": "color", "value": "black" } ], "source": { "start": { "line": 5, "column": 1, "offset": 24 }, "end": { "line": 6, "column": 2, "offset": 28 } }, "selector": "a,\nb" }, { "raws": { "before": "\n\n", "selector": { "value": "a b \nem", "raw": "a /* -> */ b /* go down */\nem", "sss": "a /* -> */ b // go down\nem" } }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 11, "column": 3, "offset": 74 }, "end": { "line": 11, "column": 15, "offset": 86 } }, "prop": "color", "value": "black" } ], "source": { "start": { "line": 9, "column": 1, "offset": 45 }, "end": { "line": 10, "column": 3, "offset": 71 } }, "selector": "a b \nem" }, { "raws": { "before": "\n\n" }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 14, "column": 3, "offset": 96 }, "end": { "line": 14, "column": 16, "offset": 109 } }, "prop": "family", "value": "serif" } ], "source": { "start": { "line": 13, "column": 1, "offset": 88 }, "end": { "line": 13, "column": 6, "offset": 93 } }, "selector": "font:" }, { "raws": { "before": "\n\n" }, "type": "rule", "nodes": [ { "raws": { "before": "\n ", "between": ": " }, "type": "decl", "source": { "start": { "line": 17, "column": 3, "offset": 122 }, "end": { "line": 17, "column": 15, "offset": 134 } }, "prop": "color", "value": "black" } ], "source": { "start": { "line": 16, "column": 1, "offset": 111 }, "end": { "line": 16, "column": 9, "offset": 119 } }, "selector": "[attr=;]" } ], "source": { "start": { "line": 1, "column": 1, "offset": 0 }, "end": { "line": 18, "column": 1, "offset": 135 } } } sugarss-5.0.1/test/cases/rules.sss000066400000000000000000000002071504241257100171450ustar00rootroot00000000000000a b color: black a, b color: black a /* -> */ b // go down em color: black font: family: serif [attr=;] color: black sugarss-5.0.1/test/liner.test.js000066400000000000000000000011261504241257100166110ustar00rootroot00000000000000let { deepStrictEqual } = require('node:assert') let { test } = require('node:test') let liner = require('../liner') test('packs tokens by lines', () => { let tokens = [ ['word', 'a'], ['newline', '\n'], ['word', 'b'] ] deepStrictEqual(liner(tokens), [ [ ['word', 'a'], ['newline', '\n'] ], [['word', 'b']] ]) }) test('ignores newline inside brackets', () => { let tokens = [ ['(', '('], ['newline', '\n'], [')', ')'] ] deepStrictEqual(liner(tokens), [ [ ['(', '('], ['newline', '\n'], [')', ')'] ] ]) }) sugarss-5.0.1/test/parse.test.js000066400000000000000000000063731504241257100166230ustar00rootroot00000000000000let { deepStrictEqual, equal, throws } = require('node:assert') let { readdirSync, readFileSync } = require('node:fs') let { extname, join } = require('node:path') let { test } = require('node:test') let { jsonify } = require('postcss-parser-tests') let parse = require('../parse') test('detects indent', () => { let root = parse('@one\n @two\n @three') equal(root.raws.indent, ' ') }) test('throws on first indent', () => { throws(() => { parse(' @charset "UTF-8"') }, /:1:3: First line should not have indent/) }) test('throws on too big indent', () => { throws(() => { parse('@supports\n @media\n // test') }, /:3:7: Expected 4 indent, but get 6/) }) test('throws on wrong indent step', () => { throws(() => { parse('@supports\n @media\n @media') }, /:3:2: Expected 0 or 2 indent, but get 1/) }) test('throws on decl without property', () => { throws(() => { parse(': black') }, /:1:1: Declaration without name/) }) test('throws on space between property', () => { throws(() => { parse('one two: black') }, /:1:5: Unexpected separator in property/) }) test('throws on semicolon in declaration', () => { throws(() => { parse('a\n color: black;') }, /:2:15: Unnecessary semicolon/) }) test('throws on semicolon in at-rule', () => { throws(() => { parse('@charset "UTF-8";') }, /:1:17: Unnecessary semicolon/) }) test('throws on curly in rule', () => { throws(() => { parse('a {\n color: black') }, /:1:3: Unnecessary curly bracket/) }) test('throws on curly in at-rule', () => { throws(() => { parse('@media (screen) {\n color: black') }, /:1:17: Unnecessary curly bracket/) }) test('keeps trailing spaces', () => { let root = parse('@media s \n a\n b \n a : \n b \n// a \n \n') equal(root.raws.after, '\n \n') equal(root.first.raws.sssBetween, ' ') equal(root.first.raws.afterName, ' ') equal(root.first.first.raws.sssBetween, ' ') equal(root.first.first.first.raws.between, ' : \n ') equal(root.first.first.first.raws.value.raw, 'b ') equal(root.last.raws.left, ' ') equal(root.last.raws.inlineRight, ' ') }) test('supports files without last new line', () => { equal(parse('color: black').raws.after, '') }) test('keeps last new line', () => { equal(parse('color: black\n').raws.after, '\n') }) test('generates correct source maps on trailing spaces', () => { equal(parse('a: 1 ').first.source.end.line, 1) }) test('sets end position for root', () => { deepStrictEqual(parse('a\n b: 1\n').source.end, { column: 1, line: 3, offset: 9 }) }) let tests = readdirSync(join(__dirname, 'cases')).filter( i => extname(i) === '.sss' ) function read(file) { return readFileSync(join(__dirname, 'cases', file)).toString() } for (let name of tests) { test('parses ' + name, () => { let sss = read(name) let css = read(name.replace(/\.sss/, '.css')) let json = read(name.replace(/\.sss/, '.json')) let root = parse(sss, { from: name }) let result = root.toResult({ map: { annotation: false, inline: false } }) equal(result.css, css) deepStrictEqual(jsonify(root), JSON.parse(json.trim())) }) } sugarss-5.0.1/test/preprocess.test.js000066400000000000000000000145341504241257100176740ustar00rootroot00000000000000let { deepStrictEqual, throws } = require('node:assert') let { test } = require('node:test') let { Input } = require('postcss') let preprocess = require('../preprocess') function run(lines, result) { deepStrictEqual(preprocess(new Input(''), lines), result) } let defaults = { atrule: false, before: '', colon: false, comment: false, indent: '', lastComma: false, number: 1 } let end = { before: '', end: true } test('cleans from lines', () => { run( [ [['newline', '\n', 1]], [ ['space', ' '], ['newline', '\n', 2] ], [ ['word', 'a'], ['newline', '\n', 3] ], [ ['space', ' '], ['newline', '\n', 4] ] ], [ { ...defaults, before: '\n \n', number: 3, tokens: [['word', 'a']] }, { ...end, before: '\n \n' } ] ) }) test('separates indent = require(other tokens', () => { run( [ [ ['space', ' '], ['word', 'ab'] ] ], [ { ...defaults, indent: ' ', tokens: [['word', 'ab']] }, end ] ) }) test('works with indentless strings', () => { run( [[['word', 'ab']]], [ { ...defaults, indent: '', tokens: [['word', 'ab']] }, end ] ) }) test('collects line number', () => { run( [ [ ['word', 'a'], ['newline', '\n', 1] ], [ ['word', 'b'], ['newline', '\n', 2] ] ], [ { ...defaults, number: 1, tokens: [['word', 'a']] }, { ...defaults, before: '\n', number: 2, tokens: [['word', 'b']] }, { ...end, before: '\n' } ] ) }) test('detects at-rules', () => { run( [ [ ['at-word', '@ab'], ['space', ' '] ] ], [ { ...defaults, atrule: true, tokens: [ ['at-word', '@ab'], ['space', ' '] ] }, end ] ) }) test('detects last comma', () => { run( [ [ ['word', 'ab'], [',', ','], ['newline', '\n'] ] ], [ { ...defaults, lastComma: true, tokens: [ ['word', 'ab'], [',', ','] ] }, { ...end, before: '\n' } ] ) }) test('detects last comma with trailing spaces', () => { run( [ [ ['word', 'ab'], [',', ','], ['space', ' '] ] ], [ { ...defaults, lastComma: true, tokens: [ ['word', 'ab'], [',', ','], ['space', ' '] ] }, end ] ) }) test('detects last comma with trailing comment', () => { run( [ [ ['word', 'ab'], [',', ','], ['comment', '// a'] ] ], [ { ...defaults, lastComma: true, tokens: [ ['word', 'ab'], [',', ','], ['comment', '// a'] ] }, end ] ) }) test('ignore comma inside', () => { run( [ [ ['word', 'ab'], [',', ','], ['word', 'ba'] ] ], [ { ...defaults, lastComma: false, tokens: [ ['word', 'ab'], [',', ','], ['word', 'ba'] ] }, end ] ) }) test('detects colon with space', () => { run( [ [ ['word', 'ab'], [':', ':'], ['space', ' '] ] ], [ { ...defaults, colon: true, tokens: [ ['word', 'ab'], [':', ':'], ['space', ' '] ] }, end ] ) }) test('detects colon with newline', () => { run( [ [ ['word', 'ab'], [':', ':'], ['newline', '\n'] ] ], [ { ...defaults, colon: true, tokens: [ ['word', 'ab'], [':', ':'] ] }, { ...end, before: '\n' } ] ) }) test('ignores colon without space', () => { run( [ [ ['word', 'ab'], [':', ':'], ['word', 'ba'] ] ], [ { ...defaults, colon: false, tokens: [ ['word', 'ab'], [':', ':'], ['word', 'ba'] ] }, end ] ) }) test('ignores colon inside brackets', () => { run( [ [ ['(', '('], [':', ':'], ['space', ' '], [')', ')'] ] ], [ { ...defaults, colon: false, tokens: [ ['(', '('], [':', ':'], ['space', ' '], [')', ')'] ] }, end ] ) }) test('closes brackets', () => { run( [ [ ['(', '('], [')', ')'], [':', ':'], ['space', ' '] ] ], [ { ...defaults, colon: true, tokens: [ ['(', '('], [')', ')'], [':', ':'], ['space', ' '] ] }, end ] ) }) test('detects comments', () => { run( [[['comment', '// a']]], [ { ...defaults, comment: true, tokens: [['comment', '// a']] }, end ] ) }) test('detects mixed tabs and spaces in indent', () => { throws(() => { preprocess(new Input(''), [ [ ['space', '\t '], ['word', 'ab'] ] ]) }, /:1:2: Mixed tabs and spaces are not allowed/) }) test('detects mixed tabs and spaces in indents', () => { throws(() => { preprocess(new Input(''), [ [ ['space', ' '], ['newline', '\n', 1] ], [ ['space', '\t'], ['word', 'ab'] ] ]) }, /:2:1: Mixed tabs and spaces are not allowed/) }) test('shows correct error position', () => { throws(() => { preprocess(new Input(''), [ [ ['comment', '/*\n*/'], ['newline', '\n', 2] ], [ ['space', '\t'], ['word', 'ab'], ['newline', '\n', 3] ], [ ['space', '\t '], ['word', 'ab'], ['newline', '\n', 4] ] ]) }, /:4:2: Mixed tabs and spaces are not allowed/) }) sugarss-5.0.1/test/stringify.test.js000066400000000000000000000013141504241257100175150ustar00rootroot00000000000000let { equal } = require('node:assert') let { readdirSync, readFileSync } = require('node:fs') let { extname, join } = require('node:path') let { test } = require('node:test') let parse = require('../parse') let stringify = require('../stringify') let tests = readdirSync(join(__dirname, 'cases')).filter( i => extname(i) === '.sss' ) function read(file) { return readFileSync(join(__dirname, 'cases', file)).toString() } function run(sss) { let root = parse(sss) let output = '' stringify(root, i => { output += i }) equal(sss, output) } test('saves newlines', () => { run('a\r\n color: black') }) for (let name of tests) { test('stringifies ' + name, () => { run(read(name)) }) } sugarss-5.0.1/test/sugarss.test.js000066400000000000000000000004051504241257100171660ustar00rootroot00000000000000let { equal } = require('node:assert') let { test } = require('node:test') let sugarss = require('../') test('has parse()', () => { equal(typeof sugarss.parse, 'function') }) test('has stringify()', () => { equal(typeof sugarss.stringify, 'function') }) sugarss-5.0.1/test/tokenize.test.js000066400000000000000000000037211504241257100173330ustar00rootroot00000000000000let { deepStrictEqual } = require('node:assert') let { test } = require('node:test') let { Input } = require('postcss') let tokenize = require('../tokenize') function run(css, expectedTokens) { let tokens = tokenize(new Input(css)) deepStrictEqual(tokens, expectedTokens) } test('tokenizes inline comments', () => { run('// a', [['comment', '// a', 0, 4, 'inline']]) }) test('tokenizes inline comments and new lines', () => { run('// a\r\n', [ ['comment', '// a', 0, 4, 'inline'], ['newline', '\r\n', 4, 6] ]) }) test('tokenizes new lines around spaces', () => { run(' \n ', [ ['space', ' ', 0, 1], ['newline', '\n', 1, 2], ['space', ' ', 2, 3] ]) }) test('tokenizes Windows new lines', () => { run('\r\n', [['newline', '\r\n', 0, 2]]) }) test('tokenizes single carriage return', () => { run('\ra', [ ['newline', '\r', 0, 1], ['word', 'a', 1, 2] ]) }) test('tokenizes last carriage return', () => { run('\r', [['newline', '\r', 0, 1]]) }) test('tokenizes comma', () => { run('a,b', [ ['word', 'a', 0, 1], [',', ',', 1, 2], ['word', 'b', 2, 3] ]) }) test('escapes control symbols', () => { run('\\(\\{\\"\\@\\\\""', [ ['word', '\\(', 0, 2], ['word', '\\{', 2, 4], ['word', '\\"', 4, 6], ['word', '\\@', 6, 8], ['word', '\\\\', 8, 10], ['string', '""', 10, 12] ]) }) test('escapes new line', () => { run('\\\n\\\r\\\r\n\\\f\\\\\n', [ ['word', '\\\n', 0, 2], ['word', '\\\r', 2, 4], ['word', '\\\r\n', 4, 7], ['word', '\\\f', 7, 9], ['word', '\\\\', 9, 11], ['newline', '\n', 11, 12] ]) }) test('tokenizes close curly brace', () => { run('a { color: black; }', [ ['word', 'a', 0, 1], ['space', ' ', 1, 2], ['{', '{', 2, 3], ['space', ' ', 3, 4], ['word', 'color', 4, 9], [':', ':', 9, 10], ['space', ' ', 10, 11], ['word', 'black', 11, 16], [';', ';', 16, 17], ['space', ' ', 17, 18], ['}', '}', 18, 19] ]) }) test.run() sugarss-5.0.1/test/update-cases.js000077500000000000000000000012211504241257100170770ustar00rootroot00000000000000#!/usr/bin/env node let { readdirSync, readFileSync, writeFileSync } = require('node:fs') let { extname, join } = require('node:path') let { jsonify } = require('postcss-parser-tests') let parse = require('../parse') let dir = join(__dirname, 'cases') readdirSync(dir) .filter(i => extname(i) === '.sss') .forEach(name => { let sssFile = join(dir, name) let cssFile = sssFile.replace(/\.sss/, '.css') let jsonFile = sssFile.replace(/\.sss/, '.json') let sss = readFileSync(sssFile).toString() let root = parse(sss, { from: name }) writeFileSync(cssFile, root.toString()) writeFileSync(jsonFile, jsonify(root) + '\n') }) sugarss-5.0.1/tokenize.js000066400000000000000000000156411504241257100154020ustar00rootroot00000000000000const SINGLE_QUOTE = "'".charCodeAt(0) const DOUBLE_QUOTE = '"'.charCodeAt(0) const BACKSLASH = '\\'.charCodeAt(0) const SLASH = '/'.charCodeAt(0) const NEWLINE = '\n'.charCodeAt(0) const SPACE = ' '.charCodeAt(0) const FEED = '\f'.charCodeAt(0) const TAB = '\t'.charCodeAt(0) const CR = '\r'.charCodeAt(0) const OPEN_PARENTHESES = '('.charCodeAt(0) const CLOSE_PARENTHESES = ')'.charCodeAt(0) const OPEN_CURLY = '{'.charCodeAt(0) const CLOSE_CURLY = '}'.charCodeAt(0) const SEMICOLON = ';'.charCodeAt(0) const ASTERICK = '*'.charCodeAt(0) const COLON = ':'.charCodeAt(0) const AT = '@'.charCodeAt(0) const COMMA = ','.charCodeAt(0) const RE_AT_END = /[\t\n\f\r "'()/;\\{]/g const RE_NEW_LINE = /[\n\f\r]/g const RE_WORD_END = /[\t\n\f\r !"'(),:;@\\{}]|\/(?=\*)/g const RE_BAD_BRACKET = /.[\n"'(/\\]/ module.exports = function tokenize(input) { let tokens = [] let css = input.css.valueOf() let code, content, escape, escaped, escapePos, n, next, prev, quote let length = css.length let offset = 0 let pos = 0 function unclosed(what) { throw input.error('Unclosed ' + what, pos) } while (pos < length) { code = css.charCodeAt(pos) switch (code) { case CR: if (css.charCodeAt(pos + 1) === NEWLINE) { tokens.push(['newline', '\r\n', offset, offset + 2]) offset += 2 pos += 1 } else { tokens.push(['newline', '\r', offset, offset + 1]) offset++ } break case NEWLINE: case FEED: tokens.push(['newline', css.slice(pos, pos + 1), offset, offset + 1]) offset++ break case SPACE: case TAB: next = pos do { next += 1 code = css.charCodeAt(next) } while (code === SPACE || code === TAB) tokens.push([ 'space', css.slice(pos, next), offset, offset + (next - pos) ]) offset += next - pos pos = next - 1 break case OPEN_CURLY: tokens.push(['{', '{', offset, offset + 1]) offset++ break case CLOSE_CURLY: tokens.push(['}', '}', offset, offset + 1]) offset++ break case COLON: tokens.push([':', ':', offset, offset + 1]) offset++ break case SEMICOLON: tokens.push([';', ';', offset, offset + 1]) offset++ break case COMMA: tokens.push([',', ',', offset, offset + 1]) offset++ break case OPEN_PARENTHESES: prev = tokens.length ? tokens[tokens.length - 1][1] : '' n = css.charCodeAt(pos + 1) if ( prev === 'url' && n !== SINGLE_QUOTE && n !== DOUBLE_QUOTE && n !== SPACE && n !== NEWLINE && n !== TAB && n !== FEED && n !== CR ) { next = pos do { escaped = false next = css.indexOf(')', next + 1) if (next === -1) unclosed('bracket') escapePos = next while (css.charCodeAt(escapePos - 1) === BACKSLASH) { escapePos -= 1 escaped = !escaped } } while (escaped) tokens.push(['brackets', css.slice(pos, next + 1), offset, next + 1]) offset = next + 1 pos = next } else { next = css.indexOf(')', pos + 1) content = css.slice(pos, next + 1) if (next === -1 || RE_BAD_BRACKET.test(content)) { tokens.push(['(', '(', offset, offset + 1]) offset++ } else { tokens.push(['brackets', content, offset, next + 1]) offset = next + 1 pos = next } } break case CLOSE_PARENTHESES: tokens.push([')', ')', offset, offset + 1]) offset++ break case SINGLE_QUOTE: case DOUBLE_QUOTE: quote = code === SINGLE_QUOTE ? "'" : '"' next = pos do { escaped = false next = css.indexOf(quote, next + 1) if (next === -1) unclosed('quote') escapePos = next while (css.charCodeAt(escapePos - 1) === BACKSLASH) { escapePos -= 1 escaped = !escaped } } while (escaped) content = css.slice(pos, next + 1) tokens.push(['string', content, offset, offset + content.length]) offset += content.length pos = next break case AT: RE_AT_END.lastIndex = pos + 1 RE_AT_END.test(css) if (RE_AT_END.lastIndex === 0) { next = css.length - 1 } else { next = RE_AT_END.lastIndex - 2 } tokens.push([ 'at-word', css.slice(pos, next + 1), offset, offset + (next - pos + 1) ]) offset += next - pos + 1 pos = next break case BACKSLASH: next = pos escape = true while (css.charCodeAt(next + 1) === BACKSLASH) { next += 1 escape = !escape } code = css.charCodeAt(next + 1) if (escape) { if (code === CR && css.charCodeAt(next + 2) === NEWLINE) { next += 2 } else if (code === CR || code === NEWLINE || code === FEED) { next += 1 } else { next += 1 } } tokens.push([ 'word', css.slice(pos, next + 1), offset, offset + (next - pos + 1) ]) offset += next - pos + 1 pos = next break default: n = css.charCodeAt(pos + 1) if (code === SLASH && n === ASTERICK) { next = css.indexOf('*/', pos + 2) + 1 if (next === 0) unclosed('comment') content = css.slice(pos, next + 1) tokens.push(['comment', content, offset, offset + content.length]) offset += content.length pos = next } else if (code === SLASH && n === SLASH) { RE_NEW_LINE.lastIndex = pos + 1 RE_NEW_LINE.test(css) if (RE_NEW_LINE.lastIndex === 0) { next = css.length - 1 } else { next = RE_NEW_LINE.lastIndex - 2 } content = css.slice(pos, next + 1) tokens.push([ 'comment', content, offset, offset + content.length, 'inline' ]) offset += content.length pos = next } else { RE_WORD_END.lastIndex = pos + 1 RE_WORD_END.test(css) if (RE_WORD_END.lastIndex === 0) { next = css.length - 1 } else { next = RE_WORD_END.lastIndex - 2 } content = css.slice(pos, next + 1) tokens.push(['word', content, offset, offset + content.length]) offset += content.length pos = next } break } pos++ } return tokens }