@actuate-media/cli 0.2.5 → 0.3.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.
@@ -1,4 +1,4 @@
1
1
 
2
- > @actuate-media/cli@0.2.5 build /home/runner/work/actuatecms/actuatecms/packages/cli
2
+ > @actuate-media/cli@0.3.0 build /home/runner/work/actuatecms/actuatecms/packages/cli
3
3
  > tsc
4
4
 
@@ -0,0 +1,15 @@
1
+
2
+ > @actuate-media/cli@0.3.0 test /home/runner/work/actuatecms/actuatecms/packages/cli
3
+ > vitest run
4
+
5
+
6
+  RUN  v3.2.4 /home/runner/work/actuatecms/actuatecms/packages/cli
7
+
8
+ ✓ src/__tests__/seed.test.ts (2 tests) 32ms
9
+ ✓ src/__tests__/init.test.ts (2 tests) 83ms
10
+
11
+  Test Files  2 passed (2)
12
+  Tests  4 passed (4)
13
+  Start at  17:30:59
14
+  Duration  5.90s (transform 934ms, setup 0ms, collect 1.72s, tests 114ms, environment 0ms, prepare 1.52s)
15
+
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @actuate-media/cli
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 266b657: Add first-class public site helpers, CLI init/populate workflows, and generated frontend boilerplate for globals, document resolution, and media normalization.
8
+
3
9
  ## 0.2.5
4
10
 
