@parlor/cli 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/agent-host-process.js.map +1 -1
  2. package/dist/chat-warning.js.map +1 -1
  3. package/dist/cloudflare/loader.d.ts +4 -0
  4. package/dist/cloudflare/loader.d.ts.map +1 -0
  5. package/dist/cloudflare/loader.js +11 -0
  6. package/dist/cloudflare/loader.js.map +1 -0
  7. package/dist/cloudflare/platform.d.ts +16 -0
  8. package/dist/cloudflare/platform.d.ts.map +1 -0
  9. package/dist/cloudflare/platform.js +52 -0
  10. package/dist/cloudflare/platform.js.map +1 -0
  11. package/dist/cloudflare/prepare.d.ts +9 -0
  12. package/dist/cloudflare/prepare.d.ts.map +1 -0
  13. package/dist/cloudflare/prepare.js +29 -0
  14. package/dist/cloudflare/prepare.js.map +1 -0
  15. package/dist/cloudflare/workers.d.ts +12 -0
  16. package/dist/cloudflare/workers.d.ts.map +1 -0
  17. package/dist/cloudflare/workers.js +18 -0
  18. package/dist/cloudflare/workers.js.map +1 -0
  19. package/dist/cloudflare/wrangler.d.ts +4 -0
  20. package/dist/cloudflare/wrangler.d.ts.map +1 -0
  21. package/dist/cloudflare/wrangler.js +16 -0
  22. package/dist/cloudflare/wrangler.js.map +1 -0
  23. package/dist/commands/add.js.map +1 -1
  24. package/dist/commands/build.js.map +1 -1
  25. package/dist/commands/db.js +2 -2
  26. package/dist/commands/db.js.map +1 -1
  27. package/dist/commands/deploy.d.ts.map +1 -1
  28. package/dist/commands/deploy.js +2 -1
  29. package/dist/commands/deploy.js.map +1 -1
  30. package/dist/commands/dev.d.ts.map +1 -1
  31. package/dist/commands/dev.js +3 -4
  32. package/dist/commands/dev.js.map +1 -1
  33. package/dist/commands/typegen.js.map +1 -1
  34. package/dist/desktop-target.js.map +1 -1
  35. package/dist/dev-session.d.ts +3 -2
  36. package/dist/dev-session.d.ts.map +1 -1
  37. package/dist/dev-session.js +6 -5
  38. package/dist/dev-session.js.map +1 -1
  39. package/dist/errors.js.map +1 -1
  40. package/dist/handlers.js.map +1 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/main.js.map +1 -1
  43. package/dist/mobile-target.js.map +1 -1
  44. package/dist/ports.js.map +1 -1
  45. package/dist/serve-entry.js +21 -6
  46. package/dist/serve-entry.js.map +1 -1
  47. package/dist/server-process.d.ts +2 -1
  48. package/dist/server-process.d.ts.map +1 -1
  49. package/dist/server-process.js +9 -2
  50. package/dist/server-process.js.map +1 -1
  51. package/dist/serverless-warning.js.map +1 -1
  52. package/dist/shutdown.js.map +1 -1
  53. package/dist/targets.js.map +1 -1
  54. package/dist/web-target.d.ts.map +1 -1
  55. package/dist/web-target.js +8 -3
  56. package/dist/web-target.js.map +1 -1
  57. package/package.json +23 -11
