@component-compass/cli 0.0.0-pr-3-8916f3c-20260507145532

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 (124) hide show
  1. package/README.md +5 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.js +110 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/init.d.ts +6 -0
  6. package/dist/commands/init.js +61 -0
  7. package/dist/commands/init.js.map +1 -0
  8. package/dist/commands/scan.d.ts +12 -0
  9. package/dist/commands/scan.js +147 -0
  10. package/dist/commands/scan.js.map +1 -0
  11. package/dist/config/loader.d.ts +6 -0
  12. package/dist/config/loader.js +62 -0
  13. package/dist/config/loader.js.map +1 -0
  14. package/dist/config/schema.d.ts +32 -0
  15. package/dist/config/schema.js +15 -0
  16. package/dist/config/schema.js.map +1 -0
  17. package/dist/config/tag-rules.d.ts +2 -0
  18. package/dist/config/tag-rules.js +34 -0
  19. package/dist/config/tag-rules.js.map +1 -0
  20. package/dist/dispatcher.d.ts +8 -0
  21. package/dist/dispatcher.js +22 -0
  22. package/dist/dispatcher.js.map +1 -0
  23. package/dist/envelope/git.d.ts +13 -0
  24. package/dist/envelope/git.js +69 -0
  25. package/dist/envelope/git.js.map +1 -0
  26. package/dist/envelope/index.d.ts +10 -0
  27. package/dist/envelope/index.js +57 -0
  28. package/dist/envelope/index.js.map +1 -0
  29. package/dist/envelope/repo-id.d.ts +16 -0
  30. package/dist/envelope/repo-id.js +40 -0
  31. package/dist/envelope/repo-id.js.map +1 -0
  32. package/dist/identity.d.ts +46 -0
  33. package/dist/identity.js +92 -0
  34. package/dist/identity.js.map +1 -0
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.js +2 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/local-index/detect-react.d.ts +2 -0
  39. package/dist/local-index/detect-react.js +128 -0
  40. package/dist/local-index/detect-react.js.map +1 -0
  41. package/dist/local-index/detect-vue.d.ts +2 -0
  42. package/dist/local-index/detect-vue.js +164 -0
  43. package/dist/local-index/detect-vue.js.map +1 -0
  44. package/dist/local-index/detect-wc.d.ts +2 -0
  45. package/dist/local-index/detect-wc.js +74 -0
  46. package/dist/local-index/detect-wc.js.map +1 -0
  47. package/dist/local-index/index.d.ts +6 -0
  48. package/dist/local-index/index.js +31 -0
  49. package/dist/local-index/index.js.map +1 -0
  50. package/dist/local-index/types.d.ts +2 -0
  51. package/dist/local-index/types.js +2 -0
  52. package/dist/local-index/types.js.map +1 -0
  53. package/dist/local-index/walker.d.ts +11 -0
  54. package/dist/local-index/walker.js +47 -0
  55. package/dist/local-index/walker.js.map +1 -0
  56. package/dist/manifest/barrel-parser.d.ts +22 -0
  57. package/dist/manifest/barrel-parser.js +62 -0
  58. package/dist/manifest/barrel-parser.js.map +1 -0
  59. package/dist/manifest/discovery.d.ts +24 -0
  60. package/dist/manifest/discovery.js +194 -0
  61. package/dist/manifest/discovery.js.map +1 -0
  62. package/dist/manifest/index.d.ts +6 -0
  63. package/dist/manifest/index.js +98 -0
  64. package/dist/manifest/index.js.map +1 -0
  65. package/dist/manifest/resolver.d.ts +30 -0
  66. package/dist/manifest/resolver.js +136 -0
  67. package/dist/manifest/resolver.js.map +1 -0
  68. package/dist/manifest/run-discovery.d.ts +12 -0
  69. package/dist/manifest/run-discovery.js +46 -0
  70. package/dist/manifest/run-discovery.js.map +1 -0
  71. package/dist/manifest/types.d.ts +3 -0
  72. package/dist/manifest/types.js +2 -0
  73. package/dist/manifest/types.js.map +1 -0
  74. package/dist/occurrences.d.ts +12 -0
  75. package/dist/occurrences.js +42 -0
  76. package/dist/occurrences.js.map +1 -0
  77. package/dist/reporter/index.d.ts +25 -0
  78. package/dist/reporter/index.js +50 -0
  79. package/dist/reporter/index.js.map +1 -0
  80. package/dist/reporter/json.d.ts +6 -0
  81. package/dist/reporter/json.js +11 -0
  82. package/dist/reporter/json.js.map +1 -0
  83. package/dist/reporter/stdout.d.ts +2 -0
  84. package/dist/reporter/stdout.js +40 -0
  85. package/dist/reporter/stdout.js.map +1 -0
  86. package/dist/rollup.d.ts +21 -0
  87. package/dist/rollup.js +78 -0
  88. package/dist/rollup.js.map +1 -0
  89. package/dist/seeds.d.ts +28 -0
  90. package/dist/seeds.js +109 -0
  91. package/dist/seeds.js.map +1 -0
  92. package/dist/types/brand.d.ts +11 -0
  93. package/dist/types/brand.js +5 -0
  94. package/dist/types/brand.js.map +1 -0
  95. package/dist/types/component-id.d.ts +2 -0
  96. package/dist/types/component-id.js +2 -0
  97. package/dist/types/component-id.js.map +1 -0
  98. package/dist/types.d.ts +17 -0
  99. package/dist/types.js +2 -0
  100. package/dist/types.js.map +1 -0
  101. package/dist/util/git.d.ts +1 -0
  102. package/dist/util/git.js +13 -0
  103. package/dist/util/git.js.map +1 -0
  104. package/dist/util/log.d.ts +7 -0
  105. package/dist/util/log.js +17 -0
  106. package/dist/util/log.js.map +1 -0
  107. package/dist/util/pkg.d.ts +1 -0
  108. package/dist/util/pkg.js +13 -0
  109. package/dist/util/pkg.js.map +1 -0
  110. package/dist/util/pnp-check.d.ts +1 -0
  111. package/dist/util/pnp-check.js +6 -0
  112. package/dist/util/pnp-check.js.map +1 -0
  113. package/dist/util/posix.d.ts +2 -0
  114. package/dist/util/posix.js +18 -0
  115. package/dist/util/posix.js.map +1 -0
  116. package/dist/walker/files.d.ts +6 -0
  117. package/dist/walker/files.js +12 -0
  118. package/dist/walker/files.js.map +1 -0
  119. package/dist/walker/resolve-import.d.ts +9 -0
  120. package/dist/walker/resolve-import.js +119 -0
  121. package/dist/walker/resolve-import.js.map +1 -0
  122. package/examples/github-actions-workflow.yml +20 -0
  123. package/package.json +63 -0
  124. package/schema/config.schema.json +61 -0
