@prisma/composer-prisma-cloud 0.2.0-dev.15 → 0.2.0-dev.16
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/postgres-main.mjs +68 -2
- package/dist/postgres-main.mjs.map +1 -1
- package/package.json +17 -17
package/dist/postgres-main.mjs
CHANGED
|
@@ -155,9 +155,52 @@ function isStringKeyedRecord(value) {
|
|
|
155
155
|
function isPrismaDevInternalStateModule(value) {
|
|
156
156
|
return isStringKeyedRecord(value) && typeof value["deleteServer"] === "function" && typeof value["killServer"] === "function" && typeof value["getServerStatus"] === "function";
|
|
157
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Every port any `@prisma/dev` server RECORD on this machine claims —
|
|
160
|
+
* database, http, shadow, and streams. `startPrismaDevServer` validates a
|
|
161
|
+
* requested port against these records (`ServerState.scan`) and refuses one
|
|
162
|
+
* that any record claims, even when nothing has it bound — and a record's
|
|
163
|
+
* aux ports are picked by `@prisma/dev`'s own walking-upward picker, which
|
|
164
|
+
* over enough servers climbs into this daemon's database range. A fresh
|
|
165
|
+
* database-port pick that only probed the OS would collide with such a
|
|
166
|
+
* claim, so fresh picks exclude these too. Best-effort: `scan` is the same
|
|
167
|
+
* internal surface the rest of this module already binds to, but absent or
|
|
168
|
+
* failing it degrades to the OS probe alone.
|
|
169
|
+
*/
|
|
170
|
+
async function registryClaimedPorts(internalState) {
|
|
171
|
+
const ports = /* @__PURE__ */ new Set();
|
|
172
|
+
const scanHost = isStringKeyedRecord(internalState) ? internalState["ServerState"] : void 0;
|
|
173
|
+
const scan = isStringKeyedRecord(scanHost) ? scanHost["scan"] : void 0;
|
|
174
|
+
if (!isStringKeyedRecord(scanHost) || typeof scan !== "function") return ports;
|
|
175
|
+
try {
|
|
176
|
+
const records = await scan.call(scanHost, { onlyMetadata: true });
|
|
177
|
+
if (!Array.isArray(records)) return ports;
|
|
178
|
+
for (const record of records) {
|
|
179
|
+
if (!isStringKeyedRecord(record)) continue;
|
|
180
|
+
for (const key of [
|
|
181
|
+
"databasePort",
|
|
182
|
+
"port",
|
|
183
|
+
"shadowDatabasePort",
|
|
184
|
+
"streamsPort"
|
|
185
|
+
]) {
|
|
186
|
+
const port = record[key];
|
|
187
|
+
if (typeof port === "number" && Number.isInteger(port) && port > 0) ports.add(port);
|
|
188
|
+
}
|
|
189
|
+
const experimental = record["experimental"];
|
|
190
|
+
const streams = isStringKeyedRecord(experimental) ? experimental["streams"] : void 0;
|
|
191
|
+
const streamsUrl = isStringKeyedRecord(streams) ? streams["serverUrl"] : void 0;
|
|
192
|
+
if (typeof streamsUrl === "string") {
|
|
193
|
+
const port = databasePortOf(streamsUrl);
|
|
194
|
+
if (port !== void 0) ports.add(port);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
} catch {}
|
|
198
|
+
return ports;
|
|
199
|
+
}
|
|
158
200
|
function readServerStatus(status) {
|
|
159
201
|
if (!isStringKeyedRecord(status)) return {
|
|
160
202
|
live: false,
|
|
203
|
+
recordExists: true,
|
|
161
204
|
pid: void 0,
|
|
162
205
|
url: void 0,
|
|
163
206
|
databasePort: void 0
|
|
@@ -169,6 +212,7 @@ function readServerStatus(status) {
|
|
|
169
212
|
const databasePort = status["databasePort"];
|
|
170
213
|
return {
|
|
171
214
|
live: status["status"] === "running" || status["status"] === "starting_up",
|
|
215
|
+
recordExists: status["status"] !== "no_such_server",
|
|
172
216
|
pid: typeof pid === "number" ? pid : void 0,
|
|
173
217
|
url: typeof url === "string" ? url : void 0,
|
|
174
218
|
databasePort: typeof databasePort === "number" ? databasePort : void 0
|
|
@@ -180,6 +224,7 @@ async function serverStatusOf(internalState, instanceName) {
|
|
|
180
224
|
} catch {
|
|
181
225
|
return {
|
|
182
226
|
live: false,
|
|
227
|
+
recordExists: true,
|
|
183
228
|
pid: void 0,
|
|
184
229
|
url: void 0,
|
|
185
230
|
databasePort: void 0
|
|
@@ -302,6 +347,18 @@ function main() {
|
|
|
302
347
|
});
|
|
303
348
|
}
|
|
304
349
|
const inflightEnsures = /* @__PURE__ */ new Map();
|
|
350
|
+
/**
|
|
351
|
+
* Names whose `startPrismaDevServer` call failed in THIS process for any
|
|
352
|
+
* reason other than "already running". `@prisma/dev` acquires the name's
|
|
353
|
+
* lock before it validates the requested ports, and a failure after that
|
|
354
|
+
* point (a port refusal) propagates WITHOUT releasing the lock — so the
|
|
355
|
+
* very next start of the same name in this process is refused as "already
|
|
356
|
+
* running" by a holder that is this daemon's own dead attempt, and no
|
|
357
|
+
* amount of waiting frees it. Membership here is what makes deleting that
|
|
358
|
+
* lock provably safe: a name this process leaked cannot have been
|
|
359
|
+
* acquired by anyone else since (the leak never releases).
|
|
360
|
+
*/
|
|
361
|
+
const leakedStartNames = /* @__PURE__ */ new Set();
|
|
305
362
|
/** Concurrent PUTs for the same database coalesce onto one start — a second `startPrismaDevServer` for a name whose first start is still booting fails as "already running". */
|
|
306
363
|
function ensureDatabase(app, id, prismaDevModulePath) {
|
|
307
364
|
const instanceName = instanceNameFor(app, id);
|
|
@@ -334,7 +391,8 @@ function main() {
|
|
|
334
391
|
}
|
|
335
392
|
} else if (recorded.live) await internalState.killServer(instanceName).catch(() => void 0);
|
|
336
393
|
const isFreshAllocation = existingRecord === void 0;
|
|
337
|
-
|
|
394
|
+
const registryPorts = isFreshAllocation ? await registryClaimedPorts(internalState) : /* @__PURE__ */ new Set();
|
|
395
|
+
let dbPort = existingRecord?.databasePort ?? await smallestUnusedDatabasePort(MIN_DATABASE_PORT, registryPorts);
|
|
338
396
|
const conflicted = /* @__PURE__ */ new Set();
|
|
339
397
|
let alreadyRunningRetries = 0;
|
|
340
398
|
for (let attempt = 1;; attempt++) try {
|
|
@@ -344,6 +402,7 @@ function main() {
|
|
|
344
402
|
persistenceMode: "stateful"
|
|
345
403
|
}));
|
|
346
404
|
const url = server.database.connectionString;
|
|
405
|
+
leakedStartNames.delete(instanceName);
|
|
347
406
|
runtimes.set(instanceName, server);
|
|
348
407
|
appRec.databases[id] = {
|
|
349
408
|
id,
|
|
@@ -356,6 +415,12 @@ function main() {
|
|
|
356
415
|
} catch (err) {
|
|
357
416
|
if (isNameAlreadyTaken(err) && alreadyRunningRetries < MAX_ALREADY_RUNNING_RETRIES) {
|
|
358
417
|
alreadyRunningRetries += 1;
|
|
418
|
+
if (leakedStartNames.has(instanceName)) {
|
|
419
|
+
if (!(await serverStatusOf(internalState, instanceName)).recordExists) {
|
|
420
|
+
await internalState.deleteServer(instanceName).catch(() => void 0);
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
359
424
|
for (let poll = 1; poll <= ALREADY_RUNNING_POLLS; poll += 1) {
|
|
360
425
|
const now = await serverStatusOf(internalState, instanceName);
|
|
361
426
|
if (now.live && now.pid !== void 0 && isPidAlive(now.pid) && now.url !== void 0) {
|
|
@@ -376,13 +441,14 @@ function main() {
|
|
|
376
441
|
}
|
|
377
442
|
continue;
|
|
378
443
|
}
|
|
444
|
+
if (!isNameAlreadyTaken(err)) leakedStartNames.add(instanceName);
|
|
379
445
|
const conflictPort = portConflictOf(err, [dbPort]);
|
|
380
446
|
if (!(conflictPort !== void 0 && attempt < MAX_FRESH_PORT_CANDIDATES && (conflictPort !== dbPort || isFreshAllocation))) {
|
|
381
447
|
const reason = err instanceof Error ? err.message : String(err);
|
|
382
448
|
throw new Error(`postgres emulator failed to start database "${instanceName}" on port ${String(dbPort)}: ${maskCredentials(firstLine(reason))}`);
|
|
383
449
|
}
|
|
384
450
|
conflicted.add(conflictPort);
|
|
385
|
-
if (conflictPort === dbPort) dbPort = await smallestUnusedDatabasePort(dbPort + 1, conflicted);
|
|
451
|
+
if (conflictPort === dbPort) dbPort = await smallestUnusedDatabasePort(dbPort + 1, /* @__PURE__ */ new Set([...conflicted, ...registryPorts]));
|
|
386
452
|
}
|
|
387
453
|
}
|
|
388
454
|
async function deleteApp(app, prismaDevModulePathHint) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-main.mjs","names":["getPort"],"sources":["../../../1-prisma-cloud/0-lowering/dev-emulators/dist/instance-name-BF6J_weL.mjs","../../../1-prisma-cloud/0-lowering/dev-emulators/dist/postgres-main.mjs"],"sourcesContent":["//#region src/instance-name.ts\n/**\n* `pcdev-<app>-<database-id>` instance-name derivation (local-dev spec § 2\n* `postgres-main.ts`): each half lowercased, every char outside `[a-z0-9]`\n* replaced by `-`, runs collapsed, the combined name trimmed to 63 chars.\n*\n* A separate, side-effect-free module (not defined inline in\n* `postgres-main.ts`) so it can be imported directly by tests without also\n* running that file's own `main()` — `postgres-main.ts` is a daemon\n* entrypoint script, always invoked as a subprocess, and calls `main()`\n* unconditionally at module load.\n*/\n/**\n* Deliberately linear, no ambiguous quantifiers: a per-character replace\n* (no `+`, so no run-length backtracking surface), a bounded-quantifier\n* collapse (`{2,}`, not alternation-with-quantifiers), and plain\n* index-walking for the leading/trailing trim instead of a regex — a\n* combined `+`-plus-alternation trim (`/^-+|-+$/g`) is exactly the shape\n* CodeQL's polynomial-ReDoS check flags, whether or not this particular\n* instance is provably safe.\n*/\nfunction slug(segment) {\n\tconst collapsed = segment.toLowerCase().replace(/[^a-z0-9]/g, \"-\").replace(/-{2,}/g, \"-\");\n\tlet start = 0;\n\tlet end = collapsed.length;\n\twhile (start < end && collapsed[start] === \"-\") start++;\n\twhile (end > start && collapsed[end - 1] === \"-\") end--;\n\treturn collapsed.slice(start, end);\n}\nfunction instanceNameFor(app, id) {\n\treturn `pcdev-${slug(app)}-${slug(id)}`.slice(0, 63);\n}\n//#endregion\nexport { slug as n, instanceNameFor as t };\n\n//# sourceMappingURL=instance-name-BF6J_weL.mjs.map","import { c as readOwnVersion, f as StateFile, p as readJsonFile, s as isPidAlive, t as isValidSegment } from \"./segments-NpKN-46R.mjs\";\nimport { t as instanceNameFor } from \"./instance-name-BF6J_weL.mjs\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport getPort, { portNumbers } from \"get-port\";\nimport * as http from \"node:http\";\n//#region src/postgres-main.ts\n/**\n* The Postgres emulator daemon (local-dev spec § 2 `postgres-main.ts`): a\n* small local counterpart of hosted Postgres, hosting `@prisma/dev`'s\n* `startPrismaDevServer()` — one named, persistent server per `Database`\n* resource, several servers in this one daemon process. Loopback\n* `node:http` JSON admin API; state under its `--state-dir`.\n*\n* `@prisma/dev` is imported dynamically from a CALLER-RESOLVED path (each\n* admin request that needs it carries `prismaDevModulePath`) so the app\n* owns its own Prisma version — this daemon has no `@prisma/dev` dependency\n* of its own.\n*\n* Runs as its own OS process, started by `daemon.ts`'s `ensureDaemon` via\n* `process.execPath <this file> --port <n> --state-dir <dir>`.\n*/\nconst MIN_DATABASE_PORT = 51300;\nconst MAX_DATABASE_PORT = 65535;\nconst APPS_STATE_MODE = 384;\n/** Spec § 2 step 5's pattern, applied to a fresh database-port allocation. */\nconst MAX_FRESH_PORT_CANDIDATES = 5;\n/**\n* A name refused as \"already running\" is retried a few times, each attempt\n* first waiting out the holder: a cold server boot takes seconds, and a\n* crashed holder's lock is only released once proper-lockfile's ~10s stale\n* threshold passes. Bounded so a genuinely stuck name still fails visibly\n* inside the dev command's own startup budget.\n*/\nconst MAX_ALREADY_RUNNING_RETRIES = 2;\nconst ALREADY_RUNNING_POLLS = 24;\nconst ALREADY_RUNNING_POLL_MS = 500;\nconst NOT_INSTALLED_MESSAGE = \"local dev needs @prisma/dev for its local Postgres emulator — add \\\"prisma\\\" to your app's devDependencies.\";\nfunction maskCredentials(text) {\n\treturn text.replace(/:\\/\\/([^:@/\\s]+):[^@/\\s]+@/g, \"://$1:***@\");\n}\nfunction firstLine(text) {\n\treturn (text.split(\"\\n\")[0] ?? text).trim();\n}\nfunction isDatabaseRecord(value) {\n\treturn typeof value === \"object\" && value !== null && \"id\" in value && typeof value.id === \"string\" && \"instanceName\" in value && typeof value.instanceName === \"string\" && \"databasePort\" in value && typeof value.databasePort === \"number\" && \"url\" in value && typeof value.url === \"string\";\n}\nfunction isAppRecord(value) {\n\treturn typeof value === \"object\" && value !== null && \"databases\" in value && typeof value.databases === \"object\" && value.databases !== null && Object.values(value.databases).every(isDatabaseRecord);\n}\nfunction isAppsState(value) {\n\treturn typeof value === \"object\" && value !== null && Object.values(value).every(isAppRecord);\n}\nfunction isDatabaseBody(value) {\n\treturn typeof value === \"object\" && value !== null && \"prismaDevModulePath\" in value && typeof value.prismaDevModulePath === \"string\";\n}\nfunction isPrismaDevModule(value) {\n\treturn typeof value === \"object\" && value !== null && \"startPrismaDevServer\" in value && typeof value.startPrismaDevServer === \"function\";\n}\n/**\n* `@prisma/dev` exports a `PortNotAvailableError` class with a `readonly\n* port: number`, but the daemon dynamically imports the module from a\n* caller-given path while the class identity checked here would come from\n* whatever module graph THIS file's own bundle produced — two separate\n* instantiations of the same logical class, so `instanceof` doesn't match\n* across them (confirmed empirically: a real port conflict's `err\n* instanceof mod.PortNotAvailableError` is `false` even though the error IS\n* the port-conflict one). Duck-typing the documented shape — a `port`\n* number matching the candidate we just tried — is what actually survives\n* that boundary.\n*/\n/**\n* The port a start refusal is about, when it is one of THIS attempt's ports.\n* Duck-typed (`instanceof` fails across the dynamic-import boundary): every\n* `@prisma/dev` port refusal — not-available, requested-twice, and\n* belongs-to-another-server (its registry can claim a port no bind probe\n* sees) — carries the offending port as `.port`, and any of the four ports\n* we requested (database + the three aux listeners) can be the one refused.\n*/\nfunction portConflictOf(err, ports) {\n\tif (typeof err !== \"object\" || err === null || !(\"port\" in err)) return void 0;\n\tconst port = err.port;\n\treturn typeof port === \"number\" && ports.includes(port) ? port : void 0;\n}\nfunction isNameAlreadyTaken(err) {\n\treturn isStringKeyedRecord(err) && (err[\"name\"] === \"ServerAlreadyRunningError\" || err[\"name\"] === \"ServerStateAlreadyExistsError\");\n}\n/** The port of a postgres connection URL, when it parses as one. */\nfunction databasePortOf(connectionString) {\n\ttry {\n\t\tconst port = Number(new URL(connectionString).port);\n\t\treturn Number.isInteger(port) && port > 0 ? port : void 0;\n\t} catch {\n\t\treturn;\n\t}\n}\n/**\n* A dynamic `import()` failure's own message routinely names a SECOND path\n* (e.g. bun's \"Cannot find module '<target>' from '<importer>'\") — the\n* importer half is this daemon's own internal location, not anything the\n* caller gave us, and has no business in a response body. Rather than try\n* to scrub an arbitrary underlying message for every runtime's own error\n* phrasing, the resolution-failure case names only what the caller\n* supplied — the pinned message plus the given `prismaDevModulePath`, and\n* nothing else. (A DIFFERENT case — a module that resolves fine but whose\n* `startPrismaDevServer()` call itself fails — still surfaces its\n* underlying text verbatim, credential-masked, per spec § 2.)\n*/\nasync function importPrismaDev(prismaDevModulePath) {\n\tlet mod;\n\ttry {\n\t\tmod = await import(pathToFileURL(prismaDevModulePath).href);\n\t} catch {\n\t\tthrow new Error(`${NOT_INSTALLED_MESSAGE} (could not resolve \"${prismaDevModulePath}\")`);\n\t}\n\tif (!isPrismaDevModule(mod)) throw new Error(`${NOT_INSTALLED_MESSAGE} (\"${prismaDevModulePath}\" is not a @prisma/dev module)`);\n\treturn mod;\n}\nfunction isStringKeyedRecord(value) {\n\treturn typeof value === \"object\" && value !== null;\n}\nfunction isPrismaDevInternalStateModule(value) {\n\treturn isStringKeyedRecord(value) && typeof value[\"deleteServer\"] === \"function\" && typeof value[\"killServer\"] === \"function\" && typeof value[\"getServerStatus\"] === \"function\";\n}\nfunction readServerStatus(status) {\n\tif (!isStringKeyedRecord(status)) return {\n\t\tlive: false,\n\t\tpid: void 0,\n\t\turl: void 0,\n\t\tdatabasePort: void 0\n\t};\n\tconst exports = status[\"exports\"];\n\tconst database = isStringKeyedRecord(exports) ? exports[\"database\"] : void 0;\n\tconst url = isStringKeyedRecord(database) ? database[\"connectionString\"] : void 0;\n\tconst pid = status[\"pid\"];\n\tconst databasePort = status[\"databasePort\"];\n\treturn {\n\t\tlive: status[\"status\"] === \"running\" || status[\"status\"] === \"starting_up\",\n\t\tpid: typeof pid === \"number\" ? pid : void 0,\n\t\turl: typeof url === \"string\" ? url : void 0,\n\t\tdatabasePort: typeof databasePort === \"number\" ? databasePort : void 0\n\t};\n}\nasync function serverStatusOf(internalState, instanceName) {\n\ttry {\n\t\treturn readServerStatus(await internalState.getServerStatus(instanceName));\n\t} catch {\n\t\treturn {\n\t\t\tlive: false,\n\t\t\tpid: void 0,\n\t\t\turl: void 0,\n\t\t\tdatabasePort: void 0\n\t\t};\n\t}\n}\nconst CLOSE_SETTLE_ATTEMPTS = 40;\nconst CLOSE_SETTLE_DELAY_MS = 250;\n/** True once the named server's persisted state no longer claims it is live — the precondition for `deleteServer`, whose kill path targets the pid in that state, which for an in-daemon server is THIS DAEMON's own pid. */\nasync function settledAfterClose(internalState, instanceName) {\n\tfor (let attempt = 1; attempt <= CLOSE_SETTLE_ATTEMPTS; attempt += 1) {\n\t\tif (!(await serverStatusOf(internalState, instanceName)).live) return true;\n\t\tif (attempt < CLOSE_SETTLE_ATTEMPTS) await new Promise((resolve) => setTimeout(resolve, CLOSE_SETTLE_DELAY_MS));\n\t}\n\treturn false;\n}\n/**\n* `@prisma/dev`'s own package.json declares `./internal/state`, whose\n* `deleteServer(name)` actually removes a stateful server's persisted PGlite\n* data — `startPrismaDevServer`'s public surface only starts/closes a live\n* server, never deletes what a closed one left on disk. Resolved by reading\n* the SAME package's own `exports` map (walked up from the caller-given\n* entry path to find `@prisma/dev`'s `package.json`), never by guessing at\n* `dist/` file layout.\n*/\nasync function importPrismaDevInternalState(prismaDevModulePath) {\n\tlet dir = path.dirname(prismaDevModulePath);\n\tfor (;;) {\n\t\tconst pkgPath = path.join(dir, \"package.json\");\n\t\tif (fs.existsSync(pkgPath)) {\n\t\t\tconst pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\"));\n\t\t\tif (isStringKeyedRecord(pkg) && pkg[\"name\"] === \"@prisma/dev\" && isStringKeyedRecord(pkg[\"exports\"])) {\n\t\t\t\tconst entry = pkg[\"exports\"][\"./internal/state\"];\n\t\t\t\tconst target = resolveExportTarget(entry);\n\t\t\t\tif (target === void 0) throw new Error(`\"@prisma/dev\" at \"${dir}\" does not declare an \"./internal/state\" export — cannot delete its persisted database data.`);\n\t\t\t\tconst mod = await import(pathToFileURL(path.join(dir, target)).href);\n\t\t\t\tif (isPrismaDevInternalStateModule(mod)) return mod;\n\t\t\t\tthrow new Error(`\"@prisma/dev\"'s \"./internal/state\" export at \"${dir}\" has no deleteServer.`);\n\t\t\t}\n\t\t}\n\t\tconst parent = path.dirname(dir);\n\t\tif (parent === dir) throw new Error(`could not find \"@prisma/dev\"'s package.json above \"${prismaDevModulePath}\".`);\n\t\tdir = parent;\n\t}\n}\nfunction resolveExportTarget(entry) {\n\tif (typeof entry === \"string\") return entry;\n\tif (!isStringKeyedRecord(entry)) return void 0;\n\tconst nested = entry[\"import\"] ?? entry[\"require\"] ?? entry[\"default\"];\n\tif (typeof nested === \"string\") return nested;\n\tif (isStringKeyedRecord(nested)) {\n\t\tconst def = nested[\"default\"];\n\t\tif (typeof def === \"string\") return def;\n\t}\n}\nfunction parseArgs(argv) {\n\tlet port;\n\tlet stateDir;\n\tfor (let i = 0; i < argv.length; i++) if (argv[i] === \"--port\") port = Number(argv[i + 1]);\n\telse if (argv[i] === \"--state-dir\") stateDir = argv[i + 1];\n\tif (port === void 0 || Number.isNaN(port)) throw new Error(\"postgres-main: --port <n> is required\");\n\tif (stateDir === void 0) throw new Error(\"postgres-main: --state-dir <dir> is required\");\n\treturn {\n\t\tport,\n\t\tstateDir\n\t};\n}\nfunction readBody(req) {\n\treturn new Promise((resolve, reject) => {\n\t\tconst chunks = [];\n\t\treq.on(\"data\", (chunk) => chunks.push(chunk));\n\t\treq.on(\"end\", () => resolve(Buffer.concat(chunks)));\n\t\treq.on(\"error\", reject);\n\t});\n}\nfunction main() {\n\tconst { port, stateDir } = parseArgs(process.argv.slice(2));\n\tconst ownVersion = readOwnVersion();\n\tconst appsJsonPath = path.join(stateDir, \"apps.json\");\n\tconst stateFile = new StateFile(appsJsonPath, APPS_STATE_MODE);\n\tlet state = {};\n\tconst runtimes = /* @__PURE__ */ new Map();\n\t/**\n\t* Server starts run ONE AT A TIME. `@prisma/dev`'s start is not\n\t* concurrency-safe within a process: two simultaneous calls pick their\n\t* ports without seeing each other and one fails with a port refusal\n\t* (verified directly — two concurrent starts with distinct, pinned\n\t* database ports fail; the same two started in sequence both succeed).\n\t* The daemon issues concurrent starts whenever an app converges more than\n\t* one database, which is what produced the port refusals, the retries\n\t* whose half-started servers held their own name's lock, and every\n\t* \"already running\" failure downstream of that.\n\t*/\n\tlet startQueue = Promise.resolve();\n\tfunction serializeStart(run) {\n\t\tconst next = startQueue.then(run, run);\n\t\tstartQueue = next.then(() => void 0, () => void 0);\n\t\treturn next;\n\t}\n\tfunction schedulePersist() {\n\t\tstateFile.write(state);\n\t}\n\tfunction getOrCreateApp(app) {\n\t\tlet appRec = state[app];\n\t\tif (!appRec) {\n\t\t\tappRec = { databases: {} };\n\t\t\tstate[app] = appRec;\n\t\t}\n\t\treturn appRec;\n\t}\n\tfunction usedDatabasePorts() {\n\t\tconst ports = /* @__PURE__ */ new Set();\n\t\tfor (const appRec of Object.values(state)) for (const db of Object.values(appRec.databases)) ports.add(db.databasePort);\n\t\treturn ports;\n\t}\n\tasync function smallestUnusedDatabasePort(min, alsoExclude = /* @__PURE__ */ new Set()) {\n\t\treturn getPort({\n\t\t\tport: portNumbers(min, MAX_DATABASE_PORT),\n\t\t\texclude: [...usedDatabasePorts(), ...alsoExclude]\n\t\t});\n\t}\n\tconst inflightEnsures = /* @__PURE__ */ new Map();\n\t/** Concurrent PUTs for the same database coalesce onto one start — a second `startPrismaDevServer` for a name whose first start is still booting fails as \"already running\". */\n\tfunction ensureDatabase(app, id, prismaDevModulePath) {\n\t\tconst instanceName = instanceNameFor(app, id);\n\t\tconst inflight = inflightEnsures.get(instanceName);\n\t\tif (inflight) return inflight;\n\t\tconst run = ensureDatabaseSerialized(app, id, prismaDevModulePath, instanceName).finally(() => {\n\t\t\tinflightEnsures.delete(instanceName);\n\t\t});\n\t\tinflightEnsures.set(instanceName, run);\n\t\treturn run;\n\t}\n\tasync function ensureDatabaseSerialized(app, id, prismaDevModulePath, instanceName) {\n\t\tconst appRec = getOrCreateApp(app);\n\t\tconst existingRecord = appRec.databases[id];\n\t\tconst runningServer = runtimes.get(instanceName);\n\t\tif (existingRecord && runningServer) return { url: existingRecord.url };\n\t\tconst prismaDev = await importPrismaDev(prismaDevModulePath);\n\t\tconst internalState = await importPrismaDevInternalState(prismaDevModulePath);\n\t\tconst recorded = await serverStatusOf(internalState, instanceName);\n\t\tif (recorded.live && recorded.pid !== void 0 && isPidAlive(recorded.pid)) {\n\t\t\tif (recorded.url !== void 0) {\n\t\t\t\tappRec.databases[id] = {\n\t\t\t\t\tid,\n\t\t\t\t\tinstanceName,\n\t\t\t\t\tdatabasePort: recorded.databasePort ?? databasePortOf(recorded.url) ?? MIN_DATABASE_PORT,\n\t\t\t\t\turl: recorded.url\n\t\t\t\t};\n\t\t\t\tschedulePersist();\n\t\t\t\treturn { url: recorded.url };\n\t\t\t}\n\t\t} else if (recorded.live) await internalState.killServer(instanceName).catch(() => void 0);\n\t\tconst isFreshAllocation = existingRecord === void 0;\n\t\tlet dbPort = existingRecord?.databasePort ?? await smallestUnusedDatabasePort(MIN_DATABASE_PORT);\n\t\tconst conflicted = /* @__PURE__ */ new Set();\n\t\tlet alreadyRunningRetries = 0;\n\t\tfor (let attempt = 1;; attempt++) try {\n\t\t\tconst server = await serializeStart(() => prismaDev.startPrismaDevServer({\n\t\t\t\tname: instanceName,\n\t\t\t\tdatabasePort: dbPort,\n\t\t\t\tpersistenceMode: \"stateful\"\n\t\t\t}));\n\t\t\tconst url = server.database.connectionString;\n\t\t\truntimes.set(instanceName, server);\n\t\t\tappRec.databases[id] = {\n\t\t\t\tid,\n\t\t\t\tinstanceName,\n\t\t\t\tdatabasePort: dbPort,\n\t\t\t\turl\n\t\t\t};\n\t\t\tschedulePersist();\n\t\t\treturn { url };\n\t\t} catch (err) {\n\t\t\tif (isNameAlreadyTaken(err) && alreadyRunningRetries < MAX_ALREADY_RUNNING_RETRIES) {\n\t\t\t\talreadyRunningRetries += 1;\n\t\t\t\tfor (let poll = 1; poll <= ALREADY_RUNNING_POLLS; poll += 1) {\n\t\t\t\t\tconst now = await serverStatusOf(internalState, instanceName);\n\t\t\t\t\tif (now.live && now.pid !== void 0 && isPidAlive(now.pid) && now.url !== void 0) {\n\t\t\t\t\t\tappRec.databases[id] = {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tinstanceName,\n\t\t\t\t\t\t\tdatabasePort: now.databasePort ?? databasePortOf(now.url) ?? dbPort,\n\t\t\t\t\t\t\turl: now.url\n\t\t\t\t\t\t};\n\t\t\t\t\t\tschedulePersist();\n\t\t\t\t\t\treturn { url: now.url };\n\t\t\t\t\t}\n\t\t\t\t\tif (now.live && (now.pid === void 0 || !isPidAlive(now.pid))) {\n\t\t\t\t\t\tawait internalState.killServer(instanceName).catch(() => void 0);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, ALREADY_RUNNING_POLL_MS));\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst conflictPort = portConflictOf(err, [dbPort]);\n\t\t\tif (!(conflictPort !== void 0 && attempt < MAX_FRESH_PORT_CANDIDATES && (conflictPort !== dbPort || isFreshAllocation))) {\n\t\t\t\tconst reason = err instanceof Error ? err.message : String(err);\n\t\t\t\tthrow new Error(`postgres emulator failed to start database \"${instanceName}\" on port ${String(dbPort)}: ${maskCredentials(firstLine(reason))}`);\n\t\t\t}\n\t\t\tconflicted.add(conflictPort);\n\t\t\tif (conflictPort === dbPort) dbPort = await smallestUnusedDatabasePort(dbPort + 1, conflicted);\n\t\t}\n\t}\n\tasync function deleteApp(app, prismaDevModulePathHint) {\n\t\tconst appRec = state[app];\n\t\tif (!appRec) return;\n\t\tconst entries = Object.values(appRec.databases);\n\t\tfor (const db of entries) {\n\t\t\tconst server = runtimes.get(db.instanceName);\n\t\t\tif (server) {\n\t\t\t\tawait server.close().catch(() => void 0);\n\t\t\t\truntimes.delete(db.instanceName);\n\t\t\t}\n\t\t}\n\t\tif (entries.length > 0 && prismaDevModulePathHint) {\n\t\t\tconst internalState = await importPrismaDevInternalState(prismaDevModulePathHint);\n\t\t\tfor (const db of entries) {\n\t\t\t\tif (!runtimes.has(db.instanceName)) {\n\t\t\t\t\tif ((await serverStatusOf(internalState, db.instanceName)).pid !== process.pid) await internalState.killServer(db.instanceName).catch(() => void 0);\n\t\t\t\t}\n\t\t\t\tif (!await settledAfterClose(internalState, db.instanceName)) {\n\t\t\t\t\tconsole.error(`postgres-main: server \"${db.instanceName}\" still reports running after close — leaving its persisted data in place instead of risking a self-kill.`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tawait internalState.deleteServer(db.instanceName);\n\t\t\t}\n\t\t}\n\t\tdelete state[app];\n\t\tschedulePersist();\n\t}\n\tfunction json(res, status, body) {\n\t\tres.writeHead(status, { \"content-type\": \"application/json\" });\n\t\tres.end(JSON.stringify(body));\n\t}\n\tfunction text(res, status, body) {\n\t\tres.writeHead(status, { \"content-type\": \"text/plain; charset=utf-8\" });\n\t\tres.end(body);\n\t}\n\tfunction badSegment(res, segment) {\n\t\ttext(res, 400, `invalid path segment \"${segment}\": must match /^[a-z0-9][a-z0-9-]*$/ and be at most 63 characters`);\n\t}\n\tfunction databaseView(db) {\n\t\treturn {\n\t\t\tid: db.id,\n\t\t\turl: db.url,\n\t\t\tinstanceName: db.instanceName,\n\t\t\tdatabasePort: db.databasePort\n\t\t};\n\t}\n\t/** The most recently observed `prismaDevModulePath` for any database of `app` — DELETE has no body of its own to carry one. */\n\tconst recentPrismaDevModulePath = /* @__PURE__ */ new Map();\n\tfunction lastKnownPrismaDevModulePath(app) {\n\t\treturn recentPrismaDevModulePath.get(app);\n\t}\n\tasync function handleRequest(req, res) {\n\t\tconst url = new URL(req.url ?? \"/\", `http://127.0.0.1:${String(port)}`);\n\t\tconst method = req.method ?? \"GET\";\n\t\tconst segments = url.pathname.split(\"/\").filter((s) => s.length > 0).map((s) => decodeURIComponent(s));\n\t\tif (method === \"GET\" && segments.length === 1 && segments[0] === \"health\") return json(res, 200, { version: ownVersion });\n\t\tif (segments[0] === \"apps\" && segments.length >= 2) {\n\t\t\tconst app = segments[1];\n\t\t\tif (app === void 0 || !isValidSegment(app)) return badSegment(res, app ?? \"\");\n\t\t\tif (method === \"PUT\" && segments.length === 4 && segments[2] === \"databases\") {\n\t\t\t\tconst id = segments[3];\n\t\t\t\tif (id === void 0 || !isValidSegment(id)) return badSegment(res, id ?? \"\");\n\t\t\t\tconst raw = await readBody(req);\n\t\t\t\tlet parsed;\n\t\t\t\ttry {\n\t\t\t\t\tparsed = JSON.parse(raw.toString(\"utf8\"));\n\t\t\t\t} catch {\n\t\t\t\t\treturn text(res, 400, \"malformed JSON body\");\n\t\t\t\t}\n\t\t\t\tif (!isDatabaseBody(parsed)) return text(res, 400, \"malformed database body: expected { \\\"prismaDevModulePath\\\": string }\");\n\t\t\t\trecentPrismaDevModulePath.set(app, parsed.prismaDevModulePath);\n\t\t\t\treturn json(res, 200, await ensureDatabase(app, id, parsed.prismaDevModulePath));\n\t\t\t}\n\t\t\tif (method === \"GET\" && segments.length === 3 && segments[2] === \"databases\") {\n\t\t\t\tconst appRec = state[app];\n\t\t\t\treturn json(res, 200, appRec ? Object.values(appRec.databases).map(databaseView) : []);\n\t\t\t}\n\t\t\tif (method === \"DELETE\" && segments.length === 2) {\n\t\t\t\tawait deleteApp(app, lastKnownPrismaDevModulePath(app));\n\t\t\t\tres.writeHead(204);\n\t\t\t\tres.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tres.writeHead(404);\n\t\tres.end();\n\t}\n\tconst server = http.createServer((req, res) => {\n\t\thandleRequest(req, res).catch((err) => {\n\t\t\tif (!res.headersSent) res.writeHead(500, { \"content-type\": \"text/plain\" });\n\t\t\tres.end(err instanceof Error ? maskCredentials(err.message) : String(err));\n\t\t});\n\t});\n\tasync function shutdown() {\n\t\tfor (const server of runtimes.values()) await server.close().catch(() => void 0);\n\t\tawait stateFile.flush();\n\t\tserver.close();\n\t\tprocess.exit(0);\n\t}\n\tprocess.on(\"SIGTERM\", () => void shutdown());\n\tprocess.on(\"SIGINT\", () => void shutdown());\n\tprocess.on(\"unhandledRejection\", (reason) => {\n\t\tconsole.error(\"postgres-main: unhandled rejection from background work:\", reason instanceof Error ? maskCredentials(reason.stack ?? reason.message) : reason);\n\t});\n\tprocess.on(\"uncaughtException\", (err) => {\n\t\tconsole.error(\"postgres-main: uncaught exception from background work:\", err instanceof Error ? maskCredentials(err.stack ?? err.message) : err);\n\t});\n\treadJsonFile(appsJsonPath, isAppsState).then((loaded) => {\n\t\tif (loaded) state = loaded;\n\t\tserver.listen(port, \"127.0.0.1\", () => {\n\t\t\tconsole.log(`[dev-emulators] postgres-main listening on 127.0.0.1:${String(port)}`);\n\t\t});\n\t}).catch((err) => {\n\t\tconsole.error(\"postgres-main: failed to load state\", err);\n\t\tprocess.exit(1);\n\t});\n}\nmain();\n//#endregion\nexport {};\n\n//# sourceMappingURL=postgres-main.mjs.map"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,SAAS,KAAK,SAAS;CACtB,MAAM,YAAY,QAAQ,YAAY,CAAC,CAAC,QAAQ,cAAc,GAAG,CAAC,CAAC,QAAQ,UAAU,GAAG;CACxF,IAAI,QAAQ;CACZ,IAAI,MAAM,UAAU;CACpB,OAAO,QAAQ,OAAO,UAAU,WAAW,KAAK;CAChD,OAAO,MAAM,SAAS,UAAU,MAAM,OAAO,KAAK;CAClD,OAAO,UAAU,MAAM,OAAO,GAAG;AAClC;AACA,SAAS,gBAAgB,KAAK,IAAI;CACjC,OAAO,SAAS,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,MAAM,GAAG,EAAE;AACpD;;;;;;;;;;;;;;;;;;ACRA,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;AAC1B,MAAM,kBAAkB;;AAExB,MAAM,4BAA4B;;;;;;;;AAQlC,MAAM,8BAA8B;AACpC,MAAM,wBAAwB;AAC9B,MAAM,0BAA0B;AAChC,MAAM,wBAAwB;AAC9B,SAAS,gBAAgB,MAAM;CAC9B,OAAO,KAAK,QAAQ,+BAA+B,YAAY;AAChE;AACA,SAAS,UAAU,MAAM;CACxB,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAA,CAAM,KAAK;AAC3C;AACA,SAAS,iBAAiB,OAAO;CAChC,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,QAAQ,SAAS,OAAO,MAAM,OAAO,YAAY,kBAAkB,SAAS,OAAO,MAAM,iBAAiB,YAAY,kBAAkB,SAAS,OAAO,MAAM,iBAAiB,YAAY,SAAS,SAAS,OAAO,MAAM,QAAQ;AACzR;AACA,SAAS,YAAY,OAAO;CAC3B,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,eAAe,SAAS,OAAO,MAAM,cAAc,YAAY,MAAM,cAAc,QAAQ,OAAO,OAAO,MAAM,SAAS,CAAC,CAAC,MAAM,gBAAgB;AACvM;AACA,SAAS,YAAY,OAAO;CAC3B,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAO,OAAO,KAAK,CAAC,CAAC,MAAM,WAAW;AAC7F;AACA,SAAS,eAAe,OAAO;CAC9B,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,yBAAyB,SAAS,OAAO,MAAM,wBAAwB;AAC9H;AACA,SAAS,kBAAkB,OAAO;CACjC,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,0BAA0B,SAAS,OAAO,MAAM,yBAAyB;AAChI;;;;;;;;;;;;;;;;;;;;;AAqBA,SAAS,eAAe,KAAK,OAAO;CACnC,IAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,EAAE,UAAU,MAAM,OAAO,KAAK;CAC7E,MAAM,OAAO,IAAI;CACjB,OAAO,OAAO,SAAS,YAAY,MAAM,SAAS,IAAI,IAAI,OAAO,KAAK;AACvE;AACA,SAAS,mBAAmB,KAAK;CAChC,OAAO,oBAAoB,GAAG,MAAM,IAAI,YAAY,+BAA+B,IAAI,YAAY;AACpG;;AAEA,SAAS,eAAe,kBAAkB;CACzC,IAAI;EACH,MAAM,OAAO,OAAO,IAAI,IAAI,gBAAgB,CAAC,CAAC,IAAI;EAClD,OAAO,OAAO,UAAU,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK;CACzD,QAAQ;EACP;CACD;AACD;;;;;;;;;;;;;AAaA,eAAe,gBAAgB,qBAAqB;CACnD,IAAI;CACJ,IAAI;EACH,MAAM,MAAM,OAAO,cAAc,mBAAmB,CAAC,CAAC;CACvD,QAAQ;EACP,MAAM,IAAI,MAAM,GAAG,sBAAsB,uBAAuB,oBAAoB,GAAG;CACxF;CACA,IAAI,CAAC,kBAAkB,GAAG,GAAG,MAAM,IAAI,MAAM,GAAG,sBAAsB,KAAK,oBAAoB,+BAA+B;CAC9H,OAAO;AACR;AACA,SAAS,oBAAoB,OAAO;CACnC,OAAO,OAAO,UAAU,YAAY,UAAU;AAC/C;AACA,SAAS,+BAA+B,OAAO;CAC9C,OAAO,oBAAoB,KAAK,KAAK,OAAO,MAAM,oBAAoB,cAAc,OAAO,MAAM,kBAAkB,cAAc,OAAO,MAAM,uBAAuB;AACtK;AACA,SAAS,iBAAiB,QAAQ;CACjC,IAAI,CAAC,oBAAoB,MAAM,GAAG,OAAO;EACxC,MAAM;EACN,KAAK,KAAK;EACV,KAAK,KAAK;EACV,cAAc,KAAK;CACpB;CACA,MAAM,UAAU,OAAO;CACvB,MAAM,WAAW,oBAAoB,OAAO,IAAI,QAAQ,cAAc,KAAK;CAC3E,MAAM,MAAM,oBAAoB,QAAQ,IAAI,SAAS,sBAAsB,KAAK;CAChF,MAAM,MAAM,OAAO;CACnB,MAAM,eAAe,OAAO;CAC5B,OAAO;EACN,MAAM,OAAO,cAAc,aAAa,OAAO,cAAc;EAC7D,KAAK,OAAO,QAAQ,WAAW,MAAM,KAAK;EAC1C,KAAK,OAAO,QAAQ,WAAW,MAAM,KAAK;EAC1C,cAAc,OAAO,iBAAiB,WAAW,eAAe,KAAK;CACtE;AACD;AACA,eAAe,eAAe,eAAe,cAAc;CAC1D,IAAI;EACH,OAAO,iBAAiB,MAAM,cAAc,gBAAgB,YAAY,CAAC;CAC1E,QAAQ;EACP,OAAO;GACN,MAAM;GACN,KAAK,KAAK;GACV,KAAK,KAAK;GACV,cAAc,KAAK;EACpB;CACD;AACD;AACA,MAAM,wBAAwB;AAC9B,MAAM,wBAAwB;;AAE9B,eAAe,kBAAkB,eAAe,cAAc;CAC7D,KAAK,IAAI,UAAU,GAAG,WAAW,uBAAuB,WAAW,GAAG;EACrE,IAAI,EAAE,MAAM,eAAe,eAAe,YAAY,EAAA,CAAG,MAAM,OAAO;EACtE,IAAI,UAAU,uBAAuB,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,qBAAqB,CAAC;CAC/G;CACA,OAAO;AACR;;;;;;;;;;AAUA,eAAe,6BAA6B,qBAAqB;CAChE,IAAI,MAAM,KAAK,QAAQ,mBAAmB;CAC1C,SAAS;EACR,MAAM,UAAU,KAAK,KAAK,KAAK,cAAc;EAC7C,IAAI,GAAG,WAAW,OAAO,GAAG;GAC3B,MAAM,MAAM,KAAK,MAAM,GAAG,aAAa,SAAS,MAAM,CAAC;GACvD,IAAI,oBAAoB,GAAG,KAAK,IAAI,YAAY,iBAAiB,oBAAoB,IAAI,UAAU,GAAG;IACrG,MAAM,QAAQ,IAAI,UAAU,CAAC;IAC7B,MAAM,SAAS,oBAAoB,KAAK;IACxC,IAAI,WAAW,KAAK,GAAG,MAAM,IAAI,MAAM,qBAAqB,IAAI,6FAA6F;IAC7J,MAAM,MAAM,MAAM,OAAO,cAAc,KAAK,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC;IAC/D,IAAI,+BAA+B,GAAG,GAAG,OAAO;IAChD,MAAM,IAAI,MAAM,iDAAiD,IAAI,uBAAuB;GAC7F;EACD;EACA,MAAM,SAAS,KAAK,QAAQ,GAAG;EAC/B,IAAI,WAAW,KAAK,MAAM,IAAI,MAAM,sDAAsD,oBAAoB,GAAG;EACjH,MAAM;CACP;AACD;AACA,SAAS,oBAAoB,OAAO;CACnC,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,CAAC,oBAAoB,KAAK,GAAG,OAAO,KAAK;CAC7C,MAAM,SAAS,MAAM,aAAa,MAAM,cAAc,MAAM;CAC5D,IAAI,OAAO,WAAW,UAAU,OAAO;CACvC,IAAI,oBAAoB,MAAM,GAAG;EAChC,MAAM,MAAM,OAAO;EACnB,IAAI,OAAO,QAAQ,UAAU,OAAO;CACrC;AACD;AACA,SAAS,UAAU,MAAM;CACxB,IAAI;CACJ,IAAI;CACJ,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,IAAI,KAAK,OAAO,UAAU,OAAO,OAAO,KAAK,IAAI,EAAE;MACpF,IAAI,KAAK,OAAO,eAAe,WAAW,KAAK,IAAI;CACxD,IAAI,SAAS,KAAK,KAAK,OAAO,MAAM,IAAI,GAAG,MAAM,IAAI,MAAM,uCAAuC;CAClG,IAAI,aAAa,KAAK,GAAG,MAAM,IAAI,MAAM,8CAA8C;CACvF,OAAO;EACN;EACA;CACD;AACD;AACA,SAAS,SAAS,KAAK;CACtB,OAAO,IAAI,SAAS,SAAS,WAAW;EACvC,MAAM,SAAS,CAAC;EAChB,IAAI,GAAG,SAAS,UAAU,OAAO,KAAK,KAAK,CAAC;EAC5C,IAAI,GAAG,aAAa,QAAQ,OAAO,OAAO,MAAM,CAAC,CAAC;EAClD,IAAI,GAAG,SAAS,MAAM;CACvB,CAAC;AACF;AACA,SAAS,OAAO;CACf,MAAM,EAAE,MAAM,aAAa,UAAU,QAAQ,KAAK,MAAM,CAAC,CAAC;CAC1D,MAAM,aAAa,eAAe;CAClC,MAAM,eAAe,KAAK,KAAK,UAAU,WAAW;CACpD,MAAM,YAAY,IAAI,UAAU,cAAc,eAAe;CAC7D,IAAI,QAAQ,CAAC;CACb,MAAM,2BAA2B,IAAI,IAAI;;;;;;;;;;;;CAYzC,IAAI,aAAa,QAAQ,QAAQ;CACjC,SAAS,eAAe,KAAK;EAC5B,MAAM,OAAO,WAAW,KAAK,KAAK,GAAG;EACrC,aAAa,KAAK,WAAW,KAAK,SAAS,KAAK,CAAC;EACjD,OAAO;CACR;CACA,SAAS,kBAAkB;EAC1B,UAAU,MAAM,KAAK;CACtB;CACA,SAAS,eAAe,KAAK;EAC5B,IAAI,SAAS,MAAM;EACnB,IAAI,CAAC,QAAQ;GACZ,SAAS,EAAE,WAAW,CAAC,EAAE;GACzB,MAAM,OAAO;EACd;EACA,OAAO;CACR;CACA,SAAS,oBAAoB;EAC5B,MAAM,wBAAwB,IAAI,IAAI;EACtC,KAAK,MAAM,UAAU,OAAO,OAAO,KAAK,GAAG,KAAK,MAAM,MAAM,OAAO,OAAO,OAAO,SAAS,GAAG,MAAM,IAAI,GAAG,YAAY;EACtH,OAAO;CACR;CACA,eAAe,2BAA2B,KAAK,8BAA8B,IAAI,IAAI,GAAG;EACvF,OAAOA,SAAQ;GACd,MAAM,YAAY,KAAK,iBAAiB;GACxC,SAAS,CAAC,GAAG,kBAAkB,GAAG,GAAG,WAAW;EACjD,CAAC;CACF;CACA,MAAM,kCAAkC,IAAI,IAAI;;CAEhD,SAAS,eAAe,KAAK,IAAI,qBAAqB;EACrD,MAAM,eAAe,gBAAgB,KAAK,EAAE;EAC5C,MAAM,WAAW,gBAAgB,IAAI,YAAY;EACjD,IAAI,UAAU,OAAO;EACrB,MAAM,MAAM,yBAAyB,KAAK,IAAI,qBAAqB,YAAY,CAAC,CAAC,cAAc;GAC9F,gBAAgB,OAAO,YAAY;EACpC,CAAC;EACD,gBAAgB,IAAI,cAAc,GAAG;EACrC,OAAO;CACR;CACA,eAAe,yBAAyB,KAAK,IAAI,qBAAqB,cAAc;EACnF,MAAM,SAAS,eAAe,GAAG;EACjC,MAAM,iBAAiB,OAAO,UAAU;EACxC,MAAM,gBAAgB,SAAS,IAAI,YAAY;EAC/C,IAAI,kBAAkB,eAAe,OAAO,EAAE,KAAK,eAAe,IAAI;EACtE,MAAM,YAAY,MAAM,gBAAgB,mBAAmB;EAC3D,MAAM,gBAAgB,MAAM,6BAA6B,mBAAmB;EAC5E,MAAM,WAAW,MAAM,eAAe,eAAe,YAAY;EACjE,IAAI,SAAS,QAAQ,SAAS,QAAQ,KAAK,KAAK,WAAW,SAAS,GAAG,GAClE;OAAA,SAAS,QAAQ,KAAK,GAAG;IAC5B,OAAO,UAAU,MAAM;KACtB;KACA;KACA,cAAc,SAAS,gBAAgB,eAAe,SAAS,GAAG,KAAK;KACvE,KAAK,SAAS;IACf;IACA,gBAAgB;IAChB,OAAO,EAAE,KAAK,SAAS,IAAI;GAC5B;SACM,IAAI,SAAS,MAAM,MAAM,cAAc,WAAW,YAAY,CAAC,CAAC,YAAY,KAAK,CAAC;EACzF,MAAM,oBAAoB,mBAAmB,KAAK;EAClD,IAAI,SAAS,gBAAgB,gBAAgB,MAAM,2BAA2B,iBAAiB;EAC/F,MAAM,6BAA6B,IAAI,IAAI;EAC3C,IAAI,wBAAwB;EAC5B,KAAK,IAAI,UAAU,IAAI,WAAW,IAAI;GACrC,MAAM,SAAS,MAAM,qBAAqB,UAAU,qBAAqB;IACxE,MAAM;IACN,cAAc;IACd,iBAAiB;GAClB,CAAC,CAAC;GACF,MAAM,MAAM,OAAO,SAAS;GAC5B,SAAS,IAAI,cAAc,MAAM;GACjC,OAAO,UAAU,MAAM;IACtB;IACA;IACA,cAAc;IACd;GACD;GACA,gBAAgB;GAChB,OAAO,EAAE,IAAI;EACd,SAAS,KAAK;GACb,IAAI,mBAAmB,GAAG,KAAK,wBAAwB,6BAA6B;IACnF,yBAAyB;IACzB,KAAK,IAAI,OAAO,GAAG,QAAQ,uBAAuB,QAAQ,GAAG;KAC5D,MAAM,MAAM,MAAM,eAAe,eAAe,YAAY;KAC5D,IAAI,IAAI,QAAQ,IAAI,QAAQ,KAAK,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,QAAQ,KAAK,GAAG;MAChF,OAAO,UAAU,MAAM;OACtB;OACA;OACA,cAAc,IAAI,gBAAgB,eAAe,IAAI,GAAG,KAAK;OAC7D,KAAK,IAAI;MACV;MACA,gBAAgB;MAChB,OAAO,EAAE,KAAK,IAAI,IAAI;KACvB;KACA,IAAI,IAAI,SAAS,IAAI,QAAQ,KAAK,KAAK,CAAC,WAAW,IAAI,GAAG,IAAI;MAC7D,MAAM,cAAc,WAAW,YAAY,CAAC,CAAC,YAAY,KAAK,CAAC;MAC/D;KACD;KACA,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,uBAAuB,CAAC;IAC5E;IACA;GACD;GACA,MAAM,eAAe,eAAe,KAAK,CAAC,MAAM,CAAC;GACjD,IAAI,EAAE,iBAAiB,KAAK,KAAK,UAAU,8BAA8B,iBAAiB,UAAU,qBAAqB;IACxH,MAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;IAC9D,MAAM,IAAI,MAAM,+CAA+C,aAAa,YAAY,OAAO,MAAM,EAAE,IAAI,gBAAgB,UAAU,MAAM,CAAC,GAAG;GAChJ;GACA,WAAW,IAAI,YAAY;GAC3B,IAAI,iBAAiB,QAAQ,SAAS,MAAM,2BAA2B,SAAS,GAAG,UAAU;EAC9F;CACD;CACA,eAAe,UAAU,KAAK,yBAAyB;EACtD,MAAM,SAAS,MAAM;EACrB,IAAI,CAAC,QAAQ;EACb,MAAM,UAAU,OAAO,OAAO,OAAO,SAAS;EAC9C,KAAK,MAAM,MAAM,SAAS;GACzB,MAAM,SAAS,SAAS,IAAI,GAAG,YAAY;GAC3C,IAAI,QAAQ;IACX,MAAM,OAAO,MAAM,CAAC,CAAC,YAAY,KAAK,CAAC;IACvC,SAAS,OAAO,GAAG,YAAY;GAChC;EACD;EACA,IAAI,QAAQ,SAAS,KAAK,yBAAyB;GAClD,MAAM,gBAAgB,MAAM,6BAA6B,uBAAuB;GAChF,KAAK,MAAM,MAAM,SAAS;IACzB,IAAI,CAAC,SAAS,IAAI,GAAG,YAAY,GAC3B;UAAA,MAAM,eAAe,eAAe,GAAG,YAAY,EAAA,CAAG,QAAQ,QAAQ,KAAK,MAAM,cAAc,WAAW,GAAG,YAAY,CAAC,CAAC,YAAY,KAAK,CAAC;IAAA;IAEnJ,IAAI,CAAC,MAAM,kBAAkB,eAAe,GAAG,YAAY,GAAG;KAC7D,QAAQ,MAAM,0BAA0B,GAAG,aAAa,0GAA0G;KAClK;IACD;IACA,MAAM,cAAc,aAAa,GAAG,YAAY;GACjD;EACD;EACA,OAAO,MAAM;EACb,gBAAgB;CACjB;CACA,SAAS,KAAK,KAAK,QAAQ,MAAM;EAChC,IAAI,UAAU,QAAQ,EAAE,gBAAgB,mBAAmB,CAAC;EAC5D,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC;CAC7B;CACA,SAAS,KAAK,KAAK,QAAQ,MAAM;EAChC,IAAI,UAAU,QAAQ,EAAE,gBAAgB,4BAA4B,CAAC;EACrE,IAAI,IAAI,IAAI;CACb;CACA,SAAS,WAAW,KAAK,SAAS;EACjC,KAAK,KAAK,KAAK,yBAAyB,QAAQ,kEAAkE;CACnH;CACA,SAAS,aAAa,IAAI;EACzB,OAAO;GACN,IAAI,GAAG;GACP,KAAK,GAAG;GACR,cAAc,GAAG;GACjB,cAAc,GAAG;EAClB;CACD;;CAEA,MAAM,4CAA4C,IAAI,IAAI;CAC1D,SAAS,6BAA6B,KAAK;EAC1C,OAAO,0BAA0B,IAAI,GAAG;CACzC;CACA,eAAe,cAAc,KAAK,KAAK;EACtC,MAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,oBAAoB,OAAO,IAAI,GAAG;EACtE,MAAM,SAAS,IAAI,UAAU;EAC7B,MAAM,WAAW,IAAI,SAAS,MAAM,GAAG,CAAC,CAAC,QAAQ,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,mBAAmB,CAAC,CAAC;EACrG,IAAI,WAAW,SAAS,SAAS,WAAW,KAAK,SAAS,OAAO,UAAU,OAAO,KAAK,KAAK,KAAK,EAAE,SAAS,WAAW,CAAC;EACxH,IAAI,SAAS,OAAO,UAAU,SAAS,UAAU,GAAG;GACnD,MAAM,MAAM,SAAS;GACrB,IAAI,QAAQ,KAAK,KAAK,CAAC,eAAe,GAAG,GAAG,OAAO,WAAW,KAAK,OAAO,EAAE;GAC5E,IAAI,WAAW,SAAS,SAAS,WAAW,KAAK,SAAS,OAAO,aAAa;IAC7E,MAAM,KAAK,SAAS;IACpB,IAAI,OAAO,KAAK,KAAK,CAAC,eAAe,EAAE,GAAG,OAAO,WAAW,KAAK,MAAM,EAAE;IACzE,MAAM,MAAM,MAAM,SAAS,GAAG;IAC9B,IAAI;IACJ,IAAI;KACH,SAAS,KAAK,MAAM,IAAI,SAAS,MAAM,CAAC;IACzC,QAAQ;KACP,OAAO,KAAK,KAAK,KAAK,qBAAqB;IAC5C;IACA,IAAI,CAAC,eAAe,MAAM,GAAG,OAAO,KAAK,KAAK,KAAK,uEAAuE;IAC1H,0BAA0B,IAAI,KAAK,OAAO,mBAAmB;IAC7D,OAAO,KAAK,KAAK,KAAK,MAAM,eAAe,KAAK,IAAI,OAAO,mBAAmB,CAAC;GAChF;GACA,IAAI,WAAW,SAAS,SAAS,WAAW,KAAK,SAAS,OAAO,aAAa;IAC7E,MAAM,SAAS,MAAM;IACrB,OAAO,KAAK,KAAK,KAAK,SAAS,OAAO,OAAO,OAAO,SAAS,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC,CAAC;GACtF;GACA,IAAI,WAAW,YAAY,SAAS,WAAW,GAAG;IACjD,MAAM,UAAU,KAAK,6BAA6B,GAAG,CAAC;IACtD,IAAI,UAAU,GAAG;IACjB,IAAI,IAAI;IACR;GACD;EACD;EACA,IAAI,UAAU,GAAG;EACjB,IAAI,IAAI;CACT;CACA,MAAM,SAAS,KAAK,cAAc,KAAK,QAAQ;EAC9C,cAAc,KAAK,GAAG,CAAC,CAAC,OAAO,QAAQ;GACtC,IAAI,CAAC,IAAI,aAAa,IAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC;GACzE,IAAI,IAAI,eAAe,QAAQ,gBAAgB,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC;EAC1E,CAAC;CACF,CAAC;CACD,eAAe,WAAW;EACzB,KAAK,MAAM,UAAU,SAAS,OAAO,GAAG,MAAM,OAAO,MAAM,CAAC,CAAC,YAAY,KAAK,CAAC;EAC/E,MAAM,UAAU,MAAM;EACtB,OAAO,MAAM;EACb,QAAQ,KAAK,CAAC;CACf;CACA,QAAQ,GAAG,iBAAiB,KAAK,SAAS,CAAC;CAC3C,QAAQ,GAAG,gBAAgB,KAAK,SAAS,CAAC;CAC1C,QAAQ,GAAG,uBAAuB,WAAW;EAC5C,QAAQ,MAAM,4DAA4D,kBAAkB,QAAQ,gBAAgB,OAAO,SAAS,OAAO,OAAO,IAAI,MAAM;CAC7J,CAAC;CACD,QAAQ,GAAG,sBAAsB,QAAQ;EACxC,QAAQ,MAAM,2DAA2D,eAAe,QAAQ,gBAAgB,IAAI,SAAS,IAAI,OAAO,IAAI,GAAG;CAChJ,CAAC;CACD,aAAa,cAAc,WAAW,CAAC,CAAC,MAAM,WAAW;EACxD,IAAI,QAAQ,QAAQ;EACpB,OAAO,OAAO,MAAM,mBAAmB;GACtC,QAAQ,IAAI,wDAAwD,OAAO,IAAI,GAAG;EACnF,CAAC;CACF,CAAC,CAAC,CAAC,OAAO,QAAQ;EACjB,QAAQ,MAAM,uCAAuC,GAAG;EACxD,QAAQ,KAAK,CAAC;CACf,CAAC;AACF;AACA,KAAK"}
|
|
1
|
+
{"version":3,"file":"postgres-main.mjs","names":["getPort"],"sources":["../../../1-prisma-cloud/0-lowering/dev-emulators/dist/instance-name-BF6J_weL.mjs","../../../1-prisma-cloud/0-lowering/dev-emulators/dist/postgres-main.mjs"],"sourcesContent":["//#region src/instance-name.ts\n/**\n* `pcdev-<app>-<database-id>` instance-name derivation (local-dev spec § 2\n* `postgres-main.ts`): each half lowercased, every char outside `[a-z0-9]`\n* replaced by `-`, runs collapsed, the combined name trimmed to 63 chars.\n*\n* A separate, side-effect-free module (not defined inline in\n* `postgres-main.ts`) so it can be imported directly by tests without also\n* running that file's own `main()` — `postgres-main.ts` is a daemon\n* entrypoint script, always invoked as a subprocess, and calls `main()`\n* unconditionally at module load.\n*/\n/**\n* Deliberately linear, no ambiguous quantifiers: a per-character replace\n* (no `+`, so no run-length backtracking surface), a bounded-quantifier\n* collapse (`{2,}`, not alternation-with-quantifiers), and plain\n* index-walking for the leading/trailing trim instead of a regex — a\n* combined `+`-plus-alternation trim (`/^-+|-+$/g`) is exactly the shape\n* CodeQL's polynomial-ReDoS check flags, whether or not this particular\n* instance is provably safe.\n*/\nfunction slug(segment) {\n\tconst collapsed = segment.toLowerCase().replace(/[^a-z0-9]/g, \"-\").replace(/-{2,}/g, \"-\");\n\tlet start = 0;\n\tlet end = collapsed.length;\n\twhile (start < end && collapsed[start] === \"-\") start++;\n\twhile (end > start && collapsed[end - 1] === \"-\") end--;\n\treturn collapsed.slice(start, end);\n}\nfunction instanceNameFor(app, id) {\n\treturn `pcdev-${slug(app)}-${slug(id)}`.slice(0, 63);\n}\n//#endregion\nexport { slug as n, instanceNameFor as t };\n\n//# sourceMappingURL=instance-name-BF6J_weL.mjs.map","import { c as readOwnVersion, f as StateFile, p as readJsonFile, s as isPidAlive, t as isValidSegment } from \"./segments-NpKN-46R.mjs\";\nimport { t as instanceNameFor } from \"./instance-name-BF6J_weL.mjs\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport getPort, { portNumbers } from \"get-port\";\nimport * as http from \"node:http\";\n//#region src/postgres-main.ts\n/**\n* The Postgres emulator daemon (local-dev spec § 2 `postgres-main.ts`): a\n* small local counterpart of hosted Postgres, hosting `@prisma/dev`'s\n* `startPrismaDevServer()` — one named, persistent server per `Database`\n* resource, several servers in this one daemon process. Loopback\n* `node:http` JSON admin API; state under its `--state-dir`.\n*\n* `@prisma/dev` is imported dynamically from a CALLER-RESOLVED path (each\n* admin request that needs it carries `prismaDevModulePath`) so the app\n* owns its own Prisma version — this daemon has no `@prisma/dev` dependency\n* of its own.\n*\n* Runs as its own OS process, started by `daemon.ts`'s `ensureDaemon` via\n* `process.execPath <this file> --port <n> --state-dir <dir>`.\n*/\nconst MIN_DATABASE_PORT = 51300;\nconst MAX_DATABASE_PORT = 65535;\nconst APPS_STATE_MODE = 384;\n/** Spec § 2 step 5's pattern, applied to a fresh database-port allocation. */\nconst MAX_FRESH_PORT_CANDIDATES = 5;\n/**\n* A name refused as \"already running\" is retried a few times, each attempt\n* first waiting out the holder: a cold server boot takes seconds, and a\n* crashed holder's lock is only released once proper-lockfile's ~10s stale\n* threshold passes. Bounded so a genuinely stuck name still fails visibly\n* inside the dev command's own startup budget.\n*/\nconst MAX_ALREADY_RUNNING_RETRIES = 2;\nconst ALREADY_RUNNING_POLLS = 24;\nconst ALREADY_RUNNING_POLL_MS = 500;\nconst NOT_INSTALLED_MESSAGE = \"local dev needs @prisma/dev for its local Postgres emulator — add \\\"prisma\\\" to your app's devDependencies.\";\nfunction maskCredentials(text) {\n\treturn text.replace(/:\\/\\/([^:@/\\s]+):[^@/\\s]+@/g, \"://$1:***@\");\n}\nfunction firstLine(text) {\n\treturn (text.split(\"\\n\")[0] ?? text).trim();\n}\nfunction isDatabaseRecord(value) {\n\treturn typeof value === \"object\" && value !== null && \"id\" in value && typeof value.id === \"string\" && \"instanceName\" in value && typeof value.instanceName === \"string\" && \"databasePort\" in value && typeof value.databasePort === \"number\" && \"url\" in value && typeof value.url === \"string\";\n}\nfunction isAppRecord(value) {\n\treturn typeof value === \"object\" && value !== null && \"databases\" in value && typeof value.databases === \"object\" && value.databases !== null && Object.values(value.databases).every(isDatabaseRecord);\n}\nfunction isAppsState(value) {\n\treturn typeof value === \"object\" && value !== null && Object.values(value).every(isAppRecord);\n}\nfunction isDatabaseBody(value) {\n\treturn typeof value === \"object\" && value !== null && \"prismaDevModulePath\" in value && typeof value.prismaDevModulePath === \"string\";\n}\nfunction isPrismaDevModule(value) {\n\treturn typeof value === \"object\" && value !== null && \"startPrismaDevServer\" in value && typeof value.startPrismaDevServer === \"function\";\n}\n/**\n* `@prisma/dev` exports a `PortNotAvailableError` class with a `readonly\n* port: number`, but the daemon dynamically imports the module from a\n* caller-given path while the class identity checked here would come from\n* whatever module graph THIS file's own bundle produced — two separate\n* instantiations of the same logical class, so `instanceof` doesn't match\n* across them (confirmed empirically: a real port conflict's `err\n* instanceof mod.PortNotAvailableError` is `false` even though the error IS\n* the port-conflict one). Duck-typing the documented shape — a `port`\n* number matching the candidate we just tried — is what actually survives\n* that boundary.\n*/\n/**\n* The port a start refusal is about, when it is one of THIS attempt's ports.\n* Duck-typed (`instanceof` fails across the dynamic-import boundary): every\n* `@prisma/dev` port refusal — not-available, requested-twice, and\n* belongs-to-another-server (its registry can claim a port no bind probe\n* sees) — carries the offending port as `.port`, and any of the four ports\n* we requested (database + the three aux listeners) can be the one refused.\n*/\nfunction portConflictOf(err, ports) {\n\tif (typeof err !== \"object\" || err === null || !(\"port\" in err)) return void 0;\n\tconst port = err.port;\n\treturn typeof port === \"number\" && ports.includes(port) ? port : void 0;\n}\nfunction isNameAlreadyTaken(err) {\n\treturn isStringKeyedRecord(err) && (err[\"name\"] === \"ServerAlreadyRunningError\" || err[\"name\"] === \"ServerStateAlreadyExistsError\");\n}\n/** The port of a postgres connection URL, when it parses as one. */\nfunction databasePortOf(connectionString) {\n\ttry {\n\t\tconst port = Number(new URL(connectionString).port);\n\t\treturn Number.isInteger(port) && port > 0 ? port : void 0;\n\t} catch {\n\t\treturn;\n\t}\n}\n/**\n* A dynamic `import()` failure's own message routinely names a SECOND path\n* (e.g. bun's \"Cannot find module '<target>' from '<importer>'\") — the\n* importer half is this daemon's own internal location, not anything the\n* caller gave us, and has no business in a response body. Rather than try\n* to scrub an arbitrary underlying message for every runtime's own error\n* phrasing, the resolution-failure case names only what the caller\n* supplied — the pinned message plus the given `prismaDevModulePath`, and\n* nothing else. (A DIFFERENT case — a module that resolves fine but whose\n* `startPrismaDevServer()` call itself fails — still surfaces its\n* underlying text verbatim, credential-masked, per spec § 2.)\n*/\nasync function importPrismaDev(prismaDevModulePath) {\n\tlet mod;\n\ttry {\n\t\tmod = await import(pathToFileURL(prismaDevModulePath).href);\n\t} catch {\n\t\tthrow new Error(`${NOT_INSTALLED_MESSAGE} (could not resolve \"${prismaDevModulePath}\")`);\n\t}\n\tif (!isPrismaDevModule(mod)) throw new Error(`${NOT_INSTALLED_MESSAGE} (\"${prismaDevModulePath}\" is not a @prisma/dev module)`);\n\treturn mod;\n}\nfunction isStringKeyedRecord(value) {\n\treturn typeof value === \"object\" && value !== null;\n}\nfunction isPrismaDevInternalStateModule(value) {\n\treturn isStringKeyedRecord(value) && typeof value[\"deleteServer\"] === \"function\" && typeof value[\"killServer\"] === \"function\" && typeof value[\"getServerStatus\"] === \"function\";\n}\n/**\n* Every port any `@prisma/dev` server RECORD on this machine claims —\n* database, http, shadow, and streams. `startPrismaDevServer` validates a\n* requested port against these records (`ServerState.scan`) and refuses one\n* that any record claims, even when nothing has it bound — and a record's\n* aux ports are picked by `@prisma/dev`'s own walking-upward picker, which\n* over enough servers climbs into this daemon's database range. A fresh\n* database-port pick that only probed the OS would collide with such a\n* claim, so fresh picks exclude these too. Best-effort: `scan` is the same\n* internal surface the rest of this module already binds to, but absent or\n* failing it degrades to the OS probe alone.\n*/\nasync function registryClaimedPorts(internalState) {\n\tconst ports = /* @__PURE__ */ new Set();\n\tconst scanHost = isStringKeyedRecord(internalState) ? internalState[\"ServerState\"] : void 0;\n\tconst scan = isStringKeyedRecord(scanHost) ? scanHost[\"scan\"] : void 0;\n\tif (!isStringKeyedRecord(scanHost) || typeof scan !== \"function\") return ports;\n\ttry {\n\t\tconst records = await scan.call(scanHost, { onlyMetadata: true });\n\t\tif (!Array.isArray(records)) return ports;\n\t\tfor (const record of records) {\n\t\t\tif (!isStringKeyedRecord(record)) continue;\n\t\t\tfor (const key of [\n\t\t\t\t\"databasePort\",\n\t\t\t\t\"port\",\n\t\t\t\t\"shadowDatabasePort\",\n\t\t\t\t\"streamsPort\"\n\t\t\t]) {\n\t\t\t\tconst port = record[key];\n\t\t\t\tif (typeof port === \"number\" && Number.isInteger(port) && port > 0) ports.add(port);\n\t\t\t}\n\t\t\tconst experimental = record[\"experimental\"];\n\t\t\tconst streams = isStringKeyedRecord(experimental) ? experimental[\"streams\"] : void 0;\n\t\t\tconst streamsUrl = isStringKeyedRecord(streams) ? streams[\"serverUrl\"] : void 0;\n\t\t\tif (typeof streamsUrl === \"string\") {\n\t\t\t\tconst port = databasePortOf(streamsUrl);\n\t\t\t\tif (port !== void 0) ports.add(port);\n\t\t\t}\n\t\t}\n\t} catch {}\n\treturn ports;\n}\nfunction readServerStatus(status) {\n\tif (!isStringKeyedRecord(status)) return {\n\t\tlive: false,\n\t\trecordExists: true,\n\t\tpid: void 0,\n\t\turl: void 0,\n\t\tdatabasePort: void 0\n\t};\n\tconst exports = status[\"exports\"];\n\tconst database = isStringKeyedRecord(exports) ? exports[\"database\"] : void 0;\n\tconst url = isStringKeyedRecord(database) ? database[\"connectionString\"] : void 0;\n\tconst pid = status[\"pid\"];\n\tconst databasePort = status[\"databasePort\"];\n\treturn {\n\t\tlive: status[\"status\"] === \"running\" || status[\"status\"] === \"starting_up\",\n\t\trecordExists: status[\"status\"] !== \"no_such_server\",\n\t\tpid: typeof pid === \"number\" ? pid : void 0,\n\t\turl: typeof url === \"string\" ? url : void 0,\n\t\tdatabasePort: typeof databasePort === \"number\" ? databasePort : void 0\n\t};\n}\nasync function serverStatusOf(internalState, instanceName) {\n\ttry {\n\t\treturn readServerStatus(await internalState.getServerStatus(instanceName));\n\t} catch {\n\t\treturn {\n\t\t\tlive: false,\n\t\t\trecordExists: true,\n\t\t\tpid: void 0,\n\t\t\turl: void 0,\n\t\t\tdatabasePort: void 0\n\t\t};\n\t}\n}\nconst CLOSE_SETTLE_ATTEMPTS = 40;\nconst CLOSE_SETTLE_DELAY_MS = 250;\n/** True once the named server's persisted state no longer claims it is live — the precondition for `deleteServer`, whose kill path targets the pid in that state, which for an in-daemon server is THIS DAEMON's own pid. */\nasync function settledAfterClose(internalState, instanceName) {\n\tfor (let attempt = 1; attempt <= CLOSE_SETTLE_ATTEMPTS; attempt += 1) {\n\t\tif (!(await serverStatusOf(internalState, instanceName)).live) return true;\n\t\tif (attempt < CLOSE_SETTLE_ATTEMPTS) await new Promise((resolve) => setTimeout(resolve, CLOSE_SETTLE_DELAY_MS));\n\t}\n\treturn false;\n}\n/**\n* `@prisma/dev`'s own package.json declares `./internal/state`, whose\n* `deleteServer(name)` actually removes a stateful server's persisted PGlite\n* data — `startPrismaDevServer`'s public surface only starts/closes a live\n* server, never deletes what a closed one left on disk. Resolved by reading\n* the SAME package's own `exports` map (walked up from the caller-given\n* entry path to find `@prisma/dev`'s `package.json`), never by guessing at\n* `dist/` file layout.\n*/\nasync function importPrismaDevInternalState(prismaDevModulePath) {\n\tlet dir = path.dirname(prismaDevModulePath);\n\tfor (;;) {\n\t\tconst pkgPath = path.join(dir, \"package.json\");\n\t\tif (fs.existsSync(pkgPath)) {\n\t\t\tconst pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\"));\n\t\t\tif (isStringKeyedRecord(pkg) && pkg[\"name\"] === \"@prisma/dev\" && isStringKeyedRecord(pkg[\"exports\"])) {\n\t\t\t\tconst entry = pkg[\"exports\"][\"./internal/state\"];\n\t\t\t\tconst target = resolveExportTarget(entry);\n\t\t\t\tif (target === void 0) throw new Error(`\"@prisma/dev\" at \"${dir}\" does not declare an \"./internal/state\" export — cannot delete its persisted database data.`);\n\t\t\t\tconst mod = await import(pathToFileURL(path.join(dir, target)).href);\n\t\t\t\tif (isPrismaDevInternalStateModule(mod)) return mod;\n\t\t\t\tthrow new Error(`\"@prisma/dev\"'s \"./internal/state\" export at \"${dir}\" has no deleteServer.`);\n\t\t\t}\n\t\t}\n\t\tconst parent = path.dirname(dir);\n\t\tif (parent === dir) throw new Error(`could not find \"@prisma/dev\"'s package.json above \"${prismaDevModulePath}\".`);\n\t\tdir = parent;\n\t}\n}\nfunction resolveExportTarget(entry) {\n\tif (typeof entry === \"string\") return entry;\n\tif (!isStringKeyedRecord(entry)) return void 0;\n\tconst nested = entry[\"import\"] ?? entry[\"require\"] ?? entry[\"default\"];\n\tif (typeof nested === \"string\") return nested;\n\tif (isStringKeyedRecord(nested)) {\n\t\tconst def = nested[\"default\"];\n\t\tif (typeof def === \"string\") return def;\n\t}\n}\nfunction parseArgs(argv) {\n\tlet port;\n\tlet stateDir;\n\tfor (let i = 0; i < argv.length; i++) if (argv[i] === \"--port\") port = Number(argv[i + 1]);\n\telse if (argv[i] === \"--state-dir\") stateDir = argv[i + 1];\n\tif (port === void 0 || Number.isNaN(port)) throw new Error(\"postgres-main: --port <n> is required\");\n\tif (stateDir === void 0) throw new Error(\"postgres-main: --state-dir <dir> is required\");\n\treturn {\n\t\tport,\n\t\tstateDir\n\t};\n}\nfunction readBody(req) {\n\treturn new Promise((resolve, reject) => {\n\t\tconst chunks = [];\n\t\treq.on(\"data\", (chunk) => chunks.push(chunk));\n\t\treq.on(\"end\", () => resolve(Buffer.concat(chunks)));\n\t\treq.on(\"error\", reject);\n\t});\n}\nfunction main() {\n\tconst { port, stateDir } = parseArgs(process.argv.slice(2));\n\tconst ownVersion = readOwnVersion();\n\tconst appsJsonPath = path.join(stateDir, \"apps.json\");\n\tconst stateFile = new StateFile(appsJsonPath, APPS_STATE_MODE);\n\tlet state = {};\n\tconst runtimes = /* @__PURE__ */ new Map();\n\t/**\n\t* Server starts run ONE AT A TIME. `@prisma/dev`'s start is not\n\t* concurrency-safe within a process: two simultaneous calls pick their\n\t* ports without seeing each other and one fails with a port refusal\n\t* (verified directly — two concurrent starts with distinct, pinned\n\t* database ports fail; the same two started in sequence both succeed).\n\t* The daemon issues concurrent starts whenever an app converges more than\n\t* one database, which is what produced the port refusals, the retries\n\t* whose half-started servers held their own name's lock, and every\n\t* \"already running\" failure downstream of that.\n\t*/\n\tlet startQueue = Promise.resolve();\n\tfunction serializeStart(run) {\n\t\tconst next = startQueue.then(run, run);\n\t\tstartQueue = next.then(() => void 0, () => void 0);\n\t\treturn next;\n\t}\n\tfunction schedulePersist() {\n\t\tstateFile.write(state);\n\t}\n\tfunction getOrCreateApp(app) {\n\t\tlet appRec = state[app];\n\t\tif (!appRec) {\n\t\t\tappRec = { databases: {} };\n\t\t\tstate[app] = appRec;\n\t\t}\n\t\treturn appRec;\n\t}\n\tfunction usedDatabasePorts() {\n\t\tconst ports = /* @__PURE__ */ new Set();\n\t\tfor (const appRec of Object.values(state)) for (const db of Object.values(appRec.databases)) ports.add(db.databasePort);\n\t\treturn ports;\n\t}\n\tasync function smallestUnusedDatabasePort(min, alsoExclude = /* @__PURE__ */ new Set()) {\n\t\treturn getPort({\n\t\t\tport: portNumbers(min, MAX_DATABASE_PORT),\n\t\t\texclude: [...usedDatabasePorts(), ...alsoExclude]\n\t\t});\n\t}\n\tconst inflightEnsures = /* @__PURE__ */ new Map();\n\t/**\n\t* Names whose `startPrismaDevServer` call failed in THIS process for any\n\t* reason other than \"already running\". `@prisma/dev` acquires the name's\n\t* lock before it validates the requested ports, and a failure after that\n\t* point (a port refusal) propagates WITHOUT releasing the lock — so the\n\t* very next start of the same name in this process is refused as \"already\n\t* running\" by a holder that is this daemon's own dead attempt, and no\n\t* amount of waiting frees it. Membership here is what makes deleting that\n\t* lock provably safe: a name this process leaked cannot have been\n\t* acquired by anyone else since (the leak never releases).\n\t*/\n\tconst leakedStartNames = /* @__PURE__ */ new Set();\n\t/** Concurrent PUTs for the same database coalesce onto one start — a second `startPrismaDevServer` for a name whose first start is still booting fails as \"already running\". */\n\tfunction ensureDatabase(app, id, prismaDevModulePath) {\n\t\tconst instanceName = instanceNameFor(app, id);\n\t\tconst inflight = inflightEnsures.get(instanceName);\n\t\tif (inflight) return inflight;\n\t\tconst run = ensureDatabaseSerialized(app, id, prismaDevModulePath, instanceName).finally(() => {\n\t\t\tinflightEnsures.delete(instanceName);\n\t\t});\n\t\tinflightEnsures.set(instanceName, run);\n\t\treturn run;\n\t}\n\tasync function ensureDatabaseSerialized(app, id, prismaDevModulePath, instanceName) {\n\t\tconst appRec = getOrCreateApp(app);\n\t\tconst existingRecord = appRec.databases[id];\n\t\tconst runningServer = runtimes.get(instanceName);\n\t\tif (existingRecord && runningServer) return { url: existingRecord.url };\n\t\tconst prismaDev = await importPrismaDev(prismaDevModulePath);\n\t\tconst internalState = await importPrismaDevInternalState(prismaDevModulePath);\n\t\tconst recorded = await serverStatusOf(internalState, instanceName);\n\t\tif (recorded.live && recorded.pid !== void 0 && isPidAlive(recorded.pid)) {\n\t\t\tif (recorded.url !== void 0) {\n\t\t\t\tappRec.databases[id] = {\n\t\t\t\t\tid,\n\t\t\t\t\tinstanceName,\n\t\t\t\t\tdatabasePort: recorded.databasePort ?? databasePortOf(recorded.url) ?? MIN_DATABASE_PORT,\n\t\t\t\t\turl: recorded.url\n\t\t\t\t};\n\t\t\t\tschedulePersist();\n\t\t\t\treturn { url: recorded.url };\n\t\t\t}\n\t\t} else if (recorded.live) await internalState.killServer(instanceName).catch(() => void 0);\n\t\tconst isFreshAllocation = existingRecord === void 0;\n\t\tconst registryPorts = isFreshAllocation ? await registryClaimedPorts(internalState) : /* @__PURE__ */ new Set();\n\t\tlet dbPort = existingRecord?.databasePort ?? await smallestUnusedDatabasePort(MIN_DATABASE_PORT, registryPorts);\n\t\tconst conflicted = /* @__PURE__ */ new Set();\n\t\tlet alreadyRunningRetries = 0;\n\t\tfor (let attempt = 1;; attempt++) try {\n\t\t\tconst server = await serializeStart(() => prismaDev.startPrismaDevServer({\n\t\t\t\tname: instanceName,\n\t\t\t\tdatabasePort: dbPort,\n\t\t\t\tpersistenceMode: \"stateful\"\n\t\t\t}));\n\t\t\tconst url = server.database.connectionString;\n\t\t\tleakedStartNames.delete(instanceName);\n\t\t\truntimes.set(instanceName, server);\n\t\t\tappRec.databases[id] = {\n\t\t\t\tid,\n\t\t\t\tinstanceName,\n\t\t\t\tdatabasePort: dbPort,\n\t\t\t\turl\n\t\t\t};\n\t\t\tschedulePersist();\n\t\t\treturn { url };\n\t\t} catch (err) {\n\t\t\tif (isNameAlreadyTaken(err) && alreadyRunningRetries < MAX_ALREADY_RUNNING_RETRIES) {\n\t\t\t\talreadyRunningRetries += 1;\n\t\t\t\tif (leakedStartNames.has(instanceName)) {\n\t\t\t\t\tif (!(await serverStatusOf(internalState, instanceName)).recordExists) {\n\t\t\t\t\t\tawait internalState.deleteServer(instanceName).catch(() => void 0);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (let poll = 1; poll <= ALREADY_RUNNING_POLLS; poll += 1) {\n\t\t\t\t\tconst now = await serverStatusOf(internalState, instanceName);\n\t\t\t\t\tif (now.live && now.pid !== void 0 && isPidAlive(now.pid) && now.url !== void 0) {\n\t\t\t\t\t\tappRec.databases[id] = {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tinstanceName,\n\t\t\t\t\t\t\tdatabasePort: now.databasePort ?? databasePortOf(now.url) ?? dbPort,\n\t\t\t\t\t\t\turl: now.url\n\t\t\t\t\t\t};\n\t\t\t\t\t\tschedulePersist();\n\t\t\t\t\t\treturn { url: now.url };\n\t\t\t\t\t}\n\t\t\t\t\tif (now.live && (now.pid === void 0 || !isPidAlive(now.pid))) {\n\t\t\t\t\t\tawait internalState.killServer(instanceName).catch(() => void 0);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, ALREADY_RUNNING_POLL_MS));\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!isNameAlreadyTaken(err)) leakedStartNames.add(instanceName);\n\t\t\tconst conflictPort = portConflictOf(err, [dbPort]);\n\t\t\tif (!(conflictPort !== void 0 && attempt < MAX_FRESH_PORT_CANDIDATES && (conflictPort !== dbPort || isFreshAllocation))) {\n\t\t\t\tconst reason = err instanceof Error ? err.message : String(err);\n\t\t\t\tthrow new Error(`postgres emulator failed to start database \"${instanceName}\" on port ${String(dbPort)}: ${maskCredentials(firstLine(reason))}`);\n\t\t\t}\n\t\t\tconflicted.add(conflictPort);\n\t\t\tif (conflictPort === dbPort) dbPort = await smallestUnusedDatabasePort(dbPort + 1, /* @__PURE__ */ new Set([...conflicted, ...registryPorts]));\n\t\t}\n\t}\n\tasync function deleteApp(app, prismaDevModulePathHint) {\n\t\tconst appRec = state[app];\n\t\tif (!appRec) return;\n\t\tconst entries = Object.values(appRec.databases);\n\t\tfor (const db of entries) {\n\t\t\tconst server = runtimes.get(db.instanceName);\n\t\t\tif (server) {\n\t\t\t\tawait server.close().catch(() => void 0);\n\t\t\t\truntimes.delete(db.instanceName);\n\t\t\t}\n\t\t}\n\t\tif (entries.length > 0 && prismaDevModulePathHint) {\n\t\t\tconst internalState = await importPrismaDevInternalState(prismaDevModulePathHint);\n\t\t\tfor (const db of entries) {\n\t\t\t\tif (!runtimes.has(db.instanceName)) {\n\t\t\t\t\tif ((await serverStatusOf(internalState, db.instanceName)).pid !== process.pid) await internalState.killServer(db.instanceName).catch(() => void 0);\n\t\t\t\t}\n\t\t\t\tif (!await settledAfterClose(internalState, db.instanceName)) {\n\t\t\t\t\tconsole.error(`postgres-main: server \"${db.instanceName}\" still reports running after close — leaving its persisted data in place instead of risking a self-kill.`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tawait internalState.deleteServer(db.instanceName);\n\t\t\t}\n\t\t}\n\t\tdelete state[app];\n\t\tschedulePersist();\n\t}\n\tfunction json(res, status, body) {\n\t\tres.writeHead(status, { \"content-type\": \"application/json\" });\n\t\tres.end(JSON.stringify(body));\n\t}\n\tfunction text(res, status, body) {\n\t\tres.writeHead(status, { \"content-type\": \"text/plain; charset=utf-8\" });\n\t\tres.end(body);\n\t}\n\tfunction badSegment(res, segment) {\n\t\ttext(res, 400, `invalid path segment \"${segment}\": must match /^[a-z0-9][a-z0-9-]*$/ and be at most 63 characters`);\n\t}\n\tfunction databaseView(db) {\n\t\treturn {\n\t\t\tid: db.id,\n\t\t\turl: db.url,\n\t\t\tinstanceName: db.instanceName,\n\t\t\tdatabasePort: db.databasePort\n\t\t};\n\t}\n\t/** The most recently observed `prismaDevModulePath` for any database of `app` — DELETE has no body of its own to carry one. */\n\tconst recentPrismaDevModulePath = /* @__PURE__ */ new Map();\n\tfunction lastKnownPrismaDevModulePath(app) {\n\t\treturn recentPrismaDevModulePath.get(app);\n\t}\n\tasync function handleRequest(req, res) {\n\t\tconst url = new URL(req.url ?? \"/\", `http://127.0.0.1:${String(port)}`);\n\t\tconst method = req.method ?? \"GET\";\n\t\tconst segments = url.pathname.split(\"/\").filter((s) => s.length > 0).map((s) => decodeURIComponent(s));\n\t\tif (method === \"GET\" && segments.length === 1 && segments[0] === \"health\") return json(res, 200, { version: ownVersion });\n\t\tif (segments[0] === \"apps\" && segments.length >= 2) {\n\t\t\tconst app = segments[1];\n\t\t\tif (app === void 0 || !isValidSegment(app)) return badSegment(res, app ?? \"\");\n\t\t\tif (method === \"PUT\" && segments.length === 4 && segments[2] === \"databases\") {\n\t\t\t\tconst id = segments[3];\n\t\t\t\tif (id === void 0 || !isValidSegment(id)) return badSegment(res, id ?? \"\");\n\t\t\t\tconst raw = await readBody(req);\n\t\t\t\tlet parsed;\n\t\t\t\ttry {\n\t\t\t\t\tparsed = JSON.parse(raw.toString(\"utf8\"));\n\t\t\t\t} catch {\n\t\t\t\t\treturn text(res, 400, \"malformed JSON body\");\n\t\t\t\t}\n\t\t\t\tif (!isDatabaseBody(parsed)) return text(res, 400, \"malformed database body: expected { \\\"prismaDevModulePath\\\": string }\");\n\t\t\t\trecentPrismaDevModulePath.set(app, parsed.prismaDevModulePath);\n\t\t\t\treturn json(res, 200, await ensureDatabase(app, id, parsed.prismaDevModulePath));\n\t\t\t}\n\t\t\tif (method === \"GET\" && segments.length === 3 && segments[2] === \"databases\") {\n\t\t\t\tconst appRec = state[app];\n\t\t\t\treturn json(res, 200, appRec ? Object.values(appRec.databases).map(databaseView) : []);\n\t\t\t}\n\t\t\tif (method === \"DELETE\" && segments.length === 2) {\n\t\t\t\tawait deleteApp(app, lastKnownPrismaDevModulePath(app));\n\t\t\t\tres.writeHead(204);\n\t\t\t\tres.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tres.writeHead(404);\n\t\tres.end();\n\t}\n\tconst server = http.createServer((req, res) => {\n\t\thandleRequest(req, res).catch((err) => {\n\t\t\tif (!res.headersSent) res.writeHead(500, { \"content-type\": \"text/plain\" });\n\t\t\tres.end(err instanceof Error ? maskCredentials(err.message) : String(err));\n\t\t});\n\t});\n\tasync function shutdown() {\n\t\tfor (const server of runtimes.values()) await server.close().catch(() => void 0);\n\t\tawait stateFile.flush();\n\t\tserver.close();\n\t\tprocess.exit(0);\n\t}\n\tprocess.on(\"SIGTERM\", () => void shutdown());\n\tprocess.on(\"SIGINT\", () => void shutdown());\n\tprocess.on(\"unhandledRejection\", (reason) => {\n\t\tconsole.error(\"postgres-main: unhandled rejection from background work:\", reason instanceof Error ? maskCredentials(reason.stack ?? reason.message) : reason);\n\t});\n\tprocess.on(\"uncaughtException\", (err) => {\n\t\tconsole.error(\"postgres-main: uncaught exception from background work:\", err instanceof Error ? maskCredentials(err.stack ?? err.message) : err);\n\t});\n\treadJsonFile(appsJsonPath, isAppsState).then((loaded) => {\n\t\tif (loaded) state = loaded;\n\t\tserver.listen(port, \"127.0.0.1\", () => {\n\t\t\tconsole.log(`[dev-emulators] postgres-main listening on 127.0.0.1:${String(port)}`);\n\t\t});\n\t}).catch((err) => {\n\t\tconsole.error(\"postgres-main: failed to load state\", err);\n\t\tprocess.exit(1);\n\t});\n}\nmain();\n//#endregion\nexport {};\n\n//# sourceMappingURL=postgres-main.mjs.map"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma/composer-prisma-cloud",
|
|
3
|
-
"version": "0.2.0-dev.
|
|
3
|
+
"version": "0.2.0-dev.16",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "The Prisma Cloud target for Prisma Composer: compute(), postgres(), the target extension, and first-party modules realized on Prisma Cloud (cron).",
|
|
6
6
|
"exports": {
|
|
@@ -32,14 +32,14 @@
|
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@effect/platform-bun": "4.0.0-beta.97",
|
|
34
34
|
"@effect/platform-node": "4.0.0-beta.92",
|
|
35
|
-
"@internal/dev-emulators": "0.2.0-dev.
|
|
35
|
+
"@internal/dev-emulators": "0.2.0-dev.16",
|
|
36
36
|
"@prisma-next/cli": "0.16.0",
|
|
37
37
|
"@prisma-next/config-loader": "0.16.0",
|
|
38
38
|
"@prisma-next/contract": "0.16.0",
|
|
39
39
|
"@prisma-next/migration-tools": "0.16.0",
|
|
40
40
|
"@prisma-next/postgres": "0.16.0",
|
|
41
41
|
"@prisma-next/sql-contract": "0.16.0",
|
|
42
|
-
"@prisma/composer": "0.2.0-dev.
|
|
42
|
+
"@prisma/composer": "0.2.0-dev.16",
|
|
43
43
|
"@prisma/management-api-sdk": "^1.50.0",
|
|
44
44
|
"@standard-schema/spec": "^1.1.0",
|
|
45
45
|
"alchemy": "2.0.0-beta.59",
|
|
@@ -51,20 +51,20 @@
|
|
|
51
51
|
"tsdown": "^0.22.7"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@internal/core": "0.2.0-dev.
|
|
55
|
-
"@internal/cron": "0.2.0-dev.
|
|
56
|
-
"@internal/email": "0.2.0-dev.
|
|
57
|
-
"@internal/foundation": "0.2.0-dev.
|
|
58
|
-
"@internal/local-target": "0.2.0-dev.
|
|
59
|
-
"@internal/lowering": "0.2.0-dev.
|
|
60
|
-
"@internal/nextjs": "0.2.0-dev.
|
|
61
|
-
"@internal/node": "0.2.0-dev.
|
|
62
|
-
"@internal/prisma-cloud": "0.2.0-dev.
|
|
63
|
-
"@internal/s3-protocol": "0.2.0-dev.
|
|
64
|
-
"@internal/service-rpc": "0.2.0-dev.
|
|
65
|
-
"@internal/storage": "0.2.0-dev.
|
|
66
|
-
"@internal/streams": "0.2.0-dev.
|
|
67
|
-
"@internal/tsdown-config": "0.2.0-dev.
|
|
54
|
+
"@internal/core": "0.2.0-dev.16",
|
|
55
|
+
"@internal/cron": "0.2.0-dev.16",
|
|
56
|
+
"@internal/email": "0.2.0-dev.16",
|
|
57
|
+
"@internal/foundation": "0.2.0-dev.16",
|
|
58
|
+
"@internal/local-target": "0.2.0-dev.16",
|
|
59
|
+
"@internal/lowering": "0.2.0-dev.16",
|
|
60
|
+
"@internal/nextjs": "0.2.0-dev.16",
|
|
61
|
+
"@internal/node": "0.2.0-dev.16",
|
|
62
|
+
"@internal/prisma-cloud": "0.2.0-dev.16",
|
|
63
|
+
"@internal/s3-protocol": "0.2.0-dev.16",
|
|
64
|
+
"@internal/service-rpc": "0.2.0-dev.16",
|
|
65
|
+
"@internal/storage": "0.2.0-dev.16",
|
|
66
|
+
"@internal/streams": "0.2.0-dev.16",
|
|
67
|
+
"@internal/tsdown-config": "0.2.0-dev.16",
|
|
68
68
|
"@types/node": "^25.9.3",
|
|
69
69
|
"typescript": "^6.0.3"
|
|
70
70
|
},
|