@shivaedev/quality 0.31.1 → 0.32.1

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.
Files changed (93) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +20 -5
  3. package/dist/baseline/installDriver.d.ts +5 -0
  4. package/dist/baseline/installDriver.d.ts.map +1 -0
  5. package/dist/baseline/installDriver.js +11 -0
  6. package/dist/baseline/installDriver.js.map +1 -0
  7. package/dist/baseline/merge.d.ts +4 -0
  8. package/dist/baseline/merge.d.ts.map +1 -0
  9. package/dist/baseline/merge.js +28 -0
  10. package/dist/baseline/merge.js.map +1 -0
  11. package/dist/baseline/rewrite.d.ts.map +1 -1
  12. package/dist/baseline/rewrite.js +0 -1
  13. package/dist/baseline/rewrite.js.map +1 -1
  14. package/dist/baseline/shards.d.ts +13 -0
  15. package/dist/baseline/shards.d.ts.map +1 -0
  16. package/dist/baseline/shards.js +48 -0
  17. package/dist/baseline/shards.js.map +1 -0
  18. package/dist/cli/args.d.ts +8 -1
  19. package/dist/cli/args.d.ts.map +1 -1
  20. package/dist/cli/args.js +9 -0
  21. package/dist/cli/args.js.map +1 -1
  22. package/dist/cli/baseline.d.ts.map +1 -1
  23. package/dist/cli/baseline.js +6 -7
  24. package/dist/cli/baseline.js.map +1 -1
  25. package/dist/cli/messages.d.ts +1 -1
  26. package/dist/cli/messages.d.ts.map +1 -1
  27. package/dist/cli/messages.js +6 -2
  28. package/dist/cli/messages.js.map +1 -1
  29. package/dist/cli/migrate.d.ts.map +1 -1
  30. package/dist/cli/migrate.js +10 -6
  31. package/dist/cli/migrate.js.map +1 -1
  32. package/dist/cli/program.d.ts.map +1 -1
  33. package/dist/cli/program.js +6 -0
  34. package/dist/cli/program.js.map +1 -1
  35. package/dist/config/load.js +1 -1
  36. package/dist/engine/baselineFile.d.ts +2 -1
  37. package/dist/engine/baselineFile.d.ts.map +1 -1
  38. package/dist/engine/baselineFile.js +23 -6
  39. package/dist/engine/baselineFile.js.map +1 -1
  40. package/dist/hooks/forwarding.d.ts +7 -0
  41. package/dist/hooks/forwarding.d.ts.map +1 -0
  42. package/dist/hooks/forwarding.js +94 -0
  43. package/dist/hooks/forwarding.js.map +1 -0
  44. package/dist/hooks/install.d.ts.map +1 -1
  45. package/dist/hooks/install.js +2 -1
  46. package/dist/hooks/install.js.map +1 -1
  47. package/dist/hooks/shim.d.ts +1 -0
  48. package/dist/hooks/shim.d.ts.map +1 -1
  49. package/dist/hooks/shim.js +3 -1
  50. package/dist/hooks/shim.js.map +1 -1
  51. package/dist/hooks/status.d.ts +1 -1
  52. package/dist/hooks/status.d.ts.map +1 -1
  53. package/dist/hooks/status.js +8 -6
  54. package/dist/hooks/status.js.map +1 -1
  55. package/dist/hooks/uninstall.d.ts.map +1 -1
  56. package/dist/hooks/uninstall.js +3 -1
  57. package/dist/hooks/uninstall.js.map +1 -1
  58. package/dist/imports/packageExports.d.ts +4 -0
  59. package/dist/imports/packageExports.d.ts.map +1 -0
  60. package/dist/imports/packageExports.js +48 -0
  61. package/dist/imports/packageExports.js.map +1 -0
  62. package/dist/imports/publicModules.d.ts +4 -0
  63. package/dist/imports/publicModules.d.ts.map +1 -0
  64. package/dist/imports/publicModules.js +21 -0
  65. package/dist/imports/publicModules.js.map +1 -0
  66. package/dist/rules/imports/bundleInputs.d.ts.map +1 -1
  67. package/dist/rules/imports/bundleInputs.js +4 -50
  68. package/dist/rules/imports/bundleInputs.js.map +1 -1
  69. package/dist/rules/stories/supportImports.d.ts.map +1 -1
  70. package/dist/rules/stories/supportImports.js +9 -3
  71. package/dist/rules/stories/supportImports.js.map +1 -1
  72. package/docs/debt-and-hooks.md +9 -6
  73. package/package.json +3 -3
  74. package/src/baseline/installDriver.ts +12 -0
  75. package/src/baseline/merge.ts +34 -0
  76. package/src/baseline/rewrite.ts +0 -1
  77. package/src/baseline/shards.ts +60 -0
  78. package/src/cli/args.ts +11 -0
  79. package/src/cli/baseline.ts +6 -10
  80. package/src/cli/messages.ts +6 -2
  81. package/src/cli/migrate.ts +10 -6
  82. package/src/cli/program.ts +6 -0
  83. package/src/config/load.ts +1 -1
  84. package/src/engine/baselineFile.ts +24 -7
  85. package/src/hooks/forwarding.ts +99 -0
  86. package/src/hooks/install.ts +3 -1
  87. package/src/hooks/shim.ts +3 -1
  88. package/src/hooks/status.ts +10 -6
  89. package/src/hooks/uninstall.ts +3 -1
  90. package/src/imports/packageExports.ts +55 -0
  91. package/src/imports/publicModules.ts +27 -0
  92. package/src/rules/imports/bundleInputs.ts +4 -59
  93. package/src/rules/stories/supportImports.ts +10 -3