5
11
  ### Patch Changes
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=init.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/init.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { Command } from 'commander';
3
+ import { describe, expect, it } from 'vitest';
4
+ import { buildCreateActuateArgs, registerInitCommand } from '../commands/init.js';
5
+ describe('init command', () => {
6
+ it('registers an init command that delegates to create-actuate-cms', () => {
7
+ const program = new Command();
8
+ registerInitCommand(program);
9
+ const command = program.commands.find((candidate) => candidate.name() === 'init');
10
+ expect(command).toBeDefined();
11
+ expect(buildCreateActuateArgs()).toEqual(['create', 'actuate-cms@latest']);
12
+ expect(buildCreateActuateArgs('maidpro-site')).toEqual([
13
+ 'create',
14
+ 'actuate-cms@latest',
15
+ 'maidpro-site',
16
+ ]);
17
+ });
18
+ it('exposes an actuate-cms bin alias for installed CLI usage', async () => {
19
+ const raw = await readFile(new URL('../../package.json', import.meta.url), 'utf-8');
20
+ const pkg = JSON.parse(raw);
21
+ expect(pkg.bin?.actuate).toBe('dist/index.js');
22
+ expect(pkg.bin?.['actuate-cms']).toBe('dist/index.js');
23
+ });
24
+ });
25
+ //# sourceMappingURL=init.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../src/__tests__/init.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAElF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAE7B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC;QAElF,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC;YACrD,QAAQ;YACR,oBAAoB;YACpB,cAAc;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACpF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqC,CAAC;QAEhE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=seed.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/seed.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { normalizeSeedPayload } from '../commands/seed.js';
3
+ describe('seed payload normalization', () => {
4
+ it('separates globals from collection documents', () => {
5
+ const normalized = normalizeSeedPayload({
6
+ globals: {
7
+ 'site-settings': {
8
+ siteName: 'MaidPro',
9
+ phone: '555-0100',
10
+ },
11
+ },
12
+ collections: {
13
+ pages: [
14
+ {
15
+ data: { title: 'Home', slug: 'home' },
16
+ status: 'PUBLISHED',
17
+ },
18
+ ],
19
+ },
20
+ });
21
+ expect(normalized.globals).toEqual([
22
+ {
23
+ slug: 'site-settings',
24
+ data: { siteName: 'MaidPro', phone: '555-0100' },
25
+ },
26
+ ]);
27
+ expect(normalized.documents).toEqual([
28
+ {
29
+ collection: 'pages',
30
+ data: { title: 'Home', slug: 'home' },
31
+ status: 'PUBLISHED',
32
+ },
33
+ ]);
34
+ });
35
+ it('keeps backwards-compatible collection-key seed files', () => {
36
+ const normalized = normalizeSeedPayload({
37
+ pages: [{ title: 'Home', slug: 'home' }],
38
+ });
39
+ expect(normalized.globals).toEqual([]);
40
+ expect(normalized.documents).toEqual([
41
+ {
42
+ collection: 'pages',
43
+ data: { title: 'Home', slug: 'home' },
44
+ status: 'DRAFT',
45
+ },
46
+ ]);
47
+ });
48
+ });
49
+ //# sourceMappingURL=seed.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.test.js","sourceRoot":"","sources":["../../src/__tests__/seed.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,UAAU,GAAG,oBAAoB,CAAC;YACtC,OAAO,EAAE;gBACP,eAAe,EAAE;oBACf,QAAQ,EAAE,SAAS;oBACnB,KAAK,EAAE,UAAU;iBAClB;aACF;YACD,WAAW,EAAE;gBACX,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;wBACrC,MAAM,EAAE,WAAW;qBACpB;iBACF;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACjC;gBACE,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE;aACjD;SACF,CAAC,CAAC;QACH,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YACnC;gBACE,UAAU,EAAE,OAAO;gBACnB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;gBACrC,MAAM,EAAE,WAAW;aACpB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,UAAU,GAAG,oBAAoB,CAAC;YACtC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACzC,CAAC,CAAC;QAEH,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YACnC;gBACE,UAAU,EAAE,OAAO;gBACnB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;gBACrC,MAAM,EAAE,OAAO;aAChB;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from 'commander';
2
+ export declare function buildCreateActuateArgs(projectName?: string): string[];
3
+ export declare function registerInitCommand(program: Command): void;
4
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAIrE;AAsBD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAK1D"}
@@ -0,0 +1,31 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { logger } from '../utils/logger.js';
3
+ export function buildCreateActuateArgs(projectName) {
4
+ const args = ['create', 'actuate-cms@latest'];
5
+ if (projectName)
6
+ args.push(projectName);
7
+ return args;
8
+ }
9
+ function npmCommand() {
10
+ return process.platform === 'win32' ? 'npm.cmd' : 'npm';
11
+ }
12
+ async function runInit(projectName) {
13
+ const child = spawn(npmCommand(), buildCreateActuateArgs(projectName), {
14
+ stdio: 'inherit',
15
+ });
16
+ const exitCode = await new Promise((resolve, reject) => {
17
+ child.once('error', reject);
18
+ child.once('exit', resolve);
19
+ });
20
+ if (exitCode && exitCode !== 0) {
21
+ logger.error(`Project initialization failed with exit code ${exitCode}.`);
22
+ process.exit(exitCode);
23
+ }
24
+ }
25
+ export function registerInitCommand(program) {
26
+ program
27
+ .command('init [project-name]')
28
+ .description('Scaffold a new Actuate CMS project')
29
+ .action(runInit);
30
+ }
31
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,UAAU,sBAAsB,CAAC,WAAoB;IACzD,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAC9C,IAAI,WAAW;QAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,WAAoB;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,EAAE,sBAAsB,CAAC,WAAW,CAAC,EAAE;QACrE,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACpE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,IAAI,QAAQ,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,gDAAgD,QAAQ,GAAG,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC"}
@@ -1,3 +1,17 @@
1
1
  import { Command } from "commander";
2
+ export interface NormalizedSeedDocument {
3
+ collection: string;
4
+ data: Record<string, unknown>;
5
+ status: string;
6
+ }
7
+ export interface NormalizedSeedGlobal {
8
+ slug: string;
9
+ data: Record<string, unknown>;
10
+ }
11
+ export interface NormalizedSeedPayload {
12
+ documents: NormalizedSeedDocument[];
13
+ globals: NormalizedSeedGlobal[];
14
+ }
15
+ export declare function normalizeSeedPayload(seedData: unknown): NormalizedSeedPayload;
2
16
  export declare function registerSeedCommand(program: Command): void;
3
17
  //# sourceMappingURL=seed.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/commands/seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2XpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ1D"}
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/commands/seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiLpC,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,sBAAsB,EAAE,CAAC;IACpC,OAAO,EAAE,oBAAoB,EAAE,CAAC;CACjC;AAyBD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,GAAG,qBAAqB,CAgC7E;AAkPD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe1D"}
@@ -1,6 +1,8 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { existsSync } from "node:fs";
3
+ import path from "node:path";
3
4
  import { createInterface } from "node:readline/promises";
