@contentrail/cli 0.2.2 → 0.2.3
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/README.md +36 -28
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +223 -140
- package/dist/cli.js.map +1 -1
- package/dist/commands/connect.d.ts +3 -0
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +37 -8
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +81 -16
- package/dist/commands/init.js.map +1 -1
- package/dist/install/plan.d.ts +8 -0
- package/dist/install/plan.d.ts.map +1 -0
- package/dist/install/plan.js +29 -0
- package/dist/install/plan.js.map +1 -0
- package/dist/install/run.d.ts +5 -0
- package/dist/install/run.d.ts.map +1 -0
- package/dist/install/run.js +80 -0
- package/dist/install/run.js.map +1 -0
- package/dist/interactive/clack-host.d.ts +3 -0
- package/dist/interactive/clack-host.d.ts.map +1 -0
- package/dist/interactive/clack-host.js +47 -0
- package/dist/interactive/clack-host.js.map +1 -0
- package/dist/interactive/connect-wizard.d.ts +17 -0
- package/dist/interactive/connect-wizard.d.ts.map +1 -0
- package/dist/interactive/connect-wizard.js +41 -0
- package/dist/interactive/connect-wizard.js.map +1 -0
- package/dist/interactive/init-wizard.d.ts +12 -0
- package/dist/interactive/init-wizard.d.ts.map +1 -0
- package/dist/interactive/init-wizard.js +73 -0
- package/dist/interactive/init-wizard.js.map +1 -0
- package/dist/interactive/is-interactive.d.ts +9 -0
- package/dist/interactive/is-interactive.d.ts.map +1 -0
- package/dist/interactive/is-interactive.js +19 -0
- package/dist/interactive/is-interactive.js.map +1 -0
- package/dist/interactive/menu.d.ts +4 -0
- package/dist/interactive/menu.d.ts.map +1 -0
- package/dist/interactive/menu.js +50 -0
- package/dist/interactive/menu.js.map +1 -0
- package/dist/interactive/types.d.ts +34 -0
- package/dist/interactive/types.d.ts.map +1 -0
- package/dist/interactive/types.js +2 -0
- package/dist/interactive/types.js.map +1 -0
- package/package.json +5 -4
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
export function createClackPromptHost() {
|
|
3
|
+
return {
|
|
4
|
+
intro(message) {
|
|
5
|
+
p.intro(message);
|
|
6
|
+
},
|
|
7
|
+
outro(message) {
|
|
8
|
+
p.outro(message);
|
|
9
|
+
},
|
|
10
|
+
note(message, title) {
|
|
11
|
+
p.note(message, title);
|
|
12
|
+
},
|
|
13
|
+
async select(message, options) {
|
|
14
|
+
// @clack Option<T> is incompatible with exactOptionalPropertyTypes for hints.
|
|
15
|
+
const value = await p.select({
|
|
16
|
+
message,
|
|
17
|
+
options: options.map((option) => ({
|
|
18
|
+
value: option.value,
|
|
19
|
+
label: option.label,
|
|
20
|
+
...(option.hint !== undefined ? { hint: option.hint } : {}),
|
|
21
|
+
})),
|
|
22
|
+
});
|
|
23
|
+
return value;
|
|
24
|
+
},
|
|
25
|
+
async confirm(message, initial = true) {
|
|
26
|
+
return p.confirm({ message, initialValue: initial });
|
|
27
|
+
},
|
|
28
|
+
async text(message, options) {
|
|
29
|
+
return p.text({
|
|
30
|
+
message,
|
|
31
|
+
...(options?.placeholder !== undefined
|
|
32
|
+
? { placeholder: options.placeholder }
|
|
33
|
+
: {}),
|
|
34
|
+
...(options?.initialValue !== undefined
|
|
35
|
+
? { initialValue: options.initialValue }
|
|
36
|
+
: {}),
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
cancel(message = "Cancelled.") {
|
|
40
|
+
p.cancel(message);
|
|
41
|
+
},
|
|
42
|
+
isCancel(value) {
|
|
43
|
+
return p.isCancel(value);
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=clack-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clack-host.js","sourceRoot":"","sources":["../../src/interactive/clack-host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAGpC,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,KAAK,CAAC,OAAO;YACX,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;QACD,KAAK,CAAC,OAAO;YACX,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,KAAK;YACjB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,MAAM,CACV,OAAe,EACf,OAAmC;YAEnC,8EAA8E;YAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;gBAC3B,OAAO;gBACP,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBAChC,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5D,CAAC,CAAC;aAC8B,CAAC,CAAC;YACrC,OAAO,KAAmB,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;YACnC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO;YACzB,OAAO,CAAC,CAAC,IAAI,CAAC;gBACZ,OAAO;gBACP,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,SAAS;oBACpC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE;oBACtC,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,OAAO,EAAE,YAAY,KAAK,SAAS;oBACrC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE;oBACxC,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,OAAO,GAAG,YAAY;YAC3B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;QACD,QAAQ,CAAC,KAAK;YACZ,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PromptHost } from "./types.js";
|
|
2
|
+
export interface ConnectWizardAccount {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly name: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ConnectWizardResult {
|
|
7
|
+
readonly cancelled: boolean;
|
|
8
|
+
readonly accountId?: string;
|
|
9
|
+
readonly projectName?: string;
|
|
10
|
+
readonly confirmApply: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function promptConnectOptions(host: PromptHost, input: {
|
|
13
|
+
readonly accounts: readonly ConnectWizardAccount[];
|
|
14
|
+
readonly defaultAccountId?: string;
|
|
15
|
+
readonly defaultProjectName: string;
|
|
16
|
+
}): Promise<ConnectWizardResult>;
|
|
17
|
+
//# sourceMappingURL=connect-wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-wizard.d.ts","sourceRoot":"","sources":["../../src/interactive/connect-wizard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE;IACL,QAAQ,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACnD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC,GACA,OAAO,CAAC,mBAAmB,CAAC,CAmD9B"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export async function promptConnectOptions(host, input) {
|
|
2
|
+
let accountId = input.defaultAccountId;
|
|
3
|
+
if (accountId === undefined || accountId === "") {
|
|
4
|
+
if (input.accounts.length === 1) {
|
|
5
|
+
accountId = input.accounts[0].id;
|
|
6
|
+
host.note(`${input.accounts[0].name} (${accountId})`, "Cloudflare account");
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
const selected = await host.select("Which Cloudflare account?", input.accounts.map((account) => ({
|
|
10
|
+
value: account.id,
|
|
11
|
+
label: account.name,
|
|
12
|
+
hint: account.id,
|
|
13
|
+
})));
|
|
14
|
+
if (host.isCancel(selected)) {
|
|
15
|
+
host.cancel("Connect cancelled.");
|
|
16
|
+
return { cancelled: true, confirmApply: false };
|
|
17
|
+
}
|
|
18
|
+
accountId = selected;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const projectName = await host.text("Pages project name", {
|
|
22
|
+
initialValue: input.defaultProjectName,
|
|
23
|
+
placeholder: input.defaultProjectName,
|
|
24
|
+
});
|
|
25
|
+
if (host.isCancel(projectName) || projectName.trim() === "") {
|
|
26
|
+
host.cancel("Connect cancelled.");
|
|
27
|
+
return { cancelled: true, confirmApply: false };
|
|
28
|
+
}
|
|
29
|
+
const confirmApply = await host.confirm("Create or patch this Cloudflare Pages project now?", false);
|
|
30
|
+
if (host.isCancel(confirmApply)) {
|
|
31
|
+
host.cancel("Connect cancelled.");
|
|
32
|
+
return { cancelled: true, confirmApply: false };
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
cancelled: false,
|
|
36
|
+
accountId,
|
|
37
|
+
projectName: projectName.trim(),
|
|
38
|
+
confirmApply,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=connect-wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-wizard.js","sourceRoot":"","sources":["../../src/interactive/connect-wizard.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAgB,EAChB,KAIC;IAED,IAAI,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC;IAEvC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;QAChD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CACP,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,SAAS,GAAG,EAC3C,oBAAoB,CACrB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAChC,2BAA2B,EAC3B,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC/B,KAAK,EAAE,OAAO,CAAC,EAAE;gBACjB,KAAK,EAAE,OAAO,CAAC,IAAI;gBACnB,IAAI,EAAE,OAAO,CAAC,EAAE;aACjB,CAAC,CAAC,CACJ,CAAC;YACF,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBAClC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;YAClD,CAAC;YACD,SAAS,GAAG,QAAQ,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;QACxD,YAAY,EAAE,KAAK,CAAC,kBAAkB;QACtC,WAAW,EAAE,KAAK,CAAC,kBAAkB;KACtC,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CACrC,oDAAoD,EACpD,KAAK,CACN,CAAC;IACF,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAClD,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,SAAS;QACT,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE;QAC/B,YAAY;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DetectedFramework } from "../detect/framework.js";
|
|
2
|
+
import type { PromptHost } from "./types.js";
|
|
3
|
+
export interface InitWizardResult {
|
|
4
|
+
readonly framework: "astro" | "vite" | "next" | "static";
|
|
5
|
+
readonly withEditor: boolean;
|
|
6
|
+
readonly withFunctions: boolean;
|
|
7
|
+
readonly force: boolean;
|
|
8
|
+
readonly install: boolean;
|
|
9
|
+
readonly cancelled: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function promptInitOptions(host: PromptHost, detected: DetectedFramework): Promise<InitWizardResult>;
|
|
12
|
+
//# sourceMappingURL=init-wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-wizard.d.ts","sourceRoot":"","sources":["../../src/interactive/init-wizard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAwF3B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export async function promptInitOptions(host, detected) {
|
|
2
|
+
const defaultFramework = detected === "unknown" || detected === "static"
|
|
3
|
+
? "static"
|
|
4
|
+
: detected === "astro" || detected === "vite" || detected === "next"
|
|
5
|
+
? detected
|
|
6
|
+
: "static";
|
|
7
|
+
const frameworkOptions = [
|
|
8
|
+
{
|
|
9
|
+
value: "next",
|
|
10
|
+
label: "Next.js (static export)",
|
|
11
|
+
...(defaultFramework === "next" ? { hint: "detected" } : {}),
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
value: "astro",
|
|
15
|
+
label: "Astro",
|
|
16
|
+
...(defaultFramework === "astro" ? { hint: "detected" } : {}),
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
value: "vite",
|
|
20
|
+
label: "Vite",
|
|
21
|
+
...(defaultFramework === "vite" ? { hint: "detected" } : {}),
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
value: "static",
|
|
25
|
+
label: "Generic static / React SPA",
|
|
26
|
+
...(defaultFramework === "static" ? { hint: "detected" } : {}),
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
const framework = await host.select("Which site stack should ContentRail target?", frameworkOptions);
|
|
30
|
+
if (host.isCancel(framework)) {
|
|
31
|
+
host.cancel("Setup cancelled.");
|
|
32
|
+
return cancelledResult();
|
|
33
|
+
}
|
|
34
|
+
const withEditor = await host.confirm("Generate editor metadata (contentrail.editor.json)?", true);
|
|
35
|
+
if (host.isCancel(withEditor)) {
|
|
36
|
+
host.cancel("Setup cancelled.");
|
|
37
|
+
return cancelledResult();
|
|
38
|
+
}
|
|
39
|
+
const withFunctions = await host.confirm("Add Cloudflare Pages Functions templates (/api)?", true);
|
|
40
|
+
if (host.isCancel(withFunctions)) {
|
|
41
|
+
host.cancel("Setup cancelled.");
|
|
42
|
+
return cancelledResult();
|
|
43
|
+
}
|
|
44
|
+
const force = await host.confirm("Overwrite existing ContentRail files if present?", false);
|
|
45
|
+
if (host.isCancel(force)) {
|
|
46
|
+
host.cancel("Setup cancelled.");
|
|
47
|
+
return cancelledResult();
|
|
48
|
+
}
|
|
49
|
+
const install = await host.confirm("Install ContentRail packages into this project now?", true);
|
|
50
|
+
if (host.isCancel(install)) {
|
|
51
|
+
host.cancel("Setup cancelled.");
|
|
52
|
+
return cancelledResult();
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
framework,
|
|
56
|
+
withEditor,
|
|
57
|
+
withFunctions,
|
|
58
|
+
force,
|
|
59
|
+
install,
|
|
60
|
+
cancelled: false,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function cancelledResult() {
|
|
64
|
+
return {
|
|
65
|
+
framework: "static",
|
|
66
|
+
withEditor: true,
|
|
67
|
+
withFunctions: true,
|
|
68
|
+
force: false,
|
|
69
|
+
install: false,
|
|
70
|
+
cancelled: true,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=init-wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-wizard.js","sourceRoot":"","sources":["../../src/interactive/init-wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive prompts require a real TTY and a non-CI environment.
|
|
3
|
+
* `--yes` / `-y` always forces non-interactive command paths.
|
|
4
|
+
*/
|
|
5
|
+
export declare function canUseInteractiveUi(env?: NodeJS.ProcessEnv, streams?: {
|
|
6
|
+
readonly stdin?: NodeJS.ReadStream;
|
|
7
|
+
readonly stdout?: NodeJS.WritableStream;
|
|
8
|
+
}): boolean;
|
|
9
|
+
//# sourceMappingURL=is-interactive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-interactive.d.ts","sourceRoot":"","sources":["../../src/interactive/is-interactive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,OAAO,GAAE;IACP,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CACpC,GACL,OAAO,CAaT"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive prompts require a real TTY and a non-CI environment.
|
|
3
|
+
* `--yes` / `-y` always forces non-interactive command paths.
|
|
4
|
+
*/
|
|
5
|
+
export function canUseInteractiveUi(env = process.env, streams = {}) {
|
|
6
|
+
if (env.CI === "true" || env.CI === "1") {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
if (env.CONTENTRAIL_FORCE_INTERACTIVE === "1") {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
if (env.CONTENTRAIL_NO_INTERACTIVE === "1") {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const stdin = streams.stdin ?? process.stdin;
|
|
16
|
+
const stdout = streams.stdout ?? process.stdout;
|
|
17
|
+
return Boolean(stdin.isTTY) && Boolean("isTTY" in stdout && stdout.isTTY);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=is-interactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-interactive.js","sourceRoot":"","sources":["../../src/interactive/is-interactive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAyB,OAAO,CAAC,GAAG,EACpC,UAGI,EAAE;IAEN,IAAI,GAAG,CAAC,EAAE,KAAK,MAAM,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,GAAG,CAAC,6BAA6B,KAAK,GAAG,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,GAAG,CAAC,0BAA0B,KAAK,GAAG,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAChD,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/interactive/menu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,CAsDnC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export async function runMainMenu(host, log) {
|
|
2
|
+
host.intro(`ContentRail — configure your static site`);
|
|
3
|
+
host.note([
|
|
4
|
+
"You keep your pages, routes, and design.",
|
|
5
|
+
"ContentRail adds schemas, /admin, Git publish, and Pages helpers.",
|
|
6
|
+
"Configure Git + Cloudflare here; secrets stay in env / dashboard.",
|
|
7
|
+
].join("\n"), "Developer owns the site");
|
|
8
|
+
const action = await host.select("What do you want to do?", [
|
|
9
|
+
{
|
|
10
|
+
value: "setup",
|
|
11
|
+
label: "Setup ContentRail",
|
|
12
|
+
hint: "init + install packages for this site",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
value: "connect",
|
|
16
|
+
label: "Connect GitHub + Cloudflare Pages",
|
|
17
|
+
hint: "needs CF_API_TOKEN in your environment",
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
value: "doctor",
|
|
21
|
+
label: "Doctor",
|
|
22
|
+
hint: "diagnose local setup",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
value: "status",
|
|
26
|
+
label: "Status",
|
|
27
|
+
hint: "summarize project state",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
value: "deploy",
|
|
31
|
+
label: "Deploy",
|
|
32
|
+
hint: "build and deploy to Pages",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
value: "help",
|
|
36
|
+
label: "Show command help",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
value: "exit",
|
|
40
|
+
label: "Exit",
|
|
41
|
+
},
|
|
42
|
+
]);
|
|
43
|
+
if (host.isCancel(action)) {
|
|
44
|
+
host.cancel("Cancelled.");
|
|
45
|
+
return "cancelled";
|
|
46
|
+
}
|
|
47
|
+
log.info(`Selected: ${action}`);
|
|
48
|
+
return action;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/interactive/menu.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAgB,EAChB,GAAW;IAEX,IAAI,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACvD,IAAI,CAAC,IAAI,CACP;QACE,0CAA0C;QAC1C,mEAAmE;QACnE,mEAAmE;KACpE,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,yBAAyB,CAC1B,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAa,yBAAyB,EAAE;QACtE;YACE,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,mBAAmB;YAC1B,IAAI,EAAE,uCAAuC;SAC9C;QACD;YACE,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,mCAAmC;YAC1C,IAAI,EAAE,wCAAwC;SAC/C;QACD;YACE,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,sBAAsB;SAC7B;QACD;YACE,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,yBAAyB;SAChC;QACD;YACE,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,2BAA2B;SAClC;QACD;YACE,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,mBAAmB;SAC3B;QACD;YACE,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,MAAM;SACd;KACF,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC1B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type MenuAction = "setup" | "connect" | "doctor" | "status" | "deploy" | "help" | "exit";
|
|
2
|
+
export interface SelectOption<T extends string> {
|
|
3
|
+
readonly value: T;
|
|
4
|
+
readonly label: string;
|
|
5
|
+
readonly hint?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface PromptHost {
|
|
8
|
+
intro(message: string): void;
|
|
9
|
+
outro(message: string): void;
|
|
10
|
+
note(message: string, title?: string): void;
|
|
11
|
+
select<T extends string>(message: string, options: readonly SelectOption<T>[]): Promise<T | symbol>;
|
|
12
|
+
confirm(message: string, initial?: boolean): Promise<boolean | symbol>;
|
|
13
|
+
text(message: string, options?: {
|
|
14
|
+
readonly placeholder?: string;
|
|
15
|
+
readonly initialValue?: string;
|
|
16
|
+
}): Promise<string | symbol>;
|
|
17
|
+
cancel(message?: string): void;
|
|
18
|
+
isCancel(value: unknown): value is symbol;
|
|
19
|
+
}
|
|
20
|
+
export interface InstallPlan {
|
|
21
|
+
readonly dependencies: readonly string[];
|
|
22
|
+
readonly devDependencies: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
export interface InstallResult {
|
|
25
|
+
readonly ok: boolean;
|
|
26
|
+
readonly skipped: boolean;
|
|
27
|
+
readonly detail: string;
|
|
28
|
+
}
|
|
29
|
+
export type InstallDepsFn = (input: {
|
|
30
|
+
readonly projectRoot: string;
|
|
31
|
+
readonly plan: InstallPlan;
|
|
32
|
+
readonly dryRun: boolean;
|
|
33
|
+
}) => Promise<InstallResult>;
|
|
34
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/interactive/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM;IAC5C,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,MAAM,CAAC,CAAC,SAAS,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,GAClC,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;IACvB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;IACvE,IAAI,CACF,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1E,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC5B,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC;CAC3C;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/interactive/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contentrail/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
|
-
"description": "ContentRail developer CLI
|
|
6
|
+
"description": "ContentRail developer CLI — interactive setup, init, validate, build, doctor, connect, deploy.",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"engines": {
|
|
9
9
|
"node": ">=22"
|
|
@@ -26,10 +26,11 @@
|
|
|
26
26
|
"LICENSE"
|
|
27
27
|
],
|
|
28
28
|
"dependencies": {
|
|
29
|
+
"@clack/prompts": "^1.8.1",
|
|
29
30
|
"jiti": "^2.6.1",
|
|
30
31
|
"zod": "^4.6.7",
|
|
31
|
-
"@contentrail/core": "0.2.
|
|
32
|
-
"@contentrail/reader": "0.2.
|
|
32
|
+
"@contentrail/core": "0.2.3",
|
|
33
|
+
"@contentrail/reader": "0.2.3"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
35
36
|
"@types/node": "^22.20.5",
|