@actuate-media/cli 0.4.2 → 0.6.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 (39) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +64 -18
  3. package/CHANGELOG.md +46 -0
  4. package/dist/__tests__/db-init.test.d.ts +2 -0
  5. package/dist/__tests__/db-init.test.d.ts.map +1 -0
  6. package/dist/__tests__/db-init.test.js +127 -0
  7. package/dist/__tests__/db-init.test.js.map +1 -0
  8. package/dist/__tests__/db-sync.test.d.ts +2 -0
  9. package/dist/__tests__/db-sync.test.d.ts.map +1 -0
  10. package/dist/__tests__/db-sync.test.js +136 -0
  11. package/dist/__tests__/db-sync.test.js.map +1 -0
  12. package/dist/__tests__/seed.test.js +20 -1
  13. package/dist/__tests__/seed.test.js.map +1 -1
  14. package/dist/commands/db-init.d.ts +17 -0
  15. package/dist/commands/db-init.d.ts.map +1 -1
  16. package/dist/commands/db-init.js +100 -278
  17. package/dist/commands/db-init.js.map +1 -1
  18. package/dist/commands/db-sync.d.ts +31 -0
  19. package/dist/commands/db-sync.d.ts.map +1 -0
  20. package/dist/commands/db-sync.js +195 -0
  21. package/dist/commands/db-sync.js.map +1 -0
  22. package/dist/commands/seed.d.ts +10 -0
  23. package/dist/commands/seed.d.ts.map +1 -1
  24. package/dist/commands/seed.js +38 -4
  25. package/dist/commands/seed.js.map +1 -1
  26. package/dist/commands/upgrade.d.ts.map +1 -1
  27. package/dist/commands/upgrade.js +5 -0
  28. package/dist/commands/upgrade.js.map +1 -1
  29. package/dist/index.js +2 -0
  30. package/dist/index.js.map +1 -1
  31. package/package.json +2 -2
  32. package/src/__tests__/db-init.test.ts +155 -0
  33. package/src/__tests__/db-sync.test.ts +167 -0
  34. package/src/__tests__/seed.test.ts +27 -1
  35. package/src/commands/db-init.ts +93 -266
  36. package/src/commands/db-sync.ts +227 -0
  37. package/src/commands/seed.ts +40 -4
  38. package/src/commands/upgrade.ts +8 -0
  39. package/src/index.ts +2 -0
@@ -1,4 +1,4 @@
1
1
 
2
- > @actuate-media/cli@0.4.2 build /home/runner/work/actuatecms/actuatecms/packages/cli
2
+ > @actuate-media/cli@0.6.0 build /home/runner/work/actuatecms/actuatecms/packages/cli
3
3
  > tsc
4
4
 
@@ -1,35 +1,81 @@
1
1
 
2
- > @actuate-media/cli@0.4.2 test /home/runner/work/actuatecms/actuatecms/packages/cli
2
+ > @actuate-media/cli@0.6.0 test /home/runner/work/actuatecms/actuatecms/packages/cli
3
3
  > vitest run
4
4
 
5
5
 
6
6
   RUN  v4.1.8 /home/runner/work/actuatecms/actuatecms/packages/cli
7
7
 
8
- ✓ dist/__tests__/deployment-diagnostics.test.js (5 tests) 57ms
9
- ✓ src/__tests__/deployment-diagnostics.test.ts (5 tests) 59ms
10
- ✓ dist/__tests__/seed.test.js (4 tests) 38ms
11
- ✓ src/__tests__/seed.test.ts (4 tests) 48ms
12
- - Reading Prisma schema...
13
- stdout | dist/__tests__/schema-fragment.test.js > db:init schema fragment > injects all deploy-critical Actuate models
8
+ ✓ dist/__tests__/db-sync.test.js (6 tests) 503ms
9
+ ✓ src/__tests__/db-sync.test.ts (6 tests) 434ms
10
+ - Reading canonical Actuate schema...
14
11
  ✔ Actuate CMS models added to schema.
12
+ stdout | dist/__tests__/db-init.test.js > db:init (WS-D D5 — canonical schema, no stale fragment) > command > injects canonical models with @@map and no duplicate datasource/generator
15
13
  ✔ Prisma client generated.
14
+ ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
15
+
16
16
  - Running prisma generate...
