@percher/core 0.4.14 → 0.4.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/data-oauth.d.ts +30 -0
- package/dist/commands/data-oauth.d.ts.map +1 -0
- package/dist/commands/data-oauth.js +55 -0
- package/dist/commands/data-oauth.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +2 -32
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/publish-from-repo.d.ts +22 -0
- package/dist/commands/publish-from-repo.d.ts.map +1 -0
- package/dist/commands/publish-from-repo.js +236 -0
- package/dist/commands/publish-from-repo.js.map +1 -0
- package/dist/commands/publish-inline.d.ts +4 -0
- package/dist/commands/publish-inline.d.ts.map +1 -1
- package/dist/commands/publish-inline.js +115 -43
- package/dist/commands/publish-inline.js.map +1 -1
- package/dist/detect.d.ts +19 -0
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +128 -39
- package/dist/detect.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/templates.d.ts +6 -0
- package/dist/templates.d.ts.map +1 -1
- package/dist/templates.js +20 -0
- package/dist/templates.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { isDeployAlreadyInProgress, PercherApiError } from "@percher/client";
|
|
2
2
|
import { MAX_INLINE_PUBLISH_BYTES } from "@percher/shared";
|
|
3
|
-
import { PercherTomlError, parse } from "@percher/toml";
|
|
3
|
+
import { PercherTomlError, parse, serialize } from "@percher/toml";
|
|
4
4
|
import { z } from "zod";
|
|
5
|
+
import { configFromDetection, detectFrameworkFromFiles } from "../detect.js";
|
|
5
6
|
import { recoveryAsk, recoveryFixConfig, recoveryWait, } from "../recovery.js";
|
|
6
7
|
import { createTarballFromFiles } from "../tarball.js";
|
|
7
8
|
import { tomlErrorToRecoveryProblems } from "../toml-recovery.js";
|
|
@@ -11,14 +12,20 @@ export const publishInlineInputSchema = z.object({
|
|
|
11
12
|
name: z
|
|
12
13
|
.string()
|
|
13
14
|
.optional()
|
|
14
|
-
.describe("
|
|
15
|
+
.describe("App name. Overrides [app].name when percher.toml is present; REQUIRED when no percher.toml is provided (so the auto-detected app can be named)."),
|
|
15
16
|
files: z
|
|
16
17
|
.array(z.object({
|
|
17
18
|
path: z.string().min(1).describe("Repo-relative path (no leading / and no ..)."),
|
|
18
|
-
content: z
|
|
19
|
+
content: z
|
|
20
|
+
.string()
|
|
21
|
+
.describe("File contents — UTF-8 text, or base64-encoded bytes when encoding is 'base64'."),
|
|
22
|
+
encoding: z
|
|
23
|
+
.enum(["utf8", "base64"])
|
|
24
|
+
.optional()
|
|
25
|
+
.describe("Content encoding. Default 'utf8' (text). Use 'base64' for binary assets (images, fonts)."),
|
|
19
26
|
}))
|
|
20
27
|
.min(1)
|
|
21
|
-
.describe("Inline source files.
|
|
28
|
+
.describe("Inline source files. Include a percher.toml ([app].name + runtime), or omit it and Percher auto-detects the runtime from the files (then `name` is required)."),
|
|
22
29
|
preview: z
|
|
23
30
|
.boolean()
|
|
24
31
|
.optional()
|
|
@@ -31,11 +38,21 @@ export const publishInlineInputSchema = z.object({
|
|
|
31
38
|
.describe("If true (default), block until the deploy is live or failed. If false, return as soon as it is queued so the agent can resume with percher_wait_for_deploy."),
|
|
32
39
|
});
|
|
33
40
|
const TOML_FILENAME = "percher.toml";
|
|
41
|
+
/** Decode an inline file's `content` to raw bytes (utf8 text or base64). */
|
|
42
|
+
function fileBytes(f) {
|
|
43
|
+
return f.encoding === "base64"
|
|
44
|
+
? new Uint8Array(Buffer.from(f.content, "base64"))
|
|
45
|
+
: new TextEncoder().encode(f.content);
|
|
46
|
+
}
|
|
47
|
+
/** Decode an inline file's `content` to UTF-8 text (e.g. for the percher.toml parse). */
|
|
48
|
+
function fileText(f) {
|
|
49
|
+
return f.encoding === "base64" ? Buffer.from(f.content, "base64").toString("utf8") : f.content;
|
|
50
|
+
}
|
|
34
51
|
/** Total decoded `content` bytes across all inline files. */
|
|
35
52
|
function totalContentBytes(files) {
|
|
36
53
|
let total = 0;
|
|
37
54
|
for (const f of files)
|
|
38
|
-
total +=
|
|
55
|
+
total += fileBytes(f).length;
|
|
39
56
|
return total;
|
|
40
57
|
}
|
|
41
58
|
/**
|
|
@@ -93,55 +110,110 @@ async function publishInlineInner(ctx, input) {
|
|
|
93
110
|
}),
|
|
94
111
|
});
|
|
95
112
|
}
|
|
96
|
-
// ── 1. Config — read percher.toml out of the inline files
|
|
113
|
+
// ── 1. Config — read percher.toml out of the inline files, or, when
|
|
114
|
+
// it's omitted, auto-detect the runtime from the files and
|
|
115
|
+
// synthesize one (injected below so the bundle is self-describing
|
|
116
|
+
// exactly like a user-provided one). ──────────────────────────
|
|
97
117
|
ctx.status("[1/3] Reading inline percher.toml...");
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
title: "percher.toml missing from inline source",
|
|
102
|
-
explanation: "Inline publishing requires a percher.toml among the files — it declares the app's runtime/framework and is read from the uploaded bundle.",
|
|
103
|
-
suggestion: "Add a percher.toml file (with at least [app] name and runtime) to the files array. See the percher.toml docs.",
|
|
104
|
-
recovery: recoveryFixConfig({
|
|
105
|
-
problems: [
|
|
106
|
-
{
|
|
107
|
-
file: TOML_FILENAME,
|
|
108
|
-
message: "Include a percher.toml in the files array (with at least [app] name and runtime) — see the percher.toml docs.",
|
|
109
|
-
},
|
|
110
|
-
],
|
|
111
|
-
reasonCode: "config_missing",
|
|
112
|
-
}),
|
|
113
|
-
});
|
|
114
|
-
}
|
|
118
|
+
// The file list shipped in the tarball: input.files, plus a synthesized
|
|
119
|
+
// percher.toml when the caller omitted one.
|
|
120
|
+
let files = input.files;
|
|
115
121
|
let config;
|
|
116
|
-
|
|
117
|
-
|
|
122
|
+
const tomlFile = input.files.find((f) => normalizeForMatch(f.path) === TOML_FILENAME);
|
|
123
|
+
if (tomlFile) {
|
|
124
|
+
try {
|
|
125
|
+
config = parse(fileText(tomlFile));
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
if (err instanceof PercherTomlError) {
|
|
129
|
+
const problems = tomlErrorToRecoveryProblems(err);
|
|
130
|
+
const isParse = err.code === "PARSE_ERROR";
|
|
131
|
+
return failure({
|
|
132
|
+
title: isParse
|
|
133
|
+
? "percher.toml has invalid TOML syntax"
|
|
134
|
+
: "percher.toml failed schema validation",
|
|
135
|
+
explanation: err.message,
|
|
136
|
+
suggestion: isParse
|
|
137
|
+
? "Fix the syntax error and retry."
|
|
138
|
+
: "Fix the schema issues (check the percher.toml spec) and retry.",
|
|
139
|
+
recovery: recoveryFixConfig({ problems, reasonCode: "config_invalid" }),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
throw err;
|
|
143
|
+
}
|
|
144
|
+
// `name` arg overrides the percher.toml app name when supplied. Trim to
|
|
145
|
+
// match the no-toml branch (a whitespace-only override is ignored).
|
|
146
|
+
const overrideName = input.name?.trim();
|
|
147
|
+
if (overrideName) {
|
|
148
|
+
config.app.name = overrideName;
|
|
149
|
+
}
|
|
118
150
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
151
|
+
else {
|
|
152
|
+
// No percher.toml — synthesize one from a runtime auto-detect.
|
|
153
|
+
const name = input.name?.trim();
|
|
154
|
+
if (!name) {
|
|
123
155
|
return failure({
|
|
124
|
-
title:
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
recovery: recoveryFixConfig({ problems, reasonCode: "config_invalid" }),
|
|
156
|
+
title: "App name required",
|
|
157
|
+
explanation: "No percher.toml was provided, so Percher can't infer the app name. Pass `name`, or include a percher.toml with [app].name.",
|
|
158
|
+
suggestion: "Re-call percher_publish with `name` set (3-40 chars, lowercase a-z 0-9 and hyphens).",
|
|
159
|
+
recovery: recoveryAsk({
|
|
160
|
+
prompt: "What should the app be named? (3-40 chars, lowercase letters, numbers, and hyphens)",
|
|
161
|
+
reasonCode: "config_missing",
|
|
162
|
+
}),
|
|
132
163
|
});
|
|
133
164
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
165
|
+
const detected = detectFrameworkFromFiles(
|
|
166
|
+
// Detection reads only text files (package.json, *.py) and checks file
|
|
167
|
+
// existence; pass "" for base64 (binary) entries so a large asset isn't
|
|
168
|
+
// decoded to text — its path still registers for existence checks.
|
|
169
|
+
input.files.map((f) => ({
|
|
170
|
+
path: f.path,
|
|
171
|
+
content: f.encoding === "base64" ? "" : f.content,
|
|
172
|
+
})));
|
|
173
|
+
if (!detected) {
|
|
174
|
+
return failure({
|
|
175
|
+
title: "Could not detect the app runtime",
|
|
176
|
+
explanation: "No percher.toml was provided and Percher couldn't infer the runtime from the files (no package.json, index.html, requirements.txt, or Dockerfile found).",
|
|
177
|
+
suggestion: "Add a percher.toml with [app] name + runtime (node | bun | python | static | docker).",
|
|
178
|
+
recovery: recoveryFixConfig({
|
|
179
|
+
problems: [
|
|
180
|
+
{
|
|
181
|
+
file: TOML_FILENAME,
|
|
182
|
+
message: "Include a percher.toml with at least [app] name and runtime — Percher couldn't auto-detect the runtime from the files.",
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
reasonCode: "config_missing",
|
|
186
|
+
}),
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
if (detected.staticBuild) {
|
|
190
|
+
// Vite / static-Astro / etc. need a build step that the inline path
|
|
191
|
+
// can't run without a Dockerfile (the Dockerfile branch would have
|
|
192
|
+
// matched first if one were present).
|
|
193
|
+
return failure({
|
|
194
|
+
title: "This project needs a build step",
|
|
195
|
+
explanation: `Detected a ${detected.framework ?? "static"} app that must be built before it can be served, which inline publishing can't do without a Dockerfile.`,
|
|
196
|
+
suggestion: 'Add a percher.toml (runtime = "docker") plus a Dockerfile to the files, or connect a GitHub/Forgejo repo and deploy with percher_deploy.',
|
|
197
|
+
recovery: recoveryFixConfig({
|
|
198
|
+
problems: [
|
|
199
|
+
{
|
|
200
|
+
file: TOML_FILENAME,
|
|
201
|
+
message: "A framework that needs a build step (Vite, static Astro, …) must ship a Dockerfile inline, or be deployed from a connected repo.",
|
|
202
|
+
},
|
|
203
|
+
],
|
|
204
|
+
reasonCode: "config_missing",
|
|
205
|
+
}),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
config = configFromDetection(name, detected);
|
|
209
|
+
files = [...input.files, { path: TOML_FILENAME, content: serialize(config) }];
|
|
210
|
+
ctx.status(`[1/3] No percher.toml — detected runtime "${config.app.runtime}" from files.`);
|
|
139
211
|
}
|
|
140
212
|
// ── 2. Tarball — built entirely in memory from the inline files ────
|
|
141
213
|
ctx.status("[2/3] Packaging inline files...");
|
|
142
214
|
let tarball;
|
|
143
215
|
try {
|
|
144
|
-
tarball = createTarballFromFiles(
|
|
216
|
+
tarball = createTarballFromFiles(files.map((f) => ({ path: f.path, data: fileBytes(f) })), config);
|
|
145
217
|
}
|
|
146
218
|
catch (err) {
|
|
147
219
|
// createTarballFromFiles rejects traversal / absolute / duplicate
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-inline.js","sourceRoot":"","sources":["../../src/commands/publish-inline.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAsB,gBAAgB,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"publish-inline.js","sourceRoot":"","sources":["../../src/commands/publish-inline.ts"],"names":[],"mappings":"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"}
|
package/dist/detect.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { PercherConfig } from "@percher/toml";
|
|
1
2
|
export interface DetectedFramework {
|
|
2
3
|
runtime: "node" | "bun" | "python" | "static" | "docker";
|
|
3
4
|
framework?: string;
|
|
@@ -25,6 +26,24 @@ export interface DetectedFramework {
|
|
|
25
26
|
};
|
|
26
27
|
}
|
|
27
28
|
export declare function detectFramework(cwd: string): Promise<DetectedFramework | null>;
|
|
29
|
+
/**
|
|
30
|
+
* Inline counterpart to {@link detectFramework} — runs the SAME detection
|
|
31
|
+
* ladder over an in-memory file list (no filesystem access), for the hosted
|
|
32
|
+
* "publish from inline source" path where there is no `cwd`. Folds in the
|
|
33
|
+
* bun-lockfile promotion that CLI callers apply separately via
|
|
34
|
+
* {@link refineBunRuntime}, since inline callers don't get a second pass.
|
|
35
|
+
*/
|
|
36
|
+
export declare function detectFrameworkFromFiles(files: Array<{
|
|
37
|
+
path: string;
|
|
38
|
+
content: string;
|
|
39
|
+
}>): DetectedFramework | null;
|
|
28
40
|
/** Promote runtime from "node" to "bun" if a Bun lockfile is present. */
|
|
29
41
|
export declare function refineBunRuntime(detected: DetectedFramework, cwd: string): DetectedFramework;
|
|
42
|
+
/**
|
|
43
|
+
* Assemble a `PercherConfig` from a detection result + chosen name. Shared by
|
|
44
|
+
* `init` (CLI scaffold) and the hosted inline-publish path so both produce
|
|
45
|
+
* an identical config shape. `dataMode` overrides the detected data mode when
|
|
46
|
+
* the caller wants to force it (e.g. `init --data-mode`).
|
|
47
|
+
*/
|
|
48
|
+
export declare function configFromDetection(name: string, detected: DetectedFramework | null, dataMode?: "pocketbase" | "postgres" | "sqlite" | "none"): PercherConfig;
|
|
30
49
|
//# sourceMappingURL=detect.d.ts.map
|
package/dist/detect.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAA;KAAE,CAAC;IACvF;;;;;;OAMG;IACH,WAAW,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;CACnD;AA8ND,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAYpF;AAQD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9C,iBAAiB,GAAG,IAAI,CAsB1B;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAQ5F;AAkBD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,iBAAiB,GAAG,IAAI,EAClC,QAAQ,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GACvD,aAAa,CAef"}
|
package/dist/detect.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { STATIC_DOCKER_PORT } from "./static-docker.js";
|
|
4
|
-
function
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
function readPackageJson(src) {
|
|
5
|
+
const raw = src.text("package.json");
|
|
6
|
+
if (raw === null)
|
|
7
|
+
return null;
|
|
8
8
|
try {
|
|
9
|
-
return JSON.parse(
|
|
9
|
+
return JSON.parse(raw);
|
|
10
10
|
}
|
|
11
11
|
catch {
|
|
12
12
|
return null;
|
|
@@ -23,8 +23,8 @@ function hasDependency(pkg, name) {
|
|
|
23
23
|
* Detect data backend mode from project dependencies.
|
|
24
24
|
* Convex/Supabase SDKs override the default PocketBase mode.
|
|
25
25
|
*/
|
|
26
|
-
function detectDataMode(pkg,
|
|
27
|
-
if (
|
|
26
|
+
function detectDataMode(pkg, src) {
|
|
27
|
+
if (src.has("convex.json", "convex/_generated")) {
|
|
28
28
|
return { mode: "convex" };
|
|
29
29
|
}
|
|
30
30
|
if (hasDependency(pkg, "convex")) {
|
|
@@ -37,27 +37,27 @@ function detectDataMode(pkg, cwd) {
|
|
|
37
37
|
// PocketBase is only used when explicitly configured in percher.toml.
|
|
38
38
|
return { mode: "none" };
|
|
39
39
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const pkg =
|
|
43
|
-
if (
|
|
40
|
+
/** The single detection ladder, agnostic to where the files live. */
|
|
41
|
+
function detectFromSource(src) {
|
|
42
|
+
const pkg = readPackageJson(src);
|
|
43
|
+
if (src.has("Dockerfile")) {
|
|
44
44
|
return {
|
|
45
45
|
runtime: "docker",
|
|
46
46
|
framework: "docker",
|
|
47
47
|
web: { port: 8080, health: "/health" },
|
|
48
|
-
data: detectDataMode(pkg,
|
|
48
|
+
data: detectDataMode(pkg, src),
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
|
-
if (
|
|
51
|
+
if (src.has("next.config.js", "next.config.ts", "next.config.mjs")) {
|
|
52
52
|
return {
|
|
53
53
|
runtime: "node",
|
|
54
54
|
framework: "nextjs",
|
|
55
55
|
build: { command: "bun run build", output: ".next" },
|
|
56
56
|
web: { port: 3000, health: "/api/health" },
|
|
57
|
-
data: detectDataMode(pkg,
|
|
57
|
+
data: detectDataMode(pkg, src),
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
|
-
if (
|
|
60
|
+
if (src.has("svelte.config.js", "svelte.config.ts")) {
|
|
61
61
|
return {
|
|
62
62
|
runtime: "node",
|
|
63
63
|
framework: "sveltekit",
|
|
@@ -67,10 +67,10 @@ export async function detectFramework(cwd) {
|
|
|
67
67
|
// sveltekit template's percher.toml.
|
|
68
68
|
build: { command: "bun run build", output: "build" },
|
|
69
69
|
web: { port: 3000, health: "/health" },
|
|
70
|
-
data: detectDataMode(pkg,
|
|
70
|
+
data: detectDataMode(pkg, src),
|
|
71
71
|
};
|
|
72
72
|
}
|
|
73
|
-
if (
|
|
73
|
+
if (src.has("astro.config.mjs", "astro.config.ts", "astro.config.js")) {
|
|
74
74
|
const ssr = hasDependency(pkg, "@astrojs/node");
|
|
75
75
|
if (ssr) {
|
|
76
76
|
return {
|
|
@@ -78,7 +78,7 @@ export async function detectFramework(cwd) {
|
|
|
78
78
|
framework: "astro",
|
|
79
79
|
build: { command: "bun run build", output: "dist" },
|
|
80
80
|
web: { port: 4321, health: "/health" },
|
|
81
|
-
data: detectDataMode(pkg,
|
|
81
|
+
data: detectDataMode(pkg, src),
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
84
|
// Static Astro needs a build step, which the `runtime = "static"`
|
|
@@ -90,19 +90,19 @@ export async function detectFramework(cwd) {
|
|
|
90
90
|
framework: "astro",
|
|
91
91
|
web: { port: STATIC_DOCKER_PORT, health: "/" },
|
|
92
92
|
staticBuild: { outputDir: "dist", spa: false },
|
|
93
|
-
data: detectDataMode(pkg,
|
|
93
|
+
data: detectDataMode(pkg, src),
|
|
94
94
|
};
|
|
95
95
|
}
|
|
96
|
-
if (
|
|
96
|
+
if (src.has("remix.config.js", "remix.config.ts") || hasDependency(pkg, "@remix-run/node")) {
|
|
97
97
|
return {
|
|
98
98
|
runtime: "node",
|
|
99
99
|
framework: "remix",
|
|
100
100
|
build: { command: "bun run build", output: "build" },
|
|
101
101
|
web: { port: 3000, health: "/health" },
|
|
102
|
-
data: detectDataMode(pkg,
|
|
102
|
+
data: detectDataMode(pkg, src),
|
|
103
103
|
};
|
|
104
104
|
}
|
|
105
|
-
if (
|
|
105
|
+
if (src.has("vite.config.js", "vite.config.ts")) {
|
|
106
106
|
// Vite needs a build step, which the `runtime = "static"` Caddy
|
|
107
107
|
// path does not run. Ship it as a `runtime = "docker"` multi-stage
|
|
108
108
|
// build instead — `init` scaffolds the Dockerfile + Caddyfile from
|
|
@@ -113,7 +113,7 @@ export async function detectFramework(cwd) {
|
|
|
113
113
|
framework: "vite",
|
|
114
114
|
web: { port: STATIC_DOCKER_PORT, health: "/" },
|
|
115
115
|
staticBuild: { outputDir: "dist", spa: true },
|
|
116
|
-
data: detectDataMode(pkg,
|
|
116
|
+
data: detectDataMode(pkg, src),
|
|
117
117
|
};
|
|
118
118
|
}
|
|
119
119
|
if (hasDependency(pkg, "express")) {
|
|
@@ -121,7 +121,7 @@ export async function detectFramework(cwd) {
|
|
|
121
121
|
runtime: "node",
|
|
122
122
|
framework: "express",
|
|
123
123
|
web: { port: 3000, health: "/health" },
|
|
124
|
-
data: detectDataMode(pkg,
|
|
124
|
+
data: detectDataMode(pkg, src),
|
|
125
125
|
};
|
|
126
126
|
}
|
|
127
127
|
if (hasDependency(pkg, "fastify")) {
|
|
@@ -129,7 +129,7 @@ export async function detectFramework(cwd) {
|
|
|
129
129
|
runtime: "node",
|
|
130
130
|
framework: "fastify",
|
|
131
131
|
web: { port: 3000, health: "/health" },
|
|
132
|
-
data: detectDataMode(pkg,
|
|
132
|
+
data: detectDataMode(pkg, src),
|
|
133
133
|
};
|
|
134
134
|
}
|
|
135
135
|
if (hasDependency(pkg, "hono")) {
|
|
@@ -137,14 +137,14 @@ export async function detectFramework(cwd) {
|
|
|
137
137
|
runtime: "node",
|
|
138
138
|
framework: "hono",
|
|
139
139
|
web: { port: 3000, health: "/health" },
|
|
140
|
-
data: detectDataMode(pkg,
|
|
140
|
+
data: detectDataMode(pkg, src),
|
|
141
141
|
};
|
|
142
142
|
}
|
|
143
143
|
if (pkg) {
|
|
144
144
|
const detected = {
|
|
145
145
|
runtime: "node",
|
|
146
146
|
web: { port: 3000, health: "/health" },
|
|
147
|
-
data: detectDataMode(pkg,
|
|
147
|
+
data: detectDataMode(pkg, src),
|
|
148
148
|
};
|
|
149
149
|
const scripts = (pkg.scripts ?? {});
|
|
150
150
|
if (scripts.build) {
|
|
@@ -152,52 +152,141 @@ export async function detectFramework(cwd) {
|
|
|
152
152
|
}
|
|
153
153
|
return detected;
|
|
154
154
|
}
|
|
155
|
-
const hasPython =
|
|
155
|
+
const hasPython = src.has("requirements.txt", "pyproject.toml");
|
|
156
156
|
if (hasPython) {
|
|
157
|
-
if (
|
|
157
|
+
if (src.has("manage.py")) {
|
|
158
158
|
return {
|
|
159
159
|
runtime: "python",
|
|
160
160
|
framework: "django",
|
|
161
161
|
web: { port: 8000, health: "/health" },
|
|
162
|
-
data: detectDataMode(pkg,
|
|
162
|
+
data: detectDataMode(pkg, src),
|
|
163
163
|
};
|
|
164
164
|
}
|
|
165
|
-
const mainPy =
|
|
166
|
-
? readFileSync(join(cwd, "main.py"), "utf8")
|
|
167
|
-
: "";
|
|
165
|
+
const mainPy = src.text("main.py") ?? "";
|
|
168
166
|
if (/FastAPI\s*\(/.test(mainPy) || /from\s+fastapi/.test(mainPy)) {
|
|
169
167
|
return {
|
|
170
168
|
runtime: "python",
|
|
171
169
|
framework: "fastapi",
|
|
172
170
|
web: { port: 8000, health: "/health" },
|
|
173
|
-
data: detectDataMode(pkg,
|
|
171
|
+
data: detectDataMode(pkg, src),
|
|
174
172
|
};
|
|
175
173
|
}
|
|
176
|
-
const appPy =
|
|
174
|
+
const appPy = src.text("app.py") ?? "";
|
|
177
175
|
if (/Flask\s*\(/.test(appPy) || /from\s+flask/.test(appPy)) {
|
|
178
176
|
return {
|
|
179
177
|
runtime: "python",
|
|
180
178
|
framework: "flask",
|
|
181
179
|
web: { port: 5000, health: "/health" },
|
|
182
|
-
data: detectDataMode(pkg,
|
|
180
|
+
data: detectDataMode(pkg, src),
|
|
183
181
|
};
|
|
184
182
|
}
|
|
185
183
|
return {
|
|
186
184
|
runtime: "python",
|
|
187
185
|
web: { port: 8000, health: "/health" },
|
|
188
|
-
data: detectDataMode(pkg,
|
|
186
|
+
data: detectDataMode(pkg, src),
|
|
189
187
|
};
|
|
190
188
|
}
|
|
191
|
-
if (
|
|
189
|
+
if (src.has("index.html")) {
|
|
192
190
|
return { runtime: "static" };
|
|
193
191
|
}
|
|
194
192
|
return null;
|
|
195
193
|
}
|
|
194
|
+
export async function detectFramework(cwd) {
|
|
195
|
+
const src = {
|
|
196
|
+
has: (...names) => names.some((n) => existsSync(join(cwd, n))),
|
|
197
|
+
text: (name) => {
|
|
198
|
+
try {
|
|
199
|
+
return readFileSync(join(cwd, name), "utf8");
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
return detectFromSource(src);
|
|
207
|
+
}
|
|
208
|
+
/** Strip a leading `./` and normalize separators so inline paths match the
|
|
209
|
+
* root-relative names the detection ladder probes (`package.json`, etc.). */
|
|
210
|
+
function normalizeDetectPath(path) {
|
|
211
|
+
return path.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Inline counterpart to {@link detectFramework} — runs the SAME detection
|
|
215
|
+
* ladder over an in-memory file list (no filesystem access), for the hosted
|
|
216
|
+
* "publish from inline source" path where there is no `cwd`. Folds in the
|
|
217
|
+
* bun-lockfile promotion that CLI callers apply separately via
|
|
218
|
+
* {@link refineBunRuntime}, since inline callers don't get a second pass.
|
|
219
|
+
*/
|
|
220
|
+
export function detectFrameworkFromFiles(files) {
|
|
221
|
+
const byPath = new Map();
|
|
222
|
+
for (const f of files)
|
|
223
|
+
byPath.set(normalizeDetectPath(f.path), f.content);
|
|
224
|
+
const src = {
|
|
225
|
+
has: (...names) => names.some((n) => {
|
|
226
|
+
const norm = normalizeDetectPath(n);
|
|
227
|
+
if (byPath.has(norm))
|
|
228
|
+
return true;
|
|
229
|
+
// Directory-style probe (e.g. "convex/_generated"): match any file
|
|
230
|
+
// nested under it.
|
|
231
|
+
const prefix = norm.endsWith("/") ? norm : `${norm}/`;
|
|
232
|
+
for (const key of byPath.keys())
|
|
233
|
+
if (key.startsWith(prefix))
|
|
234
|
+
return true;
|
|
235
|
+
return false;
|
|
236
|
+
}),
|
|
237
|
+
text: (name) => byPath.get(normalizeDetectPath(name)) ?? null,
|
|
238
|
+
};
|
|
239
|
+
const detected = detectFromSource(src);
|
|
240
|
+
if (!detected)
|
|
241
|
+
return null;
|
|
242
|
+
if (detected.runtime === "node" && (byPath.has("bun.lockb") || byPath.has("bun.lock"))) {
|
|
243
|
+
return { ...detected, runtime: "bun" };
|
|
244
|
+
}
|
|
245
|
+
return detected;
|
|
246
|
+
}
|
|
196
247
|
/** Promote runtime from "node" to "bun" if a Bun lockfile is present. */
|
|
197
248
|
export function refineBunRuntime(detected, cwd) {
|
|
198
|
-
if (detected.runtime === "node" &&
|
|
249
|
+
if (detected.runtime === "node" &&
|
|
250
|
+
(existsSync(join(cwd, "bun.lockb")) || existsSync(join(cwd, "bun.lock")))) {
|
|
199
251
|
return { ...detected, runtime: "bun" };
|
|
200
252
|
}
|
|
201
253
|
return detected;
|
|
202
254
|
}
|
|
255
|
+
function buildDataConfig(mode) {
|
|
256
|
+
if (mode === "convex") {
|
|
257
|
+
return {
|
|
258
|
+
mode: "convex",
|
|
259
|
+
convex: { deployment_url: "https://your-project.convex.cloud" },
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
if (mode === "supabase") {
|
|
263
|
+
return {
|
|
264
|
+
mode: "supabase",
|
|
265
|
+
supabase: { url: "https://your-project.supabase.co" },
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
return { mode: mode };
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Assemble a `PercherConfig` from a detection result + chosen name. Shared by
|
|
272
|
+
* `init` (CLI scaffold) and the hosted inline-publish path so both produce
|
|
273
|
+
* an identical config shape. `dataMode` overrides the detected data mode when
|
|
274
|
+
* the caller wants to force it (e.g. `init --data-mode`).
|
|
275
|
+
*/
|
|
276
|
+
export function configFromDetection(name, detected, dataMode) {
|
|
277
|
+
return {
|
|
278
|
+
app: {
|
|
279
|
+
name,
|
|
280
|
+
runtime: detected?.runtime ?? "node",
|
|
281
|
+
...(detected?.framework
|
|
282
|
+
? { framework: detected.framework }
|
|
283
|
+
: {}),
|
|
284
|
+
},
|
|
285
|
+
...(detected?.build ? { build: detected.build } : {}),
|
|
286
|
+
...(detected?.web ? { web: detected.web } : {}),
|
|
287
|
+
...(detected?.data || dataMode
|
|
288
|
+
? { data: buildDataConfig(dataMode ?? detected?.data?.mode ?? "none") }
|
|
289
|
+
: {}),
|
|
290
|
+
};
|
|
291
|
+
}
|
|
203
292
|
//# sourceMappingURL=detect.js.map
|
package/dist/detect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"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"}
|