@prisma/composer 0.6.0-dev.9 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{app-config-CFsSXEVj-B242oUnm.d.mts → app-config-BinBcpPf-1akTl5h4.d.mts} +128 -15
- package/dist/app-config-BinBcpPf-1akTl5h4.d.mts.map +1 -0
- package/dist/config-647Wkm51.d.mts +1 -0
- package/dist/config.d.mts +3 -3
- package/dist/control.d.mts +79 -35
- package/dist/control.d.mts.map +1 -1
- package/dist/control.mjs +34 -33
- package/dist/control.mjs.map +1 -1
- package/dist/deploy-647Wkm51.d.mts +1 -0
- package/dist/deploy.d.mts +2 -2
- package/dist/{deployment-summary-r47O6kFr-CcMYVOn5.mjs → deployment-summary-DswOl_9E-B9MhYYDt.mjs} +5 -5
- package/dist/deployment-summary-DswOl_9E-B9MhYYDt.mjs.map +1 -0
- package/dist/dist-CVk7Pk4B.mjs +42 -0
- package/dist/dist-CVk7Pk4B.mjs.map +1 -0
- package/dist/{execute-deploy-destroy-IT4vGkMc-oO8yjHPH.mjs → execute-deploy-destroy-DRl6Tfg9-B8LE2Lh5.mjs} +171 -31
- package/dist/execute-deploy-destroy-DRl6Tfg9-B8LE2Lh5.mjs.map +1 -0
- package/dist/{execute-dev-DLYyduEM-88uyvrbj.mjs → execute-dev-BMTFWfFc-7MifQgpp.mjs} +53 -48
- package/dist/execute-dev-BMTFWfFc-7MifQgpp.mjs.map +1 -0
- package/dist/{execute-log-VIOL4DBz-DBPH8By4.mjs → execute-log-Cay9hlKW-BcvKPOW1.mjs} +10 -7
- package/dist/execute-log-Cay9hlKW-BcvKPOW1.mjs.map +1 -0
- package/dist/local-target.d.mts +1 -1
- package/dist/nextjs-control.d.mts +3 -3
- package/dist/nextjs-control.mjs +138 -34
- package/dist/nextjs-control.mjs.map +1 -1
- package/dist/node-control.d.mts +3 -3
- package/dist/node-control.mjs +21814 -55
- package/dist/node-control.mjs.map +1 -1
- package/dist/{pipeline-D3QoVzAB-Ci2aJ2mE.mjs → pipeline-AoW8zq4I-Dg8xQ7nC.mjs} +170 -49
- package/dist/pipeline-AoW8zq4I-Dg8xQ7nC.mjs.map +1 -0
- package/dist/report.d.mts +2 -2
- package/dist/report.mjs +1 -1
- package/dist/report.mjs.map +1 -1
- package/dist/{result-CzGChwbZ.mjs → result-D95kAAek.mjs} +36 -20
- package/dist/result-D95kAAek.mjs.map +1 -0
- package/dist/run-alchemy-D44OZlyB-Cw5CVbUQ.mjs +93 -0
- package/dist/run-alchemy-D44OZlyB-Cw5CVbUQ.mjs.map +1 -0
- package/dist/run-report-C2o98uD--AX8kpz4Q.mjs +60 -0
- package/dist/run-report-C2o98uD--AX8kpz4Q.mjs.map +1 -0
- package/package.json +14 -19
- package/src/exports/testing.ts +5 -0
- package/dist/app-config-CFsSXEVj-B242oUnm.d.mts.map +0 -1
- package/dist/bin.mjs +0 -19
- package/dist/bin.mjs.map +0 -1
- package/dist/cli-B3sWzFlb-CxEIzKsQ.mjs +0 -401
- package/dist/cli-B3sWzFlb-CxEIzKsQ.mjs.map +0 -1
- package/dist/config-ku5b_2YD.d.mts +0 -1
- package/dist/container-transport-DKmKg5JQ-BMRhx5w-.mjs +0 -75
- package/dist/container-transport-DKmKg5JQ-BMRhx5w-.mjs.map +0 -1
- package/dist/deploy-ku5b_2YD.d.mts +0 -1
- package/dist/deployment-summary-r47O6kFr-CcMYVOn5.mjs.map +0 -1
- package/dist/execute-deploy-destroy-IT4vGkMc-YM1Cv6cu.mjs +0 -306
- package/dist/execute-deploy-destroy-IT4vGkMc-YM1Cv6cu.mjs.map +0 -1
- package/dist/execute-deploy-destroy-IT4vGkMc-oO8yjHPH.mjs.map +0 -1
- package/dist/execute-dev-DLYyduEM-88uyvrbj.mjs.map +0 -1
- package/dist/execute-dev-DLYyduEM-BuUGTm0g.mjs +0 -2006
- package/dist/execute-dev-DLYyduEM-BuUGTm0g.mjs.map +0 -1
- package/dist/execute-log-VIOL4DBz-DBPH8By4.mjs.map +0 -1
- package/dist/execute-log-VIOL4DBz-DKodBrxS.mjs +0 -155
- package/dist/execute-log-VIOL4DBz-DKodBrxS.mjs.map +0 -1
- package/dist/local-target-DuSyWeYc.mjs +0 -68
- package/dist/local-target-DuSyWeYc.mjs.map +0 -1
- package/dist/pipeline-D3QoVzAB-Ci2aJ2mE.mjs.map +0 -1
- package/dist/pipeline-D3QoVzAB-D_ufjg3N.mjs +0 -857
- package/dist/pipeline-D3QoVzAB-D_ufjg3N.mjs.map +0 -1
- package/dist/render-error-DsPN5qfr-CkVGj9uP.mjs +0 -30
- package/dist/render-error-DsPN5qfr-CkVGj9uP.mjs.map +0 -1
- package/dist/result-CFqJKiqg.mjs +0 -106
- package/dist/result-CFqJKiqg.mjs.map +0 -1
- package/dist/result-CzGChwbZ.mjs.map +0 -1
- package/dist/run-alchemy-hghRtddF-CQHOzlrW.mjs +0 -48
- package/dist/run-alchemy-hghRtddF-CQHOzlrW.mjs.map +0 -1
- package/dist/shared-CCaR42wo-BvegvmA_.mjs +0 -265
- package/dist/shared-CCaR42wo-BvegvmA_.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-log-Cay9hlKW-BcvKPOW1.mjs","names":["path"],"sources":["../../../0-framework/3-tooling/cli/dist/execute-log-Cay9hlKW.mjs"],"sourcesContent":["import { r as toStructured } from \"./shared-BTnATsqm.mjs\";\nimport { t as resolveAppIdentity } from \"./pipeline-AoW8zq4I.mjs\";\nimport { t as withEmulatorRetry } from \"./emulator-retry-DGonap4g.mjs\";\nimport { CliStructuredError } from \"@internal/foundation/errors\";\nimport * as path from \"node:path\";\nimport { notOk, ok } from \"@internal/foundation/result\";\nimport { DEV_DIR, resolveLocalTargets } from \"@internal/core/local-target\";\n//#region src/operations/execute-log.ts\n/**\n* The log executor — run-log.ts's attach-and-tail (config → localTarget →\n* container → attach → logs) with console and signal handling removed: the\n* merged stream comes back as an AsyncIterable, ended by the caller's\n* AbortSignal. Reached only by lazy import from log.ts — this module's\n* static graph transitively loads alchemy's provider tree, so the control\n* entry must never import it statically.\n*/\nfunction failureMessage(error) {\n\treturn error instanceof Error ? error.message : String(error);\n}\n/** The merge queue's bound: past this, the oldest line is dropped and the\n* consumer is told via a `lines-dropped` event — a log viewer tolerates loss\n* better than the host tolerates unbounded memory growth. Exported so tests\n* can size their floods relative to the bound. */\nconst LOG_QUEUE_LIMIT = 1e4;\n/**\n* Merges every attachment's log stream into one iterable: one pump per\n* attachment pushing into a shared bounded queue. A pump's throw becomes a\n* `stream-failed` event and ends that pump only; the merged iterable ends\n* when `input.signal` aborts, when every pump ends, or when the consumer\n* stops iterating (an early `break` aborts an internal controller so the\n* pumps tear down — the generator never waits on a source that will not\n* end). No event is delivered after the iterable has ended. Address\n* filtering and `tail` apply exactly as the CLI always has.\n*/\nasync function* mergeLogStreams(attachments, input) {\n\tconst controller = new AbortController();\n\tconst { signal } = controller;\n\tconst abortInternal = () => controller.abort();\n\tif (input.signal?.aborted === true) controller.abort();\n\tinput.signal?.addEventListener(\"abort\", abortInternal, { once: true });\n\tconst queue = [];\n\tlet dropped = 0;\n\tlet done = false;\n\tlet active = attachments.length;\n\tlet wake;\n\tconst notify = () => {\n\t\twake?.();\n\t\twake = void 0;\n\t};\n\tsignal.addEventListener(\"abort\", notify, { once: true });\n\tconst emit = (event) => {\n\t\tif (done) return;\n\t\ttry {\n\t\t\tinput.onEvent?.(event);\n\t\t} catch {}\n\t};\n\tconst pump = async (attachment) => {\n\t\ttry {\n\t\t\tfor await (const { service, line } of attachment.logs(signal, { tail: input.tail ?? 0 })) {\n\t\t\t\tif (signal.aborted) return;\n\t\t\t\tif (input.address !== void 0 && service !== input.address) continue;\n\t\t\t\tif (queue.length >= 1e4) {\n\t\t\t\t\tqueue.shift();\n\t\t\t\t\tdropped += 1;\n\t\t\t\t}\n\t\t\t\tqueue.push({\n\t\t\t\t\tservice,\n\t\t\t\t\tline\n\t\t\t\t});\n\t\t\t\tnotify();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!signal.aborted) emit({\n\t\t\t\tkind: \"stream-failed\",\n\t\t\t\tmessage: failureMessage(error)\n\t\t\t});\n\t\t} finally {\n\t\t\tactive -= 1;\n\t\t\tnotify();\n\t\t}\n\t};\n\tfor (const attachment of attachments) pump(attachment);\n\ttry {\n\t\twhile (true) {\n\t\t\tlet next = queue.shift();\n\t\t\twhile (next !== void 0) {\n\t\t\t\tif (dropped > 0) {\n\t\t\t\t\tconst count = dropped;\n\t\t\t\t\tdropped = 0;\n\t\t\t\t\temit({\n\t\t\t\t\t\tkind: \"lines-dropped\",\n\t\t\t\t\t\tcount\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tyield next;\n\t\t\t\tnext = queue.shift();\n\t\t\t}\n\t\t\tif (signal.aborted || active === 0) break;\n\t\t\tawait new Promise((resolve) => {\n\t\t\t\twake = resolve;\n\t\t\t});\n\t\t}\n\t} finally {\n\t\tdone = true;\n\t\tcontroller.abort();\n\t\tsignal.removeEventListener(\"abort\", notify);\n\t\tinput.signal?.removeEventListener(\"abort\", abortInternal);\n\t}\n}\n/** Resolves the running app and attaches to its log streams; the caller consumes `lines`. */\nasync function executeLog(input, deps, cwd) {\n\tif (process.platform === \"win32\") return notOk(new CliStructuredError(\"LOG.PLATFORM_UNSUPPORTED\", \"local dev is not supported on Windows yet.\"));\n\tconst devDir = path.join(cwd, DEV_DIR);\n\tlet name;\n\tconst attachments = [];\n\tlet services;\n\ttry {\n\t\tconst identity = deps.identity ?? await resolveAppIdentity(input.entry, input.name, cwd, {\n\t\t\tconfig: deps.config,\n\t\t\tconfigPath: deps.configPath\n\t\t});\n\t\tname = identity.name;\n\t\tconst resolved = await resolveLocalTargets(identity.config);\n\t\tfor (const target of resolved.values()) try {\n\t\t\tconst container = await target.container.ensure({\n\t\t\t\tappName: name,\n\t\t\t\tstage: void 0\n\t\t\t});\n\t\t\tattachments.push(await withEmulatorRetry(() => target.attach({\n\t\t\t\tcontainer,\n\t\t\t\tdevDir\n\t\t\t})));\n\t\t} catch (error) {\n\t\t\tthrow toStructured(\"LOG.ATTACH_FAILED\", error);\n\t\t}\n\t\ttry {\n\t\t\tservices = (await Promise.all(attachments.map((a) => withEmulatorRetry(() => a.endpoints())))).flat();\n\t\t} catch (error) {\n\t\t\tthrow toStructured(\"LOG.ATTACH_FAILED\", error);\n\t\t}\n\t} catch (error) {\n\t\tif (CliStructuredError.is(error)) return notOk(error);\n\t\tthrow error;\n\t}\n\tif (services.length === 0) return ok({\n\t\tappName: name,\n\t\tservices: [],\n\t\tlines: mergeLogStreams([], input)\n\t});\n\tif (input.address !== void 0 && !services.some((s) => s.address === input.address)) return notOk(new CliStructuredError(\"LOG.ADDRESS_UNKNOWN\", `no service \"${input.address}\" in \"${name}\" — running services: ${services.map((s) => s.address).join(\", \")}.`));\n\treturn ok({\n\t\tappName: name,\n\t\tservices,\n\t\tlines: mergeLogStreams(attachments, input)\n\t});\n}\n//#endregion\nexport { LOG_QUEUE_LIMIT, executeLog };\n\n//# sourceMappingURL=execute-log-Cay9hlKW.mjs.map"],"mappings":"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"}
|
package/dist/local-target.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { _ as LocalTargetEmulatorsInput, c as ContainerInstance, g as LocalTargetDescriptor, h as LocalTargetAttachment, k as PrismaAppConfig, l as DEV_DIR, m as LocalTargetAttachInput, v as LocalTargetProvidersInput } from "./app-config-BinBcpPf-1akTl5h4.mjs";
|
|
2
2
|
import * as Layer from "effect/Layer";
|
|
3
3
|
//#region ../../0-framework/1-core/core/dist/local-target.d.mts
|
|
4
4
|
//#region src/control/local-target.d.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { a as Bundle,
|
|
2
|
-
import "./config-
|
|
3
|
-
import "./deploy-
|
|
1
|
+
import { a as Bundle, i as AssembleInput, p as ExtensionDescriptor } from "./app-config-BinBcpPf-1akTl5h4.mjs";
|
|
2
|
+
import "./config-647Wkm51.mjs";
|
|
3
|
+
import "./deploy-647Wkm51.mjs";
|
|
4
4
|
import { t as NextjsBuildAdapter } from "./nextjs-DLyeRR7M-DZODs9tk.mjs";
|
|
5
5
|
//#region ../../0-framework/2-authoring/nextjs/dist/control.d.mts
|
|
6
6
|
//#region src/control/build.d.ts
|
package/dist/nextjs-control.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as
|
|
1
|
+
import { n as isWithin, t as assertBundleSymlinksStayInside } from "./dist-CVk7Pk4B.mjs";
|
|
2
|
+
import * as fs$1 from "node:fs";
|
|
3
|
+
import * as path$1 from "node:path";
|
|
3
4
|
import { fileURLToPath } from "node:url";
|
|
4
5
|
import { build } from "esbuild";
|
|
5
6
|
//#region ../../0-framework/2-authoring/nextjs/dist/control.mjs
|
|
@@ -16,10 +17,11 @@ import { build } from "esbuild";
|
|
|
16
17
|
* `outputFileTracingRoot` is the monorepo root) is *read from Next's own build
|
|
17
18
|
* manifest* (`.next/required-server-files.json`'s `relativeAppDir`), never walked
|
|
18
19
|
* for or computed from a hardcoded depth. It does not launder: node_modules is
|
|
19
|
-
* shipped exactly as `next build` produced it
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* with
|
|
20
|
+
* shipped exactly as `next build` produced it. The packager preserves a link
|
|
21
|
+
* only after resolving its target inside the assembled bundle, and rejects
|
|
22
|
+
* escaping links. When Next records an in-root package link but omits its target
|
|
23
|
+
* from standalone (seen with pnpm's virtual store), assembly stages that exact
|
|
24
|
+
* target from `outputFileTracingRoot` so the artifact remains self-contained.
|
|
23
25
|
*
|
|
24
26
|
* Artifact layout: `<workDir>/main.mjs` (our wrapper) + `<workDir>/bundle/`
|
|
25
27
|
* (the standalone tree, with static/public copied in). The packager adds
|
|
@@ -33,6 +35,18 @@ import { build } from "esbuild";
|
|
|
33
35
|
function isNextjsBuild(descriptor) {
|
|
34
36
|
return descriptor.type === "nextjs" && "appDir" in descriptor && typeof descriptor.appDir === "string";
|
|
35
37
|
}
|
|
38
|
+
function readServerFilesManifest(appDir) {
|
|
39
|
+
const manifestPath = path$1.join(appDir, ".next", "required-server-files.json");
|
|
40
|
+
if (!fs$1.existsSync(manifestPath)) throw new Error(`no ${path$1.join(".next", "required-server-files.json")} under ${appDir} — run \`next build\` with output: "standalone" first.`);
|
|
41
|
+
const manifest = JSON.parse(fs$1.readFileSync(manifestPath, "utf8"));
|
|
42
|
+
const relativeAppDir = manifest?.relativeAppDir;
|
|
43
|
+
const tracingRoot = manifest?.config?.outputFileTracingRoot;
|
|
44
|
+
return {
|
|
45
|
+
path: manifestPath,
|
|
46
|
+
relativeAppDir: typeof relativeAppDir === "string" ? relativeAppDir : void 0,
|
|
47
|
+
tracingRoot: typeof tracingRoot === "string" ? path$1.resolve(appDir, tracingRoot) : void 0
|
|
48
|
+
};
|
|
49
|
+
}
|
|
36
50
|
/**
|
|
37
51
|
* The app's own subpath within `.next/standalone`, as an OS-relative path. Next
|
|
38
52
|
* mirrors the app's location under `outputFileTracingRoot` (deep, when that's the
|
|
@@ -41,41 +55,131 @@ function isNextjsBuild(descriptor) {
|
|
|
41
55
|
* that subpath. Older Next lacks the field; fall back to computing it from the
|
|
42
56
|
* same manifest's `config.outputFileTracingRoot`.
|
|
43
57
|
*/
|
|
44
|
-
function
|
|
45
|
-
const
|
|
46
|
-
if (
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
58
|
+
function appRelFrom(manifest, appDir) {
|
|
59
|
+
const posixRel = manifest.relativeAppDir ?? (manifest.tracingRoot === void 0 ? void 0 : path$1.relative(manifest.tracingRoot, appDir).split(path$1.sep).join("/"));
|
|
60
|
+
if (posixRel === void 0) throw new Error(`${manifest.path} records neither relativeAppDir nor config.outputFileTracingRoot — cannot locate the standalone server`);
|
|
61
|
+
const rel = posixRel.split("/").join(path$1.sep);
|
|
62
|
+
if (path$1.isAbsolute(rel) || !isWithin(appDir, path$1.join(appDir, rel))) throw new Error(`${manifest.path} records an app location that escapes its tracing root (${posixRel}) — refusing to stage outside the bundle`);
|
|
63
|
+
return rel;
|
|
64
|
+
}
|
|
65
|
+
async function lstatIfPresent(candidate) {
|
|
66
|
+
try {
|
|
67
|
+
return await fs$1.promises.lstat(candidate);
|
|
68
|
+
} catch (error) {
|
|
69
|
+
if (error instanceof Error && Reflect.get(error, "code") === "ENOENT") return void 0;
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Do not write through an existing link while repairing a missing target. */
|
|
74
|
+
async function hasSymlinkAncestor(root, candidate) {
|
|
75
|
+
const relative = path$1.relative(root, path$1.dirname(candidate));
|
|
76
|
+
let cursor = root;
|
|
77
|
+
for (const segment of relative.split(path$1.sep).filter(Boolean)) {
|
|
78
|
+
cursor = path$1.join(cursor, segment);
|
|
79
|
+
const stat = await lstatIfPresent(cursor);
|
|
80
|
+
if (stat === void 0) return false;
|
|
81
|
+
if (stat.isSymbolicLink()) return true;
|
|
82
|
+
}
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
async function collectSymlinks(root) {
|
|
86
|
+
const links = [];
|
|
87
|
+
async function visit(directory) {
|
|
88
|
+
for (const entry of await fs$1.promises.readdir(directory, { withFileTypes: true })) {
|
|
89
|
+
const entryPath = path$1.join(directory, entry.name);
|
|
90
|
+
if (entry.isSymbolicLink()) links.push(entryPath);
|
|
91
|
+
else if (entry.isDirectory()) await visit(entryPath);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
await visit(root);
|
|
95
|
+
return links;
|
|
96
|
+
}
|
|
97
|
+
/** In-bundle link targets that the standalone tree does not contain — the
|
|
98
|
+
* repairs staging has to make. */
|
|
99
|
+
async function missingLinkTargets(bundleDir) {
|
|
100
|
+
const missing = [];
|
|
101
|
+
for (const linkPath of await collectSymlinks(bundleDir)) {
|
|
102
|
+
const rawTarget = await fs$1.promises.readlink(linkPath);
|
|
103
|
+
if (path$1.isAbsolute(rawTarget)) continue;
|
|
104
|
+
const target = path$1.resolve(path$1.dirname(linkPath), rawTarget);
|
|
105
|
+
if (!isWithin(bundleDir, target) || await lstatIfPresent(target) !== void 0) continue;
|
|
106
|
+
if (await hasSymlinkAncestor(bundleDir, target)) continue;
|
|
107
|
+
missing.push(target);
|
|
108
|
+
}
|
|
109
|
+
return missing;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* pnpm can leave a traced hoist link in standalone while omitting the virtual-
|
|
113
|
+
* store directory it targets. The same target still exists at the corresponding
|
|
114
|
+
* path under outputFileTracingRoot. Stage only that exact, real in-root target;
|
|
115
|
+
* unsafe or genuinely unavailable links remain for the packager to reject.
|
|
116
|
+
*/
|
|
117
|
+
async function stageMissingStandaloneLinkTargets(bundleDir, manifest) {
|
|
118
|
+
const tracingRoot = manifest.tracingRoot;
|
|
119
|
+
if (tracingRoot === void 0) {
|
|
120
|
+
if ((await missingLinkTargets(bundleDir)).length === 0) return [];
|
|
121
|
+
throw new Error(`${manifest.path} records no config.outputFileTracingRoot, but the standalone tree contains symlinks whose targets Next omitted — the source root those targets must be staged from is unknown. Rebuild with a Next version that records config.outputFileTracingRoot, or set outputFileTracingRoot in next.config.`);
|
|
122
|
+
}
|
|
123
|
+
if (await lstatIfPresent(tracingRoot) === void 0) return [];
|
|
124
|
+
const tracedRootReal = await fs$1.promises.realpath(tracingRoot);
|
|
125
|
+
const stagedSources = /* @__PURE__ */ new Set();
|
|
126
|
+
let staged = true;
|
|
127
|
+
while (staged) {
|
|
128
|
+
staged = false;
|
|
129
|
+
for (const target of await missingLinkTargets(bundleDir)) {
|
|
130
|
+
const standaloneRelative = path$1.relative(bundleDir, target);
|
|
131
|
+
const source = path$1.resolve(tracingRoot, standaloneRelative);
|
|
132
|
+
if (await lstatIfPresent(source) === void 0) continue;
|
|
133
|
+
if (!isWithin(tracedRootReal, await fs$1.promises.realpath(source))) continue;
|
|
134
|
+
await fs$1.promises.mkdir(path$1.dirname(target), { recursive: true });
|
|
135
|
+
await fs$1.promises.cp(source, target, {
|
|
136
|
+
recursive: true,
|
|
137
|
+
verbatimSymlinks: true
|
|
138
|
+
});
|
|
139
|
+
stagedSources.add(source);
|
|
140
|
+
staged = true;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return [...stagedSources];
|
|
53
144
|
}
|
|
54
145
|
/** The built standalone server.js for a nextjs build — `appDir`'s standalone root plus the app subpath Next recorded. Single-sourced so `assemble()` (deploy) and the integration-test seam can't drift. */
|
|
55
146
|
function standaloneServerPath(build) {
|
|
56
|
-
const appDir = path.resolve(path.dirname(fileURLToPath(build.module)), build.appDir);
|
|
57
|
-
|
|
147
|
+
const appDir = path$1.resolve(path$1.dirname(fileURLToPath(build.module)), build.appDir);
|
|
148
|
+
const manifest = readServerFilesManifest(appDir);
|
|
149
|
+
return path$1.join(appDir, ".next", "standalone", appRelFrom(manifest, appDir), "server.js");
|
|
58
150
|
}
|
|
59
151
|
async function assemble(input) {
|
|
60
152
|
if (!isNextjsBuild(input.build)) throw new Error(`@prisma/composer/nextjs/control: expected a "nextjs" build adapter (with appDir), got "${input.build.type}".`);
|
|
61
153
|
const buildDescriptor = input.build;
|
|
62
|
-
const appDir = path.resolve(path.dirname(fileURLToPath(buildDescriptor.module)), buildDescriptor.appDir);
|
|
63
|
-
const standaloneRoot = path.join(appDir, ".next", "standalone");
|
|
64
|
-
if (!fs.existsSync(standaloneRoot)) throw new Error(`no ${path.join(".next", "standalone")} under ${appDir} — run \`next build\` with output: "standalone" first.`);
|
|
65
|
-
const
|
|
66
|
-
const
|
|
67
|
-
|
|
154
|
+
const appDir = path$1.resolve(path$1.dirname(fileURLToPath(buildDescriptor.module)), buildDescriptor.appDir);
|
|
155
|
+
const standaloneRoot = path$1.join(appDir, ".next", "standalone");
|
|
156
|
+
if (!fs$1.existsSync(standaloneRoot)) throw new Error(`no ${path$1.join(".next", "standalone")} under ${appDir} — run \`next build\` with output: "standalone" first.`);
|
|
157
|
+
const manifest = readServerFilesManifest(appDir);
|
|
158
|
+
const appRel = appRelFrom(manifest, appDir);
|
|
159
|
+
const workDir = path$1.join(input.cwd, ".prisma-composer", "artifacts", input.address);
|
|
160
|
+
await fs$1.promises.rm(workDir, {
|
|
68
161
|
recursive: true,
|
|
69
162
|
force: true
|
|
70
163
|
});
|
|
71
|
-
await fs.promises.mkdir(workDir, { recursive: true });
|
|
72
|
-
const bundleDir = path.join(workDir, "bundle");
|
|
73
|
-
await fs.promises.cp(standaloneRoot, bundleDir, {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
-
|
|
164
|
+
await fs$1.promises.mkdir(workDir, { recursive: true });
|
|
165
|
+
const bundleDir = path$1.join(workDir, "bundle");
|
|
166
|
+
await fs$1.promises.cp(standaloneRoot, bundleDir, {
|
|
167
|
+
recursive: true,
|
|
168
|
+
verbatimSymlinks: true
|
|
169
|
+
});
|
|
170
|
+
const stagedLinkTargets = await stageMissingStandaloneLinkTargets(bundleDir, manifest);
|
|
171
|
+
const appOut = path$1.join(bundleDir, appRel);
|
|
172
|
+
const staticSrc = path$1.join(appDir, ".next", "static");
|
|
173
|
+
if (fs$1.existsSync(staticSrc)) await fs$1.promises.cp(staticSrc, path$1.join(appOut, ".next", "static"), {
|
|
174
|
+
recursive: true,
|
|
175
|
+
verbatimSymlinks: true
|
|
176
|
+
});
|
|
177
|
+
const publicSrc = path$1.join(appDir, "public");
|
|
178
|
+
if (fs$1.existsSync(publicSrc)) await fs$1.promises.cp(publicSrc, path$1.join(appOut, "public"), {
|
|
179
|
+
recursive: true,
|
|
180
|
+
verbatimSymlinks: true
|
|
181
|
+
});
|
|
182
|
+
await assertBundleSymlinksStayInside(bundleDir);
|
|
79
183
|
await build({
|
|
80
184
|
entryPoints: { main: fileURLToPath(buildDescriptor.module) },
|
|
81
185
|
outdir: workDir,
|
|
@@ -85,11 +189,11 @@ async function assemble(input) {
|
|
|
85
189
|
external: ["bun", "bun:*"],
|
|
86
190
|
outExtension: { ".js": ".mjs" }
|
|
87
191
|
});
|
|
88
|
-
if (!fs.existsSync(path.join(workDir, "main.mjs"))) throw new Error(`esbuild produced no main.mjs in ${workDir}`);
|
|
192
|
+
if (!fs$1.existsSync(path$1.join(workDir, "main.mjs"))) throw new Error(`esbuild produced no main.mjs in ${workDir}`);
|
|
89
193
|
return {
|
|
90
194
|
dir: workDir,
|
|
91
|
-
entry: path.posix.join("bundle", appRel.split(path.sep).join("/"), "server.js"),
|
|
92
|
-
watch: [standaloneRoot]
|
|
195
|
+
entry: path$1.posix.join("bundle", appRel.split(path$1.sep).join("/"), "server.js"),
|
|
196
|
+
watch: [standaloneRoot, ...stagedLinkTargets]
|
|
93
197
|
};
|
|
94
198
|
}
|
|
95
199
|
/** The nextjs build extension descriptor — `prisma-composer.config.ts` lists it under `extensions`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs-control.mjs","names":[],"sources":["../../../0-framework/2-authoring/nextjs/dist/control.mjs"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { build } from \"esbuild\";\n//#region src/control/build.ts\n/**\n* The extension's control entry (ADR-0017): `nextjsBuild()` returns the build\n* descriptor `prisma-composer.config.ts` lists. Deploy-only (ADR-0005): the user\n* runs `next build` (`output: \"standalone\"`); `assemble` then performs the\n* *documented* Next standalone deploy — it ships the standalone tree and copies\n* in the client assets Next deliberately omits (`.next/static`, `public/`) — and\n* adds the framework's boot wrapper. This is the canonical `cp` step from the\n* Next docs, run at deploy so no app needs a build-script for it.\n*\n* It does not guess: the app's location inside the standalone tree (deep, when\n* `outputFileTracingRoot` is the monorepo root) is *read from Next's own build\n* manifest* (`.next/required-server-files.json`'s `relativeAppDir`), never walked\n* for or computed from a hardcoded depth. It does not launder: node_modules is\n* shipped exactly as `next build` produced it, so a symlinked (non-hoisted)\n* node_modules is the packager's hard error — the same misconfiguration crashes\n* the standalone server at boot, so it must be a flat install (npm, or pnpm/bun\n* with a hoisted node-linker).\n*\n* Artifact layout: `<workDir>/main.mjs` (our wrapper) + `<workDir>/bundle/`\n* (the standalone tree, with static/public copied in). The packager adds\n* `bootstrap.js` + the manifest at the root; bootstrap imports main.mjs, whose\n* run() dynamically imports `./bundle/<relativeAppDir>/server.js`.\n*\n* Paths are file-relative (ADR-0004): `appDir` resolves against\n* `dirname(build.module)`.\n*/\n/** Narrows the shared BuildAdapter to this extension's own descriptor — the value-level mirror of the registry routing on (extension, type). */\nfunction isNextjsBuild(descriptor) {\n\treturn descriptor.type === \"nextjs\" && \"appDir\" in descriptor && typeof descriptor.appDir === \"string\";\n}\n/**\n* The app's own subpath within `.next/standalone`, as an OS-relative path. Next\n* mirrors the app's location under `outputFileTracingRoot` (deep, when that's the\n* monorepo root); rather than walk the tree for `server.js`, we read where Next\n* put it from `.next/required-server-files.json` — `relativeAppDir` is exactly\n* that subpath. Older Next lacks the field; fall back to computing it from the\n* same manifest's `config.outputFileTracingRoot`.\n*/\nfunction nextAppRel(appDir) {\n\tconst manifestPath = path.join(appDir, \".next\", \"required-server-files.json\");\n\tif (!fs.existsSync(manifestPath)) throw new Error(`no ${path.join(\".next\", \"required-server-files.json\")} under ${appDir} — run \\`next build\\` with output: \"standalone\" first.`);\n\tconst manifest = JSON.parse(fs.readFileSync(manifestPath, \"utf8\"));\n\tconst relativeAppDir = manifest?.relativeAppDir;\n\tconst tracingRoot = manifest?.config?.outputFileTracingRoot;\n\tconst posixRel = typeof relativeAppDir === \"string\" ? relativeAppDir : typeof tracingRoot === \"string\" ? path.relative(tracingRoot, appDir).split(path.sep).join(\"/\") : void 0;\n\tif (posixRel === void 0) throw new Error(`${manifestPath} records neither relativeAppDir nor config.outputFileTracingRoot — cannot locate the standalone server`);\n\treturn posixRel.split(\"/\").join(path.sep);\n}\n/** The built standalone server.js for a nextjs build — `appDir`'s standalone root plus the app subpath Next recorded. Single-sourced so `assemble()` (deploy) and the integration-test seam can't drift. */\nfunction standaloneServerPath(build) {\n\tconst appDir = path.resolve(path.dirname(fileURLToPath(build.module)), build.appDir);\n\treturn path.join(appDir, \".next\", \"standalone\", nextAppRel(appDir), \"server.js\");\n}\nasync function assemble(input) {\n\tif (!isNextjsBuild(input.build)) throw new Error(`@prisma/composer/nextjs/control: expected a \"nextjs\" build adapter (with appDir), got \"${input.build.type}\".`);\n\tconst buildDescriptor = input.build;\n\tconst appDir = path.resolve(path.dirname(fileURLToPath(buildDescriptor.module)), buildDescriptor.appDir);\n\tconst standaloneRoot = path.join(appDir, \".next\", \"standalone\");\n\tif (!fs.existsSync(standaloneRoot)) throw new Error(`no ${path.join(\".next\", \"standalone\")} under ${appDir} — run \\`next build\\` with output: \"standalone\" first.`);\n\tconst appRel = nextAppRel(appDir);\n\tconst workDir = path.join(input.cwd, \".prisma-composer\", \"artifacts\", input.address);\n\tawait fs.promises.rm(workDir, {\n\t\trecursive: true,\n\t\tforce: true\n\t});\n\tawait fs.promises.mkdir(workDir, { recursive: true });\n\tconst bundleDir = path.join(workDir, \"bundle\");\n\tawait fs.promises.cp(standaloneRoot, bundleDir, { recursive: true });\n\tconst appOut = path.join(bundleDir, appRel);\n\tconst staticSrc = path.join(appDir, \".next\", \"static\");\n\tif (fs.existsSync(staticSrc)) await fs.promises.cp(staticSrc, path.join(appOut, \".next\", \"static\"), { recursive: true });\n\tconst publicSrc = path.join(appDir, \"public\");\n\tif (fs.existsSync(publicSrc)) await fs.promises.cp(publicSrc, path.join(appOut, \"public\"), { recursive: true });\n\tawait build({\n\t\tentryPoints: { main: fileURLToPath(buildDescriptor.module) },\n\t\toutdir: workDir,\n\t\tbundle: true,\n\t\tformat: \"esm\",\n\t\tplatform: \"node\",\n\t\texternal: [\"bun\", \"bun:*\"],\n\t\toutExtension: { \".js\": \".mjs\" }\n\t});\n\tif (!fs.existsSync(path.join(workDir, \"main.mjs\"))) throw new Error(`esbuild produced no main.mjs in ${workDir}`);\n\treturn {\n\t\tdir: workDir,\n\t\tentry: path.posix.join(\"bundle\", appRel.split(path.sep).join(\"/\"), \"server.js\"),\n\t\twatch: [standaloneRoot]\n\t};\n}\n/** The nextjs build extension descriptor — `prisma-composer.config.ts` lists it under `extensions`. */\nconst nextjsBuild = () => ({\n\tid: \"@prisma/composer/nextjs\",\n\tnodes: { nextjs: {\n\t\tkind: \"build\",\n\t\tassemble\n\t} }\n});\n//#endregion\nexport { assemble, nextjsBuild, standaloneServerPath };\n\n//# sourceMappingURL=control.mjs.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nextjs-control.mjs","names":["path","fs"],"sources":["../../../0-framework/2-authoring/nextjs/dist/control.mjs"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { assertBundleSymlinksStayInside, isWithin } from \"@internal/bundle-paths\";\nimport { build } from \"esbuild\";\n//#region src/control/build.ts\n/**\n* The extension's control entry (ADR-0017): `nextjsBuild()` returns the build\n* descriptor `prisma-composer.config.ts` lists. Deploy-only (ADR-0005): the user\n* runs `next build` (`output: \"standalone\"`); `assemble` then performs the\n* *documented* Next standalone deploy — it ships the standalone tree and copies\n* in the client assets Next deliberately omits (`.next/static`, `public/`) — and\n* adds the framework's boot wrapper. This is the canonical `cp` step from the\n* Next docs, run at deploy so no app needs a build-script for it.\n*\n* It does not guess: the app's location inside the standalone tree (deep, when\n* `outputFileTracingRoot` is the monorepo root) is *read from Next's own build\n* manifest* (`.next/required-server-files.json`'s `relativeAppDir`), never walked\n* for or computed from a hardcoded depth. It does not launder: node_modules is\n* shipped exactly as `next build` produced it. The packager preserves a link\n* only after resolving its target inside the assembled bundle, and rejects\n* escaping links. When Next records an in-root package link but omits its target\n* from standalone (seen with pnpm's virtual store), assembly stages that exact\n* target from `outputFileTracingRoot` so the artifact remains self-contained.\n*\n* Artifact layout: `<workDir>/main.mjs` (our wrapper) + `<workDir>/bundle/`\n* (the standalone tree, with static/public copied in). The packager adds\n* `bootstrap.js` + the manifest at the root; bootstrap imports main.mjs, whose\n* run() dynamically imports `./bundle/<relativeAppDir>/server.js`.\n*\n* Paths are file-relative (ADR-0004): `appDir` resolves against\n* `dirname(build.module)`.\n*/\n/** Narrows the shared BuildAdapter to this extension's own descriptor — the value-level mirror of the registry routing on (extension, type). */\nfunction isNextjsBuild(descriptor) {\n\treturn descriptor.type === \"nextjs\" && \"appDir\" in descriptor && typeof descriptor.appDir === \"string\";\n}\nfunction readServerFilesManifest(appDir) {\n\tconst manifestPath = path.join(appDir, \".next\", \"required-server-files.json\");\n\tif (!fs.existsSync(manifestPath)) throw new Error(`no ${path.join(\".next\", \"required-server-files.json\")} under ${appDir} — run \\`next build\\` with output: \"standalone\" first.`);\n\tconst manifest = JSON.parse(fs.readFileSync(manifestPath, \"utf8\"));\n\tconst relativeAppDir = manifest?.relativeAppDir;\n\tconst tracingRoot = manifest?.config?.outputFileTracingRoot;\n\treturn {\n\t\tpath: manifestPath,\n\t\trelativeAppDir: typeof relativeAppDir === \"string\" ? relativeAppDir : void 0,\n\t\ttracingRoot: typeof tracingRoot === \"string\" ? path.resolve(appDir, tracingRoot) : void 0\n\t};\n}\n/**\n* The app's own subpath within `.next/standalone`, as an OS-relative path. Next\n* mirrors the app's location under `outputFileTracingRoot` (deep, when that's the\n* monorepo root); rather than walk the tree for `server.js`, we read where Next\n* put it from `.next/required-server-files.json` — `relativeAppDir` is exactly\n* that subpath. Older Next lacks the field; fall back to computing it from the\n* same manifest's `config.outputFileTracingRoot`.\n*/\nfunction appRelFrom(manifest, appDir) {\n\tconst posixRel = manifest.relativeAppDir ?? (manifest.tracingRoot === void 0 ? void 0 : path.relative(manifest.tracingRoot, appDir).split(path.sep).join(\"/\"));\n\tif (posixRel === void 0) throw new Error(`${manifest.path} records neither relativeAppDir nor config.outputFileTracingRoot — cannot locate the standalone server`);\n\tconst rel = posixRel.split(\"/\").join(path.sep);\n\tif (path.isAbsolute(rel) || !isWithin(appDir, path.join(appDir, rel))) throw new Error(`${manifest.path} records an app location that escapes its tracing root (${posixRel}) — refusing to stage outside the bundle`);\n\treturn rel;\n}\nasync function lstatIfPresent(candidate) {\n\ttry {\n\t\treturn await fs.promises.lstat(candidate);\n\t} catch (error) {\n\t\tif (error instanceof Error && Reflect.get(error, \"code\") === \"ENOENT\") return void 0;\n\t\tthrow error;\n\t}\n}\n/** Do not write through an existing link while repairing a missing target. */\nasync function hasSymlinkAncestor(root, candidate) {\n\tconst relative = path.relative(root, path.dirname(candidate));\n\tlet cursor = root;\n\tfor (const segment of relative.split(path.sep).filter(Boolean)) {\n\t\tcursor = path.join(cursor, segment);\n\t\tconst stat = await lstatIfPresent(cursor);\n\t\tif (stat === void 0) return false;\n\t\tif (stat.isSymbolicLink()) return true;\n\t}\n\treturn false;\n}\nasync function collectSymlinks(root) {\n\tconst links = [];\n\tasync function visit(directory) {\n\t\tfor (const entry of await fs.promises.readdir(directory, { withFileTypes: true })) {\n\t\t\tconst entryPath = path.join(directory, entry.name);\n\t\t\tif (entry.isSymbolicLink()) links.push(entryPath);\n\t\t\telse if (entry.isDirectory()) await visit(entryPath);\n\t\t}\n\t}\n\tawait visit(root);\n\treturn links;\n}\n/** In-bundle link targets that the standalone tree does not contain — the\n* repairs staging has to make. */\nasync function missingLinkTargets(bundleDir) {\n\tconst missing = [];\n\tfor (const linkPath of await collectSymlinks(bundleDir)) {\n\t\tconst rawTarget = await fs.promises.readlink(linkPath);\n\t\tif (path.isAbsolute(rawTarget)) continue;\n\t\tconst target = path.resolve(path.dirname(linkPath), rawTarget);\n\t\tif (!isWithin(bundleDir, target) || await lstatIfPresent(target) !== void 0) continue;\n\t\tif (await hasSymlinkAncestor(bundleDir, target)) continue;\n\t\tmissing.push(target);\n\t}\n\treturn missing;\n}\n/**\n* pnpm can leave a traced hoist link in standalone while omitting the virtual-\n* store directory it targets. The same target still exists at the corresponding\n* path under outputFileTracingRoot. Stage only that exact, real in-root target;\n* unsafe or genuinely unavailable links remain for the packager to reject.\n*/\nasync function stageMissingStandaloneLinkTargets(bundleDir, manifest) {\n\tconst tracingRoot = manifest.tracingRoot;\n\tif (tracingRoot === void 0) {\n\t\tif ((await missingLinkTargets(bundleDir)).length === 0) return [];\n\t\tthrow new Error(`${manifest.path} records no config.outputFileTracingRoot, but the standalone tree contains symlinks whose targets Next omitted — the source root those targets must be staged from is unknown. Rebuild with a Next version that records config.outputFileTracingRoot, or set outputFileTracingRoot in next.config.`);\n\t}\n\tif (await lstatIfPresent(tracingRoot) === void 0) return [];\n\tconst tracedRootReal = await fs.promises.realpath(tracingRoot);\n\tconst stagedSources = /* @__PURE__ */ new Set();\n\tlet staged = true;\n\twhile (staged) {\n\t\tstaged = false;\n\t\tfor (const target of await missingLinkTargets(bundleDir)) {\n\t\t\tconst standaloneRelative = path.relative(bundleDir, target);\n\t\t\tconst source = path.resolve(tracingRoot, standaloneRelative);\n\t\t\tif (await lstatIfPresent(source) === void 0) continue;\n\t\t\tif (!isWithin(tracedRootReal, await fs.promises.realpath(source))) continue;\n\t\t\tawait fs.promises.mkdir(path.dirname(target), { recursive: true });\n\t\t\tawait fs.promises.cp(source, target, {\n\t\t\t\trecursive: true,\n\t\t\t\tverbatimSymlinks: true\n\t\t\t});\n\t\t\tstagedSources.add(source);\n\t\t\tstaged = true;\n\t\t}\n\t}\n\treturn [...stagedSources];\n}\n/** The built standalone server.js for a nextjs build — `appDir`'s standalone root plus the app subpath Next recorded. Single-sourced so `assemble()` (deploy) and the integration-test seam can't drift. */\nfunction standaloneServerPath(build) {\n\tconst appDir = path.resolve(path.dirname(fileURLToPath(build.module)), build.appDir);\n\tconst manifest = readServerFilesManifest(appDir);\n\treturn path.join(appDir, \".next\", \"standalone\", appRelFrom(manifest, appDir), \"server.js\");\n}\nasync function assemble(input) {\n\tif (!isNextjsBuild(input.build)) throw new Error(`@prisma/composer/nextjs/control: expected a \"nextjs\" build adapter (with appDir), got \"${input.build.type}\".`);\n\tconst buildDescriptor = input.build;\n\tconst appDir = path.resolve(path.dirname(fileURLToPath(buildDescriptor.module)), buildDescriptor.appDir);\n\tconst standaloneRoot = path.join(appDir, \".next\", \"standalone\");\n\tif (!fs.existsSync(standaloneRoot)) throw new Error(`no ${path.join(\".next\", \"standalone\")} under ${appDir} — run \\`next build\\` with output: \"standalone\" first.`);\n\tconst manifest = readServerFilesManifest(appDir);\n\tconst appRel = appRelFrom(manifest, appDir);\n\tconst workDir = path.join(input.cwd, \".prisma-composer\", \"artifacts\", input.address);\n\tawait fs.promises.rm(workDir, {\n\t\trecursive: true,\n\t\tforce: true\n\t});\n\tawait fs.promises.mkdir(workDir, { recursive: true });\n\tconst bundleDir = path.join(workDir, \"bundle\");\n\tawait fs.promises.cp(standaloneRoot, bundleDir, {\n\t\trecursive: true,\n\t\tverbatimSymlinks: true\n\t});\n\tconst stagedLinkTargets = await stageMissingStandaloneLinkTargets(bundleDir, manifest);\n\tconst appOut = path.join(bundleDir, appRel);\n\tconst staticSrc = path.join(appDir, \".next\", \"static\");\n\tif (fs.existsSync(staticSrc)) await fs.promises.cp(staticSrc, path.join(appOut, \".next\", \"static\"), {\n\t\trecursive: true,\n\t\tverbatimSymlinks: true\n\t});\n\tconst publicSrc = path.join(appDir, \"public\");\n\tif (fs.existsSync(publicSrc)) await fs.promises.cp(publicSrc, path.join(appOut, \"public\"), {\n\t\trecursive: true,\n\t\tverbatimSymlinks: true\n\t});\n\tawait assertBundleSymlinksStayInside(bundleDir);\n\tawait build({\n\t\tentryPoints: { main: fileURLToPath(buildDescriptor.module) },\n\t\toutdir: workDir,\n\t\tbundle: true,\n\t\tformat: \"esm\",\n\t\tplatform: \"node\",\n\t\texternal: [\"bun\", \"bun:*\"],\n\t\toutExtension: { \".js\": \".mjs\" }\n\t});\n\tif (!fs.existsSync(path.join(workDir, \"main.mjs\"))) throw new Error(`esbuild produced no main.mjs in ${workDir}`);\n\treturn {\n\t\tdir: workDir,\n\t\tentry: path.posix.join(\"bundle\", appRel.split(path.sep).join(\"/\"), \"server.js\"),\n\t\twatch: [standaloneRoot, ...stagedLinkTargets]\n\t};\n}\n/** The nextjs build extension descriptor — `prisma-composer.config.ts` lists it under `extensions`. */\nconst nextjsBuild = () => ({\n\tid: \"@prisma/composer/nextjs\",\n\tnodes: { nextjs: {\n\t\tkind: \"build\",\n\t\tassemble\n\t} }\n});\n//#endregion\nexport { assemble, nextjsBuild, standaloneServerPath };\n\n//# sourceMappingURL=control.mjs.map"],"mappings":"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"}
|
package/dist/node-control.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { a as Bundle,
|
|
2
|
-
import "./config-
|
|
3
|
-
import "./deploy-
|
|
1
|
+
import { a as Bundle, i as AssembleInput, p as ExtensionDescriptor } from "./app-config-BinBcpPf-1akTl5h4.mjs";
|
|
2
|
+
import "./config-647Wkm51.mjs";
|
|
3
|
+
import "./deploy-647Wkm51.mjs";
|
|
4
4
|
//#region ../../0-framework/2-authoring/node/dist/control.d.mts
|
|
5
5
|
//#region src/control/build.d.ts
|
|
6
6
|
declare function assemble(input: AssembleInput): Promise<Bundle>;
|