@flytedesk/app-kit 0.1.3 → 0.2.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.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export declare function main(argv: string[]): Promise<void>;
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * profile-sync — the CLI half of @flytedesk/app-kit/profile (DEC-39, DEC-52).
4
+ *
5
+ * A thin wrapper around the generalized sync engine in ./sync-engine.js — see that
6
+ * file's doc comment for the full subcommand reference (init/diff/apply/status) and
7
+ * how fragments/migrations/lock files work. This file only supplies the "profile"
8
+ * fragment name and the "profile-sync" bin name; trace-sync.ts is the same wrapper
9
+ * for the trace fragment.
10
+ */
11
+ import { pathToFileURL } from "node:url";
12
+ import { runSyncCli, SyncCliError } from "./sync-engine.js";
13
+ export async function main(argv) {
14
+ return runSyncCli(argv, { name: "profile", binName: "profile-sync" });
15
+ }
16
+ const isMainModule = process.argv[1] !== undefined &&
17
+ import.meta.url === pathToFileURL(process.argv[1]).href;
18
+ if (isMainModule) {
19
+ main(process.argv.slice(2)).catch((err) => {
20
+ if (!(err instanceof SyncCliError)) {
21
+ console.error(err);
22
+ }
23
+ process.exitCode = process.exitCode ?? 1;
24
+ });
25
+ }
26
+ //# sourceMappingURL=profile-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-sync.js","sourceRoot":"","sources":["../../src/cli/profile-sync.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc;IACvC,OAAO,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;IAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAE1D,IAAI,YAAY,EAAE,CAAC;IACjB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACjD,IAAI,CAAC,CAAC,GAAG,YAAY,YAAY,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Everything that differs between `trace-sync` and `profile-sync`. `name` picks out
3
+ * prisma/fragments/<name>.prisma, prisma/fragments/<name>.meta.json, and every
4
+ * manifest entry with `fragment: name`; `binName` is only used for log/error message
5
+ * prefixes and the CLI's own usage string.
6
+ */
7
+ export interface SyncFragment {
8
+ /** e.g. "trace" or "profile" — must match the fragment's file basenames and its
9
+ * manifest entries' `fragment` field. */
10
+ name: string;
11
+ /** e.g. "trace-sync" or "profile-sync" — the bin name this is invoked as. */
12
+ binName: string;
13
+ }
14
+ export declare class SyncCliError extends Error {
15
+ }
16
+ /**
17
+ * Runs one CLI invocation for the given fragment. Called by each bin wrapper
18
+ * (src/cli/trace-sync.ts, src/cli/profile-sync.ts) with `process.argv.slice(2)`.
19
+ */
20
+ export declare function runSyncCli(argv: string[], fragment: SyncFragment): Promise<void>;
@@ -0,0 +1,392 @@
1
+ /**
2
+ * sync-engine — the shared internals behind `trace-sync` and `profile-sync`
3
+ * (DEC-39, generalized to a second fragment for the profile module).
4
+ *
5
+ * This package never generates its own Prisma Client for any of its fragments.
6
+ * Instead, this engine copies a package fragment (prisma/fragments/<fragment>.prisma)
7
+ * into the *consumer's* own multi-file Prisma schema folder, applies that fragment's
8
+ * raw SQL migrations directly against the consumer's configured datasource, and
9
+ * tracks what's been applied in a lock file (`.app-kit-<fragment>.lock.json`) written
10
+ * at the consumer project root. The consumer's own `prisma generate` then produces
11
+ * one client that includes these models alongside their own.
12
+ *
13
+ * Both bin commands are thin wrappers around `runSyncCli` (see src/cli/trace-sync.ts
14
+ * and src/cli/profile-sync.ts) — everything fragment-specific is passed in as a
15
+ * `SyncFragment` rather than hardcoded, so a third fragment only ever needs its own
16
+ * ~15-line wrapper file, not a second copy of this logic.
17
+ *
18
+ * Migrations for every fragment live together under prisma/migrations/ and are
19
+ * tracked in one shared prisma/migrations/manifest.json, disambiguated by each
20
+ * entry's `fragment` field — `computePending`/`cmdInit`/`cmdApply` below all filter
21
+ * the manifest down to `entry.fragment === fragment.name` before doing anything, so
22
+ * e.g. `trace-sync init` only ever touches trace's own migrations, never profile's.
23
+ *
24
+ * Subcommands (identical across every fragment):
25
+ * <bin> init copy fragment + migrations in, run `prisma validate` and
26
+ * `prisma db execute`, write the lock file.
27
+ * <bin> diff read-only: compare this package's bundled fragment version /
28
+ * migration manifest against the consumer's lock file and report
29
+ * what's pending. Never applies anything.
30
+ * <bin> apply apply pending migrations + refresh the fragment copy, update the
31
+ * lock file. Does not re-run `prisma validate` against a fresh
32
+ * init — use `init` for first install.
33
+ * <bin> status read-only report: fragment version, applied migrations, and
34
+ * whether the consumer's copy of the fragment has been hand-edited
35
+ * (checksum mismatch).
36
+ *
37
+ * This is a real, runnable CLI — it shells out to the consumer's local `prisma` via
38
+ * `npx` and touches the consumer's real filesystem — not a stub.
39
+ */
40
+ import { createHash } from "node:crypto";
41
+ import spawn from "cross-spawn";
42
+ import { copyFileSync, cpSync, existsSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
43
+ import path from "node:path";
44
+ import { fileURLToPath, pathToFileURL } from "node:url";
45
+ export class SyncCliError extends Error {
46
+ }
47
+ function readJson(filePath) {
48
+ return JSON.parse(readFileSync(filePath, "utf8"));
49
+ }
50
+ function sha256(content) {
51
+ return `sha256:${createHash("sha256").update(content).digest("hex")}`;
52
+ }
53
+ function sha256File(filePath) {
54
+ return sha256(readFileSync(filePath));
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // Engine: bound to one SyncFragment + the consumer root it's operating on
58
+ // ---------------------------------------------------------------------------
59
+ class SyncEngine {
60
+ fragment;
61
+ packageRoot;
62
+ fragmentSrcPath;
63
+ fragmentMetaPath;
64
+ migrationsSrcDir;
65
+ manifestSrcPath;
66
+ lockFileName;
67
+ constructor(fragment) {
68
+ this.fragment = fragment;
69
+ // Root of the installed @flytedesk/app-kit package (two levels up from
70
+ // dist/cli/<bin>.js — this file, once built).
71
+ this.packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
72
+ this.fragmentSrcPath = path.join(this.packageRoot, "prisma", "fragments", `${fragment.name}.prisma`);
73
+ this.fragmentMetaPath = path.join(this.packageRoot, "prisma", "fragments", `${fragment.name}.meta.json`);
74
+ this.migrationsSrcDir = path.join(this.packageRoot, "prisma", "migrations");
75
+ this.manifestSrcPath = path.join(this.migrationsSrcDir, "manifest.json");
76
+ this.lockFileName = `.app-kit-${fragment.name}.lock.json`;
77
+ }
78
+ fail(message) {
79
+ console.error(`${this.fragment.binName}: ${message}`);
80
+ process.exitCode = 1;
81
+ throw new SyncCliError(message);
82
+ }
83
+ readFragmentMeta() {
84
+ return readJson(this.fragmentMetaPath);
85
+ }
86
+ /** Every manifest entry for THIS fragment only — see the module doc comment on
87
+ * why the manifest is shared across fragments and how entries are disambiguated. */
88
+ readManifest() {
89
+ return readJson(this.manifestSrcPath).filter((entry) => entry.fragment === this.fragment.name);
90
+ }
91
+ lockFilePath(consumerRoot) {
92
+ return path.join(consumerRoot, this.lockFileName);
93
+ }
94
+ readLockFile(consumerRoot) {
95
+ const p = this.lockFilePath(consumerRoot);
96
+ if (!existsSync(p))
97
+ return null;
98
+ return readJson(p);
99
+ }
100
+ writeLockFile(consumerRoot, lock) {
101
+ writeFileSync(this.lockFilePath(consumerRoot), `${JSON.stringify(lock, null, 2)}\n`, "utf8");
102
+ }
103
+ // -------------------------------------------------------------------------
104
+ // Locating the consumer's Prisma schema folder via their prisma.config.ts
105
+ // -------------------------------------------------------------------------
106
+ static CONSUMER_CONFIG_CANDIDATES = [
107
+ "prisma.config.ts",
108
+ "prisma.config.mts",
109
+ "prisma.config.js",
110
+ "prisma.config.mjs",
111
+ ];
112
+ findConsumerConfigFile(consumerRoot) {
113
+ for (const candidate of SyncEngine.CONSUMER_CONFIG_CANDIDATES) {
114
+ const p = path.join(consumerRoot, candidate);
115
+ if (existsSync(p))
116
+ return p;
117
+ }
118
+ this.fail(`could not find a prisma.config.{ts,mts,js,mjs} in ${consumerRoot}. ` +
119
+ `${this.fragment.binName} reads this file to find your Prisma schema folder — it does not assume a path.`);
120
+ }
121
+ /**
122
+ * Best-effort read of the consumer's `schema` setting out of their
123
+ * prisma.config.ts default export. Supports the shapes Prisma's config API has
124
+ * used: a bare string path (file or folder), or `{ path: string }`. Relies on
125
+ * Node's native TypeScript type-stripping (unflagged as of the Node 24 baseline
126
+ * this package requires) to import a .ts file directly — if the consumer's config
127
+ * uses syntax that isn't erasable (enums, namespaces, parameter properties, etc.)
128
+ * this import will fail, and that failure is surfaced as-is rather than swallowed.
129
+ */
130
+ async loadConsumerSchemaPath(consumerRoot) {
131
+ const configFile = this.findConsumerConfigFile(consumerRoot);
132
+ let mod;
133
+ try {
134
+ mod = await import(pathToFileURL(configFile).href);
135
+ }
136
+ catch (err) {
137
+ this.fail(`failed to load ${configFile}: ${err.message}\n` +
138
+ `If this config file uses TypeScript syntax that Node can't type-strip natively ` +
139
+ `(enums, namespaces, decorators, ...), ${this.fragment.binName} can't import it directly.`);
140
+ }
141
+ const config = mod.default ?? mod;
142
+ const schema = config?.schema;
143
+ let schemaPath;
144
+ if (typeof schema === "string") {
145
+ schemaPath = schema;
146
+ }
147
+ else if (schema &&
148
+ typeof schema === "object" &&
149
+ typeof schema.path === "string") {
150
+ schemaPath = schema.path;
151
+ }
152
+ if (!schemaPath) {
153
+ this.fail(`could not find a "schema" path in ${configFile}'s default export. ` +
154
+ `Expected \`defineConfig({ schema: "prisma/schema" })\` (or a { path } object).`);
155
+ }
156
+ return path.resolve(path.dirname(configFile), schemaPath);
157
+ }
158
+ /** Resolve the folder <fragment>.prisma gets copied into, from the config's
159
+ * schema path (which may point at the folder itself, or at a single schema file
160
+ * inside it, e.g. "prisma/schema.prisma"). */
161
+ resolveSchemaFolder(schemaPath) {
162
+ if (schemaPath.endsWith(".prisma")) {
163
+ return path.dirname(schemaPath);
164
+ }
165
+ return schemaPath;
166
+ }
167
+ /** The conventional "prisma root" a schema folder sits under, used to locate (or
168
+ * create) the sibling `migrations/` directory. For the common multi-file layout
169
+ * `prisma/schema/*.prisma`, that's `prisma/`; for a flat `prisma/schema.prisma`
170
+ * layout, `resolveSchemaFolder` already returned `prisma/`, so this is a no-op. */
171
+ resolvePrismaRoot(schemaFolder) {
172
+ return path.basename(schemaFolder) === "schema"
173
+ ? path.dirname(schemaFolder)
174
+ : schemaFolder;
175
+ }
176
+ // -------------------------------------------------------------------------
177
+ // Shelling out to the consumer's local `prisma`
178
+ // -------------------------------------------------------------------------
179
+ runPrisma(args, cwd) {
180
+ // On Windows, npx resolves to npx.cmd, a shell script — node:child_process's
181
+ // spawnSync can't exec it directly (EINVAL) without shell:true, and shell:true
182
+ // with an argument array is an unescaped-concatenation footgun (path arguments
183
+ // here can contain spaces). cross-spawn resolves and correctly quotes .cmd/.bat
184
+ // executables on Windows without going through a shell at all.
185
+ const result = spawn.sync("npx", ["prisma", ...args], { cwd, stdio: "inherit" });
186
+ if (result.error) {
187
+ this.fail(`failed to run "npx prisma ${args.join(" ")}": ${result.error.message}`);
188
+ }
189
+ if (result.status !== 0) {
190
+ this.fail(`"npx prisma ${args.join(" ")}" exited with code ${result.status}`);
191
+ }
192
+ }
193
+ // -------------------------------------------------------------------------
194
+ // File copying
195
+ // -------------------------------------------------------------------------
196
+ copyFragment(schemaFolder) {
197
+ mkdirSync(schemaFolder, { recursive: true });
198
+ copyFileSync(this.fragmentSrcPath, path.join(schemaFolder, `${this.fragment.name}.prisma`));
199
+ }
200
+ copyMigration(migrationId, migrationsDestDir) {
201
+ const srcDir = path.join(this.migrationsSrcDir, migrationId);
202
+ const destDir = path.join(migrationsDestDir, migrationId);
203
+ mkdirSync(destDir, { recursive: true });
204
+ cpSync(srcDir, destDir, { recursive: true });
205
+ }
206
+ // -------------------------------------------------------------------------
207
+ // Subcommands
208
+ // -------------------------------------------------------------------------
209
+ async cmdInit(consumerRoot) {
210
+ const bin = this.fragment.binName;
211
+ const schemaPath = await this.loadConsumerSchemaPath(consumerRoot);
212
+ const schemaFolder = this.resolveSchemaFolder(schemaPath);
213
+ const prismaRoot = this.resolvePrismaRoot(schemaFolder);
214
+ const migrationsDestDir = path.join(prismaRoot, "migrations");
215
+ console.log(`${bin}: copying ${this.fragment.name}.prisma into ${schemaFolder}`);
216
+ this.copyFragment(schemaFolder);
217
+ console.log(`${bin}: running "npx prisma validate" against ${consumerRoot}`);
218
+ this.runPrisma(["validate"], consumerRoot);
219
+ const manifest = this.readManifest();
220
+ const appliedMigrations = [];
221
+ for (const entry of manifest) {
222
+ console.log(`${bin}: copying migration ${entry.id} into ${migrationsDestDir}`);
223
+ this.copyMigration(entry.id, migrationsDestDir);
224
+ const migrationSqlPath = path.join(migrationsDestDir, entry.id, "migration.sql");
225
+ console.log(`${bin}: applying ${entry.id} via "npx prisma db execute"`);
226
+ this.runPrisma(
227
+ // Prisma ORM v7's `db execute` no longer accepts `--schema` at all — the
228
+ // datasource URL comes only from the consumer's prisma.config.ts now (same
229
+ // "config file, not CLI flags" migration documented on flytedesk-id's own
230
+ // prisma.config.ts). Passing --schema here is a hard CLI usage error
231
+ // ("unknown or unexpected option: --schema") against a real Prisma 7 install,
232
+ // confirmed while building examples/hello-world.
233
+ ["db", "execute", "--file", migrationSqlPath], consumerRoot);
234
+ appliedMigrations.push(entry.id);
235
+ }
236
+ const meta = this.readFragmentMeta();
237
+ this.writeLockFile(consumerRoot, {
238
+ fragmentVersion: meta.fragmentVersion,
239
+ fragmentChecksum: sha256File(this.fragmentSrcPath),
240
+ appliedMigrations,
241
+ lastSyncedAt: new Date().toISOString(),
242
+ });
243
+ console.log(`${bin}: wrote ${this.lockFilePath(consumerRoot)}`);
244
+ console.log(`${bin}: init complete.`);
245
+ }
246
+ computePending(consumerRoot) {
247
+ const lock = this.readLockFile(consumerRoot);
248
+ if (!lock) {
249
+ this.fail(`no ${this.lockFileName} found at ${consumerRoot}. Run "${this.fragment.binName} init" first.`);
250
+ }
251
+ const meta = this.readFragmentMeta();
252
+ const manifest = this.readManifest();
253
+ const applied = new Set(lock.appliedMigrations);
254
+ const pendingMigrations = manifest.filter((entry) => !applied.has(entry.id));
255
+ return {
256
+ fragmentVersionCurrent: meta.fragmentVersion,
257
+ fragmentVersionInstalled: lock.fragmentVersion,
258
+ fragmentVersionChanged: meta.fragmentVersion !== lock.fragmentVersion,
259
+ pendingMigrations,
260
+ };
261
+ }
262
+ cmdDiff(consumerRoot) {
263
+ const report = this.computePending(consumerRoot);
264
+ if (report.fragmentVersionChanged) {
265
+ console.log(`fragment version: ${report.fragmentVersionInstalled} -> ${report.fragmentVersionCurrent} (changed)`);
266
+ }
267
+ else {
268
+ console.log(`fragment version: ${report.fragmentVersionCurrent} (up to date)`);
269
+ }
270
+ if (report.pendingMigrations.length === 0) {
271
+ console.log("migrations: up to date, nothing pending.");
272
+ return;
273
+ }
274
+ console.log(`migrations: ${report.pendingMigrations.length} pending:`);
275
+ for (const entry of report.pendingMigrations) {
276
+ console.log(` - ${entry.id} (introduced in fragment ${entry.introducedInFragmentVersion})`);
277
+ }
278
+ console.log(`${this.fragment.binName} diff is read-only. Run "${this.fragment.binName} apply" to apply these.`);
279
+ }
280
+ async cmdApply(consumerRoot) {
281
+ const bin = this.fragment.binName;
282
+ const report = this.computePending(consumerRoot);
283
+ const schemaPath = await this.loadConsumerSchemaPath(consumerRoot);
284
+ const schemaFolder = this.resolveSchemaFolder(schemaPath);
285
+ const prismaRoot = this.resolvePrismaRoot(schemaFolder);
286
+ const migrationsDestDir = path.join(prismaRoot, "migrations");
287
+ console.log(`${bin}: refreshing ${this.fragment.name}.prisma in ${schemaFolder}`);
288
+ this.copyFragment(schemaFolder);
289
+ const lock = this.readLockFile(consumerRoot);
290
+ if (!lock) {
291
+ this.fail(`no ${this.lockFileName} found at ${consumerRoot}. Run "${bin} init" first.`);
292
+ }
293
+ const appliedMigrations = [...lock.appliedMigrations];
294
+ if (report.pendingMigrations.length === 0) {
295
+ console.log(`${bin}: no pending migrations to apply.`);
296
+ }
297
+ for (const entry of report.pendingMigrations) {
298
+ console.log(`${bin}: copying migration ${entry.id} into ${migrationsDestDir}`);
299
+ this.copyMigration(entry.id, migrationsDestDir);
300
+ const migrationSqlPath = path.join(migrationsDestDir, entry.id, "migration.sql");
301
+ console.log(`${bin}: applying ${entry.id} via "npx prisma db execute"`);
302
+ this.runPrisma(
303
+ // See the matching comment in cmdInit above — Prisma 7's `db execute` has no
304
+ // --schema flag; the datasource comes from the consumer's prisma.config.ts.
305
+ ["db", "execute", "--file", migrationSqlPath], consumerRoot);
306
+ appliedMigrations.push(entry.id);
307
+ }
308
+ const meta = this.readFragmentMeta();
309
+ this.writeLockFile(consumerRoot, {
310
+ fragmentVersion: meta.fragmentVersion,
311
+ fragmentChecksum: sha256File(this.fragmentSrcPath),
312
+ appliedMigrations,
313
+ lastSyncedAt: new Date().toISOString(),
314
+ });
315
+ console.log(`${bin}: wrote ${this.lockFilePath(consumerRoot)}`);
316
+ console.log(`${bin}: apply complete.`);
317
+ }
318
+ async cmdStatus(consumerRoot) {
319
+ const lock = this.readLockFile(consumerRoot);
320
+ if (!lock) {
321
+ console.log(`no ${this.lockFileName} found at ${consumerRoot}. Not yet initialized — run "${this.fragment.binName} init".`);
322
+ return;
323
+ }
324
+ console.log(`fragment version (installed): ${lock.fragmentVersion}`);
325
+ console.log(`fragment version (package): ${this.readFragmentMeta().fragmentVersion}`);
326
+ console.log(`last synced: ${lock.lastSyncedAt}`);
327
+ console.log(`applied migrations (${lock.appliedMigrations.length}):`);
328
+ for (const id of lock.appliedMigrations) {
329
+ console.log(` - ${id}`);
330
+ }
331
+ try {
332
+ const schemaPath = await this.loadConsumerSchemaPath(consumerRoot);
333
+ const schemaFolder = this.resolveSchemaFolder(schemaPath);
334
+ const copiedFragmentPath = path.join(schemaFolder, `${this.fragment.name}.prisma`);
335
+ if (!existsSync(copiedFragmentPath)) {
336
+ console.log(`fragment copy: MISSING at ${copiedFragmentPath}`);
337
+ return;
338
+ }
339
+ const installedChecksum = sha256File(copiedFragmentPath);
340
+ if (installedChecksum === lock.fragmentChecksum) {
341
+ console.log("fragment copy: unmodified");
342
+ }
343
+ else {
344
+ console.log(`fragment copy: CHECKSUM MISMATCH — ${copiedFragmentPath} has been hand-edited ` +
345
+ `(or is out of sync with the lock file)`);
346
+ }
347
+ }
348
+ catch (err) {
349
+ console.log(`fragment copy: could not verify (${err.message})`);
350
+ }
351
+ }
352
+ }
353
+ // ---------------------------------------------------------------------------
354
+ // Entry point shared by every fragment's bin wrapper
355
+ // ---------------------------------------------------------------------------
356
+ const SUBCOMMANDS = ["init", "diff", "apply", "status"];
357
+ function isSubcommand(value) {
358
+ return SUBCOMMANDS.includes(value);
359
+ }
360
+ /**
361
+ * Runs one CLI invocation for the given fragment. Called by each bin wrapper
362
+ * (src/cli/trace-sync.ts, src/cli/profile-sync.ts) with `process.argv.slice(2)`.
363
+ */
364
+ export async function runSyncCli(argv, fragment) {
365
+ const [subcommand, ...rest] = argv;
366
+ if (!isSubcommand(subcommand)) {
367
+ console.error(`usage: ${fragment.binName} <${SUBCOMMANDS.join("|")}>`);
368
+ process.exitCode = 1;
369
+ return;
370
+ }
371
+ // Reserved for a future --cwd override; today every sync CLI always operates on
372
+ // the directory it's invoked from, which is how `npx <bin> ...` / an npm script in
373
+ // the consumer's own package.json will run it.
374
+ void rest;
375
+ const consumerRoot = process.cwd();
376
+ const engine = new SyncEngine(fragment);
377
+ switch (subcommand) {
378
+ case "init":
379
+ await engine.cmdInit(consumerRoot);
380
+ break;
381
+ case "diff":
382
+ engine.cmdDiff(consumerRoot);
383
+ break;
384
+ case "apply":
385
+ await engine.cmdApply(consumerRoot);
386
+ break;
387
+ case "status":
388
+ await engine.cmdStatus(consumerRoot);
389
+ break;
390
+ }
391
+ }
392
+ //# sourceMappingURL=sync-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-engine.js","sourceRoot":"","sources":["../../src/cli/sync-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,MAAM,aAAa,CAAC;AAChC,OAAO,EACL,YAAY,EACZ,MAAM,EACN,UAAU,EACV,SAAS,EACT,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAgBxD,MAAM,OAAO,YAAa,SAAQ,KAAK;CAAG;AA0B1C,SAAS,QAAQ,CAAI,QAAgB;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAM,CAAC;AACzD,CAAC;AAED,SAAS,MAAM,CAAC,OAAwB;IACtC,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB;IAClC,OAAO,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,8EAA8E;AAC9E,0EAA0E;AAC1E,8EAA8E;AAE9E,MAAM,UAAU;IAQe;IAPZ,WAAW,CAAS;IACpB,eAAe,CAAS;IACxB,gBAAgB,CAAS;IACzB,gBAAgB,CAAS;IACzB,eAAe,CAAS;IACxB,YAAY,CAAS;IAEtC,YAA6B,QAAsB;QAAtB,aAAQ,GAAR,QAAQ,CAAc;QACjD,uEAAuE;QACvE,8CAA8C;QAC9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAC7B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAC5C,IAAI,EACJ,IAAI,CACL,CAAC;QACF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,CAC9B,IAAI,CAAC,WAAW,EAChB,QAAQ,EACR,WAAW,EACX,GAAG,QAAQ,CAAC,IAAI,SAAS,CAC1B,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAC/B,IAAI,CAAC,WAAW,EAChB,QAAQ,EACR,WAAW,EACX,GAAG,QAAQ,CAAC,IAAI,YAAY,CAC7B,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC5E,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;QACzE,IAAI,CAAC,YAAY,GAAG,YAAY,QAAQ,CAAC,IAAI,YAAY,CAAC;IAC5D,CAAC;IAEO,IAAI,CAAC,OAAe;QAC1B,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAEO,gBAAgB;QACtB,OAAO,QAAQ,CAAe,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACvD,CAAC;IAED;yFACqF;IAC7E,YAAY;QAClB,OAAO,QAAQ,CAA2B,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CACpE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CACjD,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,YAAoB;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC;IAEO,YAAY,CAAC,YAAoB;QACvC,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAChC,OAAO,QAAQ,CAAW,CAAC,CAAC,CAAC;IAC/B,CAAC;IAEO,aAAa,CAAC,YAAoB,EAAE,IAAc;QACxD,aAAa,CACX,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAC/B,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACpC,MAAM,CACP,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,0EAA0E;IAC1E,4EAA4E;IAEpE,MAAM,CAAU,0BAA0B,GAAG;QACnD,kBAAkB;QAClB,mBAAmB;QACnB,kBAAkB;QAClB,mBAAmB;KACpB,CAAC;IAEM,sBAAsB,CAAC,YAAoB;QACjD,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,0BAA0B,EAAE,CAAC;YAC9D,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YAC7C,IAAI,UAAU,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,IAAI,CACP,qDAAqD,YAAY,IAAI;YACnE,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,iFAAiF,CAC5G,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,sBAAsB,CAAC,YAAoB;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,GAAY,CAAC;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CACP,kBAAkB,UAAU,KAAM,GAAa,CAAC,OAAO,IAAI;gBACzD,iFAAiF;gBACjF,yCAAyC,IAAI,CAAC,QAAQ,CAAC,OAAO,4BAA4B,CAC7F,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAI,GAA6B,CAAC,OAAO,IAAI,GAAG,CAAC;QAC7D,MAAM,MAAM,GAAI,MAA2C,EAAE,MAAM,CAAC;QAEpE,IAAI,UAA8B,CAAC;QACnC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC;aAAM,IACL,MAAM;YACN,OAAO,MAAM,KAAK,QAAQ;YAC1B,OAAQ,MAA6B,CAAC,IAAI,KAAK,QAAQ,EACvD,CAAC;YACD,UAAU,GAAI,MAA2B,CAAC,IAAI,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CACP,qCAAqC,UAAU,qBAAqB;gBAClE,gFAAgF,CACnF,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;IAC5D,CAAC;IAED;;mDAE+C;IACvC,mBAAmB,CAAC,UAAkB;QAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;wFAGoF;IAC5E,iBAAiB,CAAC,YAAoB;QAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,QAAQ;YAC7C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;YAC5B,CAAC,CAAC,YAAY,CAAC;IACnB,CAAC;IAED,4EAA4E;IAC5E,gDAAgD;IAChD,4EAA4E;IAEpE,SAAS,CAAC,IAAc,EAAE,GAAW;QAC3C,6EAA6E;QAC7E,+EAA+E;QAC/E,+EAA+E;QAC/E,gFAAgF;QAChF,+DAA+D;QAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACjF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,6BAA6B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,eAAe;IACf,4EAA4E;IAEpE,YAAY,CAAC,YAAoB;QACvC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;IAC9F,CAAC;IAEO,aAAa,CAAC,WAAmB,EAAE,iBAAyB;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;QAC1D,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,4EAA4E;IAC5E,cAAc;IACd,4EAA4E;IAE5E,KAAK,CAAC,OAAO,CAAC,YAAoB;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAClC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;QACnE,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAE9D,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,aAAa,IAAI,CAAC,QAAQ,CAAC,IAAI,gBAAgB,YAAY,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAEhC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,2CAA2C,YAAY,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;QAE3C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACrC,MAAM,iBAAiB,GAAa,EAAE,CAAC;QACvC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,uBAAuB,KAAK,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC,CAAC;YAC/E,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;YAEhD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,cAAc,KAAK,CAAC,EAAE,8BAA8B,CAAC,CAAC;YACxE,IAAI,CAAC,SAAS;YACZ,yEAAyE;YACzE,2EAA2E;YAC3E,0EAA0E;YAC1E,qEAAqE;YACrE,8EAA8E;YAC9E,iDAAiD;YACjD,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EAC7C,YAAY,CACb,CAAC;YACF,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;YAC/B,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,gBAAgB,EAAE,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC;YAClD,iBAAiB;YACjB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,WAAW,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,kBAAkB,CAAC,CAAC;IACxC,CAAC;IAEO,cAAc,CAAC,YAAoB;QAMzC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,CACP,MAAM,IAAI,CAAC,YAAY,aAAa,YAAY,UAAU,IAAI,CAAC,QAAQ,CAAC,OAAO,eAAe,CAC/F,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7E,OAAO;YACL,sBAAsB,EAAE,IAAI,CAAC,eAAe;YAC5C,wBAAwB,EAAE,IAAI,CAAC,eAAe;YAC9C,sBAAsB,EAAE,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,eAAe;YACrE,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,YAAoB;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC,sBAAsB,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CACT,qBAAqB,MAAM,CAAC,wBAAwB,OAAO,MAAM,CAAC,sBAAsB,YAAY,CACrG,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,sBAAsB,eAAe,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,MAAM,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,iBAAiB,CAAC,MAAM,WAAW,CAAC,CAAC;QACvE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,EAAE,4BAA4B,KAAK,CAAC,2BAA2B,GAAG,CAAC,CAAC;QAC/F,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,4BAA4B,IAAI,CAAC,QAAQ,CAAC,OAAO,yBAAyB,CAAC,CAAC;IAClH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,YAAoB;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;QACnE,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAE9D,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,gBAAgB,IAAI,CAAC,QAAQ,CAAC,IAAI,cAAc,YAAY,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAEhC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,aAAa,YAAY,UAAU,GAAG,eAAe,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAEtD,IAAI,MAAM,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,mCAAmC,CAAC,CAAC;QACzD,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,uBAAuB,KAAK,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC,CAAC;YAC/E,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;YAEhD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,cAAc,KAAK,CAAC,EAAE,8BAA8B,CAAC,CAAC;YACxE,IAAI,CAAC,SAAS;YACZ,6EAA6E;YAC7E,4EAA4E;YAC5E,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EAC7C,YAAY,CACb,CAAC;YACF,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;YAC/B,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,gBAAgB,EAAE,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC;YAClD,iBAAiB;YACjB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,WAAW,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,mBAAmB,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,YAAoB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CACT,MAAM,IAAI,CAAC,YAAY,aAAa,YAAY,gCAAgC,IAAI,CAAC,QAAQ,CAAC,OAAO,SAAS,CAC/G,CAAC;YACF,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,gBAAgB,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,iBAAiB,CAAC,MAAM,IAAI,CAAC,CAAC;QACtE,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;YACnE,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC1D,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC;YACnF,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,6CAA6C,kBAAkB,EAAE,CAAC,CAAC;gBAC/E,OAAO;YACT,CAAC;YACD,MAAM,iBAAiB,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;YACzD,IAAI,iBAAiB,KAAK,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,sDAAsD,kBAAkB,wBAAwB;oBAC9F,wCAAwC,CAC3C,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,oDAAqD,GAAa,CAAC,OAAO,GAAG,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;;AAGH,8EAA8E;AAC9E,qDAAqD;AACrD,8EAA8E;AAE9E,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAC;AAGjE,SAAS,YAAY,CAAC,KAAyB;IAC7C,OAAO,WAAW,CAAC,QAAQ,CAAC,KAAmB,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc,EAAE,QAAsB;IACrE,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACnC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,UAAU,QAAQ,CAAC,OAAO,KAAK,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,gFAAgF;IAChF,mFAAmF;IACnF,+CAA+C;IAC/C,KAAK,IAAI,CAAC;IACV,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;IAExC,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACnC,MAAM;QACR,KAAK,MAAM;YACT,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAC7B,MAAM;QACR,KAAK,OAAO;YACV,MAAM,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACpC,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACrC,MAAM;IACV,CAAC;AACH,CAAC"}