@@ -0,0 +1,194 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { dirname, isAbsolute, join, resolve } from "node:path";
4
+ import picomatch from "picomatch";
5
+ import { validateManifest } from "@component-compass/plugin-core";
6
+ import { parseBarrelTopLevel } from "./barrel-parser.js";
7
+ export function discoverManifest(opts) {
8
+ return discoverManifestWithDiagnostics(opts).manifest;
9
+ }
10
+ export function discoverManifestWithDiagnostics(opts) {
11
+ const visited = new Set();
12
+ const diagnostics = [];
13
+ const manifest = walk(opts.packageName, opts.repoRoot, visited, diagnostics, opts.manifestSources);
14
+ if (!manifest) {
15
+ diagnostics.push({ code: "no-manifest-found", packageName: opts.packageName });
16
+ }
17
+ return { manifest, diagnostics };
18
+ }
19
+ function walk(pkgName, repoRoot, visited, diagnostics, manifestSources) {
20
+ if (visited.has(pkgName)) {
21
+ diagnostics.push({ code: "cycle-detected", packageName: pkgName, file: pkgName });
22
+ return null;
23
+ }
24
+ visited.add(pkgName);
25
+ // 1. Root manifest.
26
+ const root = readRootManifest(pkgName, repoRoot);
27
+ if (root)
28
+ return root;
29
+ // 2. Barrel auto-follow.
30
+ const entryFile = resolvePackageEntry(pkgName, repoRoot);
31
+ if (entryFile) {
32
+ const source = safeReadFile(entryFile);
33
+ if (source !== undefined) {
34
+ const reExports = parseBarrelTopLevel(source);
35
+ if (reExports.length === 0) {
36
+ diagnostics.push({
37
+ code: "untraceable-barrel",
38
+ packageName: pkgName,
39
+ resolvedFile: entryFile,
40
+ });
41
+ }
42
+ for (const re of reExports) {
43
+ const fromPkg = packageNameOf(re.from);
44
+ if (!fromPkg)
45
+ continue;
46
+ const found = walk(fromPkg, repoRoot, visited, diagnostics, manifestSources);
47
+ if (found)
48
+ return found;
49
+ }
50
+ }
51
+ }
52
+ // 3. manifestSources fallback (only consulted if pkgName explicitly listed).
53
+ const patterns = manifestSources[pkgName];
54
+ if (patterns && patterns.length > 0) {
55
+ for (const installed of installedPackagesMatching(patterns, repoRoot)) {
56
+ const m = readRootManifest(installed, repoRoot);
57
+ if (m)
58
+ return m;
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ function readRootManifest(pkgName, repoRoot) {
64
+ const pkgDir = packageRootDir(pkgName, repoRoot);
65
+ if (!pkgDir)
66
+ return null;
67
+ const cemPath = join(pkgDir, "custom-elements.json");
68
+ if (existsSync(cemPath)) {
69
+ try {
70
+ const raw = readFileSync(cemPath, "utf8");
71
+ const parsed = JSON.parse(raw);
72
+ const pkgVersion = readPackageVersion(pkgDir);
73
+ const out = {
74
+ kind: "cem",
75
+ cem: parsed,
76
+ packageName: pkgName,
77
+ path: cemPath,
78
+ source: "npm",
79
+ };
80
+ if (pkgVersion !== undefined)
81
+ out.packageVersion = pkgVersion;
82
+ return out;
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ }
88
+ const ccmPath = join(pkgDir, "component-compass-manifest.json");
89
+ if (existsSync(ccmPath)) {
90
+ try {
91
+ const raw = readFileSync(ccmPath, "utf8");
92
+ const parsed = JSON.parse(raw);
93
+ const v = validateManifest(parsed);
94
+ if (!v.ok)
95
+ return null;
96
+ const pkgVersion = readPackageVersion(pkgDir);
97
+ const out = {
98
+ kind: "component-compass-manifest",
99
+ manifest: v.data,
100
+ packageName: pkgName,
101
+ path: ccmPath,
102
+ source: "npm",
103
+ };
104
+ if (pkgVersion !== undefined)
105
+ out.packageVersion = pkgVersion;
106
+ return out;
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ }
112
+ return null;
113
+ }
114
+ function packageRootDir(pkgName, repoRoot) {
115
+ const requireFromRoot = createRequire(resolve(repoRoot, "_"));
116
+ try {
117
+ const pkgJsonPath = requireFromRoot.resolve(`${pkgName}/package.json`);
118
+ return dirname(pkgJsonPath);
119
+ }
120
+ catch {
121
+ return null;
122
+ }
123
+ }
124
+ function resolvePackageEntry(pkgName, repoRoot) {
125
+ const requireFromRoot = createRequire(resolve(repoRoot, "_"));
126
+ try {
127
+ return requireFromRoot.resolve(pkgName);
128
+ }
129
+ catch {
130
+ return null;
131
+ }
132
+ }
133
+ function readPackageVersion(pkgDir) {
134
+ try {
135
+ const pkg = JSON.parse(readFileSync(join(pkgDir, "package.json"), "utf8"));
136
+ return pkg.version;
137
+ }
138
+ catch {
139
+ return undefined;
140
+ }
141
+ }
142
+ function safeReadFile(path) {
143
+ try {
144
+ if (!statSync(path).isFile())
145
+ return undefined;
146
+ return readFileSync(path, "utf8");
147
+ }
148
+ catch {
149
+ return undefined;
150
+ }
151
+ }
152
+ function packageNameOf(specifier) {
153
+ if (!specifier || specifier.startsWith(".") || isAbsolute(specifier))
154
+ return null;
155
+ if (specifier.startsWith("@")) {
156
+ const parts = specifier.split("/");
157
+ if (parts.length < 2)
158
+ return null;
159
+ return `${parts[0]}/${parts[1]}`;
160
+ }
161
+ const slash = specifier.indexOf("/");
162
+ return slash === -1 ? specifier : specifier.slice(0, slash);
163
+ }
164
+ function installedPackagesMatching(patterns, repoRoot) {
165
+ const matchers = patterns.map((p) => picomatch(p));
166
+ const out = [];
167
+ const nm = join(repoRoot, "node_modules");
168
+ if (!existsSync(nm))
169
+ return [];
170
+ for (const top of safeReadDir(nm)) {
171
+ if (top.startsWith("@")) {
172
+ const scoped = join(nm, top);
173
+ for (const sub of safeReadDir(scoped)) {
174
+ const name = `${top}/${sub}`;
175
+ if (matchers.some((m) => m(name)))
176
+ out.push(name);
177
+ }
178
+ }
179
+ else {
180
+ if (matchers.some((m) => m(top)))
181
+ out.push(top);
182
+ }
183
+ }
184
+ return out;
185
+ }
186
+ function safeReadDir(path) {
187
+ try {
188
+ return readdirSync(path);
189
+ }
190
+ catch {
191
+ return [];
192
+ }
193
+ }
194
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/manifest/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ResolvedManifest } from "./resolver.js";
2
+ import type { ComponentIndex } from "./types.js";
3
+ import type { Warning } from "../types.js";
4
+ export declare function buildComponentIndex(manifests: ResolvedManifest[]): ComponentIndex & {
5
+ warnings: Warning[];
6
+ };
@@ -0,0 +1,98 @@
1
+ import { externalPackageOf, serialiseComponentId, emptyLocalIndex } from "@component-compass/plugin-core";
2
+ export function buildComponentIndex(manifests) {
3
+ const byId = new Map();
4
+ const byTag = new Map();
5
+ const byImport = new Map();
6
+ const byNativeSpecifier = new Map();
7
+ const warnings = [];
8
+ for (const m of manifests) {
9
+ if (m.kind === "cem")
10
+ absorbCemCompIdx(m, byId, byTag, byImport, byNativeSpecifier, warnings);
11
+ else
12
+ absorbCcmCompIdx(m, byId, byImport);
13
+ }
14
+ return { byId, byTag, byImport, byNativeSpecifier, local: emptyLocalIndex, warnings };
15
+ }
16
+ function absorbCemCompIdx(m, byId, byTag, byImport, byNativeSpecifier, warnings) {
17
+ const modules = (m.cem.modules ?? []);
18
+ for (const mod of modules) {
19
+ for (const decl of mod.declarations ?? []) {
20
+ if (!decl.customElement || !decl.tagName || !decl.name)
21
+ continue;
22
+ const tagName = decl.tagName;
23
+ if (byTag.has(tagName)) {
24
+ warnings.push({
25
+ code: "MANIFEST_TAG_COLLISION",
26
+ message: `Tag <${tagName}> declared in multiple manifests; using existing definition.`,
27
+ package: m.packageName,
28
+ });
29
+ continue;
30
+ }
31
+ const props = [];
32
+ for (const mem of decl.members ?? []) {
33
+ if (mem.kind !== "field" || mem.privacy === "private")
34
+ continue;
35
+ if (!mem.name)
36
+ continue;
37
+ const p = { name: mem.name };
38
+ if (mem.type?.text !== undefined)
39
+ p.type = mem.type.text;
40
+ if (mem.deprecated !== undefined)
41
+ p.deprecated = mem.deprecated;
42
+ props.push(p);
43
+ }
44
+ const events = [];
45
+ for (const e of decl.events ?? []) {
46
+ if (!e.name)
47
+ continue;
48
+ const ev = { name: e.name };
49
+ if (e.deprecated !== undefined)
50
+ ev.deprecated = e.deprecated;
51
+ events.push(ev);
52
+ }
53
+ const imports = decl.componentCompass?.imports ?? {};
54
+ const entry = {
55
+ kind: "custom-element",
56
+ tagName,
57
+ source: { type: "external", package: m.packageName },
58
+ deprecated: decl.deprecated ?? false,
59
+ props,
60
+ events,
61
+ slots: (decl.slots ?? []).map((s) => ({ name: s.name ?? "" })),
62
+ className: decl.name,
63
+ imports,
64
+ };
65
+ const key = serialiseComponentId({ kind: "custom-element", tagName, source: { type: "external", package: m.packageName } });
66
+ byId.set(key, entry);
67
+ byTag.set(tagName, entry);
68
+ for (const n of imports.native ?? []) {
69
+ for (const s of specifierForms(n.specifier))
70
+ byNativeSpecifier.set(s, entry);
71
+ }
72
+ for (const r of imports.react ?? []) {
73
+ if (!r.export)
74
+ continue;
75
+ for (const s of specifierForms(r.specifier)) {
76
+ byImport.set(`${s}::${r.export}`, entry);
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ function absorbCcmCompIdx(m, byId, byImport) {
83
+ for (const c of m.manifest.components) {
84
+ if (c.kind === "custom-element")
85
+ continue;
86
+ if (c.source.type !== "external")
87
+ continue;
88
+ const entry = c;
89
+ const key = serialiseComponentId({ kind: c.kind, export: c.export, source: c.source });
90
+ byId.set(key, entry);
91
+ byImport.set(`${externalPackageOf(c.source)}::${c.export}`, entry);
92
+ }
93
+ }
94
+ function specifierForms(specifier) {
95
+ const stripped = specifier.replace(/\.(js|mjs|cjs)$/, "");
96
+ return stripped === specifier ? [specifier] : [specifier, stripped];
97
+ }
98
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type ManifestFile } from "@component-compass/plugin-core";
2
+ export declare class ManifestError extends Error {
3
+ code: "MANIFEST_UNRESOLVABLE";
4
+ constructor(code: "MANIFEST_UNRESOLVABLE", message: string);
5
+ }
6
+ export type ResolvedCemManifest = {
7
+ kind: "cem";
8
+ cem: {
9
+ schemaVersion?: string;
10
+ modules?: unknown[];
11
+ } & Record<string, unknown>;
12
+ /** npm package name when `source === "npm"`; the literal manifest entry (relative or absolute path) when `source === "file"`. */
13
+ packageName: string;
14
+ packageVersion?: string;
15
+ /** Absolute filesystem path of the loaded manifest. */
16
+ path: string;
17
+ source: "npm" | "file";
18
+ };
19
+ export type ResolvedComponentCompassManifest = {
20
+ kind: "component-compass-manifest";
21
+ manifest: ManifestFile;
22
+ /** npm package name when `source === "npm"`; the literal manifest entry (relative or absolute path) when `source === "file"`. */
23
+ packageName: string;
24
+ packageVersion?: string;
25
+ /** Absolute filesystem path of the loaded manifest. */
26
+ path: string;
27
+ source: "npm" | "file";
28
+ };
29
+ export type ResolvedManifest = ResolvedCemManifest | ResolvedComponentCompassManifest;
30
+ export declare function resolveManifest(entry: string, configDir: string): Promise<ResolvedManifest>;
@@ -0,0 +1,136 @@
1
+ import { readFile, stat } from "node:fs/promises";
2
+ import { createRequire } from "node:module";
3
+ import { isAbsolute, resolve, dirname } from "node:path";
4
+ import { errorMessage } from "@component-compass/ast-utils";
5
+ import { validateManifest } from "@component-compass/plugin-core";
6
+ export class ManifestError extends Error {
7
+ code;
8
+ constructor(code, message) {
9
+ super(message);
10
+ this.code = code;
11
+ }
12
+ }
13
+ export async function resolveManifest(entry, configDir) {
14
+ if (entry.startsWith("./") || entry.startsWith("../") || isAbsolute(entry)) {
15
+ return readFromPath(entry, configDir);
16
+ }
17
+ if (/^[@a-zA-Z]/.test(entry)) {
18
+ return readFromNpm(entry, configDir);
19
+ }
20
+ throw new ManifestError("MANIFEST_UNRESOLVABLE", `Manifest entry "${entry}" is neither a relative path nor an npm package name.`);
21
+ }
22
+ async function readFromPath(entry, configDir) {
23
+ const abs = isAbsolute(entry) ? entry : resolve(configDir, entry);
24
+ try {
25
+ await stat(abs);
26
+ }
27
+ catch {
28
+ throw new ManifestError("MANIFEST_UNRESOLVABLE", `Manifest file not found at ${abs}`);
29
+ }
30
+ const raw = await readFile(abs, "utf8");
31
+ let parsed;
32
+ try {
33
+ parsed = JSON.parse(raw);
34
+ }
35
+ catch (err) {
36
+ throw new ManifestError("MANIFEST_UNRESOLVABLE", `${abs} is not valid JSON: ${errorMessage(err)}`);
37
+ }
38
+ if (looksLikeComponentCompassManifest(parsed)) {
39
+ const v = validateManifest(parsed);
40
+ if (!v.ok) {
41
+ throw new ManifestError("MANIFEST_UNRESOLVABLE", `${abs} fails schema validation:\n${v.errors.join("\n")}`);
42
+ }
43
+ return {
44
+ kind: "component-compass-manifest",
45
+ manifest: v.data,
46
+ packageName: entry,
47
+ path: abs,
48
+ source: "file",
49
+ };
50
+ }
51
+ return {
52
+ kind: "cem",
53
+ cem: parsed,
54
+ packageName: entry,
55
+ path: abs,
56
+ source: "file",
57
+ };
58
+ }
59
+ async function readFromNpm(pkg, configDir) {
60
+ const requireFn = createRequire(resolve(configDir, "noop.js"));
61
+ let pkgJsonPath;
62
+ try {
63
+ pkgJsonPath = requireFn.resolve(`${pkg}/package.json`);
64
+ }
65
+ catch (err) {
66
+ throw new ManifestError("MANIFEST_UNRESOLVABLE", `npm package "${pkg}" is not installed (anchored at ${configDir}). ${errorMessage(err)}`);
67
+ }
68
+ const pkgJson = JSON.parse(await readFile(pkgJsonPath, "utf8"));
69
+ const pkgRoot = dirname(pkgJsonPath);
70
+ const ccmPath = resolve(pkgRoot, "component-compass-manifest.json");
71
+ let ccmExists = false;
72
+ try {
73
+ await stat(ccmPath);
74
+ ccmExists = true;
75
+ }
76
+ catch (err) {
77
+ if (err.code !== "ENOENT")
78
+ throw err;
79
+ }
80
+ if (ccmExists) {
81
+ const raw = await readFile(ccmPath, "utf8");
82
+ let parsed;
83
+ try {
84
+ parsed = JSON.parse(raw);
85
+ }
86
+ catch (err) {
87
+ throw new ManifestError("MANIFEST_UNRESOLVABLE", `${ccmPath} is not valid JSON: ${errorMessage(err)}`);
88
+ }
89
+ const v = validateManifest(parsed);
90
+ if (!v.ok) {
91
+ throw new ManifestError("MANIFEST_UNRESOLVABLE", `${ccmPath} fails schema validation:\n${v.errors.join("\n")}`);
92
+ }
93
+ const out = {
94
+ kind: "component-compass-manifest",
95
+ manifest: v.data,
96
+ packageName: pkg,
97
+ path: ccmPath,
98
+ source: "npm",
99
+ };
100
+ if (pkgJson.version !== undefined)
101
+ out.packageVersion = pkgJson.version;
102
+ return out;
103
+ }
104
+ const cemRel = pkgJson.customElements;
105
+ if (!cemRel) {
106
+ throw new ManifestError("MANIFEST_UNRESOLVABLE", `Package "${pkg}" exposes neither component-compass-manifest.json nor a customElements field.`);
107
+ }
108
+ const cemPath = resolve(pkgRoot, cemRel);
109
+ const raw = await readFile(cemPath, "utf8");
110
+ let cem;
111
+ try {
112
+ cem = JSON.parse(raw);
113
+ }
114
+ catch (err) {
115
+ throw new ManifestError("MANIFEST_UNRESOLVABLE", `${cemPath} is not valid JSON: ${errorMessage(err)}`);
116
+ }
117
+ const out = {
118
+ kind: "cem",
119
+ cem,
120
+ packageName: pkg,
121
+ path: cemPath,
122
+ source: "npm",
123
+ };
124
+ if (pkgJson.version !== undefined)
125
+ out.packageVersion = pkgJson.version;
126
+ return out;
127
+ }
128
+ function looksLikeComponentCompassManifest(v) {
129
+ if (typeof v !== "object" || v === null)
130
+ return false;
131
+ const o = v;
132
+ return (typeof o.schemaVersion === "string" &&
133
+ typeof o.source === "string" &&
134
+ Array.isArray(o.components));
135
+ }
136
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/manifest/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type DiscoveryDiagnostic } from "./discovery.js";
2
+ import type { ResolvedManifest } from "./resolver.js";
3
+ export type RunDiscoveryOptions = {
4
+ repoRoot: string;
5
+ packageScopes: string[];
6
+ manifestSources: Record<string, string[]>;
7
+ };
8
+ export type RunDiscoveryResult = {
9
+ manifests: ResolvedManifest[];
10
+ diagnostics: DiscoveryDiagnostic[];
11
+ };
12
+ export declare function runDiscovery(opts: RunDiscoveryOptions): RunDiscoveryResult;
@@ -0,0 +1,46 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import picomatch from "picomatch";
4
+ import { discoverManifestWithDiagnostics } from "./discovery.js";
5
+ export function runDiscovery(opts) {
6
+ const candidates = readDeclaredDeps(opts.repoRoot);
7
+ const scopeMatchers = opts.packageScopes.map((p) => picomatch(p));
8
+ const inScope = [...new Set(candidates.filter((name) => scopeMatchers.some((m) => m(name))))];
9
+ const manifests = [];
10
+ const diagnostics = [];
11
+ const seenDiagnostics = new Set();
12
+ for (const pkg of inScope) {
13
+ const result = discoverManifestWithDiagnostics({
14
+ repoRoot: opts.repoRoot,
15
+ packageName: pkg,
16
+ manifestSources: opts.manifestSources,
17
+ });
18
+ if (result.manifest)
19
+ manifests.push(result.manifest);
20
+ for (const d of result.diagnostics) {
21
+ const key = `${d.code}::${d.packageName}`;
22
+ if (seenDiagnostics.has(key))
23
+ continue;
24
+ seenDiagnostics.add(key);
25
+ diagnostics.push(d);
26
+ }
27
+ }
28
+ return { manifests, diagnostics };
29
+ }
30
+ function readDeclaredDeps(repoRoot) {
31
+ try {
32
+ const pkg = JSON.parse(readFileSync(join(repoRoot, "package.json"), "utf8"));
33
+ const all = new Set();
34
+ for (const map of [pkg.dependencies, pkg.devDependencies, pkg.peerDependencies, pkg.optionalDependencies]) {
35
+ if (!map)
36
+ continue;
37
+ for (const name of Object.keys(map))
38
+ all.add(name);
39
+ }
40
+ return [...all].sort();
41
+ }
42
+ catch {
43
+ return [];
44
+ }
45
+ }
46
+ //# sourceMappingURL=run-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-discovery.js","sourceRoot":"","sources":["../../src/manifest/run-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,+BAA+B,EAA4B,MAAM,gBAAgB,CAAC;AAc3F,MAAM,UAAU,YAAY,CAAC,IAAyB;IACpD,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9F,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,MAAM,WAAW,GAA0B,EAAE,CAAC;IAC9C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,+BAA+B,CAAC;YAC7C,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,GAAG;YAChB,eAAe,EAAE,IAAI,CAAC,eAAe;SACtC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,QAAQ;YAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YACvC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAK1E,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAC1G,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export type { ImportRole, ImportEntry, IndexedComponent, ComponentIndex, } from "@component-compass/plugin-core";
2
+ import type { ComponentId } from "@component-compass/plugin-core";
3
+ export type IndexedComponentId = ComponentId;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/manifest/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Project parser-emitted occurrences onto the artifact-shape OutputOccurrence
3
+ * stream, preserving the three-state attribute model:
4
+ * - literal value (when captureValues is true and source value was static),
5
+ * - { __dynamic: DynamicKind } marker (always, when source was non-literal),
6
+ * - null (when captureValues is false and source was static, OR when source
7
+ * value was literal null).
8
+ *
9
+ * Pure function; no I/O.
10
+ */
11
+ import type { OutputOccurrence, ParseResult } from "@component-compass/plugin-core";
12
+ export declare function parseResultsToOccurrences(results: ParseResult[], captureValues: boolean): OutputOccurrence[];
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Project parser-emitted occurrences onto the artifact-shape OutputOccurrence
3
+ * stream, preserving the three-state attribute model:
4
+ * - literal value (when captureValues is true and source value was static),
5
+ * - { __dynamic: DynamicKind } marker (always, when source was non-literal),
6
+ * - null (when captureValues is false and source was static, OR when source
7
+ * value was literal null).
8
+ *
9
+ * Pure function; no I/O.
10
+ */
11
+ import { computeStableIdFromComponentId } from "./identity.js";
12
+ export function parseResultsToOccurrences(results, captureValues) {
13
+ const out = [];
14
+ for (const result of results) {
15
+ for (const occ of result.occurrences) {
16
+ const props = {};
17
+ for (const p of occ.props) {
18
+ if (p.isDynamic) {
19
+ // dynamicKind should always be set when isDynamic is true (per
20
+ // scan-types.ts), but defend against malformed parser output.
21
+ props[p.name] = { __dynamic: p.dynamicKind ?? "expr" };
22
+ }
23
+ else if (captureValues && p.literalValue !== undefined) {
24
+ props[p.name] = p.literalValue;
25
+ }
26
+ else {
27
+ props[p.name] = null;
28
+ }
29
+ }
30
+ out.push({
31
+ componentId: computeStableIdFromComponentId(occ.componentId),
32
+ filePath: occ.loc.file,
33
+ line: occ.loc.line,
34
+ column: occ.loc.column,
35
+ via: occ.via,
36
+ props,
37
+ });
38
+ }
39
+ }
40
+ return out;
41
+ }
42
+ //# sourceMappingURL=occurrences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"occurrences.js","sourceRoot":"","sources":["../src/occurrences.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAE/D,MAAM,UAAU,yBAAyB,CACvC,OAAsB,EACtB,aAAsB;IAEtB,MAAM,GAAG,GAAuB,EAAE,CAAC;IACnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,KAAK,GAAmC,EAAE,CAAC;YACjD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;oBAChB,+DAA+D;oBAC/D,8DAA8D;oBAC9D,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,WAAW,IAAI,MAAM,EAAE,CAAC;gBACzD,CAAC;qBAAM,IAAI,aAAa,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;oBACzD,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;gBACvB,CAAC;YACH,CAAC;YACD,GAAG,CAAC,IAAI,CAAC;gBACP,WAAW,EAAE,8BAA8B,CAAC,GAAG,CAAC,WAAW,CAAC;gBAC5D,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI;gBACtB,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI;gBAClB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM;gBACtB,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,KAAK;aACN,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}