@prisma/compute-sdk 0.22.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,366 @@
1
+ import path from "node:path";
2
+ import { Result, TaggedError } from "better-result";
3
+ import { frameworkByKey, isConfigBackedBuildType } from "./frameworks.js";
4
+ import { COMPUTE_FRAMEWORKS } from "./types.js";
5
+ export class ComputeConfigInvalidError extends TaggedError("ComputeConfigInvalidError")() {
6
+ constructor(configPath, issues) {
7
+ super({
8
+ message: `${path.basename(configPath)} is invalid: ${issues.join(" ")}`,
9
+ configPath,
10
+ issues,
11
+ });
12
+ }
13
+ }
14
+ export class ComputeConfigTargetRequiredError extends TaggedError("ComputeConfigTargetRequiredError")() {
15
+ constructor(configPath, availableTargets) {
16
+ super({
17
+ message: `${path.basename(configPath)} defines multiple apps. Pass a target: ${availableTargets.join(", ")}.`,
18
+ configPath,
19
+ availableTargets,
20
+ });
21
+ }
22
+ }
23
+ export class ComputeConfigTargetUnknownError extends TaggedError("ComputeConfigTargetUnknownError")() {
24
+ constructor(configPath, requestedTarget, availableTargets) {
25
+ super({
26
+ message: `${path.basename(configPath)} does not define an app named "${requestedTarget}". Available: ${availableTargets.join(", ")}.`,
27
+ configPath,
28
+ requestedTarget,
29
+ availableTargets,
30
+ });
31
+ }
32
+ }
33
+ const KNOWN_APP_KEYS = [
34
+ "name",
35
+ "root",
36
+ "framework",
37
+ "entry",
38
+ "httpPort",
39
+ "env",
40
+ "build",
41
+ ];
42
+ const KNOWN_ENV_KEYS = ["file", "vars"];
43
+ const KNOWN_BUILD_KEYS = ["command", "outputDirectory"];
44
+ /**
45
+ * Validates and normalizes a config module's default export. Reports every
46
+ * issue at once so authors fix the file in one pass.
47
+ */
48
+ export function normalizeComputeConfig(exported, configPath) {
49
+ const issues = [];
50
+ const targets = [];
51
+ let kind = "single";
52
+ if (!isPlainObject(exported)) {
53
+ issues.push("The config must `export default defineComputeConfig({ ... })` with an object value.");
54
+ }
55
+ else {
56
+ const hasApp = exported.app !== undefined;
57
+ const hasApps = exported.apps !== undefined;
58
+ for (const key of Object.keys(exported)) {
59
+ if (key !== "app" && key !== "apps") {
60
+ issues.push(`Unknown top-level key "${key}". Expected "app" or "apps".`);
61
+ }
62
+ }
63
+ if (hasApp && hasApps) {
64
+ issues.push("Use either `app` (single app) or `apps` (multi-app), not both.");
65
+ }
66
+ else if (hasApp) {
67
+ const target = normalizeAppEntry(exported.app, "app", null, issues);
68
+ if (target) {
69
+ targets.push(target);
70
+ }
71
+ }
72
+ else if (hasApps) {
73
+ kind = "multi";
74
+ if (!isPlainObject(exported.apps)) {
75
+ issues.push("`apps` must be an object keyed by deploy target name.");
76
+ }
77
+ else {
78
+ const entries = Object.entries(exported.apps);
79
+ if (entries.length === 0) {
80
+ issues.push("`apps` must define at least one app.");
81
+ }
82
+ for (const [key, value] of entries) {
83
+ if (key.trim().length === 0) {
84
+ issues.push("`apps` keys must be non-empty target names.");
85
+ continue;
86
+ }
87
+ const target = normalizeAppEntry(value, `apps.${key}`, key, issues);
88
+ if (target) {
89
+ targets.push(target);
90
+ }
91
+ }
92
+ }
93
+ }
94
+ else {
95
+ issues.push("Define `app` for a single-app repository or `apps` for a multi-app repository.");
96
+ }
97
+ }
98
+ if (issues.length > 0) {
99
+ return Result.err(new ComputeConfigInvalidError(configPath, issues));
100
+ }
101
+ return Result.ok({
102
+ configPath,
103
+ configDir: path.dirname(configPath),
104
+ relativeConfigPath: path.basename(configPath),
105
+ kind,
106
+ targets,
107
+ });
108
+ }
109
+ /** Absolute app directory of a config target. */
110
+ export function computeTargetAppDir(config, target) {
111
+ return path.resolve(config.configDir, target.root ?? ".");
112
+ }
113
+ /**
114
+ * Selects a deploy target. Single-app configs return their app (a requested
115
+ * target must then match the configured `name`); multi-app configs require a
116
+ * matching key unless they hold exactly one target.
117
+ */
118
+ export function selectComputeDeployTarget(config, requestedTarget) {
119
+ if (config.kind === "single") {
120
+ const target = config.targets[0];
121
+ if (!target) {
122
+ return Result.err(new ComputeConfigTargetRequiredError(config.configPath, []));
123
+ }
124
+ if (requestedTarget && requestedTarget !== target.name) {
125
+ return Result.err(new ComputeConfigTargetUnknownError(config.configPath, requestedTarget, target.name ? [target.name] : []));
126
+ }
127
+ return Result.ok(target);
128
+ }
129
+ const availableTargets = config.targets.map((target) => target.key ?? "");
130
+ if (!requestedTarget) {
131
+ const only = config.targets[0];
132
+ if (config.targets.length === 1 && only) {
133
+ return Result.ok(only);
134
+ }
135
+ return Result.err(new ComputeConfigTargetRequiredError(config.configPath, availableTargets));
136
+ }
137
+ const matched = config.targets.find((target) => target.key === requestedTarget);
138
+ if (!matched) {
139
+ return Result.err(new ComputeConfigTargetUnknownError(config.configPath, requestedTarget, availableTargets));
140
+ }
141
+ return Result.ok(matched);
142
+ }
143
+ /**
144
+ * Infers the deploy target whose app directory contains `cwd`, so commands
145
+ * run from inside a target's root select it without a target argument. The
146
+ * deepest matching root wins; an ambiguous tie infers nothing.
147
+ */
148
+ export function inferComputeTargetFromCwd(config, cwd) {
149
+ if (config.kind !== "multi") {
150
+ return undefined;
151
+ }
152
+ const resolvedCwd = path.resolve(cwd);
153
+ let bestKey;
154
+ let bestDepth = -1;
155
+ let bestIsTied = false;
156
+ for (const target of config.targets) {
157
+ const appDir = computeTargetAppDir(config, target);
158
+ const relative = path.relative(appDir, resolvedCwd);
159
+ if (relative.startsWith("..") || path.isAbsolute(relative)) {
160
+ continue;
161
+ }
162
+ const depth = appDir.split(path.sep).length;
163
+ if (depth > bestDepth) {
164
+ bestKey = target.key ?? undefined;
165
+ bestDepth = depth;
166
+ bestIsTied = false;
167
+ }
168
+ else if (depth === bestDepth) {
169
+ bestIsTied = true;
170
+ }
171
+ }
172
+ return bestIsTied ? undefined : bestKey;
173
+ }
174
+ function normalizeAppEntry(value, label, key, issues) {
175
+ if (!isPlainObject(value)) {
176
+ issues.push(`\`${label}\` must be an object.`);
177
+ return null;
178
+ }
179
+ for (const entryKey of Object.keys(value)) {
180
+ if (!KNOWN_APP_KEYS.includes(entryKey)) {
181
+ issues.push(`Unknown key "${entryKey}" in \`${label}\`. Expected one of: ${KNOWN_APP_KEYS.join(", ")}.`);
182
+ }
183
+ }
184
+ const name = readOptionalNonEmptyString(value.name, `${label}.name`, issues);
185
+ const entry = readOptionalNonEmptyString(value.entry, `${label}.entry`, issues);
186
+ let root = null;
187
+ if (value.root !== undefined) {
188
+ const rawRoot = readOptionalNonEmptyString(value.root, `${label}.root`, issues);
189
+ if (rawRoot) {
190
+ const normalized = normalizeRelativePath(rawRoot)?.replace(/\/+$/, "");
191
+ if (!normalized) {
192
+ issues.push(`\`${label}.root\` must be a relative path inside the repository.`);
193
+ }
194
+ else if (normalized !== ".") {
195
+ root = normalized;
196
+ }
197
+ }
198
+ }
199
+ let framework = null;
200
+ if (value.framework !== undefined) {
201
+ if (typeof value.framework === "string" &&
202
+ COMPUTE_FRAMEWORKS.includes(value.framework)) {
203
+ framework = value.framework;
204
+ }
205
+ else {
206
+ issues.push(`\`${label}.framework\` must be one of: ${COMPUTE_FRAMEWORKS.join(", ")}.`);
207
+ }
208
+ }
209
+ if (entry && framework && !frameworkByKey(framework).usesEntrypoint) {
210
+ issues.push(`\`${label}.entry\` is not supported with the ${framework} framework; it derives its entrypoint from build output.`);
211
+ }
212
+ let httpPort = null;
213
+ if (value.httpPort !== undefined) {
214
+ if (typeof value.httpPort === "number" &&
215
+ Number.isInteger(value.httpPort) &&
216
+ value.httpPort > 0 &&
217
+ value.httpPort <= 65535) {
218
+ httpPort = value.httpPort;
219
+ }
220
+ else {
221
+ issues.push(`\`${label}.httpPort\` must be an integer between 1 and 65535.`);
222
+ }
223
+ }
224
+ const envInputs = normalizeEnvConfig(value.env, `${label}.env`, issues);
225
+ const build = normalizeBuildConfig(value.build, `${label}.build`, issues);
226
+ if (build &&
227
+ framework &&
228
+ !isConfigBackedBuildType(frameworkByKey(framework).buildType)) {
229
+ issues.push(`\`${label}.build\` is not supported with the ${framework} framework; its build runs automatically during deploy.`);
230
+ }
231
+ return {
232
+ key,
233
+ name,
234
+ root,
235
+ framework,
236
+ entry,
237
+ httpPort,
238
+ envInputs,
239
+ build,
240
+ };
241
+ }
242
+ function normalizeBuildConfig(value, label, issues) {
243
+ if (value === undefined) {
244
+ return null;
245
+ }
246
+ if (!isPlainObject(value)) {
247
+ issues.push(`\`${label}\` must be an object with \`command\` and/or \`outputDirectory\`.`);
248
+ return null;
249
+ }
250
+ for (const buildKey of Object.keys(value)) {
251
+ if (!KNOWN_BUILD_KEYS.includes(buildKey)) {
252
+ issues.push(`Unknown key "${buildKey}" in \`${label}\`. Expected one of: ${KNOWN_BUILD_KEYS.join(", ")}.`);
253
+ }
254
+ }
255
+ let command;
256
+ if (value.command !== undefined) {
257
+ if (value.command === null) {
258
+ command = null;
259
+ }
260
+ else if (typeof value.command === "string" &&
261
+ value.command.trim().length > 0) {
262
+ command = value.command.trim();
263
+ }
264
+ else {
265
+ issues.push(`\`${label}.command\` must be a non-empty string, or null to skip the build step.`);
266
+ }
267
+ }
268
+ let outputDirectory;
269
+ if (value.outputDirectory !== undefined) {
270
+ const normalized = typeof value.outputDirectory === "string"
271
+ ? normalizeRelativePath(value.outputDirectory)?.replace(/\/+$/, "")
272
+ : undefined;
273
+ if (!normalized) {
274
+ issues.push(`\`${label}.outputDirectory\` must be a relative path inside the app root.`);
275
+ }
276
+ else {
277
+ outputDirectory = normalized;
278
+ }
279
+ }
280
+ if (command === undefined && outputDirectory === undefined) {
281
+ issues.push(`\`${label}\` must set \`command\` and/or \`outputDirectory\`.`);
282
+ return null;
283
+ }
284
+ return { command, outputDirectory };
285
+ }
286
+ function normalizeEnvConfig(value, label, issues) {
287
+ if (value === undefined) {
288
+ return [];
289
+ }
290
+ if (typeof value === "string") {
291
+ const file = value.trim();
292
+ if (file.length === 0) {
293
+ issues.push(`\`${label}\` must be a non-empty dotenv file path when given as a string.`);
294
+ return [];
295
+ }
296
+ return [file];
297
+ }
298
+ if (!isPlainObject(value)) {
299
+ issues.push(`\`${label}\` must be a dotenv file path or an object with \`file\` and/or \`vars\`.`);
300
+ return [];
301
+ }
302
+ for (const envKey of Object.keys(value)) {
303
+ if (!KNOWN_ENV_KEYS.includes(envKey)) {
304
+ issues.push(`Unknown key "${envKey}" in \`${label}\`. Expected one of: ${KNOWN_ENV_KEYS.join(", ")}.`);
305
+ }
306
+ }
307
+ const envInputs = [];
308
+ if (value.file !== undefined) {
309
+ const files = Array.isArray(value.file) ? value.file : [value.file];
310
+ for (const file of files) {
311
+ if (typeof file !== "string" || file.trim().length === 0) {
312
+ issues.push(`\`${label}.file\` must be a non-empty dotenv file path or an array of them.`);
313
+ continue;
314
+ }
315
+ envInputs.push(file.trim());
316
+ }
317
+ }
318
+ if (value.vars !== undefined) {
319
+ if (!isPlainObject(value.vars)) {
320
+ issues.push(`\`${label}.vars\` must be an object of NAME: value pairs.`);
321
+ }
322
+ else {
323
+ for (const [varName, varValue] of Object.entries(value.vars)) {
324
+ if (typeof varValue !== "string" || varValue.length === 0) {
325
+ issues.push(`\`${label}.vars.${varName}\` must be a non-empty string.`);
326
+ continue;
327
+ }
328
+ envInputs.push(`${varName}=${varValue}`);
329
+ }
330
+ }
331
+ }
332
+ return envInputs;
333
+ }
334
+ function readOptionalNonEmptyString(value, label, issues) {
335
+ if (value === undefined) {
336
+ return null;
337
+ }
338
+ if (typeof value !== "string" || value.trim().length === 0) {
339
+ issues.push(`\`${label}\` must be a non-empty string.`);
340
+ return null;
341
+ }
342
+ return value.trim();
343
+ }
344
+ function isPlainObject(value) {
345
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
346
+ }
347
+ function normalizeRelativePath(value) {
348
+ const raw = value.trim().replace(/\\/g, "/");
349
+ if (raw.length === 0 || raw.split("/").includes("..")) {
350
+ return undefined;
351
+ }
352
+ // Windows drive-relative paths ("C:dir") escape the config directory but
353
+ // are not absolute under either path.win32 or path.posix.
354
+ if (/^[A-Za-z]:/.test(raw)) {
355
+ return undefined;
356
+ }
357
+ const normalized = path.posix.normalize(raw);
358
+ const segments = normalized.split("/");
359
+ if (path.win32.isAbsolute(value) ||
360
+ path.posix.isAbsolute(normalized) ||
361
+ segments.includes("..")) {
362
+ return undefined;
363
+ }
364
+ return normalized === "." ? "." : normalized;
365
+ }
366
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/config/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ComputeConfig } from "./types.ts";
2
+ /**
3
+ * Renders a `prisma.compute.ts` source file for a config — the scaffolding
4
+ * counterpart of `loadComputeConfig`. Output round-trips through
5
+ * `normalizeComputeConfig` and is stable for committing to a repository.
6
+ */
7
+ export declare function serializeComputeConfig(config: ComputeConfig, options?: {
8
+ /** Import specifier for the typed helper. Defaults to this SDK. */
9
+ importFrom?: string;
10
+ }): string;
11
+ //# sourceMappingURL=serialize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../src/config/serialize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,aAAa,EAAE,MAAM,YAAY,CAAC;AAElE;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE;IACR,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,MAAM,CAaR"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Renders a `prisma.compute.ts` source file for a config — the scaffolding
3
+ * counterpart of `loadComputeConfig`. Output round-trips through
4
+ * `normalizeComputeConfig` and is stable for committing to a repository.
5
+ */
6
+ export function serializeComputeConfig(config, options) {
7
+ const importFrom = options?.importFrom ?? "@prisma/compute-sdk/config";
8
+ const body = "app" in config && config.app !== undefined
9
+ ? `{\n app: ${renderValue(config.app, 1)},\n}`
10
+ : `{\n apps: ${renderValue(config.apps, 1)},\n}`;
11
+ return [
12
+ `import { defineComputeConfig } from ${JSON.stringify(importFrom)};`,
13
+ "",
14
+ `export default defineComputeConfig(${body});`,
15
+ "",
16
+ ].join("\n");
17
+ }
18
+ const IDENTIFIER_KEY = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
19
+ function renderValue(value, depth) {
20
+ if (value === null) {
21
+ return "null";
22
+ }
23
+ switch (typeof value) {
24
+ case "string":
25
+ return JSON.stringify(value);
26
+ case "number":
27
+ case "boolean":
28
+ return String(value);
29
+ case "object":
30
+ break;
31
+ default:
32
+ throw new Error(`Cannot serialize a ${typeof value} value in a compute config.`);
33
+ }
34
+ if (Array.isArray(value)) {
35
+ return `[${value.map((entry) => renderValue(entry, depth)).join(", ")}]`;
36
+ }
37
+ const entries = Object.entries(value).filter(([, entry]) => entry !== undefined);
38
+ if (entries.length === 0) {
39
+ return "{}";
40
+ }
41
+ const indent = " ".repeat(depth + 1);
42
+ const closingIndent = " ".repeat(depth);
43
+ const rendered = entries.map(([key, entry]) => {
44
+ // "__proto__" needs a computed key: in an object literal both the bare
45
+ // and the quoted form set the prototype instead of defining a property.
46
+ const renderedKey = key === "__proto__"
47
+ ? '["__proto__"]'
48
+ : IDENTIFIER_KEY.test(key)
49
+ ? key
50
+ : JSON.stringify(key);
51
+ return `${indent}${renderedKey}: ${renderValue(entry, depth + 1)},`;
52
+ });
53
+ return `{\n${rendered.join("\n")}\n${closingIndent}}`;
54
+ }
55
+ //# sourceMappingURL=serialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../src/config/serialize.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAqB,EACrB,OAGC;IAED,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,4BAA4B,CAAC;IACvE,MAAM,IAAI,GACR,KAAK,IAAI,MAAM,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS;QACzC,CAAC,CAAC,aAAa,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM;QAC/C,CAAC,CAAC,cAAc,WAAW,CAAE,MAAqD,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAEtG,OAAO;QACL,uCAAuC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG;QACpE,EAAE;QACF,sCAAsC,IAAI,IAAI;QAC9C,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,cAAc,GAAG,4BAA4B,CAAC;AAEpD,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa;IAChD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,QAAQ,OAAO,KAAK,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,KAAK,QAAQ;YACX,MAAM;QACR;YACE,MAAM,IAAI,KAAK,CACb,sBAAsB,OAAO,KAAK,6BAA6B,CAChE,CAAC;IACN,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC3E,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC,MAAM,CACrE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CACnC,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC5C,uEAAuE;QACvE,wEAAwE;QACxE,MAAM,WAAW,GACf,GAAG,KAAK,WAAW;YACjB,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;gBACxB,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,GAAG,MAAM,GAAG,WAAW,KAAK,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,aAAa,GAAG,CAAC;AACxD,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Resolves the directories from `startPath` up to its source root, nearest
3
+ * first. The source root is the closest ancestor that looks like a repository
4
+ * or workspace root; a standalone directory is its own source root, so
5
+ * discovery never escapes into unrelated parent directories.
6
+ */
7
+ export declare function resolveSourceRoot(startPath: string, signal?: AbortSignal): Promise<string>;
8
+ /** Directories from `startPath` up to its source root, nearest first. */
9
+ export declare function sourceRootLineage(startPath: string, signal?: AbortSignal): Promise<string[]>;
10
+ //# sourceMappingURL=source-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-root.d.ts","sourceRoot":"","sources":["../../src/config/source-root.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,yEAAyE;AACzE,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB"}
@@ -0,0 +1,72 @@
1
+ import { readFile, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ /**
4
+ * Resolves the directories from `startPath` up to its source root, nearest
5
+ * first. The source root is the closest ancestor that looks like a repository
6
+ * or workspace root; a standalone directory is its own source root, so
7
+ * discovery never escapes into unrelated parent directories.
8
+ */
9
+ export async function resolveSourceRoot(startPath, signal) {
10
+ let current = path.resolve(startPath);
11
+ while (true) {
12
+ if ((await pathExists(path.join(current, ".git"), signal)) ||
13
+ (await pathExists(path.join(current, "pnpm-workspace.yaml"), signal)) ||
14
+ (await pathExists(path.join(current, "bun.lock"), signal)) ||
15
+ (await pathExists(path.join(current, "bun.lockb"), signal)) ||
16
+ (await packageJsonDeclaresWorkspaces(current, signal))) {
17
+ return current;
18
+ }
19
+ const parent = path.dirname(current);
20
+ if (parent === current) {
21
+ return path.resolve(startPath);
22
+ }
23
+ current = parent;
24
+ }
25
+ }
26
+ /** Directories from `startPath` up to its source root, nearest first. */
27
+ export async function sourceRootLineage(startPath, signal) {
28
+ const sourceRoot = await resolveSourceRoot(startPath, signal);
29
+ const lineage = [];
30
+ let current = path.resolve(startPath);
31
+ while (true) {
32
+ lineage.push(current);
33
+ if (current === sourceRoot) {
34
+ return lineage;
35
+ }
36
+ const parent = path.dirname(current);
37
+ if (parent === current) {
38
+ return lineage;
39
+ }
40
+ current = parent;
41
+ }
42
+ }
43
+ async function packageJsonDeclaresWorkspaces(directory, signal) {
44
+ signal?.throwIfAborted();
45
+ try {
46
+ const content = await readFile(path.join(directory, "package.json"), {
47
+ encoding: "utf8",
48
+ signal,
49
+ });
50
+ const parsed = JSON.parse(content);
51
+ return Boolean(parsed.workspaces);
52
+ }
53
+ catch (error) {
54
+ if (signal?.aborted)
55
+ throw error;
56
+ return false;
57
+ }
58
+ }
59
+ async function pathExists(targetPath, signal) {
60
+ try {
61
+ signal?.throwIfAborted();
62
+ await stat(targetPath);
63
+ signal?.throwIfAborted();
64
+ return true;
65
+ }
66
+ catch (error) {
67
+ if (signal?.aborted)
68
+ throw error;
69
+ return false;
70
+ }
71
+ }
72
+ //# sourceMappingURL=source-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-root.js","sourceRoot":"","sources":["../../src/config/source-root.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * The compute config contract: the shape of `prisma.compute.ts`.
3
+ *
4
+ * This module is the shared source of truth for every consumer of the
5
+ * deploy graph (CLI, build-runner, scaffolding). It must stay free of
6
+ * runtime dependencies so user config files can import it cheaply.
7
+ */
8
+ export declare const COMPUTE_FRAMEWORKS: readonly ["nextjs", "nuxt", "astro", "hono", "tanstack-start", "bun"];
9
+ export type ComputeFramework = (typeof COMPUTE_FRAMEWORKS)[number];
10
+ export interface ComputeEnvConfig {
11
+ /** Dotenv file path(s) resolved relative to the config file directory. */
12
+ file?: string | string[];
13
+ /**
14
+ * Inline environment variable assignments. Values must be non-empty and
15
+ * are deployed as-is. This file is committed — keep secrets in platform
16
+ * branch config; consumers may ignore inline vars on git-push deploys.
17
+ */
18
+ vars?: Record<string, string>;
19
+ }
20
+ export interface ComputeBuildConfig {
21
+ /** Build command run in the app root. `null` skips the build step. */
22
+ command?: string | null;
23
+ /** Framework output path relative to the app root, e.g. ".next/standalone". */
24
+ outputDirectory?: string;
25
+ }
26
+ export interface ComputeAppConfig {
27
+ /** Deployed app name. Defaults to the `apps` key, then consumer-side inference. */
28
+ name?: string;
29
+ /** App directory relative to the config file. Defaults to the config file directory. */
30
+ root?: string;
31
+ /** Framework to deploy. Defaults to detection from the app directory. */
32
+ framework?: ComputeFramework;
33
+ /** Entrypoint path for Bun (and Hono) deploys, relative to the app root. */
34
+ entry?: string;
35
+ /** HTTP port the deployed app listens on. Defaults to the framework default. */
36
+ httpPort?: number;
37
+ /** Environment variables for the deploy. A string is shorthand for `{ file }`. */
38
+ env?: string | ComputeEnvConfig;
39
+ /** Build settings. When present, these own the app's build configuration. */
40
+ build?: ComputeBuildConfig;
41
+ }
42
+ /**
43
+ * `prisma.compute.ts` accepts exactly one of:
44
+ *
45
+ * - `app` — a repository that deploys a single app
46
+ * - `apps` — a monorepo or multi-app repository, keyed by deploy target
47
+ */
48
+ export type ComputeConfig = {
49
+ app: ComputeAppConfig;
50
+ apps?: never;
51
+ } | {
52
+ apps: Record<string, ComputeAppConfig>;
53
+ app?: never;
54
+ };
55
+ /**
56
+ * Identity helper that gives `prisma.compute.ts` full type checking:
57
+ *
58
+ * ```ts
59
+ * import { defineComputeConfig } from "@prisma/compute-sdk/config";
60
+ *
61
+ * export default defineComputeConfig({
62
+ * app: { framework: "hono", httpPort: 8080 },
63
+ * });
64
+ * ```
65
+ */
66
+ export declare function defineComputeConfig(config: ComputeConfig): ComputeConfig;
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,kBAAkB,uEAOrB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,GAAG,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAChC,6EAA6E;IAC7E,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,GAAG,EAAE,gBAAgB,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAExE"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * The compute config contract: the shape of `prisma.compute.ts`.
3
+ *
4
+ * This module is the shared source of truth for every consumer of the
5
+ * deploy graph (CLI, build-runner, scaffolding). It must stay free of
6
+ * runtime dependencies so user config files can import it cheaply.
7
+ */
8
+ export const COMPUTE_FRAMEWORKS = [
9
+ "nextjs",
10
+ "nuxt",
11
+ "astro",
12
+ "hono",
13
+ "tanstack-start",
14
+ "bun",
15
+ ];
16
+ /**
17
+ * Identity helper that gives `prisma.compute.ts` full type checking:
18
+ *
19
+ * ```ts
20
+ * import { defineComputeConfig } from "@prisma/compute-sdk/config";
21
+ *
22
+ * export default defineComputeConfig({
23
+ * app: { framework: "hono", httpPort: 8080 },
24
+ * });
25
+ * ```
26
+ */
27
+ export function defineComputeConfig(config) {
28
+ return config;
29
+ }
30
+ //# sourceMappingURL=types.js.map