@fragments-sdk/cli 0.15.10 → 0.17.0
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/bin.js +901 -789
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-6SQPP47U.js → chunk-ANTWP3UG.js} +532 -31
- package/dist/chunk-ANTWP3UG.js.map +1 -0
- package/dist/{chunk-ONUP6Z4W.js → chunk-B4A4ZEGS.js} +9 -9
- package/dist/{chunk-32LIWN2P.js → chunk-FFCI6OVZ.js} +584 -261
- package/dist/chunk-FFCI6OVZ.js.map +1 -0
- package/dist/{chunk-HQ6A6DTV.js → chunk-HNHE64CR.js} +315 -1089
- package/dist/chunk-HNHE64CR.js.map +1 -0
- package/dist/{chunk-BJE3425I.js → chunk-MN3B2EE6.js} +2 -2
- package/dist/{chunk-QCN35LJU.js → chunk-SAQW37L5.js} +3 -2
- package/dist/chunk-SAQW37L5.js.map +1 -0
- package/dist/{chunk-2WXKALIG.js → chunk-SNZXGHL2.js} +2 -2
- package/dist/{chunk-5JF26E55.js → chunk-VT2J62ND.js} +11 -11
- package/dist/{codebase-scanner-MQHUZC2G.js → codebase-scanner-2T5QIDBA.js} +2 -2
- package/dist/core/index.js +53 -1
- package/dist/{create-EXURTBKK.js → create-D44QD7MV.js} +2 -2
- package/dist/{doctor-BDPMYYE6.js → doctor-7B5N4JYU.js} +2 -2
- package/dist/{generate-PVOLUAAC.js → generate-T47JZRVU.js} +4 -4
- package/dist/govern-scan-X6UEIOSV.js +632 -0
- package/dist/govern-scan-X6UEIOSV.js.map +1 -0
- package/dist/index.js +7 -8
- package/dist/index.js.map +1 -1
- package/dist/{init-SSGUSP7Z.js → init-2RGAY4W6.js} +5 -5
- package/dist/mcp-bin.js +2 -2
- package/dist/scan-A2WJM54L.js +14 -0
- package/dist/{scan-generate-VY27PIOX.js → scan-generate-LUSOHT36.js} +4 -4
- package/dist/{service-QJGWUIVL.js → service-ROCP7TKG.js} +13 -15
- package/dist/{snapshot-WIJMEIFT.js → snapshot-B3SAW74Y.js} +2 -2
- package/dist/{static-viewer-7QIBQZRC.js → static-viewer-7L6UEYTJ.js} +3 -3
- package/dist/{test-64Z5BKBA.js → test-PQDVDURE.js} +3 -3
- package/dist/{token-normalizer-TEPOVBPV.js → token-normalizer-7TFCVDZL.js} +2 -2
- package/dist/{tokens-NZWFQIAB.js → tokens-64FG5FDP.js} +8 -9
- package/dist/{tokens-NZWFQIAB.js.map → tokens-64FG5FDP.js.map} +1 -1
- package/dist/{tokens-generate-5JQSJ27E.js → tokens-generate-CL4LBBQA.js} +2 -2
- package/package.json +9 -8
- package/src/bin.ts +55 -88
- package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/label.contract.json +1 -1
- package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/primitive.contract.json +1 -1
- package/src/commands/__tests__/context-cloud.test.ts +291 -0
- package/src/commands/__tests__/govern-scan.test.ts +185 -0
- package/src/commands/__tests__/govern.test.ts +1 -0
- package/src/commands/context-cloud.ts +355 -0
- package/src/commands/govern-scan-report.ts +170 -0
- package/src/commands/govern-scan.ts +282 -135
- package/src/commands/govern.ts +0 -157
- package/src/mcp/__tests__/server.integration.test.ts +9 -20
- package/src/service/enhance/codebase-scanner.ts +3 -2
- package/src/service/enhance/types.ts +3 -0
- package/dist/chunk-32LIWN2P.js.map +0 -1
- package/dist/chunk-6SQPP47U.js.map +0 -1
- package/dist/chunk-HQ6A6DTV.js.map +0 -1
- package/dist/chunk-MHIBEEW4.js +0 -511
- package/dist/chunk-MHIBEEW4.js.map +0 -1
- package/dist/chunk-QCN35LJU.js.map +0 -1
- package/dist/govern-scan-DW4QUAYD.js +0 -414
- package/dist/govern-scan-DW4QUAYD.js.map +0 -1
- package/dist/init-cloud-3DNKPWFB.js +0 -304
- package/dist/init-cloud-3DNKPWFB.js.map +0 -1
- package/dist/node-37AUE74M.js +0 -65
- package/dist/push-contracts-WY32TFP6.js +0 -84
- package/dist/push-contracts-WY32TFP6.js.map +0 -1
- package/dist/scan-PKSYSTRR.js +0 -15
- package/dist/static-viewer-7QIBQZRC.js.map +0 -1
- package/dist/token-parser-32KOIOFN.js +0 -22
- package/dist/token-parser-32KOIOFN.js.map +0 -1
- package/dist/tokens-push-HY3KO36V.js +0 -148
- package/dist/tokens-push-HY3KO36V.js.map +0 -1
- package/src/commands/init-cloud.ts +0 -382
- package/src/commands/push-contracts.ts +0 -112
- package/src/commands/tokens-push.ts +0 -199
- /package/dist/{chunk-ONUP6Z4W.js.map → chunk-B4A4ZEGS.js.map} +0 -0
- /package/dist/{chunk-BJE3425I.js.map → chunk-MN3B2EE6.js.map} +0 -0
- /package/dist/{chunk-2WXKALIG.js.map → chunk-SNZXGHL2.js.map} +0 -0
- /package/dist/{chunk-5JF26E55.js.map → chunk-VT2J62ND.js.map} +0 -0
- /package/dist/{codebase-scanner-MQHUZC2G.js.map → codebase-scanner-2T5QIDBA.js.map} +0 -0
- /package/dist/{create-EXURTBKK.js.map → create-D44QD7MV.js.map} +0 -0
- /package/dist/{doctor-BDPMYYE6.js.map → doctor-7B5N4JYU.js.map} +0 -0
- /package/dist/{generate-PVOLUAAC.js.map → generate-T47JZRVU.js.map} +0 -0
- /package/dist/{init-SSGUSP7Z.js.map → init-2RGAY4W6.js.map} +0 -0
- /package/dist/{node-37AUE74M.js.map → scan-A2WJM54L.js.map} +0 -0
- /package/dist/{scan-generate-VY27PIOX.js.map → scan-generate-LUSOHT36.js.map} +0 -0
- /package/dist/{scan-PKSYSTRR.js.map → service-ROCP7TKG.js.map} +0 -0
- /package/dist/{snapshot-WIJMEIFT.js.map → snapshot-B3SAW74Y.js.map} +0 -0
- /package/dist/{service-QJGWUIVL.js.map → static-viewer-7L6UEYTJ.js.map} +0 -0
- /package/dist/{test-64Z5BKBA.js.map → test-PQDVDURE.js.map} +0 -0
- /package/dist/{token-normalizer-TEPOVBPV.js.map → token-normalizer-7TFCVDZL.js.map} +0 -0
- /package/dist/{tokens-generate-5JQSJ27E.js.map → tokens-generate-CL4LBBQA.js.map} +0 -0
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
|
|
2
|
-
import "./chunk-D2CDBRNU.js";
|
|
3
|
-
import {
|
|
4
|
-
BRAND
|
|
5
|
-
} from "./chunk-32LIWN2P.js";
|
|
6
|
-
|
|
7
|
-
// src/commands/init-cloud.ts
|
|
8
|
-
import { createServer } from "http";
|
|
9
|
-
import { randomBytes } from "crypto";
|
|
10
|
-
import { execSync, exec } from "child_process";
|
|
11
|
-
import { readFileSync, writeFileSync, existsSync, appendFileSync } from "fs";
|
|
12
|
-
import { resolve, join } from "path";
|
|
13
|
-
import { platform } from "os";
|
|
14
|
-
import pc from "picocolors";
|
|
15
|
-
function detectPackageManager() {
|
|
16
|
-
let dir = process.cwd();
|
|
17
|
-
const root = resolve("/");
|
|
18
|
-
while (dir !== root) {
|
|
19
|
-
if (existsSync(join(dir, "bun.lockb")) || existsSync(join(dir, "bun.lock"))) return "bun";
|
|
20
|
-
if (existsSync(join(dir, "pnpm-lock.yaml"))) return "pnpm";
|
|
21
|
-
if (existsSync(join(dir, "yarn.lock"))) return "yarn";
|
|
22
|
-
const parent = resolve(dir, "..");
|
|
23
|
-
if (parent === dir) break;
|
|
24
|
-
dir = parent;
|
|
25
|
-
}
|
|
26
|
-
return "npm";
|
|
27
|
-
}
|
|
28
|
-
function detectFramework() {
|
|
29
|
-
try {
|
|
30
|
-
const pkg = JSON.parse(readFileSync(resolve("package.json"), "utf-8"));
|
|
31
|
-
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
32
|
-
if (allDeps["next"]) return "Next.js";
|
|
33
|
-
if (allDeps["nuxt"]) return "Nuxt";
|
|
34
|
-
if (allDeps["@sveltejs/kit"]) return "SvelteKit";
|
|
35
|
-
if (allDeps["svelte"]) return "Svelte";
|
|
36
|
-
if (allDeps["vue"]) return "Vue";
|
|
37
|
-
if (allDeps["astro"]) return "Astro";
|
|
38
|
-
if (allDeps["react"]) return "React";
|
|
39
|
-
return "Unknown";
|
|
40
|
-
} catch {
|
|
41
|
-
return "Unknown";
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
function inferInputGlob(framework) {
|
|
45
|
-
switch (framework) {
|
|
46
|
-
case "Next.js":
|
|
47
|
-
return ["./app/**/*.{tsx,jsx}", "./components/**/*.{tsx,jsx}"];
|
|
48
|
-
case "Nuxt":
|
|
49
|
-
case "Vue":
|
|
50
|
-
return ["./**/*.vue"];
|
|
51
|
-
case "SvelteKit":
|
|
52
|
-
case "Svelte":
|
|
53
|
-
return ["./src/**/*.svelte"];
|
|
54
|
-
case "Astro":
|
|
55
|
-
return ["./src/**/*.{astro,tsx,jsx}"];
|
|
56
|
-
default:
|
|
57
|
-
return "./src/**/*.{tsx,jsx}";
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function openBrowser(url) {
|
|
61
|
-
const os = platform();
|
|
62
|
-
const cmd = os === "darwin" ? "open" : os === "win32" ? 'start ""' : "xdg-open";
|
|
63
|
-
exec(`${cmd} "${url}"`);
|
|
64
|
-
}
|
|
65
|
-
function installCommand(pm) {
|
|
66
|
-
switch (pm) {
|
|
67
|
-
case "pnpm":
|
|
68
|
-
return "pnpm add";
|
|
69
|
-
case "yarn":
|
|
70
|
-
return "yarn add";
|
|
71
|
-
case "bun":
|
|
72
|
-
return "bun add";
|
|
73
|
-
default:
|
|
74
|
-
return "npm install";
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
function isMonorepoWorkspaceDep() {
|
|
78
|
-
try {
|
|
79
|
-
const pkg = JSON.parse(readFileSync(resolve("package.json"), "utf-8"));
|
|
80
|
-
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
81
|
-
return allDeps["@fragments-sdk/govern"]?.startsWith("workspace:") || allDeps["@fragments-sdk/cli"]?.startsWith("workspace:");
|
|
82
|
-
} catch {
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
function waitForAuth(cloudUrl, port, timeoutMs) {
|
|
87
|
-
const nonce = randomBytes(16).toString("hex");
|
|
88
|
-
return new Promise((resolve2, reject) => {
|
|
89
|
-
const timeout = setTimeout(() => {
|
|
90
|
-
server.close();
|
|
91
|
-
reject(new Error("Authentication timed out. Please try again."));
|
|
92
|
-
}, timeoutMs);
|
|
93
|
-
const server = createServer((req, res) => {
|
|
94
|
-
const url = new URL(req.url, `http://localhost:${port}`);
|
|
95
|
-
if (url.pathname === "/callback") {
|
|
96
|
-
const key = url.searchParams.get("key");
|
|
97
|
-
const org = url.searchParams.get("org");
|
|
98
|
-
const returnedNonce = url.searchParams.get("nonce");
|
|
99
|
-
if (returnedNonce !== nonce) {
|
|
100
|
-
res.writeHead(400, { "Content-Type": "text/plain" });
|
|
101
|
-
res.end("Nonce mismatch \u2014 please try again.");
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
if (!key) {
|
|
105
|
-
res.writeHead(400, { "Content-Type": "text/plain" });
|
|
106
|
-
res.end("Missing API key in callback.");
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
res.writeHead(200, { "Content-Type": "text/html" });
|
|
110
|
-
res.end(`<!DOCTYPE html>
|
|
111
|
-
<html><head><title>Fragments CLI</title>
|
|
112
|
-
<style>body{font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#0a0a0f;color:#e5e5e5}
|
|
113
|
-
.box{text-align:center;padding:48px}.check{font-size:48px;margin-bottom:16px}p{color:#888;margin-top:8px}</style>
|
|
114
|
-
</head><body><div class="box"><div class="check">✓</div><h2>CLI Authorized</h2><p>You can close this tab and return to your terminal.</p></div>
|
|
115
|
-
<script>setTimeout(()=>window.close(),3000)</script>
|
|
116
|
-
</body></html>`);
|
|
117
|
-
clearTimeout(timeout);
|
|
118
|
-
server.close();
|
|
119
|
-
resolve2({ apiKey: key, orgName: org ?? "your organization" });
|
|
120
|
-
} else {
|
|
121
|
-
res.writeHead(404);
|
|
122
|
-
res.end();
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
server.on("error", (err) => {
|
|
126
|
-
if (err.code === "EADDRINUSE") {
|
|
127
|
-
clearTimeout(timeout);
|
|
128
|
-
reject(new Error(`Port ${port} is in use. Try: fragments init --cloud --port ${port + 1}`));
|
|
129
|
-
} else {
|
|
130
|
-
clearTimeout(timeout);
|
|
131
|
-
reject(err);
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
server.listen(port, "127.0.0.1", () => {
|
|
135
|
-
const authUrl = `${cloudUrl}/cli-auth?port=${port}&nonce=${nonce}`;
|
|
136
|
-
openBrowser(authUrl);
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
function saveApiKey(apiKey, cloudUrl) {
|
|
141
|
-
const envPath = resolve(".env");
|
|
142
|
-
const entry = `FRAGMENTS_API_KEY=${apiKey}`;
|
|
143
|
-
if (existsSync(envPath)) {
|
|
144
|
-
const content = readFileSync(envPath, "utf-8");
|
|
145
|
-
if (content.includes("FRAGMENTS_API_KEY=")) {
|
|
146
|
-
const updated = content.replace(/^FRAGMENTS_API_KEY=.*$/m, entry);
|
|
147
|
-
writeFileSync(envPath, updated, "utf-8");
|
|
148
|
-
} else {
|
|
149
|
-
appendFileSync(envPath, `
|
|
150
|
-
${entry}
|
|
151
|
-
`, "utf-8");
|
|
152
|
-
}
|
|
153
|
-
} else {
|
|
154
|
-
writeFileSync(envPath, `${entry}
|
|
155
|
-
`, "utf-8");
|
|
156
|
-
}
|
|
157
|
-
if (cloudUrl !== "https://app.usefragments.com") {
|
|
158
|
-
const content = readFileSync(envPath, "utf-8");
|
|
159
|
-
if (!content.includes("FRAGMENTS_URL=")) {
|
|
160
|
-
appendFileSync(envPath, `FRAGMENTS_URL=${cloudUrl}
|
|
161
|
-
`, "utf-8");
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
const gitignorePath = resolve(".gitignore");
|
|
165
|
-
if (existsSync(gitignorePath)) {
|
|
166
|
-
const gitignore = readFileSync(gitignorePath, "utf-8");
|
|
167
|
-
if (!gitignore.split("\n").some((line) => line.trim() === ".env")) {
|
|
168
|
-
appendFileSync(gitignorePath, "\n.env\n", "utf-8");
|
|
169
|
-
}
|
|
170
|
-
} else {
|
|
171
|
-
writeFileSync(gitignorePath, ".env\n", "utf-8");
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
function writeGovernConfig(input) {
|
|
175
|
-
const configPath = resolve(BRAND.configFile);
|
|
176
|
-
if (existsSync(configPath)) return;
|
|
177
|
-
const inputStr = Array.isArray(input) ? `[${input.map((p) => `'${p}'`).join(", ")}]` : `'${input}'`;
|
|
178
|
-
const template = `import { defineConfig } from '@fragments-sdk/govern';
|
|
179
|
-
|
|
180
|
-
export default defineConfig({
|
|
181
|
-
cloud: true,
|
|
182
|
-
checks: ['accessibility', 'consistency', 'responsive'],
|
|
183
|
-
input: ${inputStr},
|
|
184
|
-
});
|
|
185
|
-
`;
|
|
186
|
-
writeFileSync(configPath, template, "utf-8");
|
|
187
|
-
}
|
|
188
|
-
async function initCloud(options = {}) {
|
|
189
|
-
const cloudUrl = options.url ?? process.env.FRAGMENTS_URL ?? "https://app.usefragments.com";
|
|
190
|
-
const port = options.port ?? 9876;
|
|
191
|
-
const timeoutMs = options.timeout ?? 12e4;
|
|
192
|
-
console.log(pc.bold(`
|
|
193
|
-
${BRAND.name}
|
|
194
|
-
`));
|
|
195
|
-
if (!options.authOnly) {
|
|
196
|
-
if (!existsSync(resolve("package.json"))) {
|
|
197
|
-
console.log(pc.red(" No package.json found. Run this from a project directory.\n"));
|
|
198
|
-
process.exit(1);
|
|
199
|
-
}
|
|
200
|
-
const pm2 = detectPackageManager();
|
|
201
|
-
const framework2 = detectFramework();
|
|
202
|
-
console.log(pc.dim(` Project: ${framework2}`));
|
|
203
|
-
console.log(pc.dim(` Package manager: ${pm2}
|
|
204
|
-
`));
|
|
205
|
-
}
|
|
206
|
-
console.log(pc.dim(" Opening browser to sign in...\n"));
|
|
207
|
-
let auth;
|
|
208
|
-
try {
|
|
209
|
-
auth = await waitForAuth(cloudUrl, port, timeoutMs);
|
|
210
|
-
} catch (err) {
|
|
211
|
-
console.log(pc.red(`
|
|
212
|
-
${err instanceof Error ? err.message : "Auth failed"}
|
|
213
|
-
`));
|
|
214
|
-
process.exit(1);
|
|
215
|
-
}
|
|
216
|
-
console.log(pc.green(` \u2713 Authenticated \u2014 ${auth.orgName}
|
|
217
|
-
`));
|
|
218
|
-
saveApiKey(auth.apiKey, cloudUrl);
|
|
219
|
-
console.log(pc.green(" \u2713 API key saved to .env"));
|
|
220
|
-
if (options.authOnly) {
|
|
221
|
-
console.log(pc.green("\n \u2713 All set!\n"));
|
|
222
|
-
console.log(pc.dim(` Dashboard: ${cloudUrl}
|
|
223
|
-
`));
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
const pm = detectPackageManager();
|
|
227
|
-
if (!isMonorepoWorkspaceDep()) {
|
|
228
|
-
const deps = "@fragments-sdk/govern @fragments-sdk/cli";
|
|
229
|
-
console.log(pc.dim(`
|
|
230
|
-
Installing ${deps}...`));
|
|
231
|
-
try {
|
|
232
|
-
execSync(`${installCommand(pm)} ${deps}`, {
|
|
233
|
-
stdio: "pipe",
|
|
234
|
-
cwd: process.cwd()
|
|
235
|
-
});
|
|
236
|
-
console.log(pc.green(" \u2713 Dependencies installed"));
|
|
237
|
-
} catch (err) {
|
|
238
|
-
console.log(pc.yellow(" \u26A0 Install failed \u2014 you may need to install manually:"));
|
|
239
|
-
console.log(pc.dim(` ${installCommand(pm)} ${deps}
|
|
240
|
-
`));
|
|
241
|
-
}
|
|
242
|
-
} else {
|
|
243
|
-
console.log(pc.dim("\n Workspace deps detected \u2014 skipping install"));
|
|
244
|
-
}
|
|
245
|
-
const framework = detectFramework();
|
|
246
|
-
const input = inferInputGlob(framework);
|
|
247
|
-
const configPath = resolve(BRAND.configFile);
|
|
248
|
-
if (existsSync(configPath)) {
|
|
249
|
-
console.log(pc.dim(` Config already exists: ${BRAND.configFile}`));
|
|
250
|
-
} else {
|
|
251
|
-
writeGovernConfig(input);
|
|
252
|
-
console.log(pc.green(` \u2713 Created ${BRAND.configFile}`));
|
|
253
|
-
}
|
|
254
|
-
const fragmentsJsonPath = resolve("fragments.json");
|
|
255
|
-
if (existsSync(fragmentsJsonPath)) {
|
|
256
|
-
console.log(pc.dim("\n Found fragments.json \u2014 pushing contracts to Cloud..."));
|
|
257
|
-
try {
|
|
258
|
-
const { pushContracts } = await import("@fragments-sdk/govern");
|
|
259
|
-
const raw = readFileSync(fragmentsJsonPath, "utf-8");
|
|
260
|
-
const parsed = JSON.parse(raw);
|
|
261
|
-
if (parsed.fragments && Array.isArray(parsed.fragments)) {
|
|
262
|
-
const result = await pushContracts({
|
|
263
|
-
contractRegistry: JSON.stringify({ fragments: parsed.fragments }),
|
|
264
|
-
apiKey: auth.apiKey,
|
|
265
|
-
url: cloudUrl
|
|
266
|
-
});
|
|
267
|
-
if (result.ok) {
|
|
268
|
-
console.log(pc.green(` \u2713 Pushed ${parsed.fragments.length} component contracts`));
|
|
269
|
-
} else {
|
|
270
|
-
console.log(pc.yellow(` \u26A0 Contract push failed: ${result.error}`));
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
} catch {
|
|
274
|
-
console.log(pc.yellow(" \u26A0 Could not push contracts"));
|
|
275
|
-
}
|
|
276
|
-
} else {
|
|
277
|
-
console.log(pc.dim("\n No fragments.json found \u2014 run `fragments scan` or `fragments build` to generate contracts"));
|
|
278
|
-
}
|
|
279
|
-
if (!options.skipCheck) {
|
|
280
|
-
console.log(pc.dim("\n Running first governance check...\n"));
|
|
281
|
-
try {
|
|
282
|
-
const output = execSync("npx fragments govern check --cloud", {
|
|
283
|
-
stdio: "pipe",
|
|
284
|
-
cwd: process.cwd(),
|
|
285
|
-
env: { ...process.env, FRAGMENTS_API_KEY: auth.apiKey }
|
|
286
|
-
});
|
|
287
|
-
console.log(output.toString());
|
|
288
|
-
} catch (err) {
|
|
289
|
-
if (err.stdout) {
|
|
290
|
-
console.log(err.stdout.toString());
|
|
291
|
-
}
|
|
292
|
-
console.log(pc.dim(" (check completed with violations \u2014 see dashboard for details)"));
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
console.log(pc.green("\n \u2713 All set!") + " Your project is connected to Fragments Cloud.\n");
|
|
296
|
-
console.log(pc.dim(` Dashboard: ${cloudUrl}`));
|
|
297
|
-
console.log(pc.dim(" Run checks: fragments govern scan"));
|
|
298
|
-
console.log(pc.dim(" Push contracts: fragments govern push-contracts"));
|
|
299
|
-
console.log(pc.dim(" View config: fragments.config.ts\n"));
|
|
300
|
-
}
|
|
301
|
-
export {
|
|
302
|
-
initCloud
|
|
303
|
-
};
|
|
304
|
-
//# sourceMappingURL=init-cloud-3DNKPWFB.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/init-cloud.ts"],"sourcesContent":["/**\n * fragments init --cloud\n *\n * Zero-config cloud setup: opens browser for auth, receives API key\n * via localhost callback, detects project, installs deps, creates config,\n * runs first check.\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { randomBytes } from 'node:crypto';\nimport { execSync, exec } from 'node:child_process';\nimport { readFileSync, writeFileSync, existsSync, appendFileSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { platform } from 'node:os';\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\ninterface AuthResult {\n apiKey: string;\n orgName: string;\n}\n\nexport interface InitCloudOptions {\n /** Cloud dashboard URL */\n url?: string;\n /** Port for localhost callback server */\n port?: number;\n /** Timeout in ms for auth */\n timeout?: number;\n /** Skip project detection and setup */\n authOnly?: boolean;\n /** Skip the first governance check */\n skipCheck?: boolean;\n}\n\n// ─── Utilities ──────────────────────────────────────────────────────────────\n\nfunction detectPackageManager(): 'pnpm' | 'yarn' | 'bun' | 'npm' {\n // Check current dir and parent dirs (for monorepos)\n let dir = process.cwd();\n const root = resolve('/');\n while (dir !== root) {\n if (existsSync(join(dir, 'bun.lockb')) || existsSync(join(dir, 'bun.lock'))) return 'bun';\n if (existsSync(join(dir, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(dir, 'yarn.lock'))) return 'yarn';\n const parent = resolve(dir, '..');\n if (parent === dir) break;\n dir = parent;\n }\n return 'npm';\n}\n\nfunction detectFramework(): string {\n try {\n const pkg = JSON.parse(readFileSync(resolve('package.json'), 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n if (allDeps['next']) return 'Next.js';\n if (allDeps['nuxt']) return 'Nuxt';\n if (allDeps['@sveltejs/kit']) return 'SvelteKit';\n if (allDeps['svelte']) return 'Svelte';\n if (allDeps['vue']) return 'Vue';\n if (allDeps['astro']) return 'Astro';\n if (allDeps['react']) return 'React';\n return 'Unknown';\n } catch {\n return 'Unknown';\n }\n}\n\nfunction inferInputGlob(framework: string): string | string[] {\n switch (framework) {\n case 'Next.js':\n return ['./app/**/*.{tsx,jsx}', './components/**/*.{tsx,jsx}'];\n case 'Nuxt':\n case 'Vue':\n return ['./**/*.vue'];\n case 'SvelteKit':\n case 'Svelte':\n return ['./src/**/*.svelte'];\n case 'Astro':\n return ['./src/**/*.{astro,tsx,jsx}'];\n default:\n return './src/**/*.{tsx,jsx}';\n }\n}\n\nfunction openBrowser(url: string): void {\n const os = platform();\n const cmd =\n os === 'darwin' ? 'open' :\n os === 'win32' ? 'start \"\"' :\n 'xdg-open';\n\n exec(`${cmd} \"${url}\"`);\n}\n\nfunction installCommand(pm: string): string {\n switch (pm) {\n case 'pnpm': return 'pnpm add';\n case 'yarn': return 'yarn add';\n case 'bun': return 'bun add';\n default: return 'npm install';\n }\n}\n\nfunction isMonorepoWorkspaceDep(): boolean {\n try {\n const pkg = JSON.parse(readFileSync(resolve('package.json'), 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n return (\n allDeps['@fragments-sdk/govern']?.startsWith('workspace:') ||\n allDeps['@fragments-sdk/cli']?.startsWith('workspace:')\n );\n } catch {\n return false;\n }\n}\n\n// ─── Localhost Auth Server ──────────────────────────────────────────────────\n\nfunction waitForAuth(\n cloudUrl: string,\n port: number,\n timeoutMs: number,\n): Promise<AuthResult> {\n const nonce = randomBytes(16).toString('hex');\n\n return new Promise<AuthResult>((resolve, reject) => {\n const timeout = setTimeout(() => {\n server.close();\n reject(new Error('Authentication timed out. Please try again.'));\n }, timeoutMs);\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url!, `http://localhost:${port}`);\n\n if (url.pathname === '/callback') {\n const key = url.searchParams.get('key');\n const org = url.searchParams.get('org');\n const returnedNonce = url.searchParams.get('nonce');\n\n if (returnedNonce !== nonce) {\n res.writeHead(400, { 'Content-Type': 'text/plain' });\n res.end('Nonce mismatch — please try again.');\n return;\n }\n\n if (!key) {\n res.writeHead(400, { 'Content-Type': 'text/plain' });\n res.end('Missing API key in callback.');\n return;\n }\n\n // Show \"you can close this tab\" page\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`<!DOCTYPE html>\n<html><head><title>Fragments CLI</title>\n<style>body{font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#0a0a0f;color:#e5e5e5}\n.box{text-align:center;padding:48px}.check{font-size:48px;margin-bottom:16px}p{color:#888;margin-top:8px}</style>\n</head><body><div class=\"box\"><div class=\"check\">✓</div><h2>CLI Authorized</h2><p>You can close this tab and return to your terminal.</p></div>\n<script>setTimeout(()=>window.close(),3000)</script>\n</body></html>`);\n\n clearTimeout(timeout);\n server.close();\n resolve({ apiKey: key, orgName: org ?? 'your organization' });\n } else {\n res.writeHead(404);\n res.end();\n }\n });\n\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n clearTimeout(timeout);\n reject(new Error(`Port ${port} is in use. Try: fragments init --cloud --port ${port + 1}`));\n } else {\n clearTimeout(timeout);\n reject(err);\n }\n });\n\n server.listen(port, '127.0.0.1', () => {\n const authUrl = `${cloudUrl}/cli-auth?port=${port}&nonce=${nonce}`;\n openBrowser(authUrl);\n });\n });\n}\n\n// ─── Save to .env ───────────────────────────────────────────────────────────\n\nfunction saveApiKey(apiKey: string, cloudUrl: string): void {\n const envPath = resolve('.env');\n const entry = `FRAGMENTS_API_KEY=${apiKey}`;\n\n if (existsSync(envPath)) {\n const content = readFileSync(envPath, 'utf-8');\n if (content.includes('FRAGMENTS_API_KEY=')) {\n const updated = content.replace(/^FRAGMENTS_API_KEY=.*$/m, entry);\n writeFileSync(envPath, updated, 'utf-8');\n } else {\n appendFileSync(envPath, `\\n${entry}\\n`, 'utf-8');\n }\n } else {\n writeFileSync(envPath, `${entry}\\n`, 'utf-8');\n }\n\n // Add FRAGMENTS_URL if non-default\n if (cloudUrl !== 'https://app.usefragments.com') {\n const content = readFileSync(envPath, 'utf-8');\n if (!content.includes('FRAGMENTS_URL=')) {\n appendFileSync(envPath, `FRAGMENTS_URL=${cloudUrl}\\n`, 'utf-8');\n }\n }\n\n // Ensure .env is in .gitignore\n const gitignorePath = resolve('.gitignore');\n if (existsSync(gitignorePath)) {\n const gitignore = readFileSync(gitignorePath, 'utf-8');\n if (!gitignore.split('\\n').some((line) => line.trim() === '.env')) {\n appendFileSync(gitignorePath, '\\n.env\\n', 'utf-8');\n }\n } else {\n writeFileSync(gitignorePath, '.env\\n', 'utf-8');\n }\n}\n\n// ─── Write governance config ────────────────────────────────────────────────\n\nfunction writeGovernConfig(input: string | string[]): void {\n const configPath = resolve(BRAND.configFile);\n if (existsSync(configPath)) return; // Don't overwrite\n\n const inputStr = Array.isArray(input)\n ? `[${input.map((p) => `'${p}'`).join(', ')}]`\n : `'${input}'`;\n\n const template = `import { defineConfig } from '@fragments-sdk/govern';\n\nexport default defineConfig({\n cloud: true,\n checks: ['accessibility', 'consistency', 'responsive'],\n input: ${inputStr},\n});\n`;\n\n writeFileSync(configPath, template, 'utf-8');\n}\n\n// ─── Main ───────────────────────────────────────────────────────────────────\n\nexport async function initCloud(options: InitCloudOptions = {}): Promise<void> {\n const cloudUrl = options.url ?? process.env.FRAGMENTS_URL ?? 'https://app.usefragments.com';\n const port = options.port ?? 9876;\n const timeoutMs = options.timeout ?? 120_000;\n\n console.log(pc.bold(`\\n ${BRAND.name}\\n`));\n\n // ── 1. Detect project ─────────────────────────────────────────────\n if (!options.authOnly) {\n if (!existsSync(resolve('package.json'))) {\n console.log(pc.red(' No package.json found. Run this from a project directory.\\n'));\n process.exit(1);\n }\n\n const pm = detectPackageManager();\n const framework = detectFramework();\n console.log(pc.dim(` Project: ${framework}`));\n console.log(pc.dim(` Package manager: ${pm}\\n`));\n }\n\n // ── 2. Authenticate ───────────────────────────────────────────────\n console.log(pc.dim(' Opening browser to sign in...\\n'));\n\n let auth: AuthResult;\n try {\n auth = await waitForAuth(cloudUrl, port, timeoutMs);\n } catch (err) {\n console.log(pc.red(`\\n ${err instanceof Error ? err.message : 'Auth failed'}\\n`));\n process.exit(1);\n }\n\n console.log(pc.green(` ✓ Authenticated — ${auth.orgName}\\n`));\n\n // ── 3. Save API key ──────────────────────────────────────────────\n saveApiKey(auth.apiKey, cloudUrl);\n console.log(pc.green(' ✓ API key saved to .env'));\n\n if (options.authOnly) {\n console.log(pc.green('\\n ✓ All set!\\n'));\n console.log(pc.dim(` Dashboard: ${cloudUrl}\\n`));\n return;\n }\n\n // ── 4. Install dependencies ───────────────────────────────────────\n const pm = detectPackageManager();\n\n if (!isMonorepoWorkspaceDep()) {\n const deps = '@fragments-sdk/govern @fragments-sdk/cli';\n console.log(pc.dim(`\\n Installing ${deps}...`));\n try {\n execSync(`${installCommand(pm)} ${deps}`, {\n stdio: 'pipe',\n cwd: process.cwd(),\n });\n console.log(pc.green(' ✓ Dependencies installed'));\n } catch (err) {\n console.log(pc.yellow(' ⚠ Install failed — you may need to install manually:'));\n console.log(pc.dim(` ${installCommand(pm)} ${deps}\\n`));\n }\n } else {\n console.log(pc.dim('\\n Workspace deps detected — skipping install'));\n }\n\n // ── 5. Create governance config ───────────────────────────────────\n const framework = detectFramework();\n const input = inferInputGlob(framework);\n const configPath = resolve(BRAND.configFile);\n\n if (existsSync(configPath)) {\n console.log(pc.dim(` Config already exists: ${BRAND.configFile}`));\n } else {\n writeGovernConfig(input);\n console.log(pc.green(` ✓ Created ${BRAND.configFile}`));\n }\n\n // ── 6. Push contracts if available ──────────────────────────────────\n const fragmentsJsonPath = resolve('fragments.json');\n if (existsSync(fragmentsJsonPath)) {\n console.log(pc.dim('\\n Found fragments.json — pushing contracts to Cloud...'));\n try {\n const { pushContracts } = await import('@fragments-sdk/govern');\n const raw = readFileSync(fragmentsJsonPath, 'utf-8');\n const parsed = JSON.parse(raw);\n if (parsed.fragments && Array.isArray(parsed.fragments)) {\n const result = await pushContracts({\n contractRegistry: JSON.stringify({ fragments: parsed.fragments }),\n apiKey: auth.apiKey,\n url: cloudUrl,\n });\n if (result.ok) {\n console.log(pc.green(` ✓ Pushed ${parsed.fragments.length} component contracts`));\n } else {\n console.log(pc.yellow(` ⚠ Contract push failed: ${result.error}`));\n }\n }\n } catch {\n console.log(pc.yellow(' ⚠ Could not push contracts'));\n }\n } else {\n console.log(pc.dim('\\n No fragments.json found — run `fragments scan` or `fragments build` to generate contracts'));\n }\n\n // ── 7. Run first check ────────────────────────────────────────────\n if (!options.skipCheck) {\n console.log(pc.dim('\\n Running first governance check...\\n'));\n try {\n const output = execSync('npx fragments govern check --cloud', {\n stdio: 'pipe',\n cwd: process.cwd(),\n env: { ...process.env, FRAGMENTS_API_KEY: auth.apiKey },\n });\n console.log(output.toString());\n } catch (err: any) {\n // Check may \"fail\" with violations — that's OK\n if (err.stdout) {\n console.log(err.stdout.toString());\n }\n console.log(pc.dim(' (check completed with violations — see dashboard for details)'));\n }\n }\n\n // ── 8. Done ───────────────────────────────────────────────────────\n console.log(pc.green('\\n ✓ All set!') + ' Your project is connected to Fragments Cloud.\\n');\n console.log(pc.dim(` Dashboard: ${cloudUrl}`));\n console.log(pc.dim(' Run checks: fragments govern scan'));\n console.log(pc.dim(' Push contracts: fragments govern push-contracts'));\n console.log(pc.dim(' View config: fragments.config.ts\\n'));\n}\n"],"mappings":";;;;;;;AAQA,SAAS,oBAA+D;AACxE,SAAS,mBAAmB;AAC5B,SAAS,UAAU,YAAY;AAC/B,SAAS,cAAc,eAAe,YAAY,sBAAsB;AACxE,SAAS,SAAS,YAAY;AAC9B,SAAS,gBAAgB;AACzB,OAAO,QAAQ;AAyBf,SAAS,uBAAwD;AAE/D,MAAI,MAAM,QAAQ,IAAI;AACtB,QAAM,OAAO,QAAQ,GAAG;AACxB,SAAO,QAAQ,MAAM;AACnB,QAAI,WAAW,KAAK,KAAK,WAAW,CAAC,KAAK,WAAW,KAAK,KAAK,UAAU,CAAC,EAAG,QAAO;AACpF,QAAI,WAAW,KAAK,KAAK,gBAAgB,CAAC,EAAG,QAAO;AACpD,QAAI,WAAW,KAAK,KAAK,WAAW,CAAC,EAAG,QAAO;AAC/C,UAAM,SAAS,QAAQ,KAAK,IAAI;AAChC,QAAI,WAAW,IAAK;AACpB,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAEA,SAAS,kBAA0B;AACjC,MAAI;AACF,UAAM,MAAM,KAAK,MAAM,aAAa,QAAQ,cAAc,GAAG,OAAO,CAAC;AACrE,UAAM,UAAU,EAAE,GAAG,IAAI,cAAc,GAAG,IAAI,gBAAgB;AAE9D,QAAI,QAAQ,MAAM,EAAG,QAAO;AAC5B,QAAI,QAAQ,MAAM,EAAG,QAAO;AAC5B,QAAI,QAAQ,eAAe,EAAG,QAAO;AACrC,QAAI,QAAQ,QAAQ,EAAG,QAAO;AAC9B,QAAI,QAAQ,KAAK,EAAG,QAAO;AAC3B,QAAI,QAAQ,OAAO,EAAG,QAAO;AAC7B,QAAI,QAAQ,OAAO,EAAG,QAAO;AAC7B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,WAAsC;AAC5D,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO,CAAC,wBAAwB,6BAA6B;AAAA,IAC/D,KAAK;AAAA,IACL,KAAK;AACH,aAAO,CAAC,YAAY;AAAA,IACtB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,CAAC,mBAAmB;AAAA,IAC7B,KAAK;AACH,aAAO,CAAC,4BAA4B;AAAA,IACtC;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,YAAY,KAAmB;AACtC,QAAM,KAAK,SAAS;AACpB,QAAM,MACJ,OAAO,WAAW,SAClB,OAAO,UAAU,aACjB;AAEF,OAAK,GAAG,GAAG,KAAK,GAAG,GAAG;AACxB;AAEA,SAAS,eAAe,IAAoB;AAC1C,UAAQ,IAAI;AAAA,IACV,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAO,aAAO;AAAA,IACnB;AAAS,aAAO;AAAA,EAClB;AACF;AAEA,SAAS,yBAAkC;AACzC,MAAI;AACF,UAAM,MAAM,KAAK,MAAM,aAAa,QAAQ,cAAc,GAAG,OAAO,CAAC;AACrE,UAAM,UAAU,EAAE,GAAG,IAAI,cAAc,GAAG,IAAI,gBAAgB;AAC9D,WACE,QAAQ,uBAAuB,GAAG,WAAW,YAAY,KACzD,QAAQ,oBAAoB,GAAG,WAAW,YAAY;AAAA,EAE1D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAIA,SAAS,YACP,UACA,MACA,WACqB;AACrB,QAAM,QAAQ,YAAY,EAAE,EAAE,SAAS,KAAK;AAE5C,SAAO,IAAI,QAAoB,CAACA,UAAS,WAAW;AAClD,UAAM,UAAU,WAAW,MAAM;AAC/B,aAAO,MAAM;AACb,aAAO,IAAI,MAAM,6CAA6C,CAAC;AAAA,IACjE,GAAG,SAAS;AAEZ,UAAM,SAAS,aAAa,CAAC,KAAsB,QAAwB;AACzE,YAAM,MAAM,IAAI,IAAI,IAAI,KAAM,oBAAoB,IAAI,EAAE;AAExD,UAAI,IAAI,aAAa,aAAa;AAChC,cAAM,MAAM,IAAI,aAAa,IAAI,KAAK;AACtC,cAAM,MAAM,IAAI,aAAa,IAAI,KAAK;AACtC,cAAM,gBAAgB,IAAI,aAAa,IAAI,OAAO;AAElD,YAAI,kBAAkB,OAAO;AAC3B,cAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC;AACnD,cAAI,IAAI,yCAAoC;AAC5C;AAAA,QACF;AAEA,YAAI,CAAC,KAAK;AACR,cAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC;AACnD,cAAI,IAAI,8BAA8B;AACtC;AAAA,QACF;AAGA,YAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,YAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAMD;AAEP,qBAAa,OAAO;AACpB,eAAO,MAAM;AACb,QAAAA,SAAQ,EAAE,QAAQ,KAAK,SAAS,OAAO,oBAAoB,CAAC;AAAA,MAC9D,OAAO;AACL,YAAI,UAAU,GAAG;AACjB,YAAI,IAAI;AAAA,MACV;AAAA,IACF,CAAC;AAED,WAAO,GAAG,SAAS,CAAC,QAA+B;AACjD,UAAI,IAAI,SAAS,cAAc;AAC7B,qBAAa,OAAO;AACpB,eAAO,IAAI,MAAM,QAAQ,IAAI,kDAAkD,OAAO,CAAC,EAAE,CAAC;AAAA,MAC5F,OAAO;AACL,qBAAa,OAAO;AACpB,eAAO,GAAG;AAAA,MACZ;AAAA,IACF,CAAC;AAED,WAAO,OAAO,MAAM,aAAa,MAAM;AACrC,YAAM,UAAU,GAAG,QAAQ,kBAAkB,IAAI,UAAU,KAAK;AAChE,kBAAY,OAAO;AAAA,IACrB,CAAC;AAAA,EACH,CAAC;AACH;AAIA,SAAS,WAAW,QAAgB,UAAwB;AAC1D,QAAM,UAAU,QAAQ,MAAM;AAC9B,QAAM,QAAQ,qBAAqB,MAAM;AAEzC,MAAI,WAAW,OAAO,GAAG;AACvB,UAAM,UAAU,aAAa,SAAS,OAAO;AAC7C,QAAI,QAAQ,SAAS,oBAAoB,GAAG;AAC1C,YAAM,UAAU,QAAQ,QAAQ,2BAA2B,KAAK;AAChE,oBAAc,SAAS,SAAS,OAAO;AAAA,IACzC,OAAO;AACL,qBAAe,SAAS;AAAA,EAAK,KAAK;AAAA,GAAM,OAAO;AAAA,IACjD;AAAA,EACF,OAAO;AACL,kBAAc,SAAS,GAAG,KAAK;AAAA,GAAM,OAAO;AAAA,EAC9C;AAGA,MAAI,aAAa,gCAAgC;AAC/C,UAAM,UAAU,aAAa,SAAS,OAAO;AAC7C,QAAI,CAAC,QAAQ,SAAS,gBAAgB,GAAG;AACvC,qBAAe,SAAS,iBAAiB,QAAQ;AAAA,GAAM,OAAO;AAAA,IAChE;AAAA,EACF;AAGA,QAAM,gBAAgB,QAAQ,YAAY;AAC1C,MAAI,WAAW,aAAa,GAAG;AAC7B,UAAM,YAAY,aAAa,eAAe,OAAO;AACrD,QAAI,CAAC,UAAU,MAAM,IAAI,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,MAAM,MAAM,GAAG;AACjE,qBAAe,eAAe,YAAY,OAAO;AAAA,IACnD;AAAA,EACF,OAAO;AACL,kBAAc,eAAe,UAAU,OAAO;AAAA,EAChD;AACF;AAIA,SAAS,kBAAkB,OAAgC;AACzD,QAAM,aAAa,QAAQ,MAAM,UAAU;AAC3C,MAAI,WAAW,UAAU,EAAG;AAE5B,QAAM,WAAW,MAAM,QAAQ,KAAK,IAChC,IAAI,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,MACzC,IAAI,KAAK;AAEb,QAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,WAKR,QAAQ;AAAA;AAAA;AAIjB,gBAAc,YAAY,UAAU,OAAO;AAC7C;AAIA,eAAsB,UAAU,UAA4B,CAAC,GAAkB;AAC7E,QAAM,WAAW,QAAQ,OAAO,QAAQ,IAAI,iBAAiB;AAC7D,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,YAAY,QAAQ,WAAW;AAErC,UAAQ,IAAI,GAAG,KAAK;AAAA,IAAO,MAAM,IAAI;AAAA,CAAI,CAAC;AAG1C,MAAI,CAAC,QAAQ,UAAU;AACrB,QAAI,CAAC,WAAW,QAAQ,cAAc,CAAC,GAAG;AACxC,cAAQ,IAAI,GAAG,IAAI,+DAA+D,CAAC;AACnF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAMC,MAAK,qBAAqB;AAChC,UAAMC,aAAY,gBAAgB;AAClC,YAAQ,IAAI,GAAG,IAAI,cAAcA,UAAS,EAAE,CAAC;AAC7C,YAAQ,IAAI,GAAG,IAAI,sBAAsBD,GAAE;AAAA,CAAI,CAAC;AAAA,EAClD;AAGA,UAAQ,IAAI,GAAG,IAAI,mCAAmC,CAAC;AAEvD,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,YAAY,UAAU,MAAM,SAAS;AAAA,EACpD,SAAS,KAAK;AACZ,YAAQ,IAAI,GAAG,IAAI;AAAA,IAAO,eAAe,QAAQ,IAAI,UAAU,aAAa;AAAA,CAAI,CAAC;AACjF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,GAAG,MAAM,iCAAuB,KAAK,OAAO;AAAA,CAAI,CAAC;AAG7D,aAAW,KAAK,QAAQ,QAAQ;AAChC,UAAQ,IAAI,GAAG,MAAM,gCAA2B,CAAC;AAEjD,MAAI,QAAQ,UAAU;AACpB,YAAQ,IAAI,GAAG,MAAM,uBAAkB,CAAC;AACxC,YAAQ,IAAI,GAAG,IAAI,gBAAgB,QAAQ;AAAA,CAAI,CAAC;AAChD;AAAA,EACF;AAGA,QAAM,KAAK,qBAAqB;AAEhC,MAAI,CAAC,uBAAuB,GAAG;AAC7B,UAAM,OAAO;AACb,YAAQ,IAAI,GAAG,IAAI;AAAA,eAAkB,IAAI,KAAK,CAAC;AAC/C,QAAI;AACF,eAAS,GAAG,eAAe,EAAE,CAAC,IAAI,IAAI,IAAI;AAAA,QACxC,OAAO;AAAA,QACP,KAAK,QAAQ,IAAI;AAAA,MACnB,CAAC;AACD,cAAQ,IAAI,GAAG,MAAM,iCAA4B,CAAC;AAAA,IACpD,SAAS,KAAK;AACZ,cAAQ,IAAI,GAAG,OAAO,kEAAwD,CAAC;AAC/E,cAAQ,IAAI,GAAG,IAAI,OAAO,eAAe,EAAE,CAAC,IAAI,IAAI;AAAA,CAAI,CAAC;AAAA,IAC3D;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,GAAG,IAAI,qDAAgD,CAAC;AAAA,EACtE;AAGA,QAAM,YAAY,gBAAgB;AAClC,QAAM,QAAQ,eAAe,SAAS;AACtC,QAAM,aAAa,QAAQ,MAAM,UAAU;AAE3C,MAAI,WAAW,UAAU,GAAG;AAC1B,YAAQ,IAAI,GAAG,IAAI,4BAA4B,MAAM,UAAU,EAAE,CAAC;AAAA,EACpE,OAAO;AACL,sBAAkB,KAAK;AACvB,YAAQ,IAAI,GAAG,MAAM,oBAAe,MAAM,UAAU,EAAE,CAAC;AAAA,EACzD;AAGA,QAAM,oBAAoB,QAAQ,gBAAgB;AAClD,MAAI,WAAW,iBAAiB,GAAG;AACjC,YAAQ,IAAI,GAAG,IAAI,+DAA0D,CAAC;AAC9E,QAAI;AACF,YAAM,EAAE,cAAc,IAAI,MAAM,OAAO,uBAAuB;AAC9D,YAAM,MAAM,aAAa,mBAAmB,OAAO;AACnD,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAI,OAAO,aAAa,MAAM,QAAQ,OAAO,SAAS,GAAG;AACvD,cAAM,SAAS,MAAM,cAAc;AAAA,UACjC,kBAAkB,KAAK,UAAU,EAAE,WAAW,OAAO,UAAU,CAAC;AAAA,UAChE,QAAQ,KAAK;AAAA,UACb,KAAK;AAAA,QACP,CAAC;AACD,YAAI,OAAO,IAAI;AACb,kBAAQ,IAAI,GAAG,MAAM,mBAAc,OAAO,UAAU,MAAM,sBAAsB,CAAC;AAAA,QACnF,OAAO;AACL,kBAAQ,IAAI,GAAG,OAAO,kCAA6B,OAAO,KAAK,EAAE,CAAC;AAAA,QACpE;AAAA,MACF;AAAA,IACF,QAAQ;AACN,cAAQ,IAAI,GAAG,OAAO,mCAA8B,CAAC;AAAA,IACvD;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,GAAG,IAAI,oGAA+F,CAAC;AAAA,EACrH;AAGA,MAAI,CAAC,QAAQ,WAAW;AACtB,YAAQ,IAAI,GAAG,IAAI,yCAAyC,CAAC;AAC7D,QAAI;AACF,YAAM,SAAS,SAAS,sCAAsC;AAAA,QAC5D,OAAO;AAAA,QACP,KAAK,QAAQ,IAAI;AAAA,QACjB,KAAK,EAAE,GAAG,QAAQ,KAAK,mBAAmB,KAAK,OAAO;AAAA,MACxD,CAAC;AACD,cAAQ,IAAI,OAAO,SAAS,CAAC;AAAA,IAC/B,SAAS,KAAU;AAEjB,UAAI,IAAI,QAAQ;AACd,gBAAQ,IAAI,IAAI,OAAO,SAAS,CAAC;AAAA,MACnC;AACA,cAAQ,IAAI,GAAG,IAAI,sEAAiE,CAAC;AAAA,IACvF;AAAA,EACF;AAGA,UAAQ,IAAI,GAAG,MAAM,qBAAgB,IAAI,kDAAkD;AAC3F,UAAQ,IAAI,GAAG,IAAI,gBAAgB,QAAQ,EAAE,CAAC;AAC9C,UAAQ,IAAI,GAAG,IAAI,0CAA0C,CAAC;AAC9D,UAAQ,IAAI,GAAG,IAAI,oDAAoD,CAAC;AACxE,UAAQ,IAAI,GAAG,IAAI,0CAA0C,CAAC;AAChE;","names":["resolve","pm","framework"]}
|
package/dist/node-37AUE74M.js
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
analyzeFileImports,
|
|
4
|
-
autoLoadPreviewConfig,
|
|
5
|
-
buildImportGraph,
|
|
6
|
-
discoverAllComponents,
|
|
7
|
-
discoverBlockFiles,
|
|
8
|
-
discoverComponentFiles,
|
|
9
|
-
discoverComponentsFromBarrel,
|
|
10
|
-
discoverComponentsFromSource,
|
|
11
|
-
discoverFragmentFiles,
|
|
12
|
-
discoverInstalledFragments,
|
|
13
|
-
discoverRecipeFiles,
|
|
14
|
-
discoverTokenFiles,
|
|
15
|
-
extractComponentName,
|
|
16
|
-
extractPropsFromFile,
|
|
17
|
-
extractPropsFromSource,
|
|
18
|
-
findConfigFile,
|
|
19
|
-
findPreviewConfigPath,
|
|
20
|
-
findStorybookDir,
|
|
21
|
-
generateContextMd,
|
|
22
|
-
generatePreviewModule,
|
|
23
|
-
generateRegistry,
|
|
24
|
-
getComponentsByCategory,
|
|
25
|
-
getImportedBy,
|
|
26
|
-
loadConfig,
|
|
27
|
-
loadFragmentFile,
|
|
28
|
-
loadFragmentFiles,
|
|
29
|
-
loadPreviewConfig,
|
|
30
|
-
parseFragmentFile,
|
|
31
|
-
resolveComponentPath
|
|
32
|
-
} from "./chunk-HQ6A6DTV.js";
|
|
33
|
-
import "./chunk-32LIWN2P.js";
|
|
34
|
-
export {
|
|
35
|
-
analyzeFileImports,
|
|
36
|
-
autoLoadPreviewConfig,
|
|
37
|
-
buildImportGraph,
|
|
38
|
-
discoverAllComponents,
|
|
39
|
-
discoverBlockFiles,
|
|
40
|
-
discoverComponentFiles,
|
|
41
|
-
discoverComponentsFromBarrel,
|
|
42
|
-
discoverComponentsFromSource,
|
|
43
|
-
discoverFragmentFiles,
|
|
44
|
-
discoverInstalledFragments,
|
|
45
|
-
discoverRecipeFiles,
|
|
46
|
-
discoverTokenFiles,
|
|
47
|
-
extractComponentName,
|
|
48
|
-
extractPropsFromFile,
|
|
49
|
-
extractPropsFromSource,
|
|
50
|
-
findConfigFile,
|
|
51
|
-
findPreviewConfigPath,
|
|
52
|
-
findStorybookDir,
|
|
53
|
-
generateContextMd,
|
|
54
|
-
generatePreviewModule,
|
|
55
|
-
generateRegistry,
|
|
56
|
-
getComponentsByCategory,
|
|
57
|
-
getImportedBy,
|
|
58
|
-
loadConfig,
|
|
59
|
-
loadFragmentFile,
|
|
60
|
-
loadFragmentFiles,
|
|
61
|
-
loadPreviewConfig,
|
|
62
|
-
parseFragmentFile,
|
|
63
|
-
resolveComponentPath
|
|
64
|
-
};
|
|
65
|
-
//# sourceMappingURL=node-37AUE74M.js.map
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
|
|
2
|
-
import "./chunk-D2CDBRNU.js";
|
|
3
|
-
import {
|
|
4
|
-
BRAND
|
|
5
|
-
} from "./chunk-32LIWN2P.js";
|
|
6
|
-
|
|
7
|
-
// src/commands/push-contracts.ts
|
|
8
|
-
import { readFileSync, existsSync } from "fs";
|
|
9
|
-
import { resolve } from "path";
|
|
10
|
-
import pc from "picocolors";
|
|
11
|
-
async function pushContracts(options = {}) {
|
|
12
|
-
const quiet = options.quiet ?? false;
|
|
13
|
-
const apiKey = options.apiKey ?? process.env.FRAGMENTS_API_KEY;
|
|
14
|
-
if (!apiKey) {
|
|
15
|
-
console.error(
|
|
16
|
-
pc.red("No API key found. Set FRAGMENTS_API_KEY or pass --api-key.")
|
|
17
|
-
);
|
|
18
|
-
return { exitCode: 1 };
|
|
19
|
-
}
|
|
20
|
-
if (!quiet) {
|
|
21
|
-
console.log(pc.cyan(`
|
|
22
|
-
${BRAND.name} Push Contracts
|
|
23
|
-
`));
|
|
24
|
-
}
|
|
25
|
-
const inputPath = options.input ? resolve(options.input) : resolve("fragments.json");
|
|
26
|
-
if (!existsSync(inputPath)) {
|
|
27
|
-
console.error(
|
|
28
|
-
pc.red(`Contract registry not found at ${inputPath}`)
|
|
29
|
-
);
|
|
30
|
-
console.error(
|
|
31
|
-
pc.dim("Run `fragments build` or `fragments scan` to generate fragments.json first.")
|
|
32
|
-
);
|
|
33
|
-
return { exitCode: 1 };
|
|
34
|
-
}
|
|
35
|
-
let contractRegistry;
|
|
36
|
-
let componentCount = 0;
|
|
37
|
-
try {
|
|
38
|
-
const raw = readFileSync(inputPath, "utf-8");
|
|
39
|
-
const parsed = JSON.parse(raw);
|
|
40
|
-
const fragments = parsed.fragments ?? parsed;
|
|
41
|
-
if (!Array.isArray(fragments)) {
|
|
42
|
-
console.error(pc.red("Invalid contract registry: expected fragments array"));
|
|
43
|
-
return { exitCode: 1 };
|
|
44
|
-
}
|
|
45
|
-
componentCount = fragments.length;
|
|
46
|
-
contractRegistry = JSON.stringify({ fragments });
|
|
47
|
-
} catch (error) {
|
|
48
|
-
console.error(
|
|
49
|
-
pc.red("Failed to parse contract registry:"),
|
|
50
|
-
error instanceof Error ? error.message : "unknown error"
|
|
51
|
-
);
|
|
52
|
-
return { exitCode: 1 };
|
|
53
|
-
}
|
|
54
|
-
if (componentCount === 0) {
|
|
55
|
-
console.warn(pc.yellow("No components found in contract registry. Nothing to push."));
|
|
56
|
-
return { exitCode: 0 };
|
|
57
|
-
}
|
|
58
|
-
if (!quiet) {
|
|
59
|
-
console.log(pc.dim(` Found ${componentCount} component contracts
|
|
60
|
-
`));
|
|
61
|
-
console.log(pc.dim(" Pushing to Fragments Cloud...\n"));
|
|
62
|
-
}
|
|
63
|
-
const { pushContracts: push } = await import("@fragments-sdk/govern");
|
|
64
|
-
const result = await push({
|
|
65
|
-
contractRegistry,
|
|
66
|
-
url: options.url,
|
|
67
|
-
apiKey
|
|
68
|
-
});
|
|
69
|
-
if (!result.ok) {
|
|
70
|
-
console.error(pc.red(`Failed to push contracts: ${result.error}`));
|
|
71
|
-
return { exitCode: 1 };
|
|
72
|
-
}
|
|
73
|
-
if (!quiet) {
|
|
74
|
-
console.log(
|
|
75
|
-
pc.green(` \u2713 Pushed ${componentCount} component contracts to Fragments Cloud
|
|
76
|
-
`)
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
return { exitCode: 0 };
|
|
80
|
-
}
|
|
81
|
-
export {
|
|
82
|
-
pushContracts
|
|
83
|
-
};
|
|
84
|
-
//# sourceMappingURL=push-contracts-WY32TFP6.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/push-contracts.ts"],"sourcesContent":["/**\n * fragments push-contracts\n *\n * Push compiled component contracts to Fragments Cloud.\n * Reads fragments.json from the project root (or builds it from .contract.json files)\n * and posts the contract registry to the Cloud ingest endpoint.\n */\n\nimport { readFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\n\nexport interface PushContractsOptions {\n /** Path to fragments.json or directory containing .contract.json files */\n input?: string;\n /** Fragments Cloud URL */\n url?: string;\n /** API key (defaults to FRAGMENTS_API_KEY env var) */\n apiKey?: string;\n /** Suppress output */\n quiet?: boolean;\n}\n\nexport async function pushContracts(\n options: PushContractsOptions = {},\n): Promise<{ exitCode: number }> {\n const quiet = options.quiet ?? false;\n const apiKey = options.apiKey ?? process.env.FRAGMENTS_API_KEY;\n\n if (!apiKey) {\n console.error(\n pc.red('No API key found. Set FRAGMENTS_API_KEY or pass --api-key.'),\n );\n return { exitCode: 1 };\n }\n\n if (!quiet) {\n console.log(pc.cyan(`\\n${BRAND.name} Push Contracts\\n`));\n }\n\n // 1. Find contract registry\n const inputPath = options.input\n ? resolve(options.input)\n : resolve('fragments.json');\n\n if (!existsSync(inputPath)) {\n console.error(\n pc.red(`Contract registry not found at ${inputPath}`),\n );\n console.error(\n pc.dim('Run `fragments build` or `fragments scan` to generate fragments.json first.'),\n );\n return { exitCode: 1 };\n }\n\n // 2. Parse and validate\n let contractRegistry: string;\n let componentCount = 0;\n\n try {\n const raw = readFileSync(inputPath, 'utf-8');\n const parsed = JSON.parse(raw);\n const fragments = parsed.fragments ?? parsed;\n\n if (!Array.isArray(fragments)) {\n console.error(pc.red('Invalid contract registry: expected fragments array'));\n return { exitCode: 1 };\n }\n\n componentCount = fragments.length;\n contractRegistry = JSON.stringify({ fragments });\n } catch (error) {\n console.error(\n pc.red('Failed to parse contract registry:'),\n error instanceof Error ? error.message : 'unknown error',\n );\n return { exitCode: 1 };\n }\n\n if (componentCount === 0) {\n console.warn(pc.yellow('No components found in contract registry. Nothing to push.'));\n return { exitCode: 0 };\n }\n\n if (!quiet) {\n console.log(pc.dim(` Found ${componentCount} component contracts\\n`));\n console.log(pc.dim(' Pushing to Fragments Cloud...\\n'));\n }\n\n // 3. Push to Cloud\n const { pushContracts: push } = await import('@fragments-sdk/govern');\n\n const result = await push({\n contractRegistry,\n url: options.url,\n apiKey,\n });\n\n if (!result.ok) {\n console.error(pc.red(`Failed to push contracts: ${result.error}`));\n return { exitCode: 1 };\n }\n\n if (!quiet) {\n console.log(\n pc.green(` ✓ Pushed ${componentCount} component contracts to Fragments Cloud\\n`),\n );\n }\n\n return { exitCode: 0 };\n}\n"],"mappings":";;;;;;;AAQA,SAAS,cAAc,kBAAkB;AACzC,SAAS,eAAe;AACxB,OAAO,QAAQ;AAcf,eAAsB,cACpB,UAAgC,CAAC,GACF;AAC/B,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI;AAE7C,MAAI,CAAC,QAAQ;AACX,YAAQ;AAAA,MACN,GAAG,IAAI,4DAA4D;AAAA,IACrE;AACA,WAAO,EAAE,UAAU,EAAE;AAAA,EACvB;AAEA,MAAI,CAAC,OAAO;AACV,YAAQ,IAAI,GAAG,KAAK;AAAA,EAAK,MAAM,IAAI;AAAA,CAAmB,CAAC;AAAA,EACzD;AAGA,QAAM,YAAY,QAAQ,QACtB,QAAQ,QAAQ,KAAK,IACrB,QAAQ,gBAAgB;AAE5B,MAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,YAAQ;AAAA,MACN,GAAG,IAAI,kCAAkC,SAAS,EAAE;AAAA,IACtD;AACA,YAAQ;AAAA,MACN,GAAG,IAAI,6EAA6E;AAAA,IACtF;AACA,WAAO,EAAE,UAAU,EAAE;AAAA,EACvB;AAGA,MAAI;AACJ,MAAI,iBAAiB;AAErB,MAAI;AACF,UAAM,MAAM,aAAa,WAAW,OAAO;AAC3C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAM,YAAY,OAAO,aAAa;AAEtC,QAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC7B,cAAQ,MAAM,GAAG,IAAI,qDAAqD,CAAC;AAC3E,aAAO,EAAE,UAAU,EAAE;AAAA,IACvB;AAEA,qBAAiB,UAAU;AAC3B,uBAAmB,KAAK,UAAU,EAAE,UAAU,CAAC;AAAA,EACjD,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,GAAG,IAAI,oCAAoC;AAAA,MAC3C,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAC3C;AACA,WAAO,EAAE,UAAU,EAAE;AAAA,EACvB;AAEA,MAAI,mBAAmB,GAAG;AACxB,YAAQ,KAAK,GAAG,OAAO,4DAA4D,CAAC;AACpF,WAAO,EAAE,UAAU,EAAE;AAAA,EACvB;AAEA,MAAI,CAAC,OAAO;AACV,YAAQ,IAAI,GAAG,IAAI,WAAW,cAAc;AAAA,CAAwB,CAAC;AACrE,YAAQ,IAAI,GAAG,IAAI,mCAAmC,CAAC;AAAA,EACzD;AAGA,QAAM,EAAE,eAAe,KAAK,IAAI,MAAM,OAAO,uBAAuB;AAEpE,QAAM,SAAS,MAAM,KAAK;AAAA,IACxB;AAAA,IACA,KAAK,QAAQ;AAAA,IACb;AAAA,EACF,CAAC;AAED,MAAI,CAAC,OAAO,IAAI;AACd,YAAQ,MAAM,GAAG,IAAI,6BAA6B,OAAO,KAAK,EAAE,CAAC;AACjE,WAAO,EAAE,UAAU,EAAE;AAAA,EACvB;AAEA,MAAI,CAAC,OAAO;AACV,YAAQ;AAAA,MACN,GAAG,MAAM,mBAAc,cAAc;AAAA,CAA2C;AAAA,IAClF;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,EAAE;AACvB;","names":[]}
|
package/dist/scan-PKSYSTRR.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
scan
|
|
4
|
-
} from "./chunk-ONUP6Z4W.js";
|
|
5
|
-
import "./chunk-6SQPP47U.js";
|
|
6
|
-
import "./chunk-D2CDBRNU.js";
|
|
7
|
-
import "./chunk-HQ6A6DTV.js";
|
|
8
|
-
import "./chunk-32LIWN2P.js";
|
|
9
|
-
import "./chunk-MHIBEEW4.js";
|
|
10
|
-
import "./chunk-QCN35LJU.js";
|
|
11
|
-
import "./chunk-7DZC4YEV.js";
|
|
12
|
-
export {
|
|
13
|
-
scan
|
|
14
|
-
};
|
|
15
|
-
//# sourceMappingURL=scan-PKSYSTRR.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
containsTailwindV4Theme,
|
|
4
|
-
hexToRgb,
|
|
5
|
-
normalizeColor,
|
|
6
|
-
parseRgb,
|
|
7
|
-
parseTailwindV4File,
|
|
8
|
-
parseTokenFile,
|
|
9
|
-
parseTokenFiles,
|
|
10
|
-
rgbToHex
|
|
11
|
-
} from "./chunk-MHIBEEW4.js";
|
|
12
|
-
export {
|
|
13
|
-
containsTailwindV4Theme,
|
|
14
|
-
hexToRgb,
|
|
15
|
-
normalizeColor,
|
|
16
|
-
parseRgb,
|
|
17
|
-
parseTailwindV4File,
|
|
18
|
-
parseTokenFile,
|
|
19
|
-
parseTokenFiles,
|
|
20
|
-
rgbToHex
|
|
21
|
-
};
|
|
22
|
-
//# sourceMappingURL=token-parser-32KOIOFN.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|