@component-compass/cli 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +8 -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/scan.js +109 -82
  8. package/dist/commands/scan.js.map +1 -1
  9. package/dist/composition-rollup.d.ts +21 -0
  10. package/dist/composition-rollup.js +74 -0
  11. package/dist/composition-rollup.js.map +1 -0
  12. package/dist/config/loader.js +5 -3
  13. package/dist/config/loader.js.map +1 -1
  14. package/dist/config/schema.d.ts +1 -2
  15. package/dist/config/schema.js.map +1 -1
  16. package/dist/identity.d.ts +12 -0
  17. package/dist/identity.js +25 -0
  18. package/dist/identity.js.map +1 -1
  19. package/dist/manifest/barrel-parser.d.ts +20 -0
  20. package/dist/manifest/barrel-parser.js +101 -16
  21. package/dist/manifest/barrel-parser.js.map +1 -1
  22. package/dist/manifest/derived-manifest-stub.d.ts +9 -0
  23. package/dist/manifest/derived-manifest-stub.js +11 -0
  24. package/dist/manifest/derived-manifest-stub.js.map +1 -0
  25. package/dist/manifest/diagnostic-filter.d.ts +12 -0
  26. package/dist/manifest/diagnostic-filter.js +23 -0
  27. package/dist/manifest/diagnostic-filter.js.map +1 -0
  28. package/dist/manifest/lazy-resolver.d.ts +52 -0
  29. package/dist/manifest/lazy-resolver.js +405 -0
  30. package/dist/manifest/lazy-resolver.js.map +1 -0
  31. package/dist/occurrences.d.ts +17 -0
  32. package/dist/occurrences.js +73 -0
  33. package/dist/occurrences.js.map +1 -0
  34. package/dist/reporter/index.d.ts +26 -3
  35. package/dist/reporter/index.js +68 -5
  36. package/dist/reporter/index.js.map +1 -1
  37. package/dist/reporter/json.d.ts +6 -2
  38. package/dist/reporter/json.js +7 -3
  39. package/dist/reporter/json.js.map +1 -1
  40. package/dist/reporter/stdout.d.ts +2 -2
  41. package/dist/reporter/stdout.js +11 -23
  42. package/dist/reporter/stdout.js.map +1 -1
  43. package/dist/rollup.js +0 -1
  44. package/dist/rollup.js.map +1 -1
  45. package/dist/seeds.d.ts +40 -0
  46. package/dist/seeds.js +114 -0
  47. package/dist/seeds.js.map +1 -0
  48. package/dist/types.d.ts +0 -1
  49. package/package.json +9 -9
  50. package/schema/config.schema.json +2 -10
  51. package/dist/graph/builder.d.ts +0 -25
  52. package/dist/graph/builder.js +0 -176
  53. package/dist/graph/builder.js.map +0 -1
  54. package/dist/manifest/discovery.d.ts +0 -24
  55. package/dist/manifest/discovery.js +0 -194
  56. package/dist/manifest/discovery.js.map +0 -1
  57. package/dist/manifest/index.d.ts +0 -6
  58. package/dist/manifest/index.js +0 -98
  59. package/dist/manifest/index.js.map +0 -1
  60. package/dist/manifest/resolver.d.ts +0 -30
  61. package/dist/manifest/resolver.js +0 -136
  62. package/dist/manifest/resolver.js.map +0 -1
  63. package/dist/manifest/run-discovery.d.ts +0 -12
  64. package/dist/manifest/run-discovery.js +0 -46
  65. package/dist/manifest/run-discovery.js.map +0 -1
  66. package/dist/manifest/types.d.ts +0 -3
  67. package/dist/manifest/types.js +0 -2
  68. package/dist/manifest/types.js.map +0 -1
  69. package/dist/reporter/types.d.ts +0 -69
  70. package/dist/reporter/types.js +0 -2
  71. 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
@@ -56,8 +56,14 @@ async function main(argv) {
56
56
  return r.exitCode;
57
57
  }
58
58
  if (cmd === "init") {
59
- const flags = parseFlags(rest);
60
- return await runInit({ cwd: process.cwd(), discover: flags.discover ?? false });
59
+ try {
60
+ await runInit({ cwd: process.cwd() });
61
+ return 0;
62
+ }
63
+ catch (err) {
64
+ process.stderr.write(`init failed: ${errorStack(err)}\n`);
65
+ return 1;
66
+ }
61
67
  }
62
68
  log.error(`Unknown command: ${cmd}\n${HELP}`);
63
69
  return 2;
@@ -89,8 +95,6 @@ function parseFlags(args) {
89
95
  if (next)
90
96
  out.failOn = next;
91
97
  }
