@component-compass/cli 0.0.1 → 0.0.3

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 (96) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +12 -4
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/init.d.ts +3 -2
  5. package/dist/commands/init.js +50 -62
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/no-deps-diagnostic.d.ts +15 -0
  8. package/dist/commands/no-deps-diagnostic.js +23 -0
  9. package/dist/commands/no-deps-diagnostic.js.map +1 -0
  10. package/dist/commands/scan.d.ts +1 -0
  11. package/dist/commands/scan.js +126 -82
  12. package/dist/commands/scan.js.map +1 -1
  13. package/dist/composition-rollup.d.ts +23 -0
  14. package/dist/composition-rollup.js +64 -0
  15. package/dist/composition-rollup.js.map +1 -0
  16. package/dist/config/loader.js +5 -3
  17. package/dist/config/loader.js.map +1 -1
  18. package/dist/config/schema.d.ts +1 -2
  19. package/dist/config/schema.js.map +1 -1
  20. package/dist/identity.d.ts +21 -3
  21. package/dist/identity.js +40 -3
  22. package/dist/identity.js.map +1 -1
  23. package/dist/local-index/detect-react.js +224 -47
  24. package/dist/local-index/detect-react.js.map +1 -1
  25. package/dist/local-index/index.d.ts +4 -1
  26. package/dist/local-index/index.js +30 -13
  27. package/dist/local-index/index.js.map +1 -1
  28. package/dist/manifest/barrel-parser.d.ts +20 -0
  29. package/dist/manifest/barrel-parser.js +101 -16
  30. package/dist/manifest/barrel-parser.js.map +1 -1
  31. package/dist/manifest/derived-manifest-stub.d.ts +9 -0
  32. package/dist/manifest/derived-manifest-stub.js +11 -0
  33. package/dist/manifest/derived-manifest-stub.js.map +1 -0
  34. package/dist/manifest/diagnostic-filter.d.ts +13 -0
  35. package/dist/manifest/diagnostic-filter.js +36 -0
  36. package/dist/manifest/diagnostic-filter.js.map +1 -0
  37. package/dist/manifest/lazy-resolver.d.ts +44 -0
  38. package/dist/manifest/lazy-resolver.js +532 -0
  39. package/dist/manifest/lazy-resolver.js.map +1 -0
  40. package/dist/occurrences.d.ts +17 -0
  41. package/dist/occurrences.js +97 -0
  42. package/dist/occurrences.js.map +1 -0
  43. package/dist/reporter/index.d.ts +47 -9
  44. package/dist/reporter/index.js +167 -17
  45. package/dist/reporter/index.js.map +1 -1
  46. package/dist/reporter/json.d.ts +6 -2
  47. package/dist/reporter/json.js +7 -3
  48. package/dist/reporter/json.js.map +1 -1
  49. package/dist/reporter/stdout.d.ts +2 -2
  50. package/dist/reporter/stdout.js +11 -23
  51. package/dist/reporter/stdout.js.map +1 -1
  52. package/dist/rollup.d.ts +8 -2
  53. package/dist/rollup.js +2 -3
  54. package/dist/rollup.js.map +1 -1
  55. package/dist/seeds.d.ts +41 -0
  56. package/dist/seeds.js +145 -0
  57. package/dist/seeds.js.map +1 -0
  58. package/dist/types.d.ts +0 -1
  59. package/dist/workspace/build-graph.d.ts +2 -0
  60. package/dist/workspace/build-graph.js +117 -0
  61. package/dist/workspace/build-graph.js.map +1 -0
  62. package/dist/workspace/declared-deps.d.ts +5 -0
  63. package/dist/workspace/declared-deps.js +42 -0
  64. package/dist/workspace/declared-deps.js.map +1 -0
  65. package/dist/workspace/find-owning-package.d.ts +2 -0
  66. package/dist/workspace/find-owning-package.js +49 -0
  67. package/dist/workspace/find-owning-package.js.map +1 -0
  68. package/dist/workspace/index.d.ts +4 -0
  69. package/dist/workspace/index.js +4 -0
  70. package/dist/workspace/index.js.map +1 -0
  71. package/dist/workspace/types.d.ts +46 -0
  72. package/dist/workspace/types.js +13 -0
  73. package/dist/workspace/types.js.map +1 -0
  74. package/package.json +11 -9
  75. package/schema/config.schema.json +2 -10
  76. package/dist/graph/builder.d.ts +0 -25
  77. package/dist/graph/builder.js +0 -176
  78. package/dist/graph/builder.js.map +0 -1
  79. package/dist/manifest/discovery.d.ts +0 -24
  80. package/dist/manifest/discovery.js +0 -194
  81. package/dist/manifest/discovery.js.map +0 -1
  82. package/dist/manifest/index.d.ts +0 -6
  83. package/dist/manifest/index.js +0 -98
  84. package/dist/manifest/index.js.map +0 -1
  85. package/dist/manifest/resolver.d.ts +0 -30
  86. package/dist/manifest/resolver.js +0 -136
  87. package/dist/manifest/resolver.js.map +0 -1
  88. package/dist/manifest/run-discovery.d.ts +0 -12
  89. package/dist/manifest/run-discovery.js +0 -46
  90. package/dist/manifest/run-discovery.js.map +0 -1
  91. package/dist/manifest/types.d.ts +0 -3
  92. package/dist/manifest/types.js +0 -2
  93. package/dist/manifest/types.js.map +0 -1
  94. package/dist/reporter/types.d.ts +0 -69
  95. package/dist/reporter/types.js +0 -2
  96. package/dist/reporter/types.js.map +0 -1
