@prisma/composer 0.25.0-dev.3 → 0.25.0-dev.5
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/{app-config-joXc-BKm-CdcXqNMD.mjs → app-config-CGJHcFb--CIEFCG4V.mjs} +3 -3
- package/dist/{app-config-joXc-BKm-CdcXqNMD.mjs.map → app-config-CGJHcFb--CIEFCG4V.mjs.map} +1 -1
- package/dist/{app-config-jGcCcxK4-DnzGGbDS.d.mts → app-config-Cay7dFv5-CMlgGodQ.d.mts} +3 -3
- package/dist/{app-config-jGcCcxK4-DnzGGbDS.d.mts.map → app-config-Cay7dFv5-CMlgGodQ.d.mts.map} +1 -1
- package/dist/config-CE3fmcF9.d.mts +1 -0
- package/dist/config-CdxvLFzg.mjs.map +1 -1
- package/dist/config.d.mts +2 -2
- package/dist/config.mjs +1 -1
- package/dist/control.d.mts +37 -5
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +10 -10
- package/dist/control.mjs.map +1 -1
- package/dist/deploy-CE3fmcF9.d.mts +1 -0
- package/dist/deploy.d.mts +2 -2
- package/dist/deploy.mjs +1 -1
- package/dist/deploy.mjs.map +1 -1
- package/dist/{deployment-summary-CU-eVvJM-pW7SAEre.d.mts → deployment-summary-CU-eVvJM-Cu9hKMdz.d.mts} +3 -3
- package/dist/{deployment-summary-CU-eVvJM-pW7SAEre.d.mts.map → deployment-summary-CU-eVvJM-Cu9hKMdz.d.mts.map} +1 -1
- package/dist/{execute-deploy-destroy-Bdi-RiN5-ByDTmL_F.mjs → execute-deploy-destroy-CF6DR7sA-pf8yhNfp.mjs} +21 -17
- package/dist/execute-deploy-destroy-CF6DR7sA-pf8yhNfp.mjs.map +1 -0
- package/dist/{execute-dev-BLCK5wF7-CJvkj5wl.mjs → execute-dev-DAIUT0es-B3iBKmAS.mjs} +179 -130
- package/dist/execute-dev-DAIUT0es-B3iBKmAS.mjs.map +1 -0
- package/dist/{execute-log-B_zCJ17b-CE954g1a.mjs → execute-log-PLs9-Qn3-BvONZ358.mjs} +7 -10
- package/dist/execute-log-PLs9-Qn3-BvONZ358.mjs.map +1 -0
- package/dist/{local-target-DnA2E8IN.mjs → local-target-B4xoiDAV.mjs} +2 -2
- package/dist/{local-target-DnA2E8IN.mjs.map → local-target-B4xoiDAV.mjs.map} +1 -1
- package/dist/local-target.d.mts +1 -1
- package/dist/local-target.mjs +2 -2
- package/dist/nextjs-control.d.mts +4 -4
- package/dist/nextjs-control.mjs +2 -2
- package/dist/nextjs-control.mjs.map +1 -1
- package/dist/node-control.d.mts +4 -4
- package/dist/node-control.mjs +2 -2
- package/dist/node-control.mjs.map +1 -1
- package/dist/{pipeline-C7gNjMzJ-CzM8DNS_.mjs → pipeline-DAYhea3J-B6PQu2QB.mjs} +231 -262
- package/dist/pipeline-DAYhea3J-B6PQu2QB.mjs.map +1 -0
- package/dist/report.d.mts +3 -3
- package/dist/result-B1SzJJoE.mjs +122 -0
- package/dist/result-B1SzJJoE.mjs.map +1 -0
- package/package.json +10 -11
- package/skills/prisma-composer-core-concepts/SKILL.md +58 -18
- package/dist/config-BGtKERz-.d.mts +0 -1
- package/dist/deploy-BGtKERz-.d.mts +0 -1
- package/dist/execute-deploy-destroy-Bdi-RiN5-ByDTmL_F.mjs.map +0 -1
- package/dist/execute-dev-BLCK5wF7-CJvkj5wl.mjs.map +0 -1
- package/dist/execute-log-B_zCJ17b-CE954g1a.mjs.map +0 -1
- package/dist/pipeline-C7gNjMzJ-CzM8DNS_.mjs.map +0 -1
- package/dist/result-CQIOBgdW.mjs +0 -247
- package/dist/result-CQIOBgdW.mjs.map +0 -1
|
@@ -2,13 +2,206 @@ import { t as blindCast } from "./casts-DpaahrlC-C5XMnP9S.mjs";
|
|
|
2
2
|
import { t as CliStructuredError } from "./errors-0e8IVwzi.mjs";
|
|
3
3
|
import { s as isNode, t as Load } from "./graph-BfKAg2Ap-LY3OAuK2.mjs";
|
|
4
4
|
import "./dist-CR0-3j9o.mjs";
|
|
5
|
-
import { i as effectResolutionDiagnostic } from "./result-CQIOBgdW.mjs";
|
|
6
5
|
import * as mod from "node:module";
|
|
7
6
|
import * as fs$1 from "node:fs";
|
|
8
7
|
import { existsSync } from "node:fs";
|
|
9
8
|
import * as path$1 from "node:path";
|
|
10
9
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
11
|
-
|
|
10
|
+
//#region ../../0-framework/3-tooling/cli/dist/composer-config-CY9fET8H.mjs
|
|
11
|
+
/**
|
|
12
|
+
* What makes a `composer` section valid, shared by the CLI's section validator and the programmatic operations.
|
|
13
|
+
* It imports nothing from the CLI engine, because `@prisma/composer` must not depend on it.
|
|
14
|
+
*/
|
|
15
|
+
const SECTION_FIX = "Write `composer: composer({ extensions: [...], state: ... })` in prisma.config.ts, with `import { defineConfig as composer } from '@prisma/composer/config'`.";
|
|
16
|
+
const MOVE_TO_SECTION_FIX = `${SECTION_FIX} If the project has a prisma-composer.config.ts, move its extensions and state into that section and delete the file.`;
|
|
17
|
+
const SECTION_IS_THE_ONLY_SOURCE = "Composer reads its configuration only from the `composer` section of prisma.config.ts.";
|
|
18
|
+
const DESCRIPTOR_FIX = "Use the descriptor the extension factory returns, unchanged, instead of building one by hand.";
|
|
19
|
+
const RETIRED_FILE_NAMES = [
|
|
20
|
+
"ts",
|
|
21
|
+
"mts",
|
|
22
|
+
"mjs",
|
|
23
|
+
"js"
|
|
24
|
+
].map((extension) => `prisma-composer.config.${extension}`);
|
|
25
|
+
/** What the generated stack file throws when the file it imports has no `composer` export. */
|
|
26
|
+
function noComposerExportMessage(configFile) {
|
|
27
|
+
return `${configFile} declares no \`composer\` section. Pass the prisma.config.ts that declares it.`;
|
|
28
|
+
}
|
|
29
|
+
function configFileMissing(file) {
|
|
30
|
+
return {
|
|
31
|
+
code: "CONFIG.FILE_MISSING",
|
|
32
|
+
summary: `${file} does not exist.`,
|
|
33
|
+
fix: "Pass the path of the prisma.config.ts that declares the `composer` section.",
|
|
34
|
+
where: file
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** A prisma-composer.config.* beside the declaring file would otherwise be silently ignored. */
|
|
38
|
+
/** The path with symlinks resolved; the path itself when it cannot be resolved, so the check never throws. */
|
|
39
|
+
function realPath(file) {
|
|
40
|
+
try {
|
|
41
|
+
return fs$1.realpathSync(file);
|
|
42
|
+
} catch {
|
|
43
|
+
return file;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function retiredFileFinding(configFile) {
|
|
47
|
+
const directory = path$1.dirname(realPath(configFile));
|
|
48
|
+
const found = RETIRED_FILE_NAMES.map((name) => path$1.join(directory, name)).find((file) => fs$1.existsSync(file));
|
|
49
|
+
if (found === void 0) return void 0;
|
|
50
|
+
return {
|
|
51
|
+
code: "CONFIG.FILE_RETIRED",
|
|
52
|
+
summary: `${found} is no longer read.`,
|
|
53
|
+
why: SECTION_IS_THE_ONLY_SOURCE,
|
|
54
|
+
fix: MOVE_TO_SECTION_FIX,
|
|
55
|
+
where: found
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function isObject(value) {
|
|
59
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
60
|
+
}
|
|
61
|
+
function isExtensionDescriptor(value) {
|
|
62
|
+
return isObject(value) && typeof value["id"] === "string" && value["id"].length > 0 && isObject(value["nodes"]);
|
|
63
|
+
}
|
|
64
|
+
function isStateDescriptor(value) {
|
|
65
|
+
return isObject(value) && typeof value["extension"] === "string" && typeof value["create"] === "function";
|
|
66
|
+
}
|
|
67
|
+
const stateInvalid = {
|
|
68
|
+
code: "CONFIG.FIELD_INVALID",
|
|
69
|
+
summary: "`composer.state` must be a state descriptor with a string `extension` and a `create` function.",
|
|
70
|
+
fix: "Set `state` to the state descriptor an extension provides, e.g. `state: prismaState()`.",
|
|
71
|
+
field: "state"
|
|
72
|
+
};
|
|
73
|
+
function unknownField(key) {
|
|
74
|
+
return {
|
|
75
|
+
code: "CONFIG.FIELD_UNKNOWN",
|
|
76
|
+
summary: `The \`composer\` section has no field \`${key}\`.`,
|
|
77
|
+
fix: key === "composer" ? "Pass the `composer` property of the prisma.config.ts export, not the whole export. The section takes only `extensions` and `state`." : `Remove \`${key}\`. The section takes only \`extensions\` and \`state\`.`,
|
|
78
|
+
field: key
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function checkExtensions(value) {
|
|
82
|
+
if (!Array.isArray(value)) return {
|
|
83
|
+
extensions: [],
|
|
84
|
+
findings: [{
|
|
85
|
+
code: "CONFIG.FIELD_INVALID",
|
|
86
|
+
summary: "`composer.extensions` must be an array of extension descriptors.",
|
|
87
|
+
fix: "Set `extensions` to the descriptors your extensions provide, e.g. `extensions: [nodeBuild()]`.",
|
|
88
|
+
field: "extensions"
|
|
89
|
+
}]
|
|
90
|
+
};
|
|
91
|
+
const findings = [];
|
|
92
|
+
const extensions = [];
|
|
93
|
+
const seen = /* @__PURE__ */ new Set();
|
|
94
|
+
for (const [index, entry] of value.entries()) {
|
|
95
|
+
const field = `extensions[${index}]`;
|
|
96
|
+
if (!isObject(entry)) {
|
|
97
|
+
findings.push({
|
|
98
|
+
code: "CONFIG.FIELD_INVALID",
|
|
99
|
+
summary: `\`composer.${field}\` must be an extension descriptor object.`,
|
|
100
|
+
fix: "Put the descriptor an extension factory returns here, e.g. `nodeBuild()`, not the factory itself.",
|
|
101
|
+
field
|
|
102
|
+
});
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const id = entry["id"];
|
|
106
|
+
if (typeof id !== "string" || id.length === 0) findings.push({
|
|
107
|
+
code: "CONFIG.FIELD_INVALID",
|
|
108
|
+
summary: `\`composer.${field}.id\` must be a non-empty string (the extension package name).`,
|
|
109
|
+
fix: DESCRIPTOR_FIX,
|
|
110
|
+
field: `${field}.id`
|
|
111
|
+
});
|
|
112
|
+
else if (seen.has(id)) findings.push({
|
|
113
|
+
code: "CONFIG.EXTENSION_DUPLICATE",
|
|
114
|
+
summary: `Extension "${id}" is listed more than once in \`composer.extensions\`.`,
|
|
115
|
+
fix: `Remove the repeated "${id}" entry from \`extensions\`.`,
|
|
116
|
+
field: `${field}.id`
|
|
117
|
+
});
|
|
118
|
+
else seen.add(id);
|
|
119
|
+
if (!isObject(entry["nodes"])) findings.push({
|
|
120
|
+
code: "CONFIG.FIELD_INVALID",
|
|
121
|
+
summary: `\`composer.${field}.nodes\` must be an object (the node-ID → control registry).`,
|
|
122
|
+
fix: DESCRIPTOR_FIX,
|
|
123
|
+
field: `${field}.nodes`
|
|
124
|
+
});
|
|
125
|
+
if (isExtensionDescriptor(entry)) extensions.push(entry);
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
findings,
|
|
129
|
+
extensions
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function checkFields(section) {
|
|
133
|
+
if (Object.hasOwn(section, "configPath")) return {
|
|
134
|
+
ok: false,
|
|
135
|
+
findings: [{
|
|
136
|
+
code: "CONFIG.FIELD_RETIRED",
|
|
137
|
+
summary: "`composer.configPath` is no longer supported: prisma-composer.config.ts is no longer read.",
|
|
138
|
+
why: SECTION_IS_THE_ONLY_SOURCE,
|
|
139
|
+
fix: `Replace \`configPath\` with the section itself. ${MOVE_TO_SECTION_FIX}`,
|
|
140
|
+
field: "configPath"
|
|
141
|
+
}]
|
|
142
|
+
};
|
|
143
|
+
if (Object.hasOwn(section, "composer")) return {
|
|
144
|
+
ok: false,
|
|
145
|
+
findings: [unknownField("composer")]
|
|
146
|
+
};
|
|
147
|
+
const findings = Object.keys(section).filter((key) => key !== "extensions" && key !== "state").map(unknownField);
|
|
148
|
+
const checked = checkExtensions(section["extensions"]);
|
|
149
|
+
findings.push(...checked.findings);
|
|
150
|
+
const state = section["state"];
|
|
151
|
+
if (!isStateDescriptor(state)) findings.push(stateInvalid);
|
|
152
|
+
const [first, ...rest] = findings;
|
|
153
|
+
if (first === void 0 && isStateDescriptor(state)) return {
|
|
154
|
+
ok: true,
|
|
155
|
+
value: {
|
|
156
|
+
extensions: checked.extensions,
|
|
157
|
+
state
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
return {
|
|
161
|
+
ok: false,
|
|
162
|
+
findings: [first ?? stateInvalid, ...rest]
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Checks the fields that identify each descriptor and returns the descriptors as the config file's own objects.
|
|
167
|
+
* Never throws: a section's values are user code, and a throwing getter or Proxy trap becomes a finding.
|
|
168
|
+
*/
|
|
169
|
+
function checkComposerSection(raw) {
|
|
170
|
+
if (!isObject(raw)) return {
|
|
171
|
+
ok: false,
|
|
172
|
+
findings: [{
|
|
173
|
+
code: "CONFIG.FIELD_INVALID",
|
|
174
|
+
summary: "The `composer` section of prisma.config.ts must be an object.",
|
|
175
|
+
fix: SECTION_FIX
|
|
176
|
+
}]
|
|
177
|
+
};
|
|
178
|
+
try {
|
|
179
|
+
return checkFields({ ...raw });
|
|
180
|
+
} catch (cause) {
|
|
181
|
+
return {
|
|
182
|
+
ok: false,
|
|
183
|
+
findings: [{
|
|
184
|
+
code: "CONFIG.FIELD_INVALID",
|
|
185
|
+
summary: "The `composer` section of prisma.config.ts could not be read.",
|
|
186
|
+
why: `Reading it threw: ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
187
|
+
fix: SECTION_FIX
|
|
188
|
+
}]
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* The whole check, shared by the section validator and the programmatic operations so both report the same findings in the same order: the retired file beside the declaring `configFile` (resolved through symlinks), then every field finding.
|
|
194
|
+
*/
|
|
195
|
+
function checkComposerConfig(raw, configFile) {
|
|
196
|
+
const retired = retiredFileFinding(configFile);
|
|
197
|
+
const checked = checkComposerSection(raw);
|
|
198
|
+
if (retired === void 0) return checked;
|
|
199
|
+
return {
|
|
200
|
+
ok: false,
|
|
201
|
+
findings: checked.ok ? [retired] : [retired, ...checked.findings]
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
//#endregion
|
|
12
205
|
//#region ../../0-framework/3-tooling/cli/dist/load-entry-BjRb7YB3.mjs
|
|
13
206
|
/**
|
|
14
207
|
* Synchronous Node resolve hook so that entry modules may import relative
|
|
@@ -175,7 +368,7 @@ var AssembleError = class extends CliStructuredError {
|
|
|
175
368
|
function buildDescriptorAssemble(config, node, address, cwd) {
|
|
176
369
|
const { extension, type } = node.build;
|
|
177
370
|
const extensionDescriptor = config.extensions.find((candidate) => candidate.id === extension);
|
|
178
|
-
if (extensionDescriptor === void 0) throw new AssembleError("ASSEMBLE.EXTENSION_MISSING", `No extension "${extension}" is configured (needed by service "${node.name}"'s build).`, { fix: "Add it to prisma
|
|
371
|
+
if (extensionDescriptor === void 0) throw new AssembleError("ASSEMBLE.EXTENSION_MISSING", `No extension "${extension}" is configured (needed by service "${node.name}"'s build).`, { fix: "Add it to `extensions` in the `composer` section of prisma.config.ts." });
|
|
179
372
|
const nodeDescriptor = extensionDescriptor.nodes[type];
|
|
180
373
|
if (nodeDescriptor === void 0) throw new AssembleError("ASSEMBLE.DESCRIPTOR_MISSING", `Extension "${extension}" has no descriptor for build type "${type}".`, { why: `Known types: ${Object.keys(extensionDescriptor.nodes).join(", ")}.` });
|
|
181
374
|
if (nodeDescriptor.kind !== "build") throw new AssembleError("ASSEMBLE.DESCRIPTOR_KIND_MISMATCH", `Extension "${extension}"'s descriptor for type "${type}" is a "${nodeDescriptor.kind}" descriptor.`, { why: "Assembling a service build needs a \"build\" descriptor." });
|
|
@@ -202,242 +395,11 @@ async function assembleServices(graph, config, cwd, run) {
|
|
|
202
395
|
return { bundles };
|
|
203
396
|
}
|
|
204
397
|
//#endregion
|
|
205
|
-
//#region ../../0-framework/3-tooling/cli/dist/pipeline-
|
|
206
|
-
/**
|
|
207
|
-
* Pipeline step: find and load `prisma-composer.config.ts` (ADR-0017) — the ONE
|
|
208
|
-
* file that imports control-plane code. Discovery is the standard walk-up
|
|
209
|
-
* from the deploy entry's directory (mirrors prisma/orm's config-loader);
|
|
210
|
-
* loading is c12 with that explicit path (rc/global/package.json lookups
|
|
211
|
-
* disabled), so the config file's own static imports resolve from the app
|
|
212
|
-
* root by whatever package manager runs — no specifier construction, no
|
|
213
|
-
* anchoring.
|
|
214
|
-
*
|
|
215
|
-
* Two shapes of the same machinery:
|
|
216
|
-
*
|
|
217
|
-
* loadAppConfigDiagnostics — returns the evaluated value together with
|
|
218
|
-
* EVERY problem found, and never throws. This is the shape the engine
|
|
219
|
-
* command family consumes: the engine renders diagnostics itself and
|
|
220
|
-
* decides per command whether a broken section is fatal, so a loader that
|
|
221
|
-
* threw on the first bad field would both hide the rest and bypass that
|
|
222
|
-
* rendering.
|
|
223
|
-
*
|
|
224
|
-
* loadAppConfig — the same load, throwing its first diagnostic. The
|
|
225
|
-
* clipanion CLI still runs on it; it goes when clipanion does.
|
|
226
|
-
*/
|
|
227
|
-
/**
|
|
228
|
-
* Accepted config file names, in precedence order: when several sit in one
|
|
229
|
-
* directory the first one found wins. The JavaScript spellings exist so a
|
|
230
|
-
* project whose own TypeScript build would otherwise compile the config file
|
|
231
|
-
* (no `include`, a `rootDir`, `module: commonjs`) can keep it out of that
|
|
232
|
-
* build's sight.
|
|
233
|
-
*/
|
|
234
|
-
const CONFIG_FILENAMES = [
|
|
235
|
-
"prisma-composer.config.ts",
|
|
236
|
-
"prisma-composer.config.mts",
|
|
237
|
-
"prisma-composer.config.mjs",
|
|
238
|
-
"prisma-composer.config.js"
|
|
239
|
-
];
|
|
240
|
-
/** The canonical spelling, used in messages and docs. */
|
|
241
|
-
const CONFIG_FILENAME = CONFIG_FILENAMES[0];
|
|
242
|
-
/** The accepted spellings as one glob-like string for messages. */
|
|
243
|
-
const CONFIG_FILENAME_PATTERN = "prisma-composer.config.{ts,mts,mjs,js}";
|
|
244
|
-
/** Walks UP from the entry file's directory looking for one of CONFIG_FILENAMES; undefined when the walk hits the filesystem root. */
|
|
245
|
-
function findConfigPathForEntry(entryPath) {
|
|
246
|
-
let current = path$1.dirname(path$1.resolve(entryPath));
|
|
247
|
-
while (true) {
|
|
248
|
-
for (const filename of CONFIG_FILENAMES) {
|
|
249
|
-
const candidate = path$1.join(current, filename);
|
|
250
|
-
if (fs$1.existsSync(candidate)) return candidate;
|
|
251
|
-
}
|
|
252
|
-
const parent = path$1.dirname(current);
|
|
253
|
-
if (parent === current) return void 0;
|
|
254
|
-
current = parent;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
function missingConfigError(entryPath) {
|
|
258
|
-
const searchedFrom = path$1.dirname(path$1.resolve(entryPath));
|
|
259
|
-
return new CliStructuredError("CONFIG.FILE_MISSING", `No ${CONFIG_FILENAME_PATTERN} found walking up from "${searchedFrom}".`, {
|
|
260
|
-
why: "The deploy needs the app's config file.",
|
|
261
|
-
fix: "Create one next to (or above) the entry, default-exporting defineConfig({ extensions: [...], state: ... }) from '@prisma/composer/config'.",
|
|
262
|
-
where: { path: searchedFrom }
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
function fieldError(configPath, field, requirement) {
|
|
266
|
-
return new CliStructuredError("CONFIG.FIELD_INVALID", `${path$1.basename(configPath)}: \`${field}\` ${requirement}.`, {
|
|
267
|
-
fix: "See defineConfig() in '@prisma/composer/config'.",
|
|
268
|
-
meta: { field }
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
function isRecord(value) {
|
|
272
|
-
return typeof value === "object" && value !== null;
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Field-by-field validation of the loaded default export — deliberately no
|
|
276
|
-
* schema library: each check is a structured error naming the offending field.
|
|
277
|
-
*
|
|
278
|
-
* Collects rather than throws, so one bad config reports every bad field
|
|
279
|
-
* instead of only the first. The `extensions` and `state` checks are
|
|
280
|
-
* independent, and within `extensions` each entry is judged on its own; a
|
|
281
|
-
* field whose own shape check already failed is not probed further, because
|
|
282
|
-
* anything derived from it would be noise rather than a second finding.
|
|
283
|
-
*/
|
|
284
|
-
function configShapeDiagnostics(loaded, configPath) {
|
|
285
|
-
if (!isRecord(loaded) || Object.keys(loaded).length === 0) return [new CliStructuredError("CONFIG.EXPORT_INVALID", `"${configPath}" exported no config.`, {
|
|
286
|
-
fix: "It must default-export defineConfig({ extensions: [...], state: ... }) from '@prisma/composer/config'.",
|
|
287
|
-
where: { path: configPath }
|
|
288
|
-
})];
|
|
289
|
-
const diagnostics = [];
|
|
290
|
-
const extensions = loaded["extensions"];
|
|
291
|
-
if (!Array.isArray(extensions)) diagnostics.push(fieldError(configPath, "extensions", "must be an array"));
|
|
292
|
-
else {
|
|
293
|
-
const seen = /* @__PURE__ */ new Set();
|
|
294
|
-
for (const [index, entry] of extensions.entries()) {
|
|
295
|
-
if (!isRecord(entry)) {
|
|
296
|
-
diagnostics.push(fieldError(configPath, `extensions[${index}]`, "must be an extension descriptor object"));
|
|
297
|
-
continue;
|
|
298
|
-
}
|
|
299
|
-
const id = entry["id"];
|
|
300
|
-
if (typeof id !== "string" || id.length === 0) diagnostics.push(fieldError(configPath, `extensions[${index}].id`, "must be a non-empty string (the extension package name)"));
|
|
301
|
-
else if (seen.has(id)) diagnostics.push(new CliStructuredError("CONFIG.EXTENSION_DUPLICATE", `${path$1.basename(configPath)}: extension "${id}" is listed more than once in \`extensions\`.`));
|
|
302
|
-
else seen.add(id);
|
|
303
|
-
if (!isRecord(entry["nodes"])) diagnostics.push(fieldError(configPath, `extensions[${index}].nodes`, "must be an object (the node-ID → control registry)"));
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
const state = loaded["state"];
|
|
307
|
-
if (!isRecord(state) || typeof state["extension"] !== "string" || typeof state["create"] !== "function") diagnostics.push(fieldError(configPath, "state", "must be a state descriptor (e.g. prismaState())"));
|
|
308
|
-
return diagnostics;
|
|
309
|
-
}
|
|
310
|
-
/** The throwing form of configShapeDiagnostics: raises the first finding, returns the same object typed. Used by the clipanion pipeline. */
|
|
311
|
-
function validateConfigShape(loaded, configPath) {
|
|
312
|
-
const [first] = configShapeDiagnostics(loaded, configPath);
|
|
313
|
-
if (first !== void 0) throw first;
|
|
314
|
-
return blindCast(loaded);
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* Evaluates `configPath` with c12 (explicit file; rc / global-rc /
|
|
318
|
-
* package.json lookups disabled). `verifySamePath` runs the same-file check
|
|
319
|
-
* against the discovered path — see loadAppConfigDiagnostics for when it does
|
|
320
|
-
* not apply.
|
|
321
|
-
*/
|
|
322
|
-
async function evaluateConfig(configPath, verifySamePath) {
|
|
323
|
-
let result;
|
|
324
|
-
try {
|
|
325
|
-
result = await c12.loadConfig({
|
|
326
|
-
name: "prisma-composer",
|
|
327
|
-
configFile: configPath,
|
|
328
|
-
cwd: path$1.dirname(configPath),
|
|
329
|
-
rcFile: false,
|
|
330
|
-
globalRc: false,
|
|
331
|
-
packageJson: false
|
|
332
|
-
});
|
|
333
|
-
} catch (error) {
|
|
334
|
-
return {
|
|
335
|
-
value: void 0,
|
|
336
|
-
diagnostics: [new CliStructuredError("CONFIG.EVALUATION_FAILED", `Evaluating "${configPath}" failed: ${error instanceof Error ? error.message : String(error)}`, {
|
|
337
|
-
where: { path: configPath },
|
|
338
|
-
cause: error
|
|
339
|
-
})]
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
const loadedFile = result.configFile;
|
|
343
|
-
if (verifySamePath && (typeof loadedFile !== "string" || fs$1.realpathSync(loadedFile) !== fs$1.realpathSync(configPath))) return {
|
|
344
|
-
value: result.config,
|
|
345
|
-
diagnostics: [new CliStructuredError("CONFIG.PATH_MISMATCH", `Config loading resolved "${String(loadedFile)}" instead of the discovered "${configPath}".`, {
|
|
346
|
-
why: "Refusing to deploy against a different file.",
|
|
347
|
-
where: { path: configPath }
|
|
348
|
-
})]
|
|
349
|
-
};
|
|
350
|
-
return {
|
|
351
|
-
value: result.config,
|
|
352
|
-
diagnostics: configShapeDiagnostics(result.config, configPath)
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* The front of every config load, shared by the throwing and the
|
|
357
|
-
* diagnostics-list shapes: verify the installed tree can evaluate a config at
|
|
358
|
-
* all, then settle which file to load — the section's path, or the
|
|
359
|
-
* entry-anchored walk.
|
|
360
|
-
*
|
|
361
|
-
* The effect-resolution check comes first because evaluating a config imports
|
|
362
|
-
* alchemy's provider tree: in a tree where alchemy resolves an `effect` we did
|
|
363
|
-
* not pin, nothing downstream can load, so the dependency conflict is the
|
|
364
|
-
* finding with the fix in it and every later failure is its symptom.
|
|
365
|
-
*/
|
|
366
|
-
function configSource(request) {
|
|
367
|
-
const resolvedEntry = path$1.resolve(request.entryPath);
|
|
368
|
-
const effectConflict = effectResolutionDiagnostic(request.cwd ?? path$1.dirname(resolvedEntry));
|
|
369
|
-
if (effectConflict !== void 0) return {
|
|
370
|
-
ok: false,
|
|
371
|
-
path: void 0,
|
|
372
|
-
diagnostic: effectConflict
|
|
373
|
-
};
|
|
374
|
-
if (request.configPath === void 0) {
|
|
375
|
-
const discovered = findConfigPathForEntry(resolvedEntry);
|
|
376
|
-
return discovered === void 0 ? {
|
|
377
|
-
ok: false,
|
|
378
|
-
path: void 0,
|
|
379
|
-
diagnostic: missingConfigError(resolvedEntry)
|
|
380
|
-
} : {
|
|
381
|
-
ok: true,
|
|
382
|
-
path: discovered,
|
|
383
|
-
explicit: false
|
|
384
|
-
};
|
|
385
|
-
}
|
|
386
|
-
const configPath = request.configPath;
|
|
387
|
-
if (!path$1.isAbsolute(configPath)) return {
|
|
388
|
-
ok: false,
|
|
389
|
-
path: configPath,
|
|
390
|
-
diagnostic: new CliStructuredError("CONFIG.PATH_NOT_ABSOLUTE", `The \`composer\` config section's configPath must arrive absolute, and "${configPath}" is relative.`, {
|
|
391
|
-
why: "The section validator resolves a relative configPath against the config file that declared it; a relative value here means that resolution was skipped.",
|
|
392
|
-
fix: "Run the configPath through the composer section validator, or resolve it against its declaring file before constructing the load request.",
|
|
393
|
-
where: { path: configPath }
|
|
394
|
-
})
|
|
395
|
-
};
|
|
396
|
-
if (!fs$1.existsSync(configPath)) return {
|
|
397
|
-
ok: false,
|
|
398
|
-
path: configPath,
|
|
399
|
-
diagnostic: new CliStructuredError("CONFIG.FILE_MISSING", `The \`composer\` config section points at "${configPath}", which does not exist.`, {
|
|
400
|
-
why: "An explicit configPath is used as given — there is no walk to fall back on.",
|
|
401
|
-
fix: "Correct `configPath` in the `composer` section of prisma.config.ts, or remove it to search upward from the entry.",
|
|
402
|
-
where: { path: configPath }
|
|
403
|
-
})
|
|
404
|
-
};
|
|
405
|
-
return {
|
|
406
|
-
ok: true,
|
|
407
|
-
path: configPath,
|
|
408
|
-
explicit: true
|
|
409
|
-
};
|
|
410
|
-
}
|
|
411
|
-
/**
|
|
412
|
-
* The throwing form of that front, for the pipeline: the file the load will
|
|
413
|
-
* use, or the finding raised. `explicit` says the section named the file,
|
|
414
|
-
* which is what retires the same-file check for that case.
|
|
415
|
-
*/
|
|
416
|
-
function resolveConfigFile(request) {
|
|
417
|
-
const source = configSource(request);
|
|
418
|
-
if (!source.ok) throw source.diagnostic;
|
|
419
|
-
return {
|
|
420
|
-
path: source.path,
|
|
421
|
-
explicit: source.explicit
|
|
422
|
-
};
|
|
423
|
-
}
|
|
424
|
-
/**
|
|
425
|
-
* Loads + validates the config at `configPath`, throwing its first diagnostic.
|
|
426
|
-
* The clipanion CLI's pipeline runs on this; it goes when clipanion does.
|
|
427
|
-
*/
|
|
428
|
-
async function loadAppConfig(configPath, verifySamePath = true) {
|
|
429
|
-
const { value, diagnostics } = await evaluateConfig(configPath, verifySamePath);
|
|
430
|
-
const [first] = diagnostics;
|
|
431
|
-
if (first !== void 0) throw first;
|
|
432
|
-
return {
|
|
433
|
-
path: configPath,
|
|
434
|
-
config: validateConfigShape(value, configPath)
|
|
435
|
-
};
|
|
436
|
-
}
|
|
398
|
+
//#region ../../0-framework/3-tooling/cli/dist/pipeline-DAYhea3J.mjs
|
|
437
399
|
function lookup(extensions, extension, type, expectedKind, what) {
|
|
438
400
|
const ext = extensions.get(extension);
|
|
439
401
|
if (ext === void 0) throw new CliStructuredError("CONFIG.EXTENSION_MISSING", `No extension "${extension}" is configured (needed by ${what}).`, {
|
|
440
|
-
fix:
|
|
402
|
+
fix: "Add it to `extensions` in the `composer` section of prisma.config.ts (import its /control entry and list its descriptor).",
|
|
441
403
|
meta: {
|
|
442
404
|
extension,
|
|
443
405
|
type
|
|
@@ -472,7 +434,7 @@ function validateRegistryCoverage(graph, config) {
|
|
|
472
434
|
}
|
|
473
435
|
/**
|
|
474
436
|
* The shared prefix of `deploy`/`destroy`/`dev` (deploy-cli.md § The
|
|
475
|
-
* pipeline; local-dev spec § 6):
|
|
437
|
+
* pipeline; local-dev spec § 6): entry load, Load,
|
|
476
438
|
* registry coverage validation, name resolution, assemble. Deploy and dev
|
|
477
439
|
* diverge after this — deploy resolves containers/preflight/stack file
|
|
478
440
|
* against the hosted providers, dev against the local ones — so everything
|
|
@@ -480,50 +442,58 @@ function validateRegistryCoverage(graph, config) {
|
|
|
480
442
|
* `run()` (main.ts) and `runDev()` (dev/run-dev.ts), so the two pipelines
|
|
481
443
|
* cannot drift.
|
|
482
444
|
*/
|
|
445
|
+
function configError(findings, file) {
|
|
446
|
+
const [first] = findings;
|
|
447
|
+
return new CliStructuredError(first.code, first.summary, {
|
|
448
|
+
...first.why === void 0 ? {} : { why: first.why },
|
|
449
|
+
fix: first.fix,
|
|
450
|
+
where: { path: first.where ?? file },
|
|
451
|
+
meta: {
|
|
452
|
+
...first.field === void 0 ? {} : { field: first.field },
|
|
453
|
+
findings
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
}
|
|
483
457
|
/**
|
|
484
|
-
*
|
|
485
|
-
*
|
|
486
|
-
* unless the caller substituted a config, which replaces the evaluation and
|
|
487
|
-
* nothing before it.
|
|
458
|
+
* Refuses a caller's config with the same findings, in the same order, as the CLI's section validator.
|
|
459
|
+
* The error is the first finding and carries all of them in `meta.findings`. Returns the config with `file` resolved against `cwd`.
|
|
488
460
|
*/
|
|
489
|
-
|
|
490
|
-
const
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
});
|
|
461
|
+
function checkConfigSource(source, cwd) {
|
|
462
|
+
const file = path$1.resolve(cwd, source.file);
|
|
463
|
+
if (!fs$1.existsSync(file)) throw configError([configFileMissing(file)], file);
|
|
464
|
+
const checked = checkComposerConfig(source.value, file);
|
|
465
|
+
if (!checked.ok) throw configError(checked.findings, file);
|
|
495
466
|
return {
|
|
496
|
-
|
|
497
|
-
|
|
467
|
+
value: checked.value,
|
|
468
|
+
file
|
|
498
469
|
};
|
|
499
470
|
}
|
|
500
471
|
/**
|
|
501
|
-
* The pipeline's front —
|
|
472
|
+
* The pipeline's front — entry load and name resolution —
|
|
502
473
|
* WITHOUT Load, coverage, or assemble. `log` needs only who the app is (its
|
|
503
474
|
* config and resolved name) to reach the already-running local instance; it
|
|
504
475
|
* neither builds nor provisions, so it must not require the user's built
|
|
505
476
|
* output the way the full pipeline does.
|
|
506
477
|
*/
|
|
507
|
-
async function resolveAppIdentity(entry, overrideName, cwd,
|
|
508
|
-
const {
|
|
478
|
+
async function resolveAppIdentity(entry, overrideName, cwd, config) {
|
|
479
|
+
const { value } = checkConfigSource(config, cwd);
|
|
509
480
|
const entryModule = await loadEntry(entry, cwd);
|
|
510
481
|
const name = overrideName ?? entryModule.root.name;
|
|
511
482
|
if (name.length === 0) throw new CliStructuredError("COMPOSE.NAME_MISSING", "The root node has no name.", { fix: "Name it at authoring, or pass --name." });
|
|
512
483
|
return {
|
|
513
|
-
|
|
514
|
-
config,
|
|
484
|
+
config: value,
|
|
515
485
|
name
|
|
516
486
|
};
|
|
517
487
|
}
|
|
518
488
|
/**
|
|
519
|
-
* Runs
|
|
520
|
-
* resolution, and assemble — steps 1–6 of `run()`. `onAssembleError`, when
|
|
489
|
+
* Runs entry load, Load, registry coverage, name resolution, and assemble — steps 1–5 of `run()`. `onAssembleError`, when
|
|
521
490
|
* given, lets a caller decorate an assemble failure with command-specific
|
|
522
491
|
* guidance (destroy's "build first" hint) without this shared step knowing
|
|
523
492
|
* about any one command.
|
|
524
493
|
*/
|
|
525
|
-
async function runPipeline(entry, overrideName, cwd, deps = {}, onAssembleError) {
|
|
526
|
-
const
|
|
494
|
+
async function runPipeline(entry, overrideName, cwd, source, deps = {}, onAssembleError) {
|
|
495
|
+
const configSource = checkConfigSource(source, cwd);
|
|
496
|
+
const config = configSource.value;
|
|
527
497
|
const entryModule = await loadEntry(entry, cwd);
|
|
528
498
|
const graph = Load(entryModule.root);
|
|
529
499
|
if (graph.root.node.kind !== "module") throw new CliStructuredError("COMPOSE.ROOT_NOT_MODULE", "The deploy root must be a module.", { fix: "Wrap your service, e.g. export default module('name', ({ provision }) => { provision(service); })." });
|
|
@@ -538,8 +508,7 @@ async function runPipeline(entry, overrideName, cwd, deps = {}, onAssembleError)
|
|
|
538
508
|
throw error;
|
|
539
509
|
}
|
|
540
510
|
return {
|
|
541
|
-
|
|
542
|
-
config,
|
|
511
|
+
configSource,
|
|
543
512
|
entryModule,
|
|
544
513
|
graph,
|
|
545
514
|
name,
|
|
@@ -547,6 +516,6 @@ async function runPipeline(entry, overrideName, cwd, deps = {}, onAssembleError)
|
|
|
547
516
|
};
|
|
548
517
|
}
|
|
549
518
|
//#endregion
|
|
550
|
-
export { runPipeline as n, resolveAppIdentity as t };
|
|
519
|
+
export { runPipeline as n, noComposerExportMessage as r, resolveAppIdentity as t };
|
|
551
520
|
|
|
552
|
-
//# sourceMappingURL=pipeline-
|
|
521
|
+
//# sourceMappingURL=pipeline-DAYhea3J-B6PQu2QB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-DAYhea3J-B6PQu2QB.mjs","names":["fs","path","path","path","fs"],"sources":["../../../0-framework/3-tooling/cli/dist/composer-config-CY9fET8H.mjs","../../../0-framework/3-tooling/cli/dist/load-entry-BjRb7YB3.mjs","../../../0-framework/3-tooling/assemble/dist/index.mjs","../../../0-framework/3-tooling/cli/dist/pipeline-DAYhea3J.mjs"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n//#region src/composer-config.ts\n/**\n* What makes a `composer` section valid, shared by the CLI's section validator and the programmatic operations.\n* It imports nothing from the CLI engine, because `@prisma/composer` must not depend on it.\n*/\nconst SECTION_FIX = \"Write `composer: composer({ extensions: [...], state: ... })` in prisma.config.ts, with `import { defineConfig as composer } from '@prisma/composer/config'`.\";\nconst MOVE_TO_SECTION_FIX = `${SECTION_FIX} If the project has a prisma-composer.config.ts, move its extensions and state into that section and delete the file.`;\nconst SECTION_IS_THE_ONLY_SOURCE = \"Composer reads its configuration only from the `composer` section of prisma.config.ts.\";\nconst DESCRIPTOR_FIX = \"Use the descriptor the extension factory returns, unchanged, instead of building one by hand.\";\nconst RETIRED_FILE_NAMES = [\n\t\"ts\",\n\t\"mts\",\n\t\"mjs\",\n\t\"js\"\n].map((extension) => `prisma-composer.config.${extension}`);\nconst sectionMissing = {\n\tcode: \"CONFIG.SECTION_MISSING\",\n\tsummary: \"No loaded prisma.config.ts declares a `composer` section.\",\n\twhy: `${SECTION_IS_THE_ONLY_SOURCE} A prisma-composer.config.ts file is no longer read.`,\n\tfix: MOVE_TO_SECTION_FIX\n};\n/** What the generated stack file throws when the file it imports has no `composer` export. */\nfunction noComposerExportMessage(configFile) {\n\treturn `${configFile} declares no \\`composer\\` section. Pass the prisma.config.ts that declares it.`;\n}\nfunction configFileMissing(file) {\n\treturn {\n\t\tcode: \"CONFIG.FILE_MISSING\",\n\t\tsummary: `${file} does not exist.`,\n\t\tfix: \"Pass the path of the prisma.config.ts that declares the `composer` section.\",\n\t\twhere: file\n\t};\n}\n/** A prisma-composer.config.* beside the declaring file would otherwise be silently ignored. */\n/** The path with symlinks resolved; the path itself when it cannot be resolved, so the check never throws. */\nfunction realPath(file) {\n\ttry {\n\t\treturn fs.realpathSync(file);\n\t} catch {\n\t\treturn file;\n\t}\n}\nfunction retiredFileFinding(configFile) {\n\tconst directory = path.dirname(realPath(configFile));\n\tconst found = RETIRED_FILE_NAMES.map((name) => path.join(directory, name)).find((file) => fs.existsSync(file));\n\tif (found === void 0) return void 0;\n\treturn {\n\t\tcode: \"CONFIG.FILE_RETIRED\",\n\t\tsummary: `${found} is no longer read.`,\n\t\twhy: SECTION_IS_THE_ONLY_SOURCE,\n\t\tfix: MOVE_TO_SECTION_FIX,\n\t\twhere: found\n\t};\n}\nfunction isObject(value) {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction isExtensionDescriptor(value) {\n\treturn isObject(value) && typeof value[\"id\"] === \"string\" && value[\"id\"].length > 0 && isObject(value[\"nodes\"]);\n}\nfunction isStateDescriptor(value) {\n\treturn isObject(value) && typeof value[\"extension\"] === \"string\" && typeof value[\"create\"] === \"function\";\n}\nconst stateInvalid = {\n\tcode: \"CONFIG.FIELD_INVALID\",\n\tsummary: \"`composer.state` must be a state descriptor with a string `extension` and a `create` function.\",\n\tfix: \"Set `state` to the state descriptor an extension provides, e.g. `state: prismaState()`.\",\n\tfield: \"state\"\n};\nfunction unknownField(key) {\n\treturn {\n\t\tcode: \"CONFIG.FIELD_UNKNOWN\",\n\t\tsummary: `The \\`composer\\` section has no field \\`${key}\\`.`,\n\t\tfix: key === \"composer\" ? \"Pass the `composer` property of the prisma.config.ts export, not the whole export. The section takes only `extensions` and `state`.\" : `Remove \\`${key}\\`. The section takes only \\`extensions\\` and \\`state\\`.`,\n\t\tfield: key\n\t};\n}\nfunction checkExtensions(value) {\n\tif (!Array.isArray(value)) return {\n\t\textensions: [],\n\t\tfindings: [{\n\t\t\tcode: \"CONFIG.FIELD_INVALID\",\n\t\t\tsummary: \"`composer.extensions` must be an array of extension descriptors.\",\n\t\t\tfix: \"Set `extensions` to the descriptors your extensions provide, e.g. `extensions: [nodeBuild()]`.\",\n\t\t\tfield: \"extensions\"\n\t\t}]\n\t};\n\tconst findings = [];\n\tconst extensions = [];\n\tconst seen = /* @__PURE__ */ new Set();\n\tfor (const [index, entry] of value.entries()) {\n\t\tconst field = `extensions[${index}]`;\n\t\tif (!isObject(entry)) {\n\t\t\tfindings.push({\n\t\t\t\tcode: \"CONFIG.FIELD_INVALID\",\n\t\t\t\tsummary: `\\`composer.${field}\\` must be an extension descriptor object.`,\n\t\t\t\tfix: \"Put the descriptor an extension factory returns here, e.g. `nodeBuild()`, not the factory itself.\",\n\t\t\t\tfield\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tconst id = entry[\"id\"];\n\t\tif (typeof id !== \"string\" || id.length === 0) findings.push({\n\t\t\tcode: \"CONFIG.FIELD_INVALID\",\n\t\t\tsummary: `\\`composer.${field}.id\\` must be a non-empty string (the extension package name).`,\n\t\t\tfix: DESCRIPTOR_FIX,\n\t\t\tfield: `${field}.id`\n\t\t});\n\t\telse if (seen.has(id)) findings.push({\n\t\t\tcode: \"CONFIG.EXTENSION_DUPLICATE\",\n\t\t\tsummary: `Extension \"${id}\" is listed more than once in \\`composer.extensions\\`.`,\n\t\t\tfix: `Remove the repeated \"${id}\" entry from \\`extensions\\`.`,\n\t\t\tfield: `${field}.id`\n\t\t});\n\t\telse seen.add(id);\n\t\tif (!isObject(entry[\"nodes\"])) findings.push({\n\t\t\tcode: \"CONFIG.FIELD_INVALID\",\n\t\t\tsummary: `\\`composer.${field}.nodes\\` must be an object (the node-ID → control registry).`,\n\t\t\tfix: DESCRIPTOR_FIX,\n\t\t\tfield: `${field}.nodes`\n\t\t});\n\t\tif (isExtensionDescriptor(entry)) extensions.push(entry);\n\t}\n\treturn {\n\t\tfindings,\n\t\textensions\n\t};\n}\nfunction checkFields(section) {\n\tif (Object.hasOwn(section, \"configPath\")) return {\n\t\tok: false,\n\t\tfindings: [{\n\t\t\tcode: \"CONFIG.FIELD_RETIRED\",\n\t\t\tsummary: \"`composer.configPath` is no longer supported: prisma-composer.config.ts is no longer read.\",\n\t\t\twhy: SECTION_IS_THE_ONLY_SOURCE,\n\t\t\tfix: `Replace \\`configPath\\` with the section itself. ${MOVE_TO_SECTION_FIX}`,\n\t\t\tfield: \"configPath\"\n\t\t}]\n\t};\n\tif (Object.hasOwn(section, \"composer\")) return {\n\t\tok: false,\n\t\tfindings: [unknownField(\"composer\")]\n\t};\n\tconst findings = Object.keys(section).filter((key) => key !== \"extensions\" && key !== \"state\").map(unknownField);\n\tconst checked = checkExtensions(section[\"extensions\"]);\n\tfindings.push(...checked.findings);\n\tconst state = section[\"state\"];\n\tif (!isStateDescriptor(state)) findings.push(stateInvalid);\n\tconst [first, ...rest] = findings;\n\tif (first === void 0 && isStateDescriptor(state)) return {\n\t\tok: true,\n\t\tvalue: {\n\t\t\textensions: checked.extensions,\n\t\t\tstate\n\t\t}\n\t};\n\treturn {\n\t\tok: false,\n\t\tfindings: [first ?? stateInvalid, ...rest]\n\t};\n}\n/**\n* Checks the fields that identify each descriptor and returns the descriptors as the config file's own objects.\n* Never throws: a section's values are user code, and a throwing getter or Proxy trap becomes a finding.\n*/\nfunction checkComposerSection(raw) {\n\tif (!isObject(raw)) return {\n\t\tok: false,\n\t\tfindings: [{\n\t\t\tcode: \"CONFIG.FIELD_INVALID\",\n\t\t\tsummary: \"The `composer` section of prisma.config.ts must be an object.\",\n\t\t\tfix: SECTION_FIX\n\t\t}]\n\t};\n\ttry {\n\t\treturn checkFields({ ...raw });\n\t} catch (cause) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tfindings: [{\n\t\t\t\tcode: \"CONFIG.FIELD_INVALID\",\n\t\t\t\tsummary: \"The `composer` section of prisma.config.ts could not be read.\",\n\t\t\t\twhy: `Reading it threw: ${cause instanceof Error ? cause.message : String(cause)}`,\n\t\t\t\tfix: SECTION_FIX\n\t\t\t}]\n\t\t};\n\t}\n}\n/**\n* The whole check, shared by the section validator and the programmatic operations so both report the same findings in the same order: the retired file beside the declaring `configFile` (resolved through symlinks), then every field finding.\n*/\nfunction checkComposerConfig(raw, configFile) {\n\tconst retired = retiredFileFinding(configFile);\n\tconst checked = checkComposerSection(raw);\n\tif (retired === void 0) return checked;\n\treturn {\n\t\tok: false,\n\t\tfindings: checked.ok ? [retired] : [retired, ...checked.findings]\n\t};\n}\n//#endregion\nexport { sectionMissing as i, configFileMissing as n, noComposerExportMessage as r, checkComposerConfig as t };\n\n//# sourceMappingURL=composer-config-CY9fET8H.mjs.map","import * as mod from \"node:module\";\nimport { CliStructuredError } from \"@internal/foundation/errors\";\nimport { existsSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { blindCast } from \"@internal/foundation/casts\";\nimport { isNode } from \"@internal/core\";\n//#region src/entry-resolution.ts\n/**\n* Synchronous Node resolve hook so that entry modules may import relative\n* files using the specifier forms TypeScript accepts by default —\n* extensionless `./service` and `./service.js` for a `.ts` source file —\n* without requiring `allowImportingTsExtensions` in every consumer's tsconfig.\n*\n* Resolution only; uses TypeScript's own documented mapping: for a specifier\n* Node could not resolve, strip any JS-family extension and probe the\n* corresponding TypeScript source; first candidate that exists on disk wins.\n* Format-specific rules: `.mjs` → `.mts`; `.cjs` → `.cts`; `.js` and\n* extensionless → `.ts`, `.mts`, `.tsx`, then `./index.ts`. Bare and package\n* specifiers are never touched. Existing `./x.ts` imports keep working —\n* Node resolves them before the hook fires (ADR-0005: no transform, no\n* guessing, deterministic TypeScript rule).\n*\n* Bun resolves `./x.js` and `./x` to `x.ts` natively, so the hook is a\n* no-op under Bun. Nothing is registered there.\n*/\nlet registered = false;\n/**\n* Registers the resolve hook once (idempotent). Call at the start of\n* `loadEntry` so every module in the entry graph benefits, including those\n* imported lazily after the entry itself loads.\n*/\nfunction registerEntryResolution() {\n\tif (registered || typeof process.versions.bun === \"string\") return;\n\tif (typeof mod.registerHooks !== \"function\") return;\n\tregistered = true;\n\tmod.registerHooks({ resolve(specifier, context, nextResolve) {\n\t\ttry {\n\t\t\treturn nextResolve(specifier, context);\n\t\t} catch (error) {\n\t\t\tif (!isRelativeSpecifier(specifier) || context.parentURL === void 0 || !isModuleNotFoundError(error)) throw error;\n\t\t\tfor (const candidate of sourceCandidates(new URL(specifier, context.parentURL))) if (existsSync(fileURLToPath(candidate))) return nextResolve(candidate.href, context);\n\t\t\tthrow error;\n\t\t}\n\t} });\n}\n/**\n* TypeScript's extension mapping: for a JS-family or extensionless URL,\n* produce the source candidates to probe. Format-specific: `.mjs` maps only\n* to `.mts`; `.cjs` maps only to `.cts`; `.js` and extensionless probe\n* `.ts`, `.mts`, `.tsx` (keeping `.tsx` so the JSX diagnostic fires), then\n* `./index.ts`.\n*/\nfunction sourceCandidates(resolved) {\n\tconst href = resolved.href;\n\tif (href.endsWith(\".mjs\")) {\n\t\tconst base = href.slice(0, -4);\n\t\treturn [new URL(`${base}.mts`)];\n\t}\n\tif (href.endsWith(\".cjs\")) {\n\t\tconst base = href.slice(0, -4);\n\t\treturn [new URL(`${base}.cts`)];\n\t}\n\tconst base = href.endsWith(\".js\") ? href.slice(0, -3) : href;\n\treturn [\n\t\tnew URL(`${base}.ts`),\n\t\tnew URL(`${base}.mts`),\n\t\tnew URL(`${base}.tsx`),\n\t\tnew URL(`${base}/index.ts`)\n\t];\n}\nfunction isRelativeSpecifier(specifier) {\n\treturn specifier.startsWith(\"./\") || specifier.startsWith(\"../\");\n}\nfunction isModuleNotFoundError(error) {\n\tif (!(error instanceof Error)) return false;\n\tif (!(\"code\" in error)) return false;\n\treturn error.code === \"ERR_MODULE_NOT_FOUND\";\n}\n//#endregion\n//#region src/jsx-load-error.ts\n/**\n* `loadEntry` imports a user's topology with the host runtime's own module\n* loader — under node (the CLI's shebang runtime), that loader strips\n* TypeScript types but has no JSX transform (ADR-0005: the framework\n* doesn't bundle or transform the app's code; deploy loading is no\n* exception). A `.tsx`/`.jsx` file anywhere in the topology's import graph\n* dies with node's raw `ERR_UNKNOWN_FILE_EXTENSION`, which names the file\n* but not the cause or the fix. This turns that one case into structured\n* error parts (summary/why/fix) that do — every other load failure (syntax\n* errors, missing files, non-JSX unknown extensions) is untouched.\n*/\nconst UNKNOWN_EXTENSION_CODE = \"ERR_UNKNOWN_FILE_EXTENSION\";\nconst JSX_EXTENSIONS = [\".tsx\", \".jsx\"];\nfunction errorCode(error) {\n\treturn \"code\" in error && typeof error.code === \"string\" ? error.code : void 0;\n}\nfunction unknownExtensionPath(error) {\n\tif (!(error instanceof Error)) return void 0;\n\tif (errorCode(error) !== UNKNOWN_EXTENSION_CODE) return void 0;\n\treturn /Unknown file extension \"\\.\\w+\" for (.+)$/.exec(error.message)?.[1];\n}\n/**\n* Returns structured error parts when `error` is node's\n* `ERR_UNKNOWN_FILE_EXTENSION` for a `.tsx`/`.jsx` file — `undefined` for\n* every other error (including unknown-extension failures for some other\n* extension), so the caller can fall through to its normal rethrow.\n*/\nfunction explainJsxLoadError(error, entryPath) {\n\tconst offendingPath = unknownExtensionPath(error);\n\tif (offendingPath === void 0) return void 0;\n\tif (!JSX_EXTENSIONS.some((ext) => offendingPath.endsWith(ext))) return void 0;\n\treturn {\n\t\tsummary: `\"${offendingPath}\" can't be loaded.`,\n\t\twhy: `deploy loads \"${entryPath}\"'s topology with node's own module loader, which strips TypeScript types but has no JSX transform — so a .tsx/.jsx file can't sit anywhere in that import graph.`,\n\t\tfix: \"Precompile that file in your own build (transform the JSX away, keep the real npm packages external) and import the compiled output instead of the raw .tsx/.jsx — see examples/email/scripts/build.ts in the prisma/composer repo for a worked example.\"\n\t};\n}\n//#endregion\n//#region src/load-entry.ts\n/**\n* Pipeline step 1 (deploy-cli.md § The pipeline): import the entry module\n* (resolved against cwd) and require its default export to be a node — a\n* service or module, branded by core's factories. Whatever this module exports\n* IS the application; nothing else marks a root (ADR-0003).\n*/\nasync function loadEntry(entryArg, cwd) {\n\tregisterEntryResolution();\n\tconst resolvedPath = path.resolve(cwd, entryArg);\n\tlet mod;\n\ttry {\n\t\tmod = await import(pathToFileURL(resolvedPath).href);\n\t} catch (error) {\n\t\tconst explained = explainJsxLoadError(error, resolvedPath);\n\t\tif (explained !== void 0) throw new CliStructuredError(\"COMPOSE.ENTRY_UNLOADABLE\", explained.summary, {\n\t\t\twhy: explained.why,\n\t\t\tfix: explained.fix,\n\t\t\twhere: { path: resolvedPath },\n\t\t\tcause: error\n\t\t});\n\t\tthrow new CliStructuredError(\"COMPOSE.ENTRY_UNLOADABLE\", `Failed to import entry module \"${resolvedPath}\": ${error instanceof Error ? error.message : String(error)}`, {\n\t\t\twhere: { path: resolvedPath },\n\t\t\tcause: error\n\t\t});\n\t}\n\tconst root = blindCast(mod).default;\n\tif (!isNode(root) || root.kind === \"dependency\" || root.kind === \"resource\") throw new CliStructuredError(\"COMPOSE.ENTRY_EXPORT_INVALID\", `Entry module \"${resolvedPath}\" must default-export a node (a service or a module).`, {\n\t\tfix: \"Construct it with service() or module() from @prisma/composer.\",\n\t\twhere: { path: resolvedPath }\n\t});\n\treturn {\n\t\tpath: resolvedPath,\n\t\troot: blindCast(root)\n\t};\n}\n//#endregion\nexport { loadEntry as t };\n\n//# sourceMappingURL=load-entry-BjRb7YB3.mjs.map","import { CliStructuredError } from \"@internal/foundation/errors\";\n//#region src/assemble-error.ts\n/**\n* A user-facing assembly failure, structured at origin (base-type rule 6):\n* a `CliStructuredError` whose code names which way assembly went wrong.\n* This package's second consumer is the programmatic deploy API, not just\n* the CLI — hosts branch on `error.code`, the CLI renders the envelope.\n*/\nvar AssembleError = class extends CliStructuredError {\n\tconstructor(code, summary, options) {\n\t\tsuper(code, summary, options);\n\t}\n};\n//#endregion\n//#region src/assemble-services.ts\n/**\n* The registry route for one service's build: extension by\n* `build.extension`, node descriptor by `build.type`, kind must be \"build\".\n* The CLI's coverage validation reports the same misses earlier with the\n* config fix; these errors are the backstop for programmatic callers.\n*/\nfunction buildDescriptorAssemble(config, node, address, cwd) {\n\tconst { extension, type } = node.build;\n\tconst extensionDescriptor = config.extensions.find((candidate) => candidate.id === extension);\n\tif (extensionDescriptor === void 0) throw new AssembleError(\"ASSEMBLE.EXTENSION_MISSING\", `No extension \"${extension}\" is configured (needed by service \"${node.name}\"'s build).`, { fix: \"Add it to `extensions` in the `composer` section of prisma.config.ts.\" });\n\tconst nodeDescriptor = extensionDescriptor.nodes[type];\n\tif (nodeDescriptor === void 0) throw new AssembleError(\"ASSEMBLE.DESCRIPTOR_MISSING\", `Extension \"${extension}\" has no descriptor for build type \"${type}\".`, { why: `Known types: ${Object.keys(extensionDescriptor.nodes).join(\", \")}.` });\n\tif (nodeDescriptor.kind !== \"build\") throw new AssembleError(\"ASSEMBLE.DESCRIPTOR_KIND_MISMATCH\", `Extension \"${extension}\"'s descriptor for type \"${type}\" is a \"${nodeDescriptor.kind}\" descriptor.`, { why: \"Assembling a service build needs a \\\"build\\\" descriptor.\" });\n\treturn nodeDescriptor.assemble({\n\t\tbuild: node.build,\n\t\taddress,\n\t\tcwd\n\t});\n}\nasync function assembleServices(graph, config, cwd, run) {\n\tconst runAssembler = run ?? ((node, address, nodeCwd) => buildDescriptorAssemble(config, node, address, nodeCwd));\n\tconst serviceNodes = graph.nodes.filter((n) => n.node.kind === \"service\");\n\tif (serviceNodes.length === 0) throw new AssembleError(\"ASSEMBLE.SERVICE_MISSING\", \"The loaded graph has no service to assemble.\");\n\tconst bundles = {};\n\tfor (const { id, node } of serviceNodes) try {\n\t\tbundles[id] = await runAssembler(node, id, cwd);\n\t} catch (error) {\n\t\tif (CliStructuredError.is(error)) throw error;\n\t\tthrow new AssembleError(\"ASSEMBLE.BUILD_FAILED\", error instanceof Error ? error.message : String(error), {\n\t\t\tmeta: { address: id },\n\t\t\tcause: error\n\t\t});\n\t}\n\treturn { bundles };\n}\n//#endregion\nexport { AssembleError, assembleServices };\n\n//# sourceMappingURL=index.mjs.map","import { n as configFileMissing, t as checkComposerConfig } from \"./composer-config-CY9fET8H.mjs\";\nimport { t as loadEntry } from \"./load-entry-BjRb7YB3.mjs\";\nimport { CliStructuredError } from \"@internal/foundation/errors\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { Load } from \"@internal/core\";\nimport { assembleServices } from \"@internal/assemble\";\n//#region src/validate-coverage.ts\nfunction lookup(extensions, extension, type, expectedKind, what) {\n\tconst ext = extensions.get(extension);\n\tif (ext === void 0) throw new CliStructuredError(\"CONFIG.EXTENSION_MISSING\", `No extension \"${extension}\" is configured (needed by ${what}).`, {\n\t\tfix: \"Add it to `extensions` in the `composer` section of prisma.config.ts (import its /control entry and list its descriptor).\",\n\t\tmeta: {\n\t\t\textension,\n\t\t\ttype\n\t\t}\n\t});\n\tconst descriptor = ext.nodes[type];\n\tif (descriptor === void 0) throw new CliStructuredError(\"CONFIG.DESCRIPTOR_MISSING\", `Extension \"${extension}\" has no descriptor for node type \"${type}\" (needed by ${what}).`, {\n\t\twhy: `Known types: ${Object.keys(ext.nodes).join(\", \")}.`,\n\t\tmeta: {\n\t\t\textension,\n\t\t\ttype\n\t\t}\n\t});\n\tif (descriptor.kind !== expectedKind) throw new CliStructuredError(\"CONFIG.DESCRIPTOR_KIND_MISMATCH\", `Extension \"${extension}\"'s descriptor for node type \"${type}\" is a \"${descriptor.kind}\" descriptor — ${what} needs a \"${expectedKind}\" descriptor.`, { meta: {\n\t\textension,\n\t\ttype,\n\t\tkind: descriptor.kind\n\t} });\n}\n/** Throws a structured CONFIG.* error on the first uncovered `(extension, type)`; silent when the config covers the whole graph. */\nfunction validateRegistryCoverage(graph, config) {\n\tconst extensions = new Map(config.extensions.map((descriptor) => [descriptor.id, descriptor]));\n\tfor (const { id, node } of graph.nodes) {\n\t\tif (node.kind === \"resource\") {\n\t\t\tlookup(extensions, node.extension, node.type, \"resource\", `resource node \"${id}\"`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (node.kind !== \"service\") continue;\n\t\tlookup(extensions, node.extension, node.type, \"service\", `service node \"${id}\"`);\n\t\tlookup(extensions, node.build.extension, node.build.type, \"build\", `service node \"${id}\"'s build descriptor`);\n\t}\n}\n//#endregion\n//#region src/pipeline.ts\n/**\n* The shared prefix of `deploy`/`destroy`/`dev` (deploy-cli.md § The\n* pipeline; local-dev spec § 6): entry load, Load,\n* registry coverage validation, name resolution, assemble. Deploy and dev\n* diverge after this — deploy resolves containers/preflight/stack file\n* against the hosted providers, dev against the local ones — so everything\n* up to and including assemble lives here once, consumed verbatim by both\n* `run()` (main.ts) and `runDev()` (dev/run-dev.ts), so the two pipelines\n* cannot drift.\n*/\nfunction configError(findings, file) {\n\tconst [first] = findings;\n\treturn new CliStructuredError(first.code, first.summary, {\n\t\t...first.why === void 0 ? {} : { why: first.why },\n\t\tfix: first.fix,\n\t\twhere: { path: first.where ?? file },\n\t\tmeta: {\n\t\t\t...first.field === void 0 ? {} : { field: first.field },\n\t\t\tfindings\n\t\t}\n\t});\n}\n/**\n* Refuses a caller's config with the same findings, in the same order, as the CLI's section validator.\n* The error is the first finding and carries all of them in `meta.findings`. Returns the config with `file` resolved against `cwd`.\n*/\nfunction checkConfigSource(source, cwd) {\n\tconst file = path.resolve(cwd, source.file);\n\tif (!fs.existsSync(file)) throw configError([configFileMissing(file)], file);\n\tconst checked = checkComposerConfig(source.value, file);\n\tif (!checked.ok) throw configError(checked.findings, file);\n\treturn {\n\t\tvalue: checked.value,\n\t\tfile\n\t};\n}\n/**\n* The pipeline's front — entry load and name resolution —\n* WITHOUT Load, coverage, or assemble. `log` needs only who the app is (its\n* config and resolved name) to reach the already-running local instance; it\n* neither builds nor provisions, so it must not require the user's built\n* output the way the full pipeline does.\n*/\nasync function resolveAppIdentity(entry, overrideName, cwd, config) {\n\tconst { value } = checkConfigSource(config, cwd);\n\tconst entryModule = await loadEntry(entry, cwd);\n\tconst name = overrideName ?? entryModule.root.name;\n\tif (name.length === 0) throw new CliStructuredError(\"COMPOSE.NAME_MISSING\", \"The root node has no name.\", { fix: \"Name it at authoring, or pass --name.\" });\n\treturn {\n\t\tconfig: value,\n\t\tname\n\t};\n}\n/**\n* Runs entry load, Load, registry coverage, name resolution, and assemble — steps 1–5 of `run()`. `onAssembleError`, when\n* given, lets a caller decorate an assemble failure with command-specific\n* guidance (destroy's \"build first\" hint) without this shared step knowing\n* about any one command.\n*/\nasync function runPipeline(entry, overrideName, cwd, source, deps = {}, onAssembleError) {\n\tconst configSource = checkConfigSource(source, cwd);\n\tconst config = configSource.value;\n\tconst entryModule = await loadEntry(entry, cwd);\n\tconst graph = Load(entryModule.root);\n\tif (graph.root.node.kind !== \"module\") throw new CliStructuredError(\"COMPOSE.ROOT_NOT_MODULE\", \"The deploy root must be a module.\", { fix: \"Wrap your service, e.g. export default module('name', ({ provision }) => { provision(service); }).\" });\n\tvalidateRegistryCoverage(graph, config);\n\tconst name = overrideName ?? entryModule.root.name;\n\tif (name.length === 0) throw new CliStructuredError(\"COMPOSE.NAME_MISSING\", \"The root node has no name.\", { fix: \"Name it at authoring, or pass --name.\" });\n\tlet assembled;\n\ttry {\n\t\tassembled = await assembleServices(graph, config, cwd, deps.runAssembler);\n\t} catch (error) {\n\t\tif (onAssembleError !== void 0 && error instanceof Error) throw onAssembleError(error);\n\t\tthrow error;\n\t}\n\treturn {\n\t\tconfigSource,\n\t\tentryModule,\n\t\tgraph,\n\t\tname,\n\t\tassembled\n\t};\n}\n//#endregion\nexport { runPipeline as n, resolveAppIdentity as t };\n\n//# sourceMappingURL=pipeline-DAYhea3J.mjs.map"],"mappings":";;;;;;;;;;;;;;AAOA,MAAM,cAAc;AACpB,MAAM,sBAAsB,GAAG,YAAY;AAC3C,MAAM,6BAA6B;AACnC,MAAM,iBAAiB;AACvB,MAAM,qBAAqB;CAC1B;CACA;CACA;CACA;AACD,CAAC,CAAC,KAAK,cAAc,0BAA0B,WAAW;;AAQ1D,SAAS,wBAAwB,YAAY;CAC5C,OAAO,GAAG,WAAW;AACtB;AACA,SAAS,kBAAkB,MAAM;CAChC,OAAO;EACN,MAAM;EACN,SAAS,GAAG,KAAK;EACjB,KAAK;EACL,OAAO;CACR;AACD;;;AAGA,SAAS,SAAS,MAAM;CACvB,IAAI;EACH,OAAOA,KAAG,aAAa,IAAI;CAC5B,QAAQ;EACP,OAAO;CACR;AACD;AACA,SAAS,mBAAmB,YAAY;CACvC,MAAM,YAAYC,OAAK,QAAQ,SAAS,UAAU,CAAC;CACnD,MAAM,QAAQ,mBAAmB,KAAK,SAASA,OAAK,KAAK,WAAW,IAAI,CAAC,CAAC,CAAC,MAAM,SAASD,KAAG,WAAW,IAAI,CAAC;CAC7G,IAAI,UAAU,KAAK,GAAG,OAAO,KAAK;CAClC,OAAO;EACN,MAAM;EACN,SAAS,GAAG,MAAM;EAClB,KAAK;EACL,KAAK;EACL,OAAO;CACR;AACD;AACA,SAAS,SAAS,OAAO;CACxB,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC3E;AACA,SAAS,sBAAsB,OAAO;CACrC,OAAO,SAAS,KAAK,KAAK,OAAO,MAAM,UAAU,YAAY,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM,QAAQ;AAC/G;AACA,SAAS,kBAAkB,OAAO;CACjC,OAAO,SAAS,KAAK,KAAK,OAAO,MAAM,iBAAiB,YAAY,OAAO,MAAM,cAAc;AAChG;AACA,MAAM,eAAe;CACpB,MAAM;CACN,SAAS;CACT,KAAK;CACL,OAAO;AACR;AACA,SAAS,aAAa,KAAK;CAC1B,OAAO;EACN,MAAM;EACN,SAAS,2CAA2C,IAAI;EACxD,KAAK,QAAQ,aAAa,wIAAwI,YAAY,IAAI;EAClL,OAAO;CACR;AACD;AACA,SAAS,gBAAgB,OAAO;CAC/B,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO;EACjC,YAAY,CAAC;EACb,UAAU,CAAC;GACV,MAAM;GACN,SAAS;GACT,KAAK;GACL,OAAO;EACR,CAAC;CACF;CACA,MAAM,WAAW,CAAC;CAClB,MAAM,aAAa,CAAC;CACpB,MAAM,uBAAuB,IAAI,IAAI;CACrC,KAAK,MAAM,CAAC,OAAO,UAAU,MAAM,QAAQ,GAAG;EAC7C,MAAM,QAAQ,cAAc,MAAM;EAClC,IAAI,CAAC,SAAS,KAAK,GAAG;GACrB,SAAS,KAAK;IACb,MAAM;IACN,SAAS,cAAc,MAAM;IAC7B,KAAK;IACL;GACD,CAAC;GACD;EACD;EACA,MAAM,KAAK,MAAM;EACjB,IAAI,OAAO,OAAO,YAAY,GAAG,WAAW,GAAG,SAAS,KAAK;GAC5D,MAAM;GACN,SAAS,cAAc,MAAM;GAC7B,KAAK;GACL,OAAO,GAAG,MAAM;EACjB,CAAC;OACI,IAAI,KAAK,IAAI,EAAE,GAAG,SAAS,KAAK;GACpC,MAAM;GACN,SAAS,cAAc,GAAG;GAC1B,KAAK,wBAAwB,GAAG;GAChC,OAAO,GAAG,MAAM;EACjB,CAAC;OACI,KAAK,IAAI,EAAE;EAChB,IAAI,CAAC,SAAS,MAAM,QAAQ,GAAG,SAAS,KAAK;GAC5C,MAAM;GACN,SAAS,cAAc,MAAM;GAC7B,KAAK;GACL,OAAO,GAAG,MAAM;EACjB,CAAC;EACD,IAAI,sBAAsB,KAAK,GAAG,WAAW,KAAK,KAAK;CACxD;CACA,OAAO;EACN;EACA;CACD;AACD;AACA,SAAS,YAAY,SAAS;CAC7B,IAAI,OAAO,OAAO,SAAS,YAAY,GAAG,OAAO;EAChD,IAAI;EACJ,UAAU,CAAC;GACV,MAAM;GACN,SAAS;GACT,KAAK;GACL,KAAK,mDAAmD;GACxD,OAAO;EACR,CAAC;CACF;CACA,IAAI,OAAO,OAAO,SAAS,UAAU,GAAG,OAAO;EAC9C,IAAI;EACJ,UAAU,CAAC,aAAa,UAAU,CAAC;CACpC;CACA,MAAM,WAAW,OAAO,KAAK,OAAO,CAAC,CAAC,QAAQ,QAAQ,QAAQ,gBAAgB,QAAQ,OAAO,CAAC,CAAC,IAAI,YAAY;CAC/G,MAAM,UAAU,gBAAgB,QAAQ,aAAa;CACrD,SAAS,KAAK,GAAG,QAAQ,QAAQ;CACjC,MAAM,QAAQ,QAAQ;CACtB,IAAI,CAAC,kBAAkB,KAAK,GAAG,SAAS,KAAK,YAAY;CACzD,MAAM,CAAC,OAAO,GAAG,QAAQ;CACzB,IAAI,UAAU,KAAK,KAAK,kBAAkB,KAAK,GAAG,OAAO;EACxD,IAAI;EACJ,OAAO;GACN,YAAY,QAAQ;GACpB;EACD;CACD;CACA,OAAO;EACN,IAAI;EACJ,UAAU,CAAC,SAAS,cAAc,GAAG,IAAI;CAC1C;AACD;;;;;AAKA,SAAS,qBAAqB,KAAK;CAClC,IAAI,CAAC,SAAS,GAAG,GAAG,OAAO;EAC1B,IAAI;EACJ,UAAU,CAAC;GACV,MAAM;GACN,SAAS;GACT,KAAK;EACN,CAAC;CACF;CACA,IAAI;EACH,OAAO,YAAY,EAAE,GAAG,IAAI,CAAC;CAC9B,SAAS,OAAO;EACf,OAAO;GACN,IAAI;GACJ,UAAU,CAAC;IACV,MAAM;IACN,SAAS;IACT,KAAK,qBAAqB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;IAC/E,KAAK;GACN,CAAC;EACF;CACD;AACD;;;;AAIA,SAAS,oBAAoB,KAAK,YAAY;CAC7C,MAAM,UAAU,mBAAmB,UAAU;CAC7C,MAAM,UAAU,qBAAqB,GAAG;CACxC,IAAI,YAAY,KAAK,GAAG,OAAO;CAC/B,OAAO;EACN,IAAI;EACJ,UAAU,QAAQ,KAAK,CAAC,OAAO,IAAI,CAAC,SAAS,GAAG,QAAQ,QAAQ;CACjE;AACD;;;;;;;;;;;;;;;;;;;;;AC/KA,IAAI,aAAa;;;;;;AAMjB,SAAS,0BAA0B;CAClC,IAAI,cAAc,OAAO,QAAQ,SAAS,QAAQ,UAAU;CAC5D,IAAI,OAAO,IAAI,kBAAkB,YAAY;CAC7C,aAAa;CACb,IAAI,cAAc,EAAE,QAAQ,WAAW,SAAS,aAAa;EAC5D,IAAI;GACH,OAAO,YAAY,WAAW,OAAO;EACtC,SAAS,OAAO;GACf,IAAI,CAAC,oBAAoB,SAAS,KAAK,QAAQ,cAAc,KAAK,KAAK,CAAC,sBAAsB,KAAK,GAAG,MAAM;GAC5G,KAAK,MAAM,aAAa,iBAAiB,IAAI,IAAI,WAAW,QAAQ,SAAS,CAAC,GAAG,IAAI,WAAW,cAAc,SAAS,CAAC,GAAG,OAAO,YAAY,UAAU,MAAM,OAAO;GACrK,MAAM;EACP;CACD,EAAE,CAAC;AACJ;;;;;;;;AAQA,SAAS,iBAAiB,UAAU;CACnC,MAAM,OAAO,SAAS;CACtB,IAAI,KAAK,SAAS,MAAM,GAAG;EAC1B,MAAM,OAAO,KAAK,MAAM,GAAG,EAAE;EAC7B,OAAO,CAAC,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC;CAC/B;CACA,IAAI,KAAK,SAAS,MAAM,GAAG;EAC1B,MAAM,OAAO,KAAK,MAAM,GAAG,EAAE;EAC7B,OAAO,CAAC,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC;CAC/B;CACA,MAAM,OAAO,KAAK,SAAS,KAAK,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI;CACxD,OAAO;EACN,IAAI,IAAI,GAAG,KAAK,IAAI;EACpB,IAAI,IAAI,GAAG,KAAK,KAAK;EACrB,IAAI,IAAI,GAAG,KAAK,KAAK;EACrB,IAAI,IAAI,GAAG,KAAK,UAAU;CAC3B;AACD;AACA,SAAS,oBAAoB,WAAW;CACvC,OAAO,UAAU,WAAW,IAAI,KAAK,UAAU,WAAW,KAAK;AAChE;AACA,SAAS,sBAAsB,OAAO;CACrC,IAAI,EAAE,iBAAiB,QAAQ,OAAO;CACtC,IAAI,EAAE,UAAU,QAAQ,OAAO;CAC/B,OAAO,MAAM,SAAS;AACvB;;;;;;;;;;;;AAcA,MAAM,yBAAyB;AAC/B,MAAM,iBAAiB,CAAC,QAAQ,MAAM;AACtC,SAAS,UAAU,OAAO;CACzB,OAAO,UAAU,SAAS,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,KAAK;AAC9E;AACA,SAAS,qBAAqB,OAAO;CACpC,IAAI,EAAE,iBAAiB,QAAQ,OAAO,KAAK;CAC3C,IAAI,UAAU,KAAK,MAAM,wBAAwB,OAAO,KAAK;CAC7D,OAAO,2CAA2C,KAAK,MAAM,OAAO,CAAC,GAAG;AACzE;;;;;;;AAOA,SAAS,oBAAoB,OAAO,WAAW;CAC9C,MAAM,gBAAgB,qBAAqB,KAAK;CAChD,IAAI,kBAAkB,KAAK,GAAG,OAAO,KAAK;CAC1C,IAAI,CAAC,eAAe,MAAM,QAAQ,cAAc,SAAS,GAAG,CAAC,GAAG,OAAO,KAAK;CAC5E,OAAO;EACN,SAAS,IAAI,cAAc;EAC3B,KAAK,iBAAiB,UAAU;EAChC,KAAK;CACN;AACD;;;;;;;AASA,eAAe,UAAU,UAAU,KAAK;CACvC,wBAAwB;CACxB,MAAM,eAAeE,OAAK,QAAQ,KAAK,QAAQ;CAC/C,IAAI;CACJ,IAAI;EACH,MAAM,MAAM,OAAO,cAAc,YAAY,CAAC,CAAC;CAChD,SAAS,OAAO;EACf,MAAM,YAAY,oBAAoB,OAAO,YAAY;EACzD,IAAI,cAAc,KAAK,GAAG,MAAM,IAAI,mBAAmB,4BAA4B,UAAU,SAAS;GACrG,KAAK,UAAU;GACf,KAAK,UAAU;GACf,OAAO,EAAE,MAAM,aAAa;GAC5B,OAAO;EACR,CAAC;EACD,MAAM,IAAI,mBAAmB,4BAA4B,kCAAkC,aAAa,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,KAAK;GACtK,OAAO,EAAE,MAAM,aAAa;GAC5B,OAAO;EACR,CAAC;CACF;CACA,MAAM,OAAO,UAAU,GAAG,CAAC,CAAC;CAC5B,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,SAAS,gBAAgB,KAAK,SAAS,YAAY,MAAM,IAAI,mBAAmB,gCAAgC,iBAAiB,aAAa,wDAAwD;EAC/N,KAAK;EACL,OAAO,EAAE,MAAM,aAAa;CAC7B,CAAC;CACD,OAAO;EACN,MAAM;EACN,MAAM,UAAU,IAAI;CACrB;AACD;;;;;;;;;AClJA,IAAI,gBAAgB,cAAc,mBAAmB;CACpD,YAAY,MAAM,SAAS,SAAS;EACnC,MAAM,MAAM,SAAS,OAAO;CAC7B;AACD;;;;;;;AASA,SAAS,wBAAwB,QAAQ,MAAM,SAAS,KAAK;CAC5D,MAAM,EAAE,WAAW,SAAS,KAAK;CACjC,MAAM,sBAAsB,OAAO,WAAW,MAAM,cAAc,UAAU,OAAO,SAAS;CAC5F,IAAI,wBAAwB,KAAK,GAAG,MAAM,IAAI,cAAc,8BAA8B,iBAAiB,UAAU,sCAAsC,KAAK,KAAK,cAAc,EAAE,KAAK,wEAAwE,CAAC;CACnQ,MAAM,iBAAiB,oBAAoB,MAAM;CACjD,IAAI,mBAAmB,KAAK,GAAG,MAAM,IAAI,cAAc,+BAA+B,cAAc,UAAU,sCAAsC,KAAK,KAAK,EAAE,KAAK,gBAAgB,OAAO,KAAK,oBAAoB,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,GAAG,CAAC;CAC3O,IAAI,eAAe,SAAS,SAAS,MAAM,IAAI,cAAc,qCAAqC,cAAc,UAAU,2BAA2B,KAAK,UAAU,eAAe,KAAK,gBAAgB,EAAE,KAAK,2DAA2D,CAAC;CAC3Q,OAAO,eAAe,SAAS;EAC9B,OAAO,KAAK;EACZ;EACA;CACD,CAAC;AACF;AACA,eAAe,iBAAiB,OAAO,QAAQ,KAAK,KAAK;CACxD,MAAM,eAAe,SAAS,MAAM,SAAS,YAAY,wBAAwB,QAAQ,MAAM,SAAS,OAAO;CAC/G,MAAM,eAAe,MAAM,MAAM,QAAQ,MAAM,EAAE,KAAK,SAAS,SAAS;CACxE,IAAI,aAAa,WAAW,GAAG,MAAM,IAAI,cAAc,4BAA4B,8CAA8C;CACjI,MAAM,UAAU,CAAC;CACjB,KAAK,MAAM,EAAE,IAAI,UAAU,cAAc,IAAI;EAC5C,QAAQ,MAAM,MAAM,aAAa,MAAM,IAAI,GAAG;CAC/C,SAAS,OAAO;EACf,IAAI,mBAAmB,GAAG,KAAK,GAAG,MAAM;EACxC,MAAM,IAAI,cAAc,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG;GACxG,MAAM,EAAE,SAAS,GAAG;GACpB,OAAO;EACR,CAAC;CACF;CACA,OAAO,EAAE,QAAQ;AAClB;;;ACzCA,SAAS,OAAO,YAAY,WAAW,MAAM,cAAc,MAAM;CAChE,MAAM,MAAM,WAAW,IAAI,SAAS;CACpC,IAAI,QAAQ,KAAK,GAAG,MAAM,IAAI,mBAAmB,4BAA4B,iBAAiB,UAAU,6BAA6B,KAAK,KAAK;EAC9I,KAAK;EACL,MAAM;GACL;GACA;EACD;CACD,CAAC;CACD,MAAM,aAAa,IAAI,MAAM;CAC7B,IAAI,eAAe,KAAK,GAAG,MAAM,IAAI,mBAAmB,6BAA6B,cAAc,UAAU,qCAAqC,KAAK,eAAe,KAAK,KAAK;EAC/K,KAAK,gBAAgB,OAAO,KAAK,IAAI,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE;EACvD,MAAM;GACL;GACA;EACD;CACD,CAAC;CACD,IAAI,WAAW,SAAS,cAAc,MAAM,IAAI,mBAAmB,mCAAmC,cAAc,UAAU,gCAAgC,KAAK,UAAU,WAAW,KAAK,iBAAiB,KAAK,YAAY,aAAa,gBAAgB,EAAE,MAAM;EACnQ;EACA;EACA,MAAM,WAAW;CAClB,EAAE,CAAC;AACJ;;AAEA,SAAS,yBAAyB,OAAO,QAAQ;CAChD,MAAM,aAAa,IAAI,IAAI,OAAO,WAAW,KAAK,eAAe,CAAC,WAAW,IAAI,UAAU,CAAC,CAAC;CAC7F,KAAK,MAAM,EAAE,IAAI,UAAU,MAAM,OAAO;EACvC,IAAI,KAAK,SAAS,YAAY;GAC7B,OAAO,YAAY,KAAK,WAAW,KAAK,MAAM,YAAY,kBAAkB,GAAG,EAAE;GACjF;EACD;EACA,IAAI,KAAK,SAAS,WAAW;EAC7B,OAAO,YAAY,KAAK,WAAW,KAAK,MAAM,WAAW,iBAAiB,GAAG,EAAE;EAC/E,OAAO,YAAY,KAAK,MAAM,WAAW,KAAK,MAAM,MAAM,SAAS,iBAAiB,GAAG,qBAAqB;CAC7G;AACD;;;;;;;;;;;AAaA,SAAS,YAAY,UAAU,MAAM;CACpC,MAAM,CAAC,SAAS;CAChB,OAAO,IAAI,mBAAmB,MAAM,MAAM,MAAM,SAAS;EACxD,GAAG,MAAM,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,IAAI;EAChD,KAAK,MAAM;EACX,OAAO,EAAE,MAAM,MAAM,SAAS,KAAK;EACnC,MAAM;GACL,GAAG,MAAM,UAAU,KAAK,IAAI,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;GACtD;EACD;CACD,CAAC;AACF;;;;;AAKA,SAAS,kBAAkB,QAAQ,KAAK;CACvC,MAAM,OAAOC,OAAK,QAAQ,KAAK,OAAO,IAAI;CAC1C,IAAI,CAACC,KAAG,WAAW,IAAI,GAAG,MAAM,YAAY,CAAC,kBAAkB,IAAI,CAAC,GAAG,IAAI;CAC3E,MAAM,UAAU,oBAAoB,OAAO,OAAO,IAAI;CACtD,IAAI,CAAC,QAAQ,IAAI,MAAM,YAAY,QAAQ,UAAU,IAAI;CACzD,OAAO;EACN,OAAO,QAAQ;EACf;CACD;AACD;;;;;;;;AAQA,eAAe,mBAAmB,OAAO,cAAc,KAAK,QAAQ;CACnE,MAAM,EAAE,UAAU,kBAAkB,QAAQ,GAAG;CAC/C,MAAM,cAAc,MAAM,UAAU,OAAO,GAAG;CAC9C,MAAM,OAAO,gBAAgB,YAAY,KAAK;CAC9C,IAAI,KAAK,WAAW,GAAG,MAAM,IAAI,mBAAmB,wBAAwB,8BAA8B,EAAE,KAAK,wCAAwC,CAAC;CAC1J,OAAO;EACN,QAAQ;EACR;CACD;AACD;;;;;;;AAOA,eAAe,YAAY,OAAO,cAAc,KAAK,QAAQ,OAAO,CAAC,GAAG,iBAAiB;CACxF,MAAM,eAAe,kBAAkB,QAAQ,GAAG;CAClD,MAAM,SAAS,aAAa;CAC5B,MAAM,cAAc,MAAM,UAAU,OAAO,GAAG;CAC9C,MAAM,QAAQ,KAAK,YAAY,IAAI;CACnC,IAAI,MAAM,KAAK,KAAK,SAAS,UAAU,MAAM,IAAI,mBAAmB,2BAA2B,qCAAqC,EAAE,KAAK,qGAAqG,CAAC;CACjP,yBAAyB,OAAO,MAAM;CACtC,MAAM,OAAO,gBAAgB,YAAY,KAAK;CAC9C,IAAI,KAAK,WAAW,GAAG,MAAM,IAAI,mBAAmB,wBAAwB,8BAA8B,EAAE,KAAK,wCAAwC,CAAC;CAC1J,IAAI;CACJ,IAAI;EACH,YAAY,MAAM,iBAAiB,OAAO,QAAQ,KAAK,KAAK,YAAY;CACzE,SAAS,OAAO;EACf,IAAI,oBAAoB,KAAK,KAAK,iBAAiB,OAAO,MAAM,gBAAgB,KAAK;EACrF,MAAM;CACP;CACA,OAAO;EACN;EACA;EACA;EACA;EACA;CACD;AACD"}
|
package/dist/report.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { f as DeploymentResult } from "./app-config-
|
|
2
|
-
import "./deploy-
|
|
3
|
-
import { r as captureEngineFailure } from "./deployment-summary-CU-eVvJM-
|
|
1
|
+
import { f as DeploymentResult } from "./app-config-Cay7dFv5-CMlgGodQ.mjs";
|
|
2
|
+
import "./deploy-CE3fmcF9.mjs";
|
|
3
|
+
import { r as captureEngineFailure } from "./deployment-summary-CU-eVvJM-Cu9hKMdz.mjs";
|
|
4
4
|
//#region ../../0-framework/3-tooling/cli/dist/report.d.mts
|
|
5
5
|
//#region src/render-deployment.d.ts
|
|
6
6
|
/**
|