92
- else if (a === "--discover")
93
- out.discover = true;
94
98
  else if (a === "--repo-id") {
95
99
  const next = args[++i];
96
100
  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":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { performance } from "node:perf_hooks";
2
- import { basename, isAbsolute, resolve } from "node:path";
2
+ import { isAbsolute, join, resolve } from "node:path";
3
3
  import { readFile } from "node:fs/promises";
4
+ import { readFileSync } from "node:fs";
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";
7
8
  import { buildLocalIndex } from "../local-index/index.js";
8
9
  import { walkFiles } from "../walker/files.js";
9
10
  import { createImportResolver } from "../walker/resolve-import.js";
@@ -12,16 +13,15 @@ import { reactPlugin } from "@component-compass/parser-react";
12
13
  import { htmlPlugin } from "@component-compass/parser-html";
13
14
  import { litTemplatePlugin } from "@component-compass/parser-lit";
14
15
  import { vuePlugin } from "@component-compass/parser-vue";
15
- import { buildGraph } from "../graph/builder.js";
16
16
  import { writeJson } from "../reporter/json.js";
17
17
  import { printSummary } from "../reporter/stdout.js";
18
18
  import { buildScanEnvelope } from "../envelope/index.js";
19
- import { readPackageName } from "../util/pkg.js";
20
- import { readGitCommit } from "../util/git.js";
21
19
  import { isPnpProject } from "../util/pnp-check.js";
22
20
  import { Logger } from "../util/log.js";
23
21
  import { errorMessage } from "@component-compass/ast-utils";
24
- import { relativizePath } from "../util/posix.js";
22
+ import { buildComponentSeeds } from "../seeds.js";
23
+ import { parseResultsToOccurrences } from "../occurrences.js";
24
+ import { buildScanOutput } from "../reporter/index.js";
25
25
  export async function runScan(opts) {
26
26
  const log = new Logger(opts.quiet);
27
27
  const t0 = performance.now();
@@ -44,40 +44,6 @@ export async function runScan(opts) {
44
44
  cfg.output = opts.outputOverride;
45
45
  if (opts.captureValuesOverride !== undefined)
46
46
  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
47
  const resolveImportOpts = {
82
48
  repoRoot: cfg.configDir,
83
49
  };
@@ -89,76 +55,137 @@ export async function runScan(opts) {
89
55
  : resolve(cfg.configDir, cfg.tsconfigPath);
90
56
  }
91
57
  const resolveImport = createImportResolver(resolveImportOpts);
58
+ const lazyResolver = createLazyResolver({ resolveImport, repoRoot: cfg.configDir });
59
+ // Warm-up: load each declared dep's root CEM/CCM (if any) so tag-only
60
+ // consumers (HTML files, Vue templates with no JS-side import for the tag)
61
+ // can resolve external custom elements via lookupByTag. Cheap (one
62
+ // package.json + one manifest read per dep) and matches the lazy
63
+ // resolver's terminal-load step in depth — no barrel walking, no
64
+ // re-export chasing.
65
+ lazyResolver.warmRoots(declaredDeps(cfg.configDir));
66
+ const localIndex = await buildLocalIndex({ repoRoot: cfg.configDir });
67
+ const files = await walkFiles({
68
+ root: cfg.configDir,
69
+ include: cfg.include,
70
+ exclude: cfg.exclude,
71
+ });
72
+ if (files.length === 0) {
73
+ log.warn(`No files matched include globs: ${cfg.include.join(", ")}`);
74
+ }
75
+ // Sort files so JS/TS/Vue process before HTML; this primes the by-tag cache
76
+ // in the lazy resolver before plain HTML files (which only have tag names,
77
+ // no import specifiers) need to look up custom elements.
78
+ const orderedFiles = [...files].sort((a, b) => {
79
+ const aHtml = /\.html?$/.test(a) ? 1 : 0;
80
+ const bHtml = /\.html?$/.test(b) ? 1 : 0;
81
+ return aHtml - bHtml;
82
+ });
83
+ const dispatcher = new Dispatcher([reactPlugin, htmlPlugin, litTemplatePlugin, vuePlugin]);
92
84
  const results = [];
93
- for (const file of files) {
85
+ for (const file of orderedFiles) {
94
86
  const source = await readFile(file, "utf8").catch(() => "");
95
87
  if (!source)
96
88
  continue;
97
89
  for (const plugin of dispatcher.allPluginsFor(file)) {
98
90
  try {
99
91
  results.push(plugin.parse(file, source, {
100
- index: compIndex,
92
+ localIndex,
101
93
  config: cfg,
102
94
  resolveImport,
95
+ resolveLazyManifest: lazyResolver.resolveLazyManifest,
96
+ lookupByTag: lazyResolver.lookupByTag,
103
97
  repoRoot: cfg.configDir,
104
98
  }));
105
99
  }
106
100
  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
- });
101
+ log.warn(`[component-compass] parse failure in ${file}: ${errorMessage(err)}`);
114
102
  }
115
103
  }
116
104
  }
117
105
  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
- });
106
+ // Diagnostics are gated twice: `--quiet` suppresses them entirely, and
107
+ // when `packageScopes` is configured we drop diagnostics whose
108
+ // `packageName` falls outside the same allowlist `buildScanOutput` uses
109
+ // for the artifact. Real-world scans against multi-package consumer apps
110
+ // showed unfiltered diagnostics flooding stderr with warnings about
111
+ // dependencies the user never asked about.
112
+ if (!opts.quiet) {
113
+ const allowDiagnostic = buildDiagnosticGate(cfg.packageScopes);
114
+ for (const d of lazyResolver.diagnostics()) {
115
+ if (!allowDiagnostic(d))
116
+ continue;
117
+ if (d.code === "barrel-unsupported-form") {
118
+ log.warn(`[component-compass] ${d.file} contains an unsupported re-export form (${d.form}); treating file as terminal.`);
119
+ }
120
+ else if (d.code === "untraceable-barrel") {
121
+ log.warn(`[component-compass] "${d.packageName}" resolved to ${d.resolvedFile} which has no statically-traceable re-exports (likely bundled). Components from this package will surface with manifest: null. Add a component-compass-manifest.json at the package root to enrich.`);
122
+ }
123
+ else if (d.code === "cycle-detected") {
124
+ log.warn(`[component-compass] cycle detected in re-export chain at ${d.file} (export: ${d.exportName}). Truncating.`);
125
+ }
126
+ else if (d.code === "chain-too-deep") {
127
+ log.warn(`[component-compass] re-export chain at ${d.file} exceeded ${d.depth} hops; bailing. (export: ${d.exportName})`);
128
+ }
129
+ }
130
+ }
136
131
  const envelope = buildScanEnvelope({
137
132
  cwd: cfg.configDir,
138
133
  cliRepoIdFlag: opts.repoId,
139
134
  });