package/README.md CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
  Open-source CLI for measuring design-system component usage across multi-framework consumer repos.
4
4
 
5
- See the [usage docs](../../docs/usage.md) and the [v1 design spec](../../docs/superpowers/specs/2026-05-02-component-compass-design.md).
5
+ See the [usage docs](../../docs/usage.md) and the [current design spec](../../docs/superpowers/specs/2026-05-05-mental-model-and-priorities-design.md).
package/dist/cli.js CHANGED
@@ -17,6 +17,7 @@ Scan options:
17
17
  --quiet Suppress STDOUT summary
18
18
  --json Print JSON to stdout (implies --quiet)
19
19
  --fail-on <metric> CI gate (e.g. deprecated-usage)
20
+ --strict Exit non-zero if any warning-severity diagnostics fire
20
21
  --repo-id <value> Override scan envelope repoId (else env COMPONENT_COMPASS_REPO_ID, git remote, package.json name, or cwd hash)
21
22
 
22
23
  Other:
@@ -43,6 +44,7 @@ async function main(argv) {
43
44
  const scanOpts = {
44
45
  configPath: flags.config ?? "./component-compass.config.json",
45
46
  quiet: Boolean(flags.quiet || flags.json),
47
+ strict: Boolean(flags.strict),
46
48
  };
47
49
  if (flags.output)
48
50
  scanOpts.outputOverride = flags.output;
@@ -56,8 +58,14 @@ async function main(argv) {
56
58
  return r.exitCode;
57
59
  }
58
60
  if (cmd === "init") {
59
- const flags = parseFlags(rest);
60
- return await runInit({ cwd: process.cwd(), discover: flags.discover ?? false });
61
+ try {
62
+ await runInit({ cwd: process.cwd() });
63
+ return 0;
64
+ }
65
+ catch (err) {
66
+ process.stderr.write(`init failed: ${errorStack(err)}\n`);
67
+ return 1;
68
+ }
61
69
  }
62
70
  log.error(`Unknown command: ${cmd}\n${HELP}`);
63
71
  return 2;
@@ -84,13 +92,13 @@ function parseFlags(args) {
84
92
  out.quiet = true;
85
93
  else if (a === "--json")
86
94
  out.json = true;
95
+ else if (a === "--strict")
96
+ out.strict = true;
87
97
  else if (a === "--fail-on") {
88
98
  const next = args[++i];
89
99
  if (next)
90
100
  out.failOn = next;
91
101
  }
92
- else if (a === "--discover")
93
- out.discover = true;
94
102
  else if (a === "--repo-id") {
95
103
  const next = args[++i];
96
104
  if (next)
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export type InitOptions = {
2
2
  cwd: string;
3
- discover: boolean;
3
+ outputPath?: string;
4
4
  };
5
- export declare function runInit(opts: InitOptions): Promise<number>;
5
+ export declare function runInit(opts: InitOptions): Promise<void>;
6
+ export declare function runInitCli(_argv: string[]): Promise<number>;
@@ -1,73 +1,61 @@
1
- import { writeFile, readdir, readFile, stat } from "node:fs/promises";
2
- import { join, resolve } from "node:path";
3
- import { existsSync } from "node:fs";
1
+ import { writeFile, stat, readFile } from "node:fs/promises";
2
+ import { basename, isAbsolute, resolve } from "node:path";
3
+ import { errorMessage } from "@component-compass/ast-utils";
4
+ const TEMPLATE = (repoId) => ({
5
+ $schema: "https://unpkg.com/@component-compass/cli/schema/config.schema.json",
6
+ repoId,
7
+ include: ["src/**/*.{ts,tsx,jsx,js,vue,html}"],
8
+ exclude: ["**/*.{test,spec,stories}.*", "**/node_modules/**"],
9
+ packageScopes: [],
10
+ captureValues: false,
11
+ output: "./component-compass.json",
12
+ tagRules: [],
13
+ });
4
14
  export async function runInit(opts) {
5
- const target = resolve(opts.cwd, "component-compass.config.json");
6
- if (existsSync(target)) {
7
- process.stderr.write(`Refusing to overwrite ${target}. Delete it first if you want to re-init.\n`);
8
- return 2;
9
- }
10
- const manifests = opts.discover ? await discoverManifests(opts.cwd) : [];
11
- const cfg = {
12
- $schema: "https://unpkg.com/@component-compass/cli/schema/config.schema.json",
13
- manifests,
14
- include: ["src/**/*.{ts,tsx,js,jsx,html,vue}"],
15
- exclude: [
16
- "**/*.{test,spec,stories}.*",
17
- "**/node_modules/**",
18
- "**/dist/**",
19
- ],
20
- captureValues: false,
21
- output: "./component-compass.json",
22
- };
23
- await writeFile(target, `${JSON.stringify(cfg, null, 2)}\n`, "utf8");
24
- process.stdout.write(`Wrote ${target}\n`);
25
- if (opts.discover && manifests.length > 0) {
26
- process.stdout.write(`Discovered manifests: ${manifests.join(", ")}\n`);
15
+ const cwd = isAbsolute(opts.cwd) ? opts.cwd : resolve(opts.cwd);
16
+ const out = opts.outputPath ?? resolve(cwd, "component-compass.config.json");
17
+ // Don't clobber existing config.
18
+ try {
19
+ await stat(out);
20
+ throw new Error(`Config already exists at ${out}. Refusing to overwrite.`);
27
21
  }
28
- return 0;
29
- }
30
- async function discoverManifests(cwd) {
31
- const root = join(cwd, "node_modules");
32
- if (!existsSync(root))
33
- return [];
34
- const out = [];
35
- const entries = await readdir(root, { withFileTypes: true });
36
- for (const e of entries) {
37
- if (!e.isDirectory())
38
- continue;
39
- if (e.name.startsWith("@")) {
40
- const scopeDir = join(root, e.name);
41
- const subs = await readdir(scopeDir, { withFileTypes: true });
42
- for (const s of subs) {
43
- if (s.isDirectory()) {
44
- const found = await checkPackage(`${e.name}/${s.name}`, join(scopeDir, s.name));
45
- if (found)
46
- out.push(found);
47
- }
48
- }
49
- }
50
- else {
51
- const found = await checkPackage(e.name, join(root, e.name));
52
- if (found)
53
- out.push(found);
22
+ catch (err) {
23
+ const e = err;
24
+ if (e.code !== "ENOENT") {
25
+ // If the stat succeeded (no ENOENT), the throw above re-fires here. Detect
26
+ // by message and re-throw cleanly.
27
+ if (e.message?.startsWith("Config already exists"))
28
+ throw e;
29
+ throw err;
54
30
  }
55
31
  }
56
- return out;
32
+ const repoId = await deriveRepoId(cwd);
33
+ const cfg = TEMPLATE(repoId);
34
+ await writeFile(out, `${JSON.stringify(cfg, null, 2)}\n`, "utf8");
35
+ // eslint-disable-next-line no-console
36
+ console.log(`Wrote ${out}.\nEdit packageScopes to declare which DS packages to track.`);
57
37
  }
58
- async function checkPackage(name, dir) {
59
- const pkgPath = join(dir, "package.json");
38
+ async function deriveRepoId(cwd) {
60
39
  try {
61
- const raw = await readFile(pkgPath, "utf8");
62
- const pkg = JSON.parse(raw);
63
- if (typeof pkg.customElements !== "string")
64
- return undefined;
65
- const cemPath = join(dir, pkg.customElements);
66
- await stat(cemPath);
67
- return name;
40
+ const pkgRaw = await readFile(resolve(cwd, "package.json"), "utf8");
41
+ const pkg = JSON.parse(pkgRaw);
42
+ if (pkg.name)
43
+ return pkg.name;
68
44
  }
69
45
  catch {
70
- return undefined;
46
+ // ignore
47
+ }
48
+ return basename(cwd) || "unknown";
49
+ }
50
+ export async function runInitCli(_argv) {
51
+ const cwd = process.cwd();
52
+ try {
53
+ await runInit({ cwd });
54
+ return 0;
55
+ }
56
+ catch (err) {
57
+ process.stderr.write(`init failed: ${errorMessage(err)}\n`);
58
+ return 1;
71
59
  }
72
60
  }
73
61
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAOrC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,+BAA+B,CAAC,CAAC;IAClE,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,MAAM,6CAA6C,CAAC,CAAC;QACnG,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzE,MAAM,GAAG,GAAG;QACV,OAAO,EAAE,oEAAoE;QAC7E,SAAS;QACT,OAAO,EAAE,CAAC,mCAAmC,CAAC;QAC9C,OAAO,EAAE;YACP,4BAA4B;YAC5B,oBAAoB;YACpB,YAAY;SACb;QACD,aAAa,EAAE,KAAK;QACpB,MAAM,EAAE,0BAA0B;KACnC,CAAC;IAEF,MAAM,SAAS,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,GAAG,GAAa,EAAE,CAAC;IAEzB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,SAAS;QAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;oBACpB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;oBAChF,IAAI,KAAK;wBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7D,IAAI,KAAK;gBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,GAAW;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgC,CAAC;QAC3D,IAAI,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Diagnostic } from "@component-compass/plugin-core";
2
+ import type { WorkspaceGraph } from "../workspace/types.js";
3
+ export type NoDepsMatchScopesDiagnostic = Extract<Diagnostic, {
4
+ code: "no-deps-match-scopes";
5
+ }>;
6
+ /**
7
+ * Surfaces a common configuration mistake: the user declared `packageScopes`
8
+ * but none of the declared deps across root + workspace siblings matched any
9
+ * scope. Typical causes are a typo in the glob, scanning outside the
10
+ * directory containing the monorepo's package.json, or deps not installed.
11
+ *
12
+ * Returns `null` when there is nothing to report (no scopes declared, or at
13
+ * least one dep matched). Caller is responsible for emission.
14
+ */
15
+ export declare function computeNoDepsMatchScopes(packageScopes: readonly string[], warmedRoots: readonly string[], graph: WorkspaceGraph): NoDepsMatchScopesDiagnostic | null;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Surfaces a common configuration mistake: the user declared `packageScopes`
3
+ * but none of the declared deps across root + workspace siblings matched any
4
+ * scope. Typical causes are a typo in the glob, scanning outside the
5
+ * directory containing the monorepo's package.json, or deps not installed.
6
+ *
7
+ * Returns `null` when there is nothing to report (no scopes declared, or at
8
+ * least one dep matched). Caller is responsible for emission.
9
+ */
10
+ export function computeNoDepsMatchScopes(packageScopes, warmedRoots, graph) {
11
+ if (packageScopes.length === 0)
12
+ return null;
13
+ if (warmedRoots.length > 0)
14
+ return null;
15
+ return {
16
+ code: "no-deps-match-scopes",
17
+ severity: "info",
18
+ packageScopes,
19
+ packageManager: graph.packageManager,
20
+ workspacePackageCount: graph.packages.length,
21
+ };
22
+ }
23
+ //# sourceMappingURL=no-deps-diagnostic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-deps-diagnostic.js","sourceRoot":"","sources":["../../src/commands/no-deps-diagnostic.ts"],"names":[],"mappings":"AAQA;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CACtC,aAAgC,EAChC,WAA8B,EAC9B,KAAqB;IAErB,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,QAAQ,EAAE,MAAM;QAChB,aAAa;QACb,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,qBAAqB,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;KAC7C,CAAC;AACJ,CAAC"}
@@ -4,6 +4,7 @@ export type ScanOptions = {
4
4
  captureValuesOverride?: boolean;
5
5
  quiet?: boolean;
6
6
  failOn?: string;
7
+ strict?: boolean;
7
8
  repoId?: string;
8
9
  };
9
10
  export type ScanResult = {
@@ -1,9 +1,11 @@
1
1
  import { performance } from "node:perf_hooks";
2
- import { basename, isAbsolute, resolve } from "node:path";
2
+ import { isAbsolute, resolve } from "node:path";
3
3
  import { readFile } from "node:fs/promises";
4
+ import picomatch from "picomatch";
4
5
  import { loadConfig, ConfigError } from "../config/loader.js";
5
- import { runDiscovery } from "../manifest/run-discovery.js";
6
- import { buildComponentIndex } from "../manifest/index.js";
6
+ import { createLazyResolver } from "../manifest/lazy-resolver.js";
7
+ import { buildDiagnosticGate } from "../manifest/diagnostic-filter.js";
8
+ import { computeNoDepsMatchScopes } from "./no-deps-diagnostic.js";
7
9
  import { buildLocalIndex } from "../local-index/index.js";
8
10
  import { walkFiles } from "../walker/files.js";
9
11
  import { createImportResolver } from "../walker/resolve-import.js";
@@ -12,16 +14,17 @@ import { reactPlugin } from "@component-compass/parser-react";
12
14
  import { htmlPlugin } from "@component-compass/parser-html";
13
15
  import { litTemplatePlugin } from "@component-compass/parser-lit";
14
16
  import { vuePlugin } from "@component-compass/parser-vue";
15
- import { buildGraph } from "../graph/builder.js";
16
17
  import { writeJson } from "../reporter/json.js";
17
18
  import { printSummary } from "../reporter/stdout.js";
18
19
  import { buildScanEnvelope } from "../envelope/index.js";
19
- import { readPackageName } from "../util/pkg.js";
20
- import { readGitCommit } from "../util/git.js";
21
20
  import { isPnpProject } from "../util/pnp-check.js";
22
21
  import { Logger } from "../util/log.js";
23
22
  import { errorMessage } from "@component-compass/ast-utils";
24
- import { relativizePath } from "../util/posix.js";
23
+ import { buildComponentSeeds } from "../seeds.js";
24
+ import { parseResultsToOccurrences } from "../occurrences.js";
25
+ import { buildScanOutput } from "../reporter/index.js";
26
+ import { buildWorkspaceGraph, declaredDeps } from "../workspace/index.js";
27
+ import { createDiagnosticCollector } from "@component-compass/plugin-core";
25
28
  export async function runScan(opts) {
26
29
  const log = new Logger(opts.quiet);
27
30
  const t0 = performance.now();
@@ -44,40 +47,6 @@ export async function runScan(opts) {
44
47
  cfg.output = opts.outputOverride;
45
48
  if (opts.captureValuesOverride !== undefined)
46
49
  cfg.captureValues = opts.captureValuesOverride;
47
- const discovery = runDiscovery({
48
- repoRoot: cfg.configDir,
49
- packageScopes: cfg.packageScopes,
50
- manifestSources: cfg.manifestSources ?? {},
51
- });
52
- const cems = discovery.manifests;
53
- for (const d of discovery.diagnostics) {
54
- if (d.code === "no-manifest-found") {
55
- log.warn(`[component-compass] "${d.packageName}" matched packageScopes but no manifest could be resolved (root, re-export chain, manifestSources). Components from this package will surface with manifest: null.`);
56
- }
57
- else if (d.code === "untraceable-barrel") {
58
- log.warn(`[component-compass] "${d.packageName}" resolved to ${d.resolvedFile} which has no statically-traceable re-exports (likely bundled). Add an entry under manifestSources to point at the source packages.`);
59
- }
60
- else if (d.code === "cycle-detected") {
61
- log.warn(`[component-compass] cycle detected in re-export chain at ${d.file}. Truncating.`);
62
- }
63
- }
64
- const compIndexResult = buildComponentIndex(cems);
65
- const { warnings: compIndexWarnings, ...compIndexBase } = compIndexResult;
66
- const localIndex = await buildLocalIndex({ repoRoot: cfg.configDir });
67
- const compIndex = { ...compIndexBase, local: localIndex };
68
- const files = await walkFiles({
69
- root: cfg.configDir,
70
- include: cfg.include,
71
- exclude: cfg.exclude,
72
- });
73
- const initialWarnings = [...compIndexWarnings];
74
- if (files.length === 0) {
75
- initialWarnings.push({
76
- code: "EMPTY_INCLUDE",
77
- message: `No files matched include globs: ${cfg.include.join(", ")}`,
78
- });
79
- }
80
- const dispatcher = new Dispatcher([reactPlugin, htmlPlugin, litTemplatePlugin, vuePlugin]);
81
50
  const resolveImportOpts = {
82
51
  repoRoot: cfg.configDir,
83
52
  };
@@ -89,76 +58,151 @@ export async function runScan(opts) {
89
58
  : resolve(cfg.configDir, cfg.tsconfigPath);
90
59
  }
91
60
  const resolveImport = createImportResolver(resolveImportOpts);
61
+ const collector = createDiagnosticCollector();
62
+ const workspaceGraph = buildWorkspaceGraph(cfg.configDir);
63
+ const lazyResolver = createLazyResolver({
64
+ resolveImport,
65
+ repoRoot: cfg.configDir,
66
+ collector,
67
+ workspaceGraph,
68
+ });
69
+ // Warm-up: load each declared dep's root CEM/CCM (if any) so tag-only
70
+ // consumers (HTML files, Vue templates with no JS-side import for the tag)
71
+ // can resolve external custom elements via lookupByTag. Cheap (one
72
+ // package.json + one manifest read per dep) and matches the lazy
73
+ // resolver's terminal-load step in depth — no barrel walking, no
74
+ // re-export chasing.
75
+ const declared = declaredDeps(workspaceGraph);
76
+ lazyResolver.warmRoots(declared);
77
+ // Surface a config-error diagnostic when the user declared `packageScopes`
78
+ // but none of the declared deps matched. Reuses the same picomatch-based
79
+ // matching as the diagnostic gate so the two filters can't drift.
80
+ const warmedMatchingScopes = filterByScopes(declared, cfg.packageScopes);
81
+ const noDepsDiagnostic = computeNoDepsMatchScopes(cfg.packageScopes, warmedMatchingScopes, workspaceGraph);
82
+ if (noDepsDiagnostic)
83
+ collector.emit(noDepsDiagnostic);
84
+ const localIndex = await buildLocalIndex({ repoRoot: cfg.configDir, collector });
85
+ const files = await walkFiles({
86
+ root: cfg.configDir,
87
+ include: cfg.include,
88
+ exclude: cfg.exclude,
89
+ });
90
+ if (files.length === 0) {
91
+ log.warn(`No files matched include globs: ${cfg.include.join(", ")}`);
92
+ }
93
+ // Sort files so JS/TS/Vue process before HTML; this primes the by-tag cache
94
+ // in the lazy resolver before plain HTML files (which only have tag names,
95
+ // no import specifiers) need to look up custom elements.
96
+ const orderedFiles = [...files].sort((a, b) => {
97
+ const aHtml = /\.html?$/.test(a) ? 1 : 0;
98
+ const bHtml = /\.html?$/.test(b) ? 1 : 0;
99
+ return aHtml - bHtml;
100
+ });
101
+ const dispatcher = new Dispatcher([reactPlugin, htmlPlugin, litTemplatePlugin, vuePlugin]);
92
102
  const results = [];
93
- for (const file of files) {
103
+ for (const file of orderedFiles) {
94
104
  const source = await readFile(file, "utf8").catch(() => "");
95
105
  if (!source)
96
106
  continue;
97
107
  for (const plugin of dispatcher.allPluginsFor(file)) {
98
108
  try {
99
109
  results.push(plugin.parse(file, source, {
100
- index: compIndex,
110
+ localIndex,
101
111
  config: cfg,
102
112
  resolveImport,
113
+ resolveLazyManifest: lazyResolver.resolveLazyManifest,
114
+ lookupByTag: lazyResolver.lookupByTag,
103
115
  repoRoot: cfg.configDir,
116
+ collector,
104
117
  }));
105
118
  }
106
119
  catch (err) {
107
- initialWarnings.push({
108
- code: "PARSE_FAILURE",
109
- message: errorMessage(err),
110
- file,
111
- // line: 0 means "unknown" — plugin threw without a recoverable location.
112
- line: 0,
113
- });
120
+ log.warn(`[component-compass] parse failure in ${file}: ${errorMessage(err)}`);
114
121
  }
115
122
  }
116
123
  }
117
124
  const t1 = performance.now();
118
- const repoName = (await readPackageName(cfg.configDir)) ?? (basename(cfg.configDir) || "unknown");
119
- const commit = await readGitCommit(cfg.configDir);
120
- const repoMeta = {
121
- name: repoName,
122
- root: cfg.configDir,
123
- };
124
- if (commit)
125
- repoMeta.commit = commit;
126
- const manifestsMeta = cems.map((c) => {
127
- const ref = {
128
- source: c.kind === "cem" ? "cem" : c.manifest.source,
129
- package: c.packageName,
130
- path: relativizePath(c.path, cfg.configDir),
131
- };
132
- if (c.packageVersion)
133
- ref.version = c.packageVersion;
134
- return ref;
135
- });
125
+ // Drain the shared collector. Diagnostics are gated: when `packageScopes`
126
+ // is configured we drop diagnostics whose `packageName` falls outside the
127
+ // same allowlist `buildScanOutput` uses for the artifact.
128
+ const allDiagnostics = collector.drain();
129
+ const allowDiagnostic = buildDiagnosticGate(cfg.packageScopes);
130
+ const diagnostics = allDiagnostics.filter(allowDiagnostic);
131
+ if (!opts.quiet) {
132
+ for (const d of diagnostics) {
133
+ log.warn(formatDiagnostic(d));
134
+ }
135
+ }
136
136
  const envelope = buildScanEnvelope({
137
137
  cwd: cfg.configDir,
138
138
  cliRepoIdFlag: opts.repoId,
139
139
  });
140
- const graph = buildGraph({
141
- index: compIndex,
142
- results,
140
+ const snapshot = lazyResolver
141
+ .snapshotComponents()
142
+ .map((c) => ({ component: c, enrichmentSource: "authored" }));
143
+ // Phase 4 will mark some entries `derived`; in Phase 1 the stub never returns one.
144
+ const manifests = lazyResolver.snapshotManifestRefs();
145
+ const seeds = buildComponentSeeds(snapshot, results, cfg.tagRules, localIndex, cfg.configDir, workspaceGraph);
146
+ const occurrences = parseResultsToOccurrences(results, cfg.captureValues, cfg.configDir);
147
+ const partialStats = {
143
148
  filesScanned: files.length,
149
+ filesWithUsage: countFilesWithUsage(occurrences),
144
150
  scanDurationMs: Math.round(t1 - t0),
145
- tool: { name: "component-compass", version: envelope.toolVersion },
146
- repo: repoMeta,
147
- manifests: manifestsMeta,
148
- captureValues: cfg.captureValues,
149
- extraWarnings: initialWarnings,
150
- envelope,
151
- });
151
+ };
152
+ const scanOutput = buildScanOutput(envelope, manifests, partialStats, seeds, occurrences, cfg.packageScopes, diagnostics);
152
153
  const outputPath = isAbsolute(cfg.output) ? cfg.output : resolve(cfg.configDir, cfg.output);
153
- await writeJson(graph, outputPath);
154
- if (!opts.quiet)
155
- printSummary(graph, outputPath);
154
+ await writeJson(scanOutput, outputPath);
155
+ if (!opts.quiet) {
156
+ printSummary(scanOutput, outputPath);
157
+ }
156
158
  let exitCode = 0;
157
159
  if (opts.failOn === "deprecated-usage") {
158
- const hasDeprecated = graph.components.some((c) => c.deprecated !== false && c.occurrences.length > 0);
160
+ const hasDeprecated = scanOutput.components.some((c) => c.manifest?.data?.lifecycle?.status === "deprecated" &&
161
+ c.stats.occurrenceCount > 0);
159
162
  if (hasDeprecated)
160
163
  exitCode = 1;
161
164
  }
165
+ if (opts.strict && diagnostics.some((d) => d.severity === "warning")) {
166
+ exitCode = 1;
167
+ }
162
168
  return { exitCode };
163
169
  }
170
+ function filterByScopes(deps, scopes) {
171
+ if (scopes.length === 0)
172
+ return [...deps];
173
+ const matchers = scopes.map((s) => picomatch(s));
174
+ return deps.filter((d) => matchers.some((m) => m(d)));
175
+ }
176
+ function countFilesWithUsage(occurrences) {
177
+ const files = new Set();
178
+ for (const o of occurrences)
179
+ files.add(o.filePath);
180
+ return files.size;
181
+ }
182
+ function assertUnreachable(x) {
183
+ throw new Error(`Unhandled diagnostic code: ${x.code}`);
184
+ }
185
+ function formatDiagnostic(d) {
186
+ const tag = d.severity === "warning" ? "warn " : "info ";
187
+ switch (d.code) {
188
+ case "jsx-shape-unsupported":
189
+ return `${tag} [component-compass] ${d.code} at ${d.filePath}:${d.line ?? "?"} — ${d.detail}`;
190
+ case "vue-tag-low-confidence":
191
+ return `${tag} [component-compass] ${d.code} at ${d.filePath}:${d.line ?? "?"} — emitted <${d.tagName}> as ${d.emittedAs}`;
192
+ case "local-index-duplicate-tag":
193
+ return `${tag} [component-compass] ${d.code} at ${d.filePath} — <${d.tagName}> conflicts with ${d.conflictsWith}`;
194
+ case "barrel-unsupported-form":
195
+ return `${tag} [component-compass] ${d.code} at ${d.filePath}:${d.line ?? "?"} — ${d.form}`;
196
+ case "untraceable-barrel":
197
+ return `${tag} [component-compass] ${d.code} — "${d.packageName}" resolved to ${d.resolvedFile} (no static re-exports)`;
198
+ case "cycle-detected":
199
+ return `${tag} [component-compass] ${d.code} at ${d.filePath} (export: ${d.exportName})`;
200
+ case "chain-too-deep":
201
+ return `${tag} [component-compass] ${d.code} at ${d.filePath} (export: ${d.exportName}, depth: ${d.depth})`;
202
+ case "no-deps-match-scopes":
203
+ return `${tag} [component-compass] ${d.code} — no workspace packages matched scopes [${d.packageScopes.join(", ")}] (${d.packageManager}, ${d.workspacePackageCount} workspace packages)`;
204
+ default:
205
+ return assertUnreachable(d);
206
+ }
207
+ }
164
208
  //# sourceMappingURL=scan.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Owner-edge composition rollup. Pure two-pass fold over the flat occurrence
3
+ * stream — does not mutate inputs.
4
+ *
5
+ * Pass 1 indexes occurrences by their ownerComponentId so we can compute
6
+ * rendersByCount per owner without re-scanning the occurrence list once per
7
+ * component.
8
+ *
9
+ * Pass 2 visits each component and accumulates:
10
+ * - rendersByCount: child componentId → count of occurrences this component
11
+ * owns. Built from the pass-1 index.
12
+ * - renderedByCount: parent componentId → count of times this component
13
+ * appears with that owner.
14
+ * - isRootCount: occurrences of this component with no ownerComponentId.
15
+ * - isLeafCount: this component's own occurrences whose rendersByCount is
16
+ * empty (i.e. the component doesn't own anything).
17
+ *
18
+ * Every component receives a composition block — even when it has zero
19
+ * occurrences and owns nothing — so downstream graph traversals always find
20
+ * the field present.
21
+ */
22
+ import type { OutputComponent, OutputOccurrence } from "@component-compass/plugin-core";
23
+ export declare function applyCompositionRollup(components: OutputComponent[], occurrences: OutputOccurrence[]): OutputComponent[];