17
+ - Reading canonical Actuate schema...
18
+ stdout | dist/__tests__/db-init.test.js > db:init (WS-D D5 — canonical schema, no stale fragment) > command > fails clearly when cms-core cannot be located
19
+ ℹ Install it first: `npm install @actuate-media/cms-core`.
20
+
21
+ ✖ Could not locate @actuate-media/cms-core.
22
+ - Reading canonical Actuate schema...
23
+ ✔ Actuate CMS models added to schema.
24
+ stdout | dist/__tests__/db-init.test.js > db:init (WS-D D5 — canonical schema, no stale fragment) > command > is idempotent without --force
25
+ ✔ Prisma client generated.
17
26
  ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
18
27
 
19
- ✓ dist/__tests__/schema-fragment.test.js (1 test) 152ms
20
- - Reading Prisma schema...
28
+ - Running prisma generate...
29
+ - Reading canonical Actuate schema...
30
+ ℹ Actuate CMS models already present in schema. Use --force to overwrite.
31
+ ✓ dist/__tests__/db-init.test.js (4 tests) 238ms
32
+ - Reading canonical Actuate schema...
21
33
  ✔ Actuate CMS models added to schema.
22
- stdout | src/__tests__/schema-fragment.test.ts > db:init schema fragment > injects all deploy-critical Actuate models
34
+ - Running prisma generate...
35
+ stdout | src/__tests__/db-init.test.ts > db:init (WS-D D5 — canonical schema, no stale fragment) > command > injects canonical models with @@map and no duplicate datasource/generator
23
36
  ✔ Prisma client generated.
24
37
  ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
25
38
 
39
+ - Reading canonical Actuate schema...
40
+ ✖ Could not locate @actuate-media/cms-core.
41
+ stdout | src/__tests__/db-init.test.ts > db:init (WS-D D5 — canonical schema, no stale fragment) > command > fails clearly when cms-core cannot be located
42
+ ℹ Install it first: `npm install @actuate-media/cms-core`.
43
+
44
+ - Reading canonical Actuate schema...
45
+ ✔ Actuate CMS models added to schema.
26
46
  - Running prisma generate...
27
- ✓ src/__tests__/schema-fragment.test.ts (1 test) 72ms
28
- ✓ dist/__tests__/init.test.js (2 tests) 20ms
29
- ✓ src/__tests__/init.test.ts (2 tests) 33ms
30
-
31
-  Test Files  8 passed (8)
32
-  Tests  24 passed (24)
33
-  Start at  17:56:33
34
-  Duration  11.31s (transform 1.35s, setup 0ms, import 2.91s, tests 479ms, environment 13ms)
47
+ stdout | src/__tests__/db-init.test.ts > db:init (WS-D D5 — canonical schema, no stale fragment) > command > is idempotent without --force
48
+ ✔ Prisma client generated.
49
+ ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
50
+
51
+ - Reading canonical Actuate schema...
52
+ ℹ Actuate CMS models already present in schema. Use --force to overwrite.
53
+ ✓ src/__tests__/db-init.test.ts (4 tests) 199ms
54
+ ✓ dist/__tests__/seed.test.js (5 tests) 57ms
55
+ ✓ dist/__tests__/deployment-diagnostics.test.js (5 tests) 40ms
56
+ ✓ src/__tests__/deployment-diagnostics.test.ts (5 tests) 31ms
57
+ ✓ src/__tests__/seed.test.ts (5 tests) 50ms
58
+ - Reading canonical Actuate schema...
59
+ ✔ Actuate CMS models added to schema.
60
+ - Running prisma generate...
61
+ stdout | dist/__tests__/schema-fragment.test.js > db:init schema fragment > injects all deploy-critical Actuate models
62
+ ✔ Prisma client generated.
63
+ ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
64
+
65
+ ✓ dist/__tests__/schema-fragment.test.js (1 test) 134ms
66
+ - Reading canonical Actuate schema...
67
+ ✔ Actuate CMS models added to schema.
68
+ - Running prisma generate...
69
+ stdout | src/__tests__/schema-fragment.test.ts > db:init schema fragment > injects all deploy-critical Actuate models
70
+ ✔ Prisma client generated.
71
+ ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
72
+
73
+ ✓ src/__tests__/schema-fragment.test.ts (1 test) 136ms
74
+ ✓ dist/__tests__/init.test.js (2 tests) 38ms
75
+ ✓ src/__tests__/init.test.ts (2 tests) 26ms
76
+
77
+  Test Files  12 passed (12)
78
+  Tests  46 passed (46)
79
+  Start at  15:43:03
80
+  Duration  15.70s (transform 1.80s, setup 0ms, import 4.69s, tests 1.88s, environment 7ms)
35
81
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,51 @@
1
1
  # @actuate-media/cli
