@shivaedev/quality 0.3.1 → 0.5.0
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/CHANGELOG.md +46 -0
- package/README.md +187 -30
- package/biome/declarations.json +17 -0
- package/biome/plugins/ambient-runtime.grit +18 -0
- package/biome/plugins/effect-fn-spans.grit +7 -0
- package/biome/preset.json +602 -0
- package/dist/baseline/compare.d.ts +8 -9
- package/dist/baseline/compare.d.ts.map +1 -1
- package/dist/baseline/compare.js +4 -4
- package/dist/baseline/compare.js.map +1 -1
- package/dist/baseline/format.d.ts +4 -4
- package/dist/baseline/format.d.ts.map +1 -1
- package/dist/baseline/format.js +3 -2
- package/dist/baseline/format.js.map +1 -1
- package/dist/baseline/guard.d.ts +3 -3
- package/dist/baseline/guard.d.ts.map +1 -1
- package/dist/baseline/guard.js +6 -5
- package/dist/baseline/guard.js.map +1 -1
- package/dist/baseline/legacy.d.ts +3 -3
- package/dist/baseline/legacy.d.ts.map +1 -1
- package/dist/baseline/legacy.js.map +1 -1
- package/dist/baseline/rewrite.d.ts +1 -1
- package/dist/baseline/rewrite.d.ts.map +1 -1
- package/dist/baseline/rewrite.js.map +1 -1
- package/dist/baseline/update.d.ts +8 -9
- package/dist/baseline/update.d.ts.map +1 -1
- package/dist/baseline/update.js +10 -9
- package/dist/baseline/update.js.map +1 -1
- package/dist/biome/report.d.ts +33 -0
- package/dist/biome/report.d.ts.map +1 -0
- package/dist/biome/report.js +25 -0
- package/dist/biome/report.js.map +1 -0
- package/dist/biome/run.d.ts +7 -0
- package/dist/biome/run.d.ts.map +1 -0
- package/dist/biome/run.js +16 -0
- package/dist/biome/run.js.map +1 -0
- package/dist/cli/args.d.ts +6 -3
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +9 -4
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/baseline.d.ts +1 -1
- package/dist/cli/baseline.d.ts.map +1 -1
- package/dist/cli/baseline.js +3 -3
- package/dist/cli/baseline.js.map +1 -1
- package/dist/cli/check.js.map +1 -1
- package/dist/cli/fix.d.ts +4 -0
- package/dist/cli/fix.d.ts.map +1 -0
- package/dist/cli/fix.js +19 -0
- package/dist/cli/fix.js.map +1 -0
- package/dist/cli/lint.js +1 -1
- package/dist/cli/lint.js.map +1 -1
- package/dist/cli/run-main.d.ts.map +1 -1
- package/dist/cli/run-main.js +7 -3
- package/dist/cli/run-main.js.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/decode.d.ts +4 -4
- package/dist/config/decode.js +12 -12
- package/dist/config/decode.js.map +1 -1
- package/dist/config/load.d.ts +3 -3
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +1 -1
- package/dist/config/load.js.map +1 -1
- package/dist/config/resolve.d.ts +3 -5
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +11 -5
- package/dist/config/resolve.js.map +1 -1
- package/dist/config.d.ts +9 -9
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/decoded.d.ts +1 -1
- package/dist/decoded.d.ts.map +1 -1
- package/dist/engine/baseline-file.d.ts +1 -1
- package/dist/engine/baseline-file.d.ts.map +1 -1
- package/dist/engine/evaluate.d.ts +8 -9
- package/dist/engine/evaluate.d.ts.map +1 -1
- package/dist/engine/evaluate.js +4 -4
- package/dist/engine/evaluate.js.map +1 -1
- package/dist/engine/run-rules.d.ts +4 -3
- package/dist/engine/run-rules.d.ts.map +1 -1
- package/dist/engine/run-rules.js +3 -3
- package/dist/engine/run-rules.js.map +1 -1
- package/dist/engine/session.d.ts +3 -3
- package/dist/engine/session.d.ts.map +1 -1
- package/dist/engine/violation.d.ts +11 -3
- package/dist/engine/violation.d.ts.map +1 -1
- package/dist/engine/violation.js +6 -2
- package/dist/engine/violation.js.map +1 -1
- package/dist/exceptions/registry.d.ts +7 -8
- package/dist/exceptions/registry.d.ts.map +1 -1
- package/dist/exceptions/registry.js +6 -6
- package/dist/exceptions/registry.js.map +1 -1
- package/dist/git/base.d.ts +1 -1
- package/dist/git/base.d.ts.map +1 -1
- package/dist/git/base.js.map +1 -1
- package/dist/git/command.d.ts +3 -3
- package/dist/git/command.d.ts.map +1 -1
- package/dist/git/command.js.map +1 -1
- package/dist/git/history.d.ts +1 -1
- package/dist/git/history.d.ts.map +1 -1
- package/dist/git/history.js +1 -1
- package/dist/git/history.js.map +1 -1
- package/dist/imports/ambient.d.ts +7 -0
- package/dist/imports/ambient.d.ts.map +1 -0
- package/dist/imports/ambient.js +44 -0
- package/dist/imports/ambient.js.map +1 -0
- package/dist/imports/components.d.ts +2 -0
- package/dist/imports/components.d.ts.map +1 -0
- package/dist/imports/components.js +63 -0
- package/dist/imports/components.js.map +1 -0
- package/dist/imports/extract.d.ts +10 -0
- package/dist/imports/extract.d.ts.map +1 -0
- package/dist/imports/extract.js +100 -0
- package/dist/imports/extract.js.map +1 -0
- package/dist/imports/fences/dsl.d.ts +18 -0
- package/dist/imports/fences/dsl.d.ts.map +1 -0
- package/dist/imports/fences/dsl.js +14 -0
- package/dist/imports/fences/dsl.js.map +1 -0
- package/dist/imports/fences/evaluate.d.ts +12 -0
- package/dist/imports/fences/evaluate.d.ts.map +1 -0
- package/dist/imports/fences/evaluate.js +55 -0
- package/dist/imports/fences/evaluate.js.map +1 -0
- package/dist/imports/fences/match.d.ts +17 -0
- package/dist/imports/fences/match.d.ts.map +1 -0
- package/dist/imports/fences/match.js +106 -0
- package/dist/imports/fences/match.js.map +1 -0
- package/dist/imports/fences/model.d.ts +60 -0
- package/dist/imports/fences/model.d.ts.map +1 -0
- package/dist/imports/fences/model.js +2 -0
- package/dist/imports/fences/model.js.map +1 -0
- package/dist/imports/fences/policy.d.ts +5 -0
- package/dist/imports/fences/policy.d.ts.map +1 -0
- package/dist/imports/fences/policy.js +59 -0
- package/dist/imports/fences/policy.js.map +1 -0
- package/dist/imports/fences/reach.d.ts +12 -0
- package/dist/imports/fences/reach.d.ts.map +1 -0
- package/dist/imports/fences/reach.js +39 -0
- package/dist/imports/fences/reach.js.map +1 -0
- package/dist/imports/fences/selectors.d.ts +11 -0
- package/dist/imports/fences/selectors.d.ts.map +1 -0
- package/dist/imports/fences/selectors.js +27 -0
- package/dist/imports/fences/selectors.js.map +1 -0
- package/dist/imports/fences/vocabulary.d.ts +9 -0
- package/dist/imports/fences/vocabulary.d.ts.map +1 -0
- package/dist/imports/fences/vocabulary.js +40 -0
- package/dist/imports/fences/vocabulary.js.map +1 -0
- package/dist/imports/generated.d.ts +6 -0
- package/dist/imports/generated.d.ts.map +1 -0
- package/dist/imports/generated.js +78 -0
- package/dist/imports/generated.js.map +1 -0
- package/dist/imports/glob.d.ts +2 -0
- package/dist/imports/glob.d.ts.map +1 -0
- package/dist/imports/glob.js +125 -0
- package/dist/imports/glob.js.map +1 -0
- package/dist/imports/graph.d.ts +23 -0
- package/dist/imports/graph.d.ts.map +1 -0
- package/dist/imports/graph.js +56 -0
- package/dist/imports/graph.js.map +1 -0
- package/dist/imports/paths.d.ts +2 -0
- package/dist/imports/paths.d.ts.map +1 -0
- package/dist/imports/paths.js +24 -0
- package/dist/imports/paths.js.map +1 -0
- package/dist/imports/pnpm-workspace.d.ts +2 -0
- package/dist/imports/pnpm-workspace.d.ts.map +1 -0
- package/dist/imports/pnpm-workspace.js +122 -0
- package/dist/imports/pnpm-workspace.js.map +1 -0
- package/dist/imports/projects.d.ts +10 -0
- package/dist/imports/projects.d.ts.map +1 -0
- package/dist/imports/projects.js +83 -0
- package/dist/imports/projects.js.map +1 -0
- package/dist/imports/resolve.d.ts +16 -0
- package/dist/imports/resolve.d.ts.map +1 -0
- package/dist/imports/resolve.js +88 -0
- package/dist/imports/resolve.js.map +1 -0
- package/dist/imports/workspace.d.ts +10 -0
- package/dist/imports/workspace.d.ts.map +1 -0
- package/dist/imports/workspace.js +55 -0
- package/dist/imports/workspace.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/inventory/collect.d.ts +6 -6
- package/dist/inventory/collect.d.ts.map +1 -1
- package/dist/inventory/collect.js.map +1 -1
- package/dist/manifests/sorted.d.ts +14 -0
- package/dist/manifests/sorted.d.ts.map +1 -0
- package/dist/manifests/sorted.js +39 -0
- package/dist/manifests/sorted.js.map +1 -0
- package/dist/report/guard.d.ts +1 -1
- package/dist/report/guard.d.ts.map +1 -1
- package/dist/report/guard.js +1 -1
- package/dist/report/guard.js.map +1 -1
- package/dist/report/render.d.ts +2 -2
- package/dist/report/render.d.ts.map +1 -1
- package/dist/report/render.js.map +1 -1
- package/dist/report/stale.d.ts +2 -2
- package/dist/report/stale.d.ts.map +1 -1
- package/dist/report/stale.js.map +1 -1
- package/dist/rule.d.ts +12 -11
- package/dist/rule.d.ts.map +1 -1
- package/dist/rule.js.map +1 -1
- package/dist/rules/biome.d.ts +4 -0
- package/dist/rules/biome.d.ts.map +1 -0
- package/dist/rules/biome.js +40 -0
- package/dist/rules/biome.js.map +1 -0
- package/dist/rules/built-in.d.ts +8 -10
- package/dist/rules/built-in.d.ts.map +1 -1
- package/dist/rules/built-in.js +12 -0
- package/dist/rules/built-in.js.map +1 -1
- package/dist/rules/comments/kinds.d.ts +1 -2
- package/dist/rules/comments/kinds.d.ts.map +1 -1
- package/dist/rules/comments/kinds.js +7 -16
- package/dist/rules/comments/kinds.js.map +1 -1
- package/dist/rules/comments/max-per-file.d.ts +1 -1
- package/dist/rules/comments/max-per-file.js +11 -11
- package/dist/rules/comments/max-per-file.js.map +1 -1
- package/dist/rules/comments/no-banner.js +2 -2
- package/dist/rules/comments/no-banner.js.map +1 -1
- package/dist/rules/comments/no-environment-pragma.d.ts +2 -0
- package/dist/rules/comments/no-environment-pragma.d.ts.map +1 -0
- package/dist/rules/comments/no-environment-pragma.js +8 -0
- package/dist/rules/comments/no-environment-pragma.js.map +1 -0
- package/dist/rules/comments/no-jsdoc.js +3 -3
- package/dist/rules/comments/no-jsdoc.js.map +1 -1
- package/dist/rules/comments/no-line-reference.js +2 -2
- package/dist/rules/comments/no-line-reference.js.map +1 -1
- package/dist/rules/comments/no-pr-reference.js +6 -6
- package/dist/rules/comments/no-pr-reference.js.map +1 -1
- package/dist/rules/comments/no-todo.js +2 -2
- package/dist/rules/comments/no-todo.js.map +1 -1
- package/dist/rules/comments/pattern-rule.d.ts +2 -2
- package/dist/rules/comments/pattern-rule.d.ts.map +1 -1
- package/dist/rules/comments/pattern-rule.js +2 -2
- package/dist/rules/comments/pattern-rule.js.map +1 -1
- package/dist/rules/comments/scan.d.ts +6 -6
- package/dist/rules/comments/scan.d.ts.map +1 -1
- package/dist/rules/comments/scan.js +2 -2
- package/dist/rules/comments/scan.js.map +1 -1
- package/dist/rules/imports/cycles.d.ts +2 -0
- package/dist/rules/imports/cycles.d.ts.map +1 -0
- package/dist/rules/imports/cycles.js +38 -0
- package/dist/rules/imports/cycles.js.map +1 -0
- package/dist/rules/imports/fences.d.ts +5 -0
- package/dist/rules/imports/fences.d.ts.map +1 -0
- package/dist/rules/imports/fences.js +24 -0
- package/dist/rules/imports/fences.js.map +1 -0
- package/dist/rules/imports/resolvable.d.ts +4 -0
- package/dist/rules/imports/resolvable.d.ts.map +1 -0
- package/dist/rules/imports/resolvable.js +22 -0
- package/dist/rules/imports/resolvable.js.map +1 -0
- package/dist/rules/manifests-sorted.d.ts +2 -0
- package/dist/rules/manifests-sorted.d.ts.map +1 -0
- package/dist/rules/manifests-sorted.js +22 -0
- package/dist/rules/manifests-sorted.js.map +1 -0
- package/dist/rules/max-lines.js +4 -4
- package/dist/rules/max-lines.js.map +1 -1
- package/dist/rules/suppressions/biome/configs.d.ts +21 -10
- package/dist/rules/suppressions/biome/configs.d.ts.map +1 -1
- package/dist/rules/suppressions/biome/configs.js +58 -22
- package/dist/rules/suppressions/biome/configs.js.map +1 -1
- package/dist/rules/suppressions/biome/declarations.d.ts +18 -0
- package/dist/rules/suppressions/biome/declarations.d.ts.map +1 -0
- package/dist/rules/suppressions/biome/declarations.js +20 -0
- package/dist/rules/suppressions/biome/declarations.js.map +1 -0
- package/dist/rules/suppressions/biome/json.d.ts +2 -2
- package/dist/rules/suppressions/biome/json.d.ts.map +1 -1
- package/dist/rules/suppressions/biome/json.js +1 -1
- package/dist/rules/suppressions/biome/json.js.map +1 -1
- package/dist/rules/suppressions/biome/resolve.d.ts +3 -0
- package/dist/rules/suppressions/biome/resolve.d.ts.map +1 -0
- package/dist/rules/suppressions/biome/resolve.js +70 -0
- package/dist/rules/suppressions/biome/resolve.js.map +1 -0
- package/dist/rules/suppressions/biome/weakenings.d.ts +5 -5
- package/dist/rules/suppressions/biome/weakenings.d.ts.map +1 -1
- package/dist/rules/suppressions/biome/weakenings.js +41 -33
- package/dist/rules/suppressions/biome/weakenings.js.map +1 -1
- package/dist/rules/suppressions/biome-overrides.d.ts +1 -1
- package/dist/rules/suppressions/biome-overrides.d.ts.map +1 -1
- package/dist/rules/suppressions/biome-overrides.js +35 -27
- package/dist/rules/suppressions/biome-overrides.js.map +1 -1
- package/dist/rules/suppressions/directives.d.ts +1 -1
- package/dist/rules/suppressions/directives.d.ts.map +1 -1
- package/dist/rules/suppressions/directives.js +11 -11
- package/dist/rules/suppressions/directives.js.map +1 -1
- package/dist/rules/suppressions/no-double-cast.js +2 -2
- package/dist/rules/suppressions/no-double-cast.js.map +1 -1
- package/dist/rules/suppressions/no-inline.d.ts +1 -7
- package/dist/rules/suppressions/no-inline.d.ts.map +1 -1
- package/dist/rules/suppressions/no-inline.js +7 -30
- package/dist/rules/suppressions/no-inline.js.map +1 -1
- package/dist/rules/suppressions/stylesheet-comments.d.ts +1 -1
- package/dist/rules/suppressions/stylesheet-comments.d.ts.map +1 -1
- package/dist/rules/suppressions/stylesheet-comments.js +3 -3
- package/dist/rules/suppressions/stylesheet-comments.js.map +1 -1
- package/dist/rules/syntax.js +4 -4
- package/dist/rules/syntax.js.map +1 -1
- package/dist/standard-schema.d.ts +1 -1
- package/dist/standard-schema.d.ts.map +1 -1
- package/dist/vitest.d.ts +3 -0
- package/dist/vitest.d.ts.map +1 -0
- package/dist/vitest.js +20 -0
- package/dist/vitest.js.map +1 -0
- package/package.json +48 -31
- package/src/baseline/compare.ts +10 -15
- package/src/baseline/format.ts +8 -6
- package/src/baseline/guard.ts +11 -10
- package/src/baseline/legacy.ts +3 -3
- package/src/baseline/rewrite.ts +1 -1
- package/src/baseline/update.ts +21 -21
- package/src/biome/report.ts +35 -0
- package/src/biome/run.ts +23 -0
- package/src/cli/args.ts +14 -8
- package/src/cli/baseline.ts +5 -6
- package/src/cli/check.ts +1 -1
- package/src/cli/fix.ts +19 -0
- package/src/cli/lint.ts +1 -1
- package/src/cli/run-main.ts +8 -3
- package/src/cli.ts +3 -0
- package/src/config/decode.ts +12 -12
- package/src/config/load.ts +4 -4
- package/src/config/resolve.ts +15 -11
- package/src/config.ts +9 -9
- package/src/decoded.ts +1 -1
- package/src/engine/baseline-file.ts +1 -1
- package/src/engine/evaluate.ts +14 -16
- package/src/engine/run-rules.ts +8 -7
- package/src/engine/session.ts +3 -3
- package/src/engine/violation.ts +18 -4
- package/src/exceptions/registry.ts +10 -16
- package/src/git/base.ts +2 -2
- package/src/git/command.ts +3 -3
- package/src/git/history.ts +2 -2
- package/src/imports/ambient.ts +54 -0
- package/src/imports/components.ts +80 -0
- package/src/imports/extract.ts +129 -0
- package/src/imports/fences/dsl.ts +33 -0
- package/src/imports/fences/evaluate.ts +75 -0
- package/src/imports/fences/match.ts +148 -0
- package/src/imports/fences/model.ts +42 -0
- package/src/imports/fences/policy.ts +70 -0
- package/src/imports/fences/reach.ts +62 -0
- package/src/imports/fences/selectors.ts +37 -0
- package/src/imports/fences/vocabulary.ts +51 -0
- package/src/imports/generated.ts +95 -0
- package/src/imports/glob.ts +142 -0
- package/src/imports/graph.ts +81 -0
- package/src/imports/paths.ts +28 -0
- package/src/imports/pnpm-workspace.ts +134 -0
- package/src/imports/projects.ts +106 -0
- package/src/imports/resolve.ts +115 -0
- package/src/imports/workspace.ts +76 -0
- package/src/index.ts +3 -0
- package/src/inventory/collect.ts +6 -6
- package/src/manifests/sorted.ts +46 -0
- package/src/report/guard.ts +2 -2
- package/src/report/render.ts +9 -9
- package/src/report/stale.ts +3 -3
- package/src/rule.ts +13 -12
- package/src/rules/biome.ts +47 -0
- package/src/rules/built-in.ts +12 -0
- package/src/rules/comments/kinds.ts +11 -21
- package/src/rules/comments/max-per-file.ts +13 -13
- package/src/rules/comments/no-banner.ts +2 -2
- package/src/rules/comments/no-environment-pragma.ts +9 -0
- package/src/rules/comments/no-jsdoc.ts +3 -3
- package/src/rules/comments/no-line-reference.ts +2 -2
- package/src/rules/comments/no-pr-reference.ts +6 -6
- package/src/rules/comments/no-todo.ts +2 -2
- package/src/rules/comments/pattern-rule.ts +6 -6
- package/src/rules/comments/scan.ts +13 -13
- package/src/rules/imports/cycles.ts +44 -0
- package/src/rules/imports/fences.ts +27 -0
- package/src/rules/imports/resolvable.ts +23 -0
- package/src/rules/manifests-sorted.ts +23 -0
- package/src/rules/max-lines.ts +6 -6
- package/src/rules/suppressions/biome/configs.ts +99 -30
- package/src/rules/suppressions/biome/declarations.ts +37 -0
- package/src/rules/suppressions/biome/json.ts +3 -3
- package/src/rules/suppressions/biome/resolve.ts +86 -0
- package/src/rules/suppressions/biome/weakenings.ts +64 -48
- package/src/rules/suppressions/biome-overrides.ts +45 -36
- package/src/rules/suppressions/directives.ts +12 -12
- package/src/rules/suppressions/no-double-cast.ts +4 -4
- package/src/rules/suppressions/no-inline.ts +13 -37
- package/src/rules/suppressions/stylesheet-comments.ts +4 -4
- package/src/rules/syntax.ts +4 -4
- package/src/standard-schema.ts +1 -1
- package/src/vitest.ts +22 -0
- package/tsconfig/base.json +35 -0
- package/tsconfig/package.json +10 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { posix } from "node:path";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import { emptyScope, verdictFor, withIgnoreFile } from "../inventory/ignore-scope.js";
|
|
5
|
+
const IGNORE_FILE = ".gitignore";
|
|
6
|
+
const LEADING_DOT = /^\.\//u;
|
|
7
|
+
const TRAILING_SLASHES = /\/+$/u;
|
|
8
|
+
const NODE_MODULES = "node_modules";
|
|
9
|
+
const NOT_A_REPOSITORY = "not a git repository";
|
|
10
|
+
const PLACEHOLDERS = new Set([".gitkeep", ".keep"]);
|
|
11
|
+
const run = promisify(execFile);
|
|
12
|
+
async function withIgnoreFileIn(reader, scope, directory) {
|
|
13
|
+
const contents = await reader.readText(posix.join(directory, IGNORE_FILE));
|
|
14
|
+
return contents === undefined || contents === "" ? scope : withIgnoreFile(scope, posix.join(reader.root, directory), contents);
|
|
15
|
+
}
|
|
16
|
+
async function ignored(reader, file) {
|
|
17
|
+
const parts = file.split("/");
|
|
18
|
+
let scope = emptyScope;
|
|
19
|
+
for (const index of parts.keys()) {
|
|
20
|
+
scope = await withIgnoreFileIn(reader, scope, parts.slice(0, index).join("/") || ".");
|
|
21
|
+
if (verdictFor(scope, posix.join(reader.root, ...parts.slice(0, index + 1)), index < parts.length - 1) === "ignored") {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
async function tracked(root, folder) {
|
|
28
|
+
try {
|
|
29
|
+
const { stdout } = await run("git", ["ls-files", "-z", "--", folder], { cwd: root });
|
|
30
|
+
return stdout.split("\0").filter(Boolean);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error instanceof Error && "stderr" in error && String(error.stderr).includes(NOT_A_REPOSITORY)) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function under(folder, path) {
|
|
40
|
+
return path?.startsWith(`${folder}/`) === true;
|
|
41
|
+
}
|
|
42
|
+
async function contentIssue(reader, folder, named) {
|
|
43
|
+
const verdicts = await Promise.all(named.map((file) => ignored(reader, file)));
|
|
44
|
+
if (verdicts.includes(false)) {
|
|
45
|
+
return `"${folder}" is not ignored by git, so it holds source, not generated output`;
|
|
46
|
+
}
|
|
47
|
+
const kept = (await tracked(reader.root, folder)).find((file) => !PLACEHOLDERS.has(posix.basename(file)));
|
|
48
|
+
return kept === undefined ? undefined : `"${folder}" holds files git tracks, such as ${kept}, so it is not generated output`;
|
|
49
|
+
}
|
|
50
|
+
function placeIssue(graph, folder) {
|
|
51
|
+
if (folder === "" || folder.startsWith("../") || posix.isAbsolute(folder)) {
|
|
52
|
+
return `"${folder}" is no folder inside the repository`;
|
|
53
|
+
}
|
|
54
|
+
if (folder.split("/").includes(NODE_MODULES)) {
|
|
55
|
+
return `"${folder}" lies in node_modules, which holds installed packages, not generated output`;
|
|
56
|
+
}
|
|
57
|
+
return graph.edges.some((edge) => edge.to.kind === "file" && under(folder, edge.to.path))
|
|
58
|
+
? undefined
|
|
59
|
+
: `"${folder}" holds no file that an import names`;
|
|
60
|
+
}
|
|
61
|
+
async function issueOf(reader, graph, folder) {
|
|
62
|
+
const misplaced = placeIssue(graph, folder);
|
|
63
|
+
if (misplaced !== undefined) {
|
|
64
|
+
return misplaced;
|
|
65
|
+
}
|
|
66
|
+
const named = [...new Set(graph.edges.flatMap((edge) => (edge.to.kind === "file" && under(folder, edge.to.path) ? [edge.to.path] : [])))];
|
|
67
|
+
return await contentIssue(reader, folder, named);
|
|
68
|
+
}
|
|
69
|
+
// A generated folder may be empty until its generator runs, so a relative import of a missing file in it resolves.
|
|
70
|
+
export async function withoutGenerated(reader, graph, declared) {
|
|
71
|
+
const folders = declared.map((folder) => posix.normalize(folder).replace(LEADING_DOT, "").replace(TRAILING_SLASHES, ""));
|
|
72
|
+
const issues = (await Promise.all(folders.map((folder) => issueOf(reader, graph, folder)))).flatMap((issue) => issue ?? []);
|
|
73
|
+
if (issues.length > 0) {
|
|
74
|
+
throw new Error(`the generated folders are invalid:\n${issues.map((issue) => ` - ${issue}`).join("\n")}`);
|
|
75
|
+
}
|
|
76
|
+
return graph.unresolved.filter((request) => !folders.some((folder) => under(folder, request.missing)));
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=generated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generated.js","sourceRoot":"","sources":["../../src/imports/generated.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/imports/glob.ts"],"names":[],"mappings":"AAuIA,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAMtE"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
const STAR = "*";
|
|
2
|
+
const GLOBSTAR = "**";
|
|
3
|
+
const DOT = ".";
|
|
4
|
+
const NO_DOT = "(?!\\.)";
|
|
5
|
+
const EXTGLOB = /[?*+@!]\(/u;
|
|
6
|
+
const BRACE_RANGE = /^[^,]*\.\.[^,]*$/u;
|
|
7
|
+
const REGEX_SYNTAX = /[\\^$.*+?()[\]{}|/]/u;
|
|
8
|
+
const CLASS_SYNTAX = /[\\\]^]/gu;
|
|
9
|
+
const BRACE_DEPTH = new Map([
|
|
10
|
+
["{", 1],
|
|
11
|
+
["}", -1],
|
|
12
|
+
]);
|
|
13
|
+
function depthChange(char) {
|
|
14
|
+
return BRACE_DEPTH.get(char ?? "") ?? 0;
|
|
15
|
+
}
|
|
16
|
+
function charSource(char) {
|
|
17
|
+
if (char === STAR) {
|
|
18
|
+
return "[^/]*";
|
|
19
|
+
}
|
|
20
|
+
if (char === "?") {
|
|
21
|
+
return "[^/]";
|
|
22
|
+
}
|
|
23
|
+
return REGEX_SYNTAX.test(char) ? `\\${char}` : char;
|
|
24
|
+
}
|
|
25
|
+
function unreadable(pattern, problem) {
|
|
26
|
+
return new Error(`cannot read the workspace pattern "${pattern}": ${problem}`);
|
|
27
|
+
}
|
|
28
|
+
function closingBrace(text, open) {
|
|
29
|
+
let depth = 0;
|
|
30
|
+
for (let index = open; index < text.length; index += 1) {
|
|
31
|
+
depth += depthChange(text[index]);
|
|
32
|
+
if (depth === 0) {
|
|
33
|
+
return index;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return -1;
|
|
37
|
+
}
|
|
38
|
+
function choices(body) {
|
|
39
|
+
const parts = [""];
|
|
40
|
+
let depth = 0;
|
|
41
|
+
for (const char of body) {
|
|
42
|
+
depth += depthChange(char);
|
|
43
|
+
if (char === "," && depth === 0) {
|
|
44
|
+
parts.push("");
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
parts[parts.length - 1] += char;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return parts;
|
|
51
|
+
}
|
|
52
|
+
function expanded(pattern, whole) {
|
|
53
|
+
const open = pattern.indexOf("{");
|
|
54
|
+
if (open === -1) {
|
|
55
|
+
return [pattern];
|
|
56
|
+
}
|
|
57
|
+
const close = closingBrace(pattern, open);
|
|
58
|
+
if (close === -1) {
|
|
59
|
+
throw unreadable(whole, "a { never closes");
|
|
60
|
+
}
|
|
61
|
+
const body = pattern.slice(open + 1, close);
|
|
62
|
+
if (BRACE_RANGE.test(body)) {
|
|
63
|
+
throw unreadable(whole, "brace ranges are not supported");
|
|
64
|
+
}
|
|
65
|
+
const options = choices(body);
|
|
66
|
+
if (options.length < 2) {
|
|
67
|
+
throw unreadable(whole, "a { } needs two or more choices");
|
|
68
|
+
}
|
|
69
|
+
return options.flatMap((option) => expanded(`${pattern.slice(0, open)}${option}${pattern.slice(close + 1)}`, whole));
|
|
70
|
+
}
|
|
71
|
+
function characterClass(segment, start, whole) {
|
|
72
|
+
const negated = segment[start + 1] === "!" || segment[start + 1] === "^";
|
|
73
|
+
const first = start + (negated ? 2 : 1);
|
|
74
|
+
const end = segment.indexOf("]", segment[first] === "]" ? first + 1 : first);
|
|
75
|
+
if (end === -1) {
|
|
76
|
+
throw unreadable(whole, "a [ never closes");
|
|
77
|
+
}
|
|
78
|
+
const body = segment.slice(first, end);
|
|
79
|
+
if (body.includes("[:")) {
|
|
80
|
+
throw unreadable(whole, "character class names are not supported");
|
|
81
|
+
}
|
|
82
|
+
return { end, source: `[${negated ? "^" : ""}${body.replace(CLASS_SYNTAX, "\\$&")}]` };
|
|
83
|
+
}
|
|
84
|
+
function segmentOf(segment, whole) {
|
|
85
|
+
if (segment === GLOBSTAR) {
|
|
86
|
+
return GLOBSTAR;
|
|
87
|
+
}
|
|
88
|
+
if (EXTGLOB.test(segment)) {
|
|
89
|
+
throw unreadable(whole, "extended globs are not supported");
|
|
90
|
+
}
|
|
91
|
+
let source = "";
|
|
92
|
+
for (let index = 0; index < segment.length; index += 1) {
|
|
93
|
+
const char = segment[index] ?? "";
|
|
94
|
+
if (char === "[") {
|
|
95
|
+
const found = characterClass(segment, index, whole);
|
|
96
|
+
source += found.source;
|
|
97
|
+
index = found.end;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
source += charSource(char);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return new RegExp(`^${segment.startsWith(DOT) ? "" : NO_DOT}${source}$`, "u");
|
|
104
|
+
}
|
|
105
|
+
function segmentsMatch(pattern, path) {
|
|
106
|
+
const [first, ...rest] = pattern;
|
|
107
|
+
if (first === undefined) {
|
|
108
|
+
return path.length === 0;
|
|
109
|
+
}
|
|
110
|
+
if (first === GLOBSTAR) {
|
|
111
|
+
const hidden = path.findIndex((segment) => segment.startsWith(DOT));
|
|
112
|
+
const reachable = hidden === -1 ? path.length : hidden;
|
|
113
|
+
return [...path.keys(), path.length].some((skipped) => skipped <= reachable && segmentsMatch(rest, path.slice(skipped)));
|
|
114
|
+
}
|
|
115
|
+
const [head, ...tail] = path;
|
|
116
|
+
return head !== undefined && first.test(head) && segmentsMatch(rest, tail);
|
|
117
|
+
}
|
|
118
|
+
export function globMatcher(pattern) {
|
|
119
|
+
if (pattern.includes("\\")) {
|
|
120
|
+
throw unreadable(pattern, "escapes are not supported");
|
|
121
|
+
}
|
|
122
|
+
const alternatives = expanded(pattern, pattern).map((alternative) => alternative.split("/").map((segment) => segmentOf(segment, pattern)));
|
|
123
|
+
return (path) => alternatives.some((segments) => segmentsMatch(segments, path.split("/")));
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=glob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/imports/glob.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RuleInputs } from "../rule.ts";
|
|
2
|
+
import { type ImportKind } from "./extract.ts";
|
|
3
|
+
import { type Endpoint } from "./resolve.ts";
|
|
4
|
+
import { type WorkspacePackage } from "./workspace.ts";
|
|
5
|
+
export interface ImportEdge {
|
|
6
|
+
readonly from: string;
|
|
7
|
+
readonly kind: ImportKind;
|
|
8
|
+
readonly line: number;
|
|
9
|
+
readonly specifier: string;
|
|
10
|
+
readonly to: Endpoint;
|
|
11
|
+
readonly type: boolean;
|
|
12
|
+
}
|
|
13
|
+
export type UnresolvedImport = Omit<ImportEdge, "to"> & {
|
|
14
|
+
readonly missing: string | undefined;
|
|
15
|
+
};
|
|
16
|
+
export interface ImportGraph {
|
|
17
|
+
readonly edges: readonly ImportEdge[];
|
|
18
|
+
readonly modules: readonly string[];
|
|
19
|
+
readonly packages: readonly WorkspacePackage[];
|
|
20
|
+
readonly unresolved: readonly UnresolvedImport[];
|
|
21
|
+
}
|
|
22
|
+
export declare function importGraph(inputs: RuleInputs): Promise<ImportGraph>;
|
|
23
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/imports/graph.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,YAAY,CAAC;AAGzD,OAAO,EAAE,KAAK,UAAU,EAAiC,MAAM,cAAc,CAAC;AAE9E,OAAO,EAAE,KAAK,QAAQ,EAAoC,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,KAAK,gBAAgB,EAAqB,MAAM,gBAAgB,CAAC;AAE1E,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEjG,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACjD;AAkDD,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAIpE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { realpathSync } from "node:fs";
|
|
2
|
+
import { join, posix } from "node:path";
|
|
3
|
+
import { parse } from "../rules/syntax.js";
|
|
4
|
+
import { ambientModules } from "./ambient.js";
|
|
5
|
+
import { importsOf } from "./extract.js";
|
|
6
|
+
import { projectsFor } from "./projects.js";
|
|
7
|
+
import { isDeclarationFile, resolveImport } from "./resolve.js";
|
|
8
|
+
import { workspacePackages } from "./workspace.js";
|
|
9
|
+
const QUERY = /\?.*$/u;
|
|
10
|
+
const NO_MODULES = "the import graph covers no modules: the sources hold no TypeScript or JavaScript module. Point `sources` at the code, or turn the imports rules off.";
|
|
11
|
+
// A relative import of a missing file still names a path, so fences see it before its generator writes it.
|
|
12
|
+
function missingTarget(from, request) {
|
|
13
|
+
const relative = request.kind === "path-reference" || request.specifier.startsWith("./") || request.specifier.startsWith("../");
|
|
14
|
+
const target = posix.join(posix.dirname(from), request.specifier.replace(QUERY, ""));
|
|
15
|
+
return relative && !target.startsWith("../") ? target : undefined;
|
|
16
|
+
}
|
|
17
|
+
function walk(inputs, root) {
|
|
18
|
+
const projectOf = projectsFor(root);
|
|
19
|
+
const parsed = inputs.sources.flatMap((file) => {
|
|
20
|
+
const syntax = parse(file);
|
|
21
|
+
return syntax === undefined ? [] : [{ file, path: join(root, file.path), syntax }];
|
|
22
|
+
});
|
|
23
|
+
const ambient = ambientModules(parsed);
|
|
24
|
+
const edges = [];
|
|
25
|
+
const unresolved = [];
|
|
26
|
+
for (const { file, path, syntax } of parsed) {
|
|
27
|
+
const project = projectOf(path);
|
|
28
|
+
for (const request of importsOf(syntax, isDeclarationFile(file.path))) {
|
|
29
|
+
const to = resolveImport(root, ambient, request, path, project);
|
|
30
|
+
if (to === undefined) {
|
|
31
|
+
const missing = missingTarget(file.path, request);
|
|
32
|
+
unresolved.push({ ...request, from: file.path, missing });
|
|
33
|
+
edges.push(...(missing === undefined ? [] : [{ ...request, from: file.path, to: { kind: "file", path: missing } }]));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
edges.push({ ...request, from: file.path, to });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return { edges, modules: parsed.map(({ file }) => file.path), unresolved };
|
|
41
|
+
}
|
|
42
|
+
async function build(inputs) {
|
|
43
|
+
const walked = walk(inputs, realpathSync(inputs.root));
|
|
44
|
+
if (walked.modules.length === 0) {
|
|
45
|
+
throw new Error(NO_MODULES);
|
|
46
|
+
}
|
|
47
|
+
return { ...walked, packages: await workspacePackages(inputs) };
|
|
48
|
+
}
|
|
49
|
+
const graphs = new WeakMap();
|
|
50
|
+
// The three imports rules run on one scan, so they share the graph built from its sources.
|
|
51
|
+
export function importGraph(inputs) {
|
|
52
|
+
const known = graphs.get(inputs.sources) ?? build(inputs);
|
|
53
|
+
graphs.set(inputs.sources, known);
|
|
54
|
+
return known;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/imports/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/imports/paths.ts"],"names":[],"mappings":"AAQA,wBAAgB,YAAY,CAC3B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,EAC/C,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAC7B,SAAS,MAAM,EAAE,GAAG,SAAS,CAe/B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
function trail(previous, node) {
|
|
2
|
+
const path = [];
|
|
3
|
+
for (let step = node; step !== undefined; step = previous.get(step)) {
|
|
4
|
+
path.unshift(step);
|
|
5
|
+
}
|
|
6
|
+
return path;
|
|
7
|
+
}
|
|
8
|
+
export function shortestPath(start, neighbours, goal) {
|
|
9
|
+
const previous = new Map([[start, undefined]]);
|
|
10
|
+
const queue = [start];
|
|
11
|
+
for (const node of queue) {
|
|
12
|
+
for (const next of neighbours(node)) {
|
|
13
|
+
if (goal(next)) {
|
|
14
|
+
return [...trail(previous, node), next];
|
|
15
|
+
}
|
|
16
|
+
if (!previous.has(next)) {
|
|
17
|
+
previous.set(next, node);
|
|
18
|
+
queue.push(next);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/imports/paths.ts"],"names":[],"mappings":"AAAA,SAAS,KAAK,CAAC,QAAiD,EAAE,IAAY;IAC7E,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,IAAI,IAAI,GAAuB,IAAI,EAAE,IAAI,KAAK,SAAS,EAAE,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACzF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAC3B,KAAa,EACb,UAA+C,EAC/C,IAA+B;IAE/B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAA6B,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;IACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pnpm-workspace.d.ts","sourceRoot":"","sources":["../../src/imports/pnpm-workspace.ts"],"names":[],"mappings":"AAqHA,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAgBrE"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
const KEY = /^(?:packages|"packages"|'packages')\s*:/u;
|
|
2
|
+
const ITEM = "-";
|
|
3
|
+
const SPACE = /\s/u;
|
|
4
|
+
const LINE_BREAK = /\r?\n/u;
|
|
5
|
+
function failure(problem, cause) {
|
|
6
|
+
return new Error(`pnpm-workspace.yaml: ${problem}`, { cause });
|
|
7
|
+
}
|
|
8
|
+
function withoutComment(line) {
|
|
9
|
+
let quote;
|
|
10
|
+
for (let index = 0; index < line.length; index += 1) {
|
|
11
|
+
const char = line[index];
|
|
12
|
+
if (quote !== undefined) {
|
|
13
|
+
quote = char === quote ? undefined : quote;
|
|
14
|
+
}
|
|
15
|
+
else if (char === '"' || char === "'") {
|
|
16
|
+
quote = char;
|
|
17
|
+
}
|
|
18
|
+
else if (char === "#" && (index === 0 || SPACE.test(line[index - 1] ?? ""))) {
|
|
19
|
+
return line.slice(0, index).trimEnd();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return line.trimEnd();
|
|
23
|
+
}
|
|
24
|
+
function scalar(raw) {
|
|
25
|
+
const value = raw.trim();
|
|
26
|
+
if (value.startsWith('"') && value.endsWith('"') && value.length > 1) {
|
|
27
|
+
try {
|
|
28
|
+
return String(JSON.parse(value));
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
throw failure(`cannot read "${value}" in packages`, error);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (value.startsWith("'") && value.endsWith("'") && value.length > 1) {
|
|
35
|
+
return value.slice(1, -1).replaceAll("''", "'");
|
|
36
|
+
}
|
|
37
|
+
if (value === "" || value.includes(": ") || value.endsWith(":") || ["[", "{", "'", '"'].some((opening) => value.startsWith(opening))) {
|
|
38
|
+
throw failure(`cannot read "${value}" in packages`);
|
|
39
|
+
}
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
const FLOW_INDICATOR = /[{}[\]]/u;
|
|
43
|
+
function flowScalar(raw) {
|
|
44
|
+
const value = raw.trim();
|
|
45
|
+
const quoted = value.startsWith('"') || value.startsWith("'");
|
|
46
|
+
if (!quoted && FLOW_INDICATOR.test(value)) {
|
|
47
|
+
throw failure(`cannot read "${value}" in packages; quote a pattern that holds { } [ ] or ,`);
|
|
48
|
+
}
|
|
49
|
+
return scalar(value);
|
|
50
|
+
}
|
|
51
|
+
function closed(scan, rest) {
|
|
52
|
+
if (rest.trim() !== "") {
|
|
53
|
+
throw failure(`cannot read "${rest.trim()}" after the packages list`);
|
|
54
|
+
}
|
|
55
|
+
return [...scan.entries, scan.current].filter((entry) => entry.trim() !== "").map(flowScalar);
|
|
56
|
+
}
|
|
57
|
+
function scanned(scan, char) {
|
|
58
|
+
if (scan.quote !== undefined) {
|
|
59
|
+
scan.quote = char === scan.quote ? undefined : scan.quote;
|
|
60
|
+
}
|
|
61
|
+
else if (char === "]") {
|
|
62
|
+
return "close";
|
|
63
|
+
}
|
|
64
|
+
else if (char === ",") {
|
|
65
|
+
scan.entries.push(scan.current);
|
|
66
|
+
scan.current = "";
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
else if (char === '"' || char === "'") {
|
|
70
|
+
scan.quote = char;
|
|
71
|
+
}
|
|
72
|
+
scan.current += char;
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
function flowList(lines) {
|
|
76
|
+
const scan = { current: "", entries: [], quote: undefined };
|
|
77
|
+
for (const [number, line] of lines.map(withoutComment).entries()) {
|
|
78
|
+
for (let index = number === 0 ? 1 : 0; index < line.length; index += 1) {
|
|
79
|
+
if (scanned(scan, line[index] ?? "") === "close") {
|
|
80
|
+
return closed(scan, line.slice(index + 1));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
scan.current += " ";
|
|
84
|
+
}
|
|
85
|
+
throw failure("the packages list never closes");
|
|
86
|
+
}
|
|
87
|
+
function blockList(lines) {
|
|
88
|
+
const patterns = [];
|
|
89
|
+
for (const line of lines.map(withoutComment)) {
|
|
90
|
+
const trimmed = line.trim();
|
|
91
|
+
if (trimmed === "") {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const item = trimmed === ITEM || trimmed.startsWith(`${ITEM} `);
|
|
95
|
+
if (!(item || line.startsWith(" ") || line.startsWith("\t"))) {
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
if (!item) {
|
|
99
|
+
throw failure(`cannot read "${trimmed}" in packages`);
|
|
100
|
+
}
|
|
101
|
+
patterns.push(scalar(trimmed.slice(ITEM.length)));
|
|
102
|
+
}
|
|
103
|
+
return patterns;
|
|
104
|
+
}
|
|
105
|
+
export function pnpmWorkspacePatterns(text) {
|
|
106
|
+
const lines = text.split(LINE_BREAK);
|
|
107
|
+
const start = lines.findIndex((line) => KEY.test(line));
|
|
108
|
+
if (start === -1) {
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
const rest = withoutComment(lines[start] ?? "")
|
|
112
|
+
.replace(KEY, "")
|
|
113
|
+
.trim();
|
|
114
|
+
if (rest.startsWith("[")) {
|
|
115
|
+
return flowList([rest, ...lines.slice(start + 1)]);
|
|
116
|
+
}
|
|
117
|
+
if (rest !== "") {
|
|
118
|
+
throw failure(`cannot read "${rest}" in packages`);
|
|
119
|
+
}
|
|
120
|
+
return blockList(lines.slice(start + 1));
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=pnpm-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pnpm-workspace.js","sourceRoot":"","sources":["../../src/imports/pnpm-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
export interface Project {
|
|
3
|
+
readonly cache: ts.ModuleResolutionCache;
|
|
4
|
+
readonly files: ReadonlySet<string>;
|
|
5
|
+
readonly options: ts.CompilerOptions;
|
|
6
|
+
readonly typesCache: ts.ModuleResolutionCache;
|
|
7
|
+
readonly typesOptions: ts.CompilerOptions;
|
|
8
|
+
}
|
|
9
|
+
export declare function projectsFor(root: string): (file: string) => Project;
|
|
10
|
+
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/imports/projects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,eAAe,CAAC;CAC1C;AA4ED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAoBnE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { dirname, join, relative } from "node:path";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
const CONFIG = "tsconfig.json";
|
|
4
|
+
const SOURCE_CONDITION = "source";
|
|
5
|
+
const quietHost = { ...ts.sys, onUnRecoverableConfigFileDiagnostic: () => undefined };
|
|
6
|
+
function resolutionOptions(options, declarations) {
|
|
7
|
+
return {
|
|
8
|
+
...options,
|
|
9
|
+
allowArbitraryExtensions: declarations,
|
|
10
|
+
allowImportingTsExtensions: true,
|
|
11
|
+
allowJs: true,
|
|
12
|
+
customConditions: [...new Set([SOURCE_CONDITION, ...(options.customConditions ?? [])])],
|
|
13
|
+
module: ts.ModuleKind.ESNext,
|
|
14
|
+
moduleResolution: ts.ModuleResolutionKind.Bundler,
|
|
15
|
+
noDtsResolution: !declarations,
|
|
16
|
+
resolveJsonModule: true,
|
|
17
|
+
resolvePackageJsonExports: true,
|
|
18
|
+
resolvePackageJsonImports: true,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function projectOf(root, parsed) {
|
|
22
|
+
const runtime = resolutionOptions(parsed?.options ?? {}, false);
|
|
23
|
+
const types = resolutionOptions(parsed?.options ?? {}, true);
|
|
24
|
+
return {
|
|
25
|
+
cache: ts.createModuleResolutionCache(root, (file) => file, runtime),
|
|
26
|
+
files: parsed?.files ?? new Set(),
|
|
27
|
+
options: runtime,
|
|
28
|
+
typesCache: ts.createModuleResolutionCache(root, (file) => file, types),
|
|
29
|
+
typesOptions: types,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function parse(path) {
|
|
33
|
+
const parsed = ts.getParsedCommandLineOfConfigFile(path, {}, quietHost);
|
|
34
|
+
return {
|
|
35
|
+
files: new Set(parsed?.fileNames ?? []),
|
|
36
|
+
key: path,
|
|
37
|
+
options: parsed?.options ?? {},
|
|
38
|
+
references: (parsed?.projectReferences ?? []).map((reference) => ts.resolveProjectReferencePath(reference)),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function nearestConfig(root, file) {
|
|
42
|
+
for (let directory = dirname(file); !relative(root, directory).startsWith(".."); directory = dirname(directory)) {
|
|
43
|
+
const candidate = join(directory, CONFIG);
|
|
44
|
+
if (ts.sys.fileExists(candidate)) {
|
|
45
|
+
return candidate;
|
|
46
|
+
}
|
|
47
|
+
if (directory === root) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
function memo(compute) {
|
|
54
|
+
const known = new Map();
|
|
55
|
+
return (key) => {
|
|
56
|
+
const value = known.get(key) ?? compute(key);
|
|
57
|
+
known.set(key, value);
|
|
58
|
+
return value;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// A file resolves with the options of the project that includes it: the nearest tsconfig.json, or a project it references.
|
|
62
|
+
export function projectsFor(root) {
|
|
63
|
+
const parsedAt = memo(parse);
|
|
64
|
+
function withReferences(path, seen) {
|
|
65
|
+
if (seen.has(path)) {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
seen.add(path);
|
|
69
|
+
const project = parsedAt(path);
|
|
70
|
+
return [project, ...project.references.flatMap((reference) => withReferences(reference, seen))];
|
|
71
|
+
}
|
|
72
|
+
const familyAt = memo((config) => withReferences(config, new Set()));
|
|
73
|
+
const projects = new Map();
|
|
74
|
+
return (file) => {
|
|
75
|
+
const config = nearestConfig(root, file);
|
|
76
|
+
const owner = config === undefined ? undefined : (familyAt(config).find((candidate) => candidate.files.has(file)) ?? parsedAt(config));
|
|
77
|
+
const key = owner?.key ?? "";
|
|
78
|
+
const project = projects.get(key) ?? projectOf(root, owner);
|
|
79
|
+
projects.set(key, project);
|
|
80
|
+
return project;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/imports/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Ambient } from "./ambient.ts";
|
|
2
|
+
import type { ImportRequest } from "./extract.ts";
|
|
3
|
+
import type { Project } from "./projects.ts";
|
|
4
|
+
export type Endpoint = {
|
|
5
|
+
readonly kind: "file";
|
|
6
|
+
readonly path: string;
|
|
7
|
+
} | {
|
|
8
|
+
readonly kind: "external";
|
|
9
|
+
readonly package: string;
|
|
10
|
+
readonly specifier: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function builtinName(specifier: string): string | undefined;
|
|
13
|
+
export declare function packageNameOf(specifier: string): string;
|
|
14
|
+
export declare function isDeclarationFile(path: string): boolean;
|
|
15
|
+
export declare function resolveImport(root: string, ambient: Ambient, request: ImportRequest, from: string, project: Project): Endpoint | undefined;
|
|
16
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/imports/resolve.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,MAAM,QAAQ,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAYvF,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKjE;AAmBD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAYD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAuCD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAY1I"}
|