@actuate-media/cli 0.11.1 → 0.11.3
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 +28 -28
- package/CHANGELOG.md +16 -0
- package/dist/__tests__/deployment-diagnostics.test.js +26 -3
- package/dist/__tests__/deployment-diagnostics.test.js.map +1 -1
- package/dist/__tests__/vercel-env-matrix.test.js +9 -1
- package/dist/__tests__/vercel-env-matrix.test.js.map +1 -1
- package/dist/commands/migrate-schema.d.ts +3 -0
- package/dist/commands/migrate-schema.d.ts.map +1 -0
- package/dist/commands/migrate-schema.js +84 -0
- package/dist/commands/migrate-schema.js.map +1 -0
- package/dist/commands/vercel-blob-link.d.ts.map +1 -1
- package/dist/commands/vercel-blob-link.js +7 -6
- package/dist/commands/vercel-blob-link.js.map +1 -1
- package/dist/deployment/diagnostics.d.ts +5 -5
- package/dist/deployment/diagnostics.d.ts.map +1 -1
- package/dist/deployment/diagnostics.js +14 -10
- package/dist/deployment/diagnostics.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/vercel/env-matrix.d.ts +3 -2
- package/dist/vercel/env-matrix.d.ts.map +1 -1
- package/dist/vercel/env-matrix.js +12 -3
- package/dist/vercel/env-matrix.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/deployment-diagnostics.test.ts +30 -3
- package/src/__tests__/vercel-env-matrix.test.ts +10 -1
- package/src/commands/migrate-schema.ts +110 -0
- package/src/commands/vercel-blob-link.ts +7 -6
- package/src/deployment/diagnostics.ts +14 -9
- package/src/index.ts +2 -0
- package/src/vercel/env-matrix.ts +16 -5
package/.turbo/turbo-build.log
CHANGED
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
|
|
2
|
-
> @actuate-media/cli@0.11.
|
|
2
|
+
> @actuate-media/cli@0.11.3 test /home/runner/work/actuatecms/actuatecms/packages/cli
|
|
3
3
|
> vitest run
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
[1m[30m[46m RUN [49m[39m[22m [36mv4.1.8 [39m[90m/home/runner/work/actuatecms/actuatecms/packages/cli[39m
|
|
7
7
|
|
|
8
|
-
[32m✓[39m dist/__tests__/db-sync.test.js [2m([22m[2m10 tests[22m[2m)[22m[33m
|
|
9
|
-
[32m✓[39m dist/__tests__/seed.test.js [2m([22m[2m10 tests[22m[2m)[22m[32m
|
|
10
|
-
[32m✓[39m src/__tests__/db-sync.test.ts [2m([22m[2m10 tests[22m[2m)[22m[33m
|
|
11
|
-
[32m✓[39m
|
|
12
|
-
[32m✓[39m
|
|
13
|
-
[32m✓[39m src/__tests__/deployment-diagnostics.test.ts [2m([22m[
|
|
8
|
+
[32m✓[39m dist/__tests__/db-sync.test.js [2m([22m[2m10 tests[22m[2m)[22m[33m 442[2mms[22m[39m
|
|
9
|
+
[32m✓[39m dist/__tests__/seed.test.js [2m([22m[2m10 tests[22m[2m)[22m[32m 78[2mms[22m[39m
|
|
10
|
+
[32m✓[39m src/__tests__/db-sync.test.ts [2m([22m[2m10 tests[22m[2m)[22m[33m 381[2mms[22m[39m
|
|
11
|
+
[32m✓[39m dist/__tests__/deployment-diagnostics.test.js [2m([22m[2m9 tests[22m[2m)[22m[32m 75[2mms[22m[39m
|
|
12
|
+
[32m✓[39m src/__tests__/seed.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 144[2mms[22m[39m
|
|
13
|
+
[32m✓[39m src/__tests__/deployment-diagnostics.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 61[2mms[22m[39m
|
|
14
14
|
- Reading canonical Actuate schema...
|
|
15
15
|
✔ Actuate CMS models added to schema.
|
|
16
16
|
- Running prisma generate...
|
|
@@ -32,29 +32,29 @@
|
|
|
32
32
|
|
|
33
33
|
- Reading canonical Actuate schema...
|
|
34
34
|
ℹ Actuate CMS models already present in schema. Use --force to overwrite.
|
|
35
|
-
[32m✓[39m dist/__tests__/db-init.test.js [2m([22m[2m4 tests[22m[2m)[22m[32m
|
|
35
|
+
[32m✓[39m dist/__tests__/db-init.test.js [2m([22m[2m4 tests[22m[2m)[22m[32m 170[2mms[22m[39m
|
|
36
36
|
- Reading canonical Actuate schema...
|
|
37
|
+
✔ Actuate CMS models added to schema.
|
|
38
|
+
- Running prisma generate...
|
|
37
39
|
[90mstdout[2m | src/__tests__/db-init.test.ts[2m > [22m[2mdb:init (WS-D D5 — canonical schema, no stale fragment)[2m > [22m[2mcommand[2m > [22m[2minjects canonical models with @@map and no duplicate datasource/generator
|
|
38
40
|
[22m[39m✔ Prisma client generated.
|
|
39
41
|
ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
|
|
40
42
|
|
|
41
|
-
✔ Actuate CMS models added to schema.
|
|
42
|
-
- Running prisma generate...
|
|
43
43
|
- Reading canonical Actuate schema...
|
|
44
44
|
✖ Could not locate @actuate-media/cms-core.
|
|
45
45
|
[90mstdout[2m | src/__tests__/db-init.test.ts[2m > [22m[2mdb:init (WS-D D5 — canonical schema, no stale fragment)[2m > [22m[2mcommand[2m > [22m[2mfails clearly when cms-core cannot be located
|
|
46
46
|
[22m[39mℹ Install it first: `npm install @actuate-media/cms-core`.
|
|
47
47
|
|
|
48
48
|
- Reading canonical Actuate schema...
|
|
49
|
+
✔ Actuate CMS models added to schema.
|
|
50
|
+
- Running prisma generate...
|
|
49
51
|
[90mstdout[2m | src/__tests__/db-init.test.ts[2m > [22m[2mdb:init (WS-D D5 — canonical schema, no stale fragment)[2m > [22m[2mcommand[2m > [22m[2mis idempotent without --force
|
|
50
52
|
[22m[39m✔ Prisma client generated.
|
|
51
53
|
ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
|
|
52
54
|
|
|
53
|
-
✔ Actuate CMS models added to schema.
|
|
54
|
-
- Running prisma generate...
|
|
55
55
|
- Reading canonical Actuate schema...
|
|
56
56
|
ℹ Actuate CMS models already present in schema. Use --force to overwrite.
|
|
57
|
-
[32m✓[39m src/__tests__/db-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m
|
|
57
|
+
[32m✓[39m src/__tests__/db-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 194[2mms[22m[39m
|
|
58
58
|
[90mstdout[2m | dist/__tests__/mcp-init.test.js[2m > [22m[2mmcp:init[2m > [22m[2mcreates both editor configs with placeholder key and git-ignores them
|
|
59
59
|
[22m[39m✔ Created .cursor/mcp.json
|
|
60
60
|
|
|
@@ -183,7 +183,7 @@ Next steps
|
|
|
183
183
|
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
184
184
|
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
185
185
|
|
|
186
|
-
[32m✓[39m dist/__tests__/mcp-init.test.js [2m([22m[2m6 tests[22m[2m)[22m[
|
|
186
|
+
[32m✓[39m dist/__tests__/mcp-init.test.js [2m([22m[2m6 tests[22m[2m)[22m[32m 255[2mms[22m[39m
|
|
187
187
|
[90mstdout[2m | src/__tests__/mcp-init.test.ts[2m > [22m[2mmcp:init[2m > [22m[2mcreates both editor configs with placeholder key and git-ignores them
|
|
188
188
|
[22m[39m✔ Created .cursor/mcp.json
|
|
189
189
|
|
|
@@ -312,13 +312,13 @@ Next steps
|
|
|
312
312
|
3. Restart Cursor / VS Code so the MCP server is picked up
|
|
313
313
|
Tip: pass --url https://your-site.com to target a deployed CMS instead.
|
|
314
314
|
|
|
315
|
-
[32m✓[39m src/__tests__/mcp-init.test.ts [2m([22m[2m6 tests[22m[2m)[22m[
|
|
316
|
-
[32m✓[39m dist/__tests__/form-seed.test.js [2m([22m[2m10 tests[22m[2m)[22m[32m
|
|
317
|
-
[32m✓[39m src/__tests__/form-seed.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m
|
|
318
|
-
[32m✓[39m dist/__tests__/vercel-env-matrix.test.js [2m([22m[
|
|
319
|
-
[32m✓[39m src/__tests__/vercel-env-matrix.test.ts [2m([22m[
|
|
320
|
-
[32m✓[39m dist/__tests__/load-dotenv.test.js [2m([22m[2m3 tests[22m[2m)[22m[32m
|
|
321
|
-
[32m✓[39m src/__tests__/load-dotenv.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m
|
|
315
|
+
[32m✓[39m src/__tests__/mcp-init.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 279[2mms[22m[39m
|
|
316
|
+
[32m✓[39m dist/__tests__/form-seed.test.js [2m([22m[2m10 tests[22m[2m)[22m[32m 47[2mms[22m[39m
|
|
317
|
+
[32m✓[39m src/__tests__/form-seed.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 77[2mms[22m[39m
|
|
318
|
+
[32m✓[39m dist/__tests__/vercel-env-matrix.test.js [2m([22m[2m6 tests[22m[2m)[22m[32m 43[2mms[22m[39m
|
|
319
|
+
[32m✓[39m src/__tests__/vercel-env-matrix.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 51[2mms[22m[39m
|
|
320
|
+
[32m✓[39m dist/__tests__/load-dotenv.test.js [2m([22m[2m3 tests[22m[2m)[22m[32m 54[2mms[22m[39m
|
|
321
|
+
[32m✓[39m src/__tests__/load-dotenv.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 69[2mms[22m[39m
|
|
322
322
|
- Reading canonical Actuate schema...
|
|
323
323
|
✔ Actuate CMS models added to schema.
|
|
324
324
|
- Running prisma generate...
|
|
@@ -326,7 +326,7 @@ Next steps
|
|
|
326
326
|
[22m[39m✔ Prisma client generated.
|
|
327
327
|
ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
|
|
328
328
|
|
|
329
|
-
[32m✓[39m dist/__tests__/schema-fragment.test.js [2m([22m[2m1 test[22m[2m)[22m[32m
|
|
329
|
+
[32m✓[39m dist/__tests__/schema-fragment.test.js [2m([22m[2m1 test[22m[2m)[22m[32m 120[2mms[22m[39m
|
|
330
330
|
- Reading canonical Actuate schema...
|
|
331
331
|
✔ Actuate CMS models added to schema.
|
|
332
332
|
- Running prisma generate...
|
|
@@ -334,12 +334,12 @@ Next steps
|
|
|
334
334
|
[22m[39m✔ Prisma client generated.
|
|
335
335
|
ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
|
|
336
336
|
|
|
337
|
-
[32m✓[39m src/__tests__/schema-fragment.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m
|
|
338
|
-
[32m✓[39m dist/__tests__/init.test.js [2m([22m[2m2 tests[22m[2m)[22m[32m
|
|
339
|
-
[32m✓[39m src/__tests__/init.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m
|
|
337
|
+
[32m✓[39m src/__tests__/schema-fragment.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 80[2mms[22m[39m
|
|
338
|
+
[32m✓[39m dist/__tests__/init.test.js [2m([22m[2m2 tests[22m[2m)[22m[32m 41[2mms[22m[39m
|
|
339
|
+
[32m✓[39m src/__tests__/init.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 38[2mms[22m[39m
|
|
340
340
|
|
|
341
341
|
[2m Test Files [22m [1m[32m20 passed[39m[22m[90m (20)[39m
|
|
342
|
-
[2m Tests [22m [1m[
|
|
343
|
-
[2m Start at [22m
|
|
344
|
-
[2m Duration [22m
|
|
342
|
+
[2m Tests [22m [1m[32m122 passed[39m[22m[90m (122)[39m
|
|
343
|
+
[2m Start at [22m 16:26:19
|
|
344
|
+
[2m Duration [22m 29.01s[2m (transform 2.47s, setup 0ms, import 7.01s, tests 2.70s, environment 21ms)[22m
|
|
345
345
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @actuate-media/cli
|
|
2
2
|
|
|
3
|
+
## 0.11.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 9d4e24c: Hide the redundant site name headline on the login screen and in the admin sidebar when a logo image is displayed.
|
|
8
|
+
|
|
9
|
+
Serve favicons as properly sized 32×32 PNGs (and 180×180 apple-touch icons) from dedicated public routes so SVG and oversized sources render correctly in browser tabs.
|
|
10
|
+
|
|
11
|
+
Align SEO audit schema/canonical detection with public page rendering, add `actuate migrate:schema` to backfill structuredDataType on existing content, and fix route-contract tests for new favicon endpoints.
|
|
12
|
+
|
|
13
|
+
## 0.11.2
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- 7a6a140: Support Vercel Marketplace Blob auth via OIDC (`BLOB_STORE_ID` + `VERCEL_OIDC_TOKEN`) instead of requiring `BLOB_READ_WRITE_TOKEN`. Fix `@vercel/blob` client options to use `oidcToken` + `storeId` (never pass OIDC as `token`). Update env diagnostics, upload errors, and `actuate vercel:blob-link` accordingly.
|
|
18
|
+
|
|
3
19
|
## 0.11.1
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -105,7 +105,7 @@ describe('deployment diagnostics', () => {
|
|
|
105
105
|
}),
|
|
106
106
|
]));
|
|
107
107
|
});
|
|
108
|
-
it('
|
|
108
|
+
it('passes when Marketplace Blob is linked via BLOB_STORE_ID without read-write token', () => {
|
|
109
109
|
const report = createDiagnosticReport({
|
|
110
110
|
schemaModels: new Set(REQUIRED_CMS_MODELS),
|
|
111
111
|
schemaContent: '',
|
|
@@ -116,11 +116,33 @@ describe('deployment diagnostics', () => {
|
|
|
116
116
|
NEXT_PUBLIC_SITE_URL: 'https://example.com',
|
|
117
117
|
BLOB_STORE_ID: 'store_abc123',
|
|
118
118
|
BLOB_WEBHOOK_PUBLIC_KEY: 'pk_abc',
|
|
119
|
-
// BLOB_READ_WRITE_TOKEN deliberately absent — the partial-link failure.
|
|
120
119
|
},
|
|
121
120
|
packageManager: 'pnpm',
|
|
122
121
|
schemaPath: 'prisma/schema.prisma',
|
|
123
122
|
});
|
|
123
|
+
expect(report.checks).toEqual(expect.arrayContaining([
|
|
124
|
+
expect.objectContaining({
|
|
125
|
+
id: 'blob-storage',
|
|
126
|
+
status: 'pass',
|
|
127
|
+
message: expect.stringMatching(/Marketplace|OIDC|BLOB_STORE_ID/i),
|
|
128
|
+
}),
|
|
129
|
+
]));
|
|
130
|
+
});
|
|
131
|
+
it('fails when blob is referenced but BLOB_STORE_ID is missing', () => {
|
|
132
|
+
const report = createDiagnosticReport({
|
|
133
|
+
schemaModels: new Set(REQUIRED_CMS_MODELS),
|
|
134
|
+
schemaContent: '',
|
|
135
|
+
env: {
|
|
136
|
+
DATABASE_URL: 'postgresql://example',
|
|
137
|
+
CMS_SECRET: 'secret',
|
|
138
|
+
CMS_ENCRYPTION_KEY: 'a'.repeat(64),
|
|
139
|
+
NEXT_PUBLIC_SITE_URL: 'https://example.com',
|
|
140
|
+
BLOB_WEBHOOK_PUBLIC_KEY: 'pk_abc',
|
|
141
|
+
},
|
|
142
|
+
configContent: "provider: 'vercel-blob'",
|
|
143
|
+
packageManager: 'pnpm',
|
|
144
|
+
schemaPath: 'prisma/schema.prisma',
|
|
145
|
+
});
|
|
124
146
|
expect(report.status).toBe('fail');
|
|
125
147
|
expect(report.checks).toEqual(expect.arrayContaining([expect.objectContaining({ id: 'blob-storage', status: 'fail' })]));
|
|
126
148
|
});
|
|
@@ -142,7 +164,8 @@ describe('deployment diagnostics', () => {
|
|
|
142
164
|
it('classifies blob link state from env and config signals', () => {
|
|
143
165
|
expect(detectBlobLinkState({ BLOB_READ_WRITE_TOKEN: 'vercel_blob_rw_x' })).toBe('ok');
|
|
144
166
|
expect(detectBlobLinkState({ BLOB_READ_WRITE_TOKEN: 'not-a-real-token' })).toBe('token-format');
|
|
145
|
-
expect(detectBlobLinkState({ BLOB_STORE_ID: 'store_x' })).toBe('
|
|
167
|
+
expect(detectBlobLinkState({ BLOB_STORE_ID: 'store_x' })).toBe('ok');
|
|
168
|
+
expect(detectBlobLinkState({ BLOB_WEBHOOK_PUBLIC_KEY: 'pk_x' })).toBe('partial');
|
|
146
169
|
expect(detectBlobLinkState({}, "storage: { provider: 'vercel-blob' }")).toBe('partial');
|
|
147
170
|
expect(detectBlobLinkState({})).toBe('none');
|
|
148
171
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployment-diagnostics.test.js","sourceRoot":"","sources":["../../src/__tests__/deployment-diagnostics.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"deployment-diagnostics.test.js","sourceRoot":"","sources":["../../src/__tests__/deployment-diagnostics.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,11 +28,19 @@ describe('evaluateBlobLink', () => {
|
|
|
28
28
|
it('reports none when no blob vars exist', () => {
|
|
29
29
|
expect(evaluateBlobLink([env('DATABASE_URL', ['production'])]).status).toBe('none');
|
|
30
30
|
});
|
|
31
|
-
it('reports
|
|
31
|
+
it('reports ok when Marketplace store id is on production/preview (OIDC at runtime)', () => {
|
|
32
32
|
const report = evaluateBlobLink([
|
|
33
33
|
env('BLOB_STORE_ID', ['production', 'preview', 'development']),
|
|
34
34
|
]);
|
|
35
35
|
expect(report.linked).toBe(true);
|
|
36
|
+
expect(report.status).toBe('ok');
|
|
37
|
+
expect(report.missingTargets).toEqual([]);
|
|
38
|
+
});
|
|
39
|
+
it('reports partial when linked but store id missing on production/preview', () => {
|
|
40
|
+
const report = evaluateBlobLink([
|
|
41
|
+
env('BLOB_WEBHOOK_PUBLIC_KEY', ['production', 'preview', 'development']),
|
|
42
|
+
]);
|
|
43
|
+
expect(report.linked).toBe(true);
|
|
36
44
|
expect(report.status).toBe('partial');
|
|
37
45
|
expect(report.missingTargets).toContain('production');
|
|
38
46
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vercel-env-matrix.test.js","sourceRoot":"","sources":["../../src/__tests__/vercel-env-matrix.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAG7C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAE1F,SAAS,GAAG,CAAC,GAAW,EAAE,MAA8B;IACtD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAA;AACxB,CAAC;AAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACpF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC;YACnD,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,KAAK;SACnB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,IAAI,GAAG;YACX,GAAG,CAAC,cAAc,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;YAC7D,GAAG,CAAC,YAAY,EAAE,CAAC,YAAY,CAAC,CAAC;SAClC,CAAA;QACD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;QAEpF,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;QACrF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;IAC7F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACrF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"vercel-env-matrix.test.js","sourceRoot":"","sources":["../../src/__tests__/vercel-env-matrix.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-schema.d.ts","sourceRoot":"","sources":["../../src/commands/migrate-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmGnC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUnE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { connectProjectDatabase } from '../utils/database.js';
|
|
5
|
+
import { loadProjectEnv } from '../utils/load-dotenv.js';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
async function loadProjectConfig(configPath) {
|
|
8
|
+
try {
|
|
9
|
+
const { setActuateConfig } = await import('@actuate-media/cms-core');
|
|
10
|
+
const { tsImport } = await import('tsx/esm/api');
|
|
11
|
+
const abs = pathToFileURL(resolve(configPath)).href;
|
|
12
|
+
const mod = (await tsImport(abs, import.meta.url));
|
|
13
|
+
const config = mod.default ?? mod.config;
|
|
14
|
+
if (config && typeof config === 'object') {
|
|
15
|
+
setActuateConfig(config);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
logger.warn(`Could not load ${configPath} — schema defaults will use collection slug heuristics only.`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* `actuate migrate:schema` — backfill structuredDataType/schemaType and JSON-LD
|
|
24
|
+
* on published content documents. Idempotent.
|
|
25
|
+
*/
|
|
26
|
+
async function runMigrateSchema(options) {
|
|
27
|
+
const dryRun = options.dryRun ?? false;
|
|
28
|
+
const batchSize = options.batchSize ? Number.parseInt(options.batchSize, 10) : undefined;
|
|
29
|
+
if (batchSize !== undefined && (!Number.isFinite(batchSize) || batchSize <= 0)) {
|
|
30
|
+
logger.error('--batch-size must be a positive integer.');
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
await loadProjectEnv(process.cwd()).then((env) => {
|
|
34
|
+
for (const [key, value] of Object.entries(env)) {
|
|
35
|
+
if (value !== undefined && process.env[key] === undefined) {
|
|
36
|
+
process.env[key] = value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
await loadProjectConfig(options.config ?? 'actuate.config.ts');
|
|
41
|
+
let connection = null;
|
|
42
|
+
const spinner = ora(dryRun ? 'Scanning content documents (dry run)…' : 'Backfilling structured data fields…').start();
|
|
43
|
+
try {
|
|
44
|
+
connection = await connectProjectDatabase();
|
|
45
|
+
const db = connection.db;
|
|
46
|
+
const { migrateStructuredDataFields } = await import('@actuate-media/cms-core');
|
|
47
|
+
const admin = await db.user.findFirst({ where: { role: 'ADMIN' } });
|
|
48
|
+
if (!admin) {
|
|
49
|
+
spinner.fail('No ADMIN user found. Create an admin (setup wizard or seed) first.');
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
const ctx = { userId: admin.id, role: 'ADMIN', db: connection.db, locale: 'en' };
|
|
53
|
+
const result = await migrateStructuredDataFields(ctx, { dryRun, batchSize });
|
|
54
|
+
spinner.succeed(dryRun
|
|
55
|
+
? `Dry run complete — ${result.migrated} document(s) would be updated.`
|
|
56
|
+
: `Updated ${result.migrated} document(s).`);
|
|
57
|
+
logger.info(` Scanned: ${result.scanned}`);
|
|
58
|
+
logger.info(` Migrated: ${result.migrated}`);
|
|
59
|
+
logger.info(` Skipped: ${result.skipped}`);
|
|
60
|
+
if (result.migratedIds.length > 0) {
|
|
61
|
+
logger.info(` IDs: ${result.migratedIds.join(', ')}`);
|
|
62
|
+
}
|
|
63
|
+
logger.info('');
|
|
64
|
+
logger.info('Next: re-run the SEO audit in Settings → SEO → Audit.');
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
68
|
+
spinner.fail(`Schema migration failed: ${message}`);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
await connection?.disconnect();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export function registerMigrateSchemaCommand(program) {
|
|
76
|
+
program
|
|
77
|
+
.command('migrate:schema')
|
|
78
|
+
.description('Backfill structuredDataType/schemaType (and published JSON-LD) on content documents. Idempotent.')
|
|
79
|
+
.option('--dry-run', 'Report what would change without writing')
|
|
80
|
+
.option('--batch-size <n>', 'Documents to scan per DB page (default 100)')
|
|
81
|
+
.option('--config <path>', 'Path to actuate.config.ts', 'actuate.config.ts')
|
|
82
|
+
.action(runMigrateSchema);
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=migrate-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-schema.js","sourceRoot":"","sources":["../../src/commands/migrate-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vercel-blob-link.d.ts","sourceRoot":"","sources":["../../src/commands/vercel-blob-link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAwBnC,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"vercel-blob-link.d.ts","sourceRoot":"","sources":["../../src/commands/vercel-blob-link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAwBnC,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2FpE"}
|
|
@@ -55,27 +55,28 @@ export function registerVercelBlobLinkCommand(program) {
|
|
|
55
55
|
console.log('No Vercel Blob store is connected to this project.');
|
|
56
56
|
}
|
|
57
57
|
else {
|
|
58
|
-
console.log('
|
|
58
|
+
console.log('Upload auth by environment (token or BLOB_STORE_ID for OIDC):');
|
|
59
59
|
for (const target of VERCEL_TARGETS) {
|
|
60
|
-
|
|
60
|
+
const ok = report.tokenByTarget[target] || report.storeByTarget[target];
|
|
61
|
+
console.log(` ${mark(ok)} ${target}`);
|
|
61
62
|
}
|
|
62
63
|
}
|
|
63
64
|
console.log(chalk.dim('─────────────────────────────────'));
|
|
64
65
|
}
|
|
65
66
|
if (report.status === 'partial') {
|
|
66
67
|
if (!opts.json) {
|
|
67
|
-
logger.error('A Blob store is connected but
|
|
68
|
-
logger.info('
|
|
68
|
+
logger.error('A Blob store is connected but Production/Preview lack BLOB_STORE_ID and BLOB_READ_WRITE_TOKEN. Uploads will fail.');
|
|
69
|
+
logger.info('Connect the Blob store to all environments from the Vercel Storage tab, then `vercel env pull` and re-run this command.');
|
|
69
70
|
}
|
|
70
71
|
process.exitCode = 1;
|
|
71
72
|
return;
|
|
72
73
|
}
|
|
73
74
|
const devOnlyMissing = report.linked && report.missingTargets.includes('development');
|
|
74
75
|
if (devOnlyMissing && !opts.json) {
|
|
75
|
-
logger.warn('
|
|
76
|
+
logger.warn('Development lacks BLOB_STORE_ID / BLOB_READ_WRITE_TOKEN — local uploads need `vercel env pull` or `vercel dev` (OIDC).');
|
|
76
77
|
}
|
|
77
78
|
else if (report.status === 'ok' && !opts.json) {
|
|
78
|
-
logger.success('Blob store is connected
|
|
79
|
+
logger.success('Blob store is connected with upload auth on Production and Preview (legacy token or Marketplace OIDC via BLOB_STORE_ID).');
|
|
79
80
|
}
|
|
80
81
|
});
|
|
81
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vercel-blob-link.js","sourceRoot":"","sources":["../../src/commands/vercel-blob-link.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"vercel-blob-link.js","sourceRoot":"","sources":["../../src/commands/vercel-blob-link.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,11 +30,11 @@ export declare function missingModels(schemaModels: Set<string>): string[];
|
|
|
30
30
|
export declare function missingEnvVars(env: Record<string, string | undefined>): string[];
|
|
31
31
|
export type BlobLinkState = 'ok' | 'partial' | 'token-format' | 'none';
|
|
32
32
|
/**
|
|
33
|
-
* Classify the local Vercel Blob wiring.
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
33
|
+
* Classify the local Vercel Blob wiring.
|
|
34
|
+
*
|
|
35
|
+
* Marketplace Blob provisioning injects `BLOB_STORE_ID` (+ webhook key). On Vercel,
|
|
36
|
+
* `VERCEL_OIDC_TOKEN` is injected at runtime — no `BLOB_READ_WRITE_TOKEN` in project
|
|
37
|
+
* env. Legacy stores still use the read-write token.
|
|
38
38
|
*/
|
|
39
39
|
export declare function detectBlobLinkState(env: Record<string, string | undefined>, configContent?: string): BlobLinkState;
|
|
40
40
|
export declare function detectPackageManager(lockfiles: Set<string>): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/deployment/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAEvD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,gBAAgB,CAAA;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,CAAA;IACxB,MAAM,EAAE,eAAe,EAAE,CAAA;CAC1B;AAED,eAAO,MAAM,mBAAmB,mMAetB,CAAA;AAEV,eAAO,MAAM,iBAAiB,uFAKpB,CAAA;AAEV,wEAAwE;AACxE,eAAO,MAAM,sBAAsB,6HAOzB,CAAA;AAEV,iFAAiF;AACjF,eAAO,MAAM,sBAAsB,4GAKzB,CAAA;AAEV,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACzB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACvC,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAC3B;AAED,wBAAgB,aAAa,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAEjE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,EAAE,CAEhF;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc,GAAG,MAAM,CAAA;AAEtE;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,aAAa,CAAC,EAAE,MAAM,GACrB,aAAa,
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/deployment/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAEvD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,gBAAgB,CAAA;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,CAAA;IACxB,MAAM,EAAE,eAAe,EAAE,CAAA;CAC1B;AAED,eAAO,MAAM,mBAAmB,mMAetB,CAAA;AAEV,eAAO,MAAM,iBAAiB,uFAKpB,CAAA;AAEV,wEAAwE;AACxE,eAAO,MAAM,sBAAsB,6HAOzB,CAAA;AAEV,iFAAiF;AACjF,eAAO,MAAM,sBAAsB,4GAKzB,CAAA;AAEV,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACzB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACvC,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAA;CAC3B;AAED,wBAAgB,aAAa,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAEjE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,EAAE,CAEhF;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,SAAS,GAAG,cAAc,GAAG,MAAM,CAAA;AAEtE;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,aAAa,CAAC,EAAE,MAAM,GACrB,aAAa,CAef;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAKnE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAkH/E;AAED,wBAAgB,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCtC;AAED,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAsBrE;AAED,wBAAgB,6BAA6B,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAiC5E"}
|
|
@@ -43,19 +43,21 @@ export function missingEnvVars(env) {
|
|
|
43
43
|
return REQUIRED_ENV_VARS.filter((name) => !env[name]);
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
|
-
* Classify the local Vercel Blob wiring.
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
46
|
+
* Classify the local Vercel Blob wiring.
|
|
47
|
+
*
|
|
48
|
+
* Marketplace Blob provisioning injects `BLOB_STORE_ID` (+ webhook key). On Vercel,
|
|
49
|
+
* `VERCEL_OIDC_TOKEN` is injected at runtime — no `BLOB_READ_WRITE_TOKEN` in project
|
|
50
|
+
* env. Legacy stores still use the read-write token.
|
|
51
51
|
*/
|
|
52
52
|
export function detectBlobLinkState(env, configContent) {
|
|
53
53
|
const token = env.BLOB_READ_WRITE_TOKEN;
|
|
54
54
|
if (token) {
|
|
55
55
|
return token.startsWith('vercel_blob_') ? 'ok' : 'token-format';
|
|
56
56
|
}
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
if (env.BLOB_STORE_ID?.trim()) {
|
|
58
|
+
return 'ok';
|
|
59
|
+
}
|
|
60
|
+
const hasPartialSignals = Boolean(env.BLOB_WEBHOOK_PUBLIC_KEY) ||
|
|
59
61
|
(configContent ? /vercel-blob|platform-vercel|vercelBlob/i.test(configContent) : false);
|
|
60
62
|
return hasPartialSignals ? 'partial' : 'none';
|
|
61
63
|
}
|
|
@@ -123,14 +125,16 @@ export function createDiagnosticReport(input) {
|
|
|
123
125
|
label: 'Vercel Blob storage',
|
|
124
126
|
status: blobState === 'partial' ? 'fail' : blobState === 'token-format' ? 'warn' : 'pass',
|
|
125
127
|
message: blobState === 'partial'
|
|
126
|
-
? '
|
|
128
|
+
? 'Vercel Blob appears configured (vercel-blob / webhook key) but BLOB_STORE_ID is missing. Media uploads will fail until the store is connected to this project.'
|
|
127
129
|
: blobState === 'token-format'
|
|
128
130
|
? 'BLOB_READ_WRITE_TOKEN does not start with `vercel_blob_` — verify it is a real Vercel Blob read-write token.'
|
|
129
131
|
: blobState === 'ok'
|
|
130
|
-
?
|
|
132
|
+
? input.env.BLOB_READ_WRITE_TOKEN
|
|
133
|
+
? 'BLOB_READ_WRITE_TOKEN is configured.'
|
|
134
|
+
: 'Vercel Marketplace Blob is linked (BLOB_STORE_ID). Uploads use OIDC on Vercel; no read-write token required.'
|
|
131
135
|
: 'No Vercel Blob storage configured (skipped).',
|
|
132
136
|
fix: blobState === 'partial'
|
|
133
|
-
? '
|
|
137
|
+
? 'Connect a Vercel Blob store to the project from the Storage tab, then `vercel env pull`. Validate with `actuate vercel:blob-link`.'
|
|
134
138
|
: blobState === 'token-format'
|
|
135
139
|
? 'Re-copy the read-write token from the Vercel Blob store (Storage tab) and re-pull your environment.'
|
|
136
140
|
: undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/deployment/diagnostics.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,MAAM;IACN,SAAS;IACT,UAAU;IACV,OAAO;IACP,SAAS;IACT,QAAQ;IACR,UAAU;IACV,gBAAgB;IAChB,UAAU;IACV,oBAAoB;IACpB,YAAY;IACZ,WAAW;IACX,cAAc;IACd,cAAc;CACN,CAAA;AAEV,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,cAAc;IACd,YAAY;IACZ,oBAAoB;IACpB,sBAAsB;CACd,CAAA;AAEV,wEAAwE;AACxE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,cAAc;IACd,qBAAqB;IACrB,YAAY;IACZ,oBAAoB;IACpB,sBAAsB;IACtB,aAAa;CACL,CAAA;AAEV,iFAAiF;AACjF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,uBAAuB;IACvB,wBAAwB;IACxB,0BAA0B;IAC1B,gBAAgB;CACR,CAAA;AAYV,MAAM,UAAU,aAAa,CAAC,YAAyB;IACrD,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAuC;IACpE,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;AACvD,CAAC;AAID;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAuC,EACvC,aAAsB;IAEtB,MAAM,KAAK,GAAG,GAAG,CAAC,qBAAqB,CAAA;IACvC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAA;IACjE,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/deployment/diagnostics.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { registerMigrateCommand } from './commands/migrate.js';
|
|
4
4
|
import { registerMigrateSectionsCommand } from './commands/migrate-sections.js';
|
|
5
|
+
import { registerMigrateSchemaCommand } from './commands/migrate-schema.js';
|
|
5
6
|
import { registerGenerateCommand } from './commands/generate.js';
|
|
6
7
|
import { registerSeedCommand } from './commands/seed.js';
|
|
7
8
|
import { registerImportCommand } from './commands/import.js';
|
|
@@ -22,6 +23,7 @@ program
|
|
|
22
23
|
.version('0.1.0');
|
|
23
24
|
registerMigrateCommand(program);
|
|
24
25
|
registerMigrateSectionsCommand(program);
|
|
26
|
+
registerMigrateSchemaCommand(program);
|
|
25
27
|
registerGenerateCommand(program);
|
|
26
28
|
registerSeedCommand(program);
|
|
27
29
|
registerImportCommand(program);
|
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,CAAA;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAA;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,6DAA6D,CAAC;KAC1E,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,8BAA8B,CAAC,OAAO,CAAC,CAAA;AACvC,uBAAuB,CAAC,OAAO,CAAC,CAAA;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,0BAA0B,CAAC,OAAO,CAAC,CAAA;AACnC,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,uBAAuB,CAAC,OAAO,CAAC,CAAA;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,0BAA0B,CAAC,OAAO,CAAC,CAAA;AACnC,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,6BAA6B,CAAC,OAAO,CAAC,CAAA;AACtC,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAE3B,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAA;AAC3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAA;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,6DAA6D,CAAC;KAC1E,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,8BAA8B,CAAC,OAAO,CAAC,CAAA;AACvC,4BAA4B,CAAC,OAAO,CAAC,CAAA;AACrC,uBAAuB,CAAC,OAAO,CAAC,CAAA;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,0BAA0B,CAAC,OAAO,CAAC,CAAA;AACnC,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,uBAAuB,CAAC,OAAO,CAAC,CAAA;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,0BAA0B,CAAC,OAAO,CAAC,CAAA;AACnC,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,6BAA6B,CAAC,OAAO,CAAC,CAAA;AACtC,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAE3B,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
@@ -25,9 +25,10 @@ export interface BlobLinkReport {
|
|
|
25
25
|
/** True when any BLOB_* var indicates a store is connected to the project. */
|
|
26
26
|
linked: boolean;
|
|
27
27
|
tokenByTarget: TargetPresence;
|
|
28
|
-
|
|
28
|
+
storeByTarget: TargetPresence;
|
|
29
|
+
/** Targets missing both legacy token and BLOB_STORE_ID while a blob store is linked. */
|
|
29
30
|
missingTargets: VercelTarget[];
|
|
30
|
-
/** 'partial' when production/preview lack
|
|
31
|
+
/** 'partial' when production/preview lack upload auth signals (deploy-blocking). */
|
|
31
32
|
status: BlobLinkStatus;
|
|
32
33
|
}
|
|
33
34
|
export declare function evaluateBlobLink(envVars: VercelEnvVar[]): BlobLinkReport;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-matrix.d.ts","sourceRoot":"","sources":["../../src/vercel/env-matrix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAElF;;;GAGG;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;AAM1D,wDAAwD;AACxD,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,CAWnF;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,cAAc,CAAA;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,YAAY,EAAE,CAAA;IACpB,wEAAwE;IACxE,eAAe,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,YAAY,EAAE,CAAA;KAAE,EAAE,CAAA;CAC5D;AAKD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,YAAY,EAAE,EACvB,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,YAAY,GAAE,SAAS,MAAM,EAAO,GACnC,SAAS,CAoBX;AAED,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAAA;AAEtD,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,MAAM,EAAE,OAAO,CAAA;IACf,aAAa,EAAE,cAAc,CAAA;IAC7B,
|
|
1
|
+
{"version":3,"file":"env-matrix.d.ts","sourceRoot":"","sources":["../../src/vercel/env-matrix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAElF;;;GAGG;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;AAM1D,wDAAwD;AACxD,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,CAWnF;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,cAAc,CAAA;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,YAAY,EAAE,CAAA;IACpB,wEAAwE;IACxE,eAAe,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,YAAY,EAAE,CAAA;KAAE,EAAE,CAAA;CAC5D;AAKD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,YAAY,EAAE,EACvB,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,YAAY,GAAE,SAAS,MAAM,EAAO,GACnC,SAAS,CAoBX;AAED,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAAA;AAEtD,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,MAAM,EAAE,OAAO,CAAA;IACf,aAAa,EAAE,cAAc,CAAA;IAC7B,aAAa,EAAE,cAAc,CAAA;IAC7B,wFAAwF;IACxF,cAAc,EAAE,YAAY,EAAE,CAAA;IAC9B,oFAAoF;IACpF,MAAM,EAAE,cAAc,CAAA;CACvB;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,cAAc,CA4BxE"}
|
|
@@ -42,14 +42,23 @@ const BLOB_LINK_SIGNALS = ['BLOB_STORE_ID', 'BLOB_WEBHOOK_PUBLIC_KEY', 'BLOB_REA
|
|
|
42
42
|
export function evaluateBlobLink(envVars) {
|
|
43
43
|
const linked = envVars.some((env) => BLOB_LINK_SIGNALS.includes(env.key) || env.key.startsWith('BLOB_'));
|
|
44
44
|
const tokenByTarget = presenceForKey(envVars, 'BLOB_READ_WRITE_TOKEN');
|
|
45
|
+
const storeByTarget = presenceForKey(envVars, 'BLOB_STORE_ID');
|
|
45
46
|
if (!linked) {
|
|
46
|
-
return {
|
|
47
|
+
return {
|
|
48
|
+
linked: false,
|
|
49
|
+
tokenByTarget,
|
|
50
|
+
storeByTarget,
|
|
51
|
+
missingTargets: [],
|
|
52
|
+
status: 'none',
|
|
53
|
+
};
|
|
47
54
|
}
|
|
48
|
-
const
|
|
49
|
-
const
|
|
55
|
+
const hasDeployAuth = (target) => tokenByTarget[target] || storeByTarget[target];
|
|
56
|
+
const missingTargets = VERCEL_TARGETS.filter((t) => !hasDeployAuth(t));
|
|
57
|
+
const criticalMissing = DEPLOY_TARGETS.some((t) => !hasDeployAuth(t));
|
|
50
58
|
return {
|
|
51
59
|
linked: true,
|
|
52
60
|
tokenByTarget,
|
|
61
|
+
storeByTarget,
|
|
53
62
|
missingTargets,
|
|
54
63
|
status: criticalMissing ? 'partial' : 'ok',
|
|
55
64
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-matrix.js","sourceRoot":"","sources":["../../src/vercel/env-matrix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAwC,MAAM,aAAa,CAAA;AASlF,SAAS,aAAa;IACpB,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;AAClE,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,cAAc,CAAC,OAAuB,EAAE,GAAW;IACjE,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAA;IAChC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG;YAAE,SAAQ;QAC7B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,IAAK,cAAoC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3D,QAAQ,CAAC,MAAsB,CAAC,GAAG,IAAI,CAAA;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAcD,yFAAyF;AACzF,MAAM,cAAc,GAAmB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;AAEhE,MAAM,UAAU,cAAc,CAC5B,OAAuB,EACvB,YAA+B,EAC/B,eAAkC,EAAE;IAEpC,MAAM,IAAI,GAAmB,EAAE,CAAA;IAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,eAAe,GAA+C,EAAE,CAAA;IAEtE,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC7C,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC5C,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,eAAe,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;IACzE,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAQ;QAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;IAC7E,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAA;AAClC,CAAC;
|
|
1
|
+
{"version":3,"file":"env-matrix.js","sourceRoot":"","sources":["../../src/vercel/env-matrix.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actuate-media/cli",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.3",
|
|
4
4
|
"description": "CLI for Actuate CMS — migrations, codegen, imports, exports, and upgrades",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"typescript": "^5.7.0",
|
|
30
30
|
"vitest": "^4.1.0",
|
|
31
|
-
"@actuate-media/cms-core": "0.
|
|
31
|
+
"@actuate-media/cms-core": "0.77.3"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "tsc",
|
|
@@ -128,7 +128,7 @@ describe('deployment diagnostics', () => {
|
|
|
128
128
|
)
|
|
129
129
|
})
|
|
130
130
|
|
|
131
|
-
it('
|
|
131
|
+
it('passes when Marketplace Blob is linked via BLOB_STORE_ID without read-write token', () => {
|
|
132
132
|
const report = createDiagnosticReport({
|
|
133
133
|
schemaModels: new Set(REQUIRED_CMS_MODELS),
|
|
134
134
|
schemaContent: '',
|
|
@@ -139,12 +139,38 @@ describe('deployment diagnostics', () => {
|
|
|
139
139
|
NEXT_PUBLIC_SITE_URL: 'https://example.com',
|
|
140
140
|
BLOB_STORE_ID: 'store_abc123',
|
|
141
141
|
BLOB_WEBHOOK_PUBLIC_KEY: 'pk_abc',
|
|
142
|
-
// BLOB_READ_WRITE_TOKEN deliberately absent — the partial-link failure.
|
|
143
142
|
},
|
|
144
143
|
packageManager: 'pnpm',
|
|
145
144
|
schemaPath: 'prisma/schema.prisma',
|
|
146
145
|
})
|
|
147
146
|
|
|
147
|
+
expect(report.checks).toEqual(
|
|
148
|
+
expect.arrayContaining([
|
|
149
|
+
expect.objectContaining({
|
|
150
|
+
id: 'blob-storage',
|
|
151
|
+
status: 'pass',
|
|
152
|
+
message: expect.stringMatching(/Marketplace|OIDC|BLOB_STORE_ID/i),
|
|
153
|
+
}),
|
|
154
|
+
]),
|
|
155
|
+
)
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
it('fails when blob is referenced but BLOB_STORE_ID is missing', () => {
|
|
159
|
+
const report = createDiagnosticReport({
|
|
160
|
+
schemaModels: new Set(REQUIRED_CMS_MODELS),
|
|
161
|
+
schemaContent: '',
|
|
162
|
+
env: {
|
|
163
|
+
DATABASE_URL: 'postgresql://example',
|
|
164
|
+
CMS_SECRET: 'secret',
|
|
165
|
+
CMS_ENCRYPTION_KEY: 'a'.repeat(64),
|
|
166
|
+
NEXT_PUBLIC_SITE_URL: 'https://example.com',
|
|
167
|
+
BLOB_WEBHOOK_PUBLIC_KEY: 'pk_abc',
|
|
168
|
+
},
|
|
169
|
+
configContent: "provider: 'vercel-blob'",
|
|
170
|
+
packageManager: 'pnpm',
|
|
171
|
+
schemaPath: 'prisma/schema.prisma',
|
|
172
|
+
})
|
|
173
|
+
|
|
148
174
|
expect(report.status).toBe('fail')
|
|
149
175
|
expect(report.checks).toEqual(
|
|
150
176
|
expect.arrayContaining([expect.objectContaining({ id: 'blob-storage', status: 'fail' })]),
|
|
@@ -173,7 +199,8 @@ describe('deployment diagnostics', () => {
|
|
|
173
199
|
it('classifies blob link state from env and config signals', () => {
|
|
174
200
|
expect(detectBlobLinkState({ BLOB_READ_WRITE_TOKEN: 'vercel_blob_rw_x' })).toBe('ok')
|
|
175
201
|
expect(detectBlobLinkState({ BLOB_READ_WRITE_TOKEN: 'not-a-real-token' })).toBe('token-format')
|
|
176
|
-
expect(detectBlobLinkState({ BLOB_STORE_ID: 'store_x' })).toBe('
|
|
202
|
+
expect(detectBlobLinkState({ BLOB_STORE_ID: 'store_x' })).toBe('ok')
|
|
203
|
+
expect(detectBlobLinkState({ BLOB_WEBHOOK_PUBLIC_KEY: 'pk_x' })).toBe('partial')
|
|
177
204
|
expect(detectBlobLinkState({}, "storage: { provider: 'vercel-blob' }")).toBe('partial')
|
|
178
205
|
expect(detectBlobLinkState({})).toBe('none')
|
|
179
206
|
})
|
|
@@ -36,11 +36,20 @@ describe('evaluateBlobLink', () => {
|
|
|
36
36
|
expect(evaluateBlobLink([env('DATABASE_URL', ['production'])]).status).toBe('none')
|
|
37
37
|
})
|
|
38
38
|
|
|
39
|
-
it('reports
|
|
39
|
+
it('reports ok when Marketplace store id is on production/preview (OIDC at runtime)', () => {
|
|
40
40
|
const report = evaluateBlobLink([
|
|
41
41
|
env('BLOB_STORE_ID', ['production', 'preview', 'development']),
|
|
42
42
|
])
|
|
43
43
|
expect(report.linked).toBe(true)
|
|
44
|
+
expect(report.status).toBe('ok')
|
|
45
|
+
expect(report.missingTargets).toEqual([])
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
it('reports partial when linked but store id missing on production/preview', () => {
|
|
49
|
+
const report = evaluateBlobLink([
|
|
50
|
+
env('BLOB_WEBHOOK_PUBLIC_KEY', ['production', 'preview', 'development']),
|
|
51
|
+
])
|
|
52
|
+
expect(report.linked).toBe(true)
|
|
44
53
|
expect(report.status).toBe('partial')
|
|
45
54
|
expect(report.missingTargets).toContain('production')
|
|
46
55
|
})
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Command } from 'commander'
|
|
2
|
+
import { resolve } from 'node:path'
|
|
3
|
+
import { pathToFileURL } from 'node:url'
|
|
4
|
+
import ora from 'ora'
|
|
5
|
+
import { connectProjectDatabase } from '../utils/database.js'
|
|
6
|
+
import { loadProjectEnv } from '../utils/load-dotenv.js'
|
|
7
|
+
import { logger } from '../utils/logger.js'
|
|
8
|
+
|
|
9
|
+
interface MigrateSchemaOptions {
|
|
10
|
+
dryRun?: boolean
|
|
11
|
+
batchSize?: string
|
|
12
|
+
config?: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async function loadProjectConfig(configPath: string): Promise<void> {
|
|
16
|
+
try {
|
|
17
|
+
const { setActuateConfig } = await import('@actuate-media/cms-core')
|
|
18
|
+
const { tsImport } = await import('tsx/esm/api')
|
|
19
|
+
const abs = pathToFileURL(resolve(configPath)).href
|
|
20
|
+
const mod = (await tsImport(abs, import.meta.url)) as {
|
|
21
|
+
default?: unknown
|
|
22
|
+
config?: unknown
|
|
23
|
+
}
|
|
24
|
+
const config = mod.default ?? mod.config
|
|
25
|
+
if (config && typeof config === 'object') {
|
|
26
|
+
setActuateConfig(config as never)
|
|
27
|
+
}
|
|
28
|
+
} catch {
|
|
29
|
+
logger.warn(
|
|
30
|
+
`Could not load ${configPath} — schema defaults will use collection slug heuristics only.`,
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* `actuate migrate:schema` — backfill structuredDataType/schemaType and JSON-LD
|
|
37
|
+
* on published content documents. Idempotent.
|
|
38
|
+
*/
|
|
39
|
+
async function runMigrateSchema(options: MigrateSchemaOptions): Promise<void> {
|
|
40
|
+
const dryRun = options.dryRun ?? false
|
|
41
|
+
const batchSize = options.batchSize ? Number.parseInt(options.batchSize, 10) : undefined
|
|
42
|
+
if (batchSize !== undefined && (!Number.isFinite(batchSize) || batchSize <= 0)) {
|
|
43
|
+
logger.error('--batch-size must be a positive integer.')
|
|
44
|
+
process.exit(1)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
await loadProjectEnv(process.cwd()).then((env) => {
|
|
48
|
+
for (const [key, value] of Object.entries(env)) {
|
|
49
|
+
if (value !== undefined && process.env[key] === undefined) {
|
|
50
|
+
process.env[key] = value
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
await loadProjectConfig(options.config ?? 'actuate.config.ts')
|
|
55
|
+
|
|
56
|
+
let connection: { db: unknown; disconnect: () => Promise<void> } | null = null
|
|
57
|
+
const spinner = ora(
|
|
58
|
+
dryRun ? 'Scanning content documents (dry run)…' : 'Backfilling structured data fields…',
|
|
59
|
+
).start()
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
connection = await connectProjectDatabase()
|
|
63
|
+
const db = connection.db as {
|
|
64
|
+
user: { findFirst: (args: unknown) => Promise<{ id: string } | null> }
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const { migrateStructuredDataFields } = await import('@actuate-media/cms-core')
|
|
68
|
+
|
|
69
|
+
const admin = await db.user.findFirst({ where: { role: 'ADMIN' } })
|
|
70
|
+
if (!admin) {
|
|
71
|
+
spinner.fail('No ADMIN user found. Create an admin (setup wizard or seed) first.')
|
|
72
|
+
process.exit(1)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const ctx = { userId: admin.id, role: 'ADMIN', db: connection.db, locale: 'en' }
|
|
76
|
+
const result = await migrateStructuredDataFields(ctx, { dryRun, batchSize })
|
|
77
|
+
|
|
78
|
+
spinner.succeed(
|
|
79
|
+
dryRun
|
|
80
|
+
? `Dry run complete — ${result.migrated} document(s) would be updated.`
|
|
81
|
+
: `Updated ${result.migrated} document(s).`,
|
|
82
|
+
)
|
|
83
|
+
logger.info(` Scanned: ${result.scanned}`)
|
|
84
|
+
logger.info(` Migrated: ${result.migrated}`)
|
|
85
|
+
logger.info(` Skipped: ${result.skipped}`)
|
|
86
|
+
if (result.migratedIds.length > 0) {
|
|
87
|
+
logger.info(` IDs: ${result.migratedIds.join(', ')}`)
|
|
88
|
+
}
|
|
89
|
+
logger.info('')
|
|
90
|
+
logger.info('Next: re-run the SEO audit in Settings → SEO → Audit.')
|
|
91
|
+
} catch (err) {
|
|
92
|
+
const message = err instanceof Error ? err.message : String(err)
|
|
93
|
+
spinner.fail(`Schema migration failed: ${message}`)
|
|
94
|
+
process.exit(1)
|
|
95
|
+
} finally {
|
|
96
|
+
await connection?.disconnect()
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export function registerMigrateSchemaCommand(program: Command): void {
|
|
101
|
+
program
|
|
102
|
+
.command('migrate:schema')
|
|
103
|
+
.description(
|
|
104
|
+
'Backfill structuredDataType/schemaType (and published JSON-LD) on content documents. Idempotent.',
|
|
105
|
+
)
|
|
106
|
+
.option('--dry-run', 'Report what would change without writing')
|
|
107
|
+
.option('--batch-size <n>', 'Documents to scan per DB page (default 100)')
|
|
108
|
+
.option('--config <path>', 'Path to actuate.config.ts', 'actuate.config.ts')
|
|
109
|
+
.action(runMigrateSchema)
|
|
110
|
+
}
|
|
@@ -79,9 +79,10 @@ export function registerVercelBlobLinkCommand(program: Command): void {
|
|
|
79
79
|
if (!report.linked) {
|
|
80
80
|
console.log('No Vercel Blob store is connected to this project.')
|
|
81
81
|
} else {
|
|
82
|
-
console.log('
|
|
82
|
+
console.log('Upload auth by environment (token or BLOB_STORE_ID for OIDC):')
|
|
83
83
|
for (const target of VERCEL_TARGETS) {
|
|
84
|
-
|
|
84
|
+
const ok = report.tokenByTarget[target] || report.storeByTarget[target]
|
|
85
|
+
console.log(` ${mark(ok)} ${target}`)
|
|
85
86
|
}
|
|
86
87
|
}
|
|
87
88
|
console.log(chalk.dim('─────────────────────────────────'))
|
|
@@ -90,10 +91,10 @@ export function registerVercelBlobLinkCommand(program: Command): void {
|
|
|
90
91
|
if (report.status === 'partial') {
|
|
91
92
|
if (!opts.json) {
|
|
92
93
|
logger.error(
|
|
93
|
-
'A Blob store is connected but
|
|
94
|
+
'A Blob store is connected but Production/Preview lack BLOB_STORE_ID and BLOB_READ_WRITE_TOKEN. Uploads will fail.',
|
|
94
95
|
)
|
|
95
96
|
logger.info(
|
|
96
|
-
'
|
|
97
|
+
'Connect the Blob store to all environments from the Vercel Storage tab, then `vercel env pull` and re-run this command.',
|
|
97
98
|
)
|
|
98
99
|
}
|
|
99
100
|
process.exitCode = 1
|
|
@@ -104,11 +105,11 @@ export function registerVercelBlobLinkCommand(program: Command): void {
|
|
|
104
105
|
report.linked && report.missingTargets.includes('development' as VercelTarget)
|
|
105
106
|
if (devOnlyMissing && !opts.json) {
|
|
106
107
|
logger.warn(
|
|
107
|
-
'
|
|
108
|
+
'Development lacks BLOB_STORE_ID / BLOB_READ_WRITE_TOKEN — local uploads need `vercel env pull` or `vercel dev` (OIDC).',
|
|
108
109
|
)
|
|
109
110
|
} else if (report.status === 'ok' && !opts.json) {
|
|
110
111
|
logger.success(
|
|
111
|
-
'Blob store is connected
|
|
112
|
+
'Blob store is connected with upload auth on Production and Preview (legacy token or Marketplace OIDC via BLOB_STORE_ID).',
|
|
112
113
|
)
|
|
113
114
|
}
|
|
114
115
|
})
|
|
@@ -77,11 +77,11 @@ export function missingEnvVars(env: Record<string, string | undefined>): string[
|
|
|
77
77
|
export type BlobLinkState = 'ok' | 'partial' | 'token-format' | 'none'
|
|
78
78
|
|
|
79
79
|
/**
|
|
80
|
-
* Classify the local Vercel Blob wiring.
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
80
|
+
* Classify the local Vercel Blob wiring.
|
|
81
|
+
*
|
|
82
|
+
* Marketplace Blob provisioning injects `BLOB_STORE_ID` (+ webhook key). On Vercel,
|
|
83
|
+
* `VERCEL_OIDC_TOKEN` is injected at runtime — no `BLOB_READ_WRITE_TOKEN` in project
|
|
84
|
+
* env. Legacy stores still use the read-write token.
|
|
85
85
|
*/
|
|
86
86
|
export function detectBlobLinkState(
|
|
87
87
|
env: Record<string, string | undefined>,
|
|
@@ -92,8 +92,11 @@ export function detectBlobLinkState(
|
|
|
92
92
|
return token.startsWith('vercel_blob_') ? 'ok' : 'token-format'
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
+
if (env.BLOB_STORE_ID?.trim()) {
|
|
96
|
+
return 'ok'
|
|
97
|
+
}
|
|
98
|
+
|
|
95
99
|
const hasPartialSignals =
|
|
96
|
-
Boolean(env.BLOB_STORE_ID) ||
|
|
97
100
|
Boolean(env.BLOB_WEBHOOK_PUBLIC_KEY) ||
|
|
98
101
|
(configContent ? /vercel-blob|platform-vercel|vercelBlob/i.test(configContent) : false)
|
|
99
102
|
|
|
@@ -174,15 +177,17 @@ export function createDiagnosticReport(input: DiagnosticInput): DiagnosticReport
|
|
|
174
177
|
status: blobState === 'partial' ? 'fail' : blobState === 'token-format' ? 'warn' : 'pass',
|
|
175
178
|
message:
|
|
176
179
|
blobState === 'partial'
|
|
177
|
-
? '
|
|
180
|
+
? 'Vercel Blob appears configured (vercel-blob / webhook key) but BLOB_STORE_ID is missing. Media uploads will fail until the store is connected to this project.'
|
|
178
181
|
: blobState === 'token-format'
|
|
179
182
|
? 'BLOB_READ_WRITE_TOKEN does not start with `vercel_blob_` — verify it is a real Vercel Blob read-write token.'
|
|
180
183
|
: blobState === 'ok'
|
|
181
|
-
?
|
|
184
|
+
? input.env.BLOB_READ_WRITE_TOKEN
|
|
185
|
+
? 'BLOB_READ_WRITE_TOKEN is configured.'
|
|
186
|
+
: 'Vercel Marketplace Blob is linked (BLOB_STORE_ID). Uploads use OIDC on Vercel; no read-write token required.'
|
|
182
187
|
: 'No Vercel Blob storage configured (skipped).',
|
|
183
188
|
fix:
|
|
184
189
|
blobState === 'partial'
|
|
185
|
-
? '
|
|
190
|
+
? 'Connect a Vercel Blob store to the project from the Storage tab, then `vercel env pull`. Validate with `actuate vercel:blob-link`.'
|
|
186
191
|
: blobState === 'token-format'
|
|
187
192
|
? 'Re-copy the read-write token from the Vercel Blob store (Storage tab) and re-pull your environment.'
|
|
188
193
|
: undefined,
|
package/src/index.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { Command } from 'commander'
|
|
3
3
|
import { registerMigrateCommand } from './commands/migrate.js'
|
|
4
4
|
import { registerMigrateSectionsCommand } from './commands/migrate-sections.js'
|
|
5
|
+
import { registerMigrateSchemaCommand } from './commands/migrate-schema.js'
|
|
5
6
|
import { registerGenerateCommand } from './commands/generate.js'
|
|
6
7
|
import { registerSeedCommand } from './commands/seed.js'
|
|
7
8
|
import { registerImportCommand } from './commands/import.js'
|
|
@@ -29,6 +30,7 @@ program
|
|
|
29
30
|
|
|
30
31
|
registerMigrateCommand(program)
|
|
31
32
|
registerMigrateSectionsCommand(program)
|
|
33
|
+
registerMigrateSchemaCommand(program)
|
|
32
34
|
registerGenerateCommand(program)
|
|
33
35
|
registerSeedCommand(program)
|
|
34
36
|
registerImportCommand(program)
|
package/src/vercel/env-matrix.ts
CHANGED
|
@@ -72,9 +72,10 @@ export interface BlobLinkReport {
|
|
|
72
72
|
/** True when any BLOB_* var indicates a store is connected to the project. */
|
|
73
73
|
linked: boolean
|
|
74
74
|
tokenByTarget: TargetPresence
|
|
75
|
-
|
|
75
|
+
storeByTarget: TargetPresence
|
|
76
|
+
/** Targets missing both legacy token and BLOB_STORE_ID while a blob store is linked. */
|
|
76
77
|
missingTargets: VercelTarget[]
|
|
77
|
-
/** 'partial' when production/preview lack
|
|
78
|
+
/** 'partial' when production/preview lack upload auth signals (deploy-blocking). */
|
|
78
79
|
status: BlobLinkStatus
|
|
79
80
|
}
|
|
80
81
|
|
|
@@ -85,16 +86,26 @@ export function evaluateBlobLink(envVars: VercelEnvVar[]): BlobLinkReport {
|
|
|
85
86
|
(env) => BLOB_LINK_SIGNALS.includes(env.key) || env.key.startsWith('BLOB_'),
|
|
86
87
|
)
|
|
87
88
|
const tokenByTarget = presenceForKey(envVars, 'BLOB_READ_WRITE_TOKEN')
|
|
89
|
+
const storeByTarget = presenceForKey(envVars, 'BLOB_STORE_ID')
|
|
88
90
|
|
|
89
91
|
if (!linked) {
|
|
90
|
-
return {
|
|
92
|
+
return {
|
|
93
|
+
linked: false,
|
|
94
|
+
tokenByTarget,
|
|
95
|
+
storeByTarget,
|
|
96
|
+
missingTargets: [],
|
|
97
|
+
status: 'none',
|
|
98
|
+
}
|
|
91
99
|
}
|
|
92
100
|
|
|
93
|
-
const
|
|
94
|
-
|
|
101
|
+
const hasDeployAuth = (target: VercelTarget) => tokenByTarget[target] || storeByTarget[target]
|
|
102
|
+
|
|
103
|
+
const missingTargets = VERCEL_TARGETS.filter((t) => !hasDeployAuth(t))
|
|
104
|
+
const criticalMissing = DEPLOY_TARGETS.some((t) => !hasDeployAuth(t))
|
|
95
105
|
return {
|
|
96
106
|
linked: true,
|
|
97
107
|
tokenByTarget,
|
|
108
|
+
storeByTarget,
|
|
98
109
|
missingTargets,
|
|
99
110
|
status: criticalMissing ? 'partial' : 'ok',
|
|
100
111
|
}
|