2
2
 
3
+ ## 0.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 31224ae: WS-E (E4 follow-up): seed demo navigation menus and render a footer nav so
8
+ navigation works end-to-end on a fresh scaffold.
9
+ - **cli:** `actuate seed --demo` now seeds two `navigations` documents — a
10
+ `main` menu (location `header`, linking Home/About/Contact) and a `footer`
11
+ menu (location `footer`, linking Privacy/Terms) — so the shipped `<SiteNav>`
12
+ renders real links out of the box instead of an empty header. Items point at
13
+ the demo pages by public URL.
14
+ - **create-actuate-cms:** the generated site layout now also fetches the
15
+ `footer` menu and renders it in a semantic `<footer>` (with a copyright line),
16
+ alongside the existing header nav. The body is a flex column so the footer
17
+ sits at the bottom. Both navs still degrade gracefully when no menu exists.
18
+
19
+ ## 0.5.0
20
+
21
+ ### Minor Changes
22
+
23
+ - 6927e4b: `actuate db:init` now injects the canonical Prisma schema (WS-D D5).
24
+
25
+ The command previously appended a hand-maintained schema fragment that had
26
+ drifted from `cms-core`: it was missing `@@map("actuate_*")` table names (so the
27
+ runtime's raw SQL couldn't find the tables) and many models. `db:init` now reads
28
+ the canonical `prisma/schema.prisma` shipped by the installed
29
+ `@actuate-media/cms-core` package, strips its `datasource`/`generator` blocks,
30
+ and injects the up-to-date `enum`/`model` definitions — keeping the consumer's
31
+ own datasource/generator. If `cms-core` can't be located, the command fails
32
+ cleanly instead of writing a broken schema. The injected block stays idempotent
33
+ (re-run with `--force` after upgrading cms-core to refresh).
34
+
35
+ - e743e03: Add `actuate db:sync` for post-upgrade Prisma schema sync (WS-D D2).
36
+
37
+ `actuate upgrade` previously only bumped `@actuate-media/*` versions in
38
+ `package.json`, leaving the consumer's `prisma/schema.prisma` and migrations
39
+ stale — so a newer `cms-core` would run against an out-of-date database schema.
40
+
41
+ The new `db:sync` command reads the canonical schema + migrations from the
42
+ installed `@actuate-media/cms-core`, rebuilds `prisma/schema.prisma` (consumer
43
+ header + every `@@map`ped model), and **additively** copies any migrations the
44
+ project is missing (never deleting existing, immutable history). It refuses to
45
+ overwrite a hand-customized schema (one without the `AUTO-SYNCED` marker) unless
46
+ `--force` is passed. `actuate upgrade` now points users at `db:sync` +
47
+ `prisma migrate deploy` whenever `cms-core` is bumped.
48
+
3
49
  ## 0.4.2
4
50
 