5
+ import { pathToFileURL } from "node:url";
4
6
  import ora from "ora";
5
7
  import { logger } from "../utils/logger.js";
6
8
  async function confirm(question) {
@@ -146,9 +148,78 @@ const DEMO_USERS = [
146
148
  { email: "editor@example.com", name: "Demo Editor", role: "EDITOR" },
147
149
  { email: "author@example.com", name: "Demo Author", role: "AUTHOR" },
148
150
  ];
151
+ const SEED_FILE_CANDIDATES = [
152
+ "actuate.seed.json",
153
+ "actuate.seed.ts",
154
+ "actuate.seed.js",
155
+ "actuate.seed.mjs",
156
+ "cms.seed.json",
157
+ ];
158
+ function asRecord(value) {
159
+ return value && typeof value === "object" && !Array.isArray(value)
160
+ ? value
161
+ : {};
162
+ }
163
+ function normalizeDocument(collection, doc) {
164
+ const record = asRecord(doc);
165
+ return {
166
+ collection,
167
+ data: asRecord(record.data ?? record),
168
+ status: typeof record.status === "string" ? record.status : "DRAFT",
169
+ };
170
+ }
171
+ export function normalizeSeedPayload(seedData) {
172
+ const documents = [];
173
+ const globals = [];
174
+ if (Array.isArray(seedData)) {
175
+ for (const doc of seedData) {
176
+ const record = asRecord(doc);
177
+ documents.push(normalizeDocument(typeof record.collection === "string" ? record.collection : "imported", record.data ? record : { data: record }));
178
+ }
179
+ return { documents, globals };
180
+ }
181
+ const root = asRecord(seedData);
182
+ const globalEntries = asRecord(root.globals);
183
+ for (const [slug, value] of Object.entries(globalEntries)) {
184
+ globals.push({ slug, data: asRecord(value) });
185
+ }
186
+ const collections = root.collections ? asRecord(root.collections) : root;
187
+ for (const [collection, docs] of Object.entries(collections)) {
188
+ if (collection === "globals" || collection === "collections")
189
+ continue;
190
+ if (!Array.isArray(docs))
191
+ continue;
192
+ for (const doc of docs) {
193
+ documents.push(normalizeDocument(collection, doc));
194
+ }
195
+ }
196
+ return { documents, globals };
197
+ }
198
+ function findConventionSeedFile() {
199
+ for (const candidate of SEED_FILE_CANDIDATES) {
200
+ if (existsSync(candidate))
201
+ return candidate;
202
+ }
203
+ return null;
204
+ }
205
+ async function loadSeedFile(filePath) {
206
+ const extension = path.extname(filePath);
207
+ if (extension === ".json" || extension === "") {
208
+ const raw = await readFile(filePath, "utf-8");
209
+ return JSON.parse(raw);
210
+ }
211
+ const fileUrl = pathToFileURL(path.resolve(filePath)).href;
212
+ const mod = extension === ".ts"
213
+ ? await import("tsx/esm/api").then(({ tsImport }) => tsImport(fileUrl, import.meta.url))
214
+ : await import(fileUrl);
215
+ return mod.default
216
+ ?? mod.seed;
217
+ }
149
218
  async function runSeed(options) {
150
- if (!options.demo && !options.file) {
151
- logger.error("Specify --demo to seed demo content or --file <path> to seed from a JSON file.");
219
+ const conventionFile = !options.demo && !options.file ? findConventionSeedFile() : null;
220
+ const file = options.file ?? conventionFile ?? undefined;
221
+ if (!options.demo && !file) {
222
+ logger.error("Specify --demo, --file <path>, or add actuate.seed.json in the project root.");
152
223
  process.exit(1);
153
224
  }
154
225
  try {
@@ -169,8 +240,8 @@ async function runSeed(options) {
169
240
  if (options.demo) {
170
241
  await seedDemoData(db);
171
242
  }
172
- if (options.file) {
173
- await seedFromFile(db, options.file);
243
+ if (file) {
244
+ await seedFromFile(db, file);
174
245
  }
175
246
  }
176
247
  catch (err) {
@@ -269,13 +340,12 @@ async function seedFromFile(db, filePath) {
269
340
  process.exit(1);
270
341
  }
271
342
  const spinner = ora(`Seeding from ${filePath}…`).start();
272
- const raw = await readFile(filePath, "utf-8");
273
343
  let seedData;
274
344
  try {
275
- seedData = JSON.parse(raw);
345
+ seedData = await loadSeedFile(filePath);
276
346
  }
277
347
  catch {
278
- spinner.fail("Invalid JSON file.");
348
+ spinner.fail("Invalid seed file.");
279
349
  process.exit(1);
280
350
  }
281
351
  if (!Array.isArray(seedData) && typeof seedData !== "object") {
@@ -296,47 +366,59 @@ async function seedFromFile(db, filePath) {
296
366
  });
297
367
  }
298
368
  const userId = adminUser.id;
299
- let count = 0;
300
- if (Array.isArray(seedData)) {
301
- for (const doc of seedData) {
302
- await db.document.create({
369
+ const normalized = normalizeSeedPayload(seedData);
370
+ const { extractPlainText, hashContent, updateGlobal } = await import("@actuate-media/cms-core");
371
+ const ctx = { userId, role: "ADMIN", db };
372
+ let documentCount = 0;
373
+ for (const doc of normalized.documents) {
374
+ const serialized = JSON.stringify(doc.data);
375
+ const plainText = extractPlainText(serialized);
376
+ const contentHash = await hashContent(serialized);
377
+ await db.$transaction(async (tx) => {
378
+ const created = await tx.document.create({
303
379
  data: {
304
- collection: doc.collection ?? "imported",
305
- data: doc.data ?? doc,
306
- status: doc.status ?? "DRAFT",
380
+ collection: doc.collection,
381
+ title: typeof doc.data.title === "string" ? doc.data.title : null,
382
+ slug: typeof doc.data.slug === "string" ? doc.data.slug : null,
383
+ data: doc.data,
384
+ status: doc.status,
385
+ publishedAt: doc.status === "PUBLISHED" ? new Date() : null,
307
386
  createdById: userId,
308
387
  updatedById: userId,
388
+ plainText,
389
+ contentHash,
309
390
  },
310
391
  });
311
- count++;
312
- }
392
+ await tx.version.create({
393
+ data: {
394
+ documentId: created.id,
395
+ data: doc.data,
396
+ changedById: userId,
397
+ changeType: "CREATE",
398
+ },
399
+ });
400
+ });
401
+ documentCount++;
313
402
  }
314
- else {
315
- for (const [collection, docs] of Object.entries(seedData)) {
316
- if (!Array.isArray(docs))
317
- continue;
318
- for (const doc of docs) {
319
- await db.document.create({
320
- data: {
321
- collection,
322
- data: doc.data ?? doc,
323
- status: doc.status ?? "DRAFT",
324
- createdById: userId,
325
- updatedById: userId,
326
- },
327
- });
328
- count++;
329
- }
330
- }
403
+ let globalCount = 0;
404
+ for (const global of normalized.globals) {
405
+ await updateGlobal(global.slug, global.data, ctx);
406
+ globalCount++;
331
407
  }
332
- spinner.succeed(`Seeded ${count} documents from ${filePath}.`);
408
+ spinner.succeed(`Seeded ${documentCount} documents and ${globalCount} globals from ${filePath}.`);
333
409
  }
334
410
  export function registerSeedCommand(program) {
335
411
  program
336
412
  .command("seed")
337
413
  .description("Seed the database with demo or custom data")
338
414
  .option("--demo", "Seed demo content (pages, posts, forms, users)")
339
- .option("--file <path>", "Seed from a JSON file")
415
+ .option("--file <path>", "Seed from a JSON, JavaScript, or TypeScript file")
416
+ .option("--reset", "Clear existing data before seeding")
417
+ .action(runSeed);
418
+ program
419
+ .command("populate")
420
+ .description("Populate the database from actuate.seed.json or a custom seed file")
421
+ .option("--file <path>", "Seed from a JSON, JavaScript, or TypeScript file")
340
422
  .option("--reset", "Clear existing data before seeding")
341
423
  .action(runSeed);
342
424
  }
@@ -1 +1 @@
1
- {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/commands/seed.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/commands/seed.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -9,6 +9,7 @@ import { registerUpgradeCommand } from "./commands/upgrade.js";
9
9
  import { registerUpdateCheckCommand } from "./commands/update-check.js";
10
10
  import { registerDbInitCommand } from "./commands/db-init.js";
11
11
  import { registerDbStatusCommand } from "./commands/db-status.js";
12
+ import { registerInitCommand } from "./commands/init.js";
12
13
  const program = new Command();
13
14
  program
14
15
  .name("actuate")
@@ -23,5 +24,6 @@ registerUpgradeCommand(program);
23
24
  registerUpdateCheckCommand(program);
24
25
  registerDbInitCommand(program);
25
26
  registerDbStatusCommand(program);
27
+ registerInitCommand(program);
26
28
  program.parse();
27
29
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAElE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,6DAA6D,CAAC;KAC1E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,0BAA0B,CAAC,OAAO,CAAC,CAAC;AACpC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,6DAA6D,CAAC;KAC1E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,0BAA0B,CAAC,OAAO,CAAC,CAAC;AACpC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAE7B,OAAO,CAAC,KAAK,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actuate-media/cli",
3
- "version": "0.2.5",
3
+ "version": "0.3.0",
4
4
  "description": "CLI for Actuate CMS — migrations, codegen, imports, exports, and upgrades",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,23 +12,28 @@
12
12
  },
13
13
  "type": "module",
14
14
  "bin": {
15
- "actuate": "dist/index.js"
15
+ "actuate": "dist/index.js",
16
+ "actuate-cms": "dist/index.js"
16
17
  },
17
18
  "main": "dist/index.js",
18
19
  "dependencies": {
19
- "commander": "^13.1.0",
20
20
  "chalk": "^5.4.1",
21
- "ora": "^8.2.0"
21
+ "commander": "^13.1.0",
22
+ "ora": "^8.2.0",
23
+ "tsx": "^4.0.0"
22
24
  },
23
25
  "peerDependencies": {
24
26
  "@actuate-media/cms-core": ">=0.1.0"
25
27
  },
26
28
  "devDependencies": {
27
- "typescript": "^5.7.0"
29
+ "typescript": "^5.7.0",
30
+ "vitest": "^3.0.0",
31
+ "@actuate-media/cms-core": "0.10.0"
28
32
  },
29
33
  "scripts": {
30
34
  "build": "tsc",
31
35
  "dev": "tsc --watch",
36
+ "test": "vitest run",
32
37
  "type-check": "tsc --noEmit",
33
38
  "clean": "rm -rf dist"
34
39
  }
@@ -0,0 +1,30 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { Command } from 'commander';
3
+ import { describe, expect, it } from 'vitest';
4
+
5
+ import { buildCreateActuateArgs, registerInitCommand } from '../commands/init.js';
6
+
7
+ describe('init command', () => {
8
+ it('registers an init command that delegates to create-actuate-cms', () => {
9
+ const program = new Command();
10
+ registerInitCommand(program);
11
+
12
+ const command = program.commands.find((candidate) => candidate.name() === 'init');
13
+
14
+ expect(command).toBeDefined();
15
+ expect(buildCreateActuateArgs()).toEqual(['create', 'actuate-cms@latest']);
16
+ expect(buildCreateActuateArgs('maidpro-site')).toEqual([
17
+ 'create',
18
+ 'actuate-cms@latest',
19
+ 'maidpro-site',
20
+ ]);
21
+ });
22
+
23
+ it('exposes an actuate-cms bin alias for installed CLI usage', async () => {
24
+ const raw = await readFile(new URL('../../package.json', import.meta.url), 'utf-8');
25
+ const pkg = JSON.parse(raw) as { bin?: Record<string, string> };
26
+
27
+ expect(pkg.bin?.actuate).toBe('dist/index.js');
28
+ expect(pkg.bin?.['actuate-cms']).toBe('dist/index.js');
29
+ });
30
+ });
@@ -0,0 +1,53 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { normalizeSeedPayload } from '../commands/seed.js';
4
+
5
+ describe('seed payload normalization', () => {
6
+ it('separates globals from collection documents', () => {
7
+ const normalized = normalizeSeedPayload({
8
+ globals: {
9
+ 'site-settings': {
10
+ siteName: 'MaidPro',
11
+ phone: '555-0100',
12
+ },
13
+ },
14
+ collections: {
15
+ pages: [
16
+ {
17
+ data: { title: 'Home', slug: 'home' },
18
+ status: 'PUBLISHED',
19
+ },
20
+ ],
21
+ },
22
+ });
23
+
24
+ expect(normalized.globals).toEqual([
25
+ {
26
+ slug: 'site-settings',
27
+ data: { siteName: 'MaidPro', phone: '555-0100' },
28
+ },
29
+ ]);
30
+ expect(normalized.documents).toEqual([
31
+ {
32
+ collection: 'pages',
33
+ data: { title: 'Home', slug: 'home' },
34
+ status: 'PUBLISHED',
35
+ },
36
+ ]);
37
+ });
38
+
39
+ it('keeps backwards-compatible collection-key seed files', () => {
40
+ const normalized = normalizeSeedPayload({
41
+ pages: [{ title: 'Home', slug: 'home' }],
42
+ });
43
+
44
+ expect(normalized.globals).toEqual([]);
45
+ expect(normalized.documents).toEqual([
46
+ {
47
+ collection: 'pages',
48
+ data: { title: 'Home', slug: 'home' },
49
+ status: 'DRAFT',
50
+ },
51
+ ]);
52
+ });
53
+ });
@@ -0,0 +1,36 @@
1
+ import { spawn } from 'node:child_process';
2
+ import type { Command } from 'commander';
3
+ import { logger } from '../utils/logger.js';
4
+
5
+ export function buildCreateActuateArgs(projectName?: string): string[] {
6
+ const args = ['create', 'actuate-cms@latest'];
7
+ if (projectName) args.push(projectName);
8
+ return args;
9
+ }
10
+
11
+ function npmCommand(): string {
12
+ return process.platform === 'win32' ? 'npm.cmd' : 'npm';
13
+ }
14
+
15
+ async function runInit(projectName?: string): Promise<void> {
16
+ const child = spawn(npmCommand(), buildCreateActuateArgs(projectName), {
17
+ stdio: 'inherit',
18
+ });
19
+
20
+ const exitCode = await new Promise<number | null>((resolve, reject) => {
21
+ child.once('error', reject);
22
+ child.once('exit', resolve);
23
+ });
24
+
25
+ if (exitCode && exitCode !== 0) {
26
+ logger.error(`Project initialization failed with exit code ${exitCode}.`);
27
+ process.exit(exitCode);
28
+ }
29
+ }
30
+
31
+ export function registerInitCommand(program: Command): void {
32
+ program
33
+ .command('init [project-name]')
34
+ .description('Scaffold a new Actuate CMS project')
35
+ .action(runInit);
36
+ }
@@ -1,7 +1,9 @@
1
1
  import { Command } from "commander";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { existsSync } from "node:fs";
4
+ import path from "node:path";
4
5
  import { createInterface } from "node:readline/promises";
6
+ import { pathToFileURL } from "node:url";
5
7
  import ora from "ora";
6
8
  import { logger } from "../utils/logger.js";
7
9
 
@@ -173,9 +175,108 @@ interface SeedOptions {
173
175
  reset?: boolean;
174
176
  }
175
177
 
178
+ export interface NormalizedSeedDocument {
179
+ collection: string;
180
+ data: Record<string, unknown>;
181
+ status: string;
182
+ }
183
+
184
+ export interface NormalizedSeedGlobal {
185
+ slug: string;
186
+ data: Record<string, unknown>;
187
+ }
188
+
189
+ export interface NormalizedSeedPayload {
190
+ documents: NormalizedSeedDocument[];
191
+ globals: NormalizedSeedGlobal[];
192
+ }
193
+
194
+ const SEED_FILE_CANDIDATES = [
195
+ "actuate.seed.json",
196
+ "actuate.seed.ts",
197
+ "actuate.seed.js",
198
+ "actuate.seed.mjs",
199
+ "cms.seed.json",
200
+ ];
201
+
202
+ function asRecord(value: unknown): Record<string, unknown> {
203
+ return value && typeof value === "object" && !Array.isArray(value)
204
+ ? value as Record<string, unknown>
205
+ : {};
206
+ }
207
+
208
+ function normalizeDocument(collection: string, doc: unknown): NormalizedSeedDocument {
209
+ const record = asRecord(doc);
210
+ return {
211
+ collection,
212
+ data: asRecord(record.data ?? record),
213
+ status: typeof record.status === "string" ? record.status : "DRAFT",
214
+ };
215
+ }
216
+
217
+ export function normalizeSeedPayload(seedData: unknown): NormalizedSeedPayload {
218
+ const documents: NormalizedSeedDocument[] = [];
219
+ const globals: NormalizedSeedGlobal[] = [];
220
+
221
+ if (Array.isArray(seedData)) {
222
+ for (const doc of seedData) {
223
+ const record = asRecord(doc);
224
+ documents.push(normalizeDocument(
225
+ typeof record.collection === "string" ? record.collection : "imported",
226
+ record.data ? record : { data: record },
227
+ ));
228
+ }
229
+ return { documents, globals };
230
+ }
231
+
232
+ const root = asRecord(seedData);
233
+
234
+ const globalEntries = asRecord(root.globals);
235
+ for (const [slug, value] of Object.entries(globalEntries)) {
236
+ globals.push({ slug, data: asRecord(value) });
237
+ }
238
+
239
+ const collections = root.collections ? asRecord(root.collections) : root;
240
+ for (const [collection, docs] of Object.entries(collections)) {
241
+ if (collection === "globals" || collection === "collections") continue;
242
+ if (!Array.isArray(docs)) continue;
243
+ for (const doc of docs) {
244
+ documents.push(normalizeDocument(collection, doc));
245
+ }
246
+ }
247
+
248
+ return { documents, globals };
249
+ }
250
+
251
+ function findConventionSeedFile(): string | null {
252
+ for (const candidate of SEED_FILE_CANDIDATES) {
253
+ if (existsSync(candidate)) return candidate;
254
+ }
255
+ return null;
256
+ }
257
+
258
+ async function loadSeedFile(filePath: string): Promise<unknown> {
259
+ const extension = path.extname(filePath);
260
+ if (extension === ".json" || extension === "") {
261
+ const raw = await readFile(filePath, "utf-8");
262
+ return JSON.parse(raw);
263
+ }
264
+
265
+ const fileUrl = pathToFileURL(path.resolve(filePath)).href;
266
+ const mod = extension === ".ts"
267
+ ? await import("tsx/esm/api").then(({ tsImport }) => tsImport(fileUrl, import.meta.url))
268
+ : await import(fileUrl);
269
+
270
+ return (mod as { default?: unknown; seed?: unknown }).default
271
+ ?? (mod as { seed?: unknown }).seed;
272
+ }
273
+
176
274
  async function runSeed(options: SeedOptions): Promise<void> {
177
- if (!options.demo && !options.file) {
178
- logger.error("Specify --demo to seed demo content or --file <path> to seed from a JSON file.");
275
+ const conventionFile = !options.demo && !options.file ? findConventionSeedFile() : null;
276
+ const file = options.file ?? conventionFile ?? undefined;
277
+
278
+ if (!options.demo && !file) {
279
+ logger.error("Specify --demo, --file <path>, or add actuate.seed.json in the project root.");
179
280
  process.exit(1);
180
281
  }
181
282
 
@@ -203,8 +304,8 @@ async function runSeed(options: SeedOptions): Promise<void> {
203
304
  await seedDemoData(db);
204
305
  }
205
306
 
206
- if (options.file) {
207
- await seedFromFile(db, options.file);
307
+ if (file) {
308
+ await seedFromFile(db, file);
208
309
  }
209
310
  } catch (err) {
210
311
  const message = err instanceof Error ? err.message : String(err);
@@ -312,12 +413,11 @@ async function seedFromFile(db: any, filePath: string): Promise<void> {
312
413
 
313
414
  const spinner = ora(`Seeding from ${filePath}…`).start();
314
415
 
315
- const raw = await readFile(filePath, "utf-8");
316
416
  let seedData: any;
317
417
  try {
318
- seedData = JSON.parse(raw);
418
+ seedData = await loadSeedFile(filePath);
319
419
  } catch {
320
- spinner.fail("Invalid JSON file.");
420
+ spinner.fail("Invalid seed file.");
321
421
  process.exit(1);
322
422
  }
323
423
 
@@ -341,40 +441,51 @@ async function seedFromFile(db: any, filePath: string): Promise<void> {
341
441
  }
342
442
  const userId = adminUser.id;
343
443
 
344
- let count = 0;
444
+ const normalized = normalizeSeedPayload(seedData);
445
+ const { extractPlainText, hashContent, updateGlobal } = await import("@actuate-media/cms-core");
446
+ const ctx = { userId, role: "ADMIN", db };
345
447
 
346
- if (Array.isArray(seedData)) {
347
- for (const doc of seedData) {
348
- await db.document.create({
448
+ let documentCount = 0;
449
+ for (const doc of normalized.documents) {
450
+ const serialized = JSON.stringify(doc.data);
451
+ const plainText = extractPlainText(serialized);
452
+ const contentHash = await hashContent(serialized);
453
+
454
+ await db.$transaction(async (tx: any) => {
455
+ const created = await tx.document.create({
349
456
  data: {
350
- collection: doc.collection ?? "imported",
351
- data: doc.data ?? doc,
352
- status: doc.status ?? "DRAFT",
457
+ collection: doc.collection,
458
+ title: typeof doc.data.title === "string" ? doc.data.title : null,
459
+ slug: typeof doc.data.slug === "string" ? doc.data.slug : null,
460
+ data: doc.data,
461
+ status: doc.status,
462
+ publishedAt: doc.status === "PUBLISHED" ? new Date() : null,
353
463
  createdById: userId,
354
464
  updatedById: userId,
465
+ plainText,
466
+ contentHash,
355
467
  },
356
468
  });
357
- count++;
358
- }
359
- } else {
360
- for (const [collection, docs] of Object.entries(seedData)) {
361
- if (!Array.isArray(docs)) continue;
362
- for (const doc of docs as any[]) {
363
- await db.document.create({
364
- data: {
365
- collection,
366
- data: doc.data ?? doc,
367
- status: doc.status ?? "DRAFT",
368
- createdById: userId,
369
- updatedById: userId,
370
- },
371
- });
372
- count++;
373
- }
374
- }
469
+
470
+ await tx.version.create({
471
+ data: {
472
+ documentId: created.id,
473
+ data: doc.data,
474
+ changedById: userId,
475
+ changeType: "CREATE",
476
+ },
477
+ });
478
+ });
479
+ documentCount++;
375
480
  }
376
481
 
377
- spinner.succeed(`Seeded ${count} documents from ${filePath}.`);
482
+ let globalCount = 0;
483
+ for (const global of normalized.globals) {
484
+ await updateGlobal(global.slug, global.data, ctx);
485
+ globalCount++;
486
+ }
487
+
488
+ spinner.succeed(`Seeded ${documentCount} documents and ${globalCount} globals from ${filePath}.`);
378
489
  }
379
490
 
380
491
  export function registerSeedCommand(program: Command): void {
@@ -382,7 +493,14 @@ export function registerSeedCommand(program: Command): void {
382
493
  .command("seed")
383
494
  .description("Seed the database with demo or custom data")
384
495
  .option("--demo", "Seed demo content (pages, posts, forms, users)")
385
- .option("--file <path>", "Seed from a JSON file")
496
+ .option("--file <path>", "Seed from a JSON, JavaScript, or TypeScript file")
497
+ .option("--reset", "Clear existing data before seeding")
498
+ .action(runSeed);
499
+
500
+ program
501
+ .command("populate")
502
+ .description("Populate the database from actuate.seed.json or a custom seed file")
503
+ .option("--file <path>", "Seed from a JSON, JavaScript, or TypeScript file")
386
504
  .option("--reset", "Clear existing data before seeding")
387
505
  .action(runSeed);
388
506
  }
package/src/index.ts CHANGED
@@ -9,6 +9,7 @@ import { registerUpgradeCommand } from "./commands/upgrade.js";
9
9
  import { registerUpdateCheckCommand } from "./commands/update-check.js";
10
10
  import { registerDbInitCommand } from "./commands/db-init.js";
11
11
  import { registerDbStatusCommand } from "./commands/db-status.js";
12
+ import { registerInitCommand } from "./commands/init.js";
12
13
 
13
14
  const program = new Command();
14
15
 
@@ -26,5 +27,6 @@ registerUpgradeCommand(program);
26
27
  registerUpdateCheckCommand(program);
27
28
  registerDbInitCommand(program);
28
29
  registerDbStatusCommand(program);
30
+ registerInitCommand(program);
29
31
 
30
32
  program.parse();