@actuate-media/cli 0.11.1 → 0.11.2
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 +31 -31
- package/CHANGELOG.md +6 -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/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/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/vercel-blob-link.ts +7 -6
- package/src/deployment/diagnostics.ts +14 -9
- package/src/vercel/env-matrix.ts +16 -5
package/.turbo/turbo-build.log
CHANGED
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
|
|
2
|
-
> @actuate-media/cli@0.11.
|
|
2
|
+
> @actuate-media/cli@0.11.2 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 353[2mms[22m[39m
|
|
9
|
+
[32m✓[39m dist/__tests__/seed.test.js [2m([22m[2m10 tests[22m[2m)[22m[32m 117[2mms[22m[39m
|
|
10
|
+
[32m✓[39m src/__tests__/db-sync.test.ts [2m([22m[2m10 tests[22m[2m)[22m[33m 495[2mms[22m[39m
|
|
11
|
+
[32m✓[39m dist/__tests__/deployment-diagnostics.test.js [2m([22m[2m9 tests[22m[2m)[22m[32m 99[2mms[22m[39m
|
|
12
|
+
[32m✓[39m src/__tests__/seed.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 146[2mms[22m[39m
|
|
13
|
+
[32m✓[39m src/__tests__/deployment-diagnostics.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 60[2mms[22m[39m
|
|
14
14
|
- Reading canonical Actuate schema...
|
|
15
|
+
[90mstdout[2m | dist/__tests__/db-init.test.js[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
|
|
15
16
|
✔ Actuate CMS models added to schema.
|
|
16
17
|
- Running prisma generate...
|
|
17
|
-
[90mstdout[2m | dist/__tests__/db-init.test.js[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
|
|
18
18
|
[22m[39m✔ Prisma client generated.
|
|
19
19
|
ℹ Run `npx prisma migrate dev --name actuate-cms` to create the migration.
|
|
20
20
|
|
|
21
|
-
- Reading canonical Actuate schema...
|
|
22
|
-
✖ Could not locate @actuate-media/cms-core.
|
|
23
21
|
[90mstdout[2m | dist/__tests__/db-init.test.js[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
|
|
24
22
|
[22m[39mℹ Install it first: `npm install @actuate-media/cms-core`.
|
|
23
|
+
- Reading canonical Actuate schema...
|
|
25
24
|
|
|
25
|
+
✖ Could not locate @actuate-media/cms-core.
|
|
26
26
|
- Reading canonical Actuate schema...
|
|
27
27
|
✔ Actuate CMS models added to schema.
|
|
28
28
|
- Running prisma generate...
|
|
@@ -32,19 +32,19 @@
|
|
|
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 265[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
|
-
- Reading canonical Actuate schema...
|
|
44
|
-
✖ Could not locate @actuate-media/cms-core.
|
|
45
43
|
[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
44
|
[22m[39mℹ Install it first: `npm install @actuate-media/cms-core`.
|
|
45
|
+
- Reading canonical Actuate schema...
|
|
47
46
|
|
|
47
|
+
✖ Could not locate @actuate-media/cms-core.
|
|
48
48
|
- Reading canonical Actuate schema...
|
|
49
49
|
[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
50
|
[22m[39m✔ Prisma client generated.
|
|
@@ -54,7 +54,7 @@
|
|
|
54
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 203[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[33m
|
|
186
|
+
[32m✓[39m dist/__tests__/mcp-init.test.js [2m([22m[2m6 tests[22m[2m)[22m[33m 330[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[33m
|
|
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[33m 523[2mms[22m[39m
|
|
316
|
+
[32m✓[39m dist/__tests__/form-seed.test.js [2m([22m[2m10 tests[22m[2m)[22m[32m 66[2mms[22m[39m
|
|
317
|
+
[32m✓[39m src/__tests__/form-seed.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 31[2mms[22m[39m
|
|
318
|
+
[32m✓[39m dist/__tests__/vercel-env-matrix.test.js [2m([22m[2m6 tests[22m[2m)[22m[32m 50[2mms[22m[39m
|
|
319
|
+
[32m✓[39m src/__tests__/vercel-env-matrix.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 61[2mms[22m[39m
|
|
320
|
+
[32m✓[39m dist/__tests__/load-dotenv.test.js [2m([22m[2m3 tests[22m[2m)[22m[32m 75[2mms[22m[39m
|
|
321
|
+
[32m✓[39m src/__tests__/load-dotenv.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 100[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 119[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 114[2mms[22m[39m
|
|
338
|
+
[32m✓[39m dist/__tests__/init.test.js [2m([22m[2m2 tests[22m[2m)[22m[32m 33[2mms[22m[39m
|
|
339
|
+
[32m✓[39m src/__tests__/init.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 30[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 18:10:11
|
|
344
|
+
[2m Duration [22m 28.76s[2m (transform 2.79s, setup 0ms, import 7.35s, tests 3.27s, environment 13ms)[22m
|
|
345
345
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @actuate-media/cli
|
|
2
2
|
|
|
3
|
+
## 0.11.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 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.
|
|
8
|
+
|
|
3
9
|
## 0.11.1
|
|
4
10
|
|
|
5
11
|
### 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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"}
|
|
@@ -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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"}
|
|
@@ -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":"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;AAeD,MAAM,iBAAiB,GAAG,CAAC,eAAe,EAAE,yBAAyB,EAAE,uBAAuB,CAAC,CAAA;AAE/F,MAAM,UAAU,gBAAgB,CAAC,OAAuB;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CACzB,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAC5E,CAAA;IACD,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAA;IACtE,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;IAE9D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,MAAM,EAAE,KAAK;YACb,aAAa;YACb,aAAa;YACb,cAAc,EAAE,EAAE;YAClB,MAAM,EAAE,MAAM;SACf,CAAA;IACH,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,MAAoB,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,CAAA;IAE9F,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IACtE,MAAM,eAAe,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IACrE,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,aAAa;QACb,aAAa;QACb,cAAc;QACd,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;KAC3C,CAAA;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actuate-media/cli",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.2",
|
|
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.76.
|
|
31
|
+
"@actuate-media/cms-core": "0.76.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
|
})
|
|
@@ -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/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
|
}
|