frontend-auto-cms 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +64 -0
  3. package/dist/cli/apply.d.ts +7 -0
  4. package/dist/cli/apply.js +102 -0
  5. package/dist/cli/apply.js.map +1 -0
  6. package/dist/cli/fs-utils.d.ts +5 -0
  7. package/dist/cli/fs-utils.js +54 -0
  8. package/dist/cli/fs-utils.js.map +1 -0
  9. package/dist/cli/index.d.ts +2 -0
  10. package/dist/cli/index.js +32 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/cli/postinstall.d.ts +1 -0
  13. package/dist/cli/postinstall.js +10 -0
  14. package/dist/cli/postinstall.js.map +1 -0
  15. package/dist/cli/scanner.d.ts +2 -0
  16. package/dist/cli/scanner.js +97 -0
  17. package/dist/cli/scanner.js.map +1 -0
  18. package/dist/cli/setup.d.ts +6 -0
  19. package/dist/cli/setup.js +256 -0
  20. package/dist/cli/setup.js.map +1 -0
  21. package/dist/runtime/dashboard.js +1189 -0
  22. package/dist/runtime/index.js +7 -0
  23. package/dist/runtime/runtime/dashboard.d.ts +2 -0
  24. package/dist/runtime/runtime/dom-scan.d.ts +3 -0
  25. package/dist/runtime/runtime/i18n.d.ts +7 -0
  26. package/dist/runtime/runtime/index.d.ts +1 -0
  27. package/dist/runtime/runtime/publish.d.ts +11 -0
  28. package/dist/runtime/runtime/store.d.ts +7 -0
  29. package/dist/runtime/runtime/types.d.ts +8 -0
  30. package/dist/runtime/shared/constants.d.ts +10 -0
  31. package/dist/runtime/shared/hash.d.ts +4 -0
  32. package/dist/runtime/shared/types.d.ts +71 -0
  33. package/dist/shared/constants.d.ts +10 -0
  34. package/dist/shared/constants.js +11 -0
  35. package/dist/shared/constants.js.map +1 -0
  36. package/dist/shared/hash.d.ts +4 -0
  37. package/dist/shared/hash.js +19 -0
  38. package/dist/shared/hash.js.map +1 -0
  39. package/dist/shared/types.d.ts +71 -0
  40. package/dist/shared/types.js +2 -0
  41. package/dist/shared/types.js.map +1 -0
  42. package/package.json +68 -0