5
51
  ### Patch Changes
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=db-init.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-init.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/db-init.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,127 @@
1
+ import { Command } from 'commander';
2
+ import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import path from 'node:path';
5
+ import { afterEach, describe, expect, it, vi } from 'vitest';
6
+ import { extractModelsFragment, registerDbInitCommand, resetCanonicalSchemaReader, resetDbInitCommandRunner, setCanonicalSchemaReader, setDbInitCommandRunner, } from '../commands/db-init.js';
7
+ const FULL_SCHEMA = `generator client {
8
+ provider = "prisma-client"
9
+ output = "../generated"
10
+ previewFeatures = ["relationJoins"]
11
+ }
12
+
13
+ datasource db {
14
+ provider = "postgresql"
15
+ }
16
+
17
+ enum DocumentStatus {
18
+ DRAFT
19
+ PUBLISHED
20
+ }
21
+
22
+ model Document {
23
+ id String @id @default(cuid())
24
+ collection String
25
+ status DocumentStatus @default(DRAFT)
26
+
27
+ @@index([collection])
28
+ @@map("actuate_documents")
29
+ }
30
+
31
+ model User {
32
+ id String @id @default(cuid())
33
+ email String @unique
34
+
35
+ @@map("actuate_users")
36
+ }
37
+ `;
38
+ function consumerSchema() {
39
+ return `generator client {
40
+ provider = "prisma-client-js"
41
+ }
42
+
43
+ datasource db {
44
+ provider = "postgresql"
45
+ url = env("DATABASE_URL")
46
+ }
47
+ `;
48
+ }
49
+ describe('db:init (WS-D D5 — canonical schema, no stale fragment)', () => {
50
+ afterEach(() => {
51
+ resetDbInitCommandRunner();
52
+ resetCanonicalSchemaReader();
53
+ vi.restoreAllMocks();
54
+ });
55
+ describe('extractModelsFragment', () => {
56
+ it('strips generator and datasource blocks but keeps enums + models', () => {
57
+ const fragment = extractModelsFragment(FULL_SCHEMA);
58
+ expect(fragment).not.toMatch(/generator\s+\w+\s*\{/);
59
+ expect(fragment).not.toMatch(/datasource\s+\w+\s*\{/);
60
+ expect(fragment).toContain('enum DocumentStatus');
61
+ expect(fragment).toContain('model Document');
62
+ expect(fragment).toContain('model User');
63
+ // The whole point of D5: real @@map names survive.
64
+ expect(fragment).toContain('@@map("actuate_documents")');
65
+ expect(fragment).toContain('@@map("actuate_users")');
66
+ });
67
+ });
68
+ describe('command', () => {
69
+ it('injects canonical models with @@map and no duplicate datasource/generator', async () => {
70
+ const tempRoot = await mkdtemp(path.join(tmpdir(), 'actuate-db-init-d5-'));
71
+ const schemaPath = path.join(tempRoot, 'schema.prisma');
72
+ await writeFile(schemaPath, consumerSchema());
73
+ vi.spyOn(process, 'cwd').mockReturnValue(tempRoot);
74
+ setDbInitCommandRunner(() => undefined);
75
+ setCanonicalSchemaReader(async () => FULL_SCHEMA);
76
+ const command = new Command();
77
+ registerDbInitCommand(command);
78
+ await command.parseAsync(['node', 'actuate', 'db:init', '--schema', 'schema.prisma']);
79
+ const result = await readFile(schemaPath, 'utf-8');
80
+ const injected = result.slice(result.indexOf('// ── Actuate CMS models'));
81
+ // The consumer keeps exactly one datasource/generator (their own).
82
+ expect(result.match(/datasource\s+\w+\s*\{/g)).toHaveLength(1);
83
+ expect(result.match(/generator\s+\w+\s*\{/g)).toHaveLength(1);
84
+ // Injected portion carries the canonical mapped models.
85
+ expect(injected).toContain('@@map("actuate_documents")');
86
+ expect(injected).toContain('model Document');
87
+ expect(injected).not.toMatch(/datasource\s+\w+\s*\{/);
88
+ await rm(tempRoot, { recursive: true, force: true });
89
+ });
90
+ it('fails clearly when cms-core cannot be located', async () => {
91
+ const tempRoot = await mkdtemp(path.join(tmpdir(), 'actuate-db-init-missing-'));
92
+ const schemaPath = path.join(tempRoot, 'schema.prisma');
93
+ await writeFile(schemaPath, consumerSchema());
94
+ vi.spyOn(process, 'cwd').mockReturnValue(tempRoot);
95
+ setDbInitCommandRunner(() => undefined);
96
+ setCanonicalSchemaReader(async () => null);
97
+ const command = new Command();
98
+ registerDbInitCommand(command);
99
+ await command.parseAsync(['node', 'actuate', 'db:init', '--schema', 'schema.prisma']);
100
+ // Schema must be left untouched (no stale fragment written).
101
+ const result = await readFile(schemaPath, 'utf-8');
102
+ expect(result).toBe(consumerSchema());
103
+ expect(process.exitCode).toBe(1);
104
+ process.exitCode = 0;
105
+ await rm(tempRoot, { recursive: true, force: true });
106
+ });
107
+ it('is idempotent without --force', async () => {
108
+ const tempRoot = await mkdtemp(path.join(tmpdir(), 'actuate-db-init-idem-'));
109
+ const schemaPath = path.join(tempRoot, 'schema.prisma');
110
+ await writeFile(schemaPath, consumerSchema());
111
+ vi.spyOn(process, 'cwd').mockReturnValue(tempRoot);
112
+ setDbInitCommandRunner(() => undefined);
113
+ setCanonicalSchemaReader(async () => FULL_SCHEMA);
114
+ const command1 = new Command();
115
+ registerDbInitCommand(command1);
116
+ await command1.parseAsync(['node', 'actuate', 'db:init', '--schema', 'schema.prisma']);
117
+ const first = await readFile(schemaPath, 'utf-8');
118
+ const command2 = new Command();
119
+ registerDbInitCommand(command2);
120
+ await command2.parseAsync(['node', 'actuate', 'db:init', '--schema', 'schema.prisma']);
121
+ const second = await readFile(schemaPath, 'utf-8');
122
+ expect(second).toBe(first);
123
+ await rm(tempRoot, { recursive: true, force: true });
124
+ });
125
+ });
126
+ });
127
+ //# sourceMappingURL=db-init.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-init.test.js","sourceRoot":"","sources":["../../src/__tests__/db-init.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE5D,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,wBAAwB,CAAA;AAE/B,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BnB,CAAA;AAED,SAAS,cAAc;IACrB,OAAO;;;;;;;;CAQR,CAAA;AACD,CAAC;AAED,QAAQ,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACvE,SAAS,CAAC,GAAG,EAAE;QACb,wBAAwB,EAAE,CAAA;QAC1B,0BAA0B,EAAE,CAAA;QAC5B,EAAE,CAAC,eAAe,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAA;YACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;YACpD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAA;YACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;YACjD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;YAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;YACxC,mDAAmD;YACnD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;YACxD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;YACzF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAA;YAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;YACvD,MAAM,SAAS,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC,CAAA;YAE7C,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;YAClD,sBAAsB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YACvC,wBAAwB,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,CAAA;YAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;YAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAA;YAC9B,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAA;YAErF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;YAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAA;YAEzE,mEAAmE;YACnE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC9D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC7D,wDAAwD;YACxD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAA;YACxD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;YAC5C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAA;YAErD,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAA;YAC/E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;YACvD,MAAM,SAAS,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC,CAAA;YAE7C,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;YAClD,sBAAsB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YACvC,wBAAwB,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAA;YAE1C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;YAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAA;YAC9B,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAA;YAErF,6DAA6D;YAC7D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;YAClD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAA;YACrC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;YAEpB,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAA;YAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;YACvD,MAAM,SAAS,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC,CAAA;YAE7C,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;YAClD,sBAAsB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YACvC,wBAAwB,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,CAAA;YAEjD,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAA;YAC9B,qBAAqB,CAAC,QAAQ,CAAC,CAAA;YAC/B,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAA;YACtF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;YAEjD,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAA;YAC9B,qBAAqB,CAAC,QAAQ,CAAC,CAAA;YAC/B,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAA;YACtF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;YAElD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAE1B,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=db-sync.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-sync.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/db-sync.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,136 @@
1
+ import { mkdtemp, mkdir, readFile, readdir, rm, writeFile } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import path from 'node:path';
4
+ import { afterEach, describe, expect, it } from 'vitest';
5
+ import { buildConsumerSchema, syncPrismaAssets } from '../commands/db-sync.js';
6
+ const CORE_SCHEMA = `generator client {
7
+ provider = "prisma-client"
8
+ output = "../generated"
9
+ }
10
+
11
+ datasource db {
12
+ provider = "postgresql"
13
+ }
14
+
15
+ enum DocumentStatus {
16
+ DRAFT
17
+ PUBLISHED
18
+ }
19
+
20
+ model User {
21
+ id String @id @default(cuid())
22
+ email String @unique
23
+
24
+ @@map("actuate_users")
25
+ }
26
+
27
+ model Document {
28
+ id String @id @default(cuid())
29
+ status DocumentStatus @default(DRAFT)
30
+
31
+ @@map("actuate_documents")
32
+ }
33
+ `;
34
+ async function makeCorePrismaDir(migrations) {
35
+ const dir = await mkdtemp(path.join(tmpdir(), 'core-prisma-'));
36
+ await writeFile(path.join(dir, 'schema.prisma'), CORE_SCHEMA);
37
+ const migrationsDir = path.join(dir, 'migrations');
38
+ await mkdir(migrationsDir, { recursive: true });
39
+ await writeFile(path.join(migrationsDir, 'migration_lock.toml'), 'provider = "postgresql"\n');
40
+ for (const m of migrations) {
41
+ await mkdir(path.join(migrationsDir, m), { recursive: true });
42
+ await writeFile(path.join(migrationsDir, m, 'migration.sql'), `-- ${m}\n`);
43
+ }
44
+ return dir;
45
+ }
46
+ describe('db:sync (WS-D D2 — post-upgrade schema sync)', () => {
47
+ const temps = [];
48
+ afterEach(async () => {
49
+ await Promise.all(temps.map((t) => rm(t, { recursive: true, force: true })));
50
+ temps.length = 0;
51
+ });
52
+ describe('buildConsumerSchema', () => {
53
+ it('strips cms-core generator/datasource and emits the consumer header', () => {
54
+ const schema = buildConsumerSchema(CORE_SCHEMA);
55
+ expect(schema).toContain('AUTO-SYNCED from @actuate-media/cms-core');
56
+ expect(schema).toContain('output = "../generated/prisma"');
57
+ // The cms-core generator output path must not leak through.
58
+ expect(schema).not.toContain('output = "../generated"');
59
+ // Exactly one datasource/generator (the consumer header).
60
+ expect(schema.match(/generator\s+\w+\s*\{/g)).toHaveLength(1);
61
+ expect(schema.match(/datasource\s+\w+\s*\{/g)).toHaveLength(1);
62
+ expect(schema).toContain('@@map("actuate_users")');
63
+ expect(schema).toContain('@@map("actuate_documents")');
64
+ });
65
+ it('throws if the cms-core body lost its @@map names', () => {
66
+ const broken = CORE_SCHEMA.replace('@@map("actuate_users")', '');
67
+ expect(() => buildConsumerSchema(broken)).toThrow(/actuate_users/);
68
+ });
69
+ });
70
+ describe('syncPrismaAssets', () => {
71
+ it('refreshes an auto-synced schema and adds missing migrations', async () => {
72
+ const coreDir = await makeCorePrismaDir(['0001_init', '0002_new']);
73
+ const projectDir = await mkdtemp(path.join(tmpdir(), 'consumer-'));
74
+ temps.push(coreDir, projectDir);
75
+ const prismaDir = path.join(projectDir, 'prisma');
76
+ await mkdir(path.join(prismaDir, 'migrations', '0001_init'), { recursive: true });
77
+ await writeFile(path.join(prismaDir, 'migrations', '0001_init', 'migration.sql'), '-- already here\n');
78
+ // An auto-synced (stale) schema.
79
+ await writeFile(path.join(prismaDir, 'schema.prisma'), '// AUTO-SYNCED from @actuate-media/cms-core\nmodel Old {}\n');
80
+ const result = await syncPrismaAssets(path.join(prismaDir, 'schema.prisma'), coreDir);
81
+ expect(result.schemaWritten).toBe(true);
82
+ expect(result.migrationsAdded).toEqual(['0002_new']);
83
+ expect(result.skippedReason).toBeUndefined();
84
+ const schema = await readFile(path.join(prismaDir, 'schema.prisma'), 'utf-8');
85
+ expect(schema).toContain('@@map("actuate_users")');
86
+ // The pre-existing migration is untouched (immutable history preserved).
87
+ const existing = await readFile(path.join(prismaDir, 'migrations', '0001_init', 'migration.sql'), 'utf-8');
88
+ expect(existing).toBe('-- already here\n');
89
+ const dirs = (await readdir(path.join(prismaDir, 'migrations'), { withFileTypes: true }))
90
+ .filter((e) => e.isDirectory())
91
+ .map((e) => e.name)
92
+ .sort();
93
+ expect(dirs).toEqual(['0001_init', '0002_new']);
94
+ });
95
+ it('refuses to overwrite a customized (non-auto-synced) schema without --force', async () => {
96
+ const coreDir = await makeCorePrismaDir(['0001_init']);
97
+ const projectDir = await mkdtemp(path.join(tmpdir(), 'consumer-custom-'));
98
+ temps.push(coreDir, projectDir);
99
+ const schemaPath = path.join(projectDir, 'prisma', 'schema.prisma');
100
+ await mkdir(path.dirname(schemaPath), { recursive: true });
101
+ const custom = 'datasource db {\n provider = "postgresql"\n}\n\nmodel MyThing {}\n';
102
+ await writeFile(schemaPath, custom);
103
+ const result = await syncPrismaAssets(schemaPath, coreDir);
104
+ expect(result.schemaWritten).toBe(false);
105
+ expect(result.skippedReason).toMatch(/AUTO-SYNCED/);
106
+ // Custom schema untouched...
107
+ expect(await readFile(schemaPath, 'utf-8')).toBe(custom);
108
+ // ...but migrations are still synced additively.
109
+ expect(result.migrationsAdded).toEqual(['0001_init']);
110
+ });
111
+ it('overwrites a customized schema when --force is set', async () => {
112
+ const coreDir = await makeCorePrismaDir(['0001_init']);
113
+ const projectDir = await mkdtemp(path.join(tmpdir(), 'consumer-force-'));
114
+ temps.push(coreDir, projectDir);
115
+ const schemaPath = path.join(projectDir, 'prisma', 'schema.prisma');
116
+ await mkdir(path.dirname(schemaPath), { recursive: true });
117
+ await writeFile(schemaPath, 'model MyThing {}\n');
118
+ const result = await syncPrismaAssets(schemaPath, coreDir, { force: true });
119
+ expect(result.schemaWritten).toBe(true);
120
+ expect(await readFile(schemaPath, 'utf-8')).toContain('@@map("actuate_users")');
121
+ });
122
+ it('is idempotent — a second run writes nothing', async () => {
123
+ const coreDir = await makeCorePrismaDir(['0001_init']);
124
+ const projectDir = await mkdtemp(path.join(tmpdir(), 'consumer-idem-'));
125
+ temps.push(coreDir, projectDir);
126
+ const schemaPath = path.join(projectDir, 'prisma', 'schema.prisma');
127
+ const first = await syncPrismaAssets(schemaPath, coreDir);
128
+ expect(first.schemaWritten).toBe(true);
129
+ expect(first.migrationsAdded).toEqual(['0001_init']);
130
+ const second = await syncPrismaAssets(schemaPath, coreDir);
131
+ expect(second.schemaWritten).toBe(false);
132
+ expect(second.migrationsAdded).toEqual([]);
133
+ });
134
+ });
135
+ });
136
+ //# sourceMappingURL=db-sync.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-sync.test.js","sourceRoot":"","sources":["../../src/__tests__/db-sync.test.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ vi.mock('@actuate-media/cms-core', () => ({
5
5
  sanitizeHtml: vi.fn((value) => value.replace(/<script[\s\S]*?<\/script>/gi, '')),
6
6
  createInitialAdmin: vi.fn(),
7
7
  }));
8
- import { createSeedDocument, ensureSeedAdmin, normalizeSeedPayload } from '../commands/seed.js';
8
+ import { createSeedDocument, ensureSeedAdmin, normalizeSeedPayload, DEMO_NAVIGATIONS, } from '../commands/seed.js';
9
9
  afterEach(() => {
10
10
  vi.unstubAllEnvs();
11
11
  });
@@ -112,4 +112,23 @@ describe('seed document creation', () => {
112
112
  });
113
113
  });
114
114
  });