@@ -1 +1 @@
1
- {"version":3,"file":"agent-host-process.js","sourceRoot":"","sources":["../src/agent-host-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAI1C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAS/C,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;AAE5C;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAE7D,CAAC;IACF,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,QAAQ,CAAC,6BAA6B,cAAc,MAAM,CAAC,CAAC;IAChF,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,EAAE,MAAM,EAAE,OAAO,EAAgB,EACjC,OAA4B;IAE5B,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,KAAK,GAAG,KAAK,CACjB,OAAO,CAAC,QAAQ,EAChB,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,oBAAoB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAC1E,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CACrD,CAAC;IACF,UAAU,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"agent-host-process.js","sourceRoot":"","sources":["../src/agent-host-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAI1C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAS/C,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;AAE5C;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAE7D,CAAC;IACF,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,QAAQ,CAAC,6BAA6B,cAAc,MAAM,CAAC,CAAC;IAChF,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,EAAE,MAAM,EAAE,OAAO,EAAgB,EACjC,OAA4B;IAE5B,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,aAAa;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,KAAK,GAAG,KAAK,CACjB,OAAO,CAAC,QAAQ,EAChB,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,oBAAoB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAC1E,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CACrD,CAAC;IACF,UAAU,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\n\nimport type { LoadedConfig } from \"@parlor/config\";\n\nimport { CliError } from \"./errors.js\";\nimport { stopServerProcess } from \"./server-process.js\";\nimport { onShutdown } from \"./shutdown.js\";\n\nconst require = createRequire(import.meta.url);\n\nexport interface DevAgentHostOptions {\n /** `--no-agent-host` turns it off. */\n readonly enabled: boolean;\n /** The server is running with its own auth provider, so `devAuth` is not there to pair with. */\n readonly serverHasAuth: boolean;\n}\n\nexport const AGENT_HOST_BIN = \"parlor-host\";\n\n/**\n * The `parlor-host` bin as the installed manifest declares it: `bin/parlor-host-dev.mjs` (tsx on\n * `src/`) in the repo, `dist/main.js` once `publishConfig` is applied. Resolving the exported\n * `package.json` works under CJS resolution, which the package's `import`-only entry does not.\n */\nexport function agentHostBin(): string {\n const manifestPath = require.resolve(\"@parlor/agent-host/package.json\");\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as {\n readonly bin?: Readonly<Record<string, string>>;\n };\n const bin = manifest.bin?.[AGENT_HOST_BIN];\n if (!bin) throw new CliError(`@parlor/agent-host has no ${AGENT_HOST_BIN} bin`);\n return join(dirname(manifestPath), bin);\n}\n\n/**\n * `parlor dev` runs `parlor-host dev --app http://localhost:<port>` next to the server, so\n * the chat works against the developer's own agents with no pairing. Orchestration only;\n * `undefined` when skipped.\n */\nexport function startDevAgentHost(\n { config, rootDir }: LoadedConfig,\n options: DevAgentHostOptions,\n): ChildProcess | undefined {\n if (!options.enabled || options.serverHasAuth) return undefined;\n const child = spawn(\n process.execPath,\n [agentHostBin(), \"dev\", \"--app\", `http://localhost:${config.server.port}`],\n { cwd: rootDir, stdio: \"inherit\", env: process.env },\n );\n onShutdown((signaled) => stopServerProcess(child, signaled ? undefined : 0));\n return child;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-warning.js","sourceRoot":"","sources":["../src/chat-warning.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAoB,MAAM,kBAAkB,CAAC;AAExE,MAAM,CAAC,MAAM,yBAAyB,GACpC,gLAAgL,CAAC;AAEnL,2FAA2F;AAC3F,MAAM,UAAU,4BAA4B,CAAC,MAAmB;IAC9D,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;AACjE,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EACxC,MAAM,EACN,OAAO,GACM;IACb,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtE,IAAI,4BAA4B,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;AACpF,CAAC"}
1
+ {"version":3,"file":"chat-warning.js","sourceRoot":"","sources":["../src/chat-warning.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAoB,MAAM,kBAAkB,CAAC;AAExE,MAAM,CAAC,MAAM,yBAAyB,GACpC,gLAAgL,CAAC;AAEnL,2FAA2F;AAC3F,MAAM,UAAU,4BAA4B,CAAC,MAAmB;IAC9D,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;AACjE,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EACxC,MAAM,EACN,OAAO,GACM;IACb,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtE,IAAI,4BAA4B,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;AACpF,CAAC","sourcesContent":["import type { LoadedConfig } from \"@parlor/config\";\nimport { inspectServerEntry, type ServerShape } from \"@parlor/scaffold\";\n\nexport const AGENT_UNAVAILABLE_WARNING =\n 'Warning: this app installs chat() without sign-in, so in production the agent sidebar is unavailable (useChat().status is \"unavailable\"). Run `parlor add auth` to turn it on.';\n\n/** Only when sure: an `unknown` shape stays quiet rather than warn about a working app. */\nexport function agentUnavailableInProduction(server: ServerShape): boolean {\n return server.chat === \"installed\" && server.auth === \"absent\";\n}\n\n/** The server is the same for every target, so every production build warns, not only web. */\nexport async function warnChatWithoutAuth({\n config,\n rootDir,\n}: LoadedConfig): Promise<void> {\n const server = await inspectServerEntry(rootDir, config.server.entry);\n if (agentUnavailableInProduction(server)) console.warn(AGENT_UNAVAILABLE_WARNING);\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export declare const CLOUDFLARE_WORKERS = "cloudflare:workers";
2
+ /** Resolves `cloudflare:workers` to `module` for every import that follows. */
3
+ export declare function registerCloudflareWorkers(module?: string): void;
4
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/cloudflare/loader.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AAEvD,+EAA+E;AAC/E,wBAAgB,yBAAyB,CACvC,MAAM,GAAE,MAA4C,GACnD,IAAI,CAON"}
@@ -0,0 +1,11 @@
1
+ import { registerHooks } from "node:module";
2
+ export const CLOUDFLARE_WORKERS = "cloudflare:workers";
3
+ /** Resolves `cloudflare:workers` to `module` for every import that follows. */
4
+ export function registerCloudflareWorkers(module = import.meta.resolve("./workers.js")) {
5
+ registerHooks({
6
+ resolve: (specifier, context, nextResolve) => specifier === CLOUDFLARE_WORKERS
7
+ ? { url: module, shortCircuit: true }
8
+ : nextResolve(specifier, context),
9
+ });
10
+ }
11
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/cloudflare/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEvD,+EAA+E;AAC/E,MAAM,UAAU,yBAAyB,CACvC,MAAM,GAAW,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;IAEpD,aAAa,CAAC;QACZ,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAC3C,SAAS,KAAK,kBAAkB;YAC9B,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE;YACrC,CAAC,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC;KACtC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { registerHooks } from \"node:module\";\n\nexport const CLOUDFLARE_WORKERS = \"cloudflare:workers\";\n\n/** Resolves `cloudflare:workers` to `module` for every import that follows. */\nexport function registerCloudflareWorkers(\n module: string = import.meta.resolve(\"./workers.js\"),\n): void {\n registerHooks({\n resolve: (specifier, context, nextResolve) =>\n specifier === CLOUDFLARE_WORKERS\n ? { url: module, shortCircuit: true }\n : nextResolve(specifier, context),\n });\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import type { UnavailableDurableObject } from "@parlor/host";
2
+ import type { CloudflareDev } from "./prepare.js";
3
+ type Env = Record<string, unknown>;
4
+ export declare function platformEnv(): Env;
5
+ export interface CloudflarePlatform {
6
+ readonly env: Env;
7
+ readonly dispose: () => Promise<void>;
8
+ }
9
+ /** Wrangler's order: `.dev.vars` alone when it exists, otherwise `.env` then `.env.local`. */
10
+ export declare function devVarsFiles(rootDir: string): string[];
11
+ /** Workers put text vars and secrets in `process.env` too; variables set in the shell win here. */
12
+ export declare function exposeVars(env: Env, target: NodeJS.ProcessEnv): void;
13
+ export declare function withUnavailable(env: Env, unavailable: readonly UnavailableDurableObject[]): Env;
14
+ export declare function startCloudflarePlatform(rootDir: string, { configPath, unavailable }: CloudflareDev): Promise<CloudflarePlatform>;
15
+ export {};
16
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/cloudflare/platform.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAInC,wBAAgB,WAAW,IAAI,GAAG,CAOjC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAItD;AAED,mGAAmG;AACnG,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAIpE;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,GAAG,EACR,WAAW,EAAE,SAAS,wBAAwB,EAAE,GAC/C,GAAG,CAeL;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,aAAa,GACzC,OAAO,CAAC,kBAAkB,CAAC,CAc7B"}
@@ -0,0 +1,52 @@
1
+ import { existsSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { resolveWrangler, WRANGLER_MISSING } from "./wrangler.js";
5
+ let current;
6
+ export function platformEnv() {
7
+ if (!current) {
8
+ throw new Error('cloudflare:workers needs deploy.preset "cloudflare-durable" in parlor.config.ts, which makes parlor dev serve the app\'s Cloudflare bindings');
9
+ }
10
+ return current;
11
+ }
12
+ /** Wrangler's order: `.dev.vars` alone when it exists, otherwise `.env` then `.env.local`. */
13
+ export function devVarsFiles(rootDir) {
14
+ const devVars = join(rootDir, ".dev.vars");
15
+ if (existsSync(devVars))
16
+ return [devVars];
17
+ return [join(rootDir, ".env"), join(rootDir, ".env.local")];
18
+ }
19
+ /** Workers put text vars and secrets in `process.env` too; variables set in the shell win here. */
20
+ export function exposeVars(env, target) {
21
+ for (const [name, value] of Object.entries(env)) {
22
+ if (typeof value === "string" && target[name] === undefined)
23
+ target[name] = value;
24
+ }
25
+ }
26
+ export function withUnavailable(env, unavailable) {
27
+ const classes = new Map(unavailable.map(({ binding, className }) => [binding, className]));
28
+ return new Proxy(env, {
29
+ get(target, property) {
30
+ const className = classes.get(property);
31
+ if (className) {
32
+ throw new Error(`env.${String(property)} is unavailable in parlor dev: it binds ${className}, a Durable Object class the app's own Worker defines, and parlor dev emulates bindings with Wrangler's getPlatformProxy(), which runs no Worker code. Run the cloudflare-durable build on wrangler dev to use it.`);
33
+ }
34
+ return Reflect.get(target, property);
35
+ },
36
+ });
37
+ }
38
+ export async function startCloudflarePlatform(rootDir, { configPath, unavailable }) {
39
+ const wrangler = resolveWrangler(rootDir);
40
+ if (!wrangler)
41
+ throw new Error(WRANGLER_MISSING);
42
+ const { getPlatformProxy } = (await import(pathToFileURL(wrangler).href));
43
+ const proxy = await getPlatformProxy({
44
+ configPath,
45
+ envFiles: devVarsFiles(rootDir),
46
+ persist: { path: join(dirname(configPath), "state") },
47
+ });
48
+ exposeVars(proxy.env, process.env);
49
+ current = withUnavailable(proxy.env, unavailable);
50
+ return { env: current, dispose: () => proxy.dispose() };
51
+ }
52
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/cloudflare/platform.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { UnavailableDurableObject } from \"@parlor/host\";\n\nimport type { CloudflareDev } from \"./prepare.js\";\nimport { resolveWrangler, WRANGLER_MISSING } from \"./wrangler.js\";\n\ntype Env = Record<string, unknown>;\n\nlet current: Env | undefined;\n\nexport function platformEnv(): Env {\n if (!current) {\n throw new Error(\n 'cloudflare:workers needs deploy.preset \"cloudflare-durable\" in parlor.config.ts, which makes parlor dev serve the app\\'s Cloudflare bindings',\n );\n }\n return current;\n}\n\nexport interface CloudflarePlatform {\n readonly env: Env;\n readonly dispose: () => Promise<void>;\n}\n\n/** Wrangler's order: `.dev.vars` alone when it exists, otherwise `.env` then `.env.local`. */\nexport function devVarsFiles(rootDir: string): string[] {\n const devVars = join(rootDir, \".dev.vars\");\n if (existsSync(devVars)) return [devVars];\n return [join(rootDir, \".env\"), join(rootDir, \".env.local\")];\n}\n\n/** Workers put text vars and secrets in `process.env` too; variables set in the shell win here. */\nexport function exposeVars(env: Env, target: NodeJS.ProcessEnv): void {\n for (const [name, value] of Object.entries(env)) {\n if (typeof value === \"string\" && target[name] === undefined) target[name] = value;\n }\n}\n\nexport function withUnavailable(\n env: Env,\n unavailable: readonly UnavailableDurableObject[],\n): Env {\n const classes = new Map<PropertyKey, string>(\n unavailable.map(({ binding, className }) => [binding, className]),\n );\n return new Proxy(env, {\n get(target, property) {\n const className = classes.get(property);\n if (className) {\n throw new Error(\n `env.${String(property)} is unavailable in parlor dev: it binds ${className}, a Durable Object class the app's own Worker defines, and parlor dev emulates bindings with Wrangler's getPlatformProxy(), which runs no Worker code. Run the cloudflare-durable build on wrangler dev to use it.`,\n );\n }\n return Reflect.get(target, property);\n },\n });\n}\n\nexport async function startCloudflarePlatform(\n rootDir: string,\n { configPath, unavailable }: CloudflareDev,\n): Promise<CloudflarePlatform> {\n const wrangler = resolveWrangler(rootDir);\n if (!wrangler) throw new Error(WRANGLER_MISSING);\n const { getPlatformProxy } = (await import(\n pathToFileURL(wrangler).href\n )) as typeof import(\"wrangler\");\n const proxy = await getPlatformProxy<Env>({\n configPath,\n envFiles: devVarsFiles(rootDir),\n persist: { path: join(dirname(configPath), \"state\") },\n });\n exposeVars(proxy.env, process.env);\n current = withUnavailable(proxy.env, unavailable);\n return { env: current, dispose: () => proxy.dispose() };\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { type LoadedConfig } from "@parlor/config";
2
+ import { type UnavailableDurableObject } from "@parlor/host";
3
+ export interface CloudflareDev {
4
+ readonly configPath: string;
5
+ readonly unavailable: readonly UnavailableDurableObject[];
6
+ }
7
+ /** Writes the Wrangler config the dev server's bindings come from, when the app deploys to cloudflare-durable. */
8
+ export declare function prepareCloudflareDev({ config, rootDir }: Pick<LoadedConfig, "config" | "rootDir">, env?: NodeJS.ProcessEnv): Promise<CloudflareDev | undefined>;
9
+ //# sourceMappingURL=prepare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.d.ts","sourceRoot":"","sources":["../../src/cloudflare/prepare.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,cAAc,CAAC;AAKtB,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,SAAS,wBAAwB,EAAE,CAAC;CAC3D;AAED,kHAAkH;AAClH,wBAAsB,oBAAoB,CACxC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,SAAS,CAAC,EAC7D,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAgBpC"}
@@ -0,0 +1,29 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { generatedDir } from "@parlor/config";
4
+ import { devWranglerConfig, PresetError, resolvePreset, } from "@parlor/host";
5
+ import { CliError } from "../errors.js";
6
+ import { resolveWrangler, WRANGLER_MISSING } from "./wrangler.js";
7
+ /** Writes the Wrangler config the dev server's bindings come from, when the app deploys to cloudflare-durable. */
8
+ export async function prepareCloudflareDev({ config, rootDir }, env = process.env) {
9
+ let preset;
10
+ try {
11
+ preset = resolvePreset(undefined, config.deploy.preset, env).preset;
12
+ }
13
+ catch (error) {
14
+ if (error instanceof PresetError)
15
+ throw new CliError(error.message, { cause: error });
16
+ throw error;
17
+ }
18
+ if (preset !== "cloudflare-durable")
19
+ return undefined;
20
+ if (!resolveWrangler(rootDir))
21
+ throw new CliError(WRANGLER_MISSING);
22
+ const { wrangler, unavailable } = devWranglerConfig(config);
23
+ const dir = join(generatedDir(rootDir, env), "cloudflare");
24
+ await mkdir(dir, { recursive: true });
25
+ const configPath = join(dir, "wrangler.json");
26
+ await writeFile(configPath, `${JSON.stringify(wrangler, null, 2)}\n`);
27
+ return { configPath, unavailable };
28
+ }
29
+ //# sourceMappingURL=prepare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../src/cloudflare/prepare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAqB,MAAM,gBAAgB,CAAC;AACjE,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,aAAa,GAEd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOlE,kHAAkH;AAClH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAE,MAAM,EAAE,OAAO,EAA4C,EAC7D,GAAG,GAAsB,OAAO,CAAC,GAAG;IAEpC,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW;YAAE,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACtF,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,MAAM,KAAK,oBAAoB;QAAE,OAAO,SAAS,CAAC;IACtD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACpE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;IAC3D,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAC9C,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACtE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;AACrC,CAAC","sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { generatedDir, type LoadedConfig } from \"@parlor/config\";\nimport {\n devWranglerConfig,\n PresetError,\n resolvePreset,\n type UnavailableDurableObject,\n} from \"@parlor/host\";\n\nimport { CliError } from \"../errors.js\";\nimport { resolveWrangler, WRANGLER_MISSING } from \"./wrangler.js\";\n\nexport interface CloudflareDev {\n readonly configPath: string;\n readonly unavailable: readonly UnavailableDurableObject[];\n}\n\n/** Writes the Wrangler config the dev server's bindings come from, when the app deploys to cloudflare-durable. */\nexport async function prepareCloudflareDev(\n { config, rootDir }: Pick<LoadedConfig, \"config\" | \"rootDir\">,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<CloudflareDev | undefined> {\n let preset: string;\n try {\n preset = resolvePreset(undefined, config.deploy.preset, env).preset;\n } catch (error) {\n if (error instanceof PresetError) throw new CliError(error.message, { cause: error });\n throw error;\n }\n if (preset !== \"cloudflare-durable\") return undefined;\n if (!resolveWrangler(rootDir)) throw new CliError(WRANGLER_MISSING);\n const { wrangler, unavailable } = devWranglerConfig(config);\n const dir = join(generatedDir(rootDir, env), \"cloudflare\");\n await mkdir(dir, { recursive: true });\n const configPath = join(dir, \"wrangler.json\");\n await writeFile(configPath, `${JSON.stringify(wrangler, null, 2)}\\n`);\n return { configPath, unavailable };\n}\n"]}
@@ -0,0 +1,12 @@
1
+ export declare const env: {
2
+ [x: string]: unknown;
3
+ };
4
+ /** Lets modules that define Durable Objects load; parlor dev never constructs one. */
5
+ export declare class DurableObject<Env = unknown> {
6
+ protected readonly ctx: unknown;
7
+ protected readonly env: Env;
8
+ constructor(state: unknown, bindings: Env);
9
+ }
10
+ /** On Workers it keeps the request alive for `promise`; a Node process runs on anyway, so this only reports a failure. */
11
+ export declare function waitUntil(promise: Promise<unknown>): void;
12
+ //# sourceMappingURL=workers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../../src/cloudflare/workers.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,GAAG;;CAAgB,CAAC;AAEjC,sFAAsF;AACtF,qBAAa,aAAa,CAAC,GAAG,GAAG,OAAO;IACtC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAE5B,YAAY,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAGxC;CACF;AAED,0HAA0H;AAC1H,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAIzD"}
@@ -0,0 +1,18 @@
1
+ import { platformEnv } from "./platform.js";
2
+ export const env = platformEnv();
3
+ /** Lets modules that define Durable Objects load; parlor dev never constructs one. */
4
+ export class DurableObject {
5
+ ctx;
6
+ env;
7
+ constructor(state, bindings) {
8
+ this.ctx = state;
9
+ this.env = bindings;
10
+ }
11
+ }
12
+ /** On Workers it keeps the request alive for `promise`; a Node process runs on anyway, so this only reports a failure. */
13
+ export function waitUntil(promise) {
14
+ promise.catch((error) => {
15
+ console.error("[parlor] work passed to waitUntil failed:", error);
16
+ });
17
+ }
18
+ //# sourceMappingURL=workers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers.js","sourceRoot":"","sources":["../../src/cloudflare/workers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,CAAC,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;AAEjC,sFAAsF;AACtF,MAAM,OAAO,aAAa;IACL,GAAG,CAAU;IACb,GAAG,CAAM;IAE5B,YAAY,KAAc,EAAE,QAAa;QACvC,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;IACtB,CAAC;CACF;AAED,0HAA0H;AAC1H,MAAM,UAAU,SAAS,CAAC,OAAyB;IACjD,OAAO,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC/B,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { platformEnv } from \"./platform.js\";\n\nexport const env = platformEnv();\n\n/** Lets modules that define Durable Objects load; parlor dev never constructs one. */\nexport class DurableObject<Env = unknown> {\n protected readonly ctx: unknown;\n protected readonly env: Env;\n\n constructor(state: unknown, bindings: Env) {\n this.ctx = state;\n this.env = bindings;\n }\n}\n\n/** On Workers it keeps the request alive for `promise`; a Node process runs on anyway, so this only reports a failure. */\nexport function waitUntil(promise: Promise<unknown>): void {\n promise.catch((error: unknown) => {\n console.error(\"[parlor] work passed to waitUntil failed:\", error);\n });\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export declare const WRANGLER_MISSING = "The cloudflare-durable preset runs the app's Cloudflare bindings in parlor dev with Wrangler. Add wrangler to the app's devDependencies.";
2
+ /** The app's own Wrangler, the one that builds and deploys it: a node_modules lookup, never NODE_PATH. */
3
+ export declare function resolveWrangler(rootDir: string): string | undefined;
4
+ //# sourceMappingURL=wrangler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrangler.d.ts","sourceRoot":"","sources":["../../src/cloudflare/wrangler.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gBAAgB,6IAC+G,CAAC;AAE7I,0GAA0G;AAC1G,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMnE"}
@@ -0,0 +1,16 @@
1
+ import { existsSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { dirname, join } from "node:path";
4
+ const require = createRequire(import.meta.url);
5
+ export const WRANGLER_MISSING = "The cloudflare-durable preset runs the app's Cloudflare bindings in parlor dev with Wrangler. Add wrangler to the app's devDependencies.";
6
+ /** The app's own Wrangler, the one that builds and deploys it: a node_modules lookup, never NODE_PATH. */
7
+ export function resolveWrangler(rootDir) {
8
+ for (let dir = rootDir;; dir = dirname(dir)) {
9
+ const installed = join(dir, "node_modules", "wrangler");
10
+ if (existsSync(join(installed, "package.json")))
11
+ return require.resolve(installed);
12
+ if (dirname(dir) === dir)
13
+ return undefined;
14
+ }
15
+ }
16
+ //# sourceMappingURL=wrangler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrangler.js","sourceRoot":"","sources":["../../src/cloudflare/wrangler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,gBAAgB,GAC3B,0IAA0I,CAAC;AAE7I,0GAA0G;AAC1G,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,KAAK,IAAI,GAAG,GAAG,OAAO,GAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;QACxD,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACnF,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG;YAAE,OAAO,SAAS,CAAC;IAC7C,CAAC;AACH,CAAC","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\n\nconst require = createRequire(import.meta.url);\n\nexport const WRANGLER_MISSING =\n \"The cloudflare-durable preset runs the app's Cloudflare bindings in parlor dev with Wrangler. Add wrangler to the app's devDependencies.\";\n\n/** The app's own Wrangler, the one that builds and deploys it: a node_modules lookup, never NODE_PATH. */\nexport function resolveWrangler(rootDir: string): string | undefined {\n for (let dir = rootDir; ; dir = dirname(dir)) {\n const installed = join(dir, \"node_modules\", \"wrangler\");\n if (existsSync(join(installed, \"package.json\"))) return require.resolve(installed);\n if (dirname(dir) === dir) return undefined;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EACL,WAAW,EACX,SAAS,EAGT,2BAA2B,EAC3B,eAAe,EACf,WAAW,GAEZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExD,MAAM,UAAU,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAgB;IAC7D,OAAO;QACL,OAAO;QACP,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;QAChC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;QACjC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;QACzC,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC;KACjC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAoB;IAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC1B,OAAO;QACL,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;QACjE,SAAS,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAC3B,aAAa,CACX,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,EACxE,OAAO,CACR;KACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAyB;IACvD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,QAAQ,CAAC,qBAAqB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,QAAQ,CAChB,kBAAkB,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9G,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAqB,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,aAAa,CAAC;IAC/B,IAAI,EAAE;QACJ,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,mDAAmD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACzF;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE;QACpF,SAAS,EAAE;YACT,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,0DAA0D;SACxE;QACD,OAAO,EAAE;YACP,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,IAAI;YACb,WAAW,EACT,4EAA4E;SAC/E;QACD,WAAW,EAAE;YACX,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,IAAI;YACb,WAAW,EACT,+EAA+E;SAClF;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,cAAc,GAAG,MAAM,2BAA2B,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;YAC7B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC;YAC7B,MAAM;YACN,cAAc;YACd,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;YACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;YAC3C,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC;YAC3B,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;SACjC,CAAC,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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","sourcesContent":["import { type LoadedConfig, loadParlorConfig } from \"@parlor/config\";\nimport {\n ADDON_NAMES,\n addAddons,\n type AddonName,\n type AddTools,\n detectProjectPackageManager,\n formatAddResult,\n isAddonName,\n type ProjectLayout,\n} from \"@parlor/scaffold\";\nimport { generateRouteTree, routeTreeFile } from \"@parlor/shell-web\";\nimport { defineCommand } from \"citty\";\n\nimport { CliError } from \"../errors.js\";\nimport { drizzleKitArgs, runDrizzleKit } from \"./db.js\";\n\nexport function projectLayout({ config, rootDir }: LoadedConfig): ProjectLayout {\n return {\n rootDir,\n serverEntry: config.server.entry,\n schemaDir: config.database.schema,\n migrationsDir: config.database.migrations,\n routeTree: routeTreeFile(config),\n };\n}\n\n/**\n * The same code `parlor typegen` and `parlor db generate` run, pointed at whatever directory\n * the transaction names: the staging copy, never the project.\n */\nexport function addTools(loaded: LoadedConfig): AddTools {\n const { config } = loaded;\n return {\n routeTree: (rootDir) => generateRouteTree({ ...loaded, rootDir }),\n migration: (rootDir, name) =>\n runDrizzleKit(\n drizzleKitArgs(config.database.schema, config.database.migrations, name),\n rootDir,\n ),\n };\n}\n\nexport function parseAddonNames(values: readonly string[]): readonly AddonName[] {\n if (values.length === 0) {\n throw new CliError(`Name what to add: ${ADDON_NAMES.join(\", \")}`);\n }\n const unknown = values.filter((value) => !isAddonName(value));\n if (unknown.length > 0) {\n throw new CliError(\n `Unknown add-on ${unknown.map((name) => `\"${name}\"`).join(\", \")}. Expected one of: ${ADDON_NAMES.join(\", \")}`,\n );\n }\n return [...new Set(values as AddonName[])];\n}\n\nexport const add = defineCommand({\n meta: {\n name: \"add\",\n description: `Add a feature to this app by editing its files: ${ADDON_NAMES.join(\", \")}`,\n },\n args: {\n addon: { type: \"positional\", description: ADDON_NAMES.join(\" | \"), required: false },\n \"dry-run\": {\n type: \"boolean\",\n default: false,\n description: \"Print the changes without writing or installing anything\",\n },\n install: {\n type: \"boolean\",\n default: true,\n description:\n \"Install dependencies and generate files (--no-install to only write files)\",\n },\n \"git-check\": {\n type: \"boolean\",\n default: true,\n description:\n \"Refuse to edit a project with uncommitted changes (--no-git-check to proceed)\",\n },\n },\n async run({ args }) {\n const loaded = await loadParlorConfig();\n const addons = parseAddonNames(args._);\n const packageManager = await detectProjectPackageManager(loaded.rootDir);\n const result = await addAddons({\n layout: projectLayout(loaded),\n addons,\n packageManager,\n tools: addTools(loaded),\n mode: args[\"dry-run\"] ? \"dry-run\" : \"apply\",\n install: args.install,\n gitCheck: args[\"git-check\"],\n log: (line) => console.log(line),\n });\n const { text, exitCode } = formatAddResult(result, packageManager);\n console.log(text);\n process.exitCode = exitCode;\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,CAAC,MAAM,KAAK,GAAG,aAAa,CAAC;IACjC,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,4BAA4B,EAAE;IAClE,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,6CAA6C;YAC1D,OAAO,EAAE,KAAK;SACf;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,0EAA0E;SAC7E;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,CAAC,MAAM,KAAK,GAAG,aAAa,CAAC;IACjC,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,4BAA4B,EAAE;IAClE,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,6CAA6C;YAC1D,OAAO,EAAE,KAAK;SACf;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,0EAA0E;SAC7E;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;CACF,CAAC,CAAC","sourcesContent":["import { loadParlorConfig } from \"@parlor/config\";\nimport { defineCommand } from \"citty\";\n\nimport { warnChatWithoutAuth } from \"../chat-warning.js\";\nimport { handlers } from \"../handlers.js\";\nimport { parseTarget, resolveHandler } from \"../targets.js\";\n\nexport const build = defineCommand({\n meta: { name: \"build\", description: \"Build the app for a target\" },\n args: {\n target: {\n type: \"string\",\n description: \"web | ios | android | mac | windows | linux\",\n default: \"web\",\n },\n preset: {\n type: \"string\",\n description:\n \"Server deploy preset for the web target: node-server, vercel, netlify, …\",\n },\n },\n async run({ args }) {\n const target = parseTarget(args.target);\n const handler = resolveHandler(handlers, target);\n const loaded = await loadParlorConfig();\n await warnChatWithoutAuth(loaded);\n await handler.build(loaded, { preset: args.preset });\n },\n});\n"]}
@@ -1,7 +1,7 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { createRequire } from "node:module";
3
3
  import { dirname, join } from "node:path";
4
- import { loadParlorConfig } from "@parlor/config";
4
+ import { generatedDir, loadParlorConfig } from "@parlor/config";
5
5
  import { createDatabase } from "@parlor/data";
6
6
  import { defineCommand } from "citty";
7
7
  import { CliError } from "../errors.js";
@@ -113,7 +113,7 @@ const migrate = defineCommand({
113
113
  async run() {
114
114
  const { config, rootDir } = await loadParlorConfig();
115
115
  const database = await createDatabase({
116
- dataDir: join(rootDir, ".parlor", "pglite"),
116
+ dataDir: join(generatedDir(rootDir), "pglite"),
117
117
  });
118
118
  try {
119
119
  await database.migrate(join(rootDir, config.database.migrations));
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport type { Writable } from \"node:stream\";\n\nimport { generatedDir, loadParlorConfig } from \"@parlor/config\";\nimport { createDatabase } from \"@parlor/data\";\nimport { defineCommand } from \"citty\";\n\nimport { CliError } from \"../errors.js\";\n\nconst require = createRequire(import.meta.url);\n\n/** `name` replaces drizzle-kit's random suffix, so a generated migration has a stable file name. */\nexport function drizzleKitArgs(\n schema: string,\n migrations: string,\n name?: string,\n): string[] {\n return [\n \"generate\",\n \"--dialect\",\n \"postgresql\",\n \"--schema\",\n schema,\n \"--out\",\n migrations,\n ...(name === undefined ? [] : [\"--name\", name]),\n ];\n}\n\nconst STACK_FRAME = /^\\s+at \\S/m;\n\nconst KILL_GRACE_MS = 2000;\nconst PARENT_SIGNALS = [\"SIGINT\", \"SIGTERM\"] as const;\n\nexport interface DrizzleKitOptions {\n readonly stdout?: \"inherit\" | \"ignore\";\n readonly stderr?: Writable;\n readonly signal?: AbortSignal;\n readonly timeoutMs?: number;\n}\n\nexport function runDrizzleKit(\n args: readonly string[],\n cwd: string,\n options: DrizzleKitOptions = {},\n): Promise<void> {\n const { stdout = \"inherit\", stderr = process.stderr, signal, timeoutMs } = options;\n const command = `drizzle-kit ${args[0]}`;\n const bin = join(dirname(require.resolve(\"drizzle-kit\")), \"bin.cjs\");\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new CliError(`${command} aborted`));\n return;\n }\n const child = spawn(process.execPath, [bin, ...args], {\n cwd,\n env: { ...process.env, NODE_NO_WARNINGS: \"1\" },\n // the rename prompt needs a TTY; without one stdin would only keep the child waiting\n stdio: [process.stdin.isTTY ? \"inherit\" : \"ignore\", stdout, \"pipe\"],\n });\n let stderrText = \"\";\n let stopReason: CliError | undefined;\n let parentSignal: NodeJS.Signals | undefined;\n let killTimer: NodeJS.Timeout | undefined;\n\n const stop = (reason: CliError) => {\n if (stopReason) return;\n stopReason = reason;\n child.kill(\"SIGTERM\");\n killTimer = setTimeout(() => child.kill(\"SIGKILL\"), KILL_GRACE_MS);\n };\n const onAbort = () => stop(new CliError(`${command} aborted`));\n const onParentExit = () => {\n child.kill(\"SIGKILL\");\n };\n const onParentSignal = (name: NodeJS.Signals) => {\n parentSignal = name;\n stop(new CliError(`${command} interrupted by ${name}`));\n };\n const timeoutTimer =\n timeoutMs === undefined\n ? undefined\n : setTimeout(\n () => stop(new CliError(`${command} timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n process.once(\"exit\", onParentExit);\n for (const name of PARENT_SIGNALS) process.on(name, onParentSignal);\n const release = () => {\n clearTimeout(timeoutTimer);\n clearTimeout(killTimer);\n signal?.removeEventListener(\"abort\", onAbort);\n process.removeListener(\"exit\", onParentExit);\n for (const name of PARENT_SIGNALS) process.removeListener(name, onParentSignal);\n };\n\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderrText += chunk.toString();\n stderr.write(chunk);\n });\n child.once(\"error\", (error) => {\n release();\n reject(error);\n });\n child.once(\"close\", (code) => {\n release();\n if (stopReason) reject(stopReason);\n else if (code !== 0)\n reject(new CliError(`${command} failed with exit code ${code}`));\n // drizzle-kit catches its own errors, prints the Error to stderr and still exits 0\n else if (STACK_FRAME.test(stderrText)) reject(new CliError(`${command} failed`));\n else resolve();\n if (parentSignal) process.kill(process.pid, parentSignal);\n });\n });\n}\n\nconst generate = defineCommand({\n meta: { name: \"generate\", description: \"Generate a SQL migration from the schema\" },\n args: {\n name: {\n type: \"string\",\n description: \"Name of the migration file instead of a random one\",\n },\n },\n async run({ args }) {\n const { config, rootDir } = await loadParlorConfig();\n await runDrizzleKit(\n drizzleKitArgs(config.database.schema, config.database.migrations, args.name),\n rootDir,\n );\n },\n});\n\nconst migrate = defineCommand({\n meta: { name: \"migrate\", description: \"Apply pending migrations to the database\" },\n async run() {\n const { config, rootDir } = await loadParlorConfig();\n const database = await createDatabase({\n dataDir: join(generatedDir(rootDir), \"pglite\"),\n });\n try {\n await database.migrate(join(rootDir, config.database.migrations));\n console.log(`migrations applied with ${database.driver}`);\n } finally {\n await database.close();\n }\n },\n});\n\nexport const db = defineCommand({\n meta: { name: \"db\", description: \"Database migrations\" },\n subCommands: { generate, migrate },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAYA,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9E;AAED,eAAO,MAAM,MAAM;;;;;EAuBjB,CAAC"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAaA,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9E;AAED,eAAO,MAAM,MAAM;;;;;EAuBjB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { createRequire } from "node:module";
3
3
  import { loadParlorConfig } from "@parlor/config";
4
+ import { nitroPresetFor } from "@parlor/host";
4
5
  import { defineCommand } from "citty";
5
6
  import { warnChatWithoutAuth } from "../chat-warning.js";
6
7
  import { CliError } from "../errors.js";
@@ -38,7 +39,7 @@ export const deploy = defineCommand({
38
39
  console.log(`node-server has no remote to deploy to. Run: node ${result.outputDir}/server/index.mjs`);
39
40
  return;
40
41
  }
41
- await runNitroDeploy(result.rootDir, result.preset);
42
+ await runNitroDeploy(result.rootDir, nitroPresetFor(result.preset));
42
43
  },
43
44
  });
44
45
  //# sourceMappingURL=deploy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,MAAc;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CACjB,OAAO,CAAC,QAAQ,EAChB,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EACpE,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;;gBACrB,MAAM,CAAC,IAAI,QAAQ,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,aAAa,CAAC;IAClC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,mDAAmD;KACjE;IACD,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,gDAAgD;SAC9D;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CACT,qDAAqD,MAAM,CAAC,SAAS,mBAAmB,CACzF,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,MAAc;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CACjB,OAAO,CAAC,QAAQ,EAChB,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EACpE,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;;gBACrB,MAAM,CAAC,IAAI,QAAQ,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,aAAa,CAAC;IAClC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,mDAAmD;KACjE;IACD,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,gDAAgD;SAC9D;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CACT,qDAAqD,MAAM,CAAC,SAAS,mBAAmB,CACzF,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,CAAC;CACF,CAAC,CAAC","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\n\nimport { loadParlorConfig } from \"@parlor/config\";\nimport { nitroPresetFor } from \"@parlor/host\";\nimport { defineCommand } from \"citty\";\n\nimport { warnChatWithoutAuth } from \"../chat-warning.js\";\nimport { CliError } from \"../errors.js\";\nimport { buildWebAndServer } from \"../web-target.js\";\n\nconst require = createRequire(import.meta.url);\n\nexport function runNitroDeploy(hostRoot: string, preset: string): Promise<void> {\n const bin = require.resolve(\"nitro/cli\");\n return new Promise((resolve, reject) => {\n const child = spawn(\n process.execPath,\n [bin, \"deploy\", \"--prebuilt\", \"--preset\", preset, \"--dir\", hostRoot],\n { stdio: \"inherit\" },\n );\n child.once(\"error\", reject);\n child.once(\"exit\", (code) => {\n if (code === 0) resolve();\n else reject(new CliError(`nitro deploy exited with code ${code}`));\n });\n });\n}\n\nexport const deploy = defineCommand({\n meta: {\n name: \"deploy\",\n description: \"Build the app and deploy the server to its preset\",\n },\n args: {\n preset: {\n type: \"string\",\n description: \"Deploy preset: node-server, vercel, netlify, …\",\n },\n },\n async run({ args }) {\n const loaded = await loadParlorConfig();\n await warnChatWithoutAuth(loaded);\n const result = await buildWebAndServer(loaded, { preset: args.preset });\n if (result.preset === \"node-server\") {\n console.log(\n `node-server has no remote to deploy to. Run: node ${result.outputDir}/server/index.mjs`,\n );\n return;\n }\n await runNitroDeploy(result.rootDir, nitroPresetFor(result.preset));\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAaA,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAO5D;AAED,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;EAqEd,CAAC"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAcA,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAO5D;AAED,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;EAuEd,CAAC"}
@@ -2,6 +2,7 @@ import { loadParlorConfig } from "@parlor/config";
2
2
  import { inspectServerEntry } from "@parlor/scaffold";
3
3
  import { defineCommand } from "citty";
4
4
  import { startDevAgentHost } from "../agent-host-process.js";
5
+ import { prepareCloudflareDev } from "../cloudflare/prepare.js";
5
6
  import { claimDevSession } from "../dev-session.js";
6
7
  import { CliError } from "../errors.js";
7
8
  import { handlers } from "../handlers.js";
@@ -46,6 +47,7 @@ export const dev = defineCommand({
46
47
  for (const handler of targetHandlers)
47
48
  handler.assertHost?.();
48
49
  const configured = await loadParlorConfig();
50
+ const cloudflare = await prepareCloudflareDev(configured);
49
51
  const port = parsePort(args.port);
50
52
  const session = claimDevSession(configured.rootDir, targets);
51
53
  onShutdown(() => session.release());
@@ -68,10 +70,7 @@ export const dev = defineCommand({
68
70
  });
69
71
  const shared = loadedFor(ports.web[main]);
70
72
  const server = await inspectServerEntry(shared.rootDir, shared.config.server.entry);
71
- const serverProcess = startServerProcess(shared, [
72
- appOrigin,
73
- ...frontends.filter((origin) => origin !== appOrigin),
74
- ]);
73
+ const serverProcess = startServerProcess(shared, [appOrigin, ...frontends.filter((origin) => origin !== appOrigin)], cloudflare);
75
74
  await untilListening(serverProcess, ports.server);
76
75
  startDevAgentHost(shared, {
77
76
  enabled: args["agent-host"],
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadParlorConfig } from \"@parlor/config\";\nimport { inspectServerEntry } from \"@parlor/scaffold\";\nimport { defineCommand } from \"citty\";\n\nimport { startDevAgentHost } from \"../agent-host-process.js\";\nimport { prepareCloudflareDev } from \"../cloudflare/prepare.js\";\nimport { claimDevSession } from \"../dev-session.js\";\nimport { CliError } from \"../errors.js\";\nimport { handlers } from \"../handlers.js\";\nimport { resolveDevPorts } from \"../ports.js\";\nimport { startServerProcess, untilListening } from \"../server-process.js\";\nimport { onShutdown } from \"../shutdown.js\";\nimport { parseTargets, resolveHandler } from \"../targets.js\";\n\nexport function parsePort(value: unknown): number | undefined {\n if (value === undefined) return undefined;\n const port = Number(value);\n if (!Number.isInteger(port) || port <= 0 || port > 65535) {\n throw new CliError(`Invalid --port \"${String(value)}\"`);\n }\n return port;\n}\n\nexport const dev = defineCommand({\n meta: { name: \"dev\", description: \"Run the app in development mode\" },\n args: {\n target: {\n type: \"string\",\n description:\n \"web | ios | android | mac | windows | linux, or several joined by commas (web,mac) to run them against one server\",\n default: \"web\",\n },\n port: {\n type: \"string\",\n description:\n \"Override web.port from parlor.config.ts; a busy port moves to the next free one\",\n },\n device: {\n type: \"string\",\n description: \"Simulator or device name for ios and android\",\n },\n \"agent-host\": {\n type: \"boolean\",\n default: true,\n description: \"Serve the chat with this computer's agents (--no-agent-host to skip)\",\n },\n },\n async run({ args }) {\n const targets = parseTargets(args.target);\n const targetHandlers = targets.map((target) => resolveHandler(handlers, target));\n for (const handler of targetHandlers) handler.assertHost?.();\n const configured = await loadParlorConfig();\n const cloudflare = await prepareCloudflareDev(configured);\n const port = parsePort(args.port);\n const session = claimDevSession(configured.rootDir, targets);\n onShutdown(() => session.release());\n const ports = await resolveDevPorts({\n server: configured.config.server.port,\n web: port ?? configured.config.web.port,\n targets: targets.length,\n });\n const frontends = ports.web.map((web) => `http://localhost:${web}`);\n session.update(frontends);\n const main = Math.max(targets.indexOf(\"web\"), 0);\n const appOrigin = frontends[main]!;\n const loadedFor = (web: number) => ({\n ...configured,\n config: {\n ...configured.config,\n server: { ...configured.config.server, port: ports.server },\n web: { ...configured.config.web, port: web },\n },\n });\n const shared = loadedFor(ports.web[main]!);\n const server = await inspectServerEntry(shared.rootDir, shared.config.server.entry);\n const serverProcess = startServerProcess(\n shared,\n [appOrigin, ...frontends.filter((origin) => origin !== appOrigin)],\n cloudflare,\n );\n await untilListening(serverProcess, ports.server);\n startDevAgentHost(shared, {\n enabled: args[\"agent-host\"],\n serverHasAuth: server.auth === \"installed\",\n });\n await Promise.all(\n targetHandlers.map((handler, index) =>\n handler.dev(loadedFor(ports.web[index]!), {\n device: args.device,\n appOrigin: index === main ? undefined : appOrigin,\n }),\n ),\n );\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"typegen.js","sourceRoot":"","sources":["../../src/commands/typegen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC;IACnC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,WAAW,EACT,2EAA2E;KAC9E;IACD,KAAK,CAAC,GAAG;QACP,MAAM,iBAAiB,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"typegen.js","sourceRoot":"","sources":["../../src/commands/typegen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC;IACnC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,WAAW,EACT,2EAA2E;KAC9E;IACD,KAAK,CAAC,GAAG;QACP,MAAM,iBAAiB,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAC,CAAC","sourcesContent":["import { loadParlorConfig } from \"@parlor/config\";\nimport { generateRouteTree } from \"@parlor/shell-web\";\nimport { defineCommand } from \"citty\";\n\nexport const typegen = defineCommand({\n meta: {\n name: \"typegen\",\n description:\n \"Generate the route tree from src/routes, as parlor dev does, without Vite\",\n },\n async run() {\n await generateRouteTree(await loadParlorConfig());\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"desktop-target.js","sourceRoot":"","sources":["../src/desktop-target.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAErF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,MAAM,WAAW,GAA6C;IAC5D,MAAM,EAAE,KAAK;IACb,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,QAAQ,GAAoB,OAAO,CAAC,QAAQ;IAE5C,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAChB,WAAW,MAAM,yEAAyE,IAAI,IAAI,SAAS,IAAI,CAChH,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAI,GAAqB;IACxD,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa;YAChC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO;QACL,UAAU,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC;QAC3C,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO;YACvB,MAAM,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBAClC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;gBACrC,MAAM,eAAe,CAAC,MAAM,EAAE;oBAC5B,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,SAAS,EAAE,OAAO,CAAC,SAAS;iBAC7B,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ;YAC1B,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC1B,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"desktop-target.js","sourceRoot":"","sources":["../src/desktop-target.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAErF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,MAAM,WAAW,GAA6C;IAC5D,MAAM,EAAE,KAAK;IACb,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,QAAQ,GAAoB,OAAO,CAAC,QAAQ;IAE5C,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAChB,WAAW,MAAM,yEAAyE,IAAI,IAAI,SAAS,IAAI,CAChH,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAI,GAAqB;IACxD,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa;YAChC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO;QACL,UAAU,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC;QAC3C,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO;YACvB,MAAM,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBAClC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;gBACrC,MAAM,eAAe,CAAC,MAAM,EAAE;oBAC5B,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,SAAS,EAAE,OAAO,CAAC,SAAS;iBAC7B,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ;YAC1B,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC1B,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { buildDesktop, startDesktopDev, TauriCliError } from \"@parlor/shell-desktop\";\n\nimport { CliError } from \"./errors.js\";\nimport { onShutdown } from \"./shutdown.js\";\nimport type { Target, TargetHandler } from \"./targets.js\";\n\nconst HOST_TARGET: Partial<Record<NodeJS.Platform, Target>> = {\n darwin: \"mac\",\n win32: \"windows\",\n linux: \"linux\",\n};\n\nexport function assertHostMatches(\n target: Target,\n platform: NodeJS.Platform = process.platform,\n) {\n const host = HOST_TARGET[platform];\n if (host !== target) {\n throw new CliError(\n `Target \"${target}\" can only be built on its own operating system. This machine builds \"${host ?? \"nothing\"}\".`,\n );\n }\n}\n\nasync function surfaceTauriErrors<T>(run: () => Promise<T>): Promise<T> {\n try {\n return await run();\n } catch (error) {\n if (error instanceof TauriCliError)\n throw new CliError(error.message, { cause: error });\n throw error;\n }\n}\n\nexport function desktopTarget(target: Target): TargetHandler {\n return {\n assertHost: () => assertHostMatches(target),\n async dev(loaded, options) {\n await surfaceTauriErrors(async () => {\n const controller = new AbortController();\n onShutdown(() => controller.abort());\n await startDesktopDev(loaded, {\n signal: controller.signal,\n appOrigin: options.appOrigin,\n });\n });\n },\n async build(loaded, _options) {\n assertHostMatches(target);\n const bundleDir = await surfaceTauriErrors(() => buildDesktop(loaded));\n console.log(`desktop bundles written to ${bundleDir}`);\n },\n };\n}\n"]}
@@ -5,8 +5,9 @@ export interface DevSession {
5
5
  }
6
6
  export declare const DEV_SESSION_FILE = "dev.json";
7
7
  /**
8
- * Claims the project for this `parlor dev`, so a second one cannot open the same database;
9
- * a claim whose process is gone is stale. `update` records the URLs once the ports are known.
8
+ * Claims the run's generated directory for this `parlor dev`, so a second one cannot open the
9
+ * same database; a claim whose process is gone is stale. `update` records the URLs once the
10
+ * ports are known.
10
11
  */
11
12
  export declare function claimDevSession(rootDir: string, targets: readonly string[], pid?: number): {
12
13
  update(urls: readonly string[]): void;
@@ -1 +1 @@
1
- {"version":3,"file":"dev-session.d.ts","sourceRoot":"","sources":["../src/dev-session.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,eAAO,MAAM,gBAAgB,aAAa,CAAC;AAgC3C;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,GAAG,GAAE,MAAoB,GACxB;IAAE,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,OAAO,IAAI,IAAI,CAAA;CAAE,CAwB5D"}
1
+ {"version":3,"file":"dev-session.d.ts","sourceRoot":"","sources":["../src/dev-session.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,eAAO,MAAM,gBAAgB,aAAa,CAAC;AAgC3C;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,GAAG,GAAE,MAAoB,GACxB;IAAE,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,OAAO,IAAI,IAAI,CAAA;CAAE,CAwB5D"}
@@ -1,6 +1,6 @@
1
1
  import { closeSync, mkdirSync, openSync, readFileSync, rmSync, writeFileSync, writeSync, } from "node:fs";
2
2
  import { dirname, join } from "node:path";
3
- import { GENERATED_DIR } from "@parlor/config";
3
+ import { GENERATED_DIR_ENV, generatedDir } from "@parlor/config";
4
4
  import { CliError } from "./errors.js";
5
5
  export const DEV_SESSION_FILE = "dev.json";
6
6
  function alive(pid) {
@@ -28,14 +28,15 @@ function running(owner) {
28
28
  const where = targets
29
29
  .map((target, index) => owner.urls[index] ? `${target} at ${owner.urls[index]}` : target)
30
30
  .join(", ");
31
- return `parlor dev is already running for this project (${where}, pid ${owner.pid}). A second one would open the same database. Stop it first, or run every target from one: parlor dev --target web,mac.`;
31
+ return `parlor dev is already running for this project (${where}, pid ${owner.pid}). A second one would open the same database. Stop it first, run every target from one: parlor dev --target web,mac, or give the second its own directory: ${GENERATED_DIR_ENV}=.parlor/second parlor dev.`;
32
32
  }
33
33
  /**
34
- * Claims the project for this `parlor dev`, so a second one cannot open the same database;
35
- * a claim whose process is gone is stale. `update` records the URLs once the ports are known.
34
+ * Claims the run's generated directory for this `parlor dev`, so a second one cannot open the
35
+ * same database; a claim whose process is gone is stale. `update` records the URLs once the
36
+ * ports are known.
36
37
  */
37
38
  export function claimDevSession(rootDir, targets, pid = process.pid) {
38
- const path = join(rootDir, GENERATED_DIR, DEV_SESSION_FILE);
39
+ const path = join(generatedDir(rootDir), DEV_SESSION_FILE);
39
40
  mkdirSync(dirname(path), { recursive: true });
40
41
  const write = (urls) => JSON.stringify({ pid, targets, urls });
41
42
  for (let attempt = 0; attempt < 2; attempt += 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"dev-session.js","sourceRoot":"","sources":["../src/dev-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev-session.js","sourceRoot":"","sources":["../src/dev-session.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n closeSync,\n mkdirSync,\n openSync,\n readFileSync,\n rmSync,\n writeFileSync,\n writeSync,\n} from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nimport { GENERATED_DIR_ENV, generatedDir } from \"@parlor/config\";\n\nimport { CliError } from \"./errors.js\";\n\nexport interface DevSession {\n readonly pid: number;\n readonly targets: readonly string[];\n readonly urls: readonly string[];\n}\n\nexport const DEV_SESSION_FILE = \"dev.json\";\n\nfunction alive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\nfunction read(path: string): DevSession | undefined {\n try {\n const session = JSON.parse(readFileSync(path, \"utf8\")) as Partial<DevSession>;\n return typeof session.pid === \"number\"\n ? { pid: session.pid, targets: session.targets ?? [], urls: session.urls ?? [] }\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction running(owner: DevSession): string {\n const targets = owner.targets.length > 0 ? owner.targets : [\"web\"];\n const where = targets\n .map((target, index) =>\n owner.urls[index] ? `${target} at ${owner.urls[index]}` : target,\n )\n .join(\", \");\n return `parlor dev is already running for this project (${where}, pid ${owner.pid}). A second one would open the same database. Stop it first, run every target from one: parlor dev --target web,mac, or give the second its own directory: ${GENERATED_DIR_ENV}=.parlor/second parlor dev.`;\n}\n\n/**\n * Claims the run's generated directory for this `parlor dev`, so a second one cannot open the\n * same database; a claim whose process is gone is stale. `update` records the URLs once the\n * ports are known.\n */\nexport function claimDevSession(\n rootDir: string,\n targets: readonly string[],\n pid: number = process.pid,\n): { update(urls: readonly string[]): void; release(): void } {\n const path = join(generatedDir(rootDir), DEV_SESSION_FILE);\n mkdirSync(dirname(path), { recursive: true });\n const write = (urls: readonly string[]) => JSON.stringify({ pid, targets, urls });\n for (let attempt = 0; attempt < 2; attempt += 1) {\n try {\n const fd = openSync(path, \"wx\");\n writeSync(fd, write([]));\n closeSync(fd);\n return {\n update: (urls) => writeFileSync(path, write(urls)),\n release: () => {\n if (read(path)?.pid === pid) rmSync(path, { force: true });\n },\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n const owner = read(path);\n if (owner && owner.pid !== pid && alive(owner.pid))\n throw new CliError(running(owner));\n rmSync(path, { force: true });\n }\n }\n throw new CliError(`Could not claim ${path} for parlor dev.`);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACf,IAAI,GAAW,UAAU,CAAC;CAC7C"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACf,IAAI,GAAW,UAAU,CAAC;CAC7C","sourcesContent":["export class CliError extends Error {\n override readonly name: string = \"CliError\";\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,CAAC,MAAM,QAAQ,GAA2C;IAC9D,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC;IAChC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC;IACjC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC;CAC9B,CAAC"}
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,CAAC,MAAM,QAAQ,GAA2C;IAC9D,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC;IAChC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC;IACjC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC;CAC9B,CAAC","sourcesContent":["import { desktopTarget } from \"./desktop-target.js\";\nimport { mobileTarget } from \"./mobile-target.js\";\nimport type { Target, TargetHandler } from \"./targets.js\";\nimport { webTarget } from \"./web-target.js\";\n\nexport const handlers: Partial<Record<Target, TargetHandler>> = {\n web: webTarget,\n ios: mobileTarget(\"ios\"),\n android: mobileTarget(\"android\"),\n mac: desktopTarget(\"mac\"),\n windows: desktopTarget(\"windows\"),\n linux: desktopTarget(\"linux\"),\n};\n"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,cAAc,EAEd,WAAW,EAEX,OAAO,GACR,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,cAAc,EAEd,WAAW,EAEX,OAAO,GACR,MAAM,cAAc,CAAC","sourcesContent":["export {\n parseTarget,\n resolveHandler,\n type Target,\n TargetError,\n type TargetHandler,\n TARGETS,\n} from \"./targets.js\";\n"]}
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE3D,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,IAAI,GAAG,aAAa,CAAC;IACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;IACnD,WAAW,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;CACtD,CAAC,CAAC;AAEH,SAAS,MAAM,CAAC,GAAW;IACzB,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,OAAiB;IAClC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,MAAM,UAAU,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,IAAI,CAAC;IACH,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,MAAM,kBAAkB,EAAE,CAAC;IAC3B,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE3D,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,IAAI,GAAG,aAAa,CAAC;IACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;IACnD,WAAW,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;CACtD,CAAC,CAAC;AAEH,SAAS,MAAM,CAAC,GAAW;IACzB,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,OAAiB;IAClC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,MAAM,UAAU,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,IAAI,CAAC;IACH,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,MAAM,kBAAkB,EAAE,CAAC;IAC3B,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,CAAC;AACd,CAAC","sourcesContent":["#!/usr/bin/env node\nimport { ConfigError } from \"@parlor/config\";\nimport { defineCommand, runCommand, runMain } from \"citty\";\n\nimport { add } from \"./commands/add.js\";\nimport { build } from \"./commands/build.js\";\nimport { db } from \"./commands/db.js\";\nimport { deploy } from \"./commands/deploy.js\";\nimport { dev } from \"./commands/dev.js\";\nimport { typegen } from \"./commands/typegen.js\";\nimport { CliError } from \"./errors.js\";\nimport { shutdownAfterError } from \"./shutdown.js\";\n\nconst main = defineCommand({\n meta: { name: \"parlor\", description: \"Parlor CLI\" },\n subCommands: { dev, build, deploy, db, add, typegen },\n});\n\nfunction isHelp(arg: string): boolean {\n return arg === \"--help\" || arg === \"-h\";\n}\n\nasync function run(rawArgs: string[]): Promise<void> {\n if (rawArgs.some(isHelp)) {\n await runMain(main, { rawArgs });\n return;\n }\n await runCommand(main, { rawArgs });\n}\n\ntry {\n await run(process.argv.slice(2));\n} catch (error) {\n await shutdownAfterError();\n if (error instanceof CliError || error instanceof ConfigError) {\n console.error(error.message);\n process.exit(1);\n }\n throw error;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mobile-target.js","sourceRoot":"","sources":["../src/mobile-target.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,iBAAiB,EAEjB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,MAAM,UAAU,aAAa,CAC3B,QAAwB,EACxB,IAAI,GAAoB,OAAO,CAAC,QAAQ;IAExC,IAAI,QAAQ,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,QAAQ,CAAC,0CAA0C,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAI,GAAqB;IAC5D,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,iBAAiB;YACpC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAwB;IACnD,OAAO;QACL,UAAU,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC;QACzC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO;YACvB,MAAM,sBAAsB,CAAC,KAAK,IAAI,EAAE;gBACtC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;gBACrC,MAAM,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE;oBACrC,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,SAAS,EAAE,OAAO,CAAC,SAAS;iBAC7B,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ;YAC1B,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,CACnD,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAC9B,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,sBAAsB,UAAU,EAAE,CAAC,CAAC;QAC7D,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"mobile-target.js","sourceRoot":"","sources":["../src/mobile-target.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,iBAAiB,EAEjB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,MAAM,UAAU,aAAa,CAC3B,QAAwB,EACxB,IAAI,GAAoB,OAAO,CAAC,QAAQ;IAExC,IAAI,QAAQ,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,QAAQ,CAAC,0CAA0C,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAI,GAAqB;IAC5D,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,iBAAiB;YACpC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAwB;IACnD,OAAO;QACL,UAAU,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC;QACzC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO;YACvB,MAAM,sBAAsB,CAAC,KAAK,IAAI,EAAE;gBACtC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;gBACrC,MAAM,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE;oBACrC,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,SAAS,EAAE,OAAO,CAAC,SAAS;iBAC7B,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ;YAC1B,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,CACnD,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAC9B,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,sBAAsB,UAAU,EAAE,CAAC,CAAC;QAC7D,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import {\n buildMobile,\n CapacitorCliError,\n type MobilePlatform,\n startMobileDev,\n} from \"@parlor/shell-mobile\";\n\nimport { CliError } from \"./errors.js\";\nimport { onShutdown } from \"./shutdown.js\";\nimport type { TargetHandler } from \"./targets.js\";\n\nexport function assertIosHost(\n platform: MobilePlatform,\n host: NodeJS.Platform = process.platform,\n) {\n if (platform === \"ios\" && host !== \"darwin\") {\n throw new CliError('Target \"ios\" can only be built on macOS.');\n }\n}\n\nasync function surfaceCapacitorErrors<T>(run: () => Promise<T>): Promise<T> {\n try {\n return await run();\n } catch (error) {\n if (error instanceof CapacitorCliError)\n throw new CliError(error.message, { cause: error });\n throw error;\n }\n}\n\nexport function mobileTarget(platform: MobilePlatform): TargetHandler {\n return {\n assertHost: () => assertIosHost(platform),\n async dev(loaded, options) {\n await surfaceCapacitorErrors(async () => {\n const controller = new AbortController();\n onShutdown(() => controller.abort());\n await startMobileDev(loaded, platform, {\n device: options.device,\n signal: controller.signal,\n appOrigin: options.appOrigin,\n });\n });\n },\n async build(loaded, _options) {\n assertIosHost(platform);\n const projectDir = await surfaceCapacitorErrors(() =>\n buildMobile(loaded, platform),\n );\n console.log(`${platform} project synced at ${projectDir}`);\n },\n };\n}\n"]}
package/dist/ports.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ports.js","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"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","sourcesContent":["import { createServer } from \"node:net\";\n\nimport { CliError } from \"./errors.js\";\n\n// The server binds every interface and Vite binds `localhost`, so a holder on any of these takes the port.\nconst HOSTS = [\"0.0.0.0\", \"::\", \"127.0.0.1\", \"::1\"] as const;\nconst NO_SUCH_ADDRESS = new Set([\"EADDRNOTAVAIL\", \"EAFNOSUPPORT\"]);\nconst ATTEMPTS = 100;\n\nfunction bindable(port: number, host: string): Promise<boolean> {\n return new Promise((resolve) => {\n const server = createServer();\n server.once(\"error\", (error: NodeJS.ErrnoException) =>\n resolve(NO_SUCH_ADDRESS.has(error.code ?? \"\")),\n );\n server.listen({ port, host, exclusive: true }, () =>\n server.close(() => resolve(true)),\n );\n });\n}\n\nexport async function isPortFree(port: number): Promise<boolean> {\n for (const host of HOSTS) {\n if (!(await bindable(port, host))) return false;\n }\n return true;\n}\n\nexport async function firstFreePort(\n from: number,\n taken: ReadonlySet<number> = new Set(),\n): Promise<number> {\n for (let port = from; port < from + ATTEMPTS && port <= 65_535; port += 1) {\n if (!taken.has(port) && (await isPortFree(port))) return port;\n }\n throw new CliError(`No free port from ${from} to ${from + ATTEMPTS - 1}.`);\n}\n\nexport interface DevPorts {\n readonly server: number;\n /** One per target, in the order asked; the first starts at the wanted web port. */\n readonly web: readonly number[];\n}\n\n/** Moves each busy port to the next free one, saying so, as Vite and Next.js do. */\nexport async function resolveDevPorts(\n wanted: { readonly server: number; readonly web: number; readonly targets?: number },\n log: (line: string) => void = console.log,\n): Promise<DevPorts> {\n const server = await firstFreePort(wanted.server);\n const taken = new Set([server]);\n const web: number[] = [];\n for (let index = 0; index < (wanted.targets ?? 1); index += 1) {\n const port = await firstFreePort(web.at(-1) ?? wanted.web, taken);\n taken.add(port);\n web.push(port);\n }\n if (server !== wanted.server) {\n log(`Port ${wanted.server} is in use, so the server uses ${server}.`);\n }\n if (web[0] !== wanted.web)\n log(`Port ${wanted.web} is in use, so the page uses ${web[0]}.`);\n return { server, web };\n}\n"]}
@@ -1,18 +1,33 @@
1
- import { resolve } from "node:path";
1
+ import { join } from "node:path";
2
2
  import { pathToFileURL } from "node:url";
3
+ import { parseArgs } from "node:util";
3
4
  import { UI_MANIFEST_FILE } from "@parlor/agent-ui";
4
5
  import { fileManifestSource } from "@parlor/agent-ui/server";
5
- import { GENERATED_DIR } from "@parlor/config";
6
+ import { generatedDir } from "@parlor/config";
6
7
  import { serve } from "srvx";
8
+ import { registerCloudflareWorkers } from "./cloudflare/loader.js";
9
+ import { startCloudflarePlatform } from "./cloudflare/platform.js";
7
10
  import { onShutdown } from "./shutdown.js";
8
- const entry = process.argv[2];
11
+ const { positionals: [entry], values: options, } = parseArgs({ allowPositionals: true, options: { cloudflare: { type: "string" } } });
9
12
  if (!entry)
10
13
  throw new Error("serve-entry needs the server entry path");
11
- const loaded = (await import(pathToFileURL(entry).href));
14
+ const cloudflare = options.cloudflare
15
+ ? await startCloudflarePlatform(process.cwd(), JSON.parse(options.cloudflare))
16
+ : undefined;
17
+ registerCloudflareWorkers();
18
+ const loaded = (await import(pathToFileURL(entry).href).catch(async (error) => {
19
+ await cloudflare?.dispose();
20
+ throw error;
21
+ }));
12
22
  const handler = loaded.default?.fetch;
13
- loaded.default?.installUiManifest?.(fileManifestSource(resolve(GENERATED_DIR, UI_MANIFEST_FILE)));
23
+ loaded.default?.installUiManifest?.(fileManifestSource(join(generatedDir(process.cwd()), UI_MANIFEST_FILE)));
24
+ if (handler || cloudflare) {
25
+ onShutdown(async () => {
26
+ await loaded.default?.close?.();
27
+ await cloudflare?.dispose();
28
+ });
29
+ }
14
30
  if (handler) {
15
- onShutdown(() => loaded.default?.close?.());
16
31
  const port = Number(process.env.PORT ?? 3000);
17
32
  serve({ fetch: (request) => handler(request), port, silent: true });
18
33
  console.log(`parlor server listening on http://localhost:${port}`);
@@ -1 +1 @@
1
- {"version":3,"file":"serve-entry.js","sourceRoot":"","sources":["../src/serve-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAyB,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9B,IAAI,CAAC,KAAK;IAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAEvE,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAMtD,CAAC;AACF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;AACtC,MAAM,CAAC,OAAO,EAAE,iBAAiB,EAAE,CACjC,kBAAkB,CAAC,OAAO,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC,CAC7D,CAAC;AAEF,IAAI,OAAO,EAAE,CAAC;IACZ,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,+CAA+C,IAAI,EAAE,CAAC,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"serve-entry.js","sourceRoot":"","sources":["../src/serve-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAyB,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,EACJ,WAAW,EAAE,CAAC,KAAK,CAAC,EACpB,MAAM,EAAE,OAAO,GAChB,GAAG,SAAS,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AACvF,IAAI,CAAC,KAAK;IAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAEvE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU;IACnC,CAAC,CAAC,MAAM,uBAAuB,CAC3B,OAAO,CAAC,GAAG,EAAE,EACb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAkB,CAChD;IACH,CAAC,CAAC,SAAS,CAAC;AACd,yBAAyB,EAAE,CAAC;AAE5B,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAc,EAAE,EAAE;IACrF,MAAM,UAAU,EAAE,OAAO,EAAE,CAAC;IAC5B,MAAM,KAAK,CAAC;AACd,CAAC,CAAC,CAMD,CAAC;AACF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;AACtC,MAAM,CAAC,OAAO,EAAE,iBAAiB,EAAE,CACjC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC,CACxE,CAAC;AAEF,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;IAC1B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;QAChC,MAAM,UAAU,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AACD,IAAI,OAAO,EAAE,CAAC;IACZ,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,+CAA+C,IAAI,EAAE,CAAC,CAAC;AACrE,CAAC","sourcesContent":["import { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { parseArgs } from \"node:util\";\n\nimport { UI_MANIFEST_FILE } from \"@parlor/agent-ui\";\nimport { fileManifestSource, type UiManifestSource } from \"@parlor/agent-ui/server\";\nimport { generatedDir } from \"@parlor/config\";\nimport { serve } from \"srvx\";\n\nimport { registerCloudflareWorkers } from \"./cloudflare/loader.js\";\nimport { startCloudflarePlatform } from \"./cloudflare/platform.js\";\nimport type { CloudflareDev } from \"./cloudflare/prepare.js\";\nimport { onShutdown } from \"./shutdown.js\";\n\nconst {\n positionals: [entry],\n values: options,\n} = parseArgs({ allowPositionals: true, options: { cloudflare: { type: \"string\" } } });\nif (!entry) throw new Error(\"serve-entry needs the server entry path\");\n\nconst cloudflare = options.cloudflare\n ? await startCloudflarePlatform(\n process.cwd(),\n JSON.parse(options.cloudflare) as CloudflareDev,\n )\n : undefined;\nregisterCloudflareWorkers();\n\nconst loaded = (await import(pathToFileURL(entry).href).catch(async (error: unknown) => {\n await cloudflare?.dispose();\n throw error;\n})) as {\n default?: {\n fetch?: (request: Request) => Promise<Response> | Response;\n installUiManifest?: (source: UiManifestSource) => void;\n close?: () => Promise<void>;\n };\n};\nconst handler = loaded.default?.fetch;\nloaded.default?.installUiManifest?.(\n fileManifestSource(join(generatedDir(process.cwd()), UI_MANIFEST_FILE)),\n);\n\nif (handler || cloudflare) {\n onShutdown(async () => {\n await loaded.default?.close?.();\n await cloudflare?.dispose();\n });\n}\nif (handler) {\n const port = Number(process.env.PORT ?? 3000);\n serve({ fetch: (request) => handler(request), port, silent: true });\n console.log(`parlor server listening on http://localhost:${port}`);\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { type ChildProcess } from "node:child_process";
2
2
  import { type LoadedConfig, type ParlorConfig } from "@parlor/config";
3
+ import type { CloudflareDev } from "./cloudflare/prepare.js";
3
4
  /**
4
5
  * The first of `frontends` is the app's origin; the others are the other targets of the same
5
6
  * `parlor dev`, which the server trusts too.
@@ -9,5 +10,5 @@ export declare const SERVER_SELF_EXIT_GRACE_MS = 2000;
9
10
  export declare function stopServerProcess(child: ChildProcess, graceMs?: number): Promise<void>;
10
11
  /** Lets the page's first requests reach the server instead of failing in Vite's proxy. */
11
12
  export declare function untilListening(child: ChildProcess, port: number, intervalMs?: number): Promise<void>;
12
- export declare function startServerProcess({ config, rootDir }: LoadedConfig, frontends?: readonly string[]): ChildProcess;
13
+ export declare function startServerProcess({ config, rootDir }: LoadedConfig, frontends?: readonly string[], cloudflare?: CloudflareDev): ChildProcess;
13
14
  //# sourceMappingURL=server-process.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-process.d.ts","sourceRoot":"","sources":["../src/server-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,oBAAoB,CAAC;AAM9D,OAAO,EAAgB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAMpF;;;GAGG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,MAAM,CAAC,UAAwB,EACrC,SAAS,GAAE,SAAS,MAAM,EAA4C,GACrE,MAAM,CAAC,UAAU,CAUnB;AAED,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAG9C,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,MAAkC,GAC1C,OAAO,CAAC,IAAI,CAAC,CASf;AAaD,0FAA0F;AAC1F,wBAAsB,cAAc,CAClC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,EACZ,UAAU,SAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAgB,kBAAkB,CAChC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,YAAY,EACjC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAC5B,YAAY,CAkBd"}
1
+ {"version":3,"file":"server-process.d.ts","sourceRoot":"","sources":["../src/server-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,oBAAoB,CAAC;AAM9D,OAAO,EAAgB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAK7D;;;GAGG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,YAAY,EACpB,IAAI,GAAE,MAAM,CAAC,UAAwB,EACrC,SAAS,GAAE,SAAS,MAAM,EAA4C,GACrE,MAAM,CAAC,UAAU,CAUnB;AAED,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAG9C,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,MAAkC,GAC1C,OAAO,CAAC,IAAI,CAAC,CASf;AAaD,0FAA0F;AAC1F,wBAAsB,cAAc,CAClC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,EACZ,UAAU,SAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAgB,kBAAkB,CAChC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,YAAY,EACjC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,EAC7B,UAAU,CAAC,EAAE,aAAa,GACzB,YAAY,CAyBd"}
@@ -53,11 +53,18 @@ export async function untilListening(child, port, intervalMs = 100) {
53
53
  await new Promise((resolve) => setTimeout(resolve, intervalMs));
54
54
  }
55
55
  }
56
- export function startServerProcess({ config, rootDir }, frontends) {
56
+ export function startServerProcess({ config, rootDir }, frontends, cloudflare) {
57
57
  const tsxBin = require.resolve("tsx/cli");
58
58
  const runner = new URL("./serve-entry.ts", import.meta.url).pathname.replace(/\.ts$/, import.meta.url.endsWith(".js") ? ".js" : ".ts");
59
59
  const entry = join(rootDir, config.server.entry);
60
- const child = spawn(process.execPath, [tsxBin, "watch", "--clear-screen=false", runner, entry], {
60
+ const child = spawn(process.execPath, [
61
+ tsxBin,
62
+ "watch",
63
+ "--clear-screen=false",
64
+ runner,
65
+ entry,
66
+ ...(cloudflare ? [`--cloudflare=${JSON.stringify(cloudflare)}`] : []),
67
+ ], {
61
68
  cwd: rootDir,
62
69
  stdio: "inherit",
63
70
  env: serverEnv(config, process.env, frontends),
@@ -1 +1 @@
1
- {"version":3,"file":"server-process.js","sourceRoot":"","sources":["../src/server-process.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server-process.js","sourceRoot":"","sources":["../src/server-process.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport { once } from \"node:events\";\nimport { createRequire } from \"node:module\";\nimport { connect } from \"node:net\";\nimport { join } from \"node:path\";\n\nimport { appServerEnv, type LoadedConfig, type ParlorConfig } from \"@parlor/config\";\n\nimport type { CloudflareDev } from \"./cloudflare/prepare.js\";\nimport { onShutdown } from \"./shutdown.js\";\n\nconst require = createRequire(import.meta.url);\n\n/**\n * The first of `frontends` is the app's origin; the others are the other targets of the same\n * `parlor dev`, which the server trusts too.\n */\nexport function serverEnv(\n config: ParlorConfig,\n base: NodeJS.ProcessEnv = process.env,\n frontends: readonly string[] = [`http://localhost:${config.web.port}`],\n): NodeJS.ProcessEnv {\n const [origin, ...others] = frontends;\n return {\n ...base,\n PORT: String(config.server.port),\n PARLOR_WEB_ORIGIN: origin,\n ...(others.length > 0 ? { PARLOR_DEV_ORIGINS: others.join(\",\") } : {}),\n PARLOR_DEV: \"1\",\n ...appServerEnv(config),\n };\n}\n\nexport const SERVER_SELF_EXIT_GRACE_MS = 2000;\n\n// A second signal makes tsx watch SIGKILL its child, and the process group usually delivered the first.\nexport async function stopServerProcess(\n child: ChildProcess,\n graceMs: number = SERVER_SELF_EXIT_GRACE_MS,\n): Promise<void> {\n if (child.exitCode !== null || child.signalCode !== null) return;\n const exited = once(child, \"exit\");\n const nudge = setTimeout(() => child.kill(\"SIGTERM\"), graceMs);\n try {\n await exited;\n } finally {\n clearTimeout(nudge);\n }\n}\n\nfunction accepts(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = connect(port, \"localhost\");\n socket.once(\"connect\", () => {\n socket.destroy();\n resolve(true);\n });\n socket.once(\"error\", () => resolve(false));\n });\n}\n\n/** Lets the page's first requests reach the server instead of failing in Vite's proxy. */\nexport async function untilListening(\n child: ChildProcess,\n port: number,\n intervalMs = 100,\n): Promise<void> {\n while (child.exitCode === null && child.signalCode === null) {\n if (await accepts(port)) return;\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n}\n\nexport function startServerProcess(\n { config, rootDir }: LoadedConfig,\n frontends?: readonly string[],\n cloudflare?: CloudflareDev,\n): ChildProcess {\n const tsxBin = require.resolve(\"tsx/cli\");\n const runner = new URL(\"./serve-entry.ts\", import.meta.url).pathname.replace(\n /\\.ts$/,\n import.meta.url.endsWith(\".js\") ? \".js\" : \".ts\",\n );\n const entry = join(rootDir, config.server.entry);\n const child = spawn(\n process.execPath,\n [\n tsxBin,\n \"watch\",\n \"--clear-screen=false\",\n runner,\n entry,\n ...(cloudflare ? [`--cloudflare=${JSON.stringify(cloudflare)}`] : []),\n ],\n {\n cwd: rootDir,\n stdio: \"inherit\",\n env: serverEnv(config, process.env, frontends),\n },\n );\n onShutdown((signaled) => stopServerProcess(child, signaled ? undefined : 0));\n return child;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"serverless-warning.js","sourceRoot":"","sources":["../src/serverless-warning.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GACzC,uSAAuS,CAAC;AAE1S,wFAAwF;AACxF,MAAM,UAAU,iBAAiB,CAAC,aAA6B;IAC7D,OAAO,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/E,CAAC"}
1
+ {"version":3,"file":"serverless-warning.js","sourceRoot":"","sources":["../src/serverless-warning.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GACzC,uSAAuS,CAAC;AAE1S,wFAAwF;AACxF,MAAM,UAAU,iBAAiB,CAAC,aAA6B;IAC7D,OAAO,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/E,CAAC","sourcesContent":["export const SERVERLESS_UNSUPPORTED_WARNING =\n \"Warning: serverless presets are not supported yet. Pages and actions work, but agents cannot see or use the screen (ui_* tools), actions that need the user's approval always fail when an agent calls them, and the agent sidebar replies without streaming. Deploy with node-server or bun for now.\";\n\n/** A build whose sync polls is a serverless one: its functions cannot hold a stream. */\nexport function serverlessWarning(syncTransport: \"sse\" | \"poll\"): string | undefined {\n return syncTransport === \"poll\" ? SERVERLESS_UNSUPPORTED_WARNING : undefined;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"AAGA,MAAM,QAAQ,GAAc,EAAE,CAAC;AAC/B,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,KAAK,UAAU,WAAW,CAAC,QAAiB;IAC1C,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,MAAsB;IAC5C,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,IAAI,SAAS;QAAE,OAAO;IACtB,SAAS,GAAG,IAAI,CAAC;IACjB,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"AAGA,MAAM,QAAQ,GAAc,EAAE,CAAC;AAC/B,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,KAAK,UAAU,WAAW,CAAC,QAAiB;IAC1C,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,MAAsB;IAC5C,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,IAAI,SAAS;QAAE,OAAO;IACtB,SAAS,GAAG,IAAI,CAAC;IACjB,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC","sourcesContent":["/** `signaled` is false when the CLI stops on its own error, so no signal reached its children. */\ntype Cleanup = (signaled: boolean) => void | Promise<void>;\n\nconst cleanups: Cleanup[] = [];\nlet installed = false;\n\nasync function runCleanups(signaled: boolean): Promise<void> {\n await Promise.allSettled(cleanups.splice(0).map((cleanup) => cleanup(signaled)));\n}\n\nasync function shutdown(signal: NodeJS.Signals): Promise<void> {\n await runCleanups(true);\n process.kill(process.pid, signal);\n}\n\nexport function shutdownAfterError(): Promise<void> {\n return runCleanups(false);\n}\n\nexport function onShutdown(cleanup: Cleanup): void {\n cleanups.push(cleanup);\n if (installed) return;\n installed = true;\n for (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n process.once(signal, () => void shutdown(signal));\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC;AAqBrF,MAAM,OAAO,WAAY,SAAQ,QAAQ;IACrB,IAAI,GAAG,aAAa,CAAC;CACxC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAgB,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,WAAW,CACnB,mBAAmB,MAAM,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrE,CAAC;IACJ,CAAC;IACD,OAAO,MAAgB,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,KAAK,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACxD,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,QAAgD,EAChD,MAAc;IAEd,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,WAAW,CAAC,WAAW,MAAM,wBAAwB,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC;AAqBrF,MAAM,OAAO,WAAY,SAAQ,QAAQ;IACrB,IAAI,GAAG,aAAa,CAAC;CACxC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAgB,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,WAAW,CACnB,mBAAmB,MAAM,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrE,CAAC;IACJ,CAAC;IACD,OAAO,MAAgB,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,KAAK,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACxD,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,QAAgD,EAChD,MAAc;IAEd,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,WAAW,CAAC,WAAW,MAAM,wBAAwB,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import type { LoadedConfig } from \"@parlor/config\";\n\nimport { CliError } from \"./errors.js\";\n\nexport const TARGETS = [\"web\", \"ios\", \"android\", \"mac\", \"windows\", \"linux\"] as const;\nexport type Target = (typeof TARGETS)[number];\n\nexport interface DevOptions {\n readonly device?: string | undefined;\n /** The web target's origin when this target runs next to it, so both pair once. */\n readonly appOrigin?: string | undefined;\n}\n\nexport interface BuildOptions {\n readonly preset?: string | undefined;\n}\n\nexport interface TargetHandler {\n /** Throws when this machine cannot run the target, before `parlor dev` starts anything. */\n assertHost?(): void;\n /** Starts this target's frontend; `parlor dev` already runs the server it talks to. */\n dev(loaded: LoadedConfig, options: DevOptions): Promise<void>;\n build(loaded: LoadedConfig, options: BuildOptions): Promise<void>;\n}\n\nexport class TargetError extends CliError {\n override readonly name = \"TargetError\";\n}\n\nexport function parseTarget(value: unknown): Target {\n const target = value === undefined ? \"web\" : String(value);\n if (!TARGETS.includes(target as Target)) {\n throw new TargetError(\n `Unknown target \"${target}\". Expected one of: ${TARGETS.join(\", \")}`,\n );\n }\n return target as Target;\n}\n\n/** `web,mac` runs both against one server; the first is the default `web`. */\nexport function parseTargets(value: unknown): readonly Target[] {\n const names = (value === undefined ? \"web\" : String(value))\n .split(\",\")\n .map((name) => name.trim())\n .filter(Boolean);\n const targets = [...new Set(names.map(parseTarget))];\n if (targets.length === 0) return [\"web\"];\n return targets;\n}\n\nexport function resolveHandler(\n handlers: Partial<Record<Target, TargetHandler>>,\n target: Target,\n): TargetHandler {\n const handler = handlers[target];\n if (!handler) {\n throw new TargetError(`Target \"${target}\" is not supported yet`);\n }\n return handler;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"web-target.d.ts","sourceRoot":"","sources":["../src/web-target.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;AAMtB,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMhE,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAiB5B;AAED,eAAO,MAAM,SAAS,EAAE,aAkBvB,CAAC"}
1
+ {"version":3,"file":"web-target.d.ts","sourceRoot":"","sources":["../src/web-target.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;AAMtB,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMhE,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAqB5B;AAED,eAAO,MAAM,SAAS,EAAE,aAkBvB,CAAC"}
@@ -1,5 +1,5 @@
1
- import { buildServer, PresetError, resolvePreset, } from "@parlor/host";
2
- import { buildWeb, startWebDev } from "@parlor/shell-web";
1
+ import { buildServer, PresetError, renderConditionsFor, resolvePreset, } from "@parlor/host";
2
+ import { buildRender, buildWeb, startWebDev } from "@parlor/shell-web";
3
3
  import { CliError } from "./errors.js";
4
4
  import { serverlessWarning } from "./serverless-warning.js";
5
5
  import { onShutdown } from "./shutdown.js";
@@ -11,8 +11,13 @@ export async function buildWebAndServer(loaded, options) {
11
11
  console.log(`web build written to ${outDir}`);
12
12
  try {
13
13
  const { preset, reason } = resolvePreset(options.preset, loaded.config.deploy.preset);
14
+ const render = loaded.config.web.ssr
15
+ ? await buildRender(loaded, { conditions: renderConditionsFor(preset) })
16
+ : undefined;
17
+ if (render)
18
+ console.log(`server render build written to ${render}`);
14
19
  console.log(`building server for ${preset} (${reason})`);
15
- const result = await buildServer(loaded, { preset });
20
+ const result = await buildServer(loaded, { preset, render });
16
21
  console.log(`server build written to ${result.outputDir} (sync: ${result.syncTransport})`);
17
22
  const warning = serverlessWarning(result.syncTransport);
18
23
  if (warning)
@@ -1 +1 @@
1
- {"version":3,"file":"web-target.js","sourceRoot":"","sources":["../src/web-target.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,WAAW,EACX,aAAa,GAEd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAoB,EACpB,OAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CACT,2BAA2B,MAAM,CAAC,SAAS,WAAW,MAAM,CAAC,aAAa,GAAG,CAC9E,CAAC;QACF,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW;YAAE,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACtF,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAkB;IACtC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YAC3E,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,QAAQ,CAChB,QAAQ,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,yDAAyD,EACvF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO;QACzB,MAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"web-target.js","sourceRoot":"","sources":["../src/web-target.ts"],"names":[],"mappings":"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","sourcesContent":["import type { LoadedConfig } from \"@parlor/config\";\nimport {\n buildServer,\n PresetError,\n renderConditionsFor,\n resolvePreset,\n type ServerBuildResult,\n} from \"@parlor/host\";\nimport { buildRender, buildWeb, startWebDev } from \"@parlor/shell-web\";\n\nimport { CliError } from \"./errors.js\";\nimport { serverlessWarning } from \"./serverless-warning.js\";\nimport { onShutdown } from \"./shutdown.js\";\nimport type { BuildOptions, TargetHandler } from \"./targets.js\";\n\nfunction isPortInUse(error: unknown): boolean {\n return error instanceof Error && /already in use/.test(error.message);\n}\n\nexport async function buildWebAndServer(\n loaded: LoadedConfig,\n options: BuildOptions,\n): Promise<ServerBuildResult> {\n const outDir = await buildWeb(loaded);\n console.log(`web build written to ${outDir}`);\n try {\n const { preset, reason } = resolvePreset(options.preset, loaded.config.deploy.preset);\n const render = loaded.config.web.ssr\n ? await buildRender(loaded, { conditions: renderConditionsFor(preset) })\n : undefined;\n if (render) console.log(`server render build written to ${render}`);\n console.log(`building server for ${preset} (${reason})`);\n const result = await buildServer(loaded, { preset, render });\n console.log(\n `server build written to ${result.outputDir} (sync: ${result.syncTransport})`,\n );\n const warning = serverlessWarning(result.syncTransport);\n if (warning) console.warn(warning);\n return result;\n } catch (error) {\n if (error instanceof PresetError) throw new CliError(error.message, { cause: error });\n throw error;\n }\n}\n\nexport const webTarget: TargetHandler = {\n async dev(loaded, options) {\n try {\n const server = await startWebDev(loaded, { appOrigin: options.appOrigin });\n onShutdown(() => server.close());\n } catch (error) {\n if (isPortInUse(error)) {\n throw new CliError(\n `Port ${loaded.config.web.port} was taken while parlor dev was starting. Run it again.`,\n { cause: error },\n );\n }\n throw error;\n }\n },\n async build(loaded, options) {\n await buildWebAndServer(loaded, options);\n },\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parlor/cli",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "homepage": "https://cychien.github.io/parlor",
5
5
  "bugs": "https://github.com/cychien/parlor/issues",
6
6
  "license": "MIT",
@@ -27,21 +27,33 @@
27
27
  "drizzle-kit": "^0.31.11",
28
28
  "srvx": "^1.0.5",
29
29
  "tsx": "^4.23.15",
30
- "@parlor/agent-host": "0.1.0",
31
- "@parlor/config": "0.1.0",
32
- "@parlor/agent-ui": "0.1.0",
33
- "@parlor/shell-web": "0.1.0",
34
- "@parlor/host": "0.1.0",
35
- "@parlor/scaffold": "0.1.0",
36
- "@parlor/data": "0.1.0",
37
- "@parlor/shell-desktop": "0.1.0",
38
- "@parlor/shell-mobile": "0.1.0"
30
+ "@parlor/config": "0.3.0",
31
+ "@parlor/shell-desktop": "0.3.0",
32
+ "@parlor/agent-ui": "0.3.0",
33
+ "@parlor/data": "0.3.0",
34
+ "@parlor/shell-web": "0.3.0",
35
+ "@parlor/agent-host": "0.3.0",
36
+ "@parlor/host": "0.3.0",
37
+ "@parlor/scaffold": "0.3.0",
38
+ "@parlor/shell-mobile": "0.3.0"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/node": "^24.14.0",
42
42
  "drizzle-orm": "^0.45.4",
43
43
  "typescript": "^7.0.2",
44
- "vitest": "^5.0.3"
44
+ "vitest": "^5.0.3",
45
+ "wrangler": "^4.152.0",
46
+ "zod": "^4.6.5",
47
+ "@parlor/core": "0.3.0",
48
+ "@parlor/server": "0.3.0"
49
+ },
50
+ "peerDependencies": {
51
+ "wrangler": "^4.152.0"
52
+ },
53
+ "peerDependenciesMeta": {
54
+ "wrangler": {
55
+ "optional": true
56
+ }
45
57
  },
46
58
  "scripts": {
47
59
  "build": "tsc -p tsconfig.json",