@sanity/runtime-cli 17.1.0 → 17.2.0-next.ga4b9ae7
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/README.md +23 -22
- package/dist/actions/blueprints/assets.d.ts +2 -1
- package/dist/actions/blueprints/assets.js +17 -26
- package/dist/actions/blueprints/blueprint.d.ts +1 -1
- package/dist/actions/blueprints/pre-deploy.d.ts +29 -0
- package/dist/actions/blueprints/pre-deploy.js +164 -0
- package/dist/actions/blueprints/wait-for-operation.js +4 -0
- package/dist/actions/sanity/examples.d.ts +4 -4
- package/dist/baseCommands.d.ts +4 -4
- package/dist/commands/blueprints/add.d.ts +1 -1
- package/dist/commands/blueprints/config.d.ts +1 -1
- package/dist/commands/blueprints/deploy.d.ts +1 -1
- package/dist/commands/blueprints/destroy.d.ts +1 -1
- package/dist/commands/blueprints/doctor.d.ts +0 -1
- package/dist/commands/blueprints/doctor.js +3 -7
- package/dist/commands/blueprints/info.d.ts +1 -1
- package/dist/commands/blueprints/logs.d.ts +1 -1
- package/dist/commands/blueprints/mint-deploy-token.d.ts +1 -1
- package/dist/commands/blueprints/plan.d.ts +1 -1
- package/dist/commands/blueprints/promote.d.ts +1 -1
- package/dist/commands/blueprints/stacks.d.ts +1 -1
- package/dist/commands/functions/add.d.ts +1 -1
- package/dist/commands/functions/build.d.ts +1 -1
- package/dist/commands/functions/dev.d.ts +1 -1
- package/dist/commands/functions/env/add.d.ts +1 -1
- package/dist/commands/functions/env/list.d.ts +1 -1
- package/dist/commands/functions/env/remove.d.ts +1 -1
- package/dist/commands/functions/logs.d.ts +1 -1
- package/dist/commands/functions/test.d.ts +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +1 -0
- package/dist/cores/blueprints/deploy.js +18 -65
- package/dist/cores/blueprints/doctor.js +15 -12
- package/dist/cores/functions/build.js +3 -2
- package/dist/cores/functions/test.js +4 -2
- package/dist/server/app.js +8 -2
- package/dist/server/static/favicon-dark.svg +1 -0
- package/dist/server/static/favicon.svg +1 -0
- package/dist/server/static/index.html +1 -1
- package/dist/server/static/vendor/vendor.bundle.js +5 -0
- package/dist/utils/functions/child-process-wrapper.js +13 -171
- package/dist/utils/functions/child-runtime/console.d.ts +1 -0
- package/dist/utils/functions/child-runtime/console.js +50 -0
- package/dist/utils/functions/child-runtime/invoke.d.ts +4 -0
- package/dist/utils/functions/child-runtime/invoke.js +47 -0
- package/dist/utils/functions/child-runtime/resources.d.ts +4 -0
- package/dist/utils/functions/child-runtime/resources.js +59 -0
- package/dist/utils/functions/find-entry-point.d.ts +1 -1
- package/dist/utils/functions/find-entry-point.js +10 -12
- package/dist/utils/functions/invoke/local.js +1 -1
- package/dist/utils/functions/invoke/prepare.d.ts +1 -1
- package/dist/utils/functions/invoke/prepare.js +19 -8
- package/dist/utils/functions/package-json.d.ts +1 -2
- package/dist/utils/functions/package-json.js +4 -6
- package/dist/utils/functions/prepare-asset.d.ts +2 -2
- package/dist/utils/functions/prepare-asset.js +18 -7
- package/dist/utils/functions/resolve-dependencies.d.ts +4 -1
- package/dist/utils/functions/resolve-dependencies.js +5 -6
- package/dist/utils/functions/resource-to-arc.d.ts +1 -1
- package/dist/utils/functions/resource-to-arc.js +4 -5
- package/dist/utils/functions/should-transpile.d.ts +7 -1
- package/dist/utils/functions/should-transpile.js +10 -10
- package/dist/utils/functions/transpile/function.d.ts +4 -1
- package/dist/utils/functions/transpile/function.js +9 -14
- package/dist/utils/functions/transpile/verify-handler.js +1 -1
- package/dist/utils/logger.d.ts +7 -5
- package/dist/utils/logger.js +33 -1
- package/dist/utils/progress.d.ts +5 -0
- package/dist/utils/progress.js +40 -0
- package/dist/utils/studios/prepare-asset.d.ts +6 -0
- package/dist/utils/studios/prepare-asset.js +139 -0
- package/dist/utils/types.d.ts +9 -8
- package/dist/utils/types.js +2 -3
- package/oclif.manifest.json +896 -895
- package/package.json +30 -23
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@ $ npm install -g @sanity/runtime-cli
|
|
|
20
20
|
$ sanity-run COMMAND
|
|
21
21
|
running command...
|
|
22
22
|
$ sanity-run (--version)
|
|
23
|
-
@sanity/runtime-cli/17.
|
|
23
|
+
@sanity/runtime-cli/17.2.0-next.ga4b9ae7 linux-x64 node-v24.18.0
|
|
24
24
|
$ sanity-run --help [COMMAND]
|
|
25
25
|
USAGE
|
|
26
26
|
$ sanity-run COMMAND
|
|
@@ -103,7 +103,7 @@ EXAMPLES
|
|
|
103
103
|
$ sanity-run blueprints add function --name my-function --fn-type document-create --fn-type document-update --lang js
|
|
104
104
|
```
|
|
105
105
|
|
|
106
|
-
_See code: [src/commands/blueprints/add.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
106
|
+
_See code: [src/commands/blueprints/add.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/blueprints/add.ts)_
|
|
107
107
|
|
|
108
108
|
## `sanity-run blueprints config`
|
|
109
109
|
|
|
@@ -140,7 +140,7 @@ EXAMPLES
|
|
|
140
140
|
$ sanity-run blueprints config --edit --project-id <projectId> --stack <name-or-id>
|
|
141
141
|
```
|
|
142
142
|
|
|
143
|
-
_See code: [src/commands/blueprints/config.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
143
|
+
_See code: [src/commands/blueprints/config.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/blueprints/config.ts)_
|
|
144
144
|
|
|
145
145
|
## `sanity-run blueprints deploy`
|
|
146
146
|
|
|
@@ -194,7 +194,7 @@ EXAMPLES
|
|
|
194
194
|
$ sanity-run blueprints deploy --new-stack-name <new-name>
|
|
195
195
|
```
|
|
196
196
|
|
|
197
|
-
_See code: [src/commands/blueprints/deploy.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
197
|
+
_See code: [src/commands/blueprints/deploy.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/blueprints/deploy.ts)_
|
|
198
198
|
|
|
199
199
|
## `sanity-run blueprints destroy`
|
|
200
200
|
|
|
@@ -232,7 +232,7 @@ EXAMPLES
|
|
|
232
232
|
$ sanity-run blueprints destroy --stack <name-or-id> --project-id <projectId> --force --no-wait
|
|
233
233
|
```
|
|
234
234
|
|
|
235
|
-
_See code: [src/commands/blueprints/destroy.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
235
|
+
_See code: [src/commands/blueprints/destroy.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/blueprints/destroy.ts)_
|
|
236
236
|
|
|
237
237
|
## `sanity-run blueprints doctor`
|
|
238
238
|
|
|
@@ -240,13 +240,12 @@ Diagnose potential issues with local Blueprint and remote Stack configuration
|
|
|
240
240
|
|
|
241
241
|
```
|
|
242
242
|
USAGE
|
|
243
|
-
$ sanity-run blueprints doctor [--json] [-p <value>] [--
|
|
243
|
+
$ sanity-run blueprints doctor [--json] [-p <value>] [--fix]
|
|
244
244
|
|
|
245
245
|
FLAGS
|
|
246
246
|
-p, --path=<value> [env: SANITY_BLUEPRINT_PATH] Path to a Blueprint file or directory containing one
|
|
247
247
|
--fix Interactively fix configuration issues
|
|
248
248
|
--json Format output as json
|
|
249
|
-
--[no-]verbose Verbose output; defaults to true
|
|
250
249
|
|
|
251
250
|
DESCRIPTION
|
|
252
251
|
Diagnose potential issues with local Blueprint and remote Stack configuration
|
|
@@ -257,13 +256,15 @@ DESCRIPTION
|
|
|
257
256
|
Run this command when encountering errors with other Blueprint commands. Use --fix to interactively resolve detected
|
|
258
257
|
issues.
|
|
259
258
|
|
|
259
|
+
Supports --json for programmatic consumption of diagnostic results.
|
|
260
|
+
|
|
260
261
|
EXAMPLES
|
|
261
262
|
$ sanity-run blueprints doctor
|
|
262
263
|
|
|
263
264
|
$ sanity-run blueprints doctor --fix
|
|
264
265
|
```
|
|
265
266
|
|
|
266
|
-
_See code: [src/commands/blueprints/doctor.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
267
|
+
_See code: [src/commands/blueprints/doctor.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/blueprints/doctor.ts)_
|
|
267
268
|
|
|
268
269
|
## `sanity-run blueprints info`
|
|
269
270
|
|
|
@@ -300,7 +301,7 @@ EXAMPLES
|
|
|
300
301
|
$ sanity-run blueprints info --organization-id <orgId> --stack <name-or-id>
|
|
301
302
|
```
|
|
302
303
|
|
|
303
|
-
_See code: [src/commands/blueprints/info.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
304
|
+
_See code: [src/commands/blueprints/info.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/blueprints/info.ts)_
|
|
304
305
|
|
|
305
306
|
## `sanity-run blueprints init [DIR]`
|
|
306
307
|
|
|
@@ -364,7 +365,7 @@ EXAMPLES
|
|
|
364
365
|
$ sanity-run blueprints init old-stack --type <json|js|ts> --project-id <projectId> --stack-id <existingStackId>
|
|
365
366
|
```
|
|
366
367
|
|
|
367
|
-
_See code: [src/commands/blueprints/init.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
368
|
+
_See code: [src/commands/blueprints/init.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/blueprints/init.ts)_
|
|
368
369
|
|
|
369
370
|
## `sanity-run blueprints logs`
|
|
370
371
|
|
|
@@ -410,7 +411,7 @@ EXAMPLES
|
|
|
410
411
|
$ sanity-run blueprints logs --before 2026-05-01T00:00:00Z
|
|
411
412
|
```
|
|
412
413
|
|
|
413
|
-
_See code: [src/commands/blueprints/logs.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
414
|
+
_See code: [src/commands/blueprints/logs.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/blueprints/logs.ts)_
|
|
414
415
|
|
|
415
416
|
## `sanity-run blueprints mint-deploy-token`
|
|
416
417
|
|
|
@@ -455,7 +456,7 @@ EXAMPLES
|
|
|
455
456
|
$ sanity-run blueprints mint-deploy-token --organization-id <orgId>
|
|
456
457
|
```
|
|
457
458
|
|
|
458
|
-
_See code: [src/commands/blueprints/mint-deploy-token.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
459
|
+
_See code: [src/commands/blueprints/mint-deploy-token.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/blueprints/mint-deploy-token.ts)_
|
|
459
460
|
|
|
460
461
|
## `sanity-run blueprints plan`
|
|
461
462
|
|
|
@@ -488,7 +489,7 @@ EXAMPLES
|
|
|
488
489
|
$ sanity-run blueprints plan --organization-id <orgId> --stack <name-or-id>
|
|
489
490
|
```
|
|
490
491
|
|
|
491
|
-
_See code: [src/commands/blueprints/plan.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
492
|
+
_See code: [src/commands/blueprints/plan.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/blueprints/plan.ts)_
|
|
492
493
|
|
|
493
494
|
## `sanity-run blueprints promote`
|
|
494
495
|
|
|
@@ -524,7 +525,7 @@ EXAMPLES
|
|
|
524
525
|
$ sanity-run blueprints promote --new-stack-name <new-name>
|
|
525
526
|
```
|
|
526
527
|
|
|
527
|
-
_See code: [src/commands/blueprints/promote.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
528
|
+
_See code: [src/commands/blueprints/promote.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/blueprints/promote.ts)_
|
|
528
529
|
|
|
529
530
|
## `sanity-run blueprints stacks`
|
|
530
531
|
|
|
@@ -560,7 +561,7 @@ EXAMPLES
|
|
|
560
561
|
$ sanity-run blueprints stacks --organization-id <organizationId> --include-projects
|
|
561
562
|
```
|
|
562
563
|
|
|
563
|
-
_See code: [src/commands/blueprints/stacks.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
564
|
+
_See code: [src/commands/blueprints/stacks.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/blueprints/stacks.ts)_
|
|
564
565
|
|
|
565
566
|
## `sanity-run functions add`
|
|
566
567
|
|
|
@@ -612,7 +613,7 @@ EXAMPLES
|
|
|
612
613
|
$ sanity-run functions add --name my-function --type document-create --type document-update --lang js
|
|
613
614
|
```
|
|
614
615
|
|
|
615
|
-
_See code: [src/commands/functions/add.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
616
|
+
_See code: [src/commands/functions/add.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/functions/add.ts)_
|
|
616
617
|
|
|
617
618
|
## `sanity-run functions dev`
|
|
618
619
|
|
|
@@ -647,7 +648,7 @@ EXAMPLES
|
|
|
647
648
|
$ sanity-run functions dev --timeout 60
|
|
648
649
|
```
|
|
649
650
|
|
|
650
|
-
_See code: [src/commands/functions/dev.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
651
|
+
_See code: [src/commands/functions/dev.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/functions/dev.ts)_
|
|
651
652
|
|
|
652
653
|
## `sanity-run functions env add NAME KEY VALUE`
|
|
653
654
|
|
|
@@ -677,7 +678,7 @@ EXAMPLES
|
|
|
677
678
|
$ sanity-run functions env add MyFunction API_URL https://api.example.com/
|
|
678
679
|
```
|
|
679
680
|
|
|
680
|
-
_See code: [src/commands/functions/env/add.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
681
|
+
_See code: [src/commands/functions/env/add.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/functions/env/add.ts)_
|
|
681
682
|
|
|
682
683
|
## `sanity-run functions env list NAME`
|
|
683
684
|
|
|
@@ -704,7 +705,7 @@ EXAMPLES
|
|
|
704
705
|
$ sanity-run functions env list MyFunction
|
|
705
706
|
```
|
|
706
707
|
|
|
707
|
-
_See code: [src/commands/functions/env/list.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
708
|
+
_See code: [src/commands/functions/env/list.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/functions/env/list.ts)_
|
|
708
709
|
|
|
709
710
|
## `sanity-run functions env remove NAME KEY`
|
|
710
711
|
|
|
@@ -733,7 +734,7 @@ EXAMPLES
|
|
|
733
734
|
$ sanity-run functions env remove MyFunction API_URL
|
|
734
735
|
```
|
|
735
736
|
|
|
736
|
-
_See code: [src/commands/functions/env/remove.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
737
|
+
_See code: [src/commands/functions/env/remove.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/functions/env/remove.ts)_
|
|
737
738
|
|
|
738
739
|
## `sanity-run functions logs [NAME]`
|
|
739
740
|
|
|
@@ -773,7 +774,7 @@ EXAMPLES
|
|
|
773
774
|
$ sanity-run functions logs <name> --delete
|
|
774
775
|
```
|
|
775
776
|
|
|
776
|
-
_See code: [src/commands/functions/logs.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
777
|
+
_See code: [src/commands/functions/logs.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/functions/logs.ts)_
|
|
777
778
|
|
|
778
779
|
## `sanity-run functions test [NAME]`
|
|
779
780
|
|
|
@@ -830,7 +831,7 @@ EXAMPLES
|
|
|
830
831
|
$ sanity-run functions test <name> --event update --data-before '{ "title": "before" }' --data-after '{ "title": "after" }'
|
|
831
832
|
```
|
|
832
833
|
|
|
833
|
-
_See code: [src/commands/functions/test.ts](https://github.com/sanity-io/runtime-cli/blob/v17.
|
|
834
|
+
_See code: [src/commands/functions/test.ts](https://github.com/sanity-io/runtime-cli/blob/v17.2.0-next.ga4b9ae7/src/commands/functions/test.ts)_
|
|
834
835
|
|
|
835
836
|
## `sanity-run help [COMMAND]`
|
|
836
837
|
|
|
@@ -3,9 +3,10 @@ import type { Logger } from '../../utils/logger.js';
|
|
|
3
3
|
import type { AssetResource, AuthParams, InstallerType } from '../../utils/types.js';
|
|
4
4
|
export declare const assetCheckUrl: string;
|
|
5
5
|
export declare const assetStashUrl: string;
|
|
6
|
-
export declare function stashAsset({ resource, auth, logger, installer, }: {
|
|
6
|
+
export declare function stashAsset({ resource, auth, blueprintFileDir, logger, installer, }: {
|
|
7
7
|
resource: AssetResource;
|
|
8
8
|
auth: AuthParams;
|
|
9
|
+
blueprintFileDir: string;
|
|
9
10
|
logger: Logger;
|
|
10
11
|
installer?: InstallerType;
|
|
11
12
|
}): Promise<{
|
|
@@ -1,48 +1,52 @@
|
|
|
1
1
|
import crypto from 'node:crypto';
|
|
2
2
|
import fs from 'node:fs';
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
3
4
|
import AdmZip from 'adm-zip';
|
|
4
5
|
import { blueprintsUrl } from '../../config.js';
|
|
5
6
|
import { CONVERT_BYTES_TO_MB, MAX_ASSET_SIZE } from '../../constants.js';
|
|
6
7
|
import { prepareAsset as prepareFunctionAsset } from '../../utils/functions/prepare-asset.js';
|
|
7
8
|
import getHeaders from '../../utils/get-headers.js';
|
|
9
|
+
import { prepareStudioAsset } from '../../utils/studios/prepare-asset.js';
|
|
8
10
|
import { createTracedFetch } from '../../utils/traced-fetch.js';
|
|
9
11
|
import { isLocalFunctionResource, isStudioResource } from '../../utils/types.js';
|
|
10
12
|
const assetsUrl = blueprintsUrl('assets');
|
|
11
13
|
export const assetCheckUrl = `${assetsUrl}/check`;
|
|
12
14
|
export const assetStashUrl = `${assetsUrl}/stash`;
|
|
13
|
-
export async function stashAsset({ resource, auth, logger, installer, }) {
|
|
15
|
+
export async function stashAsset({ resource, auth, blueprintFileDir, logger, installer, }) {
|
|
16
|
+
let cleanup = async () => { };
|
|
14
17
|
try {
|
|
15
18
|
let b64;
|
|
16
19
|
let hash;
|
|
17
20
|
let extension;
|
|
18
|
-
let cleanup;
|
|
19
21
|
if (isLocalFunctionResource(resource)) {
|
|
20
|
-
const prepResult = await prepareFunctionAsset({ resource
|
|
22
|
+
const prepResult = await prepareFunctionAsset({ resource, blueprintFileDir, installer });
|
|
21
23
|
if (prepResult.success === false) {
|
|
24
|
+
await prepResult.cleanup();
|
|
22
25
|
return {
|
|
23
26
|
success: false,
|
|
24
27
|
error: prepResult.error,
|
|
25
28
|
};
|
|
26
29
|
}
|
|
30
|
+
cleanup = prepResult.cleanup;
|
|
27
31
|
const zipResult = await pathToB64ZipHash(prepResult.outputPath);
|
|
28
32
|
b64 = zipResult.b64;
|
|
29
33
|
hash = zipResult.hash;
|
|
30
34
|
extension = 'zip';
|
|
31
|
-
cleanup = prepResult.cleanup;
|
|
32
35
|
}
|
|
33
36
|
else if (isStudioResource(resource)) {
|
|
34
|
-
const prepResult = await prepareStudioAsset({ resource });
|
|
37
|
+
const prepResult = await prepareStudioAsset({ resource, blueprintFileDir });
|
|
35
38
|
if (prepResult.success === false) {
|
|
39
|
+
await prepResult.cleanup();
|
|
36
40
|
return {
|
|
37
41
|
success: false,
|
|
38
42
|
error: prepResult.error,
|
|
39
43
|
};
|
|
40
44
|
}
|
|
41
|
-
|
|
45
|
+
cleanup = prepResult.cleanup;
|
|
46
|
+
const buffer = await readFile(prepResult.outputPath);
|
|
42
47
|
b64 = buffer.toString('base64');
|
|
43
48
|
hash = hashBuffer(buffer);
|
|
44
49
|
extension = 'tar.gz';
|
|
45
|
-
cleanup = prepResult.cleanup;
|
|
46
50
|
}
|
|
47
51
|
else {
|
|
48
52
|
return {
|
|
@@ -61,28 +65,15 @@ export async function stashAsset({ resource, auth, logger, installer, }) {
|
|
|
61
65
|
});
|
|
62
66
|
}
|
|
63
67
|
catch (err) {
|
|
68
|
+
try {
|
|
69
|
+
await cleanup();
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// ignore clean up errors
|
|
73
|
+
}
|
|
64
74
|
return { success: false, error: err instanceof Error ? err.message : `${err}` };
|
|
65
75
|
}
|
|
66
76
|
}
|
|
67
|
-
async function prepareStudioAsset({ resource, }) {
|
|
68
|
-
if (!fs.existsSync(resource.src)) {
|
|
69
|
-
return {
|
|
70
|
-
success: false,
|
|
71
|
-
async cleanup() {
|
|
72
|
-
// no op
|
|
73
|
-
},
|
|
74
|
-
error: `Property 'src' on resource with type '${resource.type}' must be a directory`,
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
return {
|
|
78
|
-
success: true,
|
|
79
|
-
async cleanup() {
|
|
80
|
-
// no op
|
|
81
|
-
},
|
|
82
|
-
// studio must be pre built (e.g. with `npm run build`) and tarred/gzipped
|
|
83
|
-
outputPath: resource.src,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
77
|
async function stashSingleAsset({ b64, hash, cleanup, resource, auth, logger, extension = 'zip', }) {
|
|
87
78
|
const fetchFn = createTracedFetch(logger);
|
|
88
79
|
try {
|
|
@@ -4,7 +4,7 @@ import type { Logger } from '../../utils/logger.js';
|
|
|
4
4
|
import type { BlueprintParserError, ScopeType } from '../../utils/types.js';
|
|
5
5
|
import { type LocatedBlueprintsConfig } from './config.js';
|
|
6
6
|
import { type ConfigSource } from './resolve.js';
|
|
7
|
-
declare const SUPPORTED_FILE_EXTENSIONS: readonly [
|
|
7
|
+
declare const SUPPORTED_FILE_EXTENSIONS: readonly ['.json', '.js', '.mjs', '.ts'];
|
|
8
8
|
type BlueprintFileExtension = (typeof SUPPORTED_FILE_EXTENSIONS)[number];
|
|
9
9
|
export declare const JSON_BLUEPRINT_CONTENT: {
|
|
10
10
|
blueprintVersion: string;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { BlueprintResource } from '@sanity/blueprints';
|
|
2
|
+
import type { Logger } from '../../utils/logger.js';
|
|
3
|
+
import { type AuthParams, type InstallerType, type ScopeType } from '../../utils/types.js';
|
|
4
|
+
type PreDeployResult = {
|
|
5
|
+
success: false;
|
|
6
|
+
error: string;
|
|
7
|
+
code?: string;
|
|
8
|
+
exitCode?: number;
|
|
9
|
+
suggestions?: string[];
|
|
10
|
+
} | {
|
|
11
|
+
success: true;
|
|
12
|
+
};
|
|
13
|
+
type PreDeployResourceOptions = {
|
|
14
|
+
auth: AuthParams;
|
|
15
|
+
blueprintFileDir: string;
|
|
16
|
+
installer: InstallerType;
|
|
17
|
+
log: Logger;
|
|
18
|
+
};
|
|
19
|
+
type PreDeployOptions = {
|
|
20
|
+
scopeType: ScopeType;
|
|
21
|
+
scopeId: string;
|
|
22
|
+
resources: BlueprintResource[];
|
|
23
|
+
stackId: string;
|
|
24
|
+
stackName: string;
|
|
25
|
+
bin: string;
|
|
26
|
+
verbose: boolean | undefined;
|
|
27
|
+
} & PreDeployResourceOptions;
|
|
28
|
+
export declare function preDeploy(options: PreDeployOptions): Promise<PreDeployResult>;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { env } from 'node:process';
|
|
2
|
+
import { resolveDeployedResources } from '../../utils/blueprints/resolve-deployed-resources.js';
|
|
3
|
+
import { niceId } from '../../utils/display/presenters.js';
|
|
4
|
+
import { CODE_OPERATION_UNCONFIRMED, EXIT_OPERATION_UNCONFIRMED } from '../../utils/exit-codes.js';
|
|
5
|
+
import { styleText } from '../../utils/style-text.js';
|
|
6
|
+
import { isAssetResource, } from '../../utils/types.js';
|
|
7
|
+
import { stashAsset } from './assets.js';
|
|
8
|
+
import { updateStack } from './stacks.js';
|
|
9
|
+
import { waitForOperation } from './wait-for-operation.js';
|
|
10
|
+
const DEFAULT_ASSET_TIMEOUT = 180;
|
|
11
|
+
const assetTimeoutS = Number(process.env.SANITY_ASSET_TIMEOUT) || DEFAULT_ASSET_TIMEOUT;
|
|
12
|
+
const assetTimeoutMs = assetTimeoutS * 1000;
|
|
13
|
+
const warnTimeoutMs = assetTimeoutMs / 3;
|
|
14
|
+
export async function preDeploy(options) {
|
|
15
|
+
const { resources, stackId, auth, blueprintFileDir, installer, log } = options;
|
|
16
|
+
const hasAssetResources = resources.some(isAssetResource);
|
|
17
|
+
if (hasAssetResources) {
|
|
18
|
+
let assetResources;
|
|
19
|
+
if (env.SANITY_BLUEPRINTS_PRE_DEPLOY_ENABLED === 'true') {
|
|
20
|
+
const preDeployStackResult = await preDeployStack(options);
|
|
21
|
+
if (!preDeployStackResult.success) {
|
|
22
|
+
return preDeployStackResult;
|
|
23
|
+
}
|
|
24
|
+
/** Look up resources from the back-end and attach the externalId if possible */
|
|
25
|
+
const resolvedResources = await resolveDeployedResources({
|
|
26
|
+
resources,
|
|
27
|
+
stackId,
|
|
28
|
+
auth,
|
|
29
|
+
logger: log,
|
|
30
|
+
});
|
|
31
|
+
assetResources = resolvedResources.filter(isAssetResource);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
assetResources = resources.filter(isAssetResource);
|
|
35
|
+
}
|
|
36
|
+
log('Processing assets...');
|
|
37
|
+
for (const resource of assetResources) {
|
|
38
|
+
const preDeployResult = await preDeployResource(resource, {
|
|
39
|
+
auth,
|
|
40
|
+
blueprintFileDir,
|
|
41
|
+
installer,
|
|
42
|
+
log,
|
|
43
|
+
});
|
|
44
|
+
if (!preDeployResult.success)
|
|
45
|
+
return preDeployResult;
|
|
46
|
+
const idx = resources.findIndex((r) => r.name === resource.name);
|
|
47
|
+
if (idx === -1)
|
|
48
|
+
throw new Error('Unable to update resource asset');
|
|
49
|
+
resources[idx] = preDeployResult.resource;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return { success: true };
|
|
53
|
+
}
|
|
54
|
+
async function preDeployStack(options) {
|
|
55
|
+
const { scopeType, scopeId, stackId, stackName, resources, auth, log, bin, verbose } = options;
|
|
56
|
+
const spinner = log.ora('Starting pre-deploy...').start();
|
|
57
|
+
const stackMutation = {
|
|
58
|
+
scopeType,
|
|
59
|
+
scopeId,
|
|
60
|
+
name: stackName,
|
|
61
|
+
preDeploy: true,
|
|
62
|
+
document: { resources },
|
|
63
|
+
};
|
|
64
|
+
const { ok: deployOk, stack, error: deployError, } = await updateStack({ stackId, stackMutation, auth, logger: log });
|
|
65
|
+
if (!deployOk) {
|
|
66
|
+
spinner.fail(`${styleText('red', 'Failed')} to complete Stack pre-deployment`);
|
|
67
|
+
return {
|
|
68
|
+
success: false,
|
|
69
|
+
error: deployError || 'Failed to complete Stack pre-deployment',
|
|
70
|
+
suggestions: [
|
|
71
|
+
`Run \`npx ${bin} blueprints plan\` to preview changes before deploying.`,
|
|
72
|
+
`Run \`npx ${bin} blueprints doctor\` to check your configuration.`,
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
spinner.stop().clear();
|
|
77
|
+
log(styleText('dim', 'Stack deployment progress:'));
|
|
78
|
+
log('');
|
|
79
|
+
const outcome = await waitForOperation({
|
|
80
|
+
stackId,
|
|
81
|
+
operationId: stack.operationId,
|
|
82
|
+
auth,
|
|
83
|
+
log,
|
|
84
|
+
bin,
|
|
85
|
+
verbose,
|
|
86
|
+
progressNoun: 'pre-deployment',
|
|
87
|
+
});
|
|
88
|
+
if (outcome.type === 'completed') {
|
|
89
|
+
log(styleText(['bold', 'green'], 'Stack pre-deployment completed!'));
|
|
90
|
+
}
|
|
91
|
+
else if (outcome.type === 'unconfirmed') {
|
|
92
|
+
return {
|
|
93
|
+
success: false,
|
|
94
|
+
error: `Stack pre-deployment was accepted but completion could not be confirmed${outcome.error ? ` (${outcome.error})` : ''}.`,
|
|
95
|
+
code: CODE_OPERATION_UNCONFIRMED,
|
|
96
|
+
exitCode: EXIT_OPERATION_UNCONFIRMED,
|
|
97
|
+
suggestions: [
|
|
98
|
+
'The pre-deployment may or may not have finished on Sanity servers.',
|
|
99
|
+
`Run \`npx ${bin} blueprints info\` to check status.`,
|
|
100
|
+
`Run \`npx ${bin} blueprints logs --watch\` to keep streaming logs.`,
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
return {
|
|
106
|
+
success: false,
|
|
107
|
+
error: 'Stack pre-deployment failed',
|
|
108
|
+
suggestions: [
|
|
109
|
+
...outcome.logHints,
|
|
110
|
+
'Review the pre-deployment output above for error details.',
|
|
111
|
+
`Run \`npx ${bin} blueprints logs --verbose\` for more context.`,
|
|
112
|
+
`Run \`npx ${bin} blueprints plan\` to identify issues with your Blueprint.`,
|
|
113
|
+
],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
return { success: true };
|
|
117
|
+
}
|
|
118
|
+
async function preDeployResource(resource, options) {
|
|
119
|
+
const { auth, blueprintFileDir, installer, log } = options;
|
|
120
|
+
const fnSpinner = log.ora({ text: `Processing ${resource.name}...`, prefixText: ' ' }).start();
|
|
121
|
+
const warnTimer = setTimeout(() => {
|
|
122
|
+
fnSpinner.text = `Still processing ${resource.name}, this can take a moment...`;
|
|
123
|
+
}, warnTimeoutMs);
|
|
124
|
+
let assetTimeoutTimer;
|
|
125
|
+
let result;
|
|
126
|
+
try {
|
|
127
|
+
result = await Promise.race([
|
|
128
|
+
stashAsset({ resource, blueprintFileDir, auth, logger: log, installer }),
|
|
129
|
+
new Promise((_, reject) => {
|
|
130
|
+
assetTimeoutTimer = setTimeout(() => {
|
|
131
|
+
reject(new Error(`Processing ${resource.name} timed out after ${assetTimeoutS}s`));
|
|
132
|
+
}, assetTimeoutMs);
|
|
133
|
+
}),
|
|
134
|
+
]);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
138
|
+
fnSpinner.fail(msg);
|
|
139
|
+
return { success: false, error: msg };
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
clearTimeout(warnTimer);
|
|
143
|
+
clearTimeout(assetTimeoutTimer);
|
|
144
|
+
}
|
|
145
|
+
if (result.success && result.assetId) {
|
|
146
|
+
const updatedResource = { ...resource, src: result.assetId };
|
|
147
|
+
fnSpinner.succeed(`${updatedResource.name} ${niceId(result.assetId)}`);
|
|
148
|
+
log(` Source: ${updatedResource.src}`);
|
|
149
|
+
if (result.hash) {
|
|
150
|
+
if (result.hash.length > 24) {
|
|
151
|
+
log.verbose(` Hash: ${result.hash.slice(0, 8)}...${result.hash.slice(-12)}`);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
log.verbose(` Hash: ${result.hash}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (result.exists)
|
|
158
|
+
log.verbose(' Asset unchanged');
|
|
159
|
+
return { success: true, resource: updatedResource };
|
|
160
|
+
}
|
|
161
|
+
const errorMsg = `Failed uploading ${resource.name} asset, deploy has stopped`;
|
|
162
|
+
fnSpinner.fail(errorMsg);
|
|
163
|
+
return { success: false, error: result.error || 'Failed to process asset' };
|
|
164
|
+
}
|
|
@@ -12,6 +12,7 @@ export async function waitForOperation(options) {
|
|
|
12
12
|
const logHints = createHintCollector(bin);
|
|
13
13
|
let logStreamCleanup = null;
|
|
14
14
|
try {
|
|
15
|
+
log.showProgress();
|
|
15
16
|
let lastLogAt = Date.now();
|
|
16
17
|
let idleMessageShown = false;
|
|
17
18
|
let consecutiveErrors = 0;
|
|
@@ -85,4 +86,7 @@ export async function waitForOperation(options) {
|
|
|
85
86
|
logStreamCleanup();
|
|
86
87
|
throw error;
|
|
87
88
|
}
|
|
89
|
+
finally {
|
|
90
|
+
log.clearProgress();
|
|
91
|
+
}
|
|
88
92
|
}
|
|
@@ -2,12 +2,12 @@ import type { Logger } from '../../utils/logger.js';
|
|
|
2
2
|
export declare const EXAMPLES_CACHE_DIR: string;
|
|
3
3
|
declare const EXAMPLE_TYPES: {
|
|
4
4
|
readonly blueprint: {
|
|
5
|
-
readonly repo:
|
|
6
|
-
readonly dir:
|
|
5
|
+
readonly repo: 'sanity-io/sanity';
|
|
6
|
+
readonly dir: 'examples/blueprints';
|
|
7
7
|
};
|
|
8
8
|
readonly function: {
|
|
9
|
-
readonly repo:
|
|
10
|
-
readonly dir:
|
|
9
|
+
readonly repo: 'sanity-labs/function-recipes';
|
|
10
|
+
readonly dir: '';
|
|
11
11
|
};
|
|
12
12
|
};
|
|
13
13
|
export declare function verifyExampleExists({ type, name, logger, }: {
|
package/dist/baseCommands.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export declare const pathFlagConfig: {
|
|
|
10
10
|
description: string;
|
|
11
11
|
env: string;
|
|
12
12
|
aliases: string[];
|
|
13
|
-
char:
|
|
13
|
+
char: 'p';
|
|
14
14
|
};
|
|
15
15
|
export declare const baseFlags: {
|
|
16
16
|
json: Interfaces.BooleanFlag<boolean>;
|
|
@@ -112,14 +112,14 @@ export type Need = 'token' | 'blueprint' | 'scope' | 'stackId' | 'deployedStack'
|
|
|
112
112
|
export declare abstract class ResolvedCommand<T extends typeof Command> extends RuntimeCommand<T> {
|
|
113
113
|
static needs: readonly Need[];
|
|
114
114
|
static baseFlags: {
|
|
115
|
-
stack: Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
116
|
-
'project-id': Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
117
|
-
'organization-id': Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
118
115
|
json: Interfaces.BooleanFlag<boolean>;
|
|
119
116
|
path: Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
120
117
|
trace: Interfaces.BooleanFlag<boolean>;
|
|
121
118
|
'validate-resources': Interfaces.BooleanFlag<boolean>;
|
|
122
119
|
verbose: Interfaces.BooleanFlag<boolean>;
|
|
120
|
+
stack: Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
121
|
+
'project-id': Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
122
|
+
'organization-id': Interfaces.OptionFlag<string | undefined, Interfaces.CustomOptions>;
|
|
123
123
|
};
|
|
124
124
|
protected sanityToken: string;
|
|
125
125
|
protected blueprint: ReadBlueprintResult;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { ResolvedCommand } from '../../baseCommands.js';
|
|
6
6
|
export default class AddCommand extends ResolvedCommand<typeof AddCommand> {
|
|
7
|
-
static needs: readonly [
|
|
7
|
+
static needs: readonly ['blueprint'];
|
|
8
8
|
static state: string;
|
|
9
9
|
static deprecationOptions: {
|
|
10
10
|
to: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ResolvedCommand } from '../../baseCommands.js';
|
|
2
2
|
export default class ConfigCommand extends ResolvedCommand<typeof ConfigCommand> {
|
|
3
|
-
static needs: readonly [
|
|
3
|
+
static needs: readonly ['token', 'blueprint'];
|
|
4
4
|
static summary: string;
|
|
5
5
|
static description: string;
|
|
6
6
|
static examples: string[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ResolvedCommand } from '../../baseCommands.js';
|
|
2
2
|
export default class DeployCommand extends ResolvedCommand<typeof DeployCommand> {
|
|
3
|
-
static needs: readonly [
|
|
3
|
+
static needs: readonly ['deployedStack', 'blueprint'];
|
|
4
4
|
static summary: string;
|
|
5
5
|
static description: string;
|
|
6
6
|
static examples: string[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ResolvedCommand } from '../../baseCommands.js';
|
|
2
2
|
export default class DestroyCommand extends ResolvedCommand<typeof DestroyCommand> {
|
|
3
|
-
static needs: readonly [
|
|
3
|
+
static needs: readonly ['scope'];
|
|
4
4
|
static summary: string;
|
|
5
5
|
static description: string;
|
|
6
6
|
static examples: string[];
|
|
@@ -6,7 +6,6 @@ export default class DoctorCommand extends RuntimeCommand<typeof DoctorCommand>
|
|
|
6
6
|
static flags: {
|
|
7
7
|
path: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
8
|
fix: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
-
verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
10
9
|
};
|
|
11
10
|
run(): Promise<Record<string, unknown> | undefined>;
|
|
12
11
|
}
|
|
@@ -7,8 +7,9 @@ export default class DoctorCommand extends RuntimeCommand {
|
|
|
7
7
|
static summary = 'Diagnose potential issues with local Blueprint and remote Stack configuration';
|
|
8
8
|
static description = `Analyzes your local Blueprint and remote Stack configuration for common issues, such as missing authentication, invalid project references, or misconfigured resources.
|
|
9
9
|
|
|
10
|
-
Run this command when encountering errors with other Blueprint commands. Use --fix to interactively resolve detected issues
|
|
11
|
-
|
|
10
|
+
Run this command when encountering errors with other Blueprint commands. Use --fix to interactively resolve detected issues.
|
|
11
|
+
|
|
12
|
+
Supports --json for programmatic consumption of diagnostic results.`;
|
|
12
13
|
static examples = [
|
|
13
14
|
'<%= config.bin %> <%= command.id %>',
|
|
14
15
|
'<%= config.bin %> <%= command.id %> --fix',
|
|
@@ -19,11 +20,6 @@ Run this command when encountering errors with other Blueprint commands. Use --f
|
|
|
19
20
|
description: 'Interactively fix configuration issues',
|
|
20
21
|
default: false,
|
|
21
22
|
}),
|
|
22
|
-
verbose: Flags.boolean({
|
|
23
|
-
description: 'Verbose output; defaults to true',
|
|
24
|
-
default: true,
|
|
25
|
-
allowNo: true,
|
|
26
|
-
}),
|
|
27
23
|
};
|
|
28
24
|
async run() {
|
|
29
25
|
const { token } = config;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ResolvedCommand } from '../../baseCommands.js';
|
|
2
2
|
export default class InfoCommand extends ResolvedCommand<typeof InfoCommand> {
|
|
3
|
-
static needs: readonly [
|
|
3
|
+
static needs: readonly ['deployedStack'];
|
|
4
4
|
static summary: string;
|
|
5
5
|
static description: string;
|
|
6
6
|
static examples: string[];
|