@contentrail/cli 0.2.0 → 0.2.2
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 +27 -21
- package/dist/cli.d.ts +9 -5
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +253 -31
- package/dist/cli.js.map +1 -1
- package/dist/cloudflare/pages-client.d.ts +52 -0
- package/dist/cloudflare/pages-client.d.ts.map +1 -0
- package/dist/cloudflare/pages-client.js +118 -0
- package/dist/cloudflare/pages-client.js.map +1 -0
- package/dist/commands/connect.d.ts +15 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +132 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/deploy.d.ts +19 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +136 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +4 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +31 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +47 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/import.d.ts +10 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +87 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init-next-admin.d.ts +7 -0
- package/dist/commands/init-next-admin.d.ts.map +1 -0
- package/dist/commands/init-next-admin.js +170 -0
- package/dist/commands/init-next-admin.js.map +1 -0
- package/dist/commands/init.d.ts +3 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +212 -15
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pages.d.ts +2 -0
- package/dist/commands/pages.d.ts.map +1 -0
- package/dist/commands/pages.js +2 -0
- package/dist/commands/pages.js.map +1 -0
- package/dist/commands/publish.d.ts +15 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +105 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/config/save.d.ts +4 -0
- package/dist/config/save.d.ts.map +1 -0
- package/dist/config/save.js +22 -0
- package/dist/config/save.js.map +1 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +62 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/config/types.d.ts +24 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/detect/framework.d.ts +1 -1
- package/dist/detect/framework.d.ts.map +1 -1
- package/dist/detect/framework.js +9 -2
- package/dist/detect/framework.js.map +1 -1
- package/dist/editor/validate-config.d.ts.map +1 -1
- package/dist/editor/validate-config.js +16 -2
- package/dist/editor/validate-config.js.map +1 -1
- package/dist/git/remote.d.ts +8 -0
- package/dist/git/remote.d.ts.map +1 -0
- package/dist/git/remote.js +32 -0
- package/dist/git/remote.js.map +1 -0
- package/dist/import/csv.d.ts +6 -0
- package/dist/import/csv.d.ts.map +1 -0
- package/dist/import/csv.js +78 -0
- package/dist/import/csv.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { validateEntry } from "@contentrail/core";
|
|
4
|
+
import { loadCollectionsModule } from "../collections/load.js";
|
|
5
|
+
import { loadProject } from "../config/load.js";
|
|
6
|
+
import { ExitCode } from "../exit-codes.js";
|
|
7
|
+
import { parseCsv } from "../import/csv.js";
|
|
8
|
+
import { ensureDir, writeFileSafe } from "../util/fs.js";
|
|
9
|
+
export async function runImport(options, log) {
|
|
10
|
+
const project = await loadProject(options.projectRoot);
|
|
11
|
+
const collections = await loadCollectionsModule(project.collectionsAbs);
|
|
12
|
+
const collection = collections.find((item) => item.name === options.collection);
|
|
13
|
+
if (collection === undefined) {
|
|
14
|
+
log.error(`Unknown collection "${options.collection}". Registered: ${collections
|
|
15
|
+
.map((item) => item.name)
|
|
16
|
+
.join(", ")}.`);
|
|
17
|
+
return ExitCode.Config;
|
|
18
|
+
}
|
|
19
|
+
const csvPath = path.resolve(options.projectRoot, options.file);
|
|
20
|
+
const text = await fs.readFile(csvPath, "utf8");
|
|
21
|
+
const table = parseCsv(text);
|
|
22
|
+
const targetDir = path.join(project.contentRootAbs, collection.name);
|
|
23
|
+
await ensureDir(targetDir);
|
|
24
|
+
let failed = 0;
|
|
25
|
+
let written = 0;
|
|
26
|
+
const planned = [];
|
|
27
|
+
for (const row of table.rows) {
|
|
28
|
+
const id = (row.id ?? row.slug ?? "").trim();
|
|
29
|
+
if (id === "") {
|
|
30
|
+
failed += 1;
|
|
31
|
+
log.error("CSV row is missing id or slug.");
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const data = coerceRow(row);
|
|
35
|
+
const result = validateEntry(collection, data);
|
|
36
|
+
if (!result.success) {
|
|
37
|
+
failed += 1;
|
|
38
|
+
log.error(`Invalid row "${id}": ${result.error.message}`);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const relative = path.join(project.config.contentRoot, collection.name, `${id}.json`);
|
|
42
|
+
planned.push(relative);
|
|
43
|
+
if (options.dryRun) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const outcome = await writeFileSafe(path.join(targetDir, `${id}.json`), `${JSON.stringify(result.data, null, 2)}\n`, { force: options.force });
|
|
47
|
+
if (outcome === "skipped") {
|
|
48
|
+
log.warn(`Left existing file unchanged: ${relative} (use --force)`);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
written += 1;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (options.dryRun) {
|
|
55
|
+
log.info(`Dry run: ${planned.length} valid row(s) would be written under ${path.join(project.config.contentRoot, collection.name)}/.`);
|
|
56
|
+
for (const item of planned) {
|
|
57
|
+
log.info(` - ${item}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
log.info(`Imported ${written} record(s) into ${collection.name}.`);
|
|
62
|
+
}
|
|
63
|
+
if (failed > 0) {
|
|
64
|
+
log.error(`${failed} CSV row(s) failed validation.`);
|
|
65
|
+
return ExitCode.Failure;
|
|
66
|
+
}
|
|
67
|
+
return ExitCode.Success;
|
|
68
|
+
}
|
|
69
|
+
function coerceRow(row) {
|
|
70
|
+
const data = {};
|
|
71
|
+
for (const [key, value] of Object.entries(row)) {
|
|
72
|
+
if (key === "id") {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (value === "true" || value === "false") {
|
|
76
|
+
data[key] = value === "true";
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (value !== "" && /^-?\d+(\.\d+)?$/.test(value)) {
|
|
80
|
+
data[key] = Number(value);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
data[key] = value;
|
|
84
|
+
}
|
|
85
|
+
return data;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const NEXT_ADMIN_FILES: readonly ["vite.admin.config.mjs", "contentrail.next.mjs", "public/_redirects"];
|
|
2
|
+
export declare function scaffoldNextAdmin(projectRoot: string, force: boolean | undefined): Promise<{
|
|
3
|
+
written: string[];
|
|
4
|
+
skipped: string[];
|
|
5
|
+
}>;
|
|
6
|
+
export declare function nextAdminInstallHint(framework?: "next" | "static"): string;
|
|
7
|
+
//# sourceMappingURL=init-next-admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-next-admin.d.ts","sourceRoot":"","sources":["../../src/commands/init-next-admin.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB,iFAInB,CAAC;AAIX,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,GAAG,SAAS,GACzB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAwCnD;AAED,wBAAgB,oBAAoB,CAClC,SAAS,GAAE,MAAM,GAAG,QAAiB,GACpC,MAAM,CAOR"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { pathExists, writeFileSafe } from "../util/fs.js";
|
|
4
|
+
export const NEXT_ADMIN_FILES = [
|
|
5
|
+
"vite.admin.config.mjs",
|
|
6
|
+
"contentrail.next.mjs",
|
|
7
|
+
"public/_redirects",
|
|
8
|
+
];
|
|
9
|
+
const ADMIN_BUILD = "vite build --config vite.admin.config.mjs";
|
|
10
|
+
export async function scaffoldNextAdmin(projectRoot, force) {
|
|
11
|
+
const written = [];
|
|
12
|
+
const skipped = [];
|
|
13
|
+
const viteConfig = await writeFileSafe(path.join(projectRoot, "vite.admin.config.mjs"), VITE_ADMIN_CONFIG, { force });
|
|
14
|
+
(viteConfig === "written" ? written : skipped).push("vite.admin.config.mjs");
|
|
15
|
+
const nextHelper = await writeFileSafe(path.join(projectRoot, "contentrail.next.mjs"), CONTENTRAIL_NEXT, { force });
|
|
16
|
+
(nextHelper === "written" ? written : skipped).push("contentrail.next.mjs");
|
|
17
|
+
const redirects = await writeFileSafe(path.join(projectRoot, "public/_redirects"), "/admin /admin/index.html 200\n/admin/ /admin/index.html 200\n", { force });
|
|
18
|
+
(redirects === "written" ? written : skipped).push("public/_redirects");
|
|
19
|
+
await ensureGitignore(projectRoot, "public/admin/");
|
|
20
|
+
const pkgPatch = await patchPackageJsonScripts(projectRoot);
|
|
21
|
+
if (pkgPatch === "written") {
|
|
22
|
+
written.push("package.json scripts (admin:build)");
|
|
23
|
+
}
|
|
24
|
+
const wrapped = await wrapNextConfig(projectRoot);
|
|
25
|
+
if (wrapped === "written") {
|
|
26
|
+
written.push("next.config wrap (withContentrail)");
|
|
27
|
+
}
|
|
28
|
+
else if (wrapped === "skipped") {
|
|
29
|
+
skipped.push("next.config (already wrapped or unrecognized)");
|
|
30
|
+
}
|
|
31
|
+
return { written, skipped };
|
|
32
|
+
}
|
|
33
|
+
export function nextAdminInstallHint(framework = "next") {
|
|
34
|
+
const packages = "npm install @contentrail/core @contentrail/editor @contentrail/cloudflare @contentrail/publisher preact@^10.26.0 zod@^4.6.7 && npm install -D vite@^8.3.5";
|
|
35
|
+
if (framework === "static") {
|
|
36
|
+
return `Static /admin: ${packages}. Run \`npm run admin:build\` to emit public/admin. Serve /admin/ on the same origin as the site. Publish uses Pages Functions /api.`;
|
|
37
|
+
}
|
|
38
|
+
return `Next /admin: ${packages}. Wrap next.config with withContentrail from ./contentrail.next.mjs. \`npm run build\` emits public/admin then the Next export. Open /admin/ on the same origin. Publish still uses Pages Functions /api, not Next route handlers.`;
|
|
39
|
+
}
|
|
40
|
+
async function patchPackageJsonScripts(projectRoot) {
|
|
41
|
+
const pkgPath = path.join(projectRoot, "package.json");
|
|
42
|
+
const raw = JSON.parse(await fs.readFile(pkgPath, "utf8"));
|
|
43
|
+
const scripts = { ...raw.scripts };
|
|
44
|
+
let changed = false;
|
|
45
|
+
if (scripts["admin:build"] === undefined) {
|
|
46
|
+
scripts["admin:build"] = ADMIN_BUILD;
|
|
47
|
+
changed = true;
|
|
48
|
+
}
|
|
49
|
+
const build = scripts.build ?? "";
|
|
50
|
+
if (build === "next build") {
|
|
51
|
+
scripts.build = `${ADMIN_BUILD} && next build`;
|
|
52
|
+
changed = true;
|
|
53
|
+
}
|
|
54
|
+
else if (build !== "" &&
|
|
55
|
+
!build.includes("vite.admin.config") &&
|
|
56
|
+
build.includes("next build")) {
|
|
57
|
+
scripts.build = `${ADMIN_BUILD} && ${build}`;
|
|
58
|
+
changed = true;
|
|
59
|
+
}
|
|
60
|
+
if (scripts.predev === undefined && scripts.dev === "next dev") {
|
|
61
|
+
scripts.predev = "npm run admin:build";
|
|
62
|
+
changed = true;
|
|
63
|
+
}
|
|
64
|
+
if (!changed) {
|
|
65
|
+
return "skipped";
|
|
66
|
+
}
|
|
67
|
+
await fs.writeFile(pkgPath, `${JSON.stringify({ ...raw, scripts }, null, 2)}\n`);
|
|
68
|
+
return "written";
|
|
69
|
+
}
|
|
70
|
+
async function wrapNextConfig(projectRoot) {
|
|
71
|
+
const candidates = [
|
|
72
|
+
"next.config.ts",
|
|
73
|
+
"next.config.mjs",
|
|
74
|
+
"next.config.js",
|
|
75
|
+
];
|
|
76
|
+
let configPath = null;
|
|
77
|
+
for (const name of candidates) {
|
|
78
|
+
const filePath = path.join(projectRoot, name);
|
|
79
|
+
if (await pathExists(filePath)) {
|
|
80
|
+
configPath = filePath;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (configPath === null) {
|
|
85
|
+
return "missing";
|
|
86
|
+
}
|
|
87
|
+
const original = await fs.readFile(configPath, "utf8");
|
|
88
|
+
if (original.includes("withContentrail")) {
|
|
89
|
+
return "skipped";
|
|
90
|
+
}
|
|
91
|
+
if (!/export default nextConfig;?\s*$/m.test(original)) {
|
|
92
|
+
return "skipped";
|
|
93
|
+
}
|
|
94
|
+
const importLine = 'import { withContentrail } from "./contentrail.next.mjs";\n';
|
|
95
|
+
const next = original.includes(importLine)
|
|
96
|
+
? original
|
|
97
|
+
: `${importLine}${original}`;
|
|
98
|
+
const wrapped = next.replace(/export default nextConfig;?\s*$/m, "export default withContentrail(nextConfig);\n");
|
|
99
|
+
if (wrapped === original) {
|
|
100
|
+
return "skipped";
|
|
101
|
+
}
|
|
102
|
+
await fs.writeFile(configPath, wrapped, "utf8");
|
|
103
|
+
return "written";
|
|
104
|
+
}
|
|
105
|
+
async function ensureGitignore(projectRoot, entry) {
|
|
106
|
+
const gitignore = path.join(projectRoot, ".gitignore");
|
|
107
|
+
if (!(await pathExists(gitignore))) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const current = await fs.readFile(gitignore, "utf8");
|
|
111
|
+
if (current.split("\n").some((line) => line.trim() === entry)) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const suffix = current.endsWith("\n") ? "" : "\n";
|
|
115
|
+
await fs.writeFile(gitignore, `${current}${suffix}${entry}\n`, "utf8");
|
|
116
|
+
}
|
|
117
|
+
const VITE_ADMIN_CONFIG = `import path from "node:path";
|
|
118
|
+
import { fileURLToPath } from "node:url";
|
|
119
|
+
import { defineConfig } from "vite";
|
|
120
|
+
|
|
121
|
+
const rootDir = path.dirname(fileURLToPath(import.meta.url));
|
|
122
|
+
|
|
123
|
+
export default defineConfig({
|
|
124
|
+
root: path.join(rootDir, "admin"),
|
|
125
|
+
base: "/admin/",
|
|
126
|
+
build: {
|
|
127
|
+
outDir: path.join(rootDir, "public", "admin"),
|
|
128
|
+
emptyOutDir: true,
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
`;
|
|
132
|
+
const CONTENTRAIL_NEXT = `/** Merge ContentRail static /admin into a Next.js config. */
|
|
133
|
+
export function withContentrail(nextConfig = {}) {
|
|
134
|
+
const images =
|
|
135
|
+
nextConfig.images !== null &&
|
|
136
|
+
typeof nextConfig.images === "object" &&
|
|
137
|
+
!Array.isArray(nextConfig.images)
|
|
138
|
+
? nextConfig.images
|
|
139
|
+
: {};
|
|
140
|
+
return {
|
|
141
|
+
...nextConfig,
|
|
142
|
+
output: "export",
|
|
143
|
+
trailingSlash: true,
|
|
144
|
+
images: { ...images, unoptimized: true },
|
|
145
|
+
async rewrites() {
|
|
146
|
+
const admin = [
|
|
147
|
+
{ source: "/admin", destination: "/admin/index.html" },
|
|
148
|
+
{ source: "/admin/", destination: "/admin/index.html" },
|
|
149
|
+
];
|
|
150
|
+
const existing = nextConfig.rewrites;
|
|
151
|
+
if (existing === undefined) {
|
|
152
|
+
return admin;
|
|
153
|
+
}
|
|
154
|
+
const extra =
|
|
155
|
+
typeof existing === "function" ? await existing() : existing;
|
|
156
|
+
if (Array.isArray(extra)) {
|
|
157
|
+
return [...admin, ...extra];
|
|
158
|
+
}
|
|
159
|
+
if (extra !== null && typeof extra === "object") {
|
|
160
|
+
return {
|
|
161
|
+
...extra,
|
|
162
|
+
beforeFiles: [...admin, ...(extra.beforeFiles ?? [])],
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
return admin;
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
`;
|
|
170
|
+
//# sourceMappingURL=init-next-admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-next-admin.js","sourceRoot":"","sources":["../../src/commands/init-next-admin.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -2,9 +2,11 @@ import { ExitCode } from "../exit-codes.js";
|
|
|
2
2
|
import type { Logger } from "../util/print.js";
|
|
3
3
|
export interface InitOptions {
|
|
4
4
|
readonly projectRoot: string;
|
|
5
|
-
readonly framework?: "astro" | "vite" | "auto";
|
|
5
|
+
readonly framework?: "astro" | "vite" | "next" | "static" | "auto";
|
|
6
6
|
readonly force?: boolean;
|
|
7
7
|
readonly withEditor?: boolean;
|
|
8
|
+
readonly withFunctions?: boolean;
|
|
9
|
+
readonly dryRun?: boolean;
|
|
8
10
|
readonly yes?: boolean;
|
|
9
11
|
}
|
|
10
12
|
export declare function runInit(options: InitOptions, log: Logger): Promise<ExitCode>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAO/C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,QAAQ,CAAC,CAsPnB"}
|
package/dist/commands/init.js
CHANGED
|
@@ -3,38 +3,67 @@ import { CONFIG_FILE_NAME, DEFAULT_CONFIG, } from "../config/types.js";
|
|
|
3
3
|
import { detectFrameworkFromPackage, readPackageJson, } from "../detect/framework.js";
|
|
4
4
|
import { ExitCode } from "../exit-codes.js";
|
|
5
5
|
import { ensureDir, writeFileSafe } from "../util/fs.js";
|
|
6
|
+
import { NEXT_ADMIN_FILES, nextAdminInstallHint, scaffoldNextAdmin, } from "./init-next-admin.js";
|
|
6
7
|
export async function runInit(options, log) {
|
|
8
|
+
const nodeMajor = Number(process.versions.node.split(".")[0]);
|
|
9
|
+
if (Number.isNaN(nodeMajor) || nodeMajor < 22) {
|
|
10
|
+
log.error(`Node.js >= 22 is required (found ${process.versions.node}).`);
|
|
11
|
+
return ExitCode.Failure;
|
|
12
|
+
}
|
|
7
13
|
const pkg = await readPackageJson(options.projectRoot);
|
|
8
14
|
if (pkg === null) {
|
|
9
|
-
log.error("No package.json found. Create
|
|
15
|
+
log.error("No package.json found. Create your static site first (Next.js, React, vanilla, Astro, Vite, …), then run contentrail init.");
|
|
10
16
|
return ExitCode.Config;
|
|
11
17
|
}
|
|
12
18
|
const detected = detectFrameworkFromPackage(pkg);
|
|
13
|
-
const framework = options.framework === "astro" ||
|
|
19
|
+
const framework = options.framework === "astro" ||
|
|
20
|
+
options.framework === "vite" ||
|
|
21
|
+
options.framework === "next" ||
|
|
22
|
+
options.framework === "static"
|
|
14
23
|
? options.framework
|
|
15
24
|
: detected === "unknown"
|
|
16
|
-
?
|
|
25
|
+
? "static"
|
|
17
26
|
: detected;
|
|
18
|
-
if (framework ===
|
|
19
|
-
log.
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
if (detected === "unknown" &&
|
|
24
|
-
options.framework === undefined &&
|
|
25
|
-
!options.yes) {
|
|
26
|
-
log.warn(`No framework dependency detected; using --framework ${framework} from flags/defaults.`);
|
|
27
|
+
if (framework === "static" || framework === "next") {
|
|
28
|
+
log.info(framework === "next"
|
|
29
|
+
? 'Next.js detected: ContentRail will not generate App Router pages. Use output: "export" so Pages can serve `out/`. Init adds content, /admin (Vite bundle into public/admin), and Pages Functions.'
|
|
30
|
+
: "Generic static site: ContentRail will not generate your HTML/React pages. Init adds content, /admin (Vite bundle into public/admin), and Pages Functions.");
|
|
27
31
|
}
|
|
28
32
|
const collectionsPath = framework === "astro" ? "src/contentrail/config.ts" : "content/config.ts";
|
|
33
|
+
const withEditor = options.withEditor !== false;
|
|
34
|
+
const withFunctions = options.withFunctions !== false;
|
|
29
35
|
const config = {
|
|
30
36
|
...DEFAULT_CONFIG,
|
|
31
37
|
framework,
|
|
32
38
|
collections: collectionsPath,
|
|
33
39
|
contentRoot: "content",
|
|
34
|
-
|
|
40
|
+
admin: { path: "/admin" },
|
|
41
|
+
...(withEditor ? { editorConfig: "contentrail.editor.json" } : {}),
|
|
35
42
|
};
|
|
36
43
|
const written = [];
|
|
37
44
|
const skipped = [];
|
|
45
|
+
const planned = [
|
|
46
|
+
CONFIG_FILE_NAME,
|
|
47
|
+
collectionsPath,
|
|
48
|
+
"content/articles/welcome.json",
|
|
49
|
+
];
|
|
50
|
+
if (withEditor) {
|
|
51
|
+
planned.push("contentrail.editor.json");
|
|
52
|
+
}
|
|
53
|
+
if (framework === "static" || framework === "next") {
|
|
54
|
+
planned.push("admin/index.html", "admin/main.ts", ...NEXT_ADMIN_FILES);
|
|
55
|
+
}
|
|
56
|
+
if (withFunctions) {
|
|
57
|
+
planned.push("functions/api/[[path]].ts", "functions/_middleware.ts", ".dev.vars.example");
|
|
58
|
+
}
|
|
59
|
+
if (options.dryRun) {
|
|
60
|
+
log.info(`Dry run: would create or skip these files for ${framework}:`);
|
|
61
|
+
for (const item of planned) {
|
|
62
|
+
log.info(` - ${item}`);
|
|
63
|
+
}
|
|
64
|
+
log.info("No files were written.");
|
|
65
|
+
return ExitCode.Success;
|
|
66
|
+
}
|
|
38
67
|
const configResult = await writeFileSafe(path.join(options.projectRoot, CONFIG_FILE_NAME), `${JSON.stringify(config, null, 2)}\n`, { force: options.force });
|
|
39
68
|
(configResult === "written" ? written : skipped).push(CONFIG_FILE_NAME);
|
|
40
69
|
const collectionSource = collectionModuleSource();
|
|
@@ -50,7 +79,7 @@ export async function runInit(options, log) {
|
|
|
50
79
|
body: "Edit this JSON or use the ContentRail editor.",
|
|
51
80
|
}, null, 2)}\n`, { force: options.force });
|
|
52
81
|
(entryResult === "written" ? written : skipped).push("content/articles/welcome.json");
|
|
53
|
-
if (
|
|
82
|
+
if (withEditor) {
|
|
54
83
|
const editorResult = await writeFileSafe(path.join(options.projectRoot, "contentrail.editor.json"), `${JSON.stringify({
|
|
55
84
|
collections: [
|
|
56
85
|
{
|
|
@@ -98,6 +127,26 @@ export async function runInit(options, log) {
|
|
|
98
127
|
}, null, 2)}\n`, { force: options.force });
|
|
99
128
|
(editorResult === "written" ? written : skipped).push("contentrail.editor.json");
|
|
100
129
|
}
|
|
130
|
+
if (framework === "static" || framework === "next") {
|
|
131
|
+
const htmlResult = await writeFileSafe(path.join(options.projectRoot, "admin/index.html"), ADMIN_HTML, { force: options.force });
|
|
132
|
+
(htmlResult === "written" ? written : skipped).push("admin/index.html");
|
|
133
|
+
const mainResult = await writeFileSafe(path.join(options.projectRoot, "admin/main.ts"), ADMIN_MAIN, { force: options.force });
|
|
134
|
+
(mainResult === "written" ? written : skipped).push("admin/main.ts");
|
|
135
|
+
const nextAdmin = await scaffoldNextAdmin(options.projectRoot, options.force);
|
|
136
|
+
written.push(...nextAdmin.written);
|
|
137
|
+
skipped.push(...nextAdmin.skipped);
|
|
138
|
+
}
|
|
139
|
+
if (withFunctions) {
|
|
140
|
+
const importPath = framework === "astro"
|
|
141
|
+
? "../../src/contentrail/config"
|
|
142
|
+
: "../../content/config";
|
|
143
|
+
const apiResult = await writeFileSafe(path.join(options.projectRoot, "functions/api/[[path]].ts"), pagesApiSource(importPath), { force: options.force });
|
|
144
|
+
(apiResult === "written" ? written : skipped).push("functions/api/[[path]].ts");
|
|
145
|
+
const middlewareResult = await writeFileSafe(path.join(options.projectRoot, "functions/_middleware.ts"), PAGES_MIDDLEWARE, { force: options.force });
|
|
146
|
+
(middlewareResult === "written" ? written : skipped).push("functions/_middleware.ts");
|
|
147
|
+
const varsResult = await writeFileSafe(path.join(options.projectRoot, ".dev.vars.example"), DEV_VARS_EXAMPLE, { force: options.force });
|
|
148
|
+
(varsResult === "written" ? written : skipped).push(".dev.vars.example");
|
|
149
|
+
}
|
|
101
150
|
log.info(`ContentRail initialized for ${framework}.`);
|
|
102
151
|
if (written.length > 0) {
|
|
103
152
|
log.info(`Created:\n${written.map((item) => ` - ${item}`).join("\n")}`);
|
|
@@ -107,9 +156,157 @@ export async function runInit(options, log) {
|
|
|
107
156
|
.map((item) => ` - ${item}`)
|
|
108
157
|
.join("\n")}`);
|
|
109
158
|
}
|
|
110
|
-
log.info(
|
|
159
|
+
log.info(framework === "next" || framework === "static"
|
|
160
|
+
? nextAdminInstallHint(framework)
|
|
161
|
+
: "Next: npm install @contentrail/core @contentrail/editor @contentrail/cloudflare @contentrail/publisher preact@^10.26.0 zod@^4.6.7. Export CF_API_TOKEN. Then `contentrail connect --confirm --yes` and `contentrail deploy`. Protect /admin with Cloudflare Access.");
|
|
111
162
|
return ExitCode.Success;
|
|
112
163
|
}
|
|
164
|
+
const ADMIN_HTML = `<!doctype html>
|
|
165
|
+
<html lang="en">
|
|
166
|
+
<head>
|
|
167
|
+
<meta charset="utf-8" />
|
|
168
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
169
|
+
<meta name="robots" content="noindex" />
|
|
170
|
+
<title>ContentRail Admin</title>
|
|
171
|
+
</head>
|
|
172
|
+
<body>
|
|
173
|
+
<div id="contentrail-admin"></div>
|
|
174
|
+
<script type="module" src="./main.ts"></script>
|
|
175
|
+
</body>
|
|
176
|
+
</html>
|
|
177
|
+
`;
|
|
178
|
+
const ADMIN_MAIN = `import {
|
|
179
|
+
createAdminSiteConfig,
|
|
180
|
+
mountAdmin,
|
|
181
|
+
} from "@contentrail/editor";
|
|
182
|
+
import { articles } from "../content/config";
|
|
183
|
+
|
|
184
|
+
const target = document.getElementById("contentrail-admin");
|
|
185
|
+
if (target === null) {
|
|
186
|
+
throw new Error("Missing #contentrail-admin");
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
mountAdmin({
|
|
190
|
+
target,
|
|
191
|
+
apiBaseUrl: window.location.origin,
|
|
192
|
+
sites: [
|
|
193
|
+
createAdminSiteConfig({
|
|
194
|
+
siteId: "site",
|
|
195
|
+
label: "Site",
|
|
196
|
+
collections: [{ collection: articles }],
|
|
197
|
+
}),
|
|
198
|
+
],
|
|
199
|
+
});
|
|
200
|
+
`;
|
|
201
|
+
const DEV_VARS_EXAMPLE = `# Copy to .dev.vars (gitignored). Never commit secrets.
|
|
202
|
+
# Do not use PUBLIC_* or VITE_* for secrets.
|
|
203
|
+
|
|
204
|
+
CONTENTRAIL_ACCESS_TEAM_DOMAIN=
|
|
205
|
+
CONTENTRAIL_ACCESS_AUD=
|
|
206
|
+
CONTENTRAIL_SITE_ID=
|
|
207
|
+
CONTENTRAIL_GIT_OWNER=
|
|
208
|
+
CONTENTRAIL_GIT_REPO=
|
|
209
|
+
CONTENTRAIL_GIT_BRANCH=main
|
|
210
|
+
CONTENTRAIL_CONTENT_ROOT=content
|
|
211
|
+
CONTENTRAIL_ADMIN_ORIGIN=http://localhost:4321
|
|
212
|
+
CONTENTRAIL_GITHUB_TOKEN=
|
|
213
|
+
`;
|
|
214
|
+
const PAGES_MIDDLEWARE = `/**
|
|
215
|
+
* Rejects unauthenticated API calls early.
|
|
216
|
+
* Static /admin HTML is NOT covered — configure Cloudflare Access on /admin*.
|
|
217
|
+
*/
|
|
218
|
+
export const onRequest: PagesFunction = async (context) => {
|
|
219
|
+
const url = new URL(context.request.url);
|
|
220
|
+
if (
|
|
221
|
+
url.pathname.startsWith("/api/") &&
|
|
222
|
+
url.pathname !== "/api/health" &&
|
|
223
|
+
context.request.method !== "OPTIONS"
|
|
224
|
+
) {
|
|
225
|
+
const access = context.request.headers.get("Cf-Access-Jwt-Assertion");
|
|
226
|
+
const authorization = context.request.headers.get("Authorization");
|
|
227
|
+
const hasBearer =
|
|
228
|
+
authorization !== null && /^Bearer\\s+\\S+/i.test(authorization);
|
|
229
|
+
if ((access === null || access.trim() === "") && !hasBearer) {
|
|
230
|
+
return new Response(
|
|
231
|
+
JSON.stringify({
|
|
232
|
+
error: {
|
|
233
|
+
code: "MISSING_CREDENTIAL",
|
|
234
|
+
message: "Missing Access JWT credential.",
|
|
235
|
+
},
|
|
236
|
+
}),
|
|
237
|
+
{ status: 401, headers: { "content-type": "application/json" } },
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return context.next();
|
|
242
|
+
};
|
|
243
|
+
`;
|
|
244
|
+
function pagesApiSource(collectionsImport) {
|
|
245
|
+
return `/**
|
|
246
|
+
* ContentRail Pages Functions API. Server-only.
|
|
247
|
+
* Bind secrets in Pages / .dev.vars — never PUBLIC_* or VITE_*.
|
|
248
|
+
*/
|
|
249
|
+
import {
|
|
250
|
+
createCloudflareAccessAuthenticator,
|
|
251
|
+
createPagesSiteHandler,
|
|
252
|
+
createSiteAuthorizer,
|
|
253
|
+
} from "@contentrail/cloudflare";
|
|
254
|
+
import {
|
|
255
|
+
createGitHubGitDataClient,
|
|
256
|
+
createGitPublishProvider,
|
|
257
|
+
createPublisher,
|
|
258
|
+
} from "@contentrail/publisher";
|
|
259
|
+
import { articles } from "${collectionsImport}";
|
|
260
|
+
|
|
261
|
+
interface Env {
|
|
262
|
+
CONTENTRAIL_ACCESS_TEAM_DOMAIN: string;
|
|
263
|
+
CONTENTRAIL_ACCESS_AUD: string;
|
|
264
|
+
CONTENTRAIL_SITE_ID: string;
|
|
265
|
+
CONTENTRAIL_GIT_OWNER: string;
|
|
266
|
+
CONTENTRAIL_GIT_REPO: string;
|
|
267
|
+
CONTENTRAIL_GIT_BRANCH: string;
|
|
268
|
+
CONTENTRAIL_CONTENT_ROOT: string;
|
|
269
|
+
CONTENTRAIL_ADMIN_ORIGIN: string;
|
|
270
|
+
CONTENTRAIL_GITHUB_TOKEN: string;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
export const onRequest: PagesFunction<Env> = async (context) => {
|
|
274
|
+
const env = context.env;
|
|
275
|
+
const handler = createPagesSiteHandler({
|
|
276
|
+
siteId: env.CONTENTRAIL_SITE_ID,
|
|
277
|
+
authenticator: createCloudflareAccessAuthenticator({
|
|
278
|
+
teamDomain: env.CONTENTRAIL_ACCESS_TEAM_DOMAIN,
|
|
279
|
+
audience: env.CONTENTRAIL_ACCESS_AUD,
|
|
280
|
+
}),
|
|
281
|
+
authorizer: createSiteAuthorizer({
|
|
282
|
+
sites: {
|
|
283
|
+
[env.CONTENTRAIL_SITE_ID]: {
|
|
284
|
+
destinationRef: "git:allowlisted",
|
|
285
|
+
permissions: ["read", "publish", "status", "rollback", "validate"],
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
}),
|
|
289
|
+
collections: { articles },
|
|
290
|
+
corsAllowedOrigins: [env.CONTENTRAIL_ADMIN_ORIGIN],
|
|
291
|
+
getPublisher: () =>
|
|
292
|
+
createPublisher({
|
|
293
|
+
provider: createGitPublishProvider({
|
|
294
|
+
branch: env.CONTENTRAIL_GIT_BRANCH,
|
|
295
|
+
contentRoot: env.CONTENTRAIL_CONTENT_ROOT,
|
|
296
|
+
hasCredential: Boolean(env.CONTENTRAIL_GITHUB_TOKEN),
|
|
297
|
+
client: createGitHubGitDataClient({
|
|
298
|
+
token: env.CONTENTRAIL_GITHUB_TOKEN,
|
|
299
|
+
owner: env.CONTENTRAIL_GIT_OWNER,
|
|
300
|
+
repo: env.CONTENTRAIL_GIT_REPO,
|
|
301
|
+
allowedPathPrefix: env.CONTENTRAIL_CONTENT_ROOT,
|
|
302
|
+
}),
|
|
303
|
+
}),
|
|
304
|
+
}),
|
|
305
|
+
});
|
|
306
|
+
return handler(context.request);
|
|
307
|
+
};
|
|
308
|
+
`;
|
|
309
|
+
}
|
|
113
310
|
function collectionModuleSource() {
|
|
114
311
|
return `import { defineCollection } from "@contentrail/core";
|
|
115
312
|
import { z } from "zod";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,cAAc,GAEf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,0BAA0B,EAC1B,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/commands/pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/commands/pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ExitCode } from "../exit-codes.js";
|
|
2
|
+
import type { Logger } from "../util/print.js";
|
|
3
|
+
/**
|
|
4
|
+
* Publishes local JSON through the authenticated ContentRail API.
|
|
5
|
+
* Does not talk to GitHub. Token stays in CONTENTRAIL_PUBLISH_TOKEN.
|
|
6
|
+
*/
|
|
7
|
+
export declare function runPublish(options: {
|
|
8
|
+
readonly projectRoot: string;
|
|
9
|
+
readonly collection: string;
|
|
10
|
+
readonly expectedVersion?: string | null;
|
|
11
|
+
readonly dryRun: boolean;
|
|
12
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
13
|
+
readonly fetchImpl?: typeof fetch;
|
|
14
|
+
}, log: Logger): Promise<ExitCode>;
|
|
15
|
+
//# sourceMappingURL=publish.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE;IACP,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CACnC,EACD,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,QAAQ,CAAC,CAkFnB"}
|