@parlor/cli 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +19 -2
- package/dist/agent-host-process.d.ts +22 -0
- package/dist/agent-host-process.d.ts.map +1 -0
- package/dist/agent-host-process.js +35 -0
- package/dist/agent-host-process.js.map +1 -0
- package/dist/chat-warning.d.ts +8 -0
- package/dist/chat-warning.d.ts.map +1 -0
- package/dist/chat-warning.js +13 -0
- package/dist/chat-warning.js.map +1 -0
- package/dist/commands/add.d.ts +32 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +79 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/build.d.ts +12 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +27 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/db.d.ts +12 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +131 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/deploy.d.ts +8 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +44 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +22 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +86 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/typegen.d.ts +2 -0
- package/dist/commands/typegen.d.ts.map +1 -0
- package/dist/commands/typegen.js +13 -0
- package/dist/commands/typegen.js.map +1 -0
- package/dist/desktop-target.d.ts +4 -0
- package/dist/desktop-target.d.ts.map +1 -0
- package/dist/desktop-target.js +45 -0
- package/dist/desktop-target.js.map +1 -0
- package/dist/dev-session.d.ts +15 -0
- package/dist/dev-session.d.ts.map +1 -0
- package/dist/dev-session.js +65 -0
- package/dist/dev-session.js.map +1 -0
- package/dist/errors.d.ts +4 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +4 -0
- package/dist/errors.js.map +1 -0
- package/dist/handlers.d.ts +3 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +12 -0
- package/dist/handlers.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +37 -0
- package/dist/main.js.map +1 -0
- package/dist/mobile-target.d.ts +5 -0
- package/dist/mobile-target.d.ts.map +1 -0
- package/dist/mobile-target.js +40 -0
- package/dist/mobile-target.js.map +1 -0
- package/dist/ports.d.ts +14 -0
- package/dist/ports.d.ts.map +1 -0
- package/dist/ports.js +45 -0
- package/dist/ports.js.map +1 -0
- package/dist/serve-entry.d.ts +2 -0
- package/dist/serve-entry.d.ts.map +1 -0
- package/dist/serve-entry.js +20 -0
- package/dist/serve-entry.js.map +1 -0
- package/dist/server-process.d.ts +13 -0
- package/dist/server-process.d.ts.map +1 -0
- package/dist/server-process.js +68 -0
- package/dist/server-process.js.map +1 -0
- package/dist/serverless-warning.d.ts +4 -0
- package/dist/serverless-warning.d.ts.map +1 -0
- package/dist/serverless-warning.js +6 -0
- package/dist/serverless-warning.js.map +1 -0
- package/dist/shutdown.d.ts +6 -0
- package/dist/shutdown.d.ts.map +1 -0
- package/dist/shutdown.js +22 -0
- package/dist/shutdown.js.map +1 -0
- package/dist/targets.d.ts +27 -0
- package/dist/targets.d.ts.map +1 -0
- package/dist/targets.js +31 -0
- package/dist/targets.js.map +1 -0
- package/dist/web-target.d.ts +6 -0
- package/dist/web-target.d.ts.map +1 -0
- package/dist/web-target.js +45 -0
- package/dist/web-target.js.map +1 -0
- package/package.json +48 -3
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { loadParlorConfig } from "@parlor/config";
|
|
2
|
+
import { inspectServerEntry } from "@parlor/scaffold";
|
|
3
|
+
import { defineCommand } from "citty";
|
|
4
|
+
import { startDevAgentHost } from "../agent-host-process.js";
|
|
5
|
+
import { claimDevSession } from "../dev-session.js";
|
|
6
|
+
import { CliError } from "../errors.js";
|
|
7
|
+
import { handlers } from "../handlers.js";
|
|
8
|
+
import { resolveDevPorts } from "../ports.js";
|
|
9
|
+
import { startServerProcess, untilListening } from "../server-process.js";
|
|
10
|
+
import { onShutdown } from "../shutdown.js";
|
|
11
|
+
import { parseTargets, resolveHandler } from "../targets.js";
|
|
12
|
+
export function parsePort(value) {
|
|
13
|
+
if (value === undefined)
|
|
14
|
+
return undefined;
|
|
15
|
+
const port = Number(value);
|
|
16
|
+
if (!Number.isInteger(port) || port <= 0 || port > 65535) {
|
|
17
|
+
throw new CliError(`Invalid --port "${String(value)}"`);
|
|
18
|
+
}
|
|
19
|
+
return port;
|
|
20
|
+
}
|
|
21
|
+
export const dev = defineCommand({
|
|
22
|
+
meta: { name: "dev", description: "Run the app in development mode" },
|
|
23
|
+
args: {
|
|
24
|
+
target: {
|
|
25
|
+
type: "string",
|
|
26
|
+
description: "web | ios | android | mac | windows | linux, or several joined by commas (web,mac) to run them against one server",
|
|
27
|
+
default: "web",
|
|
28
|
+
},
|
|
29
|
+
port: {
|
|
30
|
+
type: "string",
|
|
31
|
+
description: "Override web.port from parlor.config.ts; a busy port moves to the next free one",
|
|
32
|
+
},
|
|
33
|
+
device: {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: "Simulator or device name for ios and android",
|
|
36
|
+
},
|
|
37
|
+
"agent-host": {
|
|
38
|
+
type: "boolean",
|
|
39
|
+
default: true,
|
|
40
|
+
description: "Serve the chat with this computer's agents (--no-agent-host to skip)",
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
async run({ args }) {
|
|
44
|
+
const targets = parseTargets(args.target);
|
|
45
|
+
const targetHandlers = targets.map((target) => resolveHandler(handlers, target));
|
|
46
|
+
for (const handler of targetHandlers)
|
|
47
|
+
handler.assertHost?.();
|
|
48
|
+
const configured = await loadParlorConfig();
|
|
49
|
+
const port = parsePort(args.port);
|
|
50
|
+
const session = claimDevSession(configured.rootDir, targets);
|
|
51
|
+
onShutdown(() => session.release());
|
|
52
|
+
const ports = await resolveDevPorts({
|
|
53
|
+
server: configured.config.server.port,
|
|
54
|
+
web: port ?? configured.config.web.port,
|
|
55
|
+
targets: targets.length,
|
|
56
|
+
});
|
|
57
|
+
const frontends = ports.web.map((web) => `http://localhost:${web}`);
|
|
58
|
+
session.update(frontends);
|
|
59
|
+
const main = Math.max(targets.indexOf("web"), 0);
|
|
60
|
+
const appOrigin = frontends[main];
|
|
61
|
+
const loadedFor = (web) => ({
|
|
62
|
+
...configured,
|
|
63
|
+
config: {
|
|
64
|
+
...configured.config,
|
|
65
|
+
server: { ...configured.config.server, port: ports.server },
|
|
66
|
+
web: { ...configured.config.web, port: web },
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
const shared = loadedFor(ports.web[main]);
|
|
70
|
+
const server = await inspectServerEntry(shared.rootDir, shared.config.server.entry);
|
|
71
|
+
const serverProcess = startServerProcess(shared, [
|
|
72
|
+
appOrigin,
|
|
73
|
+
...frontends.filter((origin) => origin !== appOrigin),
|
|
74
|
+
]);
|
|
75
|
+
await untilListening(serverProcess, ports.server);
|
|
76
|
+
startDevAgentHost(shared, {
|
|
77
|
+
enabled: args["agent-host"],
|
|
78
|
+
serverHasAuth: server.auth === "installed",
|
|
79
|
+
});
|
|
80
|
+
await Promise.all(targetHandlers.map((handler, index) => handler.dev(loadedFor(ports.web[index]), {
|
|
81
|
+
device: args.device,
|
|
82
|
+
appOrigin: index === main ? undefined : appOrigin,
|
|
83
|
+
})));
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typegen.d.ts","sourceRoot":"","sources":["../../src/commands/typegen.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO,qDASlB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { loadParlorConfig } from "@parlor/config";
|
|
2
|
+
import { generateRouteTree } from "@parlor/shell-web";
|
|
3
|
+
import { defineCommand } from "citty";
|
|
4
|
+
export const typegen = defineCommand({
|
|
5
|
+
meta: {
|
|
6
|
+
name: "typegen",
|
|
7
|
+
description: "Generate the route tree from src/routes, as parlor dev does, without Vite",
|
|
8
|
+
},
|
|
9
|
+
async run() {
|
|
10
|
+
await generateRouteTree(await loadParlorConfig());
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=typegen.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-target.d.ts","sourceRoot":"","sources":["../src/desktop-target.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAQ1D,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAAM,CAAC,QAA2B,QAQ7C;AAYD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAmB3D"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { buildDesktop, startDesktopDev, TauriCliError } from "@parlor/shell-desktop";
|
|
2
|
+
import { CliError } from "./errors.js";
|
|
3
|
+
import { onShutdown } from "./shutdown.js";
|
|
4
|
+
const HOST_TARGET = {
|
|
5
|
+
darwin: "mac",
|
|
6
|
+
win32: "windows",
|
|
7
|
+
linux: "linux",
|
|
8
|
+
};
|
|
9
|
+
export function assertHostMatches(target, platform = process.platform) {
|
|
10
|
+
const host = HOST_TARGET[platform];
|
|
11
|
+
if (host !== target) {
|
|
12
|
+
throw new CliError(`Target "${target}" can only be built on its own operating system. This machine builds "${host ?? "nothing"}".`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async function surfaceTauriErrors(run) {
|
|
16
|
+
try {
|
|
17
|
+
return await run();
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (error instanceof TauriCliError)
|
|
21
|
+
throw new CliError(error.message, { cause: error });
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function desktopTarget(target) {
|
|
26
|
+
return {
|
|
27
|
+
assertHost: () => assertHostMatches(target),
|
|
28
|
+
async dev(loaded, options) {
|
|
29
|
+
await surfaceTauriErrors(async () => {
|
|
30
|
+
const controller = new AbortController();
|
|
31
|
+
onShutdown(() => controller.abort());
|
|
32
|
+
await startDesktopDev(loaded, {
|
|
33
|
+
signal: controller.signal,
|
|
34
|
+
appOrigin: options.appOrigin,
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
},
|
|
38
|
+
async build(loaded, _options) {
|
|
39
|
+
assertHostMatches(target);
|
|
40
|
+
const bundleDir = await surfaceTauriErrors(() => buildDesktop(loaded));
|
|
41
|
+
console.log(`desktop bundles written to ${bundleDir}`);
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=desktop-target.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface DevSession {
|
|
2
|
+
readonly pid: number;
|
|
3
|
+
readonly targets: readonly string[];
|
|
4
|
+
readonly urls: readonly string[];
|
|
5
|
+
}
|
|
6
|
+
export declare const DEV_SESSION_FILE = "dev.json";
|
|
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.
|
|
10
|
+
*/
|
|
11
|
+
export declare function claimDevSession(rootDir: string, targets: readonly string[], pid?: number): {
|
|
12
|
+
update(urls: readonly string[]): void;
|
|
13
|
+
release(): void;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=dev-session.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { closeSync, mkdirSync, openSync, readFileSync, rmSync, writeFileSync, writeSync, } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { GENERATED_DIR } from "@parlor/config";
|
|
4
|
+
import { CliError } from "./errors.js";
|
|
5
|
+
export const DEV_SESSION_FILE = "dev.json";
|
|
6
|
+
function alive(pid) {
|
|
7
|
+
try {
|
|
8
|
+
process.kill(pid, 0);
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
return error.code === "EPERM";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function read(path) {
|
|
16
|
+
try {
|
|
17
|
+
const session = JSON.parse(readFileSync(path, "utf8"));
|
|
18
|
+
return typeof session.pid === "number"
|
|
19
|
+
? { pid: session.pid, targets: session.targets ?? [], urls: session.urls ?? [] }
|
|
20
|
+
: undefined;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function running(owner) {
|
|
27
|
+
const targets = owner.targets.length > 0 ? owner.targets : ["web"];
|
|
28
|
+
const where = targets
|
|
29
|
+
.map((target, index) => owner.urls[index] ? `${target} at ${owner.urls[index]}` : target)
|
|
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.`;
|
|
32
|
+
}
|
|
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.
|
|
36
|
+
*/
|
|
37
|
+
export function claimDevSession(rootDir, targets, pid = process.pid) {
|
|
38
|
+
const path = join(rootDir, GENERATED_DIR, DEV_SESSION_FILE);
|
|
39
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
40
|
+
const write = (urls) => JSON.stringify({ pid, targets, urls });
|
|
41
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
42
|
+
try {
|
|
43
|
+
const fd = openSync(path, "wx");
|
|
44
|
+
writeSync(fd, write([]));
|
|
45
|
+
closeSync(fd);
|
|
46
|
+
return {
|
|
47
|
+
update: (urls) => writeFileSync(path, write(urls)),
|
|
48
|
+
release: () => {
|
|
49
|
+
if (read(path)?.pid === pid)
|
|
50
|
+
rmSync(path, { force: true });
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (error.code !== "EEXIST")
|
|
56
|
+
throw error;
|
|
57
|
+
const owner = read(path);
|
|
58
|
+
if (owner && owner.pid !== pid && alive(owner.pid))
|
|
59
|
+
throw new CliError(running(owner));
|
|
60
|
+
rmSync(path, { force: true });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
throw new CliError(`Could not claim ${path} for parlor dev.`);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=dev-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-session.js","sourceRoot":"","sources":["../src/dev-session.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAkB,IAAI,EAAE,MAAM,CAAc;CAC7C"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG1D,eAAO,MAAM,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAO3D,CAAC"}
|
package/dist/handlers.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { desktopTarget } from "./desktop-target.js";
|
|
2
|
+
import { mobileTarget } from "./mobile-target.js";
|
|
3
|
+
import { webTarget } from "./web-target.js";
|
|
4
|
+
export const handlers = {
|
|
5
|
+
web: webTarget,
|
|
6
|
+
ios: mobileTarget("ios"),
|
|
7
|
+
android: mobileTarget("android"),
|
|
8
|
+
mac: desktopTarget("mac"),
|
|
9
|
+
windows: desktopTarget("windows"),
|
|
10
|
+
linux: desktopTarget("linux"),
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,cAAc,EACd,KAAK,MAAM,EACX,WAAW,EACX,KAAK,aAAa,EAClB,OAAO,GACR,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +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"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":""}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { ConfigError } from "@parlor/config";
|
|
3
|
+
import { defineCommand, runCommand, runMain } from "citty";
|
|
4
|
+
import { add } from "./commands/add.js";
|
|
5
|
+
import { build } from "./commands/build.js";
|
|
6
|
+
import { db } from "./commands/db.js";
|
|
7
|
+
import { deploy } from "./commands/deploy.js";
|
|
8
|
+
import { dev } from "./commands/dev.js";
|
|
9
|
+
import { typegen } from "./commands/typegen.js";
|
|
10
|
+
import { CliError } from "./errors.js";
|
|
11
|
+
import { shutdownAfterError } from "./shutdown.js";
|
|
12
|
+
const main = defineCommand({
|
|
13
|
+
meta: { name: "parlor", description: "Parlor CLI" },
|
|
14
|
+
subCommands: { dev, build, deploy, db, add, typegen },
|
|
15
|
+
});
|
|
16
|
+
function isHelp(arg) {
|
|
17
|
+
return arg === "--help" || arg === "-h";
|
|
18
|
+
}
|
|
19
|
+
async function run(rawArgs) {
|
|
20
|
+
if (rawArgs.some(isHelp)) {
|
|
21
|
+
await runMain(main, { rawArgs });
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
await runCommand(main, { rawArgs });
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
await run(process.argv.slice(2));
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
await shutdownAfterError();
|
|
31
|
+
if (error instanceof CliError || error instanceof ConfigError) {
|
|
32
|
+
console.error(error.message);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type MobilePlatform } from "@parlor/shell-mobile";
|
|
2
|
+
import type { TargetHandler } from "./targets.js";
|
|
3
|
+
export declare function assertIosHost(platform: MobilePlatform, host?: NodeJS.Platform): void;
|
|
4
|
+
export declare function mobileTarget(platform: MobilePlatform): TargetHandler;
|
|
5
|
+
//# sourceMappingURL=mobile-target.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mobile-target.d.ts","sourceRoot":"","sources":["../src/mobile-target.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EAEpB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,cAAc,EACxB,IAAI,GAAE,MAAM,CAAC,QAA2B,QAKzC;AAYD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,aAAa,CAsBpE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { buildMobile, CapacitorCliError, startMobileDev, } from "@parlor/shell-mobile";
|
|
2
|
+
import { CliError } from "./errors.js";
|
|
3
|
+
import { onShutdown } from "./shutdown.js";
|
|
4
|
+
export function assertIosHost(platform, host = process.platform) {
|
|
5
|
+
if (platform === "ios" && host !== "darwin") {
|
|
6
|
+
throw new CliError('Target "ios" can only be built on macOS.');
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
async function surfaceCapacitorErrors(run) {
|
|
10
|
+
try {
|
|
11
|
+
return await run();
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
if (error instanceof CapacitorCliError)
|
|
15
|
+
throw new CliError(error.message, { cause: error });
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function mobileTarget(platform) {
|
|
20
|
+
return {
|
|
21
|
+
assertHost: () => assertIosHost(platform),
|
|
22
|
+
async dev(loaded, options) {
|
|
23
|
+
await surfaceCapacitorErrors(async () => {
|
|
24
|
+
const controller = new AbortController();
|
|
25
|
+
onShutdown(() => controller.abort());
|
|
26
|
+
await startMobileDev(loaded, platform, {
|
|
27
|
+
device: options.device,
|
|
28
|
+
signal: controller.signal,
|
|
29
|
+
appOrigin: options.appOrigin,
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
},
|
|
33
|
+
async build(loaded, _options) {
|
|
34
|
+
assertIosHost(platform);
|
|
35
|
+
const projectDir = await surfaceCapacitorErrors(() => buildMobile(loaded, platform));
|
|
36
|
+
console.log(`${platform} project synced at ${projectDir}`);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=mobile-target.js.map
|
|
@@ -0,0 +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"}
|
package/dist/ports.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function isPortFree(port: number): Promise<boolean>;
|
|
2
|
+
export declare function firstFreePort(from: number, taken?: ReadonlySet<number>): Promise<number>;
|
|
3
|
+
export interface DevPorts {
|
|
4
|
+
readonly server: number;
|
|
5
|
+
/** One per target, in the order asked; the first starts at the wanted web port. */
|
|
6
|
+
readonly web: readonly number[];
|
|
7
|
+
}
|
|
8
|
+
/** Moves each busy port to the next free one, saying so, as Vite and Next.js do. */
|
|
9
|
+
export declare function resolveDevPorts(wanted: {
|
|
10
|
+
readonly server: number;
|
|
11
|
+
readonly web: number;
|
|
12
|
+
readonly targets?: number;
|
|
13
|
+
}, log?: (line: string) => void): Promise<DevPorts>;
|
|
14
|
+
//# sourceMappingURL=ports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"AAqBA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAK/D;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,WAAW,CAAC,MAAM,CAAa,GACrC,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,oFAAoF;AACpF,wBAAsB,eAAe,CACnC,MAAM,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EACpF,GAAG,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkB,GACxC,OAAO,CAAC,QAAQ,CAAC,CAenB"}
|
package/dist/ports.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createServer } from "node:net";
|
|
2
|
+
import { CliError } from "./errors.js";
|
|
3
|
+
// The server binds every interface and Vite binds `localhost`, so a holder on any of these takes the port.
|
|
4
|
+
const HOSTS = ["0.0.0.0", "::", "127.0.0.1", "::1"];
|
|
5
|
+
const NO_SUCH_ADDRESS = new Set(["EADDRNOTAVAIL", "EAFNOSUPPORT"]);
|
|
6
|
+
const ATTEMPTS = 100;
|
|
7
|
+
function bindable(port, host) {
|
|
8
|
+
return new Promise((resolve) => {
|
|
9
|
+
const server = createServer();
|
|
10
|
+
server.once("error", (error) => resolve(NO_SUCH_ADDRESS.has(error.code ?? "")));
|
|
11
|
+
server.listen({ port, host, exclusive: true }, () => server.close(() => resolve(true)));
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export async function isPortFree(port) {
|
|
15
|
+
for (const host of HOSTS) {
|
|
16
|
+
if (!(await bindable(port, host)))
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
export async function firstFreePort(from, taken = new Set()) {
|
|
22
|
+
for (let port = from; port < from + ATTEMPTS && port <= 65_535; port += 1) {
|
|
23
|
+
if (!taken.has(port) && (await isPortFree(port)))
|
|
24
|
+
return port;
|
|
25
|
+
}
|
|
26
|
+
throw new CliError(`No free port from ${from} to ${from + ATTEMPTS - 1}.`);
|
|
27
|
+
}
|
|
28
|
+
/** Moves each busy port to the next free one, saying so, as Vite and Next.js do. */
|
|
29
|
+
export async function resolveDevPorts(wanted, log = console.log) {
|
|
30
|
+
const server = await firstFreePort(wanted.server);
|
|
31
|
+
const taken = new Set([server]);
|
|
32
|
+
const web = [];
|
|
33
|
+
for (let index = 0; index < (wanted.targets ?? 1); index += 1) {
|
|
34
|
+
const port = await firstFreePort(web.at(-1) ?? wanted.web, taken);
|
|
35
|
+
taken.add(port);
|
|
36
|
+
web.push(port);
|
|
37
|
+
}
|
|
38
|
+
if (server !== wanted.server) {
|
|
39
|
+
log(`Port ${wanted.server} is in use, so the server uses ${server}.`);
|
|
40
|
+
}
|
|
41
|
+
if (web[0] !== wanted.web)
|
|
42
|
+
log(`Port ${wanted.web} is in use, so the page uses ${web[0]}.`);
|
|
43
|
+
return { server, web };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=ports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve-entry.d.ts","sourceRoot":"","sources":["../src/serve-entry.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { pathToFileURL } from "node:url";
|
|
3
|
+
import { UI_MANIFEST_FILE } from "@parlor/agent-ui";
|
|
4
|
+
import { fileManifestSource } from "@parlor/agent-ui/server";
|
|
5
|
+
import { GENERATED_DIR } from "@parlor/config";
|
|
6
|
+
import { serve } from "srvx";
|
|
7
|
+
import { onShutdown } from "./shutdown.js";
|
|
8
|
+
const entry = process.argv[2];
|
|
9
|
+
if (!entry)
|
|
10
|
+
throw new Error("serve-entry needs the server entry path");
|
|
11
|
+
const loaded = (await import(pathToFileURL(entry).href));
|
|
12
|
+
const handler = loaded.default?.fetch;
|
|
13
|
+
loaded.default?.installUiManifest?.(fileManifestSource(resolve(GENERATED_DIR, UI_MANIFEST_FILE)));
|
|
14
|
+
if (handler) {
|
|
15
|
+
onShutdown(() => loaded.default?.close?.());
|
|
16
|
+
const port = Number(process.env.PORT ?? 3000);
|
|
17
|
+
serve({ fetch: (request) => handler(request), port, silent: true });
|
|
18
|
+
console.log(`parlor server listening on http://localhost:${port}`);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=serve-entry.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ChildProcess } from "node:child_process";
|
|
2
|
+
import { type LoadedConfig, type ParlorConfig } from "@parlor/config";
|
|
3
|
+
/**
|
|
4
|
+
* The first of `frontends` is the app's origin; the others are the other targets of the same
|
|
5
|
+
* `parlor dev`, which the server trusts too.
|
|
6
|
+
*/
|
|
7
|
+
export declare function serverEnv(config: ParlorConfig, base?: NodeJS.ProcessEnv, frontends?: readonly string[]): NodeJS.ProcessEnv;
|
|
8
|
+
export declare const SERVER_SELF_EXIT_GRACE_MS = 2000;
|
|
9
|
+
export declare function stopServerProcess(child: ChildProcess, graceMs?: number): Promise<void>;
|
|
10
|
+
/** Lets the page's first requests reach the server instead of failing in Vite's proxy. */
|
|
11
|
+
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
|
+
//# sourceMappingURL=server-process.d.ts.map
|
|
@@ -0,0 +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"}
|