@@ -0,0 +1,256 @@
1
+ import inquirer from "inquirer";
2
+ import chalk from "chalk";
3
+ import { resolve, relative, sep, extname, basename } from "node:path";
4
+ import { readdir, readFile } from "node:fs/promises";
5
+ import { CMS_CONFIG_FILE, CMS_CONTENT_FILE, CMS_ASSET_DIR, CMS_RUNTIME_AUTH_FILE, CMS_HOSTING_FILE, CMS_RUNTIME_HOSTING_FILE, CMS_RUNTIME_SETTINGS_FILE, CMS_RUNTIME_LOCALES_FILE } from "../shared/constants.js";
6
+ import { createSalt, hashPasscode, hashRuntimePasscode } from "../shared/hash.js";
7
+ import { ensureDir, exists, walkProject, writeJson } from "./fs-utils.js";
8
+ import { scanFiles } from "./scanner.js";
9
+ async function readSeedLocales(cwd, localeDir) {
10
+ try {
11
+ const dir = resolve(cwd, localeDir);
12
+ const entries = await readdir(dir, { withFileTypes: true });
13
+ const locales = {};
14
+ for (const entry of entries) {
15
+ if (!entry.isFile() || extname(entry.name) !== ".json") {
16
+ continue;
17
+ }
18
+ const lang = basename(entry.name, ".json").toLowerCase();
19
+ const raw = await readFile(resolve(dir, entry.name), "utf8");
20
+ const parsed = JSON.parse(raw);
21
+ if (parsed && typeof parsed === "object") {
22
+ locales[lang] = parsed;
23
+ }
24
+ }
25
+ return locales;
26
+ }
27
+ catch {
28
+ return {};
29
+ }
30
+ }
31
+ function normalizePath(path) {
32
+ const trimmed = path.trim();
33
+ if (!trimmed) {
34
+ return "/";
35
+ }
36
+ return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
37
+ }
38
+ function normalizeRoute(route) {
39
+ const clean = route.replace(/\\/g, "/").replace(/\/+/g, "/");
40
+ if (!clean || clean === "/") {
41
+ return "/";
42
+ }
43
+ const noTrailing = clean.endsWith("/") ? clean.slice(0, -1) : clean;
44
+ return noTrailing.startsWith("/") ? noTrailing : `/${noTrailing}`;
45
+ }
46
+ function toRouteFromPathParts(parts, fallback = "/") {
47
+ const filtered = parts.filter(Boolean);
48
+ if (!filtered.length) {
49
+ return fallback;
50
+ }
51
+ if (filtered[filtered.length - 1] === "index") {
52
+ filtered.pop();
53
+ }
54
+ if (!filtered.length) {
55
+ return "/";
56
+ }
57
+ return normalizeRoute(`/${filtered.join("/")}`);
58
+ }
59
+ function detectPageRoute(root, absoluteFile) {
60
+ const rel = relative(root, absoluteFile).split(sep).join("/");
61
+ const noExt = rel.replace(/\.[^.]+$/, "");
62
+ const parts = noExt.split("/").filter(Boolean);
63
+ if (!parts.length) {
64
+ return null;
65
+ }
66
+ if (parts[0] === "public") {
67
+ return null;
68
+ }
69
+ if (parts.length === 1 && parts[0] === "index") {
70
+ return "/";
71
+ }
72
+ const srcPagesIdx = parts.findIndex((p) => p === "pages");
73
+ if (srcPagesIdx >= 0) {
74
+ return toRouteFromPathParts(parts.slice(srcPagesIdx + 1));
75
+ }
76
+ const srcRoutesIdx = parts.findIndex((p) => p === "routes");
77
+ if (srcRoutesIdx >= 0) {
78
+ const routeParts = parts.slice(srcRoutesIdx + 1).filter((p) => p !== "+page" && p !== "+layout");
79
+ return toRouteFromPathParts(routeParts);
80
+ }
81
+ const appIdx = parts.findIndex((p) => p === "app");
82
+ if (appIdx >= 0) {
83
+ const routeParts = parts
84
+ .slice(appIdx + 1)
85
+ .filter((p) => p !== "page" && p !== "layout" && !p.startsWith("(") && !p.endsWith(")"));
86
+ return toRouteFromPathParts(routeParts);
87
+ }
88
+ if (parts[parts.length - 1] === "index") {
89
+ return toRouteFromPathParts(parts);
90
+ }
91
+ if (parts[0] !== "src") {
92
+ return toRouteFromPathParts(parts);
93
+ }
94
+ return null;
95
+ }
96
+ function detectPagesFromFiles(root, files, dashboardPath) {
97
+ const routes = new Set();
98
+ for (const file of files) {
99
+ const route = detectPageRoute(root, file);
100
+ if (!route) {
101
+ continue;
102
+ }
103
+ const normalized = normalizeRoute(route);
104
+ if (normalized !== normalizeRoute(dashboardPath)) {
105
+ routes.add(normalized);
106
+ }
107
+ }
108
+ if (!routes.size) {
109
+ routes.add("/");
110
+ }
111
+ return Array.from(routes).sort((a, b) => {
112
+ if (a === "/") {
113
+ return -1;
114
+ }
115
+ if (b === "/") {
116
+ return 1;
117
+ }
118
+ return a.localeCompare(b);
119
+ });
120
+ }
121
+ export async function setupCms(options = {}) {
122
+ const cwd = options.cwd ?? process.cwd();
123
+ const configPath = resolve(cwd, CMS_CONFIG_FILE);
124
+ const contentPath = resolve(cwd, CMS_CONTENT_FILE);
125
+ const alreadyConfigured = await exists(configPath);
126
+ if (alreadyConfigured && options.silent) {
127
+ return;
128
+ }
129
+ const { passcode } = await inquirer.prompt([
130
+ {
131
+ type: "password",
132
+ name: "passcode",
133
+ message: "Choose your CMS passcode:",
134
+ mask: "*",
135
+ validate: (input) => {
136
+ const value = input.trim();
137
+ if (value.length < 10) {
138
+ return "Passcode must be at least 10 characters.";
139
+ }
140
+ if (!/[a-z]/i.test(value) || !/[0-9]/.test(value)) {
141
+ return "Passcode must include at least one letter and one number.";
142
+ }
143
+ return true;
144
+ }
145
+ }
146
+ ]);
147
+ const routeAnswers = await inquirer.prompt([
148
+ {
149
+ type: "input",
150
+ name: "dashboardPath",
151
+ message: "Dashboard route path (for editors):",
152
+ default: "/dashboard",
153
+ validate: (input) => (input.trim() ? true : "Dashboard path is required.")
154
+ }
155
+ ]);
156
+ const securityAnswers = await inquirer.prompt([
157
+ {
158
+ type: "confirm",
159
+ name: "autoTranslateEnabled",
160
+ message: "Enable automatic translation via third-party API?",
161
+ default: true
162
+ }
163
+ ]);
164
+ const hostingAnswers = await inquirer.prompt([
165
+ {
166
+ type: "list",
167
+ name: "provider",
168
+ message: "Where is your code hosted for Save & Publish?",
169
+ choices: [
170
+ { name: "None (export patch only)", value: "none" },
171
+ { name: "GitHub", value: "github" },
172
+ { name: "GitLab", value: "gitlab" }
173
+ ],
174
+ default: "none"
175
+ },
176
+ {
177
+ type: "input",
178
+ name: "repository",
179
+ message: "Repository slug (owner/repo or group/project):",
180
+ when: (answers) => answers.provider !== "none",
181
+ validate: (input) => (input.trim() ? true : "Repository is required.")
182
+ },
183
+ {
184
+ type: "input",
185
+ name: "branch",
186
+ message: "Branch to publish to:",
187
+ default: "main",
188
+ when: (answers) => answers.provider !== "none",
189
+ validate: (input) => (input.trim() ? true : "Branch is required.")
190
+ }
191
+ ]);
192
+ const files = await walkProject(cwd);
193
+ const content = await scanFiles(cwd, files);
194
+ const dashboardPath = normalizePath(routeAnswers.dashboardPath);
195
+ const detectedPages = detectPagesFromFiles(cwd, files, dashboardPath);
196
+ const salt = createSalt();
197
+ const config = {
198
+ version: 1,
199
+ passcodeSalt: salt,
200
+ passcodeHash: hashPasscode(passcode, salt),
201
+ contentFile: CMS_CONTENT_FILE,
202
+ localeDir: "locales",
203
+ dashboardPath,
204
+ pages: detectedPages
205
+ };
206
+ const runtimeLocales = {
207
+ version: 1,
208
+ locales: await readSeedLocales(cwd, config.localeDir)
209
+ };
210
+ const runtimeSalt = createSalt();
211
+ const runtimeAuth = {
212
+ version: 1,
213
+ algorithm: "sha256",
214
+ salt: runtimeSalt,
215
+ passcodeHash: hashRuntimePasscode(passcode, runtimeSalt)
216
+ };
217
+ await writeJson(configPath, config);
218
+ await writeJson(contentPath, content);
219
+ await ensureDir(resolve(cwd, CMS_ASSET_DIR));
220
+ await writeJson(resolve(cwd, CMS_RUNTIME_AUTH_FILE), runtimeAuth);
221
+ const hostingConfig = {
222
+ version: 1,
223
+ provider: hostingAnswers.provider,
224
+ repository: hostingAnswers.repository ?? "",
225
+ branch: hostingAnswers.branch ?? "main"
226
+ };
227
+ await writeJson(resolve(cwd, CMS_HOSTING_FILE), hostingConfig);
228
+ await writeJson(resolve(cwd, CMS_RUNTIME_HOSTING_FILE), hostingConfig);
229
+ const runtimeSettings = {
230
+ version: 1,
231
+ dashboardPath: config.dashboardPath ?? "/dashboard",
232
+ pages: config.pages ?? ["/"],
233
+ showFloatingButton: false,
234
+ autoTranslateEnabled: securityAnswers.autoTranslateEnabled
235
+ };
236
+ await writeJson(resolve(cwd, CMS_RUNTIME_SETTINGS_FILE), runtimeSettings);
237
+ await writeJson(resolve(cwd, CMS_RUNTIME_LOCALES_FILE), runtimeLocales);
238
+ if (!options.silent) {
239
+ process.stdout.write("\n");
240
+ process.stdout.write(chalk.bold.green("frontend-auto-cms initialized successfully.\n"));
241
+ process.stdout.write(chalk.cyan(`- Config: ${CMS_CONFIG_FILE}\n`));
242
+ process.stdout.write(chalk.cyan(`- Content: ${CMS_CONTENT_FILE}\n`));
243
+ process.stdout.write(chalk.cyan(`- Assets directory: ${CMS_ASSET_DIR}\n`));
244
+ process.stdout.write(chalk.cyan(`- Runtime auth: ${CMS_RUNTIME_AUTH_FILE}\n`));
245
+ process.stdout.write(chalk.cyan(`- Hosting config: ${CMS_HOSTING_FILE}\n`));
246
+ process.stdout.write(chalk.cyan(`- Runtime hosting: ${CMS_RUNTIME_HOSTING_FILE}\n`));
247
+ process.stdout.write(chalk.cyan(`- Runtime settings: ${CMS_RUNTIME_SETTINGS_FILE}\n`));
248
+ process.stdout.write(chalk.cyan(`- Runtime locales: ${CMS_RUNTIME_LOCALES_FILE}\n`));
249
+ process.stdout.write(chalk.cyan(`- Detected pages: ${(runtimeSettings.pages ?? []).join(", ")}\n`));
250
+ process.stdout.write(chalk.yellow("\nNext steps:\n"));
251
+ process.stdout.write("1) Add `import \"frontend-auto-cms\";` to your frontend entry file.\n");
252
+ process.stdout.write(`2) Open ${runtimeSettings.dashboardPath} to edit your site.\n`);
253
+ process.stdout.write("3) After edits, click Save + Publish (or export patch and run apply).\n\n");
254
+ }
255
+ }
256
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}