115
+ describe('demo navigations', () => {
116
+ // The scaffold site layout fetches menus by the `main` and `footer` slugs, so
117
+ // the demo seed must provide exactly those — guard against slug drift.
118
+ it('seeds header (main) and footer menus with well-formed items', () => {
119
+ const bySlug = new Map(DEMO_NAVIGATIONS.map((n) => [n.slug, n]));
120
+ expect(bySlug.has('main')).toBe(true);
121
+ expect(bySlug.has('footer')).toBe(true);
122
+ expect(bySlug.get('main')?.location).toBe('header');
123
+ expect(bySlug.get('footer')?.location).toBe('footer');
124
+ for (const nav of DEMO_NAVIGATIONS) {
125
+ expect(nav.items.length).toBeGreaterThan(0);
126
+ for (const item of nav.items) {
127
+ expect(typeof item.label).toBe('string');
128
+ expect(item.label.length).toBeGreaterThan(0);
129
+ expect(item.url.startsWith('/')).toBe(true);
130
+ }
131
+ }
132
+ });
133
+ });
115
134
  //# sourceMappingURL=seed.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"seed.test.js","sourceRoot":"","sources":["../../src/__tests__/seed.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE5D,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC1E,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC;IACxC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;IACxF,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC5B,CAAC,CAAC,CAAA;AAEH,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE/F,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,aAAa,EAAE,CAAA;AACpB,CAAC,CAAC,CAAA;AAEF,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,CAAA;QAEF,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,CAAA;QACF,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,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,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,CAAA;QAEF,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACtC,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,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,GAAG;YACT,IAAI,EAAE;gBACJ,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;aAC3C;SACF,CAAA;QAED,MAAM,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAA;IAC7F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,EAAE,GAAG;YACT,QAAQ,EAAE;gBACR,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;aACnD;YACD,OAAO,EAAE;gBACP,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;aAChB;SACF,CAAA;QACD,MAAM,EAAE,GAAG;YACT,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SAC1C,CAAA;QAED,MAAM,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE;YACtC,UAAU,EAAE,OAAO;YACnB,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE;gBACJ,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,uCAAuC;aACjD;SACF,CAAC,CAAA;QAEF,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC;YAC9C,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBAC5B,UAAU,EAAE,OAAO;gBACnB,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,WAAW;gBACnB,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC7B,WAAW,EAAE,SAAS;gBACtB,WAAW,EAAE,SAAS;gBACtB,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC7B,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC/B,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC;oBAC5B,OAAO,EAAE,cAAc;iBACxB,CAAC;aACH,CAAC;SACH,CAAC,CAAA;QACF,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC;YAC7C,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBAC5B,UAAU,EAAE,OAAO;gBACnB,WAAW,EAAE,SAAS;gBACtB,UAAU,EAAE,QAAQ;aACrB,CAAC;SACH,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"seed.test.js","sourceRoot":"","sources":["../../src/__tests__/seed.test.ts"],"names":[],"mappings":"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"}
