diff --git a/examples/eslint/collision.html b/examples/eslint/collision.html new file mode 100644 index 000000000..53cc167fc --- /dev/null +++ b/examples/eslint/collision.html @@ -0,0 +1,5 @@ + +
+ ... +
+ diff --git a/packages/eslint-config/index.js b/packages/eslint-config/index.js index f625891b1..5ea548efd 100644 --- a/packages/eslint-config/index.js +++ b/packages/eslint-config/index.js @@ -2,7 +2,8 @@ module.exports = { plugins: ['@master/css'], rules: { '@master/css/class-order': 'warn', - '@master/css/class-validation': 'error' + '@master/css/class-validation': 'error', + '@master/css/class-collision': 'warn' }, parserOptions: { ecmaFeatures: { diff --git a/packages/eslint-plugin/lib/rules/class-collision.js b/packages/eslint-plugin/lib/rules/class-collision.js new file mode 100644 index 000000000..e42c266a8 --- /dev/null +++ b/packages/eslint-plugin/lib/rules/class-collision.js @@ -0,0 +1,105 @@ + +const astUtil = require('../utils/ast') +const defineVisitors = require('../utils/define-visitors') +const resolveContext = require('../utils/resolve-context') +const { createValidRules } = require('@master/css-validator') +const CssTree = require('css-tree') + +module.exports = { + meta: { + docs: { + description: 'Avoid declaring the identical CSS property repeatedly', + category: 'Stylistic Issues', + recommended: false, + url: 'https://beta.css.master.co/docs/code-linting#avoid-declaring-the-identical-css-property-repeatedly', + }, + messages: { + collisionClass: '{{message}}', + }, + fixable: 'code' + }, + create: function (context) { + const { options, settings, config } = resolveContext(context) + const visitNode = (node, arg = null) => { + astUtil.parseNodeRecursive( + node, + arg, + (classNames, node, originalClassNamesValue, start, end) => { + const sourceCode = context.getSourceCode() + const sourceCodeLines = sourceCode.lines + const nodeStartLine = node.loc.start.line + const nodeEndLine = node.loc.end.line + + const parsedRules = classNames + .map(x => createValidRules(x, { config })) + .map(rules => { + if (rules.length) { + const ruleAst = CssTree.parse(rules[0].text, { parseValue: false }) + const ruleStyles = [] + CssTree.walk(ruleAst, (cssNode) => { + if (cssNode.type === "Declaration") { + ruleStyles.push({ + key: cssNode.property, + value: cssNode.value.value + }) + } + }) + + return { + selector: Object.values(rules[0].vendorSuffixSelectors ?? {})?.[0]?.[0], + mediaToken: rules[0].media?.token, + styles: ruleStyles + } + } + return null + }) + + for (let i = 0; i < classNames.length ; i++) { + const className = classNames[i] + const parsedRule = parsedRules[i] + const conflicts = [] + + if (parsedRule && parsedRule.styles.length === 1) { + for (let j = 0; j < classNames.length; j++) { + const compareClassName = classNames[j] + const compareRule = parsedRules[j] + if (i !== j && compareRule && compareRule.styles.length === 1 + && parsedRule.selector == compareRule.selector + && parsedRule.mediaToken == compareRule.mediaToken + && parsedRule.styles[0].key == compareRule.styles[0].key + ) { + conflicts.push(compareClassName) + } + } + + if (conflicts.length > 0) { + const conflictClassNamesMsg = conflicts.map(x => `\`${x}\``).join(' and ') + let fixClassNames = originalClassNamesValue + for (const conflictClassName of conflicts){ + const regexSafe = conflictClassName.replace(/(\\|\.|\(|\)|\[|\]|\{|\}|\+|\*|\?|\^|\$|\||\/)/g, '\\$1') + fixClassNames = fixClassNames.replace(new RegExp(`\\s+${regexSafe}|${regexSafe}\\s+`), '') + } + + context.report({ + loc: astUtil.findLoc(className, sourceCodeLines, nodeStartLine, nodeEndLine), + messageId: 'collisionClass', + data: { + message: `\`${className}\` applies the same CSS declarations as ${conflictClassNamesMsg}. + `, + }, + fix: function (fixer) { + return fixer.replaceTextRange([start, end], fixClassNames) + } + }) + } + } + } + }, + false, + false, + settings.ignoredKeys + ) + } + return defineVisitors({ context, options, settings, config }, visitNode) + }, +} diff --git a/packages/eslint-plugin/lib/rules/class-validation.js b/packages/eslint-plugin/lib/rules/class-validation.js index 8182514a1..17b080b9b 100644 --- a/packages/eslint-plugin/lib/rules/class-validation.js +++ b/packages/eslint-plugin/lib/rules/class-validation.js @@ -47,6 +47,9 @@ module.exports = { messageId: 'disallowTraditionalClass', data: { message: `Disallow a traditional class \`${className}\`.`, + }, + fix: function (fixer) { + return fixer.replaceTextRange([start, end], '') } }) } diff --git a/packages/eslint-plugin/lib/utils/ast.js b/packages/eslint-plugin/lib/utils/ast.js index 997ad512b..1e8f859c7 100644 --- a/packages/eslint-plugin/lib/utils/ast.js +++ b/packages/eslint-plugin/lib/utils/ast.js @@ -78,6 +78,12 @@ function parseNodeRecursive(rootNode, childNode, cb, skipConditional = false, is // TODO allow vue non litteral let originalClassNamesValue let classNames + + let start = null + let end = null + let prefix = '' + let suffix = '' + if (childNode === null) { originalClassNamesValue = extractValueFromNode(rootNode); ({ classNames } = extractClassnamesFromValue(originalClassNamesValue)) @@ -86,13 +92,22 @@ function parseNodeRecursive(rootNode, childNode, cb, skipConditional = false, is // Don't run for empty className return } - cb(classNames, rootNode) + const range = extractRangeFromNode(rootNode) + if (rootNode.type === 'TextAttribute') { + start = range[0] + end = range[1] + } else { + start = range[0] + 1 + end = range[1] - 1 + } + cb(classNames, rootNode, originalClassNamesValue, start, end, prefix, suffix) } else if (childNode === undefined) { // Ignore invalid child candidates (probably inside complex TemplateLiteral) return } else { const forceIsolation = skipConditional ? true : isolate let trim = false + switch (childNode.type) { case 'TemplateLiteral': childNode.expressions.forEach((exp) => { @@ -144,9 +159,21 @@ function parseNodeRecursive(rootNode, childNode, cb, skipConditional = false, is case 'Literal': trim = true originalClassNamesValue = childNode.value + start = childNode.range[0] + 1 + end = childNode.range[1] - 1 + break + case 'SvelteLiteral': + originalClassNamesValue = childNode.value + start = childNode.range[0] + end = childNode.range[1] break case 'TemplateElement': originalClassNamesValue = childNode.value.raw + start = childNode.range[0] + end = childNode.range[1] + const txt = context.getSourceCode().getText(childNode) + prefix = astUtil.getTemplateElementPrefix(txt, originalClassNamesValue) + suffix = astUtil.getTemplateElementSuffix(txt, originalClassNamesValue) break } ({ classNames } = extractClassnamesFromValue(originalClassNamesValue)) @@ -156,7 +183,7 @@ function parseNodeRecursive(rootNode, childNode, cb, skipConditional = false, is return } const targetNode = isolate ? null : rootNode - cb(classNames, targetNode) + cb(classNames, targetNode, originalClassNamesValue, start, end, prefix, suffix) } } diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 2954f361c..84973db6d 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -30,6 +30,7 @@ "dependencies": { "@master/css": "workspace:^", "@master/css-validator": "workspace:^", + "css-tree": "^2.3.1", "explore-config": "^2.2.10", "requireindex": "^1.2.0" }, diff --git a/packages/eslint-plugin/tests/collision.test.js b/packages/eslint-plugin/tests/collision.test.js new file mode 100644 index 000000000..a6032842b --- /dev/null +++ b/packages/eslint-plugin/tests/collision.test.js @@ -0,0 +1,27 @@ + +const rule = require('../lib/rules/class-collision') +const RuleTester = require('eslint').RuleTester + +new RuleTester({ + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + } +}).run('collision', rule, { + valid: [ + { + code: `
Simple, basic
`, + } + ], + invalid: [ + { + code: `
collision
`, + output: `
collision
`, + errors: [ + { messageId: 'collisionClass' }, + { messageId: 'collisionClass' } + ] + }, + ], +}) diff --git a/packages/eslint-plugin/tests/order.test.js b/packages/eslint-plugin/tests/order.test.js index a50a15cd8..dc6e6b653 100644 --- a/packages/eslint-plugin/tests/order.test.js +++ b/packages/eslint-plugin/tests/order.test.js @@ -108,6 +108,10 @@ new RuleTester({ { code: `
Do not treat full width space as class separator
`, }, + { + code: `
Collision class
`, + }, + ], invalid: [ { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74fddb9c4..076e0ed82 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1117,6 +1117,9 @@ importers: '@master/css-validator': specifier: workspace:^ version: link:../validator + css-tree: + specifier: ^2.3.1 + version: 2.3.1 explore-config: specifier: ^2.2.10 version: 2.5.17 @@ -2193,7 +2196,7 @@ packages: engines: {node: '>=16.12.0'} dependencies: ci-info: 3.8.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 dlv: 1.1.3 dset: 3.1.2 is-docker: 3.0.0 @@ -2242,7 +2245,7 @@ packages: '@babel/traverse': 7.23.0 '@babel/types': 7.23.0 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -2264,7 +2267,7 @@ packages: '@babel/traverse': 7.23.0 '@babel/types': 7.23.0 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -2286,7 +2289,7 @@ packages: '@babel/traverse': 7.23.0 '@babel/types': 7.23.0 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -2413,7 +2416,7 @@ packages: '@babel/core': 7.22.9 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.6 transitivePeerDependencies: @@ -2427,7 +2430,7 @@ packages: '@babel/core': 7.23.0 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.6 transitivePeerDependencies: @@ -4429,7 +4432,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.23.0 '@babel/types': 7.23.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -5636,7 +5639,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 espree: 9.6.1 globals: 13.22.0 ignore: 5.2.4 @@ -5672,7 +5675,7 @@ packages: engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -6752,7 +6755,7 @@ packages: engines: {node: '>=16.3.0'} hasBin: true dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.3.1 @@ -7144,7 +7147,7 @@ packages: conventional-changelog-angular: 6.0.0 conventional-commits-filter: 3.0.0 conventional-commits-parser: 5.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 import-from: 4.0.0 lodash-es: 4.17.21 micromatch: 4.0.5 @@ -7171,7 +7174,7 @@ packages: dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 execa: 5.1.1 lodash: 4.17.21 parse-json: 5.2.0 @@ -7192,7 +7195,7 @@ packages: '@octokit/plugin-throttling': 8.0.0(@octokit/core@5.0.1) '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 dir-glob: 3.0.1 globby: 13.2.2 http-proxy-agent: 7.0.0 @@ -7239,7 +7242,7 @@ packages: conventional-changelog-writer: 6.0.1 conventional-commits-filter: 4.0.0 conventional-commits-parser: 5.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 get-stream: 7.0.1 import-from: 4.0.0 into-stream: 7.0.0 @@ -7350,7 +7353,7 @@ packages: vite: ^4.0.0 dependencies: '@sveltejs/vite-plugin-svelte': 2.4.6(svelte@4.2.1)(vite@4.4.9) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 svelte: 4.2.1 vite: 4.4.9(@types/node@20.8.0) transitivePeerDependencies: @@ -7365,7 +7368,7 @@ packages: vite: ^4.0.0 dependencies: '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.4.6)(svelte@4.2.1)(vite@4.4.9) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.4 @@ -8102,7 +8105,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.50.0)(typescript@4.9.5) '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@4.9.5) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.50.0 graphemer: 1.4.0 ignore: 5.2.4 @@ -8130,7 +8133,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.50.0)(typescript@5.2.2) '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@5.2.2) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.50.0 graphemer: 1.4.0 ignore: 5.2.4 @@ -8159,7 +8162,7 @@ packages: '@typescript-eslint/type-utils': 6.7.4(eslint@8.51.0)(typescript@5.2.2) '@typescript-eslint/utils': 6.7.4(eslint@8.51.0)(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.7.4 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.51.0 graphemer: 1.4.0 ignore: 5.2.4 @@ -8204,7 +8207,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.50.0 typescript: 4.9.5 transitivePeerDependencies: @@ -8224,7 +8227,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.50.0 typescript: 5.2.2 transitivePeerDependencies: @@ -8244,7 +8247,7 @@ packages: '@typescript-eslint/types': 6.9.0 '@typescript-eslint/typescript-estree': 6.9.0(typescript@5.2.2) '@typescript-eslint/visitor-keys': 6.9.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.51.0 typescript: 5.2.2 transitivePeerDependencies: @@ -8284,7 +8287,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@4.9.5) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.50.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 @@ -8304,7 +8307,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@5.2.2) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.50.0 tsutils: 3.21.0(typescript@5.2.2) typescript: 5.2.2 @@ -8324,7 +8327,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 6.7.4(typescript@5.2.2) '@typescript-eslint/utils': 6.7.4(eslint@8.51.0)(typescript@5.2.2) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.51.0 ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 @@ -8356,7 +8359,7 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 @@ -8397,7 +8400,7 @@ packages: dependencies: '@typescript-eslint/types': 6.7.4 '@typescript-eslint/visitor-keys': 6.7.4 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 @@ -8418,7 +8421,7 @@ packages: dependencies: '@typescript-eslint/types': 6.9.0 '@typescript-eslint/visitor-keys': 6.9.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 @@ -9232,7 +9235,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -9240,7 +9243,7 @@ packages: resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} engines: {node: '>= 14'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true @@ -9697,7 +9700,7 @@ packages: ci-info: 3.8.0 common-ancestor-path: 1.0.1 cookie: 0.5.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 devalue: 4.3.2 diff: 5.1.0 es-module-lexer: 1.3.1 @@ -11668,18 +11671,6 @@ packages: dependencies: ms: 2.1.2 - /debug@4.3.4(supports-color@8.1.1): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -11928,7 +11919,7 @@ packages: hasBin: true dependencies: address: 1.2.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: false @@ -12228,7 +12219,7 @@ packages: resolution: {integrity: sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==} dependencies: '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 engine.io-parser: 5.2.1 ws: 8.11.0 xmlhttprequest-ssl: 2.0.0 @@ -12279,7 +12270,7 @@ packages: base64id: 2.0.0 cookie: 0.4.2 cors: 2.8.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 engine.io-parser: 5.2.1 ws: 8.11.0 transitivePeerDependencies: @@ -12734,7 +12725,7 @@ packages: eslint: '*' eslint-plugin-import: '*' dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 enhanced-resolve: 5.15.0 eslint: 8.50.0 eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) @@ -12757,7 +12748,7 @@ packages: eslint: '*' eslint-plugin-import: '*' dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 enhanced-resolve: 5.15.0 eslint: 8.50.0 eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) @@ -13202,7 +13193,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -13247,7 +13238,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -13627,7 +13618,7 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -14154,7 +14145,7 @@ packages: dependencies: basic-ftp: 5.0.3 data-uri-to-buffer: 6.0.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 fs-extra: 8.1.0 transitivePeerDependencies: - supports-color @@ -14900,7 +14891,7 @@ packages: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -14910,7 +14901,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -14919,7 +14910,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true @@ -14991,7 +14982,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -15000,7 +14991,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color dev: true @@ -15261,7 +15252,7 @@ packages: dependencies: '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -15852,7 +15843,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: @@ -17090,7 +17081,7 @@ packages: engines: {node: '>=8.0'} dependencies: date-format: 4.0.14 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 flatted: 3.2.9 rfdc: 1.3.0 streamroller: 3.1.5 @@ -17870,7 +17861,7 @@ packages: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: '@types/debug': 4.1.9 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -19579,7 +19570,7 @@ packages: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 get-uri: 6.0.2 http-proxy-agent: 7.0.0 https-proxy-agent: 7.0.2 @@ -20625,7 +20616,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 http-proxy-agent: 7.0.0 https-proxy-agent: 7.0.2 lru-cache: 7.18.3 @@ -20682,7 +20673,7 @@ packages: '@puppeteer/browsers': 1.7.1 chromium-bidi: 0.4.28(devtools-protocol@0.0.1179426) cross-fetch: 4.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 devtools-protocol: 0.0.1179426 ws: 8.14.2 transitivePeerDependencies: @@ -21689,7 +21680,7 @@ packages: '@semantic-release/release-notes-generator': 11.0.7(semantic-release@21.1.2) aggregate-error: 5.0.0 cosmiconfig: 8.3.6(typescript@5.2.2) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 env-ci: 9.1.1 execa: 8.0.1 figures: 5.0.0 @@ -22129,7 +22120,7 @@ packages: engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 engine.io-client: 6.5.2 socket.io-parser: 4.2.4 transitivePeerDependencies: @@ -22154,7 +22145,7 @@ packages: engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -22181,7 +22172,7 @@ packages: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 engine.io: 6.5.2 socket.io-adapter: 2.5.2 socket.io-parser: 4.2.4 @@ -22202,7 +22193,7 @@ packages: engines: {node: '>= 10'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 socks: 2.7.1 transitivePeerDependencies: - supports-color @@ -22213,7 +22204,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 socks: 2.7.1 transitivePeerDependencies: - supports-color @@ -22349,7 +22340,7 @@ packages: /spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -22362,7 +22353,7 @@ packages: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -22528,7 +22519,7 @@ packages: engines: {node: '>=8.0'} dependencies: date-format: 4.0.14 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 fs-extra: 8.1.0 transitivePeerDependencies: - supports-color @@ -23470,7 +23461,7 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@tufjs/models': 1.0.4 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 make-fetch-happen: 11.1.1 transitivePeerDependencies: - supports-color @@ -24227,7 +24218,7 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 mlly: 1.4.2 pathe: 1.1.1 picocolors: 1.0.0 @@ -24251,7 +24242,7 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 mlly: 1.4.2 pathe: 1.1.1 picocolors: 1.0.0