@@ -1,4 +1,6 @@
1
1
  import { Console, Effect } from "effect";
2
+ import { installDriver } from "#baseline/installDriver.ts";
3
+ import { mergeBaseline } from "#baseline/merge.ts";
2
4
  import { parseCommand, USAGE } from "#cli/args.ts";
3
5
  import { writeBaseline } from "#cli/baseline.ts";
4
6
  import { fix } from "#cli/fix.ts";
@@ -24,6 +26,10 @@ export const program = Effect.fn("Cli.program")(function* (args, { cwd, launch }
24
26
  return yield* lint(cwd, command.config);
25
27
  case "Fix":
26
28
  return yield* fix(cwd, command.config);
29
+ case "BaselineMerge":
30
+ return yield* mergeBaseline(command.base, command.ours, command.theirs);
31
+ case "BaselineInstallDriver":
32
+ return yield* installDriver(cwd, launch);
27
33
  case "BaselineWrite":
28
34
  return yield* writeBaseline(cwd, command.config, command.rules);
29
35
  case "BaselinePrune":
@@ -1 +1 @@
1
- {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"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"}
@@ -36,7 +36,7 @@ function biomeDeclarations(config) {
36
36
  function resolved(root, file, config, rules) {
37
37
  return {
38
38
  ...rules,
39
- baseline: config.baseline ?? "quality/baseline.jsonl",
39
+ baseline: config.baseline ?? "quality-baseline.jsonl",
40
40
  biomeDeclarations: biomeDeclarations(config),
41
41
  exceptions: config.exceptions ?? [],
42
42
  exclude: [],
@@ -1,10 +1,11 @@
1
1
  import { Effect, type FileSystem } from "effect";
2
2
  import { type BaselineEntry } from "#baseline/format.ts";
3
+ import { type Shard } from "#baseline/shards.ts";
3
4
  import type { ResolvedConfig } from "#config/load.ts";
4
5
  import { SetupFailure } from "#failure.ts";
5
6
  export interface BaselineFile {
6
7
  readonly entries: readonly BaselineEntry[];
7
- readonly raw: string | undefined;
8
+ readonly files: ReadonlyMap<string, Shard>;
8
9
  }
9
10
  export declare function readInput(root: string, path: string): Effect.Effect<string | undefined, SetupFailure, FileSystem.FileSystem>;
10
11
  export declare const readBaseline: (config: ResolvedConfig) => Effect.Effect<BaselineFile, SetupFailure, FileSystem.FileSystem>;
@@ -1 +1 @@
1
- {"version":3,"file":"baselineFile.d.ts","sourceRoot":"","sources":["../../src/engine/baselineFile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,qBAAqB,CAAC;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC,UAAU,CAAC,CAE5H;AAED,eAAO,MAAM,YAAY,8FAUvB,CAAC"}
1
+ {"version":3,"file":"baselineFile.d.ts","sourceRoot":"","sources":["../../src/engine/baselineFile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,KAAK,KAAK,EAAuB,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC3C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC,UAAU,CAAC,CAE5H;AAED,eAAO,MAAM,YAAY,8FA0BvB,CAAC"}
@@ -2,6 +2,7 @@ import { join } from "node:path";
2
2
  import { Effect } from "effect";
3
3
  import { decodeBaseline } from "#baseline/format.ts";
4
4
  import { LEGACY_BASELINE } from "#baseline/legacy.ts";
5
+ import { shardOf, shardPaths } from "#baseline/shards.ts";
5
6
  import { validOrFail } from "#decoded.ts";
6
7
  import { SetupFailure } from "#failure.ts";
7
8
  import { readOptionalText } from "#inventory/filesystem.ts";
@@ -9,12 +10,28 @@ export function readInput(root, path) {
9
10
  return Effect.mapError(readOptionalText(join(root, path)), (failure) => new SetupFailure({ message: failure.message }));
10
11
  }
11
12
  export const readBaseline = Effect.fn("Engine.readBaseline")(function* (config) {
12
- const raw = yield* readInput(config.root, config.baseline);
13
- if (raw === undefined && config.baseline !== LEGACY_BASELINE && (yield* readInput(config.root, LEGACY_BASELINE)) !== undefined) {
14
- return yield* new SetupFailure({
15
- message: `${LEGACY_BASELINE} holds a baseline in the earlier JSON format. Run \`quality baseline migrate\` to move it to ${config.baseline}.`,
16
- });
13
+ const files = new Map();
14
+ for (const path of yield* shardPaths(config).pipe(Effect.mapError((error) => new SetupFailure({ message: error.message })))) {
15
+ const raw = yield* readInput(config.root, path);
16
+ if (raw === undefined) {
17
+ continue;
18
+ }
19
+ const entries = yield* validOrFail(path, yield* Effect.promise(() => decodeBaseline(raw)));
20
+ for (const entry of entries) {
21
+ const expected = shardOf(entry.file, config.baseline);
22
+ if (expected !== path) {
23
+ return yield* new SetupFailure({ message: `${entry.file} belongs in ${expected}, not ${path}.` });
24
+ }
25
+ }
26
+ files.set(path, { entries, raw });
17
27
  }
18
- return { entries: yield* validOrFail(config.baseline, yield* Effect.promise(() => decodeBaseline(raw))), raw };
28
+ for (const source of ["quality/baseline.jsonl", LEGACY_BASELINE]) {
29
+ if (source !== config.baseline && (yield* readInput(config.root, source)) !== undefined) {
30
+ return yield* new SetupFailure({
31
+ message: `${source} holds an earlier baseline. Run \`quality baseline migrate --from ${source}\` to move it to ${config.baseline} and package shards.`,
32
+ });
33
+ }
34
+ }
35
+ return { entries: [...files.values()].flatMap((file) => file.entries), files };
19
36
  });
20
37
  //# sourceMappingURL=baselineFile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"baselineFile.js","sourceRoot":"","sources":["../../src/engine/baselineFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAmB,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAsB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAO5D,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAAY;IACnD,OAAO,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACzH,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,EACrE,MAAsB;IAEtB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3D,IAAI,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,eAAe,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAChI,OAAO,KAAK,CAAC,CAAC,IAAI,YAAY,CAAC;YAC9B,OAAO,EAAE,GAAG,eAAe,gGAAgG,MAAM,CAAC,QAAQ,GAAG;SAC7I,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;AAChH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"baselineFile.js","sourceRoot":"","sources":["../../src/engine/baselineFile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Effect, FileSystem } from "effect";
2
+ import { SetupFailure } from "#failure.ts";
3
+ export declare function forwardingPath(file: string): string;
4
+ export declare const globalHooksPath: (cwd: string) => Effect.Effect<string, SetupFailure, import("effect/process/ChildProcessSpawner").ChildProcessSpawner>;
5
+ export declare const installForwarding: (file: string) => Effect.Effect<string, import("#inventory/filesystem.ts").FilesystemFailure | import("effect/PlatformError").PlatformError | SetupFailure, FileSystem.FileSystem>;
6
+ export declare const removeForwarding: (file: string) => Effect.Effect<void, import("#inventory/filesystem.ts").FilesystemFailure | import("effect/PlatformError").PlatformError, FileSystem.FileSystem>;
7
+ //# sourceMappingURL=forwarding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forwarding.d.ts","sourceRoot":"","sources":["../../src/hooks/forwarding.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAqC3C,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,eAAO,MAAM,eAAe,wHAM1B,CAAC;AAoBH,eAAO,MAAM,iBAAiB,oLAc5B,CAAC;AAEH,eAAO,MAAM,gBAAgB,mKAa3B,CAAC"}
@@ -0,0 +1,94 @@
1
+ import { dirname, join } from "node:path";
2
+ import { Effect, FileSystem } from "effect";
3
+ import { SetupFailure } from "#failure.ts";
4
+ import { git } from "#git/command.ts";
5
+ import { readOptionalText } from "#inventory/filesystem.ts";
6
+ import { shellWords } from "./command.js";
7
+ import { isHookShim, OWNER } from "./shim.js";
8
+ const HOOKS = [
9
+ "applypatch-msg",
10
+ "pre-applypatch",
11
+ "post-applypatch",
12
+ "pre-commit",
13
+ "pre-merge-commit",
14
+ "prepare-commit-msg",
15
+ "commit-msg",
16
+ "post-commit",
17
+ "pre-rebase",
18
+ "post-checkout",
19
+ "post-merge",
20
+ "pre-push",
21
+ "pre-receive",
22
+ "update",
23
+ "proc-receive",
24
+ "post-receive",
25
+ "post-update",
26
+ "reference-transaction",
27
+ "push-to-checkout",
28
+ "pre-auto-gc",
29
+ "post-rewrite",
30
+ "sendemail-validate",
31
+ "fsmonitor-watchman",
32
+ "p4-changelist",
33
+ "p4-prepare-changelist",
34
+ "p4-post-changelist",
35
+ "p4-pre-submit",
36
+ "post-index-change",
37
+ ];
38
+ export function forwardingPath(file) {
39
+ return join(dirname(file), "quality");
40
+ }
41
+ export const globalHooksPath = Effect.fn("Hooks.globalHooksPath")(function* (cwd) {
42
+ const global = yield* git(cwd, ["config", "--global", "--includes", "--type=path", "--get", "core.hooksPath"]);
43
+ if (global.code !== 0 && global.code !== 1) {
44
+ return yield* new SetupFailure({ message: `cannot read global core.hooksPath: ${global.stderr.trim()}` });
45
+ }
46
+ return global.stdout.trim();
47
+ });
48
+ function forwarder(file, name) {
49
+ return [
50
+ "#!/bin/sh",
51
+ OWNER,
52
+ ...(name === "pre-commit"
53
+ ? [`exec ${shellWords([file])} "$@"`]
54
+ : [
55
+ 'global_path="$(git config --global --includes --type=path --get core.hooksPath)"',
56
+ '[ -n "$global_path" ] || exit 0',
57
+ `global_hook="$global_path/${name}"`,
58
+ 'if [ -x "$global_hook" ] && ! [ "$global_hook" -ef "$0" ]; then',
59
+ '\texec "$global_hook" "$@"',
60
+ "fi",
61
+ ]),
62
+ "",
63
+ ].join("\n");
64
+ }
65
+ export const installForwarding = Effect.fn("Hooks.installForwarding")(function* (file) {
66
+ const fs = yield* FileSystem.FileSystem;
67
+ const path = forwardingPath(file);
68
+ yield* fs.makeDirectory(path, { recursive: true });
69
+ for (const name of HOOKS) {
70
+ const target = join(path, name);
71
+ const existing = yield* readOptionalText(target);
72
+ if (existing !== undefined && !isHookShim(existing)) {
73
+ return yield* new SetupFailure({ message: `cannot replace ${target}: it is not Quality's hook.` });
74
+ }
75
+ yield* fs.writeFileString(target, forwarder(file, name));
76
+ yield* fs.chmod(target, 0o755);
77
+ }
78
+ return path;
79
+ });
80
+ export const removeForwarding = Effect.fn("Hooks.removeForwarding")(function* (file) {
81
+ const fs = yield* FileSystem.FileSystem;
82
+ const path = forwardingPath(file);
83
+ for (const name of HOOKS) {
84
+ const target = join(path, name);
85
+ const existing = yield* readOptionalText(target);
86
+ if (existing !== undefined && isHookShim(existing)) {
87
+ yield* fs.remove(target);
88
+ }
89
+ }
90
+ if ((yield* fs.exists(path)) && (yield* fs.readDirectory(path)).length === 0) {
91
+ yield* fs.remove(path, { recursive: true });
92
+ }
93
+ });
94
+ //# sourceMappingURL=forwarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forwarding.js","sourceRoot":"","sources":["../../src/hooks/forwarding.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/hooks/install.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAA6B,KAAK,MAAM,EAAc,MAAM,cAAc,CAAC;AAKlF,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAoBD,eAAO,MAAM,WAAW,uJA8BtB,CAAC"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/hooks/install.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAA6B,KAAK,MAAM,EAAc,MAAM,cAAc,CAAC;AAMlF,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAoBD,eAAO,MAAM,WAAW,uJA+BtB,CAAC"}
@@ -6,6 +6,7 @@ import { SetupFailure } from "#failure.ts";
6
6
  import { gitOrFail } from "#git/command.ts";
7
7
  import { readOptionalText } from "#inventory/filesystem.ts";
8
8
  import { commandWords, hookCommand, shellWords } from "./command.js";
9
+ import { globalHooksPath, installForwarding } from "./forwarding.js";
9
10
  import { hookLocation } from "./location.js";
10
11
  import { hookShim, isHookShim } from "./shim.js";
11
12
  import { globalHookStatus } from "./status.js";
@@ -45,7 +46,7 @@ export const installHook = Effect.fn("Hooks.installHook")(function* (install) {
45
46
  const done = foreign ? `replaced ${location.file}, which was not quality's hook` : `installed the pre-commit hook at ${location.file}`;
46
47
  yield* Console.log(`quality: ${done}; each commit runs \`${words}\`.`);
47
48
  }
48
- const hooks = dirname(location.file);
49
+ const hooks = (yield* globalHooksPath(config.root)) === "" ? dirname(location.file) : yield* installForwarding(location.file).pipe(Effect.mapError(failed));
49
50
  yield* gitOrFail(config.root, ["config", "--local", "core.hooksPath", hooks]);
50
51
  yield* Console.log(`quality: set repository-local core.hooksPath to ${hooks}.`);
51
52
  yield* globalHookStatus(location);
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/hooks/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/hooks/install.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type HookCommand } from "./command.ts";
2
+ export declare const OWNER = "# Installed by @shivaedev/quality: `quality hooks install` writes it, `quality hooks uninstall` removes it.";
2
3
  export declare function isHookShim(text: string): boolean;
3
4
  export declare function hookShim(directory: string, command: HookCommand): string;
4
5
  //# sourceMappingURL=shim.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shim.d.ts","sourceRoot":"","sources":["../../src/hooks/shim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAc,MAAM,cAAc,CAAC;AAI5D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAID,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CA2BxE"}
1
+ {"version":3,"file":"shim.d.ts","sourceRoot":"","sources":["../../src/hooks/shim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAc,MAAM,cAAc,CAAC;AAE5D,eAAO,MAAM,KAAK,gHAAgH,CAAC;AAEnI,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAID,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CA6BxE"}
@@ -1,5 +1,5 @@
1
1
  import { shellWords } from "./command.js";
2
- const OWNER = "# Installed by @shivaedev/quality: `quality hooks install` writes it, `quality hooks uninstall` removes it.";
2
+ export const OWNER = "# Installed by @shivaedev/quality: `quality hooks install` writes it, `quality hooks uninstall` removes it.";
3
3
  export function isHookShim(text) {
4
4
  return text.split("\n").includes(OWNER);
5
5
  }
@@ -11,6 +11,8 @@ export function hookShim(directory, command) {
11
11
  return [
12
12
  "#!/bin/sh",
13
13
  OWNER,
14
+ 'if [ -n "$QUALITY_PRE_COMMIT_ACTIVE" ]; then exit 0; fi',
15
+ "export QUALITY_PRE_COMMIT_ACTIVE=1",
14
16
  'top="$(git rev-parse --show-toplevel)" || exit 2',
15
17
  'if [ -n "$GIT_DIR" ] && [ -z "$GIT_WORK_TREE" ]; then export GIT_WORK_TREE="$top"; fi',
16
18
  'cd "$top" || exit 2',
@@ -1 +1 @@
1
- {"version":3,"file":"shim.js","sourceRoot":"","sources":["../../src/hooks/shim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,UAAU,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,KAAK,GAAG,6GAA6G,CAAC;AAE5H,MAAM,UAAU,UAAU,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,uHAAuH;AACvH,gJAAgJ;AAChJ,MAAM,UAAU,QAAQ,CAAC,SAAiB,EAAE,OAAoB;IAC/D,MAAM,MAAM,GAAG,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IAChH,OAAO;QACN,WAAW;QACX,KAAK;QACL,kDAAkD;QAClD,uFAAuF;QACvF,qBAAqB;QACrB,UAAU;QACV,kFAAkF;QAClF,gCAAgC;QAChC,yCAAyC;QACzC,mEAAmE;QACnE,sCAAsC;QACtC,MAAM;QACN,IAAI;QACJ,YAAY,MAAM,YAAY;QAC9B,WAAW,UAAU,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE;QAC3C,8BAA8B;QAC9B,sKAAsK;QACtK,UAAU;QACV,IAAI;QACJ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe;QAChC,gBAAgB;QAChB,EAAE;KACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"shim.js","sourceRoot":"","sources":["../../src/hooks/shim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,UAAU,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,CAAC,MAAM,KAAK,GAAG,6GAA6G,CAAC;AAEnI,MAAM,UAAU,UAAU,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,uHAAuH;AACvH,gJAAgJ;AAChJ,MAAM,UAAU,QAAQ,CAAC,SAAiB,EAAE,OAAoB;IAC/D,MAAM,MAAM,GAAG,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IAChH,OAAO;QACN,WAAW;QACX,KAAK;QACL,yDAAyD;QACzD,oCAAoC;QACpC,kDAAkD;QAClD,uFAAuF;QACvF,qBAAqB;QACrB,UAAU;QACV,kFAAkF;QAClF,gCAAgC;QAChC,yCAAyC;QACzC,mEAAmE;QACnE,sCAAsC;QACtC,MAAM;QACN,IAAI;QACJ,YAAY,MAAM,YAAY;QAC9B,WAAW,UAAU,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE;QAC3C,8BAA8B;QAC9B,sKAAsK;QACtK,UAAU;QACV,IAAI;QACJ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe;QAChC,gBAAgB;QAChB,EAAE;KACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { Effect } from "effect";
2
2
  import { GateFailed, SetupFailure } from "#failure.ts";
3
3
  import { type HookLocation } from "./location.ts";
4
- export declare const globalHookStatus: (location: HookLocation) => Effect.Effect<undefined, SetupFailure, import("effect/process/ChildProcessSpawner").ChildProcessSpawner>;
4
+ export declare const globalHookStatus: (location: HookLocation) => Effect.Effect<void, SetupFailure, import("effect/process/ChildProcessSpawner").ChildProcessSpawner>;
5
5
  export declare const hookStatus: (cwd: string) => Effect.Effect<undefined, GateFailed | SetupFailure, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("effect/FileSystem").FileSystem>;
6
6
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/hooks/status.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,MAAM,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGvD,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,eAAe,CAAC;AAchE,eAAO,MAAM,gBAAgB,sIAc3B,CAAC;AAEH,eAAO,MAAM,UAAU,iLAYrB,CAAC"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/hooks/status.ts"],"names":[],"mappings":"AAGA,OAAO,EAAW,MAAM,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIvD,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,eAAe,CAAC;AAchE,eAAO,MAAM,gBAAgB,iIAU3B,CAAC;AAEH,eAAO,MAAM,UAAU,iLAmBrB,CAAC"}
@@ -3,8 +3,9 @@ import { access, realpath } from "node:fs/promises";
3
3
  import { dirname, resolve } from "node:path";
4
4
  import { Console, Effect } from "effect";
5
5
  import { GateFailed, SetupFailure } from "#failure.ts";
6
- import { git, gitOrFail } from "#git/command.ts";
6
+ import { gitOrFail } from "#git/command.ts";
7
7
  import { readOptionalText } from "#inventory/filesystem.ts";
8
+ import { forwardingPath, globalHooksPath } from "./forwarding.js";
8
9
  import { hookLocation } from "./location.js";
9
10
  import { isHookShim } from "./shim.js";
10
11
  function executable(file) {
@@ -19,11 +20,7 @@ function executable(file) {
19
20
  });
20
21
  }
21
22
  export const globalHookStatus = Effect.fn("Hooks.globalHookStatus")(function* (location) {
22
- const global = yield* git(location.toplevel, ["config", "--global", "--includes", "--type=path", "--get", "core.hooksPath"]);
23
- if (global.code !== 0 && global.code !== 1) {
24
- return yield* new SetupFailure({ message: `cannot read global core.hooksPath: ${global.stderr.trim()}` });
25
- }
26
- const path = global.stdout.trim();
23
+ const path = yield* globalHooksPath(location.toplevel);
27
24
  const hook = resolve(location.toplevel, path, "pre-commit");
28
25
  const target = path === "" ? undefined : yield* executable(hook);
29
26
  const own = yield* executable(location.file);
@@ -39,6 +36,11 @@ export const hookStatus = Effect.fn("Hooks.hookStatus")(function* (cwd) {
39
36
  yield* Console.error(`quality: the effective hooks path ${dirname(path)} does not run Quality's pre-commit hook.\nhelp: run \`quality hooks install\` to check commits.`);
40
37
  return yield* new GateFailed();
41
38
  }
39
+ const global = yield* globalHooksPath(cwd);
40
+ if (global !== "" && dirname(path) !== resolve(location.toplevel, global) && dirname(path) !== forwardingPath(location.file)) {
41
+ yield* Console.error("quality: the repository-local core.hooksPath hides global hooks other than pre-commit.\nhelp: run `quality hooks install` to keep all global hooks running.");
42
+ return yield* new GateFailed();
43
+ }
42
44
  yield* Console.log(`quality: git runs Quality's pre-commit hook at ${path}.`);
43
45
  yield* globalHookStatus(location);
44
46
  });
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/hooks/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAqB,YAAY,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,SAAS,UAAU,CAAC,IAAY;IAC/B,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;QAChC,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACnC,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,SAAS,CAAC;QAClB,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAsB;IACpG,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC7H,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,sCAAsC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CACjB,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,GAAG;QACrC,CAAC,CAAC,+CAA+C,IAAI,GAAG;QACxD,CAAC,CAAC,yDAAyD,CAC5D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAW;IAC7E,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,wBAAwB,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACvH,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1H,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACxF,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CACnB,qCAAqC,OAAO,CAAC,IAAI,CAAC,iGAAiG,CACnJ,CAAC;QACF,OAAO,KAAK,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC;IAChC,CAAC;IACD,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kDAAkD,IAAI,GAAG,CAAC,CAAC;IAC9E,KAAK,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/hooks/status.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/hooks/uninstall.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,eAAO,MAAM,aAAa,8IAgBxB,CAAC"}
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/hooks/uninstall.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAO3C,eAAO,MAAM,aAAa,8IAiBxB,CAAC"}
@@ -3,6 +3,7 @@ import { Console, Effect, FileSystem } from "effect";
3
3
  import { SetupFailure } from "#failure.ts";
4
4
  import { git, gitOrFail } from "#git/command.ts";
5
5
  import { readOptionalText } from "#inventory/filesystem.ts";
6
+ import { forwardingPath, removeForwarding } from "./forwarding.js";
6
7
  import { hookLocation } from "./location.js";
7
8
  import { isHookShim } from "./shim.js";
8
9
  export const uninstallHook = Effect.fn("Hooks.uninstallHook")(function* (cwd) {
@@ -17,7 +18,8 @@ export const uninstallHook = Effect.fn("Hooks.uninstallHook")(function* (cwd) {
17
18
  }
18
19
  yield* Effect.mapError(fs.remove(file), (error) => new SetupFailure({ message: `cannot remove ${file}: ${error.message}` }));
19
20
  const local = yield* git(cwd, ["config", "--local", "--get", "core.hooksPath"]);
20
- if (local.stdout.trim() === dirname(file)) {
21
+ yield* removeForwarding(file).pipe(Effect.mapError((error) => new SetupFailure({ message: error.message })));
22
+ if ([dirname(file), forwardingPath(file)].includes(local.stdout.trim())) {
21
23
  yield* gitOrFail(cwd, ["config", "--local", "--unset-all", "core.hooksPath"]);
22
24
  }
23
25
  yield* Console.log(`quality: removed the pre-commit hook at ${file}.`);
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/hooks/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAW;IACnF,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACxC,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7H,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,GAAG,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,wCAAwC,CAAC,CAAC;IAC5F,CAAC;IACD,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,iBAAiB,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7H,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAChF,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,GAAG,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/hooks/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAW;IACnF,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACxC,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7H,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,GAAG,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,wCAAwC,CAAC,CAAC;IAC5F,CAAC;IACD,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,iBAAiB,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7H,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAChF,KAAK,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7G,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACzE,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,GAAG,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function blockedExport(exports: unknown, subpath: string): boolean;
2
+ export declare function exportTargets(value: unknown): string[];
3
+ export declare function exportedModule(exports: unknown, local: string): boolean;
4
+ //# sourceMappingURL=packageExports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageExports.d.ts","sourceRoot":"","sources":["../../src/imports/packageExports.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAqBxE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAKtD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAwBvE"}
@@ -0,0 +1,48 @@
1
+ export function blockedExport(exports, subpath) {
2
+ if (typeof exports !== "object" || exports === null || Array.isArray(exports)) {
3
+ return false;
4
+ }
5
+ const entries = Object.entries(exports);
6
+ const exact = entries.find(([key]) => key === subpath);
7
+ if (exact !== undefined) {
8
+ return exact[1] === null;
9
+ }
10
+ const matching = entries.filter(([key]) => {
11
+ const [prefix = "", suffix, ...rest] = key.split("*");
12
+ return (suffix !== undefined
13
+ && rest.length === 0
14
+ && subpath.length > prefix.length + suffix.length
15
+ && subpath.startsWith(prefix)
16
+ && subpath.endsWith(suffix));
17
+ });
18
+ const best = matching.toSorted(([left], [right]) => right.indexOf("*") - left.indexOf("*") || right.length - left.length)[0];
19
+ return best?.[1] === null;
20
+ }
21
+ export function exportTargets(value) {
22
+ if (typeof value === "string") {
23
+ return [value];
24
+ }
25
+ return typeof value === "object" && value !== null ? Object.values(value).flatMap(exportTargets) : [];
26
+ }
27
+ export function exportedModule(exports, local) {
28
+ if (typeof exports !== "object" || exports === null) {
29
+ return false;
30
+ }
31
+ const paths = [
32
+ `./${local}`,
33
+ `./${local.replace(/^src\//u, "dist/").replace(/\.(?<mode>[cm]?)tsx?$/u, ".$<mode>js")}`,
34
+ `./${local.replace(/^src\//u, "dist/").replace(/\.(?<mode>[cm]?)tsx?$/u, ".d.$<mode>ts")}`,
35
+ ];
36
+ return Object.entries(exports).some(([key, value]) => exportTargets(value).some((target) => paths.some((path) => {
37
+ const [prefix = "", suffix] = target.split("*");
38
+ if (suffix === undefined) {
39
+ return path === target && !blockedExport(exports, key);
40
+ }
41
+ if (!(path.startsWith(prefix) && path.endsWith(suffix)) || path.length <= prefix.length + suffix.length) {
42
+ return false;
43
+ }
44
+ const star = path.slice(prefix.length, path.length - suffix.length);
45
+ return !blockedExport(exports, key.replace("*", star));
46
+ })));
47
+ }
48
+ //# sourceMappingURL=packageExports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageExports.js","sourceRoot":"","sources":["../../src/imports/packageExports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { RuleInputs } from "#rule.ts";
2
+ import type { ImportGraph } from "./graph.ts";
3
+ export declare function publicModules(inputs: RuleInputs, graph: ImportGraph): Promise<ReadonlySet<string>>;
4
+ //# sourceMappingURL=publicModules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publicModules.d.ts","sourceRoot":"","sources":["../../src/imports/publicModules.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,wBAAsB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAoBxG"}
@@ -0,0 +1,21 @@
1
+ import { posix } from "node:path";
2
+ import { exportedModule } from "./packageExports.js";
3
+ import { packageOf } from "./workspace.js";
4
+ export async function publicModules(inputs, graph) {
5
+ const exports = new Map(await Promise.all(graph.packages.map(async (owner) => {
6
+ const manifest = JSON.parse((await inputs.readText(posix.join(owner.directory, "package.json"))) ?? "");
7
+ return [owner, manifest.exports];
8
+ })));
9
+ const modules = new Set();
10
+ for (const edge of graph.edges) {
11
+ if (edge.to.kind !== "file") {
12
+ continue;
13
+ }
14
+ const owner = packageOf(graph.packages, edge.to.path);
15
+ if (owner !== undefined && exportedModule(exports.get(owner), posix.relative(owner.directory, edge.to.path))) {
16
+ modules.add(edge.to.path);
17
+ }
18
+ }
19
+ return modules;
20
+ }
21
+ //# sourceMappingURL=publicModules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publicModules.js","sourceRoot":"","sources":["../../src/imports/publicModules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAkB,EAAE,KAAkB;IACzE,MAAM,OAAO,GAAG,IAAI,GAAG,CACtB,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAmC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxI,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAU,CAAC;IAC3C,CAAC,CAAC,CACF,CACD,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7B,SAAS;QACV,CAAC;QACD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,KAAK,KAAK,SAAS,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC9G,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"bundleInputs.d.ts","sourceRoot":"","sources":["../../../src/rules/imports/bundleInputs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAgEzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO;;;EA0BrI"}
1
+ {"version":3,"file":"bundleInputs.d.ts","sourceRoot":"","sources":["../../../src/rules/imports/bundleInputs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO;;;EA0BrI"}
@@ -1,55 +1,9 @@
1
1
  import { posix } from "node:path";
2
2
  import { outgoing } from "#imports/fences/reach.ts";
3
+ import { blockedExport, exportedModule, exportTargets } from "#imports/packageExports.ts";
3
4
  import { packageOf } from "#imports/workspace.ts";
4
- function blocked(exports, subpath) {
5
- if (typeof exports !== "object" || exports === null || Array.isArray(exports)) {
6
- return false;
7
- }
8
- const entries = Object.entries(exports);
9
- const exact = entries.find(([key]) => key === subpath);
10
- if (exact !== undefined) {
11
- return exact[1] === null;
12
- }
13
- const matching = entries.filter(([key]) => {
14
- const [prefix = "", suffix, ...rest] = key.split("*");
15
- return (suffix !== undefined
16
- && rest.length === 0
17
- && subpath.length > prefix.length + suffix.length
18
- && subpath.startsWith(prefix)
19
- && subpath.endsWith(suffix));
20
- });
21
- const best = matching.toSorted(([left], [right]) => right.indexOf("*") - left.indexOf("*") || right.length - left.length)[0];
22
- return best?.[1] === null;
23
- }
24
- function targets(value) {
25
- if (typeof value === "string") {
26
- return [value];
27
- }
28
- return typeof value === "object" && value !== null ? Object.values(value).flatMap(targets) : [];
29
- }
30
- function exported(exports, local) {
31
- if (typeof exports !== "object" || exports === null) {
32
- return false;
33
- }
34
- const paths = [
35
- `./${local}`,
36
- `./${local.replace(/^src\//u, "dist/").replace(/\.(?<mode>[cm]?)tsx?$/u, ".$<mode>js")}`,
37
- `./${local.replace(/^src\//u, "dist/").replace(/\.(?<mode>[cm]?)tsx?$/u, ".d.$<mode>ts")}`,
38
- ];
39
- return Object.entries(exports).some(([key, value]) => targets(value).some((target) => paths.some((path) => {
40
- const [prefix = "", suffix] = target.split("*");
41
- if (suffix === undefined) {
42
- return path === target && !blocked(exports, key);
43
- }
44
- if (!(path.startsWith(prefix) && path.endsWith(suffix)) || path.length <= prefix.length + suffix.length) {
45
- return false;
46
- }
47
- const star = path.slice(prefix.length, path.length - suffix.length);
48
- return !blocked(exports, key.replace("*", star));
49
- })));
50
- }
51
5
  function executable(manifest, local) {
52
- const binTargets = targets(Reflect.get(manifest, "bin"));
6
+ const binTargets = exportTargets(Reflect.get(manifest, "bin"));
53
7
  const built = local.replace(/^src\//u, "dist/").replace(/\.(?<mode>[cm]?)tsx?$/u, ".$<mode>js");
54
8
  return binTargets.some((target) => typeof target === "string" && [local, built].includes(posix.normalize(target)));
55
9
  }
@@ -58,8 +12,8 @@ export function bundleInputs(graph, owner, manifest, developmentFile) {
58
12
  const privateFiles = new Set(modules.filter((path) => {
59
13
  const local = posix.relative(owner.directory, path);
60
14
  return (local.startsWith("src/")
61
- && blocked(Reflect.get(manifest, "exports"), `./${local.slice(4)}`)
62
- && !exported(Reflect.get(manifest, "exports"), local));
15
+ && blockedExport(Reflect.get(manifest, "exports"), `./${local.slice(4)}`)
16
+ && !exportedModule(Reflect.get(manifest, "exports"), local));
63
17
  }));
64
18
  const queue = modules.filter((path) => executable(manifest, posix.relative(owner.directory, path)) || !(developmentFile(path) || privateFiles.has(path)));
65
19
  const runtime = new Set(queue);