140
- const graph = buildGraph({
141
- index: compIndex,
142
- results,
135
+ const snapshot = lazyResolver
136
+ .snapshotComponents()
137
+ .map((c) => ({ component: c, enrichmentSource: "authored" }));
138
+ // Phase 4 will mark some entries `derived`; in Phase 1 the stub never returns one.
139
+ const manifests = lazyResolver.snapshotManifestRefs();
140
+ const seeds = buildComponentSeeds(snapshot, results, cfg.tagRules);
141
+ const occurrences = parseResultsToOccurrences(results, cfg.captureValues);
142
+ const partialStats = {
143
143
  filesScanned: files.length,
144
+ filesWithUsage: countFilesWithUsage(occurrences),
144
145
  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
- });
146
+ };
147
+ const scanOutput = buildScanOutput(envelope, manifests, partialStats, seeds, occurrences, cfg.packageScopes);
152
148
  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);
149
+ await writeJson(scanOutput, outputPath);
150
+ if (!opts.quiet) {
151
+ printSummary(scanOutput, outputPath);
152
+ }
156
153
  let exitCode = 0;
157
154
  if (opts.failOn === "deprecated-usage") {
158
- const hasDeprecated = graph.components.some((c) => c.deprecated !== false && c.occurrences.length > 0);
155
+ const hasDeprecated = scanOutput.components.some((c) => c.manifest?.lifecycle?.status === "deprecated" &&
156
+ c.stats.occurrenceCount > 0);
159
157
  if (hasDeprecated)
160
158
  exitCode = 1;
161
159
  }
162
160
  return { exitCode };
163
161
  }
162
+ function countFilesWithUsage(occurrences) {
163
+ const files = new Set();
164
+ for (const o of occurrences)
165
+ files.add(o.filePath);
166
+ return files.size;
167
+ }
168
+ /**
169
+ * Returns every package name declared in <repoRoot>/package.json across all
170
+ * dep buckets (regular / dev / peer / optional). Used to warm the lazy
171
+ * resolver's by-tag cache so tag-only consumers don't need a JS-side import
172
+ * to surface the leaf identity.
173
+ */
174
+ function declaredDeps(repoRoot) {
175
+ let pkg;
176
+ try {
177
+ pkg = JSON.parse(readFileSync(join(repoRoot, "package.json"), "utf8"));
178
+ }
179
+ catch {
180
+ return [];
181
+ }
182
+ const all = new Set();
183
+ for (const m of [pkg.dependencies, pkg.devDependencies, pkg.peerDependencies, pkg.optionalDependencies]) {
184
+ if (!m)
185
+ continue;
186
+ for (const name of Object.keys(m))
187
+ all.add(name);
188
+ }
189
+ return [...all];
190
+ }
164
191
  //# 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,21 @@
