@prisma/composer 0.16.0-dev.3 → 0.16.0-dev.4

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.
@@ -1,4 +1,4 @@
1
- import { n as isWithin, t as assertBundleSymlinksStayInside } from "./dist-CVk7Pk4B.mjs";
1
+ import { i as repairWindowsDirectorySymlinks, n as copyTreeVerbatim, r as isWithin, t as assertBundleSymlinksStayInside } from "./dist-D1TA1xGC.mjs";
2
2
  import * as fs$1 from "node:fs";
3
3
  import * as path$1 from "node:path";
4
4
  import { fileURLToPath } from "node:url";
@@ -132,10 +132,7 @@ async function stageMissingStandaloneLinkTargets(bundleDir, manifest) {
132
132
  if (await lstatIfPresent(source) === void 0) continue;
133
133
  if (!isWithin(tracedRootReal, await fs$1.promises.realpath(source))) continue;
134
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
- });
135
+ await copyTreeVerbatim(source, target);
139
136
  stagedSources.add(source);
140
137
  staged = true;
141
138
  }
@@ -163,22 +160,14 @@ async function assemble(input) {
163
160
  });
164
161
  await fs$1.promises.mkdir(workDir, { recursive: true });
165
162
  const bundleDir = path$1.join(workDir, "bundle");
166
- await fs$1.promises.cp(standaloneRoot, bundleDir, {
167
- recursive: true,
168
- verbatimSymlinks: true
169
- });
163
+ await copyTreeVerbatim(standaloneRoot, bundleDir);
170
164
  const stagedLinkTargets = await stageMissingStandaloneLinkTargets(bundleDir, manifest);
165
+ await repairWindowsDirectorySymlinks(bundleDir);
171
166
  const appOut = path$1.join(bundleDir, appRel);
172
167
  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
- });
168
+ if (fs$1.existsSync(staticSrc)) await copyTreeVerbatim(staticSrc, path$1.join(appOut, ".next", "static"));
177
169
  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
- });
170
+ if (fs$1.existsSync(publicSrc)) await copyTreeVerbatim(publicSrc, path$1.join(appOut, "public"));
182
171
  await assertBundleSymlinksStayInside(bundleDir);
183
172
  await build({
184
173
  entryPoints: { main: fileURLToPath(buildDescriptor.module) },
@@ -1 +1 @@
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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"}
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, copyTreeVerbatim, isWithin, repairWindowsDirectorySymlinks } 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 copyTreeVerbatim(source, target);\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 copyTreeVerbatim(standaloneRoot, bundleDir);\n\tconst stagedLinkTargets = await stageMissingStandaloneLinkTargets(bundleDir, manifest);\n\tawait repairWindowsDirectorySymlinks(bundleDir);\n\tconst appOut = path.join(bundleDir, appRel);\n\tconst staticSrc = path.join(appDir, \".next\", \"static\");\n\tif (fs.existsSync(staticSrc)) await copyTreeVerbatim(staticSrc, path.join(appOut, \".next\", \"static\"));\n\tconst publicSrc = path.join(appDir, \"public\");\n\tif (fs.existsSync(publicSrc)) await copyTreeVerbatim(publicSrc, path.join(appOut, \"public\"));\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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"}
@@ -1,4 +1,4 @@
1
- import { n as isWithin, t as assertBundleSymlinksStayInside } from "./dist-CVk7Pk4B.mjs";
1
+ import { n as copyTreeVerbatim, r as isWithin, t as assertBundleSymlinksStayInside } from "./dist-D1TA1xGC.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as fs$1 from "node:fs";
4
4
  import * as path$1 from "node:path";
@@ -21734,10 +21734,7 @@ async function resolveDir(dirSpec, entrySpec, moduleDir) {
21734
21734
  source: dirPath,
21735
21735
  sourceField: "dir",
21736
21736
  entry: path$1.relative(dirPath, entryPath).split(path$1.sep).join("/"),
21737
- copyInto: (bundleDir) => fs$1.promises.cp(dirPath, bundleDir, {
21738
- recursive: true,
21739
- verbatimSymlinks: true
21740
- })
21737
+ copyInto: (bundleDir) => copyTreeVerbatim(dirPath, bundleDir)
21741
21738
  };
21742
21739
  }
21743
21740
  function commonAncestor(left, right) {
@@ -21787,7 +21784,8 @@ async function copyTracedEntry(source, destination, stagingRoot, bundleDir, dirP
21787
21784
  if (!isWithin(stagingRoot, realTarget)) throw new Error(`the runtime dependency trace found a symlink outside its staging root: ${source} -> ${realTarget}`);
21788
21785
  const stagedTarget = isWithin(dirPath, realTarget) ? path$1.join(bundleDir, path$1.relative(dirPath, realTarget)) : stagedRuntimePath(realTarget, stagingRoot, bundleDir);
21789
21786
  const linkTarget = path$1.relative(path$1.dirname(destination), stagedTarget);
21790
- await fs$1.promises.symlink(linkTarget, destination);
21787
+ const linkType = (await fs$1.promises.stat(realTarget)).isDirectory() ? "dir" : "file";
21788
+ await fs$1.promises.symlink(linkTarget, destination, linkType);
21791
21789
  return;
21792
21790
  }
21793
21791
  if (stat.isDirectory()) {