@component-compass/cli 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/help.d.ts +4 -0
- package/dist/cli/help.js +58 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/parse.d.ts +14 -0
- package/dist/cli/parse.js +78 -0
- package/dist/cli/parse.js.map +1 -0
- package/dist/cli/suggest.d.ts +4 -0
- package/dist/cli/suggest.js +38 -0
- package/dist/cli/suggest.js.map +1 -0
- package/dist/cli.js +114 -111
- package/dist/cli.js.map +1 -1
- package/dist/commands/auth.d.ts +9 -2
- package/dist/commands/auth.js +94 -25
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/init.d.ts +6 -1
- package/dist/commands/init.js +86 -30
- package/dist/commands/init.js.map +1 -1
- package/dist/manifest/barrel-parser.js +22 -12
- package/dist/manifest/barrel-parser.js.map +1 -1
- package/dist/manifest/lazy-resolver.d.ts +5 -22
- package/dist/manifest/lazy-resolver.js +14 -46
- package/dist/manifest/lazy-resolver.js.map +1 -1
- package/dist/prompts/adapter.d.ts +43 -0
- package/dist/prompts/adapter.js +32 -0
- package/dist/prompts/adapter.js.map +1 -0
- package/dist/reporter/stdout.d.ts +2 -1
- package/dist/reporter/stdout.js +14 -13
- package/dist/reporter/stdout.js.map +1 -1
- package/dist/util/color.d.ts +24 -0
- package/dist/util/color.js +45 -0
- package/dist/util/color.js.map +1 -0
- package/dist/util/interactive.d.ts +17 -0
- package/dist/util/interactive.js +19 -0
- package/dist/util/interactive.js.map +1 -0
- package/dist/util/log.d.ts +3 -1
- package/dist/util/log.js +6 -3
- package/dist/util/log.js.map +1 -1
- package/dist/util/version.d.ts +7 -0
- package/dist/util/version.js +13 -0
- package/dist/util/version.js.map +1 -0
- package/package.json +10 -9
package/dist/commands/auth.js
CHANGED
|
@@ -2,11 +2,24 @@ import { loadStore, saveStore, normalizeHost } from "../auth/store.js";
|
|
|
2
2
|
import { requestDeviceCode, pollToken, whoami, AuthHttpError } from "../auth/client.js";
|
|
3
3
|
import { openBrowser } from "../auth/browser.js";
|
|
4
4
|
import { resolveHost, getAccessToken, formatAuthError } from "../auth/session.js";
|
|
5
|
+
import { parseCommand } from "../cli/parse.js";
|
|
6
|
+
import { assertNotCancelled, PromptCancelledError } from "../prompts/adapter.js";
|
|
5
7
|
const out = (s) => process.stdout.write(s);
|
|
6
8
|
const err = (s) => process.stderr.write(s);
|
|
7
9
|
function defaultSleep(ms) {
|
|
8
10
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
9
11
|
}
|
|
12
|
+
function isValidUrl(value) {
|
|
13
|
+
if (!value)
|
|
14
|
+
return "Enter a valid host URL.";
|
|
15
|
+
try {
|
|
16
|
+
normalizeHost(value);
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return "Enter a valid host URL.";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
10
23
|
export async function runAuthLogin(opts) {
|
|
11
24
|
const base = normalizeHost(opts.host);
|
|
12
25
|
const sleep = opts.sleep ?? defaultSleep;
|
|
@@ -23,7 +36,11 @@ export async function runAuthLogin(opts) {
|
|
|
23
36
|
out(`To authorize this device, open:\n ${device.verificationUri}\nCode: ${device.userCode}\n`);
|
|
24
37
|
if (openBrowser(device.verificationUriComplete))
|
|
25
38
|
out("Opened your browser…\n");
|
|
26
|
-
|
|
39
|
+
const spin = opts.prompts?.spinner();
|
|
40
|
+
if (spin)
|
|
41
|
+
spin.start("Waiting for approval…");
|
|
42
|
+
else
|
|
43
|
+
out("Waiting for approval… ");
|
|
27
44
|
let intervalMs = device.interval * 1000;
|
|
28
45
|
const deadline = now() + device.expiresIn * 1000;
|
|
29
46
|
while (now() < deadline) {
|
|
@@ -33,6 +50,7 @@ export async function runAuthLogin(opts) {
|
|
|
33
50
|
result = await pollToken(base, device.deviceCode);
|
|
34
51
|
}
|
|
35
52
|
catch (e) {
|
|
53
|
+
spin?.stop("Login failed");
|
|
36
54
|
err(`\nLogin failed${e instanceof AuthHttpError ? ` (HTTP ${e.status})` : ""}. Run \`compass auth login\` again.\n`);
|
|
37
55
|
return 1;
|
|
38
56
|
}
|
|
@@ -48,6 +66,8 @@ export async function runAuthLogin(opts) {
|
|
|
48
66
|
if (!store.default)
|
|
49
67
|
store.default = base;
|
|
50
68
|
await saveStore(store, filePath);
|
|
69
|
+
if (spin)
|
|
70
|
+
spin.stop("Approved");
|
|
51
71
|
out(`✓ Signed in as ${entry.userEmail || "your account"}\n`);
|
|
52
72
|
return 0;
|
|
53
73
|
}
|
|
@@ -56,15 +76,18 @@ export async function runAuthLogin(opts) {
|
|
|
56
76
|
continue;
|
|
57
77
|
}
|
|
58
78
|
if (result.kind === "expired") {
|
|
79
|
+
spin?.stop("Code expired");
|
|
59
80
|
err("\nCode expired. Run `compass auth login` again.\n");
|
|
60
81
|
return 1;
|
|
61
82
|
}
|
|
62
83
|
if (result.kind === "denied") {
|
|
84
|
+
spin?.stop("Authorization declined");
|
|
63
85
|
err("\nAuthorization was declined.\n");
|
|
64
86
|
return 1;
|
|
65
87
|
}
|
|
66
88
|
// pending → keep polling
|
|
67
89
|
}
|
|
90
|
+
spin?.stop("Timed out");
|
|
68
91
|
err("\nTimed out waiting for approval. Run `compass auth login` again.\n");
|
|
69
92
|
return 1;
|
|
70
93
|
}
|
|
@@ -112,7 +135,6 @@ export async function runAuthLogout(opts) {
|
|
|
112
135
|
write(`Not signed in to ${base}.\n`);
|
|
113
136
|
return 0;
|
|
114
137
|
}
|
|
115
|
-
// No server revoke endpoint exists yet; this is a local delete (best-effort revoke is a future no-op).
|
|
116
138
|
const { [base]: _removed, ...remaining } = store.hosts;
|
|
117
139
|
const next = {
|
|
118
140
|
hosts: remaining,
|
|
@@ -122,35 +144,82 @@ export async function runAuthLogout(opts) {
|
|
|
122
144
|
write(`Signed out of ${base}.\n`);
|
|
123
145
|
return 0;
|
|
124
146
|
}
|
|
125
|
-
/**
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
147
|
+
/**
|
|
148
|
+
* Resolve a host for status/logout. Returns a concrete host only when the user
|
|
149
|
+
* actively picks one from a select (interactive + several stored hosts + no
|
|
150
|
+
* flag/env/default). Otherwise returns undefined, letting the callee resolve
|
|
151
|
+
* (flag/env/default) and print its own "not signed in" message as before.
|
|
152
|
+
*/
|
|
153
|
+
async function selectHostIfAmbiguous(flagHost, env, deps, interactive, prompts) {
|
|
154
|
+
if (flagHost !== undefined)
|
|
155
|
+
return flagHost;
|
|
156
|
+
const store = await loadStore(deps.store?.filePath);
|
|
157
|
+
try {
|
|
158
|
+
resolveHost({ env, store });
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
const hosts = Object.keys(store.hosts);
|
|
163
|
+
if (interactive && prompts && hosts.length > 1) {
|
|
164
|
+
const picked = assertNotCancelled(await prompts.select({ message: "Which host?", options: hosts.map((h) => ({ value: h, label: h })) }), prompts);
|
|
165
|
+
return normalizeHost(picked);
|
|
166
|
+
}
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
129
169
|
}
|
|
130
170
|
export async function runAuth(argv, deps = {}) {
|
|
131
|
-
const
|
|
132
|
-
const
|
|
171
|
+
const { positionals, values } = parseCommand("auth", argv);
|
|
172
|
+
const sub = positionals[0];
|
|
173
|
+
const { host } = values;
|
|
174
|
+
const flagHost = typeof host === "string" ? host : undefined;
|
|
133
175
|
const env = deps.env ?? process.env;
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
176
|
+
const interactive = deps.interactive ?? false;
|
|
177
|
+
const prompts = deps.prompts;
|
|
178
|
+
try {
|
|
179
|
+
switch (sub) {
|
|
180
|
+
case "login": {
|
|
181
|
+
const store = await loadStore(deps.store?.filePath);
|
|
182
|
+
let resolved;
|
|
183
|
+
try {
|
|
184
|
+
resolved = resolveHost({ ...(flagHost !== undefined ? { flagHost } : {}), env, store });
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
if (interactive && prompts) {
|
|
188
|
+
const entered = assertNotCancelled(await prompts.text({ message: "Host URL", placeholder: "https://compass.example.com", validate: isValidUrl }), prompts);
|
|
189
|
+
resolved = normalizeHost(entered);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
err("Specify a host: `compass auth login --host <url>` (or set COMPASS_HOST).\n");
|
|
193
|
+
return 2;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return runAuthLogin({
|
|
197
|
+
host: resolved,
|
|
198
|
+
...(deps.store ? { store: deps.store } : {}),
|
|
199
|
+
...(prompts ? { prompts } : {}),
|
|
200
|
+
...(deps.sleep ? { sleep: deps.sleep } : {}),
|
|
201
|
+
...(deps.now ? { now: deps.now } : {}),
|
|
202
|
+
});
|
|
140
203
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
return
|
|
204
|
+
case "status": {
|
|
205
|
+
const picked = await selectHostIfAmbiguous(flagHost, env, deps, interactive, prompts);
|
|
206
|
+
return runAuthStatus({ ...(picked !== undefined ? { host: picked } : {}), ...(deps.store ? { store: deps.store } : {}), env });
|
|
207
|
+
}
|
|
208
|
+
case "logout": {
|
|
209
|
+
const picked = await selectHostIfAmbiguous(flagHost, env, deps, interactive, prompts);
|
|
210
|
+
return runAuthLogout({ ...(picked !== undefined ? { host: picked } : {}), ...(deps.store ? { store: deps.store } : {}), env });
|
|
144
211
|
}
|
|
145
|
-
|
|
212
|
+
default:
|
|
213
|
+
err(`Unknown auth subcommand: ${sub ?? "(none)"}\nUsage: compass auth <login|logout|status> [--host <url>]\n`);
|
|
214
|
+
return 2;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch (e) {
|
|
218
|
+
if (e instanceof PromptCancelledError) {
|
|
219
|
+
err("Cancelled.\n");
|
|
220
|
+
return 130;
|
|
146
221
|
}
|
|
147
|
-
|
|
148
|
-
return runAuthStatus({ ...(flagHost !== undefined ? { host: flagHost } : {}), ...(deps.store ? { store: deps.store } : {}), env });
|
|
149
|
-
case "logout":
|
|
150
|
-
return runAuthLogout({ ...(flagHost !== undefined ? { host: flagHost } : {}), ...(deps.store ? { store: deps.store } : {}), env });
|
|
151
|
-
default:
|
|
152
|
-
err(`Unknown auth subcommand: ${sub ?? "(none)"}\nUsage: compass auth <login|logout|status> [--host <url>]\n`);
|
|
153
|
-
return 2;
|
|
222
|
+
throw e;
|
|
154
223
|
}
|
|
155
224
|
}
|
|
156
225
|
//# sourceMappingURL=auth.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
import { type PromptAdapter } from "../prompts/adapter.js";
|
|
2
|
+
export type Framework = "react" | "vue" | "lit" | "html" | "wc";
|
|
1
3
|
export type InitOptions = {
|
|
2
4
|
cwd: string;
|
|
3
5
|
outputPath?: string;
|
|
6
|
+
repoId?: string;
|
|
7
|
+
frameworks?: Framework[];
|
|
8
|
+
interactive?: boolean;
|
|
9
|
+
prompts?: PromptAdapter;
|
|
4
10
|
};
|
|
5
11
|
export declare function runInit(opts: InitOptions): Promise<void>;
|
|
6
|
-
export declare function runInitCli(_argv: string[]): Promise<number>;
|
package/dist/commands/init.js
CHANGED
|
@@ -1,18 +1,93 @@
|
|
|
1
1
|
import { writeFile, stat, readFile } from "node:fs/promises";
|
|
2
2
|
import { basename, isAbsolute, resolve } from "node:path";
|
|
3
|
-
import {
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
3
|
+
import { assertNotCancelled } from "../prompts/adapter.js";
|
|
4
|
+
const DEFAULT_INCLUDE = "src/**/*.{ts,tsx,jsx,js,vue,html}";
|
|
5
|
+
const FRAMEWORK_EXTS = {
|
|
6
|
+
react: ["ts", "tsx", "js", "jsx"],
|
|
7
|
+
vue: ["vue"],
|
|
8
|
+
lit: ["ts", "js"],
|
|
9
|
+
html: ["html"],
|
|
10
|
+
wc: ["ts", "js"],
|
|
11
|
+
};
|
|
12
|
+
const FRAMEWORK_OPTIONS = [
|
|
13
|
+
{ value: "react", label: "React" },
|
|
14
|
+
{ value: "vue", label: "Vue" },
|
|
15
|
+
{ value: "lit", label: "Lit" },
|
|
16
|
+
{ value: "html", label: "HTML" },
|
|
17
|
+
{ value: "wc", label: "Web components" },
|
|
18
|
+
];
|
|
19
|
+
function includeGlob(frameworks) {
|
|
20
|
+
const exts = new Set();
|
|
21
|
+
for (const f of frameworks)
|
|
22
|
+
for (const e of FRAMEWORK_EXTS[f])
|
|
23
|
+
exts.add(e);
|
|
24
|
+
if (exts.size === 0)
|
|
25
|
+
return DEFAULT_INCLUDE;
|
|
26
|
+
return `src/**/*.{${[...exts].sort().join(",")}}`;
|
|
27
|
+
}
|
|
28
|
+
function buildConfig(o) {
|
|
29
|
+
return {
|
|
30
|
+
$schema: "https://unpkg.com/@component-compass/cli/schema/config.schema.json",
|
|
31
|
+
repoId: o.repoId,
|
|
32
|
+
include: [o.include],
|
|
33
|
+
exclude: ["**/*.{test,spec,stories}.*", "**/node_modules/**"],
|
|
34
|
+
captureValues: o.captureValues,
|
|
35
|
+
output: o.output,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
12
38
|
export async function runInit(opts) {
|
|
13
39
|
const cwd = isAbsolute(opts.cwd) ? opts.cwd : resolve(opts.cwd);
|
|
14
40
|
const out = opts.outputPath ?? resolve(cwd, "component-compass.config.json");
|
|
15
|
-
|
|
41
|
+
await assertNoExistingConfig(out);
|
|
42
|
+
const repoId = opts.repoId ?? (await deriveRepoId(cwd));
|
|
43
|
+
if (opts.interactive && opts.prompts) {
|
|
44
|
+
const cfg = await runWizard(opts.prompts, cwd, repoId);
|
|
45
|
+
await writeFile(out, `${JSON.stringify(cfg, null, 2)}\n`, "utf8");
|
|
46
|
+
opts.prompts.outro(`Wrote ${out}. Run \`compass scan\` to generate your first artifact.`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const cfg = buildConfig({
|
|
50
|
+
repoId,
|
|
51
|
+
include: opts.frameworks && opts.frameworks.length > 0 ? includeGlob(opts.frameworks) : DEFAULT_INCLUDE,
|
|
52
|
+
output: "./component-compass.json",
|
|
53
|
+
captureValues: false,
|
|
54
|
+
});
|
|
55
|
+
await writeFile(out, `${JSON.stringify(cfg, null, 2)}\n`, "utf8");
|
|
56
|
+
// eslint-disable-next-line no-console
|
|
57
|
+
console.log(`Wrote ${out}.\nCustomize the config to match your repo structure.`);
|
|
58
|
+
}
|
|
59
|
+
async function runWizard(prompts, cwd, repoId) {
|
|
60
|
+
prompts.intro("component-compass init");
|
|
61
|
+
const detected = await detectFrameworks(cwd);
|
|
62
|
+
const frameworks = assertNotCancelled(await prompts.multiselect({
|
|
63
|
+
message: "Which frameworks does this repo use?",
|
|
64
|
+
options: FRAMEWORK_OPTIONS,
|
|
65
|
+
initialValues: detected,
|
|
66
|
+
required: true,
|
|
67
|
+
}), prompts);
|
|
68
|
+
const output = assertNotCancelled(await prompts.text({ message: "Output path for the artifact", initialValue: "./component-compass.json" }), prompts);
|
|
69
|
+
const captureValues = assertNotCancelled(await prompts.confirm({ message: "Capture literal prop values?", initialValue: false }), prompts);
|
|
70
|
+
return buildConfig({ repoId, include: includeGlob(frameworks), output, captureValues });
|
|
71
|
+
}
|
|
72
|
+
async function detectFrameworks(cwd) {
|
|
73
|
+
try {
|
|
74
|
+
const pkg = JSON.parse(await readFile(resolve(cwd, "package.json"), "utf8"));
|
|
75
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
76
|
+
const { react, vue, lit } = deps;
|
|
77
|
+
const out = [];
|
|
78
|
+
if (react)
|
|
79
|
+
out.push("react");
|
|
80
|
+
if (vue)
|
|
81
|
+
out.push("vue");
|
|
82
|
+
if (lit)
|
|
83
|
+
out.push("lit");
|
|
84
|
+
return out.length > 0 ? out : ["react"];
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return ["react"];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function assertNoExistingConfig(out) {
|
|
16
91
|
try {
|
|
17
92
|
await stat(out);
|
|
18
93
|
throw new Error(`Config already exists at ${out}. Refusing to overwrite.`);
|
|
@@ -20,23 +95,15 @@ export async function runInit(opts) {
|
|
|
20
95
|
catch (err) {
|
|
21
96
|
const e = err;
|
|
22
97
|
if (e.code !== "ENOENT") {
|
|
23
|
-
// If the stat succeeded (no ENOENT), the throw above re-fires here. Detect
|
|
24
|
-
// by message and re-throw cleanly.
|
|
25
98
|
if (e.message?.startsWith("Config already exists"))
|
|
26
99
|
throw e;
|
|
27
100
|
throw err;
|
|
28
101
|
}
|
|
29
102
|
}
|
|
30
|
-
const repoId = await deriveRepoId(cwd);
|
|
31
|
-
const cfg = TEMPLATE(repoId);
|
|
32
|
-
await writeFile(out, `${JSON.stringify(cfg, null, 2)}\n`, "utf8");
|
|
33
|
-
// eslint-disable-next-line no-console
|
|
34
|
-
console.log(`Wrote ${out}.\nCustomize the config to match your repo structure.`);
|
|
35
103
|
}
|
|
36
104
|
async function deriveRepoId(cwd) {
|
|
37
105
|
try {
|
|
38
|
-
const
|
|
39
|
-
const pkg = JSON.parse(pkgRaw);
|
|
106
|
+
const pkg = JSON.parse(await readFile(resolve(cwd, "package.json"), "utf8"));
|
|
40
107
|
if (pkg.name)
|
|
41
108
|
return pkg.name;
|
|
42
109
|
}
|
|
@@ -45,15 +112,4 @@ async function deriveRepoId(cwd) {
|
|
|
45
112
|
}
|
|
46
113
|
return basename(cwd) || "unknown";
|
|
47
114
|
}
|
|
48
|
-
export async function runInitCli(_argv) {
|
|
49
|
-
const cwd = process.cwd();
|
|
50
|
-
try {
|
|
51
|
-
await runInit({ cwd });
|
|
52
|
-
return 0;
|
|
53
|
-
}
|
|
54
|
-
catch (err) {
|
|
55
|
-
process.stderr.write(`init failed: ${errorMessage(err)}\n`);
|
|
56
|
-
return 1;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
115
|
//# 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,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAsB,MAAM,uBAAuB,CAAC;AAa/E,MAAM,eAAe,GAAG,mCAAmC,CAAC;AAE5D,MAAM,cAAc,GAAgC;IAClD,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;IACjC,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IACjB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;CACjB,CAAC;AAEF,MAAM,iBAAiB,GAA0C;IAC/D,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IAClC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IAC9B,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IAC9B,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IAChC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE;CACzC,CAAC;AAEF,SAAS,WAAW,CAAC,UAAuB;IAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,UAAU;QAAE,KAAK,MAAM,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,eAAe,CAAC;IAC5C,OAAO,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACpD,CAAC;AAED,SAAS,WAAW,CAAC,CAA8E;IACjG,OAAO;QACL,OAAO,EAAE,oEAAoE;QAC7E,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACpB,OAAO,EAAE,CAAC,4BAA4B,EAAE,oBAAoB,CAAC;QAC7D,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,MAAM,EAAE,CAAC,CAAC,MAAM;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,+BAA+B,CAAC,CAAC;IAC7E,MAAM,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAElC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IAExD,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,yDAAyD,CAAC,CAAC;QAC1F,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,WAAW,CAAC;QACtB,MAAM;QACN,OAAO,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,eAAe;QACvG,MAAM,EAAE,0BAA0B;QAClC,aAAa,EAAE,KAAK;KACrB,CAAC,CAAC;IACH,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAClE,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,uDAAuD,CAAC,CAAC;AACnF,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAsB,EAAE,GAAW,EAAE,MAAc;IAC1E,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,kBAAkB,CACnC,MAAM,OAAO,CAAC,WAAW,CAAY;QACnC,OAAO,EAAE,sCAAsC;QAC/C,OAAO,EAAE,iBAAiB;QAC1B,aAAa,EAAE,QAAQ;QACvB,QAAQ,EAAE,IAAI;KACf,CAAC,EACF,OAAO,CACR,CAAC;IACF,MAAM,MAAM,GAAG,kBAAkB,CAC/B,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,8BAA8B,EAAE,YAAY,EAAE,0BAA0B,EAAE,CAAC,EACzG,OAAO,CACR,CAAC;IACF,MAAM,aAAa,GAAG,kBAAkB,CACtC,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,8BAA8B,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,EACvF,OAAO,CACR,CAAC;IACF,OAAO,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAG1E,CAAC;QACF,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QAC7D,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACjC,MAAM,GAAG,GAAgB,EAAE,CAAC;QAC5B,IAAI,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,GAAW;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,0BAA0B,CAAC,CAAC;IAC7E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAAmD,CAAC;QAC9D,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,uBAAuB,CAAC;gBAAE,MAAM,CAAC,CAAC;YAC5D,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAsB,CAAC;QAClG,IAAI,GAAG,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;AACpC,CAAC"}
|
|
@@ -89,8 +89,9 @@ export function parseBarrelTopLevelDetailedFromAst(ast) {
|
|
|
89
89
|
unsupported.push(entry);
|
|
90
90
|
continue;
|
|
91
91
|
}
|
|
92
|
-
// Anything wrapping a CJS reassignment in a conditional.
|
|
93
|
-
if (t.isIfStatement(node)
|
|
92
|
+
// Anything wrapping a CJS reassignment in a conditional (if / try / switch).
|
|
93
|
+
if ((t.isIfStatement(node) || t.isTryStatement(node) || t.isSwitchStatement(node)) &&
|
|
94
|
+
visitConditionalBody(node)) {
|
|
94
95
|
const entry = { form: "conditional-reexport" };
|
|
95
96
|
if (typeof node.loc?.start.line === "number")
|
|
96
97
|
entry.line = node.loc.start.line;
|
|
@@ -108,18 +109,15 @@ function isCjsReexport(expr) {
|
|
|
108
109
|
t.isIdentifier(expr.left.property, { name: "exports" }));
|
|
109
110
|
}
|
|
110
111
|
/**
|
|
111
|
-
* Walk
|
|
112
|
-
* inside
|
|
112
|
+
* Walk a conditional wrapper (`if` / `try` / `switch`) looking for a
|
|
113
|
+
* `module.exports = ...` reassignment inside any of its branches.
|
|
113
114
|
*
|
|
114
115
|
* The walk is type-aware: it descends only into structural children that
|
|
115
|
-
* execute when the
|
|
116
|
+
* execute when the wrapper executes. Function and class bodies are
|
|
116
117
|
* treated as opaque boundaries — `module.exports = ...` defined inside a
|
|
117
118
|
* nested function declaration / arrow / class method does not run when the
|
|
118
|
-
*
|
|
119
|
+
* branch body runs, so it would be a false positive to flag it.
|
|
119
120
|
*/
|
|
120
|
-
function containsCjsReexport(node) {
|
|
121
|
-
return visitConditionalBody(node.consequent) || visitConditionalBody(node.alternate);
|
|
122
|
-
}
|
|
123
121
|
function visitConditionalBody(node) {
|
|
124
122
|
if (!node)
|
|
125
123
|
return false;
|
|
@@ -147,12 +145,24 @@ function visitConditionalBody(node) {
|
|
|
147
145
|
if (t.isIfStatement(node)) {
|
|
148
146
|
return (visitConditionalBody(node.consequent) || visitConditionalBody(node.alternate));
|
|
149
147
|
}
|
|
148
|
+
if (t.isTryStatement(node)) {
|
|
149
|
+
return (visitConditionalBody(node.block) ||
|
|
150
|
+
visitConditionalBody(node.handler?.body) ||
|
|
151
|
+
visitConditionalBody(node.finalizer));
|
|
152
|
+
}
|
|
153
|
+
if (t.isSwitchStatement(node)) {
|
|
154
|
+
for (const switchCase of node.cases) {
|
|
155
|
+
for (const stmt of switchCase.consequent) {
|
|
156
|
+
if (visitConditionalBody(stmt))
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
150
162
|
if (t.isLabeledStatement(node) || t.isWithStatement(node)) {
|
|
151
163
|
return visitConditionalBody(node.body);
|
|
152
164
|
}
|
|
153
|
-
// Other statement types (loops,
|
|
154
|
-
// not unwrapped here. The Phase 1 spec is IfStatement-only; broader
|
|
155
|
-
// detection (try/catch, switch) is tracked as a follow-up.
|
|
165
|
+
// Other statement types (loops, return, throw, ...) are not unwrapped here.
|
|
156
166
|
return false;
|
|
157
167
|
}
|
|
158
168
|
//# sourceMappingURL=barrel-parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"barrel-parser.js","sourceRoot":"","sources":["../../src/manifest/barrel-parser.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"barrel-parser.js","sourceRoot":"","sources":["../../src/manifest/barrel-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -82,33 +82,16 @@ export interface WarmedResolver extends LazyResolver {
|
|
|
82
82
|
/**
|
|
83
83
|
* Look up the custom-element a React wrapper export maps to.
|
|
84
84
|
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
* **Tier 1 — Direct CEM className match.**
|
|
85
|
+
* **Direct CEM className match.**
|
|
88
86
|
* When `packageName` has a loaded CEM, scan its `components[]` for a
|
|
89
87
|
* custom-element whose `className === exportName`. Returns
|
|
90
|
-
* `{ tagName, packageName }` on match. This mirrors the
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
* **Tier 2 — Aggregator-chain fallback.**
|
|
94
|
-
* When `packageName` has no loaded CEM (e.g. it is a barrel/aggregator
|
|
95
|
-
* package that re-exports from leaf packages), scan ALL currently-loaded
|
|
96
|
-
* leaf manifests for any custom-element whose
|
|
97
|
-
* `componentCompass.imports.react[]` declares `export === exportName`.
|
|
98
|
-
* Returns the matching leaf's `{ tagName, packageName }` on match.
|
|
99
|
-
*
|
|
100
|
-
* **Limitation (tier 2):** the scan is export-name-only — it does not have
|
|
101
|
-
* access to the chain specifiers used by `matchInLeaf`'s first pass. If two
|
|
102
|
-
* distinct leaf packages both declare an `imports.react[]` entry with the
|
|
103
|
-
* same `export` name, the first-inserted leaf in `visitedLeafs` wins. In
|
|
104
|
-
* practice this collision cannot occur today (no real CEMs ship
|
|
105
|
-
* `imports.react[]`), but it is a known limitation; specifier-aware
|
|
106
|
-
* disambiguation is a future follow-up if it ever becomes necessary.
|
|
88
|
+
* `{ tagName, packageName }` on match. This mirrors the className-equality
|
|
89
|
+
* second pass of `matchInLeaf`.
|
|
107
90
|
*
|
|
108
91
|
* Returns null when:
|
|
109
92
|
* - `packageName` is not manifest-eligible (excluded by `manifestPatterns`)
|
|
110
|
-
* -
|
|
111
|
-
* -
|
|
93
|
+
* - the package has no loaded CEM
|
|
94
|
+
* - the package has a loaded CEM but no className match
|
|
112
95
|
*/
|
|
113
96
|
lookupReactWrapper(packageName: string, exportName: string): {
|
|
114
97
|
tagName: string;
|
|
@@ -142,31 +142,20 @@ export function createLazyResolver(opts) {
|
|
|
142
142
|
}
|
|
143
143
|
return null;
|
|
144
144
|
}
|
|
145
|
-
function matchInLeaf(components,
|
|
146
|
-
// First pass:
|
|
145
|
+
function matchInLeaf(components, exportName) {
|
|
146
|
+
// First pass: react/vue components match on their declared export name.
|
|
147
147
|
for (const c of components) {
|
|
148
|
-
if (c.kind === "
|
|
149
|
-
const imports = c.imports?.react ?? [];
|
|
150
|
-
for (const i of imports) {
|
|
151
|
-
if (i.export !== exportName)
|
|
152
|
-
continue;
|
|
153
|
-
// Match if any specifier in the chain equals i.specifier (or stripped form).
|
|
154
|
-
const stripped = i.specifier.replace(/\.(js|mjs|cjs)$/, "");
|
|
155
|
-
if (chainSpecifiers.some((s) => s === i.specifier || s === stripped))
|
|
156
|
-
return c;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
else if (c.kind === "react-component" || c.kind === "vue-component") {
|
|
148
|
+
if (c.kind === "react-component" || c.kind === "vue-component") {
|
|
160
149
|
if (c.export === exportName)
|
|
161
150
|
return c;
|
|
162
151
|
}
|
|
163
152
|
}
|
|
164
|
-
// Second pass: className-equality
|
|
165
|
-
//
|
|
166
|
-
//
|
|
167
|
-
//
|
|
168
|
-
//
|
|
169
|
-
//
|
|
153
|
+
// Second pass: className-equality match for custom-elements. Scoped to
|
|
154
|
+
// THIS leaf only — never iterates a global byTag map (the old heuristic's
|
|
155
|
+
// failure mode). Safe because the resolver has already traversed the chain
|
|
156
|
+
// to a specific leaf package; if that leaf's CEM declares a custom-element
|
|
157
|
+
// class with exactly this name, the consumer's import is the React wrapper
|
|
158
|
+
// for it.
|
|
170
159
|
for (const c of components) {
|
|
171
160
|
if (c.kind === "custom-element" && c.className === exportName)
|
|
172
161
|
return c;
|
|
@@ -207,7 +196,6 @@ export function createLazyResolver(opts) {
|
|
|
207
196
|
if (hitCache.has(cacheKey))
|
|
208
197
|
return hitCache.get(cacheKey) ?? null;
|
|
209
198
|
const visited = new Set();
|
|
210
|
-
const chainSpecifiers = [specifier];
|
|
211
199
|
let currentAbs = initialAbs;
|
|
212
200
|
let currentExport = exportName;
|
|
213
201
|
// Walk the re-export chain. If we advance MAX_REEXPORT_HOPS times without
|
|
@@ -274,7 +262,6 @@ export function createLazyResolver(opts) {
|
|
|
274
262
|
});
|
|
275
263
|
break;
|
|
276
264
|
}
|
|
277
|
-
chainSpecifiers.push(next.from);
|
|
278
265
|
currentAbs = nextAbs;
|
|
279
266
|
currentExport = next.targetExport;
|
|
280
267
|
hops++;
|
|
@@ -300,7 +287,7 @@ export function createLazyResolver(opts) {
|
|
|
300
287
|
return identityOnlyHit;
|
|
301
288
|
}
|
|
302
289
|
const components = loadLeafManifest(pkg.name, pkg.dir);
|
|
303
|
-
const matched = matchInLeaf(components,
|
|
290
|
+
const matched = matchInLeaf(components, currentExport);
|
|
304
291
|
const hit = { leafPackage: pkg.name, modulePath, matched };
|
|
305
292
|
hitCache.set(cacheKey, hit);
|
|
306
293
|
return hit;
|
|
@@ -381,29 +368,11 @@ export function createLazyResolver(opts) {
|
|
|
381
368
|
if (!isManifestEligible(packageName))
|
|
382
369
|
return null;
|
|
383
370
|
const cached = visitedLeafs.get(packageName);
|
|
384
|
-
if (cached)
|
|
385
|
-
for (const c of cached.components) {
|
|
386
|
-
if (c.kind === "custom-element" && c.className === exportName) {
|
|
387
|
-
return { tagName: c.tagName, packageName };
|
|
388
|
-
}
|
|
389
|
-
}
|
|
371
|
+
if (!cached)
|
|
390
372
|
return null;
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
// for a custom-element that explicitly declares this exportName via
|
|
395
|
-
// componentCompass.imports.react[]. This is safe because it relies on an
|
|
396
|
-
// authoritative CEM declaration, not a heuristic tag-name match.
|
|
397
|
-
for (const [leafPkg, leaf] of visitedLeafs) {
|
|
398
|
-
for (const c of leaf.components) {
|
|
399
|
-
if (c.kind !== "custom-element")
|
|
400
|
-
continue;
|
|
401
|
-
const reactImports = c.imports?.react ?? [];
|
|
402
|
-
for (const i of reactImports) {
|
|
403
|
-
if (i.export === exportName) {
|
|
404
|
-
return { tagName: c.tagName, packageName: leafPkg };
|
|
405
|
-
}
|
|
406
|
-
}
|
|
373
|
+
for (const c of cached.components) {
|
|
374
|
+
if (c.kind === "custom-element" && c.className === exportName) {
|
|
375
|
+
return { tagName: c.tagName, packageName };
|
|
407
376
|
}
|
|
408
377
|
}
|
|
409
378
|
return null;
|
|
@@ -523,7 +492,6 @@ function absorbCemDeclarations(cem, packageName) {
|
|
|
523
492
|
events,
|
|
524
493
|
slots,
|
|
525
494
|
className: d.name,
|
|
526
|
-
imports: d.componentCompass?.imports ?? {},
|
|
527
495
|
};
|
|
528
496
|
if (d.description !== undefined)
|
|
529
497
|
entry.description = d.description;
|