1
+ /**
2
+ * Phase 2: per-component composition rollup. Pure two-pass fold over the flat
3
+ * occurrence stream — does not mutate inputs.
4
+ *
5
+ * Pass 1 builds an index of children grouped by their parent's occurrenceId
6
+ * (and by the child's componentId, so rendersByCount aggregates cleanly).
7
+ *
8
+ * Pass 2 visits each component's occurrences and accumulates the rollup:
9
+ * - renderedByCount: count of times this component sat under each parent
10
+ * componentId (one increment per occurrence with that parentComponentId).
11
+ * - rendersByCount: sum of childCompId → count maps across this component's
12
+ * occurrences, drawn from the pass-1 index.
13
+ * - isRootCount: occurrences with no parentOccurrenceId.
14
+ * - isLeafCount: occurrences with no entries in the pass-1 index for them.
15
+ * - depth metrics: avg + max over occurrence.depth (defaults to 0 when absent).
16
+ * - childCount metrics: avg + max children per occurrence.
17
+ *
18
+ * Components with no occurrences are returned unchanged (no `composition` field).
19
+ */
20
+ import type { OutputComponent, OutputOccurrence } from "@component-compass/plugin-core";
21
+ export declare function applyCompositionRollup(components: OutputComponent[], occurrences: OutputOccurrence[]): OutputComponent[];
@@ -0,0 +1,74 @@
1
+ export function applyCompositionRollup(components, occurrences) {
2
+ // Pass 1: index children by parent occurrenceId, grouped by child componentId.
3
+ const childrenByParent = new Map();
4
+ for (const o of occurrences) {
5
+ if (o.parentOccurrenceId) {
6
+ let m = childrenByParent.get(o.parentOccurrenceId);
7
+ if (!m) {
8
+ m = new Map();
9
+ childrenByParent.set(o.parentOccurrenceId, m);
10
+ }
11
+ m.set(o.componentId, (m.get(o.componentId) ?? 0) + 1);
12
+ }
13
+ }
14
+ // Group occurrences by componentId once, for per-component aggregation.
15
+ const occsByComp = new Map();
16
+ for (const o of occurrences) {
17
+ const list = occsByComp.get(o.componentId);
18
+ if (list)
19
+ list.push(o);
20
+ else
21
+ occsByComp.set(o.componentId, [o]);
22
+ }
23
+ return components.map((c) => {
24
+ const occs = occsByComp.get(c.id) ?? [];
25
+ if (occs.length === 0)
26
+ return c;
27
+ const rendersByCount = {};
28
+ const renderedByCount = {};
29
+ let isRootCount = 0;
30
+ let isLeafCount = 0;
31
+ let depthSum = 0;
32
+ let maxDepth = 0;
33
+ let totalChildCount = 0;
34
+ let maxChildCount = 0;
35
+ for (const o of occs) {
36
+ const childMap = childrenByParent.get(o.occurrenceId);
37
+ const childCount = childMap
38
+ ? Array.from(childMap.values()).reduce((a, b) => a + b, 0)
39
+ : 0;
40
+ if (childMap) {
41
+ for (const [childId, count] of childMap) {
42
+ rendersByCount[childId] = (rendersByCount[childId] ?? 0) + count;
43
+ }
44
+ }
45
+ if (o.parentComponentId) {
46
+ renderedByCount[o.parentComponentId] = (renderedByCount[o.parentComponentId] ?? 0) + 1;
47
+ }
48
+ else {
49
+ isRootCount++;
50
+ }
51
+ if (childCount === 0)
52
+ isLeafCount++;
53
+ const d = o.depth ?? 0;
54
+ depthSum += d;
55
+ if (d > maxDepth)
56
+ maxDepth = d;
57
+ totalChildCount += childCount;
58
+ if (childCount > maxChildCount)
59
+ maxChildCount = childCount;
60
+ }
61
+ const composition = {
62
+ rendersByCount,
63
+ renderedByCount,
64
+ isRootCount,
65
+ isLeafCount,
66
+ avgDepth: depthSum / occs.length,
67
+ maxDepth,
68
+ avgChildCount: totalChildCount / occs.length,
69
+ maxChildCount,
70
+ };
71
+ return { ...c, composition };
72
+ });
73
+ }
74
+ //# sourceMappingURL=composition-rollup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition-rollup.js","sourceRoot":"","sources":["../src/composition-rollup.ts"],"names":[],"mappings":"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"}