@actuate-media/cli 0.4.1 → 0.5.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.
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-test.log +69 -12
- package/CHANGELOG.md +58 -0
- package/dist/__tests__/db-init.test.d.ts +2 -0
- package/dist/__tests__/db-init.test.d.ts.map +1 -0
- package/dist/__tests__/db-init.test.js +127 -0
- package/dist/__tests__/db-init.test.js.map +1 -0
- package/dist/__tests__/db-sync.test.d.ts +2 -0
- package/dist/__tests__/db-sync.test.d.ts.map +1 -0
- package/dist/__tests__/db-sync.test.js +136 -0
- package/dist/__tests__/db-sync.test.js.map +1 -0
- package/dist/__tests__/deployment-diagnostics.test.js.map +1 -1
- package/dist/__tests__/init.test.js.map +1 -1
- package/dist/__tests__/schema-fragment.test.js +1 -1
- package/dist/__tests__/schema-fragment.test.js.map +1 -1
- package/dist/__tests__/seed.test.js.map +1 -1
- package/dist/commands/db-init.d.ts +19 -2
- package/dist/commands/db-init.d.ts.map +1 -1
- package/dist/commands/db-init.js +128 -306
- package/dist/commands/db-init.js.map +1 -1
- package/dist/commands/db-status.d.ts +1 -1
- package/dist/commands/db-status.d.ts.map +1 -1
- package/dist/commands/db-status.js +33 -33
- package/dist/commands/db-status.js.map +1 -1
- package/dist/commands/db-sync.d.ts +31 -0
- package/dist/commands/db-sync.d.ts.map +1 -0
- package/dist/commands/db-sync.js +195 -0
- package/dist/commands/db-sync.js.map +1 -0
- package/dist/commands/doctor.d.ts +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +48 -41
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/export.d.ts +1 -1
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +32 -32
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/generate.d.ts +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +8 -8
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/import.d.ts +1 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +55 -58
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.d.ts +1 -1
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +18 -24
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/seed.d.ts +1 -1
- package/dist/commands/seed.d.ts.map +1 -1
- package/dist/commands/seed.js +156 -157
- package/dist/commands/seed.js.map +1 -1
- package/dist/commands/update-check.d.ts +1 -1
- package/dist/commands/update-check.d.ts.map +1 -1
- package/dist/commands/update-check.js +34 -27
- package/dist/commands/update-check.js.map +1 -1
- package/dist/commands/upgrade.d.ts +1 -1
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +46 -34
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/deployment/diagnostics.d.ts.map +1 -1
- package/dist/deployment/diagnostics.js +7 -2
- package/dist/deployment/diagnostics.js.map +1 -1
- package/dist/index.js +17 -15
- package/dist/index.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +5 -5
- package/dist/utils/logger.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/db-init.test.ts +155 -0
- package/src/__tests__/db-sync.test.ts +167 -0
- package/src/__tests__/deployment-diagnostics.test.ts +68 -60
- package/src/__tests__/init.test.ts +17 -17
- package/src/__tests__/schema-fragment.test.ts +29 -25
- package/src/__tests__/seed.test.ts +25 -25
- package/src/commands/db-init.ts +146 -319
- package/src/commands/db-status.ts +70 -68
- package/src/commands/db-sync.ts +227 -0
- package/src/commands/doctor.ts +102 -88
- package/src/commands/export.ts +65 -75
- package/src/commands/generate.ts +14 -16
- package/src/commands/import.ts +125 -140
- package/src/commands/init.ts +14 -14
- package/src/commands/migrate.ts +29 -35
- package/src/commands/seed.ts +294 -300
- package/src/commands/update-check.ts +77 -72
- package/src/commands/upgrade.ts +100 -85
- package/src/deployment/diagnostics.ts +86 -72
- package/src/index.ts +32 -30
- package/src/utils/logger.ts +10 -10
package/dist/commands/db-init.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { readFile, writeFile, access } from
|
|
2
|
-
import { resolve } from
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
1
|
+
import { readFile, writeFile, access } from 'node:fs/promises';
|
|
2
|
+
import { resolve, join, dirname } from 'node:path';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { execSync } from 'node:child_process';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
const CMS_SCHEMA_MARKER = '// ── Actuate CMS models';
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
7
9
|
export let runDbInitCommand = (command, options) => {
|
|
8
10
|
execSync(command, options);
|
|
9
11
|
};
|
|
@@ -14,359 +16,179 @@ export function setDbInitCommandRunner(runner) {
|
|
|
14
16
|
export function resetDbInitCommandRunner() {
|
|
15
17
|
runDbInitCommand = defaultDbInitCommandRunner;
|
|
16
18
|
}
|
|
17
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Reads the canonical Prisma schema shipped by the installed
|
|
21
|
+
* `@actuate-media/cms-core` package. This is the single source of truth — it has
|
|
22
|
+
* the correct `@@map("actuate_*")` table names and every model the API handlers
|
|
23
|
+
* expect. Previously `db:init` injected a hand-maintained copy that drifted
|
|
24
|
+
* (missing `@@map`, missing models), producing a database the runtime couldn't
|
|
25
|
+
* query. Overridable for tests.
|
|
26
|
+
*/
|
|
27
|
+
export let readCanonicalCmsSchema = async () => {
|
|
28
|
+
const candidates = [];
|
|
18
29
|
try {
|
|
19
|
-
|
|
20
|
-
|
|
30
|
+
// `./prisma/schema` is an exported subpath, so this resolves inside the
|
|
31
|
+
// package's `prisma/` directory without depending on the build output.
|
|
32
|
+
const exported = require.resolve('@actuate-media/cms-core/prisma/schema');
|
|
33
|
+
candidates.push(join(dirname(exported), 'schema.prisma'));
|
|
21
34
|
}
|
|
22
35
|
catch {
|
|
23
|
-
|
|
36
|
+
/* exports map missing the subpath — fall through to the main entry */
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const mainEntry = require.resolve('@actuate-media/cms-core');
|
|
40
|
+
candidates.push(join(dirname(mainEntry), '..', 'prisma', 'schema.prisma'));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
/* package not installed */
|
|
44
|
+
}
|
|
45
|
+
for (const candidate of candidates) {
|
|
46
|
+
try {
|
|
47
|
+
return await readFile(candidate, 'utf-8');
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
/* try the next candidate */
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
};
|
|
55
|
+
const defaultSchemaReader = readCanonicalCmsSchema;
|
|
56
|
+
export function setCanonicalSchemaReader(reader) {
|
|
57
|
+
readCanonicalCmsSchema = reader;
|
|
58
|
+
}
|
|
59
|
+
export function resetCanonicalSchemaReader() {
|
|
60
|
+
readCanonicalCmsSchema = defaultSchemaReader;
|
|
61
|
+
}
|
|
62
|
+
function netBraces(line) {
|
|
63
|
+
return (line.match(/\{/g)?.length ?? 0) - (line.match(/\}/g)?.length ?? 0);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Strips the top-level `generator` and `datasource` blocks from a full Prisma
|
|
67
|
+
* schema, leaving only the `enum` and `model` definitions. The consumer keeps
|
|
68
|
+
* their own datasource/generator; we only contribute models.
|
|
69
|
+
*/
|
|
70
|
+
export function extractModelsFragment(fullSchema) {
|
|
71
|
+
const lines = fullSchema.split(/\r?\n/);
|
|
72
|
+
const kept = [];
|
|
73
|
+
let skipping = false;
|
|
74
|
+
let depth = 0;
|
|
75
|
+
for (const line of lines) {
|
|
76
|
+
if (!skipping) {
|
|
77
|
+
if (/^\s*(generator|datasource)\s+[A-Za-z0-9_]+\s*\{/.test(line)) {
|
|
78
|
+
skipping = true;
|
|
79
|
+
depth = netBraces(line);
|
|
80
|
+
if (depth <= 0)
|
|
81
|
+
skipping = false;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
kept.push(line);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
depth += netBraces(line);
|
|
88
|
+
if (depth <= 0)
|
|
89
|
+
skipping = false;
|
|
90
|
+
}
|
|
24
91
|
}
|
|
92
|
+
return kept.join('\n').trim();
|
|
25
93
|
}
|
|
26
|
-
function
|
|
94
|
+
function wrapFragment(models) {
|
|
27
95
|
return `
|
|
28
|
-
|
|
29
|
-
// Auto-injected by \`actuate db:init
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
enum DocumentStatus {
|
|
33
|
-
DRAFT
|
|
34
|
-
PUBLISHED
|
|
35
|
-
ARCHIVED
|
|
36
|
-
SCHEDULED
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
model User {
|
|
40
|
-
id String @id @default(cuid())
|
|
41
|
-
email String @unique
|
|
42
|
-
name String @default("")
|
|
43
|
-
role String @default("EDITOR")
|
|
44
|
-
passwordHash String?
|
|
45
|
-
isActive Boolean @default(true)
|
|
46
|
-
isApproved Boolean @default(false)
|
|
47
|
-
emailVerified Boolean @default(false)
|
|
48
|
-
totpEnabled Boolean @default(false)
|
|
49
|
-
totpSecret String?
|
|
50
|
-
backupCodes Json?
|
|
51
|
-
oauthProvider String?
|
|
52
|
-
oauthId String?
|
|
53
|
-
createdAt DateTime @default(now())
|
|
54
|
-
updatedAt DateTime @updatedAt
|
|
55
|
-
|
|
56
|
-
sessions Session[]
|
|
57
|
-
documentsCreated Document[] @relation("DocumentCreatedBy")
|
|
58
|
-
documentsUpdated Document[] @relation("DocumentUpdatedBy")
|
|
59
|
-
documentsReviewed Document[] @relation("DocumentReviewer")
|
|
60
|
-
versions Version[]
|
|
61
|
-
mediaUploaded Media[] @relation("MediaUploadedBy")
|
|
62
|
-
auditLogs AuditLog[]
|
|
63
|
-
|
|
64
|
-
@@index([role])
|
|
65
|
-
@@index([isActive])
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
model Session {
|
|
69
|
-
id String @id @default(cuid())
|
|
70
|
-
userId String
|
|
71
|
-
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
72
|
-
token String? @unique
|
|
73
|
-
expiresAt DateTime
|
|
74
|
-
revokedAt DateTime?
|
|
75
|
-
ipAddress String?
|
|
76
|
-
userAgent String?
|
|
77
|
-
createdAt DateTime @default(now())
|
|
78
|
-
|
|
79
|
-
@@index([userId])
|
|
80
|
-
@@index([expiresAt])
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
model Document {
|
|
84
|
-
id String @id @default(cuid())
|
|
85
|
-
collection String
|
|
86
|
-
slug String?
|
|
87
|
-
title String?
|
|
88
|
-
data Json
|
|
89
|
-
status DocumentStatus @default(DRAFT)
|
|
90
|
-
plainText String? @db.Text
|
|
91
|
-
locale String?
|
|
92
|
-
folderId String?
|
|
93
|
-
structuredData Json?
|
|
94
|
-
workflowStage String?
|
|
95
|
-
reviewerId String?
|
|
96
|
-
reviewNote String? @db.Text
|
|
97
|
-
publishedAt DateTime?
|
|
98
|
-
scheduledAt DateTime?
|
|
99
|
-
scheduledUnpublishAt DateTime?
|
|
100
|
-
deletedAt DateTime?
|
|
101
|
-
contentHash String?
|
|
102
|
-
siteId String?
|
|
103
|
-
templateId String?
|
|
104
|
-
createdById String
|
|
105
|
-
updatedById String
|
|
106
|
-
createdAt DateTime @default(now())
|
|
107
|
-
updatedAt DateTime @updatedAt
|
|
108
|
-
|
|
109
|
-
createdBy User @relation("DocumentCreatedBy", fields: [createdById], references: [id], onDelete: Restrict)
|
|
110
|
-
updatedBy User @relation("DocumentUpdatedBy", fields: [updatedById], references: [id], onDelete: Restrict)
|
|
111
|
-
reviewer User? @relation("DocumentReviewer", fields: [reviewerId], references: [id], onDelete: SetNull)
|
|
112
|
-
folder Folder? @relation(fields: [folderId], references: [id], onDelete: SetNull)
|
|
113
|
-
versions Version[]
|
|
114
|
-
formSubmissions FormSubmission[]
|
|
115
|
-
|
|
116
|
-
@@unique([collection, slug], name: "collection_slug")
|
|
117
|
-
@@index([collection])
|
|
118
|
-
@@index([status])
|
|
119
|
-
@@index([deletedAt])
|
|
120
|
-
@@index([publishedAt])
|
|
121
|
-
@@index([folderId])
|
|
122
|
-
@@index([locale])
|
|
123
|
-
@@index([scheduledAt])
|
|
124
|
-
@@index([scheduledUnpublishAt])
|
|
125
|
-
@@index([createdById])
|
|
126
|
-
@@index([updatedById])
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
model Media {
|
|
130
|
-
id String @id @default(cuid())
|
|
131
|
-
filename String
|
|
132
|
-
storageKey String @unique
|
|
133
|
-
mimeType String
|
|
134
|
-
fileSize Int
|
|
135
|
-
width Int?
|
|
136
|
-
height Int?
|
|
137
|
-
altText String?
|
|
138
|
-
title String?
|
|
139
|
-
blurHash String?
|
|
140
|
-
focalPointX Float?
|
|
141
|
-
focalPointY Float?
|
|
142
|
-
folderId String?
|
|
143
|
-
uploadedById String
|
|
144
|
-
createdAt DateTime @default(now())
|
|
145
|
-
updatedAt DateTime @updatedAt
|
|
146
|
-
|
|
147
|
-
uploadedBy User @relation("MediaUploadedBy", fields: [uploadedById], references: [id], onDelete: Restrict)
|
|
148
|
-
folder Folder? @relation(fields: [folderId], references: [id], onDelete: SetNull)
|
|
149
|
-
|
|
150
|
-
@@index([folderId])
|
|
151
|
-
@@index([mimeType])
|
|
152
|
-
@@index([createdAt])
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
model Version {
|
|
156
|
-
id String @id @default(cuid())
|
|
157
|
-
documentId String
|
|
158
|
-
document Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
|
|
159
|
-
data Json
|
|
160
|
-
changedById String
|
|
161
|
-
changedBy User @relation(fields: [changedById], references: [id], onDelete: Restrict)
|
|
162
|
-
changeType String @default("UPDATE")
|
|
163
|
-
createdAt DateTime @default(now())
|
|
164
|
-
|
|
165
|
-
@@index([documentId])
|
|
166
|
-
@@index([createdAt])
|
|
167
|
-
}
|
|
96
|
+
${CMS_SCHEMA_MARKER} ─────────────────────────────────────────────────────────
|
|
97
|
+
// Auto-injected by \`actuate db:init\` from the installed @actuate-media/cms-core
|
|
98
|
+
// package's canonical prisma/schema.prisma (the single source of truth). Do not
|
|
99
|
+
// edit by hand — re-run \`actuate db:init --force\` after upgrading cms-core.
|
|
168
100
|
|
|
169
|
-
|
|
170
|
-
id String @id @default(cuid())
|
|
171
|
-
name String
|
|
172
|
-
scope String
|
|
173
|
-
parentId String?
|
|
174
|
-
position Int @default(0)
|
|
175
|
-
createdAt DateTime @default(now())
|
|
176
|
-
|
|
177
|
-
parent Folder? @relation("FolderTree", fields: [parentId], references: [id], onDelete: Cascade)
|
|
178
|
-
children Folder[] @relation("FolderTree")
|
|
179
|
-
documents Document[]
|
|
180
|
-
media Media[]
|
|
181
|
-
|
|
182
|
-
@@index([scope])
|
|
183
|
-
@@index([parentId])
|
|
184
|
-
@@index([scope, parentId, position])
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
model Redirect {
|
|
188
|
-
id String @id @default(cuid())
|
|
189
|
-
source String
|
|
190
|
-
destination String
|
|
191
|
-
statusCode Int @default(301)
|
|
192
|
-
isRegex Boolean @default(false)
|
|
193
|
-
notes String?
|
|
194
|
-
createdAt DateTime @default(now())
|
|
195
|
-
updatedAt DateTime @updatedAt
|
|
196
|
-
|
|
197
|
-
@@unique([source])
|
|
198
|
-
@@index([createdAt])
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
model FormSubmission {
|
|
202
|
-
id String @id @default(cuid())
|
|
203
|
-
formId String
|
|
204
|
-
form Document @relation(fields: [formId], references: [id], onDelete: Cascade)
|
|
205
|
-
data Json
|
|
206
|
-
attribution Json?
|
|
207
|
-
submittedAt DateTime @default(now())
|
|
208
|
-
createdAt DateTime @default(now())
|
|
209
|
-
|
|
210
|
-
@@index([formId])
|
|
211
|
-
@@index([submittedAt])
|
|
212
|
-
@@index([createdAt])
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
model AuditLog {
|
|
216
|
-
id String @id @default(cuid())
|
|
217
|
-
event String
|
|
218
|
-
userId String?
|
|
219
|
-
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
|
|
220
|
-
details Json?
|
|
221
|
-
ipAddress String?
|
|
222
|
-
userAgent String?
|
|
223
|
-
createdAt DateTime @default(now())
|
|
224
|
-
|
|
225
|
-
@@index([event])
|
|
226
|
-
@@index([userId])
|
|
227
|
-
@@index([createdAt])
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
model PasswordResetToken {
|
|
231
|
-
id String @id @default(cuid())
|
|
232
|
-
userId String
|
|
233
|
-
tokenHash String
|
|
234
|
-
expiresAt DateTime
|
|
235
|
-
usedAt DateTime?
|
|
236
|
-
createdAt DateTime @default(now())
|
|
237
|
-
|
|
238
|
-
@@index([tokenHash])
|
|
239
|
-
@@index([userId])
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
model MediaUsage {
|
|
243
|
-
id String @id @default(cuid())
|
|
244
|
-
mediaId String
|
|
245
|
-
documentId String
|
|
246
|
-
fieldPath String?
|
|
247
|
-
createdAt DateTime @default(now())
|
|
248
|
-
|
|
249
|
-
@@unique([mediaId, documentId, fieldPath])
|
|
250
|
-
@@index([mediaId])
|
|
251
|
-
@@index([documentId])
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
model ScriptTag {
|
|
255
|
-
id String @id @default(cuid())
|
|
256
|
-
name String
|
|
257
|
-
code String @db.Text
|
|
258
|
-
placement String
|
|
259
|
-
scope String
|
|
260
|
-
targetPaths String[]
|
|
261
|
-
priority Int @default(100)
|
|
262
|
-
enabled Boolean @default(true)
|
|
263
|
-
createdAt DateTime @default(now())
|
|
264
|
-
updatedAt DateTime @updatedAt
|
|
265
|
-
|
|
266
|
-
@@index([enabled])
|
|
267
|
-
@@index([placement])
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
model PageTemplate {
|
|
271
|
-
id String @id @default(cuid())
|
|
272
|
-
name String
|
|
273
|
-
description String?
|
|
274
|
-
category String @default("content")
|
|
275
|
-
tree Json
|
|
276
|
-
thumbnail String?
|
|
277
|
-
builtIn Boolean @default(false)
|
|
278
|
-
createdAt DateTime @default(now())
|
|
279
|
-
updatedAt DateTime @updatedAt
|
|
280
|
-
|
|
281
|
-
@@index([category])
|
|
282
|
-
@@index([builtIn])
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
model SavedSection {
|
|
286
|
-
id String @id @default(cuid())
|
|
287
|
-
name String
|
|
288
|
-
description String?
|
|
289
|
-
category String @default("content")
|
|
290
|
-
tree Json
|
|
291
|
-
thumbnail String?
|
|
292
|
-
usageCount Int @default(0)
|
|
293
|
-
createdAt DateTime @default(now())
|
|
294
|
-
updatedAt DateTime @updatedAt
|
|
295
|
-
|
|
296
|
-
@@index([category])
|
|
297
|
-
}
|
|
101
|
+
${models}
|
|
298
102
|
`;
|
|
299
103
|
}
|
|
104
|
+
async function fileExists(filePath) {
|
|
105
|
+
try {
|
|
106
|
+
await access(filePath);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
300
113
|
export function registerDbInitCommand(program) {
|
|
301
114
|
program
|
|
302
|
-
.command(
|
|
303
|
-
.description(
|
|
304
|
-
.option(
|
|
305
|
-
.option(
|
|
306
|
-
.option(
|
|
115
|
+
.command('db:init')
|
|
116
|
+
.description('Add Actuate CMS models (from the installed cms-core) to your Prisma schema')
|
|
117
|
+
.option('--schema <path>', 'Path to schema.prisma', 'prisma/schema.prisma')
|
|
118
|
+
.option('--migrate', 'Run prisma migrate dev after adding models')
|
|
119
|
+
.option('--force', 'Overwrite existing CMS models if present')
|
|
307
120
|
.action(async (opts) => {
|
|
308
121
|
const schemaPath = resolve(process.cwd(), opts.schema);
|
|
309
122
|
if (!(await fileExists(schemaPath))) {
|
|
310
123
|
logger.error(`Schema file not found at ${schemaPath}`);
|
|
311
|
-
logger.info(
|
|
124
|
+
logger.info('Run `npx prisma init` first, or specify --schema <path>.');
|
|
125
|
+
process.exitCode = 1;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const spinner = ora('Reading canonical Actuate schema...').start();
|
|
129
|
+
const canonical = await readCanonicalCmsSchema();
|
|
130
|
+
if (!canonical) {
|
|
131
|
+
spinner.fail('Could not locate @actuate-media/cms-core.');
|
|
132
|
+
logger.info('Install it first: `npm install @actuate-media/cms-core`.');
|
|
312
133
|
process.exitCode = 1;
|
|
313
134
|
return;
|
|
314
135
|
}
|
|
315
|
-
const
|
|
136
|
+
const fragment = wrapFragment(extractModelsFragment(canonical));
|
|
137
|
+
spinner.text = 'Reading Prisma schema...';
|
|
316
138
|
let content;
|
|
317
139
|
try {
|
|
318
|
-
content = await readFile(schemaPath,
|
|
140
|
+
content = await readFile(schemaPath, 'utf-8');
|
|
319
141
|
}
|
|
320
142
|
catch (err) {
|
|
321
|
-
spinner.fail(
|
|
143
|
+
spinner.fail('Failed to read schema file.');
|
|
322
144
|
logger.error(err instanceof Error ? err.message : String(err));
|
|
323
145
|
process.exitCode = 1;
|
|
324
146
|
return;
|
|
325
147
|
}
|
|
326
148
|
if (content.includes(CMS_SCHEMA_MARKER)) {
|
|
327
149
|
if (!opts.force) {
|
|
328
|
-
spinner.info(
|
|
150
|
+
spinner.info('Actuate CMS models already present in schema. Use --force to overwrite.');
|
|
329
151
|
return;
|
|
330
152
|
}
|
|
331
|
-
spinner.text =
|
|
153
|
+
spinner.text = 'Removing existing CMS models...';
|
|
332
154
|
const markerIndex = content.indexOf(CMS_SCHEMA_MARKER);
|
|
333
|
-
content = content.substring(0, markerIndex).trimEnd() +
|
|
155
|
+
content = content.substring(0, markerIndex).trimEnd() + '\n';
|
|
334
156
|
}
|
|
335
|
-
spinner.text =
|
|
336
|
-
const updatedContent = content.trimEnd() +
|
|
157
|
+
spinner.text = 'Adding Actuate CMS models...';
|
|
158
|
+
const updatedContent = content.trimEnd() + '\n' + fragment;
|
|
337
159
|
try {
|
|
338
160
|
await writeFile(schemaPath, updatedContent);
|
|
339
|
-
spinner.succeed(
|
|
161
|
+
spinner.succeed('Actuate CMS models added to schema.');
|
|
340
162
|
}
|
|
341
163
|
catch (err) {
|
|
342
|
-
spinner.fail(
|
|
164
|
+
spinner.fail('Failed to write schema file.');
|
|
343
165
|
logger.error(err instanceof Error ? err.message : String(err));
|
|
344
166
|
process.exitCode = 1;
|
|
345
167
|
return;
|
|
346
168
|
}
|
|
347
|
-
const execOpts = { stdio:
|
|
348
|
-
const genSpinner = ora(
|
|
169
|
+
const execOpts = { stdio: 'inherit', cwd: process.cwd() };
|
|
170
|
+
const genSpinner = ora('Running prisma generate...').start();
|
|
349
171
|
try {
|
|
350
172
|
genSpinner.stop();
|
|
351
|
-
runDbInitCommand(
|
|
352
|
-
logger.success(
|
|
173
|
+
runDbInitCommand('npx prisma generate', execOpts);
|
|
174
|
+
logger.success('Prisma client generated.');
|
|
353
175
|
}
|
|
354
176
|
catch {
|
|
355
|
-
logger.warn(
|
|
177
|
+
logger.warn('prisma generate failed. You may need to set DATABASE_URL first.');
|
|
356
178
|
}
|
|
357
179
|
if (opts.migrate) {
|
|
358
|
-
const migSpinner = ora(
|
|
180
|
+
const migSpinner = ora('Running prisma migrate dev...').start();
|
|
359
181
|
try {
|
|
360
182
|
migSpinner.stop();
|
|
361
|
-
runDbInitCommand(
|
|
362
|
-
logger.success(
|
|
183
|
+
runDbInitCommand('npx prisma migrate dev --name actuate-cms-init', execOpts);
|
|
184
|
+
logger.success('Migration created and applied.');
|
|
363
185
|
}
|
|
364
186
|
catch {
|
|
365
|
-
logger.warn(
|
|
187
|
+
logger.warn('prisma migrate dev failed. Run it manually after setting DATABASE_URL.');
|
|
366
188
|
}
|
|
367
189
|
}
|
|
368
190
|
else {
|
|
369
|
-
logger.info(
|
|
191
|
+
logger.info('Run `npx prisma migrate dev --name actuate-cms` to create the migration.');
|
|
370
192
|
}
|
|
371
193
|
});
|
|
372
194
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-init.js","sourceRoot":"","sources":["../../src/commands/db-init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"db-init.js","sourceRoot":"","sources":["../../src/commands/db-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-status.d.ts","sourceRoot":"","sources":["../../src/commands/db-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"db-status.d.ts","sourceRoot":"","sources":["../../src/commands/db-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoBnC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqG9D"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { execSync } from
|
|
2
|
-
import { readFile, access } from
|
|
3
|
-
import { resolve } from
|
|
4
|
-
import ora from
|
|
5
|
-
import chalk from
|
|
6
|
-
import { logger } from
|
|
7
|
-
import { REQUIRED_CMS_MODELS } from
|
|
8
|
-
const CMS_SCHEMA_MARKER =
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { readFile, access } from 'node:fs/promises';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
import { REQUIRED_CMS_MODELS } from '../deployment/diagnostics.js';
|
|
8
|
+
const CMS_SCHEMA_MARKER = '// ── Actuate CMS models';
|
|
9
9
|
async function fileExists(filePath) {
|
|
10
10
|
try {
|
|
11
11
|
await access(filePath);
|
|
@@ -17,24 +17,24 @@ async function fileExists(filePath) {
|
|
|
17
17
|
}
|
|
18
18
|
export function registerDbStatusCommand(program) {
|
|
19
19
|
program
|
|
20
|
-
.command(
|
|
21
|
-
.description(
|
|
22
|
-
.option(
|
|
20
|
+
.command('db:status')
|
|
21
|
+
.description('Check which Actuate CMS models are present in your Prisma schema')
|
|
22
|
+
.option('--schema <path>', 'Path to schema.prisma', 'prisma/schema.prisma')
|
|
23
23
|
.action(async (opts) => {
|
|
24
24
|
const schemaPath = resolve(process.cwd(), opts.schema);
|
|
25
25
|
if (!(await fileExists(schemaPath))) {
|
|
26
26
|
logger.error(`Schema file not found at ${schemaPath}`);
|
|
27
|
-
logger.info(
|
|
27
|
+
logger.info('Run `npx prisma init` first, or specify --schema <path>.');
|
|
28
28
|
process.exitCode = 1;
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
31
|
-
const spinner = ora(
|
|
31
|
+
const spinner = ora('Checking schema...').start();
|
|
32
32
|
let content;
|
|
33
33
|
try {
|
|
34
|
-
content = await readFile(schemaPath,
|
|
34
|
+
content = await readFile(schemaPath, 'utf-8');
|
|
35
35
|
}
|
|
36
36
|
catch (err) {
|
|
37
|
-
spinner.fail(
|
|
37
|
+
spinner.fail('Failed to read schema file.');
|
|
38
38
|
logger.error(err instanceof Error ? err.message : String(err));
|
|
39
39
|
process.exitCode = 1;
|
|
40
40
|
return;
|
|
@@ -48,58 +48,58 @@ export function registerDbStatusCommand(program) {
|
|
|
48
48
|
schemaModels.add(match[1]);
|
|
49
49
|
}
|
|
50
50
|
console.log();
|
|
51
|
-
console.log(chalk.bold(
|
|
52
|
-
console.log(chalk.dim(
|
|
51
|
+
console.log(chalk.bold(' Actuate CMS Model Status'));
|
|
52
|
+
console.log(chalk.dim(' ─────────────────────────────────'));
|
|
53
53
|
console.log();
|
|
54
54
|
let present = 0;
|
|
55
55
|
let missing = 0;
|
|
56
56
|
for (const model of REQUIRED_CMS_MODELS) {
|
|
57
57
|
if (schemaModels.has(model)) {
|
|
58
|
-
console.log(` ${chalk.green(
|
|
58
|
+
console.log(` ${chalk.green('✓')} ${model}`);
|
|
59
59
|
present++;
|
|
60
60
|
}
|
|
61
61
|
else {
|
|
62
|
-
console.log(` ${chalk.red(
|
|
62
|
+
console.log(` ${chalk.red('✗')} ${model} ${chalk.dim('— missing')}`);
|
|
63
63
|
missing++;
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
console.log();
|
|
67
|
-
console.log(chalk.dim(
|
|
67
|
+
console.log(chalk.dim(' ─────────────────────────────────'));
|
|
68
68
|
console.log(` ${chalk.green(present)} present, ${missing > 0 ? chalk.red(missing) : chalk.green(missing)} missing`);
|
|
69
69
|
if (!hasMarker) {
|
|
70
70
|
console.log();
|
|
71
|
-
logger.warn(
|
|
72
|
-
logger.info(
|
|
71
|
+
logger.warn('CMS schema marker not found. Models may have been added manually.');
|
|
72
|
+
logger.info('Run `actuate db:init` to add CMS models with proper markers.');
|
|
73
73
|
}
|
|
74
74
|
if (missing > 0) {
|
|
75
75
|
console.log();
|
|
76
|
-
logger.info(
|
|
76
|
+
logger.info('Run `actuate db:init` to add missing models.');
|
|
77
77
|
}
|
|
78
78
|
let dbConnected = false;
|
|
79
79
|
try {
|
|
80
|
-
spinner.start(
|
|
81
|
-
execSync(
|
|
82
|
-
input:
|
|
83
|
-
stdio: [
|
|
80
|
+
spinner.start('Checking database connection...');
|
|
81
|
+
execSync('npx prisma db execute --stdin --schema ' + JSON.stringify(schemaPath), {
|
|
82
|
+
input: 'SELECT 1;',
|
|
83
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
84
84
|
cwd: process.cwd(),
|
|
85
85
|
});
|
|
86
|
-
spinner.succeed(
|
|
86
|
+
spinner.succeed('Database connection OK.');
|
|
87
87
|
dbConnected = true;
|
|
88
88
|
}
|
|
89
89
|
catch {
|
|
90
|
-
spinner.warn(
|
|
90
|
+
spinner.warn('Could not connect to database. Check DATABASE_URL.');
|
|
91
91
|
}
|
|
92
92
|
if (dbConnected && missing === 0) {
|
|
93
93
|
try {
|
|
94
|
-
spinner.start(
|
|
94
|
+
spinner.start('Checking migration status...');
|
|
95
95
|
spinner.stop();
|
|
96
|
-
execSync(
|
|
97
|
-
stdio:
|
|
96
|
+
execSync('npx prisma migrate status', {
|
|
97
|
+
stdio: 'inherit',
|
|
98
98
|
cwd: process.cwd(),
|
|
99
99
|
});
|
|
100
100
|
}
|
|
101
101
|
catch {
|
|
102
|
-
logger.warn(
|
|
102
|
+
logger.warn('Could not check migration status.');
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
console.log();
|