@lyse-labs/lyse 0.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +45 -0
- package/PRIVACY.md +181 -0
- package/README.md +34 -0
- package/SECURITY.md +43 -0
- package/dist/bench/evidence-pack/anti-dummy.d.ts +11 -0
- package/dist/bench/evidence-pack/anti-dummy.js +20 -0
- package/dist/bench/evidence-pack/anti-dummy.js.map +1 -0
- package/dist/bench/evidence-pack/builder.d.ts +14 -0
- package/dist/bench/evidence-pack/builder.js +77 -0
- package/dist/bench/evidence-pack/builder.js.map +1 -0
- package/dist/bench/evidence-pack/histograms.d.ts +2 -0
- package/dist/bench/evidence-pack/histograms.js +131 -0
- package/dist/bench/evidence-pack/histograms.js.map +1 -0
- package/dist/bench/evidence-pack/manifest-detector.d.ts +2 -0
- package/dist/bench/evidence-pack/manifest-detector.js +65 -0
- package/dist/bench/evidence-pack/manifest-detector.js.map +1 -0
- package/dist/bench/evidence-pack/package-json-digest.d.ts +2 -0
- package/dist/bench/evidence-pack/package-json-digest.js +51 -0
- package/dist/bench/evidence-pack/package-json-digest.js.map +1 -0
- package/dist/bench/evidence-pack/sampler.d.ts +2 -0
- package/dist/bench/evidence-pack/sampler.js +140 -0
- package/dist/bench/evidence-pack/sampler.js.map +1 -0
- package/dist/bench/evidence-pack/types.d.ts +127 -0
- package/dist/bench/evidence-pack/types.js +2 -0
- package/dist/bench/evidence-pack/types.js.map +1 -0
- package/dist/bench/evidence-pack/verifier-corpus.d.ts +5 -0
- package/dist/bench/evidence-pack/verifier-corpus.js +13 -0
- package/dist/bench/evidence-pack/verifier-corpus.js.map +1 -0
- package/dist/bench/taxonomy-loader.d.ts +20 -0
- package/dist/bench/taxonomy-loader.js +28 -0
- package/dist/bench/taxonomy-loader.js.map +1 -0
- package/dist/bench/taxonomy.v3.json +20 -0
- package/dist/cli/__tests__/version-migration.test.d.ts +1 -0
- package/dist/cli/__tests__/version-migration.test.js +69 -0
- package/dist/cli/__tests__/version-migration.test.js.map +1 -0
- package/dist/cli/output/__tests__/eslint-style.test.d.ts +1 -0
- package/dist/cli/output/__tests__/eslint-style.test.js +205 -0
- package/dist/cli/output/__tests__/eslint-style.test.js.map +1 -0
- package/dist/cli/output/__tests__/limit.test.d.ts +1 -0
- package/dist/cli/output/__tests__/limit.test.js +65 -0
- package/dist/cli/output/__tests__/limit.test.js.map +1 -0
- package/dist/cli/output/eslint-style.d.ts +18 -0
- package/dist/cli/output/eslint-style.js +42 -0
- package/dist/cli/output/eslint-style.js.map +1 -0
- package/dist/cli/output/limit.d.ts +5 -0
- package/dist/cli/output/limit.js +32 -0
- package/dist/cli/output/limit.js.map +1 -0
- package/dist/cli/output/score-gauge.d.ts +4 -0
- package/dist/cli/output/score-gauge.js +15 -0
- package/dist/cli/output/score-gauge.js.map +1 -0
- package/dist/cli/version-migration.d.ts +18 -0
- package/dist/cli/version-migration.js +49 -0
- package/dist/cli/version-migration.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +856 -0
- package/dist/cli.js.map +1 -0
- package/dist/codemods/diff.d.ts +17 -0
- package/dist/codemods/diff.js +77 -0
- package/dist/codemods/diff.js.map +1 -0
- package/dist/codemods/git-helpers.d.ts +10 -0
- package/dist/codemods/git-helpers.js +75 -0
- package/dist/codemods/git-helpers.js.map +1 -0
- package/dist/codemods/index.d.ts +27 -0
- package/dist/codemods/index.js +40 -0
- package/dist/codemods/index.js.map +1 -0
- package/dist/codemods/naming-component-pascalcase.d.ts +13 -0
- package/dist/codemods/naming-component-pascalcase.js +106 -0
- package/dist/codemods/naming-component-pascalcase.js.map +1 -0
- package/dist/codemods/naming-hook-prefix.d.ts +13 -0
- package/dist/codemods/naming-hook-prefix.js +86 -0
- package/dist/codemods/naming-hook-prefix.js.map +1 -0
- package/dist/codemods/safety.d.ts +50 -0
- package/dist/codemods/safety.js +109 -0
- package/dist/codemods/safety.js.map +1 -0
- package/dist/codemods/safety.test.d.ts +1 -0
- package/dist/codemods/safety.test.js +154 -0
- package/dist/codemods/safety.test.js.map +1 -0
- package/dist/codemods/shadow-native.d.ts +2 -0
- package/dist/codemods/shadow-native.js +103 -0
- package/dist/codemods/shadow-native.js.map +1 -0
- package/dist/codemods/tokens-color.d.ts +2 -0
- package/dist/codemods/tokens-color.js +69 -0
- package/dist/codemods/tokens-color.js.map +1 -0
- package/dist/codemods/tokens-spacing.d.ts +2 -0
- package/dist/codemods/tokens-spacing.js +66 -0
- package/dist/codemods/tokens-spacing.js.map +1 -0
- package/dist/commands/__tests__/email-prompt.test.d.ts +1 -0
- package/dist/commands/__tests__/email-prompt.test.js +126 -0
- package/dist/commands/__tests__/email-prompt.test.js.map +1 -0
- package/dist/commands/__tests__/explain-score.test.d.ts +1 -0
- package/dist/commands/__tests__/explain-score.test.js +88 -0
- package/dist/commands/__tests__/explain-score.test.js.map +1 -0
- package/dist/commands/__tests__/feedback.test.d.ts +1 -0
- package/dist/commands/__tests__/feedback.test.js +186 -0
- package/dist/commands/__tests__/feedback.test.js.map +1 -0
- package/dist/commands/audit-flags.d.ts +49 -0
- package/dist/commands/audit-flags.js +17 -0
- package/dist/commands/audit-flags.js.map +1 -0
- package/dist/commands/audit-pipeline.d.ts +31 -0
- package/dist/commands/audit-pipeline.js +342 -0
- package/dist/commands/audit-pipeline.js.map +1 -0
- package/dist/commands/bench-pack.d.ts +5 -0
- package/dist/commands/bench-pack.js +61 -0
- package/dist/commands/bench-pack.js.map +1 -0
- package/dist/commands/ci-setup.d.ts +9 -0
- package/dist/commands/ci-setup.js +42 -0
- package/dist/commands/ci-setup.js.map +1 -0
- package/dist/commands/email-prompt.d.ts +36 -0
- package/dist/commands/email-prompt.js +160 -0
- package/dist/commands/email-prompt.js.map +1 -0
- package/dist/commands/explain-score.d.ts +35 -0
- package/dist/commands/explain-score.js +137 -0
- package/dist/commands/explain-score.js.map +1 -0
- package/dist/commands/explain.d.ts +6 -0
- package/dist/commands/explain.js +93 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/feedback.d.ts +31 -0
- package/dist/commands/feedback.js +155 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/fix.d.ts +48 -0
- package/dist/commands/fix.js +191 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/init-detect.d.ts +20 -0
- package/dist/commands/init-detect.js +124 -0
- package/dist/commands/init-detect.js.map +1 -0
- package/dist/commands/init-write-agents-md.d.ts +14 -0
- package/dist/commands/init-write-agents-md.js +71 -0
- package/dist/commands/init-write-agents-md.js.map +1 -0
- package/dist/commands/init-write-lyse-md.d.ts +14 -0
- package/dist/commands/init-write-lyse-md.js +253 -0
- package/dist/commands/init-write-lyse-md.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.js +147 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp-entry.d.ts +33 -0
- package/dist/commands/mcp-entry.js +47 -0
- package/dist/commands/mcp-entry.js.map +1 -0
- package/dist/commands/mcp-setup.d.ts +10 -0
- package/dist/commands/mcp-setup.js +74 -0
- package/dist/commands/mcp-setup.js.map +1 -0
- package/dist/commands/share.d.ts +4 -0
- package/dist/commands/share.js +60 -0
- package/dist/commands/share.js.map +1 -0
- package/dist/commands/telemetry.d.ts +4 -0
- package/dist/commands/telemetry.js +27 -0
- package/dist/commands/telemetry.js.map +1 -0
- package/dist/commands/templates/lyse-workflow.yml.template +30 -0
- package/dist/config/schema.d.ts +158 -0
- package/dist/config/schema.js +136 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/credentials/keychain.d.ts +20 -0
- package/dist/credentials/keychain.js +35 -0
- package/dist/credentials/keychain.js.map +1 -0
- package/dist/credentials/keychain.test.d.ts +1 -0
- package/dist/credentials/keychain.test.js +32 -0
- package/dist/credentials/keychain.test.js.map +1 -0
- package/dist/credentials/paths.d.ts +1 -0
- package/dist/credentials/paths.js +6 -0
- package/dist/credentials/paths.js.map +1 -0
- package/dist/credentials/store.d.ts +17 -0
- package/dist/credentials/store.js +60 -0
- package/dist/credentials/store.js.map +1 -0
- package/dist/credentials/store.test.d.ts +1 -0
- package/dist/credentials/store.test.js +48 -0
- package/dist/credentials/store.test.js.map +1 -0
- package/dist/detection/from-filesystem.d.ts +2 -0
- package/dist/detection/from-filesystem.js +26 -0
- package/dist/detection/from-filesystem.js.map +1 -0
- package/dist/detection/from-git.d.ts +2 -0
- package/dist/detection/from-git.js +53 -0
- package/dist/detection/from-git.js.map +1 -0
- package/dist/detection/from-package-json.d.ts +2 -0
- package/dist/detection/from-package-json.js +194 -0
- package/dist/detection/from-package-json.js.map +1 -0
- package/dist/detection/pre-flight.d.ts +5 -0
- package/dist/detection/pre-flight.js +47 -0
- package/dist/detection/pre-flight.js.map +1 -0
- package/dist/detection/types.d.ts +27 -0
- package/dist/detection/types.js +2 -0
- package/dist/detection/types.js.map +1 -0
- package/dist/entitlement/check.d.ts +7 -0
- package/dist/entitlement/check.js +37 -0
- package/dist/entitlement/check.js.map +1 -0
- package/dist/entitlement/index.d.ts +1 -0
- package/dist/entitlement/index.js +2 -0
- package/dist/entitlement/index.js.map +1 -0
- package/dist/entitlement/keys.d.ts +10 -0
- package/dist/entitlement/keys.js +14 -0
- package/dist/entitlement/keys.js.map +1 -0
- package/dist/history/ndjson-store.d.ts +70 -0
- package/dist/history/ndjson-store.js +102 -0
- package/dist/history/ndjson-store.js.map +1 -0
- package/dist/identity/index.d.ts +1 -0
- package/dist/identity/index.js +2 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/repo-bucket.d.ts +22 -0
- package/dist/identity/repo-bucket.js +78 -0
- package/dist/identity/repo-bucket.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/layer4-stage.d.ts +18 -0
- package/dist/llm/layer4-stage.js +12 -0
- package/dist/llm/layer4-stage.js.map +1 -0
- package/dist/loaders/components.d.ts +26 -0
- package/dist/loaders/components.js +285 -0
- package/dist/loaders/components.js.map +1 -0
- package/dist/loaders/stories.d.ts +2 -0
- package/dist/loaders/stories.js +231 -0
- package/dist/loaders/stories.js.map +1 -0
- package/dist/loaders/token-graph.d.ts +39 -0
- package/dist/loaders/token-graph.js +146 -0
- package/dist/loaders/token-graph.js.map +1 -0
- package/dist/loaders/tokens.d.ts +2 -0
- package/dist/loaders/tokens.js +521 -0
- package/dist/loaders/tokens.js.map +1 -0
- package/dist/mcp/_find-root.d.ts +12 -0
- package/dist/mcp/_find-root.js +28 -0
- package/dist/mcp/_find-root.js.map +1 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +42 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/audit-file.d.ts +25 -0
- package/dist/mcp/tools/audit-file.js +147 -0
- package/dist/mcp/tools/audit-file.js.map +1 -0
- package/dist/mcp/tools/suggest-fix.d.ts +13 -0
- package/dist/mcp/tools/suggest-fix.js +100 -0
- package/dist/mcp/tools/suggest-fix.js.map +1 -0
- package/dist/menu/action-menu.d.ts +6 -0
- package/dist/menu/action-menu.js +15 -0
- package/dist/menu/action-menu.js.map +1 -0
- package/dist/menu/prompts.d.ts +7 -0
- package/dist/menu/prompts.js +30 -0
- package/dist/menu/prompts.js.map +1 -0
- package/dist/menu/repl.d.ts +17 -0
- package/dist/menu/repl.js +77 -0
- package/dist/menu/repl.js.map +1 -0
- package/dist/parsers/css-in-js.d.ts +2 -0
- package/dist/parsers/css-in-js.js +69 -0
- package/dist/parsers/css-in-js.js.map +1 -0
- package/dist/parsers/css.d.ts +2 -0
- package/dist/parsers/css.js +32 -0
- package/dist/parsers/css.js.map +1 -0
- package/dist/parsers/scss-transform.d.ts +25 -0
- package/dist/parsers/scss-transform.js +55 -0
- package/dist/parsers/scss-transform.js.map +1 -0
- package/dist/parsers/tailwind-v4.d.ts +8 -0
- package/dist/parsers/tailwind-v4.js +90 -0
- package/dist/parsers/tailwind-v4.js.map +1 -0
- package/dist/parsers/ts-morph-project.d.ts +16 -0
- package/dist/parsers/ts-morph-project.js +77 -0
- package/dist/parsers/ts-morph-project.js.map +1 -0
- package/dist/parsers/ts.d.ts +2 -0
- package/dist/parsers/ts.js +61 -0
- package/dist/parsers/ts.js.map +1 -0
- package/dist/reliability/__tests__/types.test.d.ts +1 -0
- package/dist/reliability/__tests__/types.test.js +14 -0
- package/dist/reliability/__tests__/types.test.js.map +1 -0
- package/dist/reliability/catalogue/__tests__/promotion.test.d.ts +1 -0
- package/dist/reliability/catalogue/__tests__/promotion.test.js +23 -0
- package/dist/reliability/catalogue/__tests__/promotion.test.js.map +1 -0
- package/dist/reliability/catalogue/__tests__/sub-axes.test.d.ts +1 -0
- package/dist/reliability/catalogue/__tests__/sub-axes.test.js +27 -0
- package/dist/reliability/catalogue/__tests__/sub-axes.test.js.map +1 -0
- package/dist/reliability/catalogue/promotion.d.ts +8 -0
- package/dist/reliability/catalogue/promotion.js +25 -0
- package/dist/reliability/catalogue/promotion.js.map +1 -0
- package/dist/reliability/catalogue/sub-axes.d.ts +3 -0
- package/dist/reliability/catalogue/sub-axes.js +18 -0
- package/dist/reliability/catalogue/sub-axes.js.map +1 -0
- package/dist/reliability/confidence/__tests__/manifest-loader.test.d.ts +1 -0
- package/dist/reliability/confidence/__tests__/manifest-loader.test.js +103 -0
- package/dist/reliability/confidence/__tests__/manifest-loader.test.js.map +1 -0
- package/dist/reliability/confidence/bundled-manifest.d.ts +2 -0
- package/dist/reliability/confidence/bundled-manifest.js +8 -0
- package/dist/reliability/confidence/bundled-manifest.js.map +1 -0
- package/dist/reliability/confidence/index.d.ts +3 -0
- package/dist/reliability/confidence/index.js +3 -0
- package/dist/reliability/confidence/index.js.map +1 -0
- package/dist/reliability/confidence/manifest-loader.d.ts +8 -0
- package/dist/reliability/confidence/manifest-loader.js +53 -0
- package/dist/reliability/confidence/manifest-loader.js.map +1 -0
- package/dist/reliability/feedback/__tests__/interactive.test.d.ts +1 -0
- package/dist/reliability/feedback/__tests__/interactive.test.js +85 -0
- package/dist/reliability/feedback/__tests__/interactive.test.js.map +1 -0
- package/dist/reliability/feedback/__tests__/repo-bucket.test.d.ts +1 -0
- package/dist/reliability/feedback/__tests__/repo-bucket.test.js +18 -0
- package/dist/reliability/feedback/__tests__/repo-bucket.test.js.map +1 -0
- package/dist/reliability/feedback/__tests__/sender.test.d.ts +1 -0
- package/dist/reliability/feedback/__tests__/sender.test.js +101 -0
- package/dist/reliability/feedback/__tests__/sender.test.js.map +1 -0
- package/dist/reliability/feedback/interactive.d.ts +20 -0
- package/dist/reliability/feedback/interactive.js +150 -0
- package/dist/reliability/feedback/interactive.js.map +1 -0
- package/dist/reliability/feedback/repo-bucket.d.ts +2 -0
- package/dist/reliability/feedback/repo-bucket.js +9 -0
- package/dist/reliability/feedback/repo-bucket.js.map +1 -0
- package/dist/reliability/feedback/sender.d.ts +16 -0
- package/dist/reliability/feedback/sender.js +28 -0
- package/dist/reliability/feedback/sender.js.map +1 -0
- package/dist/reliability/index.d.ts +1 -0
- package/dist/reliability/index.js +2 -0
- package/dist/reliability/index.js.map +1 -0
- package/dist/reliability/llm-eval/__tests__/budget.test.d.ts +1 -0
- package/dist/reliability/llm-eval/__tests__/budget.test.js +39 -0
- package/dist/reliability/llm-eval/__tests__/budget.test.js.map +1 -0
- package/dist/reliability/llm-eval/budget.d.ts +14 -0
- package/dist/reliability/llm-eval/budget.js +43 -0
- package/dist/reliability/llm-eval/budget.js.map +1 -0
- package/dist/reliability/score/__tests__/formula-v1.test.d.ts +1 -0
- package/dist/reliability/score/__tests__/formula-v1.test.js +29 -0
- package/dist/reliability/score/__tests__/formula-v1.test.js.map +1 -0
- package/dist/reliability/score/formula-v1.d.ts +13 -0
- package/dist/reliability/score/formula-v1.js +19 -0
- package/dist/reliability/score/formula-v1.js.map +1 -0
- package/dist/reliability/score/version-pin.d.ts +1 -0
- package/dist/reliability/score/version-pin.js +2 -0
- package/dist/reliability/score/version-pin.js.map +1 -0
- package/dist/reliability/score/weight.d.ts +1 -0
- package/dist/reliability/score/weight.js +5 -0
- package/dist/reliability/score/weight.js.map +1 -0
- package/dist/reliability/types.d.ts +39 -0
- package/dist/reliability/types.js +2 -0
- package/dist/reliability/types.js.map +1 -0
- package/dist/reporters/coverage-footer.d.ts +2 -0
- package/dist/reporters/coverage-footer.js +7 -0
- package/dist/reporters/coverage-footer.js.map +1 -0
- package/dist/reporters/json.d.ts +5 -0
- package/dist/reporters/json.js +51 -0
- package/dist/reporters/json.js.map +1 -0
- package/dist/reporters/markdown.d.ts +7 -0
- package/dist/reporters/markdown.js +35 -0
- package/dist/reporters/markdown.js.map +1 -0
- package/dist/reporters/sarif.d.ts +5 -0
- package/dist/reporters/sarif.js +109 -0
- package/dist/reporters/sarif.js.map +1 -0
- package/dist/reporters/terminal-format.d.ts +34 -0
- package/dist/reporters/terminal-format.js +97 -0
- package/dist/reporters/terminal-format.js.map +1 -0
- package/dist/reporters/terminal.d.ts +4 -0
- package/dist/reporters/terminal.js +201 -0
- package/dist/reporters/terminal.js.map +1 -0
- package/dist/rule-runner.d.ts +8 -0
- package/dist/rule-runner.js +22 -0
- package/dist/rule-runner.js.map +1 -0
- package/dist/rules/_codemod-adapter.d.ts +16 -0
- package/dist/rules/_codemod-adapter.js +49 -0
- package/dist/rules/_codemod-adapter.js.map +1 -0
- package/dist/rules/_exclude.d.ts +11 -0
- package/dist/rules/_exclude.js +17 -0
- package/dist/rules/_exclude.js.map +1 -0
- package/dist/rules/_function-body-analysis.d.ts +82 -0
- package/dist/rules/_function-body-analysis.js +379 -0
- package/dist/rules/_function-body-analysis.js.map +1 -0
- package/dist/rules/_rule-module.d.ts +31 -0
- package/dist/rules/_rule-module.js +32 -0
- package/dist/rules/_rule-module.js.map +1 -0
- package/dist/rules/_skip-context.d.ts +36 -0
- package/dist/rules/_skip-context.js +128 -0
- package/dist/rules/_skip-context.js.map +1 -0
- package/dist/rules/a11y-essentials.d.ts +1 -0
- package/dist/rules/a11y-essentials.js +140 -0
- package/dist/rules/a11y-essentials.js.map +1 -0
- package/dist/rules/ai-surface-agents-md-quality.d.ts +22 -0
- package/dist/rules/ai-surface-agents-md-quality.js +233 -0
- package/dist/rules/ai-surface-agents-md-quality.js.map +1 -0
- package/dist/rules/ai-surface-component-manifest-json.d.ts +19 -0
- package/dist/rules/ai-surface-component-manifest-json.js +232 -0
- package/dist/rules/ai-surface-component-manifest-json.js.map +1 -0
- package/dist/rules/ai-surface-ds-index-exported.d.ts +19 -0
- package/dist/rules/ai-surface-ds-index-exported.js +239 -0
- package/dist/rules/ai-surface-ds-index-exported.js.map +1 -0
- package/dist/rules/components-shadow-native.d.ts +2 -0
- package/dist/rules/components-shadow-native.js +118 -0
- package/dist/rules/components-shadow-native.js.map +1 -0
- package/dist/rules/manifest.d.ts +5 -0
- package/dist/rules/manifest.js +20 -0
- package/dist/rules/manifest.js.map +1 -0
- package/dist/rules/naming-component-pascalcase.d.ts +7 -0
- package/dist/rules/naming-component-pascalcase.js +197 -0
- package/dist/rules/naming-component-pascalcase.js.map +1 -0
- package/dist/rules/naming-hook-prefix.d.ts +6 -0
- package/dist/rules/naming-hook-prefix.js +185 -0
- package/dist/rules/naming-hook-prefix.js.map +1 -0
- package/dist/rules/pack-loader.d.ts +30 -0
- package/dist/rules/pack-loader.js +60 -0
- package/dist/rules/pack-loader.js.map +1 -0
- package/dist/rules/pack-validator.d.ts +8 -0
- package/dist/rules/pack-validator.js +97 -0
- package/dist/rules/pack-validator.js.map +1 -0
- package/dist/rules/registry.d.ts +3 -0
- package/dist/rules/registry.js +28 -0
- package/dist/rules/registry.js.map +1 -0
- package/dist/rules/storybook-coverage.d.ts +1 -0
- package/dist/rules/storybook-coverage.js +49 -0
- package/dist/rules/storybook-coverage.js.map +1 -0
- package/dist/rules/templates/_regex-utils.d.ts +5 -0
- package/dist/rules/templates/_regex-utils.js +8 -0
- package/dist/rules/templates/_regex-utils.js.map +1 -0
- package/dist/rules/templates/a11y-jsx-template.d.ts +15 -0
- package/dist/rules/templates/a11y-jsx-template.js +69 -0
- package/dist/rules/templates/a11y-jsx-template.js.map +1 -0
- package/dist/rules/templates/css-property-token-compliance.d.ts +18 -0
- package/dist/rules/templates/css-property-token-compliance.js +56 -0
- package/dist/rules/templates/css-property-token-compliance.js.map +1 -0
- package/dist/rules/templates/import-source-restriction.d.ts +18 -0
- package/dist/rules/templates/import-source-restriction.js +60 -0
- package/dist/rules/templates/import-source-restriction.js.map +1 -0
- package/dist/rules/templates/js-call-token-compliance.d.ts +18 -0
- package/dist/rules/templates/js-call-token-compliance.js +61 -0
- package/dist/rules/templates/js-call-token-compliance.js.map +1 -0
- package/dist/rules/templates/js-prop-token-compliance.d.ts +21 -0
- package/dist/rules/templates/js-prop-token-compliance.js +56 -0
- package/dist/rules/templates/js-prop-token-compliance.js.map +1 -0
- package/dist/rules/templates/naming-convention.d.ts +18 -0
- package/dist/rules/templates/naming-convention.js +76 -0
- package/dist/rules/templates/naming-convention.js.map +1 -0
- package/dist/rules/templates/registry.d.ts +5 -0
- package/dist/rules/templates/registry.js +30 -0
- package/dist/rules/templates/registry.js.map +1 -0
- package/dist/rules/templates/storybook-coverage-template.d.ts +15 -0
- package/dist/rules/templates/storybook-coverage-template.js +58 -0
- package/dist/rules/templates/storybook-coverage-template.js.map +1 -0
- package/dist/rules/templates/tailwind-utility-class-compliance.d.ts +15 -0
- package/dist/rules/templates/tailwind-utility-class-compliance.js +70 -0
- package/dist/rules/templates/tailwind-utility-class-compliance.js.map +1 -0
- package/dist/rules/templates/types.d.ts +16 -0
- package/dist/rules/templates/types.js +2 -0
- package/dist/rules/templates/types.js.map +1 -0
- package/dist/rules/tokens-description-coverage.d.ts +15 -0
- package/dist/rules/tokens-description-coverage.js +193 -0
- package/dist/rules/tokens-description-coverage.js.map +1 -0
- package/dist/rules/tokens-dtcg-conformance.d.ts +47 -0
- package/dist/rules/tokens-dtcg-conformance.js +363 -0
- package/dist/rules/tokens-dtcg-conformance.js.map +1 -0
- package/dist/rules/tokens-no-hardcoded-color.d.ts +18 -0
- package/dist/rules/tokens-no-hardcoded-color.js +436 -0
- package/dist/rules/tokens-no-hardcoded-color.js.map +1 -0
- package/dist/rules/tokens-no-hardcoded-spacing.d.ts +8 -0
- package/dist/rules/tokens-no-hardcoded-spacing.js +193 -0
- package/dist/rules/tokens-no-hardcoded-spacing.js.map +1 -0
- package/dist/scorer.d.ts +38 -0
- package/dist/scorer.js +126 -0
- package/dist/scorer.js.map +1 -0
- package/dist/share/clipboard.d.ts +26 -0
- package/dist/share/clipboard.js +76 -0
- package/dist/share/clipboard.js.map +1 -0
- package/dist/suppression/__tests__/inline.test.d.ts +1 -0
- package/dist/suppression/__tests__/inline.test.js +25 -0
- package/dist/suppression/__tests__/inline.test.js.map +1 -0
- package/dist/suppression/__tests__/lyseignore.test.d.ts +1 -0
- package/dist/suppression/__tests__/lyseignore.test.js +32 -0
- package/dist/suppression/__tests__/lyseignore.test.js.map +1 -0
- package/dist/suppression/defaults.d.ts +1 -0
- package/dist/suppression/defaults.js +14 -0
- package/dist/suppression/defaults.js.map +1 -0
- package/dist/suppression/inline.d.ts +7 -0
- package/dist/suppression/inline.js +32 -0
- package/dist/suppression/inline.js.map +1 -0
- package/dist/suppression/lyseignore.d.ts +2 -0
- package/dist/suppression/lyseignore.js +22 -0
- package/dist/suppression/lyseignore.js.map +1 -0
- package/dist/telemetry/consent.d.ts +48 -0
- package/dist/telemetry/consent.js +139 -0
- package/dist/telemetry/consent.js.map +1 -0
- package/dist/telemetry/index.d.ts +2 -0
- package/dist/telemetry/index.js +3 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/local-log.d.ts +64 -0
- package/dist/telemetry/local-log.js +123 -0
- package/dist/telemetry/local-log.js.map +1 -0
- package/dist/tokens/dtcg-model.d.ts +53 -0
- package/dist/tokens/dtcg-model.js +18 -0
- package/dist/tokens/dtcg-model.js.map +1 -0
- package/dist/tokens/normalizer.d.ts +17 -0
- package/dist/tokens/normalizer.js +360 -0
- package/dist/tokens/normalizer.js.map +1 -0
- package/dist/types.d.ts +300 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/util/git.d.ts +6 -0
- package/dist/util/git.js +40 -0
- package/dist/util/git.js.map +1 -0
- package/dist/util/git.test.d.ts +5 -0
- package/dist/util/git.test.js +42 -0
- package/dist/util/git.test.js.map +1 -0
- package/dist/util/gitignore.d.ts +9 -0
- package/dist/util/gitignore.js +39 -0
- package/dist/util/gitignore.js.map +1 -0
- package/dist/util/hash-deps.d.ts +6 -0
- package/dist/util/hash-deps.js +24 -0
- package/dist/util/hash-deps.js.map +1 -0
- package/dist/util/spinner.d.ts +41 -0
- package/dist/util/spinner.js +126 -0
- package/dist/util/spinner.js.map +1 -0
- package/dist/util/with-spinner.d.ts +11 -0
- package/dist/util/with-spinner.js +19 -0
- package/dist/util/with-spinner.js.map +1 -0
- package/dist/walker.d.ts +14 -0
- package/dist/walker.js +91 -0
- package/dist/walker.js.map +1 -0
- package/package.json +83 -0
- package/rules-manifest.json +289 -0
- package/schemas/v1/lyse-config.json +82 -0
- package/schemas/v1/lyse-event.json +68 -0
- package/schemas/v1/lyse-license.json +19 -0
- package/schemas/v1/lyse-llm-payload.json +53 -0
- package/schemas/v1/lyse-llm-response.json +45 -0
- package/schemas/v1/lyse-result.json +98 -0
- package/schemas/v1/lyse-rules.json +42 -0
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
// Shared body-analysis primitives for naming-* rules.
|
|
2
|
+
//
|
|
3
|
+
// These helpers replace the per-rule 2000-char body slices + ad-hoc regex
|
|
4
|
+
// matchers that produced both false negatives (long bodies truncated) and
|
|
5
|
+
// false positives (generics confused for JSX, utility `use*` calls confused
|
|
6
|
+
// for hook calls).
|
|
7
|
+
//
|
|
8
|
+
// Pure utility module — no rule-specific imports. Helpers are stateless and
|
|
9
|
+
// deterministic: same input → same output.
|
|
10
|
+
// Why a streaming scan instead of a capped slice: the previous rules sliced
|
|
11
|
+
// the function body to 2000 chars before scanning. Real codebases (e.g.
|
|
12
|
+
// Enobase) have legitimate hooks whose first hook call sits past that
|
|
13
|
+
// cutoff, producing false negatives. We instead match against the full body
|
|
14
|
+
// slice using lastIndex iteration — the regex engine streams the input and
|
|
15
|
+
// stops on the first match, so the cost is bounded by the position of the
|
|
16
|
+
// first hook call, not the length of the body.
|
|
17
|
+
// `use[A-Z]\w*\s*\(` finds candidate hook call sites anywhere in the body.
|
|
18
|
+
// We then filter for true positives (see `bodyCallsHook`).
|
|
19
|
+
const HOOK_CALL_RE = /\buse[A-Z][a-zA-Z0-9]*\s*\(/g;
|
|
20
|
+
// Identifier-like prefix that, when it precedes `use<Upper>`, suggests the
|
|
21
|
+
// call is NOT a top-level hook call — e.g. `obj.useThing(` or `this.useX(`.
|
|
22
|
+
// We deliberately keep this conservative: object-method dispatch on something
|
|
23
|
+
// named like a hook is rare and almost never a real hook.
|
|
24
|
+
function isMemberAccessAt(source, index) {
|
|
25
|
+
let i = index - 1;
|
|
26
|
+
while (i >= 0 && /\s/.test(source[i]))
|
|
27
|
+
i--;
|
|
28
|
+
return i >= 0 && source[i] === ".";
|
|
29
|
+
}
|
|
30
|
+
// Detects whether the call site sits inside a nested function declaration
|
|
31
|
+
// or method shorthand. A hook called inside an inner `function inner() {}`
|
|
32
|
+
// or `const cb = () => { useX() }` does NOT make the OUTER function a hook.
|
|
33
|
+
//
|
|
34
|
+
// Approach: scan backwards from the candidate index through the body and
|
|
35
|
+
// track brace depth. If we encounter `function` / `=>` whose body wraps the
|
|
36
|
+
// candidate, return true.
|
|
37
|
+
//
|
|
38
|
+
// This is a heuristic — we err on the side of accepting the call as
|
|
39
|
+
// top-level (preserves recall) unless we find clear evidence of nesting.
|
|
40
|
+
function isInsideNestedFunction(body, index) {
|
|
41
|
+
// Walk backwards counting braces; if we exit the outer body or hit a
|
|
42
|
+
// `function` / arrow before exiting, the call is nested.
|
|
43
|
+
let depth = 0;
|
|
44
|
+
for (let i = index - 1; i >= 0; i--) {
|
|
45
|
+
const c = body[i];
|
|
46
|
+
if (c === "}")
|
|
47
|
+
depth++;
|
|
48
|
+
else if (c === "{") {
|
|
49
|
+
if (depth === 0) {
|
|
50
|
+
// We are at the opening brace of the enclosing block. Inspect what
|
|
51
|
+
// precedes it: a `function ...(`, `() =>`, or `<id>(...)\s*` arrow
|
|
52
|
+
// body means this brace opens a nested function.
|
|
53
|
+
const head = body.slice(Math.max(0, i - 60), i);
|
|
54
|
+
if (/=>\s*$/.test(head))
|
|
55
|
+
return true;
|
|
56
|
+
if (/\bfunction\b[^{}]*$/.test(head)) {
|
|
57
|
+
// Could be the outer function's own opening brace — in that case
|
|
58
|
+
// there are no more closing braces between i and the start, which
|
|
59
|
+
// we already verified by depth==0. But the outer function's body
|
|
60
|
+
// IS what we are scanning, so its opening brace marks the start
|
|
61
|
+
// of the body, not a nested function. We assume the caller passes
|
|
62
|
+
// a body slice that starts AFTER the outer `{`, so any `function`
|
|
63
|
+
// we find here is necessarily nested.
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
depth--;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Returns true if the function body slice contains at least one top-level
|
|
75
|
+
* call to a function named `use<Upper>…`. Filters out:
|
|
76
|
+
* - member-access calls (`obj.useThing(`)
|
|
77
|
+
* - calls nested inside an inner function/arrow declaration
|
|
78
|
+
*
|
|
79
|
+
* The body slice should start at the OPENING brace of the function body
|
|
80
|
+
* (or just after) so the nesting heuristic can attribute braces correctly.
|
|
81
|
+
*/
|
|
82
|
+
export function bodyCallsHook(body) {
|
|
83
|
+
HOOK_CALL_RE.lastIndex = 0;
|
|
84
|
+
let m;
|
|
85
|
+
while ((m = HOOK_CALL_RE.exec(body)) !== null) {
|
|
86
|
+
const idx = m.index;
|
|
87
|
+
if (isMemberAccessAt(body, idx))
|
|
88
|
+
continue;
|
|
89
|
+
if (isInsideNestedFunction(body, idx))
|
|
90
|
+
continue;
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
// JSX-return detection.
|
|
96
|
+
//
|
|
97
|
+
// Goal: distinguish `return <Tag …` (JSX) from TS type-position generics like
|
|
98
|
+
// `return useMemo<Foo>(…)` / `return Array<X>(…)` / `return dynamic<T>(loader)`.
|
|
99
|
+
//
|
|
100
|
+
// Strategy: find every `return` followed by an expression, then for the first
|
|
101
|
+
// `<` in that expression decide whether it opens a JSX element. JSX is
|
|
102
|
+
// disambiguated by what FOLLOWS the `<`:
|
|
103
|
+
// - `<` (fragment opener `<>`) → JSX
|
|
104
|
+
// - `<UpperIdent` → JSX (component) UNLESS the next non-name char is `,`
|
|
105
|
+
// or the construct is clearly a generic-arg list
|
|
106
|
+
// - `<lowerIdent` where the identifier matches a known HTML tag → JSX
|
|
107
|
+
// - `</` → JSX close (shouldn't appear at return start but cheap to accept)
|
|
108
|
+
// - anything else → not JSX
|
|
109
|
+
//
|
|
110
|
+
// We avoid full tokenization: a regex sweep over the body is enough because
|
|
111
|
+
// the false-positive cases all share the property that `<` is preceded by a
|
|
112
|
+
// JavaScript identifier or `)` (call/expression position), whereas a JSX `<`
|
|
113
|
+
// at return position is preceded only by `return`, `(`, or whitespace.
|
|
114
|
+
const RETURN_LT_RE = /\breturn\b\s*\(?\s*</g;
|
|
115
|
+
// Common lowercase HTML / SVG tag names. Extending this list is cheap; we
|
|
116
|
+
// only need enough coverage to avoid false negatives on hand-written
|
|
117
|
+
// components. JSX with custom lowercase tags (`<my-component>`) is rare and
|
|
118
|
+
// not idiomatic React.
|
|
119
|
+
const HTML_TAGS = new Set([
|
|
120
|
+
"a", "abbr", "address", "area", "article", "aside", "audio", "b", "base", "bdi",
|
|
121
|
+
"bdo", "blockquote", "body", "br", "button", "canvas", "caption", "cite", "code",
|
|
122
|
+
"col", "colgroup", "data", "datalist", "dd", "del", "details", "dfn", "dialog",
|
|
123
|
+
"div", "dl", "dt", "em", "embed", "fieldset", "figcaption", "figure", "footer",
|
|
124
|
+
"form", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html",
|
|
125
|
+
"i", "iframe", "img", "input", "ins", "kbd", "label", "legend", "li", "link", "main",
|
|
126
|
+
"map", "mark", "meta", "meter", "nav", "noscript", "object", "ol", "optgroup",
|
|
127
|
+
"option", "output", "p", "param", "picture", "pre", "progress", "q", "rp", "rt",
|
|
128
|
+
"ruby", "s", "samp", "script", "section", "select", "slot", "small", "source",
|
|
129
|
+
"span", "strong", "style", "sub", "summary", "sup", "table", "tbody", "td",
|
|
130
|
+
"template", "textarea", "tfoot", "th", "thead", "time", "title", "tr", "track",
|
|
131
|
+
"u", "ul", "var", "video", "wbr",
|
|
132
|
+
"svg", "circle", "ellipse", "g", "line", "path", "polygon", "polyline", "rect",
|
|
133
|
+
"text", "defs", "linearGradient", "radialGradient", "stop", "clipPath", "mask",
|
|
134
|
+
"use", "symbol", "pattern", "filter", "feGaussianBlur", "feOffset", "feMerge",
|
|
135
|
+
]);
|
|
136
|
+
/**
|
|
137
|
+
* Returns true if the body slice contains a JSX-returning expression.
|
|
138
|
+
*
|
|
139
|
+
* Handles:
|
|
140
|
+
* - `return <div>` → true (HTML tag)
|
|
141
|
+
* - `return <Suspense/>` → true (Component)
|
|
142
|
+
* - `return <>` → true (fragment)
|
|
143
|
+
* - `return ( <Foo /> )` → true (parenthesized)
|
|
144
|
+
* - `return useMemo<Foo>(...)` → false (generic at return)
|
|
145
|
+
* - body containing `Array<X>` or `dynamic<T>(…)` elsewhere → false (no return prefix)
|
|
146
|
+
*/
|
|
147
|
+
export function bodyReturnsJsx(body) {
|
|
148
|
+
const scan = blankReturnObjectLiterals(body);
|
|
149
|
+
RETURN_LT_RE.lastIndex = 0;
|
|
150
|
+
let m;
|
|
151
|
+
while ((m = RETURN_LT_RE.exec(scan)) !== null) {
|
|
152
|
+
// Symmetric with bodyCallsHook: a `return <Foo/>` inside a nested
|
|
153
|
+
// function/arrow does NOT make the OUTER function JSX-returning.
|
|
154
|
+
if (isInsideNestedFunction(scan, m.index))
|
|
155
|
+
continue;
|
|
156
|
+
// The `<` that the regex matched starts at m.index + m[0].length - 1.
|
|
157
|
+
const ltIndex = m.index + m[0].length - 1;
|
|
158
|
+
if (looksLikeJsxOpenAt(scan, ltIndex))
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
// Replace every `return { ... }` object literal's contents with spaces so
|
|
164
|
+
// JSX inside object values (factory pattern, e.g. `getMdxComponents`) is not
|
|
165
|
+
// counted as evidence the outer function returns JSX. Whitespace-preserving
|
|
166
|
+
// to keep indices stable for the subsequent regex scans.
|
|
167
|
+
function blankReturnObjectLiterals(body) {
|
|
168
|
+
const RETURN_OBJ_RE = /\breturn\s*\{/g;
|
|
169
|
+
let out = body;
|
|
170
|
+
let m;
|
|
171
|
+
RETURN_OBJ_RE.lastIndex = 0;
|
|
172
|
+
while ((m = RETURN_OBJ_RE.exec(out)) !== null) {
|
|
173
|
+
const openIdx = m.index + m[0].length - 1;
|
|
174
|
+
let depth = 1;
|
|
175
|
+
let i = openIdx + 1;
|
|
176
|
+
for (; i < out.length; i++) {
|
|
177
|
+
const c = out[i];
|
|
178
|
+
if (c === "{")
|
|
179
|
+
depth++;
|
|
180
|
+
else if (c === "}") {
|
|
181
|
+
depth--;
|
|
182
|
+
if (depth === 0)
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const endIdx = i;
|
|
187
|
+
const blanked = out.slice(openIdx + 1, endIdx).replace(/[^\n]/g, " ");
|
|
188
|
+
out = out.slice(0, openIdx + 1) + blanked + out.slice(endIdx);
|
|
189
|
+
RETURN_OBJ_RE.lastIndex = endIdx + 1;
|
|
190
|
+
}
|
|
191
|
+
return out;
|
|
192
|
+
}
|
|
193
|
+
function looksLikeJsxOpenAt(body, ltIndex) {
|
|
194
|
+
// Verify the char before `<` (skipping whitespace and one optional `(`)
|
|
195
|
+
// is `return` or `(`. RETURN_LT_RE guarantees this; this check is belt-
|
|
196
|
+
// and-suspenders against pathological matches.
|
|
197
|
+
const next = body[ltIndex + 1];
|
|
198
|
+
if (next === undefined)
|
|
199
|
+
return false;
|
|
200
|
+
// Fragment `<>` or close `</`
|
|
201
|
+
if (next === ">" || next === "/")
|
|
202
|
+
return true;
|
|
203
|
+
// Component `<UpperIdent`
|
|
204
|
+
if (/[A-Z]/.test(next)) {
|
|
205
|
+
// Read the identifier
|
|
206
|
+
let j = ltIndex + 1;
|
|
207
|
+
while (j < body.length && /[A-Za-z0-9_]/.test(body[j]))
|
|
208
|
+
j++;
|
|
209
|
+
const after = body[j];
|
|
210
|
+
// Reject `<UpperIdent,` (multi-param generic arrow / type-arg list:
|
|
211
|
+
// `<T,U>(x, y) => ...`).
|
|
212
|
+
if (after === ",")
|
|
213
|
+
return false;
|
|
214
|
+
// Reject bare generic arrow `<T>(x) => x`: shape is `<UpperIdent>` with
|
|
215
|
+
// `(` as the next non-whitespace char after `>`. Real JSX `<Foo>` is
|
|
216
|
+
// followed by children (text, `{`, `<`) or `</`, never by `(`.
|
|
217
|
+
if (after === ">") {
|
|
218
|
+
let k = j + 1;
|
|
219
|
+
while (k < body.length && /\s/.test(body[k]))
|
|
220
|
+
k++;
|
|
221
|
+
if (body[k] === "(")
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
// Lowercase identifier → HTML tag check
|
|
227
|
+
if (/[a-z]/.test(next)) {
|
|
228
|
+
let j = ltIndex + 1;
|
|
229
|
+
while (j < body.length && /[A-Za-z0-9-]/.test(body[j]))
|
|
230
|
+
j++;
|
|
231
|
+
const tag = body.slice(ltIndex + 1, j);
|
|
232
|
+
return HTML_TAGS.has(tag);
|
|
233
|
+
}
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Extracts the body of a function declaration starting at `declStart` via
|
|
238
|
+
* naive brace matching. Returns the slice from just AFTER the opening `{`
|
|
239
|
+
* up to (but not including) the matching closing `}`.
|
|
240
|
+
*
|
|
241
|
+
* Defensive fallbacks:
|
|
242
|
+
* - If no `{` is found at/after `declStart`, returns `source.slice(declStart)`
|
|
243
|
+
* (matches prior naive behavior for declaration-only forms).
|
|
244
|
+
* - If EOF is reached before depth returns to zero, returns everything from
|
|
245
|
+
* just after the opening `{` to end-of-source.
|
|
246
|
+
*
|
|
247
|
+
* Future improvement: braces inside string/template literals or comments are
|
|
248
|
+
* NOT tracked. Current heuristic is sufficient for the rule surface that
|
|
249
|
+
* consumes this helper (component/hook naming detection on real React
|
|
250
|
+
* sources). Switch to a TS-AST extraction if FP/FN evidence emerges.
|
|
251
|
+
*/
|
|
252
|
+
export function extractFunctionBody(source, declStart) {
|
|
253
|
+
const open = source.indexOf("{", declStart);
|
|
254
|
+
if (open < 0)
|
|
255
|
+
return source.slice(declStart);
|
|
256
|
+
let depth = 1;
|
|
257
|
+
for (let i = open + 1; i < source.length; i++) {
|
|
258
|
+
const c = source[i];
|
|
259
|
+
if (c === "{")
|
|
260
|
+
depth++;
|
|
261
|
+
else if (c === "}") {
|
|
262
|
+
depth--;
|
|
263
|
+
if (depth === 0)
|
|
264
|
+
return source.slice(open + 1, i);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return source.slice(open + 1);
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Returns true if `source` at `declStart` declares an implicit-return arrow
|
|
271
|
+
* function whose body is a JSX expression: `export const X = (...) => <JSX>`.
|
|
272
|
+
*
|
|
273
|
+
* `declStart` should point at the start of the export declaration (the same
|
|
274
|
+
* index `EXPORT_FUNC_RE` reports). We walk past `export … = (` and the param
|
|
275
|
+
* list, expect `=>`, and then check that the first non-whitespace char opens
|
|
276
|
+
* JSX (via the shared `looksLikeJsxOpenAt` disambiguator).
|
|
277
|
+
*
|
|
278
|
+
* Returns false for:
|
|
279
|
+
* - block-body arrows (`=> {`) — caller should use `bodyReturnsJsx` instead
|
|
280
|
+
* - non-JSX implicit returns (`=> text.toUpperCase()`)
|
|
281
|
+
* - implicit returns whose JSX is inside a nested expression
|
|
282
|
+
* (`xs => xs.map(x => <li/>)`)
|
|
283
|
+
*/
|
|
284
|
+
export function arrowImplicitReturnsJsx(source, declStart) {
|
|
285
|
+
const eq = source.indexOf("=", declStart);
|
|
286
|
+
if (eq < 0)
|
|
287
|
+
return false;
|
|
288
|
+
let i = eq + 1;
|
|
289
|
+
while (i < source.length && /\s/.test(source[i]))
|
|
290
|
+
i++;
|
|
291
|
+
if (source.slice(i, i + 5) === "async") {
|
|
292
|
+
i += 5;
|
|
293
|
+
while (i < source.length && /\s/.test(source[i]))
|
|
294
|
+
i++;
|
|
295
|
+
}
|
|
296
|
+
if (source[i] !== "(")
|
|
297
|
+
return false;
|
|
298
|
+
let depth = 1;
|
|
299
|
+
i++;
|
|
300
|
+
for (; i < source.length && depth > 0; i++) {
|
|
301
|
+
const c = source[i];
|
|
302
|
+
if (c === "(")
|
|
303
|
+
depth++;
|
|
304
|
+
else if (c === ")")
|
|
305
|
+
depth--;
|
|
306
|
+
}
|
|
307
|
+
if (depth !== 0)
|
|
308
|
+
return false;
|
|
309
|
+
while (i < source.length && /\s/.test(source[i]))
|
|
310
|
+
i++;
|
|
311
|
+
if (source[i] === ":") {
|
|
312
|
+
// Optional return-type annotation: skip until `=>`.
|
|
313
|
+
while (i < source.length && !(source[i] === "=" && source[i + 1] === ">"))
|
|
314
|
+
i++;
|
|
315
|
+
}
|
|
316
|
+
if (source[i] !== "=" || source[i + 1] !== ">")
|
|
317
|
+
return false;
|
|
318
|
+
i += 2;
|
|
319
|
+
while (i < source.length && /\s/.test(source[i]))
|
|
320
|
+
i++;
|
|
321
|
+
if (source[i] !== "<")
|
|
322
|
+
return false;
|
|
323
|
+
return looksLikeJsxOpenAt(source, i);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Filename / path evidence: a function is more likely to be a hook when it
|
|
327
|
+
* lives under `**\/hooks\/**` or in a file named `use-*.{ts,tsx,js,jsx}`.
|
|
328
|
+
*/
|
|
329
|
+
export function fileIsInHooksDir(filePath) {
|
|
330
|
+
// Normalise backslashes for cross-platform determinism.
|
|
331
|
+
const p = filePath.replace(/\\/g, "/");
|
|
332
|
+
if (/(^|\/)hooks\//.test(p))
|
|
333
|
+
return true;
|
|
334
|
+
const base = p.slice(p.lastIndexOf("/") + 1);
|
|
335
|
+
if (/^use-[\w.-]+\.(tsx?|jsx?)$/.test(base))
|
|
336
|
+
return true;
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Filename-as-evidence refinement (issue #166).
|
|
341
|
+
*
|
|
342
|
+
* Returns true ONLY when the file is named `use-<kebab>.{ts,tsx,js,jsx}` AND
|
|
343
|
+
* `funcName` is the camelCase form of `<kebab>` — i.e. the function name
|
|
344
|
+
* literally matches what the filename advertises as the hook target
|
|
345
|
+
* (minus the `use` prefix).
|
|
346
|
+
*
|
|
347
|
+
* Examples:
|
|
348
|
+
* use-toggle.ts + "toggle" → true
|
|
349
|
+
* use-combine-ref.ts + "combineRef" → true
|
|
350
|
+
* use-combine-ref.ts + "composeRefs" → false (co-located helper)
|
|
351
|
+
* use-toggle.ts + "useToggle" → false (already prefixed)
|
|
352
|
+
* hooks/index.ts + anything → false (no use-X filename)
|
|
353
|
+
* lib/helpers.ts + anything → false (not a use-X file)
|
|
354
|
+
*
|
|
355
|
+
* Used by `naming/hook-prefix` to gate path-evidence: a function in a
|
|
356
|
+
* `hooks/` directory is flagged via path alone only when its name matches
|
|
357
|
+
* the filename's advertised target. Unrelated co-located utilities are not
|
|
358
|
+
* flagged via path-evidence and must show body-call evidence to fire.
|
|
359
|
+
*/
|
|
360
|
+
export function filenameMatchesFunction(filePath, funcName) {
|
|
361
|
+
const p = filePath.replace(/\\/g, "/");
|
|
362
|
+
const base = p.slice(p.lastIndexOf("/") + 1);
|
|
363
|
+
const m = base.match(/^use-([\w.-]+)\.(?:tsx?|jsx?)$/);
|
|
364
|
+
if (!m)
|
|
365
|
+
return false;
|
|
366
|
+
const kebab = m[1];
|
|
367
|
+
// Convert kebab to camelCase: split on `-`, lowercase first segment,
|
|
368
|
+
// capitalize the rest. `combine-ref` → `combineRef`.
|
|
369
|
+
const parts = kebab.split("-").filter((s) => s.length > 0);
|
|
370
|
+
if (parts.length === 0)
|
|
371
|
+
return false;
|
|
372
|
+
const camel = parts[0].toLowerCase() +
|
|
373
|
+
parts
|
|
374
|
+
.slice(1)
|
|
375
|
+
.map((s) => s[0].toUpperCase() + s.slice(1).toLowerCase())
|
|
376
|
+
.join("");
|
|
377
|
+
return funcName === camel;
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=_function-body-analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_function-body-analysis.js","sourceRoot":"","sources":["../../src/rules/_function-body-analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { RuleModule } from "@typescript-eslint/utils/ts-eslint";
|
|
2
|
+
import type { Rule, RuleContext, ParsedFiles, RuleEvalResult, AxisName, Severity, RuleMeta } from "../types.js";
|
|
3
|
+
export type { RuleModule };
|
|
4
|
+
export interface LyseRuleMeta {
|
|
5
|
+
axis: AxisName;
|
|
6
|
+
lyseRuleId: string;
|
|
7
|
+
defaultSeverity: Severity;
|
|
8
|
+
shortDescription: string;
|
|
9
|
+
fullDescription: string;
|
|
10
|
+
helpUri: string;
|
|
11
|
+
rationale: string;
|
|
12
|
+
examples: {
|
|
13
|
+
good: string;
|
|
14
|
+
bad: string;
|
|
15
|
+
}[];
|
|
16
|
+
allowlist: string[];
|
|
17
|
+
}
|
|
18
|
+
export type LyseEvaluator = (ctx: RuleContext, parsedFiles: ParsedFiles) => Promise<RuleEvalResult>;
|
|
19
|
+
export interface LyseRuleDefinition<Options extends readonly unknown[] = []> {
|
|
20
|
+
meta: LyseRuleMeta;
|
|
21
|
+
defaultOptions: Options;
|
|
22
|
+
create: () => {
|
|
23
|
+
evaluate: LyseEvaluator;
|
|
24
|
+
};
|
|
25
|
+
classifyConfidence?: Rule["classifyConfidence"];
|
|
26
|
+
applyCodemod?: Rule["applyCodemod"];
|
|
27
|
+
}
|
|
28
|
+
export declare function createLyseRule<Options extends readonly unknown[] = []>(def: LyseRuleDefinition<Options>): Rule;
|
|
29
|
+
export declare function getRegisteredRuleMeta(id: string): LyseRuleMeta | undefined;
|
|
30
|
+
export declare function listRegisteredRuleMetas(): LyseRuleMeta[];
|
|
31
|
+
export declare function toRuleMeta(m: LyseRuleMeta): RuleMeta;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const META_REGISTRY = new Map();
|
|
2
|
+
export function createLyseRule(def) {
|
|
3
|
+
META_REGISTRY.set(def.meta.lyseRuleId, def.meta);
|
|
4
|
+
const { evaluate } = def.create();
|
|
5
|
+
return {
|
|
6
|
+
id: def.meta.lyseRuleId,
|
|
7
|
+
axis: def.meta.axis,
|
|
8
|
+
evaluate,
|
|
9
|
+
...(def.classifyConfidence ? { classifyConfidence: def.classifyConfidence } : {}),
|
|
10
|
+
...(def.applyCodemod ? { applyCodemod: def.applyCodemod } : {}),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function getRegisteredRuleMeta(id) {
|
|
14
|
+
return META_REGISTRY.get(id);
|
|
15
|
+
}
|
|
16
|
+
export function listRegisteredRuleMetas() {
|
|
17
|
+
return Array.from(META_REGISTRY.values());
|
|
18
|
+
}
|
|
19
|
+
export function toRuleMeta(m) {
|
|
20
|
+
return {
|
|
21
|
+
id: m.lyseRuleId,
|
|
22
|
+
axis: m.axis,
|
|
23
|
+
defaultSeverity: m.defaultSeverity,
|
|
24
|
+
shortDescription: m.shortDescription,
|
|
25
|
+
fullDescription: m.fullDescription,
|
|
26
|
+
helpUri: m.helpUri,
|
|
27
|
+
rationale: m.rationale,
|
|
28
|
+
examples: m.examples,
|
|
29
|
+
allowlist: m.allowlist,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=_rule-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_rule-module.js","sourceRoot":"","sources":["../../src/rules/_rule-module.ts"],"names":[],"mappings":"AAwCA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEtD,MAAM,UAAU,cAAc,CAE5B,GAAgC;IAChC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU;QACvB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;QACnB,QAAQ;QACR,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EAAU;IAC9C,OAAO,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAe;IACxC,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,UAAU;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;QACpC,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,SAAS,EAAE,CAAC,CAAC,SAAS;KACvB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared skip-context helpers used by tokens/no-hardcoded-color and
|
|
3
|
+
* tokens/no-hardcoded-spacing to suppress intentional false positives.
|
|
4
|
+
*
|
|
5
|
+
* NOTE: All helpers are SAME-LINE heuristics only. Multi-line <code> / <pre>
|
|
6
|
+
* blocks, or JSX expressions like sizes={"..."}, would require AST traversal
|
|
7
|
+
* — that is V1 work.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Returns true if the byte offset `index` in `source` falls inside a
|
|
11
|
+
* `<code>...</code>` or `<pre>...</pre>` block that opens AND closes on the
|
|
12
|
+
* same line as the match. Useful for skipping display-only CSS examples
|
|
13
|
+
* rendered by shadcn theme customizers.
|
|
14
|
+
*
|
|
15
|
+
* Limitation: multi-line code blocks are NOT detected. V1 needs AST context.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isInsideCodeDisplay(source: string, index: number): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Returns true if `index` is inside the quoted value of a JSX attribute we
|
|
20
|
+
* intentionally skip (sizes, srcSet, media — responsive image markup).
|
|
21
|
+
*/
|
|
22
|
+
export declare function isInsideSkippedJsxAttr(source: string, index: number): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Returns true if the byte offset `index` falls on the right-hand side of a
|
|
25
|
+
* CSS custom-property declaration — i.e. `--<name>:` followed by the value.
|
|
26
|
+
*
|
|
27
|
+
* Token *definitions* (`:root { --color: #fff }`, `@theme { --space: 16px }`)
|
|
28
|
+
* are the source of truth for the design system and must never be flagged
|
|
29
|
+
* as hardcoded drift. The guard is property-name-based so it works regardless
|
|
30
|
+
* of the enclosing selector (`:root`, `@theme`, `[data-theme=...]`, etc.).
|
|
31
|
+
*
|
|
32
|
+
* Walks back from `index` to the nearest declaration boundary (`;`, `{`, `}`,
|
|
33
|
+
* or buffer start) skipping whitespace, then checks whether the property name
|
|
34
|
+
* starts with `--`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isCssCustomPropertyDeclaration(source: string, index: number): boolean;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared skip-context helpers used by tokens/no-hardcoded-color and
|
|
3
|
+
* tokens/no-hardcoded-spacing to suppress intentional false positives.
|
|
4
|
+
*
|
|
5
|
+
* NOTE: All helpers are SAME-LINE heuristics only. Multi-line <code> / <pre>
|
|
6
|
+
* blocks, or JSX expressions like sizes={"..."}, would require AST traversal
|
|
7
|
+
* — that is V1 work.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Returns true if the byte offset `index` in `source` falls inside a
|
|
11
|
+
* `<code>...</code>` or `<pre>...</pre>` block that opens AND closes on the
|
|
12
|
+
* same line as the match. Useful for skipping display-only CSS examples
|
|
13
|
+
* rendered by shadcn theme customizers.
|
|
14
|
+
*
|
|
15
|
+
* Limitation: multi-line code blocks are NOT detected. V1 needs AST context.
|
|
16
|
+
*/
|
|
17
|
+
export function isInsideCodeDisplay(source, index) {
|
|
18
|
+
const lineStart = source.lastIndexOf("\n", index - 1) + 1;
|
|
19
|
+
let lineEnd = source.indexOf("\n", index);
|
|
20
|
+
if (lineEnd === -1)
|
|
21
|
+
lineEnd = source.length;
|
|
22
|
+
const line = source.slice(lineStart, lineEnd);
|
|
23
|
+
const posInLine = index - lineStart;
|
|
24
|
+
for (const tag of ["code", "pre"]) {
|
|
25
|
+
const openTag = `<${tag}>`;
|
|
26
|
+
const closeTag = `</${tag}>`;
|
|
27
|
+
let openIdx = -1;
|
|
28
|
+
while ((openIdx = line.indexOf(openTag, openIdx + 1)) !== -1) {
|
|
29
|
+
const closeIdx = line.indexOf(closeTag, openIdx + openTag.length);
|
|
30
|
+
if (closeIdx !== -1 && openIdx < posInLine && posInLine < closeIdx) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* JSX attributes whose string values should be excluded from spacing checks.
|
|
39
|
+
* These carry responsive image / media-query breakpoint values (px, vw, etc.)
|
|
40
|
+
* that are NOT design tokens.
|
|
41
|
+
*
|
|
42
|
+
* NOTE: the `sizes={"..."}` JSX-expression form is NOT handled by this regex.
|
|
43
|
+
* V1 work — requires AST traversal to detect the expression boundary.
|
|
44
|
+
*/
|
|
45
|
+
const SKIP_JSX_ATTRS = ["sizes", "srcSet", "srcset", "media"];
|
|
46
|
+
/**
|
|
47
|
+
* Returns true if `index` is inside the quoted value of a JSX attribute we
|
|
48
|
+
* intentionally skip (sizes, srcSet, media — responsive image markup).
|
|
49
|
+
*/
|
|
50
|
+
export function isInsideSkippedJsxAttr(source, index) {
|
|
51
|
+
const lineStart = source.lastIndexOf("\n", index - 1) + 1;
|
|
52
|
+
let lineEnd = source.indexOf("\n", index);
|
|
53
|
+
if (lineEnd === -1)
|
|
54
|
+
lineEnd = source.length;
|
|
55
|
+
const line = source.slice(lineStart, lineEnd);
|
|
56
|
+
const posInLine = index - lineStart;
|
|
57
|
+
for (const attr of SKIP_JSX_ATTRS) {
|
|
58
|
+
// Matches: attr="..." or attr='...'
|
|
59
|
+
// The sizes={"..."} form requires AST — deferred to V1.
|
|
60
|
+
const re = new RegExp(`${attr}\\s*=\\s*(?:"([^"]*)"|'([^']*)')`, "g");
|
|
61
|
+
let am;
|
|
62
|
+
while ((am = re.exec(line)) !== null) {
|
|
63
|
+
const value = am[1] ?? am[2] ?? "";
|
|
64
|
+
const quoteIdx = am.index + am[0].indexOf(value);
|
|
65
|
+
const valueStart = quoteIdx;
|
|
66
|
+
const valueEnd = quoteIdx + value.length;
|
|
67
|
+
if (posInLine >= valueStart && posInLine <= valueEnd)
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Returns true if the byte offset `index` falls on the right-hand side of a
|
|
75
|
+
* CSS custom-property declaration — i.e. `--<name>:` followed by the value.
|
|
76
|
+
*
|
|
77
|
+
* Token *definitions* (`:root { --color: #fff }`, `@theme { --space: 16px }`)
|
|
78
|
+
* are the source of truth for the design system and must never be flagged
|
|
79
|
+
* as hardcoded drift. The guard is property-name-based so it works regardless
|
|
80
|
+
* of the enclosing selector (`:root`, `@theme`, `[data-theme=...]`, etc.).
|
|
81
|
+
*
|
|
82
|
+
* Walks back from `index` to the nearest declaration boundary (`;`, `{`, `}`,
|
|
83
|
+
* or buffer start) skipping whitespace, then checks whether the property name
|
|
84
|
+
* starts with `--`.
|
|
85
|
+
*/
|
|
86
|
+
export function isCssCustomPropertyDeclaration(source, index) {
|
|
87
|
+
let colonIdx = -1;
|
|
88
|
+
let depth = 0;
|
|
89
|
+
for (let i = index - 1; i >= 0; i--) {
|
|
90
|
+
const c = source[i];
|
|
91
|
+
if (c === ")") {
|
|
92
|
+
depth++;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (c === "(") {
|
|
96
|
+
if (depth > 0)
|
|
97
|
+
depth--;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (depth > 0)
|
|
101
|
+
continue;
|
|
102
|
+
if (c === ";" || c === "{" || c === "}")
|
|
103
|
+
return false;
|
|
104
|
+
if (c === ":") {
|
|
105
|
+
colonIdx = i;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (colonIdx < 0)
|
|
110
|
+
return false;
|
|
111
|
+
let end = colonIdx;
|
|
112
|
+
while (end > 0) {
|
|
113
|
+
const c = source[end - 1] ?? "";
|
|
114
|
+
if (!/\s/.test(c))
|
|
115
|
+
break;
|
|
116
|
+
end--;
|
|
117
|
+
}
|
|
118
|
+
let start = end;
|
|
119
|
+
while (start > 0) {
|
|
120
|
+
const c = source[start - 1] ?? "";
|
|
121
|
+
if (!/[a-zA-Z0-9_-]/.test(c))
|
|
122
|
+
break;
|
|
123
|
+
start--;
|
|
124
|
+
}
|
|
125
|
+
const propName = source.slice(start, end);
|
|
126
|
+
return propName.startsWith("--");
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=_skip-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_skip-context.js","sourceRoot":"","sources":["../../src/rules/_skip-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const rule: import("../types.js").Rule;
|