prisma-next 0.11.0 → 0.12.0-dev.10
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.mjs +259 -12
- package/dist/cli.mjs.map +1 -1
- package/dist/{client-oXO2WCPD.mjs → client-CDr4o07S.mjs} +88 -63
- package/dist/client-CDr4o07S.mjs.map +1 -0
- package/dist/{command-helpers-BSb0tRC8.mjs → command-helpers-Bbw1GbwL.mjs} +646 -46
- package/dist/command-helpers-Bbw1GbwL.mjs.map +1 -0
- package/dist/commands/contract-emit.d.mts.map +1 -1
- package/dist/commands/contract-emit.mjs +1 -1
- package/dist/commands/contract-infer.d.mts.map +1 -1
- package/dist/commands/contract-infer.mjs +1 -1
- package/dist/commands/db-init.d.mts.map +1 -1
- package/dist/commands/db-init.mjs +32 -7
- package/dist/commands/db-init.mjs.map +1 -1
- package/dist/commands/db-schema.d.mts.map +1 -1
- package/dist/commands/db-schema.mjs +3 -4
- package/dist/commands/db-schema.mjs.map +1 -1
- package/dist/commands/db-sign.d.mts.map +1 -1
- package/dist/commands/db-sign.mjs +12 -10
- package/dist/commands/db-sign.mjs.map +1 -1
- package/dist/commands/db-update.d.mts.map +1 -1
- package/dist/commands/db-update.mjs +41 -11
- package/dist/commands/db-update.mjs.map +1 -1
- package/dist/commands/db-verify.d.mts.map +1 -1
- package/dist/commands/db-verify.mjs +1 -1
- package/dist/commands/migrate.d.mts +6 -2
- package/dist/commands/migrate.d.mts.map +1 -1
- package/dist/commands/migrate.mjs +75 -40
- package/dist/commands/migrate.mjs.map +1 -1
- package/dist/commands/migration-check.d.mts +4 -3
- package/dist/commands/migration-check.d.mts.map +1 -1
- package/dist/commands/migration-check.mjs +1 -280
- package/dist/commands/migration-graph.d.mts +31 -2
- package/dist/commands/migration-graph.d.mts.map +1 -1
- package/dist/commands/migration-graph.mjs +2 -137
- package/dist/commands/migration-list.d.mts +64 -4
- package/dist/commands/migration-list.d.mts.map +1 -1
- package/dist/commands/migration-list.mjs +143 -56
- package/dist/commands/migration-list.mjs.map +1 -1
- package/dist/commands/migration-log.d.mts +10 -1
- package/dist/commands/migration-log.d.mts.map +1 -1
- package/dist/commands/migration-log.mjs +10 -15
- package/dist/commands/migration-log.mjs.map +1 -1
- package/dist/commands/migration-new.d.mts.map +1 -1
- package/dist/commands/migration-new.mjs +32 -38
- package/dist/commands/migration-new.mjs.map +1 -1
- package/dist/commands/migration-plan.d.mts +3 -2
- package/dist/commands/migration-plan.d.mts.map +1 -1
- package/dist/commands/migration-plan.mjs +1 -1
- package/dist/commands/migration-show.d.mts +4 -55
- package/dist/commands/migration-show.d.mts.map +1 -1
- package/dist/commands/migration-show.mjs +61 -153
- package/dist/commands/migration-show.mjs.map +1 -1
- package/dist/commands/migration-status.d.mts +12 -49
- package/dist/commands/migration-status.d.mts.map +1 -1
- package/dist/commands/migration-status.mjs +86 -82
- package/dist/commands/migration-status.mjs.map +1 -1
- package/dist/commands/ref.d.mts +1 -1
- package/dist/commands/ref.d.mts.map +1 -1
- package/dist/commands/ref.mjs +38 -10
- package/dist/commands/ref.mjs.map +1 -1
- package/dist/config-loader-B6sJjXTv.mjs.map +1 -1
- package/dist/config-loader.d.mts.map +1 -1
- package/dist/contract-at-errors-BxP-TOMl.mjs +42 -0
- package/dist/contract-at-errors-BxP-TOMl.mjs.map +1 -0
- package/dist/{contract-emit-bcrpT-wD.mjs → contract-emit-D-4jrNve.mjs} +25 -10
- package/dist/contract-emit-D-4jrNve.mjs.map +1 -0
- package/dist/{contract-emit-r4y8Zhf1.mjs → contract-emit-DxcGl4Uq.mjs} +19 -14
- package/dist/contract-emit-DxcGl4Uq.mjs.map +1 -0
- package/dist/{contract-enrichment-Dani0mMW.mjs → contract-enrichment-a0V5Y_mL.mjs} +4 -25
- package/dist/contract-enrichment-a0V5Y_mL.mjs.map +1 -0
- package/dist/{contract-infer-BmySmqVT.mjs → contract-infer-C8J1WMvO.mjs} +4 -5
- package/dist/{contract-infer-BmySmqVT.mjs.map → contract-infer-C8J1WMvO.mjs.map} +1 -1
- package/dist/contract-space-aggregate-loader-DvZwdkrr.mjs +247 -0
- package/dist/contract-space-aggregate-loader-DvZwdkrr.mjs.map +1 -0
- package/dist/{db-verify-BClPs3ph.mjs → db-verify-BeRHwN8M.mjs} +5 -7
- package/dist/{db-verify-BClPs3ph.mjs.map → db-verify-BeRHwN8M.mjs.map} +1 -1
- package/dist/exports/control-api.d.mts +3 -3
- package/dist/exports/control-api.d.mts.map +1 -1
- package/dist/exports/control-api.mjs +3 -3
- package/dist/exports/index.d.mts.map +1 -1
- package/dist/exports/index.mjs +1 -1
- package/dist/exports/index.mjs.map +1 -1
- package/dist/exports/init-output.d.mts.map +1 -1
- package/dist/exports/init-output.mjs +1 -1
- package/dist/extension-pack-inputs-IDvjRCi3.mjs +62 -0
- package/dist/extension-pack-inputs-IDvjRCi3.mjs.map +1 -0
- package/dist/{framework-components-65gOHkHB.mjs → framework-components-fYXjz_in.mjs} +2 -2
- package/dist/{framework-components-65gOHkHB.mjs.map → framework-components-fYXjz_in.mjs.map} +1 -1
- package/dist/global-flags-DEHjV8_s.d.mts +34 -0
- package/dist/global-flags-DEHjV8_s.d.mts.map +1 -0
- package/dist/{graph-render-DJVv0_uf.mjs → graph-render-rFAqZujX.mjs} +2 -2
- package/dist/{graph-render-DJVv0_uf.mjs.map → graph-render-rFAqZujX.mjs.map} +1 -1
- package/dist/{init-BCJZPWE1.mjs → init-Cv9UzWL5.mjs} +20 -269
- package/dist/init-Cv9UzWL5.mjs.map +1 -0
- package/dist/{inspect-live-schema-DSRbFoOL.mjs → inspect-live-schema-BlKR2Zln.mjs} +4 -5
- package/dist/{inspect-live-schema-DSRbFoOL.mjs.map → inspect-live-schema-BlKR2Zln.mjs.map} +1 -1
- package/dist/migration-check-BiBJoYYW.mjs +341 -0
- package/dist/migration-check-BiBJoYYW.mjs.map +1 -0
- package/dist/migration-cli.d.mts.map +1 -1
- package/dist/migration-cli.mjs +4 -4
- package/dist/migration-cli.mjs.map +1 -1
- package/dist/{migration-command-scaffold-Bzd9La5c.mjs → migration-command-scaffold-BAGUiGOK.mjs} +4 -5
- package/dist/{migration-command-scaffold-Bzd9La5c.mjs.map → migration-command-scaffold-BAGUiGOK.mjs.map} +1 -1
- package/dist/migration-graph-C9WC-7eO.mjs +1478 -0
- package/dist/migration-graph-C9WC-7eO.mjs.map +1 -0
- package/dist/migration-list-styler-BRwF4-gy.mjs +399 -0
- package/dist/migration-list-styler-BRwF4-gy.mjs.map +1 -0
- package/dist/{migration-plan-CFwqw3Gk.mjs → migration-plan-9DJ7q7_z.mjs} +372 -133
- package/dist/migration-plan-9DJ7q7_z.mjs.map +1 -0
- package/dist/{migration-types-BXWvz12q.d.mts → migration-types-D2FW63pr.d.mts} +1 -1
- package/dist/{migration-types-BXWvz12q.d.mts.map → migration-types-D2FW63pr.d.mts.map} +1 -1
- package/dist/{migrations-CwZMa1Ck.mjs → migrations-Cv2jxNNK.mjs} +12 -13
- package/dist/migrations-Cv2jxNNK.mjs.map +1 -0
- package/dist/{output-BlsrGMEF.mjs → output-B60Gw5fu.mjs} +1 -1
- package/dist/{output-BlsrGMEF.mjs.map → output-B60Gw5fu.mjs.map} +1 -1
- package/dist/{progress-adapter-DFfvZcYL.mjs → progress-adapter-C644QK8l.mjs} +1 -1
- package/dist/{progress-adapter-DFfvZcYL.mjs.map → progress-adapter-C644QK8l.mjs.map} +1 -1
- package/dist/ref-advancement-DUZqsue6.mjs +50 -0
- package/dist/ref-advancement-DUZqsue6.mjs.map +1 -0
- package/dist/terminal-ui-5Y6mrg93.d.mts +133 -0
- package/dist/terminal-ui-5Y6mrg93.d.mts.map +1 -0
- package/dist/{types--CqjMdk0.d.mts → types-CeC5ec2Y.d.mts} +35 -29
- package/dist/types-CeC5ec2Y.d.mts.map +1 -0
- package/dist/{verify-Bom75OYI.mjs → verify-DCA9Sldu.mjs} +2 -2
- package/dist/{verify-Bom75OYI.mjs.map → verify-DCA9Sldu.mjs.map} +1 -1
- package/package.json +28 -17
- package/dist/cli-errors-Czmx92Zy.d.mts +0 -3
- package/dist/cli-errors-Djtz98Vm.mjs +0 -71
- package/dist/cli-errors-Djtz98Vm.mjs.map +0 -1
- package/dist/client-oXO2WCPD.mjs.map +0 -1
- package/dist/command-helpers-BSb0tRC8.mjs.map +0 -1
- package/dist/commands/migration-check.mjs.map +0 -1
- package/dist/commands/migration-graph.mjs.map +0 -1
- package/dist/contract-emit-bcrpT-wD.mjs.map +0 -1
- package/dist/contract-emit-r4y8Zhf1.mjs.map +0 -1
- package/dist/contract-enrichment-Dani0mMW.mjs.map +0 -1
- package/dist/contract-space-aggregate-loader-BmNQwlws.mjs +0 -160
- package/dist/contract-space-aggregate-loader-BmNQwlws.mjs.map +0 -1
- package/dist/global-flags-CdE7M0d9.d.mts +0 -15
- package/dist/global-flags-CdE7M0d9.d.mts.map +0 -1
- package/dist/init-BCJZPWE1.mjs.map +0 -1
- package/dist/migration-plan-CFwqw3Gk.mjs.map +0 -1
- package/dist/migrations-CwZMa1Ck.mjs.map +0 -1
- package/dist/rolldown-runtime-twds-ZHy.mjs +0 -14
- package/dist/terminal-ui-BiB_8KNo.mjs +0 -379
- package/dist/terminal-ui-BiB_8KNo.mjs.map +0 -1
- package/dist/types--CqjMdk0.d.mts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration-check.d.mts","names":[],"sources":["../../src/commands/migration-check.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"migration-check.d.mts","names":[],"sources":["../../src/utils/integrity-violation-to-check-failure.ts","../../src/commands/migration-check.ts"],"mappings":";;UAGiB,YAAA;EAAA,SACN,MAAA;EAAA,SACA,KAAA;EAAA,SACA,GAAA;EAAA,SACA,GAAA;AAAA;;;UCgCM,oBAAA;EAAA,SACN,EAAA;EAAA,SACA,QAAA,WAAmB,YAAY;EAAA,SAC/B,OAAA;AAAA;AAAA,iBAsOK,2BAAA,CAAA,GAA+B,OAAO"}
|
|
@@ -1,281 +1,2 @@
|
|
|
1
|
-
import { t as
|
|
2
|
-
import { t as createTerminalUI } from "../terminal-ui-BiB_8KNo.mjs";
|
|
3
|
-
import { S as formatStyledHeader, a as loadMigrationPackages, d as setCommandDescriptions, f as setCommandExamples, l as resolveMigrationPaths, p as setCommandSeeAlso, t as addGlobalOptions, v as parseGlobalFlagsOrExit } from "../command-helpers-BSb0tRC8.mjs";
|
|
4
|
-
import { Command } from "commander";
|
|
5
|
-
import { join, relative } from "pathe";
|
|
6
|
-
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
7
|
-
import { MigrationToolsError } from "@prisma-next/migration-tools/errors";
|
|
8
|
-
import { parseMigrationRef } from "@prisma-next/migration-tools/ref-resolution";
|
|
9
|
-
import { readRefs } from "@prisma-next/migration-tools/refs";
|
|
10
|
-
import { verifyMigrationHash } from "@prisma-next/migration-tools/hash";
|
|
11
|
-
//#region src/commands/migration-check.ts
|
|
12
|
-
/**
|
|
13
|
-
* Canonical user-facing locator for a check failure: the cwd-relative path
|
|
14
|
-
* to the migration package directory. Surfacing the same shape across every
|
|
15
|
-
* PN code means `--json` consumers can branch uniformly on `where`.
|
|
16
|
-
*/
|
|
17
|
-
function migrationPathRelative(dirPath) {
|
|
18
|
-
return relative(process.cwd(), dirPath);
|
|
19
|
-
}
|
|
20
|
-
function migrationFileRelative(dirPath, fileName) {
|
|
21
|
-
return join(migrationPathRelative(dirPath), fileName);
|
|
22
|
-
}
|
|
23
|
-
function checkFileExists(dirPath, dirName, fileName) {
|
|
24
|
-
if (!existsSync(join(dirPath, fileName))) return {
|
|
25
|
-
pnCode: "PN-MIG-CHECK-002",
|
|
26
|
-
where: migrationFileRelative(dirPath, fileName),
|
|
27
|
-
why: `${fileName} is missing from ${dirName}`,
|
|
28
|
-
fix: "Re-emit the migration package or restore from version control."
|
|
29
|
-
};
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Within-migration snapshot-consistency check (PN-MIG-CHECK-005).
|
|
34
|
-
*
|
|
35
|
-
* Compares the migration's stored `metadata.to` against the `storageHash`
|
|
36
|
-
* recorded in its on-disk `end-contract.json` snapshot. The two values are
|
|
37
|
-
* independent on-disk records of the same fact (the migration's destination
|
|
38
|
-
* contract); drift between them indicates the package is internally
|
|
39
|
-
* corrupt. Cross-migration consistency (one migration's end-contract.json
|
|
40
|
-
* agreeing with the next migration's start-contract.json) is a separate
|
|
41
|
-
* check that requires shadow execution and is deferred to
|
|
42
|
-
* `migration preflight`.
|
|
43
|
-
*
|
|
44
|
-
* Shared between the graph-wide and per-migration code paths so both report
|
|
45
|
-
* the same failure for the same on-disk state.
|
|
46
|
-
*/
|
|
47
|
-
function checkSnapshotConsistency(pkg) {
|
|
48
|
-
const endContractPath = join(pkg.dirPath, "end-contract.json");
|
|
49
|
-
if (!existsSync(endContractPath)) return null;
|
|
50
|
-
try {
|
|
51
|
-
const snapshotHash = JSON.parse(readFileSync(endContractPath, "utf-8"))["storage"]?.["storageHash"];
|
|
52
|
-
if (typeof snapshotHash === "string" && snapshotHash !== pkg.metadata.to) return {
|
|
53
|
-
pnCode: "PN-MIG-CHECK-005",
|
|
54
|
-
where: migrationPathRelative(pkg.dirPath),
|
|
55
|
-
why: `Migration "${pkg.dirName}" declares to=${pkg.metadata.to} but end-contract.json has storageHash=${snapshotHash}`,
|
|
56
|
-
fix: "Re-emit the migration package so migration.json and end-contract.json agree."
|
|
57
|
-
};
|
|
58
|
-
} catch {
|
|
59
|
-
return {
|
|
60
|
-
pnCode: "PN-MIG-CHECK-006",
|
|
61
|
-
where: migrationPathRelative(pkg.dirPath),
|
|
62
|
-
why: `Migration "${pkg.dirName}" has an unparseable end-contract.json.`,
|
|
63
|
-
fix: "Re-emit the migration package to repair the snapshot file."
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
async function executeMigrationCheckCommand(target, options, flags, ui) {
|
|
69
|
-
const config = await loadConfig(options.config);
|
|
70
|
-
const { configPath, appMigrationsDir, appMigrationsRelative, refsDir } = resolveMigrationPaths(options.config, config);
|
|
71
|
-
if (!flags.json && !flags.quiet) {
|
|
72
|
-
const details = [{
|
|
73
|
-
label: "config",
|
|
74
|
-
value: configPath
|
|
75
|
-
}, {
|
|
76
|
-
label: "migrations",
|
|
77
|
-
value: appMigrationsRelative
|
|
78
|
-
}];
|
|
79
|
-
if (target) details.push({
|
|
80
|
-
label: "target",
|
|
81
|
-
value: target
|
|
82
|
-
});
|
|
83
|
-
const header = formatStyledHeader({
|
|
84
|
-
command: "migration check",
|
|
85
|
-
description: "Verify artifact and graph integrity",
|
|
86
|
-
details,
|
|
87
|
-
flags
|
|
88
|
-
});
|
|
89
|
-
ui.stderr(header);
|
|
90
|
-
}
|
|
91
|
-
const failures = [];
|
|
92
|
-
let bundles;
|
|
93
|
-
let graph;
|
|
94
|
-
try {
|
|
95
|
-
const loaded = await loadMigrationPackages(appMigrationsDir);
|
|
96
|
-
bundles = loaded.bundles;
|
|
97
|
-
graph = loaded.graph;
|
|
98
|
-
} catch (error) {
|
|
99
|
-
if (MigrationToolsError.is(error)) {
|
|
100
|
-
const pnCode = error.code === "MIGRATION.HASH_MISMATCH" ? "PN-MIG-CHECK-001" : "PN-MIG-CHECK-002";
|
|
101
|
-
const rawWhere = error.details?.["dir"] ?? error.details?.["filePath"] ?? null;
|
|
102
|
-
const where = rawWhere ? relative(process.cwd(), rawWhere) : "unknown";
|
|
103
|
-
failures.push({
|
|
104
|
-
pnCode,
|
|
105
|
-
where,
|
|
106
|
-
why: error.why,
|
|
107
|
-
fix: error.fix
|
|
108
|
-
});
|
|
109
|
-
return {
|
|
110
|
-
result: {
|
|
111
|
-
ok: false,
|
|
112
|
-
failures,
|
|
113
|
-
summary: `${failures.length} integrity failure(s)`
|
|
114
|
-
},
|
|
115
|
-
exitCode: 4
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
throw error;
|
|
119
|
-
}
|
|
120
|
-
if (existsSync(appMigrationsDir)) {
|
|
121
|
-
const loadedDirNames = new Set(bundles.map((p) => p.dirName));
|
|
122
|
-
try {
|
|
123
|
-
const entries = readdirSync(appMigrationsDir);
|
|
124
|
-
for (const entry of entries) {
|
|
125
|
-
if (entry.startsWith(".") || entry.startsWith("_") || entry === "refs") continue;
|
|
126
|
-
const entryPath = join(appMigrationsDir, entry);
|
|
127
|
-
try {
|
|
128
|
-
if (!statSync(entryPath).isDirectory()) continue;
|
|
129
|
-
} catch {
|
|
130
|
-
continue;
|
|
131
|
-
}
|
|
132
|
-
if (!loadedDirNames.has(entry)) for (const f of ["migration.json", "ops.json"]) {
|
|
133
|
-
const fail = checkFileExists(entryPath, entry, f);
|
|
134
|
-
if (fail) failures.push(fail);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
} catch {}
|
|
138
|
-
}
|
|
139
|
-
if (target) {
|
|
140
|
-
const refs = await readRefs(refsDir);
|
|
141
|
-
const migResult = parseMigrationRef(target, {
|
|
142
|
-
graph,
|
|
143
|
-
refs
|
|
144
|
-
});
|
|
145
|
-
if (!migResult.ok) return {
|
|
146
|
-
result: {
|
|
147
|
-
ok: false,
|
|
148
|
-
failures: [],
|
|
149
|
-
summary: migResult.failure.kind === "not-found" ? `Migration "${target}" does not exist` : migResult.failure.kind === "wrong-grammar" ? migResult.failure.message : `Invalid migration reference: "${target}"`
|
|
150
|
-
},
|
|
151
|
-
exitCode: 2
|
|
152
|
-
};
|
|
153
|
-
const matchedPkg = bundles.find((p) => p.metadata.migrationHash === migResult.value.migrationHash);
|
|
154
|
-
if (!matchedPkg) return {
|
|
155
|
-
result: {
|
|
156
|
-
ok: false,
|
|
157
|
-
failures: [],
|
|
158
|
-
summary: `Migration package for "${target}" not found on disk`
|
|
159
|
-
},
|
|
160
|
-
exitCode: 2
|
|
161
|
-
};
|
|
162
|
-
for (const f of ["migration.json", "ops.json"]) {
|
|
163
|
-
const fail = checkFileExists(matchedPkg.dirPath, matchedPkg.dirName, f);
|
|
164
|
-
if (fail) failures.push(fail);
|
|
165
|
-
}
|
|
166
|
-
const verification = verifyMigrationHash(matchedPkg);
|
|
167
|
-
if (!verification.ok) failures.push({
|
|
168
|
-
pnCode: "PN-MIG-CHECK-001",
|
|
169
|
-
where: migrationFileRelative(matchedPkg.dirPath, "migration.json"),
|
|
170
|
-
why: `Stored hash ${verification.storedHash} does not match recomputed hash ${verification.computedHash}`,
|
|
171
|
-
fix: "Re-emit the migration package or restore from version control."
|
|
172
|
-
});
|
|
173
|
-
const snapshotFailure = checkSnapshotConsistency(matchedPkg);
|
|
174
|
-
if (snapshotFailure) failures.push(snapshotFailure);
|
|
175
|
-
} else {
|
|
176
|
-
for (const pkg of bundles) {
|
|
177
|
-
for (const f of ["migration.json", "ops.json"]) {
|
|
178
|
-
const fail = checkFileExists(pkg.dirPath, pkg.dirName, f);
|
|
179
|
-
if (fail) failures.push(fail);
|
|
180
|
-
}
|
|
181
|
-
const verification = verifyMigrationHash(pkg);
|
|
182
|
-
if (!verification.ok) failures.push({
|
|
183
|
-
pnCode: "PN-MIG-CHECK-001",
|
|
184
|
-
where: migrationFileRelative(pkg.dirPath, "migration.json"),
|
|
185
|
-
why: `Stored hash ${verification.storedHash} does not match recomputed hash ${verification.computedHash}`,
|
|
186
|
-
fix: "Re-emit the migration package or restore from version control."
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
for (const pkg of bundles) {
|
|
190
|
-
const snapshotFailure = checkSnapshotConsistency(pkg);
|
|
191
|
-
if (snapshotFailure) failures.push(snapshotFailure);
|
|
192
|
-
}
|
|
193
|
-
const allToHashes = new Set(bundles.map((p) => p.metadata.to));
|
|
194
|
-
for (const pkg of bundles) if (!(pkg.metadata.from === null || allToHashes.has(pkg.metadata.from) || pkg.metadata.from === "sha256:empty")) failures.push({
|
|
195
|
-
pnCode: "PN-MIG-CHECK-003",
|
|
196
|
-
where: migrationPathRelative(pkg.dirPath),
|
|
197
|
-
why: `Migration "${pkg.dirName}" starts from ${pkg.metadata.from} which no other migration produces`,
|
|
198
|
-
fix: "This migration is unreachable in the graph. Delete it or re-emit a connecting migration."
|
|
199
|
-
});
|
|
200
|
-
try {
|
|
201
|
-
const refs = await readRefs(refsDir);
|
|
202
|
-
for (const [name, entry] of Object.entries(refs)) if (!graph.nodes.has(entry.hash)) failures.push({
|
|
203
|
-
pnCode: "PN-MIG-CHECK-004",
|
|
204
|
-
where: relative(process.cwd(), join(refsDir, `${name}.json`)),
|
|
205
|
-
why: `Ref "${name}" points at ${entry.hash} which does not exist in the migration graph`,
|
|
206
|
-
fix: `Update the ref with \`prisma-next ref set ${name} <valid-hash>\` or delete it.`
|
|
207
|
-
});
|
|
208
|
-
} catch {}
|
|
209
|
-
}
|
|
210
|
-
if (failures.length === 0) return {
|
|
211
|
-
result: {
|
|
212
|
-
ok: true,
|
|
213
|
-
failures: [],
|
|
214
|
-
summary: "All checks passed"
|
|
215
|
-
},
|
|
216
|
-
exitCode: 0
|
|
217
|
-
};
|
|
218
|
-
return {
|
|
219
|
-
result: {
|
|
220
|
-
ok: false,
|
|
221
|
-
failures,
|
|
222
|
-
summary: `${failures.length} integrity failure(s)`
|
|
223
|
-
},
|
|
224
|
-
exitCode: 4
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
function createMigrationCheckCommand() {
|
|
228
|
-
const command = new Command("check");
|
|
229
|
-
setCommandDescriptions(command, "Verify artifact and graph integrity", "Validates that on-disk migration packages are internally consistent\n(hashes match, manifests are complete) and that the graph is well-formed\n(edges connect, refs point at valid nodes). Offline — does not consult\nthe database.");
|
|
230
|
-
setCommandExamples(command, [
|
|
231
|
-
"prisma-next migration check",
|
|
232
|
-
"prisma-next migration check 20260101-add-users",
|
|
233
|
-
"prisma-next migration check --json"
|
|
234
|
-
]);
|
|
235
|
-
setCommandSeeAlso(command, [
|
|
236
|
-
{
|
|
237
|
-
verb: "migration status",
|
|
238
|
-
oneLiner: "Show migration path and pending status"
|
|
239
|
-
},
|
|
240
|
-
{
|
|
241
|
-
verb: "migration list",
|
|
242
|
-
oneLiner: "List on-disk migrations"
|
|
243
|
-
},
|
|
244
|
-
{
|
|
245
|
-
verb: "migration graph",
|
|
246
|
-
oneLiner: "Show the migration graph topology"
|
|
247
|
-
}
|
|
248
|
-
]);
|
|
249
|
-
command.exitOverride();
|
|
250
|
-
addGlobalOptions(command).argument("[migration]", "Migration reference (directory name or hash) to check").option("--config <path>", "Path to prisma-next.config.ts").action(async (target, options) => {
|
|
251
|
-
const flags = parseGlobalFlagsOrExit(options);
|
|
252
|
-
const ui = createTerminalUI(flags);
|
|
253
|
-
let result;
|
|
254
|
-
let exitCode;
|
|
255
|
-
try {
|
|
256
|
-
({result, exitCode} = await executeMigrationCheckCommand(target, options, flags, ui));
|
|
257
|
-
} catch (error) {
|
|
258
|
-
result = {
|
|
259
|
-
ok: false,
|
|
260
|
-
failures: [],
|
|
261
|
-
summary: error instanceof Error ? error.message : String(error)
|
|
262
|
-
};
|
|
263
|
-
exitCode = 2;
|
|
264
|
-
}
|
|
265
|
-
if (flags.json) ui.output(JSON.stringify(result, null, 2));
|
|
266
|
-
else if (!flags.quiet) if (result.ok) ui.log(`✔ ${result.summary}`);
|
|
267
|
-
else {
|
|
268
|
-
for (const f of result.failures) {
|
|
269
|
-
ui.log(`✗ [${f.pnCode}] ${f.where}: ${f.why}`);
|
|
270
|
-
ui.log(` fix: ${f.fix}`);
|
|
271
|
-
}
|
|
272
|
-
ui.log(`\n${result.summary}`);
|
|
273
|
-
}
|
|
274
|
-
process.exit(exitCode);
|
|
275
|
-
});
|
|
276
|
-
return command;
|
|
277
|
-
}
|
|
278
|
-
//#endregion
|
|
1
|
+
import { t as createMigrationCheckCommand } from "../migration-check-BiBJoYYW.mjs";
|
|
279
2
|
export { createMigrationCheckCommand };
|
|
280
|
-
|
|
281
|
-
//# sourceMappingURL=migration-check.mjs.map
|
|
@@ -1,8 +1,36 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { N as CliStructuredError } from "../types-CeC5ec2Y.mjs";
|
|
2
|
+
import { n as GlobalFlags, t as CommonCommandOptions } from "../global-flags-DEHjV8_s.mjs";
|
|
3
|
+
import { n as StatusRef } from "../migration-types-D2FW63pr.mjs";
|
|
4
|
+
import { t as TerminalUI } from "../terminal-ui-5Y6mrg93.mjs";
|
|
2
5
|
import { Command } from "commander";
|
|
6
|
+
import { Result } from "@prisma-next/utils/result";
|
|
3
7
|
import { MigrationGraph } from "@prisma-next/migration-tools/graph";
|
|
4
8
|
|
|
5
9
|
//#region src/commands/migration-graph.d.ts
|
|
10
|
+
interface MigrationGraphOptions extends CommonCommandOptions {
|
|
11
|
+
readonly config?: string;
|
|
12
|
+
readonly dot?: boolean;
|
|
13
|
+
readonly tree?: boolean;
|
|
14
|
+
readonly ascii?: boolean;
|
|
15
|
+
readonly legend?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* `--legend` describes the `--tree` visual language, so passing it auto-enables
|
|
19
|
+
* the tree path (it has nothing to say about the legacy dagre default).
|
|
20
|
+
*/
|
|
21
|
+
declare function migrationGraphUsesTree(options: {
|
|
22
|
+
readonly tree?: boolean;
|
|
23
|
+
readonly legend?: boolean;
|
|
24
|
+
}): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* The legend is decoration printed alongside the command header on stderr, so
|
|
27
|
+
* it is suppressed for the machine-readable / silent paths (`--json`, `--dot`,
|
|
28
|
+
* `--quiet`) exactly as the header is.
|
|
29
|
+
*/
|
|
30
|
+
declare function migrationGraphShowsLegend(options: {
|
|
31
|
+
readonly legend?: boolean;
|
|
32
|
+
readonly dot?: boolean;
|
|
33
|
+
}, flags: GlobalFlags): boolean;
|
|
6
34
|
interface MigrationGraphResult {
|
|
7
35
|
readonly ok: true;
|
|
8
36
|
readonly graph: MigrationGraph;
|
|
@@ -10,7 +38,8 @@ interface MigrationGraphResult {
|
|
|
10
38
|
readonly refs: readonly StatusRef[];
|
|
11
39
|
readonly summary: string;
|
|
12
40
|
}
|
|
41
|
+
declare function executeMigrationGraphCommand(options: MigrationGraphOptions, flags: GlobalFlags, ui: TerminalUI): Promise<Result<MigrationGraphResult, CliStructuredError>>;
|
|
13
42
|
declare function createMigrationGraphCommand(): Command;
|
|
14
43
|
//#endregion
|
|
15
|
-
export { MigrationGraphResult, createMigrationGraphCommand };
|
|
44
|
+
export { MigrationGraphResult, createMigrationGraphCommand, executeMigrationGraphCommand, migrationGraphShowsLegend, migrationGraphUsesTree };
|
|
16
45
|
//# sourceMappingURL=migration-graph.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration-graph.d.mts","names":[],"sources":["../../src/commands/migration-graph.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"migration-graph.d.mts","names":[],"sources":["../../src/commands/migration-graph.ts"],"mappings":";;;;;;;;;UA6BU,qBAAA,SAA8B,oBAAoB;EAAA,SACjD,MAAA;EAAA,SACA,GAAA;EAAA,SACA,IAAA;EAAA,SACA,KAAA;EAAA,SACA,MAAA;AAAA;;;;;iBAOK,sBAAA,CAAuB,OAAA;EAAA,SAC5B,IAAA;EAAA,SACA,MAAA;AAAA;;;;;;iBAUK,yBAAA,CACd,OAAA;EAAA,SAAoB,MAAA;EAAA,SAA2B,GAAA;AAAA,GAC/C,KAAA,EAAO,WAAW;AAAA,UAOH,oBAAA;EAAA,SACN,EAAA;EAAA,SACA,KAAA,EAAO,cAAA;EAAA,SACP,YAAA;EAAA,SACA,IAAA,WAAe,SAAS;EAAA,SACxB,OAAA;AAAA;AAAA,iBAGW,4BAAA,CACpB,OAAA,EAAS,qBAAA,EACT,KAAA,EAAO,WAAA,EACP,EAAA,EAAI,UAAA,GACH,OAAA,CAAQ,MAAA,CAAO,oBAAA,EAAsB,kBAAA;AAAA,iBAoDxB,2BAAA,CAAA,GAA+B,OAAO"}
|
|
@@ -1,137 +1,2 @@
|
|
|
1
|
-
import { t as
|
|
2
|
-
|
|
3
|
-
import { t as createTerminalUI } from "../terminal-ui-BiB_8KNo.mjs";
|
|
4
|
-
import { S as formatStyledHeader, a as loadMigrationPackages, d as setCommandDescriptions, f as setCommandExamples, l as resolveMigrationPaths, p as setCommandSeeAlso, s as readContractEnvelope, t as addGlobalOptions, v as parseGlobalFlagsOrExit, y as handleResult } from "../command-helpers-BSb0tRC8.mjs";
|
|
5
|
-
import { i as migrationGraphToRenderInput, n as graphRenderer } from "../graph-render-DJVv0_uf.mjs";
|
|
6
|
-
import { Command } from "commander";
|
|
7
|
-
import { notOk, ok } from "@prisma-next/utils/result";
|
|
8
|
-
import { EMPTY_CONTRACT_HASH } from "@prisma-next/migration-tools/constants";
|
|
9
|
-
import { MigrationToolsError } from "@prisma-next/migration-tools/errors";
|
|
10
|
-
import { readRefs } from "@prisma-next/migration-tools/refs";
|
|
11
|
-
//#region src/commands/migration-graph.ts
|
|
12
|
-
async function executeMigrationGraphCommand(options, flags, ui) {
|
|
13
|
-
const config = await loadConfig(options.config);
|
|
14
|
-
const { configPath, appMigrationsDir, appMigrationsRelative, refsDir } = resolveMigrationPaths(options.config, config);
|
|
15
|
-
if (!flags.json && !flags.quiet) {
|
|
16
|
-
const header = formatStyledHeader({
|
|
17
|
-
command: "migration graph",
|
|
18
|
-
description: "Show the migration graph topology",
|
|
19
|
-
details: [{
|
|
20
|
-
label: "config",
|
|
21
|
-
value: configPath
|
|
22
|
-
}, {
|
|
23
|
-
label: "migrations",
|
|
24
|
-
value: appMigrationsRelative
|
|
25
|
-
}],
|
|
26
|
-
flags
|
|
27
|
-
});
|
|
28
|
-
ui.stderr(header);
|
|
29
|
-
}
|
|
30
|
-
let graph;
|
|
31
|
-
try {
|
|
32
|
-
({graph} = await loadMigrationPackages(appMigrationsDir));
|
|
33
|
-
} catch (error) {
|
|
34
|
-
if (MigrationToolsError.is(error)) return notOk(mapMigrationToolsError(error));
|
|
35
|
-
return notOk(errorUnexpected(error instanceof Error ? error.message : String(error), { why: `Failed to read migrations: ${error instanceof Error ? error.message : String(error)}` }));
|
|
36
|
-
}
|
|
37
|
-
let contractHash = null;
|
|
38
|
-
try {
|
|
39
|
-
contractHash = (await readContractEnvelope(config)).storageHash;
|
|
40
|
-
} catch {}
|
|
41
|
-
let refs = [];
|
|
42
|
-
try {
|
|
43
|
-
const allRefs = await readRefs(refsDir);
|
|
44
|
-
refs = Object.entries(allRefs).map(([name, entry]) => ({
|
|
45
|
-
name,
|
|
46
|
-
hash: entry.hash,
|
|
47
|
-
active: false
|
|
48
|
-
}));
|
|
49
|
-
} catch {}
|
|
50
|
-
return ok({
|
|
51
|
-
ok: true,
|
|
52
|
-
graph,
|
|
53
|
-
contractHash,
|
|
54
|
-
refs,
|
|
55
|
-
summary: `${graph.nodes.size} node(s), ${graph.migrationByHash.size} edge(s)`
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
function createMigrationGraphCommand() {
|
|
59
|
-
const command = new Command("graph");
|
|
60
|
-
setCommandDescriptions(command, "Show the migration graph topology", "Renders the migration graph as an ASCII tree. Offline — does not\nconsult the database. Use --json for machine-readable output or\n--dot for Graphviz DOT format.");
|
|
61
|
-
setCommandExamples(command, [
|
|
62
|
-
"prisma-next migration graph",
|
|
63
|
-
"prisma-next migration graph --json",
|
|
64
|
-
"prisma-next migration graph --dot"
|
|
65
|
-
]);
|
|
66
|
-
setCommandSeeAlso(command, [
|
|
67
|
-
{
|
|
68
|
-
verb: "migration status",
|
|
69
|
-
oneLiner: "Show migration path and pending status"
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
verb: "migration log",
|
|
73
|
-
oneLiner: "Show executed migration history"
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
verb: "migration list",
|
|
77
|
-
oneLiner: "List on-disk migrations"
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
verb: "migration show",
|
|
81
|
-
oneLiner: "Display migration package contents"
|
|
82
|
-
}
|
|
83
|
-
]);
|
|
84
|
-
addGlobalOptions(command).option("--config <path>", "Path to prisma-next.config.ts").option("--dot", "Output in Graphviz DOT format").action(async (options) => {
|
|
85
|
-
const flags = parseGlobalFlagsOrExit(options);
|
|
86
|
-
const ui = createTerminalUI(flags);
|
|
87
|
-
const exitCode = handleResult(await executeMigrationGraphCommand(options, flags, ui), flags, ui, (graphResult) => {
|
|
88
|
-
if (options.dot) {
|
|
89
|
-
const lines = ["digraph migrations {"];
|
|
90
|
-
for (const edge of graphResult.graph.migrationByHash.values()) {
|
|
91
|
-
const from = edge.from.slice(0, 12);
|
|
92
|
-
const to = edge.to.slice(0, 12);
|
|
93
|
-
lines.push(` "${from}" -> "${to}" [label="${edge.dirName}"];`);
|
|
94
|
-
}
|
|
95
|
-
lines.push("}");
|
|
96
|
-
ui.output(lines.join("\n"));
|
|
97
|
-
} else if (flags.json) {
|
|
98
|
-
const nodes = [...graphResult.graph.nodes];
|
|
99
|
-
const edges = [...graphResult.graph.migrationByHash.values()].map((e) => ({
|
|
100
|
-
dirName: e.dirName,
|
|
101
|
-
from: e.from,
|
|
102
|
-
to: e.to,
|
|
103
|
-
migrationHash: e.migrationHash
|
|
104
|
-
}));
|
|
105
|
-
ui.output(JSON.stringify({
|
|
106
|
-
ok: true,
|
|
107
|
-
nodes,
|
|
108
|
-
edges,
|
|
109
|
-
summary: graphResult.summary
|
|
110
|
-
}, null, 2));
|
|
111
|
-
} else if (!flags.quiet) {
|
|
112
|
-
const renderInput = migrationGraphToRenderInput({
|
|
113
|
-
graph: graphResult.graph,
|
|
114
|
-
mode: "offline",
|
|
115
|
-
markerHash: void 0,
|
|
116
|
-
contractHash: graphResult.contractHash ?? EMPTY_CONTRACT_HASH,
|
|
117
|
-
refs: graphResult.refs,
|
|
118
|
-
activeRefHash: void 0,
|
|
119
|
-
activeRefName: void 0,
|
|
120
|
-
edgeStatuses: []
|
|
121
|
-
});
|
|
122
|
-
const graphOutput = graphRenderer.render(renderInput.graph, {
|
|
123
|
-
...renderInput.options,
|
|
124
|
-
colorize: flags.color !== false
|
|
125
|
-
});
|
|
126
|
-
ui.log(graphOutput);
|
|
127
|
-
ui.log(`\n${graphResult.summary}`);
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
process.exit(exitCode);
|
|
131
|
-
});
|
|
132
|
-
return command;
|
|
133
|
-
}
|
|
134
|
-
//#endregion
|
|
135
|
-
export { createMigrationGraphCommand };
|
|
136
|
-
|
|
137
|
-
//# sourceMappingURL=migration-graph.mjs.map
|
|
1
|
+
import { i as migrationGraphUsesTree, n as executeMigrationGraphCommand, r as migrationGraphShowsLegend, t as createMigrationGraphCommand } from "../migration-graph-C9WC-7eO.mjs";
|
|
2
|
+
export { createMigrationGraphCommand, executeMigrationGraphCommand, migrationGraphShowsLegend, migrationGraphUsesTree };
|
|
@@ -1,20 +1,80 @@
|
|
|
1
|
+
import { N as CliStructuredError } from "../types-CeC5ec2Y.mjs";
|
|
2
|
+
import { n as GlobalFlags, t as CommonCommandOptions } from "../global-flags-DEHjV8_s.mjs";
|
|
3
|
+
import { n as GlyphMode, t as TerminalUI } from "../terminal-ui-5Y6mrg93.mjs";
|
|
1
4
|
import { Command } from "commander";
|
|
5
|
+
import { Result } from "@prisma-next/utils/result";
|
|
6
|
+
import { ContractSpaceAggregate } from "@prisma-next/migration-tools/aggregate";
|
|
2
7
|
|
|
3
|
-
//#region src/
|
|
8
|
+
//#region src/utils/formatters/migration-list-types.d.ts
|
|
4
9
|
interface MigrationListEntry {
|
|
5
10
|
readonly dirName: string;
|
|
6
|
-
readonly from: string;
|
|
11
|
+
readonly from: string | null;
|
|
7
12
|
readonly to: string;
|
|
8
13
|
readonly migrationHash: string;
|
|
9
14
|
readonly operationCount: number;
|
|
10
15
|
readonly createdAt: string;
|
|
16
|
+
readonly refs: readonly string[];
|
|
17
|
+
readonly providedInvariants: readonly string[];
|
|
18
|
+
}
|
|
19
|
+
interface MigrationSpaceListEntry {
|
|
20
|
+
readonly spaceId: string;
|
|
21
|
+
readonly migrations: readonly MigrationListEntry[];
|
|
11
22
|
}
|
|
12
23
|
interface MigrationListResult {
|
|
13
24
|
readonly ok: true;
|
|
14
|
-
readonly
|
|
25
|
+
readonly spaces: readonly MigrationSpaceListEntry[];
|
|
15
26
|
readonly summary: string;
|
|
16
27
|
}
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/commands/migration-list.d.ts
|
|
30
|
+
/**
|
|
31
|
+
* Project the loaded {@link ContractSpaceAggregate} into the render-ready
|
|
32
|
+
* {@link MigrationSpaceListEntry} rows `migration list` displays.
|
|
33
|
+
*
|
|
34
|
+
* Space membership matches the on-disk contract-space directories (not the
|
|
35
|
+
* aggregate's always-present synthesized app member when `migrations/app/`
|
|
36
|
+
* is absent); package and ref data come from `aggregate.space(id)`.
|
|
37
|
+
*/
|
|
38
|
+
declare function migrationSpaceListEntriesFromAggregate(aggregate: ContractSpaceAggregate, projectMigrationsDir: string): Promise<readonly MigrationSpaceListEntry[]>;
|
|
39
|
+
interface MigrationListOptions extends CommonCommandOptions {
|
|
40
|
+
readonly config?: string;
|
|
41
|
+
readonly space?: string;
|
|
42
|
+
readonly ascii?: boolean;
|
|
43
|
+
}
|
|
44
|
+
interface MigrationListHumanRenderOptions {
|
|
45
|
+
readonly glyphMode: GlyphMode;
|
|
46
|
+
readonly useColor: boolean;
|
|
47
|
+
}
|
|
48
|
+
declare function renderMigrationListHumanOutput(result: MigrationListResult, options: MigrationListHumanRenderOptions): string;
|
|
49
|
+
/**
|
|
50
|
+
* Inputs for {@link runMigrationList} — the policy core of `migration list`
|
|
51
|
+
* that tests exercise directly.
|
|
52
|
+
*
|
|
53
|
+
* The core does not call `loadConfig`, parse CLI flags, render a styled
|
|
54
|
+
* header, or write to any stream. Enumeration is supplied by the caller
|
|
55
|
+
* (the CLI shell builds it from {@link migrationSpaceListEntriesFromAggregate}).
|
|
56
|
+
*/
|
|
57
|
+
interface RunMigrationListInputs {
|
|
58
|
+
readonly spaces: readonly MigrationSpaceListEntry[];
|
|
59
|
+
readonly spaceFilter?: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Policy core of `migration list`: validates `--space`, narrows the
|
|
63
|
+
* pre-enumerated spaces, and assembles a {@link MigrationListResult}.
|
|
64
|
+
*
|
|
65
|
+
* - `migrations/` missing or contains no valid space directories →
|
|
66
|
+
* caller passes `spaces: []`; this synthesizes `[{ spaceId: APP_SPACE_ID, migrations: [] }]`.
|
|
67
|
+
* - `--space <id>` on an existing-but-empty space → `{ spaceId, migrations: [] }` in the input.
|
|
68
|
+
* - `--space <id>` on a non-existent (or reserved) space → `SPACE_NOT_FOUND`.
|
|
69
|
+
*/
|
|
70
|
+
declare function runMigrationList(inputs: RunMigrationListInputs): Result<MigrationListResult, CliStructuredError>;
|
|
71
|
+
/**
|
|
72
|
+
* CLI shell: loads config, resolves paths, prints the styled header on
|
|
73
|
+
* stderr (interactive mode only), and delegates to {@link runMigrationList}.
|
|
74
|
+
* Kept intentionally thin so the unit-testable surface lives in the core.
|
|
75
|
+
*/
|
|
76
|
+
declare function executeMigrationListCommand(options: MigrationListOptions, flags: GlobalFlags, ui: TerminalUI): Promise<Result<MigrationListResult, CliStructuredError>>;
|
|
17
77
|
declare function createMigrationListCommand(): Command;
|
|
18
78
|
//#endregion
|
|
19
|
-
export {
|
|
79
|
+
export { MigrationListHumanRenderOptions, RunMigrationListInputs, createMigrationListCommand, executeMigrationListCommand, migrationSpaceListEntriesFromAggregate, renderMigrationListHumanOutput, runMigrationList };
|
|
20
80
|
//# sourceMappingURL=migration-list.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration-list.d.mts","names":[],"sources":["../../src/commands/migration-list.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"migration-list.d.mts","names":[],"sources":["../../src/utils/formatters/migration-list-types.ts","../../src/commands/migration-list.ts"],"mappings":";;;;;;;;UAAiB,kBAAA;EAAA,SACN,OAAA;EAAA,SACA,IAAA;EAAA,SACA,EAAA;EAAA,SACA,aAAA;EAAA,SACA,cAAA;EAAA,SACA,SAAA;EAAA,SACA,IAAA;EAAA,SACA,kBAAA;AAAA;AAAA,UAGM,uBAAA;EAAA,SACN,OAAA;EAAA,SACA,UAAA,WAAqB,kBAAkB;AAAA;AAAA,UAGjC,mBAAA;EAAA,SACN,EAAA;EAAA,SACA,MAAA,WAAiB,uBAAuB;EAAA,SACxC,OAAA;AAAA;;;;;;;;;;;iBC8EW,sCAAA,CACpB,SAAA,EAAW,sBAAA,EACX,oBAAA,WACC,OAAA,UAAiB,uBAAA;AAAA,UA6BV,oBAAA,SAA6B,oBAAoB;EAAA,SAChD,MAAA;EAAA,SACA,KAAA;EAAA,SACA,KAAA;AAAA;AAAA,UAGM,+BAAA;EAAA,SACN,SAAA,EAAW,SAAS;EAAA,SACpB,QAAA;AAAA;AAAA,iBAGK,8BAAA,CACd,MAAA,EAAQ,mBAAA,EACR,OAAA,EAAS,+BAA+B;;;ADjIQ;AAGlD;;;;;UC6IiB,sBAAA;EAAA,SACN,MAAA,WAAiB,uBAAuB;EAAA,SACxC,WAAA;AAAA;AD5IO;;;;AC8ElB;;;;;AD9EkB,iBCgKF,gBAAA,CACd,MAAA,EAAQ,sBAAA,GACP,MAAA,CAAO,mBAAA,EAAqB,kBAAA;;;;;;iBA6BT,2BAAA,CACpB,OAAA,EAAS,oBAAA,EACT,KAAA,EAAO,WAAA,EACP,EAAA,EAAI,UAAA,GACH,OAAA,CAAQ,MAAA,CAAO,mBAAA,EAAqB,kBAAA;AAAA,iBAqCvB,0BAAA,CAAA,GAA8B,OAAO"}
|