@@ -3,5 +3,22 @@ import { type ExecSyncOptions } from 'node:child_process';
3
3
  export declare let runDbInitCommand: (command: string, options: ExecSyncOptions) => void;
4
4
  export declare function setDbInitCommandRunner(runner: typeof runDbInitCommand): void;
5
5
  export declare function resetDbInitCommandRunner(): void;
6
+ /**
7
+ * Reads the canonical Prisma schema shipped by the installed
8
+ * `@actuate-media/cms-core` package. This is the single source of truth — it has
9
+ * the correct `@@map("actuate_*")` table names and every model the API handlers
10
+ * expect. Previously `db:init` injected a hand-maintained copy that drifted
11
+ * (missing `@@map`, missing models), producing a database the runtime couldn't
12
+ * query. Overridable for tests.
13
+ */
14
+ export declare let readCanonicalCmsSchema: () => Promise<string | null>;
15
+ export declare function setCanonicalSchemaReader(reader: typeof readCanonicalCmsSchema): void;
16
+ export declare function resetCanonicalSchemaReader(): void;
17
+ /**
18
+ * Strips the top-level `generator` and `datasource` blocks from a full Prisma
19
+ * schema, leaving only the `enum` and `model` definitions. The consumer keeps
20
+ * their own datasource/generator; we only contribute models.
21
+ */
22
+ export declare function extractModelsFragment(fullSchema: string): string;
6
23
  export declare function registerDbInitCommand(program: Command): void;
7
24
  //# sourceMappingURL=db-init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"db-init.d.ts","sourceRoot":"","sources":["../../src/commands/db-init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAMnE,eAAO,IAAI,gBAAgB,GAAI,SAAS,MAAM,EAAE,SAAS,eAAe,KAAG,IAE1E,CAAA;AAID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,gBAAgB,GAAG,IAAI,CAE5E;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AA8RD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4E5D"}
1
+ {"version":3,"file":"db-init.d.ts","sourceRoot":"","sources":["../../src/commands/db-init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAQnE,eAAO,IAAI,gBAAgB,GAAI,SAAS,MAAM,EAAE,SAAS,eAAe,KAAG,IAE1E,CAAA;AAID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,gBAAgB,GAAG,IAAI,CAE5E;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED;;;;;;;GAOG;AACH,eAAO,IAAI,sBAAsB,QAAa,OAAO,CAAC,MAAM,GAAG,IAAI,CAyBlE,CAAA;AAID,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,OAAO,sBAAsB,GAAG,IAAI,CAEpF;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAsBhE;AAsBD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsF5D"}