@sanity/cli 6.0.0-alpha.3 → 6.0.0-alpha.5
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/dist/actions/auth/login/{index.js → login.js} +1 -1
- package/dist/actions/auth/login/{index.js.map → login.js.map} +1 -1
- package/dist/actions/dev/startStudioDevServer.js +3 -8
- package/dist/actions/dev/startStudioDevServer.js.map +1 -1
- package/dist/actions/dev/types.d.ts +1 -3
- package/dist/actions/dev/types.js.map +1 -1
- package/dist/actions/documents/validate.d.ts +0 -2
- package/dist/actions/documents/validate.js +21 -1
- package/dist/actions/documents/validate.js.map +1 -1
- package/dist/actions/exec/execScript.js +1 -1
- package/dist/actions/exec/execScript.js.map +1 -1
- package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +1 -1
- package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.js +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
- package/dist/actions/manifest/extractManifest.js +1 -4
- package/dist/actions/manifest/extractManifest.js.map +1 -1
- package/dist/actions/organizations/getOrganizationChoices.d.ts +6 -0
- package/dist/actions/organizations/getOrganizationChoices.js +23 -0
- package/dist/actions/organizations/getOrganizationChoices.js.map +1 -0
- package/dist/actions/organizations/getOrganizationsWithAttachGrantInfo.d.ts +2 -0
- package/dist/actions/organizations/getOrganizationsWithAttachGrantInfo.js +9 -0
- package/dist/actions/organizations/getOrganizationsWithAttachGrantInfo.js.map +1 -0
- package/dist/actions/organizations/hasProjectAttachGrant.d.ts +1 -0
- package/dist/actions/organizations/hasProjectAttachGrant.js +24 -0
- package/dist/actions/organizations/hasProjectAttachGrant.js.map +1 -0
- package/dist/actions/schema/deleteSchemaAction.d.ts +13 -5
- package/dist/actions/schema/deleteSchemaAction.js +12 -17
- package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
- package/dist/actions/schema/deploySchemas.d.ts +15 -0
- package/dist/actions/schema/deploySchemas.js +98 -0
- package/dist/actions/schema/deploySchemas.js.map +1 -0
- package/dist/actions/schema/listSchemas.d.ts +12 -0
- package/dist/actions/schema/listSchemas.js +119 -0
- package/dist/actions/schema/listSchemas.js.map +1 -0
- package/dist/actions/schema/schemaStoreTypes.d.ts +0 -11
- package/dist/actions/schema/schemaStoreTypes.js.map +1 -1
- package/dist/actions/schema/utils/debug.d.ts +2 -0
- package/dist/actions/schema/utils/debug.js +5 -0
- package/dist/actions/schema/utils/debug.js.map +1 -0
- package/dist/actions/schema/utils/manifestExtractor.d.ts +3 -8
- package/dist/actions/schema/utils/manifestExtractor.js +12 -17
- package/dist/actions/schema/utils/manifestExtractor.js.map +1 -1
- package/dist/actions/schema/utils/manifestReader.d.ts +2 -9
- package/dist/actions/schema/utils/manifestReader.js +6 -12
- package/dist/actions/schema/utils/manifestReader.js.map +1 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.d.ts +0 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.js +1 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.js.map +1 -1
- package/dist/actions/schema/utils/schemaStoreValidation.d.ts +10 -62
- package/dist/actions/schema/utils/schemaStoreValidation.js +40 -127
- package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
- package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +14 -0
- package/dist/actions/schema/utils/uniqByProjectIdDataset.js +9 -0
- package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -0
- package/dist/actions/users/getMembersForProject.d.ts +1 -3
- package/dist/actions/users/getMembersForProject.js +6 -17
- package/dist/actions/users/getMembersForProject.js.map +1 -1
- package/dist/actions/users/types.d.ts +0 -11
- package/dist/actions/users/types.js.map +1 -1
- package/dist/commands/__tests__/debug.test.js +113 -220
- package/dist/commands/__tests__/debug.test.js.map +1 -1
- package/dist/commands/__tests__/deploy.test.js +325 -293
- package/dist/commands/__tests__/deploy.test.js.map +1 -1
- package/dist/commands/__tests__/dev.test.js +62 -19
- package/dist/commands/__tests__/dev.test.js.map +1 -1
- package/dist/commands/__tests__/init/init.authentication.test.js +73 -0
- package/dist/commands/__tests__/init/init.authentication.test.js.map +1 -0
- package/dist/commands/__tests__/init/init.create-new-project.test.js +195 -0
- package/dist/commands/__tests__/init/init.create-new-project.test.js.map +1 -0
- package/dist/commands/__tests__/init/init.plan.test.js +279 -0
- package/dist/commands/__tests__/init/init.plan.test.js.map +1 -0
- package/dist/commands/__tests__/init/init.setup.test.js +335 -0
- package/dist/commands/__tests__/init/init.setup.test.js.map +1 -0
- package/dist/commands/__tests__/install.test.js +46 -22
- package/dist/commands/__tests__/install.test.js.map +1 -1
- package/dist/commands/__tests__/logout.test.js +8 -5
- package/dist/commands/__tests__/logout.test.js.map +1 -1
- package/dist/commands/__tests__/manage.test.js +29 -24
- package/dist/commands/__tests__/manage.test.js.map +1 -1
- package/dist/commands/__tests__/migration.test.js +119 -0
- package/dist/commands/__tests__/migration.test.js.map +1 -0
- package/dist/commands/__tests__/versions.test.js +22 -14
- package/dist/commands/__tests__/versions.test.js.map +1 -1
- package/dist/commands/backup/__tests__/disable.test.js +72 -75
- package/dist/commands/backup/__tests__/disable.test.js.map +1 -1
- package/dist/commands/backup/__tests__/download.test.js +169 -80
- package/dist/commands/backup/__tests__/download.test.js.map +1 -1
- package/dist/commands/backup/__tests__/enable.test.js +109 -140
- package/dist/commands/backup/__tests__/enable.test.js.map +1 -1
- package/dist/commands/backup/__tests__/list.test.js +84 -75
- package/dist/commands/backup/__tests__/list.test.js.map +1 -1
- package/dist/commands/backup/disable.js +5 -11
- package/dist/commands/backup/disable.js.map +1 -1
- package/dist/commands/backup/enable.js +5 -11
- package/dist/commands/backup/enable.js.map +1 -1
- package/dist/commands/backup/list.js +7 -8
- package/dist/commands/backup/list.js.map +1 -1
- package/dist/commands/cors/__tests__/add.test.js +68 -38
- package/dist/commands/cors/__tests__/add.test.js.map +1 -1
- package/dist/commands/cors/__tests__/delete.test.js +52 -37
- package/dist/commands/cors/__tests__/delete.test.js.map +1 -1
- package/dist/commands/cors/__tests__/list.test.js +80 -57
- package/dist/commands/cors/__tests__/list.test.js.map +1 -1
- package/dist/commands/cors/add.js +5 -13
- package/dist/commands/cors/add.js.map +1 -1
- package/dist/commands/cors/delete.js +7 -15
- package/dist/commands/cors/delete.js.map +1 -1
- package/dist/commands/cors/list.js +2 -10
- package/dist/commands/cors/list.js.map +1 -1
- package/dist/commands/dataset/__tests__/copy.test.js +197 -89
- package/dist/commands/dataset/__tests__/copy.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/create.test.js +147 -117
- package/dist/commands/dataset/__tests__/create.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/delete.test.js +75 -68
- package/dist/commands/dataset/__tests__/delete.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/export.test.js +123 -83
- package/dist/commands/dataset/__tests__/export.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/import.test.js +2 -2
- package/dist/commands/dataset/__tests__/import.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/list.test.js +107 -65
- package/dist/commands/dataset/__tests__/list.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/create.test.js +114 -74
- package/dist/commands/dataset/alias/__tests__/create.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/delete.test.js +40 -29
- package/dist/commands/dataset/alias/__tests__/delete.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/link.test.js +114 -74
- package/dist/commands/dataset/alias/__tests__/link.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/unlink.test.js +44 -29
- package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +1 -1
- package/dist/commands/dataset/export.js +4 -4
- package/dist/commands/dataset/export.js.map +1 -1
- package/dist/commands/dataset/visibility/__tests__/get.test.js +48 -67
- package/dist/commands/dataset/visibility/__tests__/get.test.js.map +1 -1
- package/dist/commands/dataset/visibility/__tests__/set.test.js +76 -123
- package/dist/commands/dataset/visibility/__tests__/set.test.js.map +1 -1
- package/dist/commands/dev.js +0 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/docs/__tests__/search.test.js +8 -7
- package/dist/commands/docs/__tests__/search.test.js.map +1 -1
- package/dist/commands/documents/__tests__/create.test.js +328 -265
- package/dist/commands/documents/__tests__/create.test.js.map +1 -1
- package/dist/commands/documents/__tests__/delete.test.js +119 -87
- package/dist/commands/documents/__tests__/delete.test.js.map +1 -1
- package/dist/commands/documents/__tests__/get.test.js +68 -95
- package/dist/commands/documents/__tests__/get.test.js.map +1 -1
- package/dist/commands/documents/__tests__/query.test.js +87 -192
- package/dist/commands/documents/__tests__/query.test.js.map +1 -1
- package/dist/commands/documents/__tests__/validate.test.js +52 -29
- package/dist/commands/documents/__tests__/validate.test.js.map +1 -1
- package/dist/commands/documents/create.d.ts +1 -0
- package/dist/commands/documents/create.js +10 -9
- package/dist/commands/documents/create.js.map +1 -1
- package/dist/commands/documents/delete.js +2 -3
- package/dist/commands/documents/delete.js.map +1 -1
- package/dist/commands/documents/get.js +2 -3
- package/dist/commands/documents/get.js.map +1 -1
- package/dist/commands/documents/query.js +2 -3
- package/dist/commands/documents/query.js.map +1 -1
- package/dist/commands/documents/validate.js +0 -20
- package/dist/commands/documents/validate.js.map +1 -1
- package/dist/commands/graphql/__tests__/list.test.js +57 -45
- package/dist/commands/graphql/__tests__/list.test.js.map +1 -1
- package/dist/commands/graphql/__tests__/undeploy.test.js +85 -59
- package/dist/commands/graphql/__tests__/undeploy.test.js.map +1 -1
- package/dist/commands/graphql/list.js +2 -2
- package/dist/commands/graphql/list.js.map +1 -1
- package/dist/commands/graphql/undeploy.js +4 -9
- package/dist/commands/graphql/undeploy.js.map +1 -1
- package/dist/commands/hook/__tests__/attempt.test.js +48 -33
- package/dist/commands/hook/__tests__/attempt.test.js.map +1 -1
- package/dist/commands/hook/__tests__/create.test.js +49 -51
- package/dist/commands/hook/__tests__/create.test.js.map +1 -1
- package/dist/commands/hook/__tests__/delete.test.js +43 -30
- package/dist/commands/hook/__tests__/delete.test.js.map +1 -1
- package/dist/commands/hook/__tests__/list.test.js +38 -31
- package/dist/commands/hook/__tests__/list.test.js.map +1 -1
- package/dist/commands/hook/__tests__/logs.test.js +68 -40
- package/dist/commands/hook/__tests__/logs.test.js.map +1 -1
- package/dist/commands/hook/create.js +2 -6
- package/dist/commands/hook/create.js.map +1 -1
- package/dist/commands/hook/delete.js +5 -17
- package/dist/commands/hook/delete.js.map +1 -1
- package/dist/commands/hook/list.js +2 -8
- package/dist/commands/hook/list.js.map +1 -1
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.js +151 -18
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/manifest/__tests__/extract.test.js +22 -13
- package/dist/commands/manifest/__tests__/extract.test.js.map +1 -1
- package/dist/commands/media/__tests__/create-aspect.test.js +41 -28
- package/dist/commands/media/__tests__/create-aspect.test.js.map +1 -1
- package/dist/commands/media/__tests__/delete-aspect.test.js +44 -35
- package/dist/commands/media/__tests__/delete-aspect.test.js.map +1 -1
- package/dist/commands/media/__tests__/deploy-aspect.test.js +67 -80
- package/dist/commands/media/__tests__/deploy-aspect.test.js.map +1 -1
- package/dist/commands/media/__tests__/export.test.js +365 -66
- package/dist/commands/media/__tests__/export.test.js.map +1 -1
- package/dist/commands/media/__tests__/import.test.js +171 -105
- package/dist/commands/media/__tests__/import.test.js.map +1 -1
- package/dist/commands/media/export.js +2 -2
- package/dist/commands/media/export.js.map +1 -1
- package/dist/commands/media/import.js +2 -2
- package/dist/commands/media/import.js.map +1 -1
- package/dist/commands/projects/__tests__/list.test.js +5 -4
- package/dist/commands/projects/__tests__/list.test.js.map +1 -1
- package/dist/commands/projects/list.js +2 -6
- package/dist/commands/projects/list.js.map +1 -1
- package/dist/commands/schema/__tests__/delete.test.js +396 -151
- package/dist/commands/schema/__tests__/delete.test.js.map +1 -1
- package/dist/commands/schema/__tests__/deploy.test.js +348 -0
- package/dist/commands/schema/__tests__/deploy.test.js.map +1 -0
- package/dist/commands/schema/__tests__/extract.test.js +19 -11
- package/dist/commands/schema/__tests__/extract.test.js.map +1 -1
- package/dist/commands/schema/__tests__/list.test.js +399 -0
- package/dist/commands/schema/__tests__/list.test.js.map +1 -0
- package/dist/commands/schema/__tests__/validate.test.js +27 -10
- package/dist/commands/schema/__tests__/validate.test.js.map +1 -1
- package/dist/commands/schema/delete.d.ts +1 -1
- package/dist/commands/schema/delete.js +20 -23
- package/dist/commands/schema/delete.js.map +1 -1
- package/dist/commands/schema/deploy.d.ts +16 -0
- package/dist/commands/schema/deploy.js +98 -0
- package/dist/commands/schema/deploy.js.map +1 -0
- package/dist/commands/schema/list.d.ts +15 -0
- package/dist/commands/schema/list.js +104 -0
- package/dist/commands/schema/list.js.map +1 -0
- package/dist/commands/telemetry/__tests__/disable.test.js +7 -5
- package/dist/commands/telemetry/__tests__/disable.test.js.map +1 -1
- package/dist/commands/telemetry/__tests__/enable.test.js +7 -5
- package/dist/commands/telemetry/__tests__/enable.test.js.map +1 -1
- package/dist/commands/telemetry/__tests__/status.test.js +7 -5
- package/dist/commands/telemetry/__tests__/status.test.js.map +1 -1
- package/dist/commands/tokens/__tests__/add.test.js +55 -40
- package/dist/commands/tokens/__tests__/add.test.js.map +1 -1
- package/dist/commands/tokens/__tests__/delete.test.js +72 -42
- package/dist/commands/tokens/__tests__/delete.test.js.map +1 -1
- package/dist/commands/tokens/__tests__/list.test.js +87 -60
- package/dist/commands/tokens/__tests__/list.test.js.map +1 -1
- package/dist/commands/tokens/add.js +3 -5
- package/dist/commands/tokens/add.js.map +1 -1
- package/dist/commands/users/__tests__/invite.test.js +100 -79
- package/dist/commands/users/__tests__/invite.test.js.map +1 -1
- package/dist/commands/users/__tests__/list.test.js +186 -180
- package/dist/commands/users/__tests__/list.test.js.map +1 -1
- package/dist/commands/users/invite.js +6 -17
- package/dist/commands/users/invite.js.map +1 -1
- package/dist/commands/users/list.js +4 -7
- package/dist/commands/users/list.js.map +1 -1
- package/dist/config/createCliConfig.d.ts +4 -4
- package/dist/services/backup.d.ts +8 -0
- package/dist/services/backup.js +19 -0
- package/dist/services/backup.js.map +1 -1
- package/dist/services/cors.d.ts +23 -0
- package/dist/services/cors.js +38 -0
- package/dist/services/cors.js.map +1 -0
- package/dist/services/graphql.d.ts +7 -0
- package/dist/services/graphql.js +11 -0
- package/dist/services/graphql.js.map +1 -1
- package/dist/services/hooks.d.ts +2 -0
- package/dist/services/hooks.js +19 -0
- package/dist/services/hooks.js.map +1 -1
- package/dist/services/organizations.d.ts +40 -0
- package/dist/services/organizations.js +41 -0
- package/dist/services/organizations.js.map +1 -0
- package/dist/services/projects.d.ts +31 -0
- package/dist/services/projects.js +71 -1
- package/dist/services/projects.js.map +1 -1
- package/dist/services/schemas.d.ts +4 -0
- package/dist/services/schemas.js +40 -0
- package/dist/services/schemas.js.map +1 -0
- package/dist/services/user.d.ts +10 -0
- package/dist/services/user.js +24 -0
- package/dist/services/user.js.map +1 -0
- package/dist/util/__tests__/getCliVersion.test.js +2 -2
- package/dist/util/__tests__/getCliVersion.test.js.map +1 -1
- package/dist/util/errorMessages.d.ts +1 -0
- package/dist/util/errorMessages.js +1 -0
- package/dist/util/errorMessages.js.map +1 -1
- package/dist/util/getCliVersion.js +1 -1
- package/dist/util/getCliVersion.js.map +1 -1
- package/dist/util/readPackageJson.d.ts +1 -15
- package/dist/util/readPackageJson.js +1 -1
- package/dist/util/readPackageJson.js.map +1 -1
- package/dist/util/uniqBy.d.ts +1 -0
- package/dist/util/uniqBy.js +14 -0
- package/dist/util/uniqBy.js.map +1 -0
- package/oclif.config.js +6 -1
- package/oclif.manifest.json +152 -158
- package/package.json +30 -31
- package/dist/actions/cors/constants.d.ts +0 -1
- package/dist/actions/cors/constants.js +0 -3
- package/dist/actions/cors/constants.js.map +0 -1
- package/dist/actions/cors/types.d.ts +0 -9
- package/dist/actions/cors/types.js +0 -3
- package/dist/actions/cors/types.js.map +0 -1
- package/dist/actions/migration/getMigrationRootDirectory.d.ts +0 -2
- package/dist/actions/migration/getMigrationRootDirectory.js +0 -14
- package/dist/actions/migration/getMigrationRootDirectory.js.map +0 -1
- package/dist/actions/migration/resolveMigrations.d.ts +0 -19
- package/dist/actions/migration/resolveMigrations.js +0 -43
- package/dist/actions/migration/resolveMigrations.js.map +0 -1
- package/dist/actions/migration/templates/__tests__/minimalAdvanced.test.js +0 -65
- package/dist/actions/migration/templates/__tests__/minimalAdvanced.test.js.map +0 -1
- package/dist/actions/migration/templates/__tests__/minimalSimple.test.js +0 -145
- package/dist/actions/migration/templates/__tests__/minimalSimple.test.js.map +0 -1
- package/dist/actions/migration/templates/__tests__/renameField.test.js +0 -63
- package/dist/actions/migration/templates/__tests__/renameField.test.js.map +0 -1
- package/dist/actions/migration/templates/__tests__/renameType.test.js +0 -61
- package/dist/actions/migration/templates/__tests__/renameType.test.js.map +0 -1
- package/dist/actions/migration/templates/__tests__/stringToPTE.test.js +0 -87
- package/dist/actions/migration/templates/__tests__/stringToPTE.test.js.map +0 -1
- package/dist/actions/migration/templates/index.d.ts +0 -5
- package/dist/actions/migration/templates/index.js +0 -7
- package/dist/actions/migration/templates/index.js.map +0 -1
- package/dist/actions/migration/templates/minimalAdvanced.d.ts +0 -4
- package/dist/actions/migration/templates/minimalAdvanced.js +0 -21
- package/dist/actions/migration/templates/minimalAdvanced.js.map +0 -1
- package/dist/actions/migration/templates/minimalSimple.d.ts +0 -4
- package/dist/actions/migration/templates/minimalSimple.js +0 -61
- package/dist/actions/migration/templates/minimalSimple.js.map +0 -1
- package/dist/actions/migration/templates/renameField.d.ts +0 -4
- package/dist/actions/migration/templates/renameField.js +0 -20
- package/dist/actions/migration/templates/renameField.js.map +0 -1
- package/dist/actions/migration/templates/renameType.d.ts +0 -4
- package/dist/actions/migration/templates/renameType.js +0 -19
- package/dist/actions/migration/templates/renameType.js.map +0 -1
- package/dist/actions/migration/templates/stringToPTE.d.ts +0 -4
- package/dist/actions/migration/templates/stringToPTE.js +0 -32
- package/dist/actions/migration/templates/stringToPTE.js.map +0 -1
- package/dist/actions/schema/__tests__/deleteSchemaAction.test.js +0 -294
- package/dist/actions/schema/__tests__/deleteSchemaAction.test.js.map +0 -1
- package/dist/actions/schema/schemaStoreConstants.d.ts +0 -1
- package/dist/actions/schema/schemaStoreConstants.js +0 -4
- package/dist/actions/schema/schemaStoreConstants.js.map +0 -1
- package/dist/actions/schema/utils/schemaActionHelpers.d.ts +0 -1
- package/dist/actions/schema/utils/schemaActionHelpers.js +0 -5
- package/dist/actions/schema/utils/schemaActionHelpers.js.map +0 -1
- package/dist/actions/schema/utils/schemaApiClient.d.ts +0 -6
- package/dist/actions/schema/utils/schemaApiClient.js +0 -17
- package/dist/actions/schema/utils/schemaApiClient.js.map +0 -1
- package/dist/actions/users/apiVersion.d.ts +0 -6
- package/dist/actions/users/apiVersion.js +0 -7
- package/dist/actions/users/apiVersion.js.map +0 -1
- package/dist/commands/__tests__/init.test.js +0 -411
- package/dist/commands/__tests__/init.test.js.map +0 -1
- package/dist/commands/migration/__tests__/create.test.js +0 -296
- package/dist/commands/migration/__tests__/create.test.js.map +0 -1
- package/dist/commands/migration/__tests__/list.test.js +0 -166
- package/dist/commands/migration/__tests__/list.test.js.map +0 -1
- package/dist/commands/migration/__tests__/run.test.js +0 -481
- package/dist/commands/migration/__tests__/run.test.js.map +0 -1
- package/dist/commands/migration/create.d.ts +0 -17
- package/dist/commands/migration/create.js +0 -143
- package/dist/commands/migration/create.js.map +0 -1
- package/dist/commands/migration/list.d.ts +0 -9
- package/dist/commands/migration/list.js +0 -61
- package/dist/commands/migration/list.js.map +0 -1
- package/dist/commands/migration/run.d.ts +0 -26
- package/dist/commands/migration/run.js +0 -271
- package/dist/commands/migration/run.js.map +0 -1
- package/dist/util/migration/constants.d.ts +0 -3
- package/dist/util/migration/constants.js +0 -10
- package/dist/util/migration/constants.js.map +0 -1
- package/dist/util/migration/ensureApiVersionFormat.d.ts +0 -9
- package/dist/util/migration/ensureApiVersionFormat.js +0 -16
- package/dist/util/migration/ensureApiVersionFormat.js.map +0 -1
- package/dist/util/migration/prettyMutationFormatter.d.ts +0 -8
- package/dist/util/migration/prettyMutationFormatter.js +0 -141
- package/dist/util/migration/prettyMutationFormatter.js.map +0 -1
- package/dist/utils/migration/resolveMigrationScript.d.ts +0 -44
- package/dist/utils/migration/resolveMigrationScript.js +0 -74
- package/dist/utils/migration/resolveMigrationScript.js.map +0 -1
- /package/dist/actions/auth/login/{index.d.ts → login.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/actions/auth/login/
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/auth/login/login.ts"],"sourcesContent":["import {getCliToken, getGlobalCliClient, type Output, setConfig} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport open from 'open'\n\nimport {canLaunchBrowser} from '../../../util/canLaunchBrowser.js'\nimport {startServerForTokenCallback} from '../authServer.js'\nimport {getProvider} from './getProvider.js'\n\nconst LOGIN_API_VERSION = '2024-02-01'\n\ninterface LoginOptions {\n output: Output\n\n experimental?: boolean\n open?: boolean\n provider?: string\n sso?: string\n}\n\n/**\n * Trigger the authentication flow for the CLI.\n *\n * NOTE: This uses terminal prompts and will not work for non-interactive/programmatic uses.\n *\n * @param options - Options for the login operation\n * @returns Promise that resolves when the login operation is complete\n * @throws Will throw if login fails or is cancelled\n * @internal\n */\nexport async function login(options: LoginOptions) {\n const {output} = options\n const previousToken = await getCliToken()\n const hasExistingToken = Boolean(previousToken)\n\n // @todo start telemetry trace\n\n // We explicitly want to use an unauthenticated client here, even if we already logged in\n const globalClient = await getGlobalCliClient({apiVersion: LOGIN_API_VERSION})\n const client = globalClient.withConfig({token: undefined})\n\n const provider = await getProvider({\n client,\n experimental: options.experimental,\n orgSlug: options.sso,\n specifiedProvider: options.provider,\n })\n\n // @todo trace.log({step: 'selectProvider', provider: provider?.name})\n\n if (provider === undefined) {\n throw new Error('No authentication providers found')\n }\n\n const {\n loginUrl,\n server,\n token: tokenPromise,\n } = await startServerForTokenCallback({client, providerUrl: provider.url})\n\n // @todo trace.log({step: 'waitForToken'})\n\n const serverUrl = server.address()\n if (!serverUrl || typeof serverUrl === 'string') {\n // Note: `serverUrl` is string only when binding to unix sockets,\n // thus we can safely assume Something Is Wrong™ if it's a string\n throw new Error('Failed to start auth callback server')\n }\n\n // Open a browser on the login page (or tell the user to)\n const shouldLaunchBrowser = canLaunchBrowser() && options.open !== false\n const actionText = shouldLaunchBrowser ? 'Opening browser at' : 'Please open a browser at'\n\n output.log(`\\n${actionText} ${loginUrl.href}\\n`)\n\n const spin = spinner('Waiting for browser login to complete... Press Ctrl + C to cancel').start()\n\n if (shouldLaunchBrowser) {\n open(loginUrl.href)\n }\n\n // Wait for a success/error on the HTTP callback server\n let authToken: string\n try {\n authToken = (await tokenPromise).token\n spin.stop()\n } catch (err: unknown) {\n spin.stop()\n // @todo trace.error(err)\n throw err instanceof Error\n ? new Error(`Login failed: ${err.message}`, {cause: err})\n : new Error(`${err}`)\n } finally {\n server.close()\n server.unref()\n }\n\n // Store the token\n await setConfig('authToken', authToken)\n\n // Clear cached telemetry consent\n await setConfig('telemetryConsent', undefined)\n\n // If we had a session previously, attempt to clear it\n if (hasExistingToken) {\n await globalClient\n .withConfig({token: previousToken})\n .request({method: 'POST', uri: '/auth/logout'})\n .catch((err) => {\n const statusCode = err && err.response && err.response.statusCode\n if (statusCode !== 401) {\n output.warn('Failed to invalidate previous session')\n }\n })\n }\n}\n"],"names":["getCliToken","getGlobalCliClient","setConfig","spinner","open","canLaunchBrowser","startServerForTokenCallback","getProvider","LOGIN_API_VERSION","login","options","output","previousToken","hasExistingToken","Boolean","globalClient","apiVersion","client","withConfig","token","undefined","provider","experimental","orgSlug","sso","specifiedProvider","Error","loginUrl","server","tokenPromise","providerUrl","url","serverUrl","address","shouldLaunchBrowser","actionText","log","href","spin","start","authToken","stop","err","message","cause","close","unref","request","method","uri","catch","statusCode","response","warn"],"mappings":"AAAA,SAAQA,WAAW,EAAEC,kBAAkB,EAAeC,SAAS,QAAO,mBAAkB;AACxF,SAAQC,OAAO,QAAO,sBAAqB;AAC3C,OAAOC,UAAU,OAAM;AAEvB,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,2BAA2B,QAAO,mBAAkB;AAC5D,SAAQC,WAAW,QAAO,mBAAkB;AAE5C,MAAMC,oBAAoB;AAW1B;;;;;;;;;CASC,GACD,OAAO,eAAeC,MAAMC,OAAqB;IAC/C,MAAM,EAACC,MAAM,EAAC,GAAGD;IACjB,MAAME,gBAAgB,MAAMZ;IAC5B,MAAMa,mBAAmBC,QAAQF;IAEjC,8BAA8B;IAE9B,yFAAyF;IACzF,MAAMG,eAAe,MAAMd,mBAAmB;QAACe,YAAYR;IAAiB;IAC5E,MAAMS,SAASF,aAAaG,UAAU,CAAC;QAACC,OAAOC;IAAS;IAExD,MAAMC,WAAW,MAAMd,YAAY;QACjCU;QACAK,cAAcZ,QAAQY,YAAY;QAClCC,SAASb,QAAQc,GAAG;QACpBC,mBAAmBf,QAAQW,QAAQ;IACrC;IAEA,sEAAsE;IAEtE,IAAIA,aAAaD,WAAW;QAC1B,MAAM,IAAIM,MAAM;IAClB;IAEA,MAAM,EACJC,QAAQ,EACRC,MAAM,EACNT,OAAOU,YAAY,EACpB,GAAG,MAAMvB,4BAA4B;QAACW;QAAQa,aAAaT,SAASU,GAAG;IAAA;IAExE,0CAA0C;IAE1C,MAAMC,YAAYJ,OAAOK,OAAO;IAChC,IAAI,CAACD,aAAa,OAAOA,cAAc,UAAU;QAC/C,iEAAiE;QACjE,iEAAiE;QACjE,MAAM,IAAIN,MAAM;IAClB;IAEA,yDAAyD;IACzD,MAAMQ,sBAAsB7B,sBAAsBK,QAAQN,IAAI,KAAK;IACnE,MAAM+B,aAAaD,sBAAsB,uBAAuB;IAEhEvB,OAAOyB,GAAG,CAAC,CAAC,EAAE,EAAED,WAAW,CAAC,EAAER,SAASU,IAAI,CAAC,EAAE,CAAC;IAE/C,MAAMC,OAAOnC,QAAQ,qEAAqEoC,KAAK;IAE/F,IAAIL,qBAAqB;QACvB9B,KAAKuB,SAASU,IAAI;IACpB;IAEA,uDAAuD;IACvD,IAAIG;IACJ,IAAI;QACFA,YAAY,AAAC,CAAA,MAAMX,YAAW,EAAGV,KAAK;QACtCmB,KAAKG,IAAI;IACX,EAAE,OAAOC,KAAc;QACrBJ,KAAKG,IAAI;QACT,yBAAyB;QACzB,MAAMC,eAAehB,QACjB,IAAIA,MAAM,CAAC,cAAc,EAAEgB,IAAIC,OAAO,EAAE,EAAE;YAACC,OAAOF;QAAG,KACrD,IAAIhB,MAAM,GAAGgB,KAAK;IACxB,SAAU;QACRd,OAAOiB,KAAK;QACZjB,OAAOkB,KAAK;IACd;IAEA,kBAAkB;IAClB,MAAM5C,UAAU,aAAasC;IAE7B,iCAAiC;IACjC,MAAMtC,UAAU,oBAAoBkB;IAEpC,sDAAsD;IACtD,IAAIP,kBAAkB;QACpB,MAAME,aACHG,UAAU,CAAC;YAACC,OAAOP;QAAa,GAChCmC,OAAO,CAAC;YAACC,QAAQ;YAAQC,KAAK;QAAc,GAC5CC,KAAK,CAAC,CAACR;YACN,MAAMS,aAAaT,OAAOA,IAAIU,QAAQ,IAAIV,IAAIU,QAAQ,CAACD,UAAU;YACjE,IAAIA,eAAe,KAAK;gBACtBxC,OAAO0C,IAAI,CAAC;YACd;QACF;IACJ;AACF"}
|
|
@@ -3,6 +3,7 @@ import { chalk, confirm, logSymbols, spinner } from '@sanity/cli-core/ux';
|
|
|
3
3
|
import semver from 'semver';
|
|
4
4
|
import { startDevServer } from '../../server/devServer.js';
|
|
5
5
|
import { gracefulServerDeath } from '../../server/gracefulServerDeath.js';
|
|
6
|
+
import { getProjectById } from '../../services/projects.js';
|
|
6
7
|
import { getAppId } from '../../util/appId.js';
|
|
7
8
|
import { compareDependencyVersions } from '../../util/compareDependencyVersions.js';
|
|
8
9
|
import { getPackageManagerChoice } from '../../util/packageManager/packageManagerChoice.js';
|
|
@@ -16,7 +17,7 @@ import { devDebug } from './devDebug.js';
|
|
|
16
17
|
import { getCoreAppURL } from './getCoreAppUrl.js';
|
|
17
18
|
import { getDevServerConfig } from './getDevServerConfig.js';
|
|
18
19
|
export async function startStudioDevServer(options) {
|
|
19
|
-
const {
|
|
20
|
+
const { cliConfig, flags, output, workDir } = options;
|
|
20
21
|
const projectId = cliConfig?.api?.projectId;
|
|
21
22
|
let organizationId;
|
|
22
23
|
const loadInDashboard = flags['load-in-dashboard'];
|
|
@@ -103,14 +104,8 @@ export async function startStudioDevServer(options) {
|
|
|
103
104
|
exit: 1
|
|
104
105
|
});
|
|
105
106
|
}
|
|
106
|
-
const client = await apiClient({
|
|
107
|
-
apiVersion: '2025-08-25',
|
|
108
|
-
requireUser: true
|
|
109
|
-
});
|
|
110
107
|
try {
|
|
111
|
-
const project = await
|
|
112
|
-
uri: `/projects/${projectId}`
|
|
113
|
-
});
|
|
108
|
+
const project = await getProjectById(projectId);
|
|
114
109
|
organizationId = project.organizationId;
|
|
115
110
|
} catch (error) {
|
|
116
111
|
devDebug('Error getting organization id from project id', error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/dev/startStudioDevServer.ts"],"sourcesContent":["import {isInteractive} from '@sanity/cli-core'\nimport {chalk, confirm, logSymbols, spinner} from '@sanity/cli-core/ux'\nimport semver from 'semver'\n\nimport {startDevServer} from '../../server/devServer.js'\nimport {gracefulServerDeath} from '../../server/gracefulServerDeath.js'\nimport {getAppId} from '../../util/appId.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {getPackageManagerChoice} from '../../util/packageManager/packageManagerChoice.js'\nimport {upgradePackages} from '../../util/packageManager/upgradePackages.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {checkRequiredDependencies} from '../build/checkRequiredDependencies.js'\nimport {checkStudioDependencyVersions} from '../build/checkStudioDependencyVersions.js'\nimport {shouldAutoUpdate} from '../build/shouldAutoUpdate.js'\nimport {devDebug} from './devDebug.js'\nimport {getCoreAppURL} from './getCoreAppUrl.js'\nimport {getDevServerConfig} from './getDevServerConfig.js'\nimport {type DevActionOptions} from './types.js'\n\nexport async function startStudioDevServer(\n options: DevActionOptions,\n): Promise<{close?: () => Promise<void>}> {\n const {apiClient, cliConfig, flags, output, workDir} = options\n const projectId = cliConfig?.api?.projectId\n let organizationId: string | undefined\n\n const loadInDashboard = flags['load-in-dashboard']\n\n // Check studio dependency versions\n await checkStudioDependencyVersions(workDir, output)\n\n const {installedSanityVersion} = await checkRequiredDependencies(options)\n\n // Check if auto-updates are enabled\n const autoUpdatesEnabled = shouldAutoUpdate({cliConfig, flags, output})\n\n if (autoUpdatesEnabled) {\n // Get the clean version without build metadata: https://semver.org/#spec-item-10\n const cleanSanityVersion = semver.parse(installedSanityVersion)?.version\n if (!cleanSanityVersion) {\n throw new Error(`Failed to parse installed Sanity version: ${installedSanityVersion}`)\n }\n\n const sanityDependencies = [\n {name: 'sanity', version: cleanSanityVersion},\n {name: '@sanity/vision', version: cleanSanityVersion},\n ]\n\n output.log(`${logSymbols.info} Running with auto-updates enabled`)\n\n // Check local versions against deployed versions\n let result: Awaited<ReturnType<typeof compareDependencyVersions>> | undefined\n\n const appId = getAppId(cliConfig)\n\n try {\n result = await compareDependencyVersions(sanityDependencies, workDir, {appId})\n } catch (err) {\n output.warn(`Failed to compare local versions against auto-updating versions: ${err}`)\n }\n\n if (!appId) {\n warnAboutMissingAppId({\n appType: 'studio',\n output,\n projectId,\n })\n }\n\n // mismatch between local and auto-updating dependencies\n if (result?.length) {\n const message =\n `The following local package versions are different from the versions currently served at runtime.\\n` +\n `When using auto updates, we recommend that you run with the same versions locally as will be used when deploying.\\n\\n` +\n `${result.map((mod) => ` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\\n')}\\n\\n`\n\n if (isInteractive()) {\n const shouldUpgrade = await confirm({\n default: true,\n message: chalk.yellow(`${message}Do you want to upgrade local versions?`),\n })\n if (shouldUpgrade) {\n await upgradePackages(\n {\n packageManager: (await getPackageManagerChoice(workDir, {interactive: false})).chosen,\n packages: result.map((res) => [res.pkg, res.remote]),\n },\n {output, workDir},\n )\n }\n } else {\n // In this case we warn the user but we don't ask them if they want to upgrade because it's not interactive.\n output.log(chalk.yellow(message))\n }\n }\n }\n\n const config = getDevServerConfig({cliConfig, flags, output, workDir})\n\n if (loadInDashboard) {\n if (!projectId) {\n output.error('Project Id is required to load in dashboard', {exit: 1})\n }\n\n const client = await apiClient({\n apiVersion: '2025-08-25',\n requireUser: true,\n })\n\n try {\n const project = await client.request<{organizationId: string}>({\n uri: `/projects/${projectId}`,\n })\n organizationId = project.organizationId\n } catch (error) {\n devDebug('Error getting organization id from project id', error)\n output.error('Failed to get organization id from project id', {exit: 1})\n }\n }\n\n try {\n const startTime = Date.now()\n const spin = spinner('Starting dev server').start()\n const {close, server} = await startDevServer(config)\n\n const {info: loggerInfo} = server.config.logger\n const {port} = server.config.server\n const httpHost = config.httpHost || 'localhost'\n\n if (loadInDashboard) {\n spin.succeed()\n\n output.log(`Dev server started on port ${port}`)\n output.log(`View your studio in the Sanity dashboard here:`)\n output.log(\n chalk.blue(\n chalk.underline(\n getCoreAppURL({\n httpHost,\n httpPort: port,\n organizationId: organizationId!,\n }),\n ),\n ),\n )\n } else {\n const startupDuration = Date.now() - startTime\n const url = `http://${httpHost || 'localhost'}:${port}${config.basePath}`\n const appType = 'Sanity Studio'\n\n const viteVersion = await readModuleVersion(import.meta.url, 'vite')\n spin.succeed()\n\n loggerInfo(\n `${appType} ` +\n `using ${chalk.cyan(`vite@${viteVersion}`)} ` +\n `ready in ${chalk.cyan(`${Math.ceil(startupDuration)}ms`)} ` +\n `and running at ${chalk.cyan(url)}`,\n )\n }\n\n return {close}\n } catch (err) {\n devDebug('Error starting studio dev server', err)\n throw gracefulServerDeath('dev', config.httpHost, config.httpPort, err)\n }\n}\n"],"names":["isInteractive","chalk","confirm","logSymbols","spinner","semver","startDevServer","gracefulServerDeath","getAppId","compareDependencyVersions","getPackageManagerChoice","upgradePackages","readModuleVersion","warnAboutMissingAppId","checkRequiredDependencies","checkStudioDependencyVersions","shouldAutoUpdate","devDebug","getCoreAppURL","getDevServerConfig","startStudioDevServer","options","apiClient","cliConfig","flags","output","workDir","projectId","api","organizationId","loadInDashboard","installedSanityVersion","autoUpdatesEnabled","cleanSanityVersion","parse","version","Error","sanityDependencies","name","log","info","result","appId","err","warn","appType","length","message","map","mod","pkg","installed","remote","join","shouldUpgrade","default","yellow","packageManager","interactive","chosen","packages","res","config","error","exit","client","apiVersion","requireUser","project","request","uri","startTime","Date","now","spin","start","close","server","loggerInfo","logger","port","httpHost","succeed","blue","underline","httpPort","startupDuration","url","basePath","viteVersion","cyan","Math","ceil"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/dev/startStudioDevServer.ts"],"sourcesContent":["import {isInteractive} from '@sanity/cli-core'\nimport {chalk, confirm, logSymbols, spinner} from '@sanity/cli-core/ux'\nimport semver from 'semver'\n\nimport {startDevServer} from '../../server/devServer.js'\nimport {gracefulServerDeath} from '../../server/gracefulServerDeath.js'\nimport {getProjectById} from '../../services/projects.js'\nimport {getAppId} from '../../util/appId.js'\nimport {compareDependencyVersions} from '../../util/compareDependencyVersions.js'\nimport {getPackageManagerChoice} from '../../util/packageManager/packageManagerChoice.js'\nimport {upgradePackages} from '../../util/packageManager/upgradePackages.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\nimport {warnAboutMissingAppId} from '../../util/warnAboutMissingAppId.js'\nimport {checkRequiredDependencies} from '../build/checkRequiredDependencies.js'\nimport {checkStudioDependencyVersions} from '../build/checkStudioDependencyVersions.js'\nimport {shouldAutoUpdate} from '../build/shouldAutoUpdate.js'\nimport {devDebug} from './devDebug.js'\nimport {getCoreAppURL} from './getCoreAppUrl.js'\nimport {getDevServerConfig} from './getDevServerConfig.js'\nimport {type DevActionOptions} from './types.js'\n\nexport async function startStudioDevServer(\n options: DevActionOptions,\n): Promise<{close?: () => Promise<void>}> {\n const {cliConfig, flags, output, workDir} = options\n const projectId = cliConfig?.api?.projectId\n let organizationId: string | undefined\n\n const loadInDashboard = flags['load-in-dashboard']\n\n // Check studio dependency versions\n await checkStudioDependencyVersions(workDir, output)\n\n const {installedSanityVersion} = await checkRequiredDependencies(options)\n\n // Check if auto-updates are enabled\n const autoUpdatesEnabled = shouldAutoUpdate({cliConfig, flags, output})\n\n if (autoUpdatesEnabled) {\n // Get the clean version without build metadata: https://semver.org/#spec-item-10\n const cleanSanityVersion = semver.parse(installedSanityVersion)?.version\n if (!cleanSanityVersion) {\n throw new Error(`Failed to parse installed Sanity version: ${installedSanityVersion}`)\n }\n\n const sanityDependencies = [\n {name: 'sanity', version: cleanSanityVersion},\n {name: '@sanity/vision', version: cleanSanityVersion},\n ]\n\n output.log(`${logSymbols.info} Running with auto-updates enabled`)\n\n // Check local versions against deployed versions\n let result: Awaited<ReturnType<typeof compareDependencyVersions>> | undefined\n\n const appId = getAppId(cliConfig)\n\n try {\n result = await compareDependencyVersions(sanityDependencies, workDir, {appId})\n } catch (err) {\n output.warn(`Failed to compare local versions against auto-updating versions: ${err}`)\n }\n\n if (!appId) {\n warnAboutMissingAppId({\n appType: 'studio',\n output,\n projectId,\n })\n }\n\n // mismatch between local and auto-updating dependencies\n if (result?.length) {\n const message =\n `The following local package versions are different from the versions currently served at runtime.\\n` +\n `When using auto updates, we recommend that you run with the same versions locally as will be used when deploying.\\n\\n` +\n `${result.map((mod) => ` - ${mod.pkg} (local version: ${mod.installed}, runtime version: ${mod.remote})`).join('\\n')}\\n\\n`\n\n if (isInteractive()) {\n const shouldUpgrade = await confirm({\n default: true,\n message: chalk.yellow(`${message}Do you want to upgrade local versions?`),\n })\n if (shouldUpgrade) {\n await upgradePackages(\n {\n packageManager: (await getPackageManagerChoice(workDir, {interactive: false})).chosen,\n packages: result.map((res) => [res.pkg, res.remote]),\n },\n {output, workDir},\n )\n }\n } else {\n // In this case we warn the user but we don't ask them if they want to upgrade because it's not interactive.\n output.log(chalk.yellow(message))\n }\n }\n }\n\n const config = getDevServerConfig({cliConfig, flags, output, workDir})\n\n if (loadInDashboard) {\n if (!projectId) {\n output.error('Project Id is required to load in dashboard', {exit: 1})\n }\n\n try {\n const project = await getProjectById(projectId!)\n organizationId = project.organizationId!\n } catch (error) {\n devDebug('Error getting organization id from project id', error)\n output.error('Failed to get organization id from project id', {exit: 1})\n }\n }\n\n try {\n const startTime = Date.now()\n const spin = spinner('Starting dev server').start()\n const {close, server} = await startDevServer(config)\n\n const {info: loggerInfo} = server.config.logger\n const {port} = server.config.server\n const httpHost = config.httpHost || 'localhost'\n\n if (loadInDashboard) {\n spin.succeed()\n\n output.log(`Dev server started on port ${port}`)\n output.log(`View your studio in the Sanity dashboard here:`)\n output.log(\n chalk.blue(\n chalk.underline(\n getCoreAppURL({\n httpHost,\n httpPort: port,\n organizationId: organizationId!,\n }),\n ),\n ),\n )\n } else {\n const startupDuration = Date.now() - startTime\n const url = `http://${httpHost || 'localhost'}:${port}${config.basePath}`\n const appType = 'Sanity Studio'\n\n const viteVersion = await readModuleVersion(import.meta.url, 'vite')\n spin.succeed()\n\n loggerInfo(\n `${appType} ` +\n `using ${chalk.cyan(`vite@${viteVersion}`)} ` +\n `ready in ${chalk.cyan(`${Math.ceil(startupDuration)}ms`)} ` +\n `and running at ${chalk.cyan(url)}`,\n )\n }\n\n return {close}\n } catch (err) {\n devDebug('Error starting studio dev server', err)\n throw gracefulServerDeath('dev', config.httpHost, config.httpPort, err)\n }\n}\n"],"names":["isInteractive","chalk","confirm","logSymbols","spinner","semver","startDevServer","gracefulServerDeath","getProjectById","getAppId","compareDependencyVersions","getPackageManagerChoice","upgradePackages","readModuleVersion","warnAboutMissingAppId","checkRequiredDependencies","checkStudioDependencyVersions","shouldAutoUpdate","devDebug","getCoreAppURL","getDevServerConfig","startStudioDevServer","options","cliConfig","flags","output","workDir","projectId","api","organizationId","loadInDashboard","installedSanityVersion","autoUpdatesEnabled","cleanSanityVersion","parse","version","Error","sanityDependencies","name","log","info","result","appId","err","warn","appType","length","message","map","mod","pkg","installed","remote","join","shouldUpgrade","default","yellow","packageManager","interactive","chosen","packages","res","config","error","exit","project","startTime","Date","now","spin","start","close","server","loggerInfo","logger","port","httpHost","succeed","blue","underline","httpPort","startupDuration","url","basePath","viteVersion","cyan","Math","ceil"],"mappings":"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"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { type CliConfig, type
|
|
2
|
-
import { type SanityClient } from '@sanity/client';
|
|
1
|
+
import { type CliConfig, type Output } from '@sanity/cli-core';
|
|
3
2
|
import { type DevCommand } from '../../commands/dev.js';
|
|
4
3
|
export type DevFlags = DevCommand['flags'];
|
|
5
4
|
export interface DevActionOptions {
|
|
6
|
-
apiClient: (args: GlobalCliClientOptions) => Promise<SanityClient>;
|
|
7
5
|
cliConfig: CliConfig;
|
|
8
6
|
flags: DevFlags;
|
|
9
7
|
isApp: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/dev/types.ts"],"sourcesContent":["import {type CliConfig, type
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/dev/types.ts"],"sourcesContent":["import {type CliConfig, type Output} from '@sanity/cli-core'\n\nimport {type DevCommand} from '../../commands/dev.js'\n\nexport type DevFlags = DevCommand['flags']\n\nexport interface DevActionOptions {\n cliConfig: CliConfig\n flags: DevFlags\n isApp: boolean\n output: Output\n workDir: string\n}\n"],"names":[],"mappings":"AAMA,WAMC"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { type ClientConfig } from '@sanity/client';
|
|
2
1
|
import { type ValidationMarker } from '@sanity/types';
|
|
3
2
|
import { type ValidationWorkerChannel } from '../../threads/validateDocuments.js';
|
|
4
3
|
import { type WorkerChannelReceiver } from '../../util/workerChannels.js';
|
|
5
4
|
import { Level } from './types.js';
|
|
6
5
|
interface ValidateDocumentsOptions<TReturn = unknown> {
|
|
7
|
-
clientConfig: ClientConfig;
|
|
8
6
|
dataset?: string;
|
|
9
7
|
level?: Level;
|
|
10
8
|
maxCustomValidationConcurrency?: number;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
import { Worker } from 'node:worker_threads';
|
|
4
|
+
import { getGlobalCliClient } from '@sanity/cli-core';
|
|
4
5
|
import { readPackageUp } from 'read-package-up';
|
|
5
6
|
import { createReceiver } from '../../util/workerChannels.js';
|
|
7
|
+
import { DOCUMENTS_API_VERSION } from './constants.js';
|
|
6
8
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
9
|
const defaultReporter = ({ dispose, stream })=>{
|
|
8
10
|
async function* createValidationGenerator() {
|
|
@@ -21,7 +23,11 @@ const defaultReporter = ({ dispose, stream })=>{
|
|
|
21
23
|
return createValidationGenerator();
|
|
22
24
|
};
|
|
23
25
|
export async function validateDocuments(options) {
|
|
24
|
-
const {
|
|
26
|
+
const { dataset, level, maxCustomValidationConcurrency, maxFetchConcurrency, ndjsonFilePath, projectId, reporter = defaultReporter, workDir = process.cwd(), workspace } = options;
|
|
27
|
+
const apiClient = await getGlobalCliClient({
|
|
28
|
+
apiVersion: DOCUMENTS_API_VERSION,
|
|
29
|
+
requireUser: true
|
|
30
|
+
});
|
|
25
31
|
const rootPkgPath = (await readPackageUp({
|
|
26
32
|
cwd: __dirname
|
|
27
33
|
}))?.path;
|
|
@@ -29,6 +35,20 @@ export async function validateDocuments(options) {
|
|
|
29
35
|
throw new Error('Could not find root directory for `sanity` package');
|
|
30
36
|
}
|
|
31
37
|
const workerPath = path.join(path.dirname(rootPkgPath), 'dist', 'threads', 'validateDocuments.js');
|
|
38
|
+
const clientConfig = {
|
|
39
|
+
...apiClient.config(),
|
|
40
|
+
// we set this explictly to true because we pass in a token via the
|
|
41
|
+
// `clientConfiguration` object and also mock a browser environment in
|
|
42
|
+
// this worker which triggers the browser warning
|
|
43
|
+
ignoreBrowserTokenWarning: true,
|
|
44
|
+
// Removing from object so config can be serialized
|
|
45
|
+
// before sent to validation worker
|
|
46
|
+
requester: undefined,
|
|
47
|
+
// we set this explictly to true because the default client configuration
|
|
48
|
+
// from the CLI comes configured with `useProjectHostname: false` when
|
|
49
|
+
// `requireProject` is set to false
|
|
50
|
+
useProjectHostname: true
|
|
51
|
+
};
|
|
32
52
|
const worker = new Worker(workerPath, {
|
|
33
53
|
env: process.env,
|
|
34
54
|
workerData: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/documents/validate.ts"],"sourcesContent":["import path from 'node:path'\nimport {fileURLToPath} from 'node:url'\nimport {Worker} from 'node:worker_threads'\n\nimport {type ClientConfig} from '@sanity/client'\nimport {type ValidationMarker} from '@sanity/types'\nimport {readPackageUp} from 'read-package-up'\n\nimport {\n type ValidateDocumentsWorkerData,\n type ValidationWorkerChannel,\n} from '../../threads/validateDocuments.js'\nimport {createReceiver, type WorkerChannelReceiver} from '../../util/workerChannels.js'\nimport {Level} from './types.js'\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\ninterface ValidateDocumentsOptions<TReturn = unknown> {\n
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/documents/validate.ts"],"sourcesContent":["import path from 'node:path'\nimport {fileURLToPath} from 'node:url'\nimport {Worker} from 'node:worker_threads'\n\nimport {getGlobalCliClient} from '@sanity/cli-core'\nimport {type ClientConfig} from '@sanity/client'\nimport {type ValidationMarker} from '@sanity/types'\nimport {readPackageUp} from 'read-package-up'\n\nimport {\n type ValidateDocumentsWorkerData,\n type ValidationWorkerChannel,\n} from '../../threads/validateDocuments.js'\nimport {createReceiver, type WorkerChannelReceiver} from '../../util/workerChannels.js'\nimport {DOCUMENTS_API_VERSION} from './constants.js'\nimport {Level} from './types.js'\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\ninterface ValidateDocumentsOptions<TReturn = unknown> {\n dataset?: string // override\n level?: Level\n maxCustomValidationConcurrency?: number\n maxFetchConcurrency?: number\n ndjsonFilePath?: string\n projectId?: string // override\n reporter?: (worker: WorkerChannelReceiver<ValidationWorkerChannel>) => TReturn\n studioHost?: string\n workDir?: string\n workspace?: string\n}\n\ninterface DocumentValidationResult {\n documentId: string\n documentType: string\n level: ValidationMarker['level']\n markers: ValidationMarker[]\n revision: string\n}\n\nconst defaultReporter = ({dispose, stream}: WorkerChannelReceiver<ValidationWorkerChannel>) => {\n async function* createValidationGenerator() {\n for await (const {documentId, documentType, level, markers, revision} of stream.validation()) {\n const result: DocumentValidationResult = {\n documentId,\n documentType,\n level,\n markers,\n revision,\n }\n\n yield result\n }\n\n await dispose()\n }\n\n return createValidationGenerator()\n}\n\nexport function validateDocuments<TReturn>(\n options: Required<Pick<ValidateDocumentsOptions<TReturn>, 'reporter'>> &\n ValidateDocumentsOptions<TReturn>,\n): Promise<TReturn>\nexport function validateDocuments(\n options: ValidateDocumentsOptions,\n): Promise<AsyncIterable<DocumentValidationResult>>\nexport async function validateDocuments(options: ValidateDocumentsOptions): Promise<unknown> {\n const {\n dataset,\n level,\n maxCustomValidationConcurrency,\n maxFetchConcurrency,\n ndjsonFilePath,\n projectId,\n reporter = defaultReporter,\n workDir = process.cwd(),\n workspace,\n } = options\n\n const apiClient = await getGlobalCliClient({\n apiVersion: DOCUMENTS_API_VERSION,\n requireUser: true,\n })\n\n const rootPkgPath = (await readPackageUp({cwd: __dirname}))?.path\n\n if (!rootPkgPath) {\n throw new Error('Could not find root directory for `sanity` package')\n }\n\n const workerPath = path.join(path.dirname(rootPkgPath), 'dist', 'threads', 'validateDocuments.js')\n\n const clientConfig: ClientConfig = {\n ...apiClient.config(),\n // we set this explictly to true because we pass in a token via the\n // `clientConfiguration` object and also mock a browser environment in\n // this worker which triggers the browser warning\n ignoreBrowserTokenWarning: true,\n // Removing from object so config can be serialized\n // before sent to validation worker\n requester: undefined,\n // we set this explictly to true because the default client configuration\n // from the CLI comes configured with `useProjectHostname: false` when\n // `requireProject` is set to false\n useProjectHostname: true,\n }\n\n const worker = new Worker(workerPath, {\n env: process.env,\n workerData: {\n // removes props in the config that make this object fail to serialize\n clientConfig: structuredClone(clientConfig),\n dataset,\n level,\n maxCustomValidationConcurrency,\n maxFetchConcurrency,\n ndjsonFilePath,\n projectId,\n studioHost: options.studioHost,\n workDir,\n workspace,\n } satisfies ValidateDocumentsWorkerData,\n })\n\n return reporter(createReceiver<ValidationWorkerChannel>(worker))\n}\n"],"names":["path","fileURLToPath","Worker","getGlobalCliClient","readPackageUp","createReceiver","DOCUMENTS_API_VERSION","__dirname","dirname","url","defaultReporter","dispose","stream","createValidationGenerator","documentId","documentType","level","markers","revision","validation","result","validateDocuments","options","dataset","maxCustomValidationConcurrency","maxFetchConcurrency","ndjsonFilePath","projectId","reporter","workDir","process","cwd","workspace","apiClient","apiVersion","requireUser","rootPkgPath","Error","workerPath","join","clientConfig","config","ignoreBrowserTokenWarning","requester","undefined","useProjectHostname","worker","env","workerData","structuredClone","studioHost"],"mappings":"AAAA,OAAOA,UAAU,YAAW;AAC5B,SAAQC,aAAa,QAAO,WAAU;AACtC,SAAQC,MAAM,QAAO,sBAAqB;AAE1C,SAAQC,kBAAkB,QAAO,mBAAkB;AAGnD,SAAQC,aAAa,QAAO,kBAAiB;AAM7C,SAAQC,cAAc,QAAmC,+BAA8B;AACvF,SAAQC,qBAAqB,QAAO,iBAAgB;AAGpD,MAAMC,YAAYP,KAAKQ,OAAO,CAACP,cAAc,YAAYQ,GAAG;AAuB5D,MAAMC,kBAAkB,CAAC,EAACC,OAAO,EAAEC,MAAM,EAAiD;IACxF,gBAAgBC;QACd,WAAW,MAAM,EAACC,UAAU,EAAEC,YAAY,EAAEC,KAAK,EAAEC,OAAO,EAAEC,QAAQ,EAAC,IAAIN,OAAOO,UAAU,GAAI;YAC5F,MAAMC,SAAmC;gBACvCN;gBACAC;gBACAC;gBACAC;gBACAC;YACF;YAEA,MAAME;QACR;QAEA,MAAMT;IACR;IAEA,OAAOE;AACT;AASA,OAAO,eAAeQ,kBAAkBC,OAAiC;IACvE,MAAM,EACJC,OAAO,EACPP,KAAK,EACLQ,8BAA8B,EAC9BC,mBAAmB,EACnBC,cAAc,EACdC,SAAS,EACTC,WAAWlB,eAAe,EAC1BmB,UAAUC,QAAQC,GAAG,EAAE,EACvBC,SAAS,EACV,GAAGV;IAEJ,MAAMW,YAAY,MAAM9B,mBAAmB;QACzC+B,YAAY5B;QACZ6B,aAAa;IACf;IAEA,MAAMC,cAAe,CAAA,MAAMhC,cAAc;QAAC2B,KAAKxB;IAAS,EAAC,GAAIP;IAE7D,IAAI,CAACoC,aAAa;QAChB,MAAM,IAAIC,MAAM;IAClB;IAEA,MAAMC,aAAatC,KAAKuC,IAAI,CAACvC,KAAKQ,OAAO,CAAC4B,cAAc,QAAQ,WAAW;IAE3E,MAAMI,eAA6B;QACjC,GAAGP,UAAUQ,MAAM,EAAE;QACrB,mEAAmE;QACnE,sEAAsE;QACtE,iDAAiD;QACjDC,2BAA2B;QAC3B,mDAAmD;QACnD,mCAAmC;QACnCC,WAAWC;QACX,yEAAyE;QACzE,sEAAsE;QACtE,mCAAmC;QACnCC,oBAAoB;IACtB;IAEA,MAAMC,SAAS,IAAI5C,OAAOoC,YAAY;QACpCS,KAAKjB,QAAQiB,GAAG;QAChBC,YAAY;YACV,sEAAsE;YACtER,cAAcS,gBAAgBT;YAC9BjB;YACAP;YACAQ;YACAC;YACAC;YACAC;YACAuB,YAAY5B,QAAQ4B,UAAU;YAC9BrB;YACAG;QACF;IACF;IAEA,OAAOJ,SAASvB,eAAwCyC;AAC1D"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
import fs from 'node:fs/promises';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
-
import { packageDirectory } from '
|
|
4
|
+
import { packageDirectory } from 'package-directory';
|
|
5
5
|
export async function execScript(options) {
|
|
6
6
|
const { extraArguments, flags, scriptPath, workDir } = options;
|
|
7
7
|
const mockBrowserEnv = flags['mock-browser-env'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/exec/execScript.ts"],"sourcesContent":["import {spawn} from 'node:child_process'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport {packageDirectory} from '
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/exec/execScript.ts"],"sourcesContent":["import {spawn} from 'node:child_process'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport {packageDirectory} from 'package-directory'\n\ninterface ExecScriptOptions {\n extraArguments: string[]\n flags: {\n 'mock-browser-env': boolean\n 'with-user-token': boolean\n }\n scriptPath: string\n workDir: string\n}\n\nexport async function execScript(options: ExecScriptOptions): Promise<void> {\n const {extraArguments, flags, scriptPath, workDir} = options\n const mockBrowserEnv = flags['mock-browser-env']\n const withUserToken = flags['with-user-token']\n\n const resolvedScriptPath = path.resolve(scriptPath)\n\n const cliPkgDir = await packageDirectory({cwd: import.meta.dirname})\n if (!cliPkgDir) {\n throw new Error('Unable to resolve @sanity/cli module root')\n }\n\n const threadsDir = path.join(cliPkgDir, 'dist', 'threads')\n const browserEnvPath = path.join(threadsDir, 'registerBrowserEnv.js')\n const configClientPath = path.join(threadsDir, 'configClient.js')\n\n // Verify threads directory exists\n if (!(await fs.stat(threadsDir).catch(() => false))) {\n throw new Error('@sanity/cli module build error: missing threads directory')\n }\n\n // Use tsx loader for TypeScript support in the spawned child process\n // We need to resolve the tsx loader path from the CLI's node_modules since the child\n // process will run from the user's script directory where tsx may not be installed.\n let tsxLoaderPath: string\n try {\n // Resolve the tsx loader using Node's module resolution relative to package.json\n const tsxPackageUrl = import.meta.resolve('tsx/package.json', import.meta.url)\n tsxLoaderPath = new URL('dist/loader.mjs', tsxPackageUrl).pathname\n } catch {\n throw new Error('@sanity/cli not able to resolve tsx loader')\n }\n\n const baseArgs = mockBrowserEnv\n ? ['--import', tsxLoaderPath, '--import', browserEnvPath]\n : ['--import', tsxLoaderPath]\n const tokenArgs = withUserToken ? ['--import', configClientPath] : []\n\n const nodeArgs = [...baseArgs, ...tokenArgs, resolvedScriptPath, ...extraArguments]\n\n const proc = spawn(process.argv[0], nodeArgs, {\n env: {\n ...process.env,\n SANITY_BASE_PATH: workDir,\n },\n stdio: 'inherit',\n })\n return new Promise<void>((resolve, reject) => {\n proc.on('exit', (code, signal) => {\n if (signal) reject(new Error(`Script terminated by signal: ${signal}`))\n else if (code && code !== 0) reject(new Error(`Script exited with code: ${code}`))\n else resolve()\n })\n proc.on('error', reject)\n process.on('exit', () => proc.kill())\n process.on('SIGINT', () => proc.kill('SIGINT'))\n process.on('SIGTERM', () => proc.kill('SIGTERM'))\n })\n}\n"],"names":["spawn","fs","path","packageDirectory","execScript","options","extraArguments","flags","scriptPath","workDir","mockBrowserEnv","withUserToken","resolvedScriptPath","resolve","cliPkgDir","cwd","dirname","Error","threadsDir","join","browserEnvPath","configClientPath","stat","catch","tsxLoaderPath","tsxPackageUrl","url","URL","pathname","baseArgs","tokenArgs","nodeArgs","proc","process","argv","env","SANITY_BASE_PATH","stdio","Promise","reject","on","code","signal","kill"],"mappings":"AAAA,SAAQA,KAAK,QAAO,qBAAoB;AACxC,OAAOC,QAAQ,mBAAkB;AACjC,OAAOC,UAAU,YAAW;AAE5B,SAAQC,gBAAgB,QAAO,oBAAmB;AAYlD,OAAO,eAAeC,WAAWC,OAA0B;IACzD,MAAM,EAACC,cAAc,EAAEC,KAAK,EAAEC,UAAU,EAAEC,OAAO,EAAC,GAAGJ;IACrD,MAAMK,iBAAiBH,KAAK,CAAC,mBAAmB;IAChD,MAAMI,gBAAgBJ,KAAK,CAAC,kBAAkB;IAE9C,MAAMK,qBAAqBV,KAAKW,OAAO,CAACL;IAExC,MAAMM,YAAY,MAAMX,iBAAiB;QAACY,KAAK,YAAYC,OAAO;IAAA;IAClE,IAAI,CAACF,WAAW;QACd,MAAM,IAAIG,MAAM;IAClB;IAEA,MAAMC,aAAahB,KAAKiB,IAAI,CAACL,WAAW,QAAQ;IAChD,MAAMM,iBAAiBlB,KAAKiB,IAAI,CAACD,YAAY;IAC7C,MAAMG,mBAAmBnB,KAAKiB,IAAI,CAACD,YAAY;IAE/C,kCAAkC;IAClC,IAAI,CAAE,MAAMjB,GAAGqB,IAAI,CAACJ,YAAYK,KAAK,CAAC,IAAM,QAAS;QACnD,MAAM,IAAIN,MAAM;IAClB;IAEA,qEAAqE;IACrE,qFAAqF;IACrF,oFAAoF;IACpF,IAAIO;IACJ,IAAI;QACF,iFAAiF;QACjF,MAAMC,gBAAgB,YAAYZ,OAAO,CAAC,oBAAoB,YAAYa,GAAG;QAC7EF,gBAAgB,IAAIG,IAAI,mBAAmBF,eAAeG,QAAQ;IACpE,EAAE,OAAM;QACN,MAAM,IAAIX,MAAM;IAClB;IAEA,MAAMY,WAAWnB,iBACb;QAAC;QAAYc;QAAe;QAAYJ;KAAe,GACvD;QAAC;QAAYI;KAAc;IAC/B,MAAMM,YAAYnB,gBAAgB;QAAC;QAAYU;KAAiB,GAAG,EAAE;IAErE,MAAMU,WAAW;WAAIF;WAAaC;QAAWlB;WAAuBN;KAAe;IAEnF,MAAM0B,OAAOhC,MAAMiC,QAAQC,IAAI,CAAC,EAAE,EAAEH,UAAU;QAC5CI,KAAK;YACH,GAAGF,QAAQE,GAAG;YACdC,kBAAkB3B;QACpB;QACA4B,OAAO;IACT;IACA,OAAO,IAAIC,QAAc,CAACzB,SAAS0B;QACjCP,KAAKQ,EAAE,CAAC,QAAQ,CAACC,MAAMC;YACrB,IAAIA,QAAQH,OAAO,IAAItB,MAAM,CAAC,6BAA6B,EAAEyB,QAAQ;iBAChE,IAAID,QAAQA,SAAS,GAAGF,OAAO,IAAItB,MAAM,CAAC,yBAAyB,EAAEwB,MAAM;iBAC3E5B;QACP;QACAmB,KAAKQ,EAAE,CAAC,SAASD;QACjBN,QAAQO,EAAE,CAAC,QAAQ,IAAMR,KAAKW,IAAI;QAClCV,QAAQO,EAAE,CAAC,UAAU,IAAMR,KAAKW,IAAI,CAAC;QACrCV,QAAQO,EAAE,CAAC,WAAW,IAAMR,KAAKW,IAAI,CAAC;IACxC;AACF"}
|
|
@@ -16,7 +16,7 @@ vi.mock('@sanity/cli-core', ()=>({
|
|
|
16
16
|
getStudioConfig: mockGetStudioConfig,
|
|
17
17
|
resolveLocalPackage: mockResolveLocalPackage
|
|
18
18
|
}));
|
|
19
|
-
vi.mock('
|
|
19
|
+
vi.mock('package-directory', ()=>({
|
|
20
20
|
packageDirectory: mockPackageDirectory
|
|
21
21
|
}));
|
|
22
22
|
describe('getGraphQLAPIs', ()=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/actions/graphql/__tests__/getGraphQLAPIs.test.ts"],"sourcesContent":["import {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'\n\nimport {getGraphQLAPIs} from '../getGraphQLAPIs.js'\n\n// Hoist mocks\nconst mockWorkerConstructor = vi.hoisted(() => vi.fn())\nconst mockGetCliConfig = vi.hoisted(() => vi.fn())\nconst mockGetStudioConfig = vi.hoisted(() => vi.fn())\nconst mockPackageDirectory = vi.hoisted(() => vi.fn())\nconst mockResolveLocalPackage = vi.hoisted(() => vi.fn())\n\n// Mock dependencies\nvi.mock('node:worker_threads', () => ({\n isMainThread: true,\n Worker: mockWorkerConstructor,\n}))\n\nvi.mock('@sanity/cli-core', () => ({\n getCliConfig: mockGetCliConfig,\n getStudioConfig: mockGetStudioConfig,\n resolveLocalPackage: mockResolveLocalPackage,\n}))\n\nvi.mock('pkg-dir', () => ({\n packageDirectory: mockPackageDirectory,\n}))\n\ndescribe('getGraphQLAPIs', () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let testResponse: any\n\n beforeEach(() => {\n vi.clearAllMocks()\n\n // Default mocks\n mockGetCliConfig.mockResolvedValue({\n api: {projectId: 'test-project'},\n graphql: [],\n })\n\n mockGetStudioConfig.mockResolvedValue([\n {\n dataset: 'production',\n name: 'default',\n projectId: 'test-project',\n unstable_sources: [\n {\n dataset: 'production',\n name: 'default',\n projectId: 'test-project',\n schema: {\n _original: {\n types: [\n {name: 'customType', type: 'document'},\n {name: 'string', type: 'string'},\n ],\n },\n },\n },\n ],\n },\n ])\n\n mockPackageDirectory.mockResolvedValue('/test/cli/package')\n\n // Mock resolveLocalPackage to return a mock sanity package with createSchema\n mockResolveLocalPackage.mockResolvedValue({\n createSchema: vi.fn(({name, types}) => ({\n getTypeNames: vi.fn(() => []),\n name,\n types,\n })),\n })\n\n // Default successful worker response\n testResponse = [\n {\n dataset: 'production',\n id: 'default',\n projectId: 'test-project',\n schemaTypes: [{name: 'customType', type: 'document'}],\n tag: 'default',\n },\n ]\n\n // Mock worker instance\n const mockWorkerInstance = {\n on: vi.fn((event, callback) => {\n if (event === 'message') {\n setImmediate(() => callback(testResponse))\n }\n }),\n terminate: vi.fn(),\n }\n\n mockWorkerConstructor.mockImplementation(() => mockWorkerInstance)\n })\n\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('successfully returns GraphQL APIs with schema', async () => {\n const result = await getGraphQLAPIs('/test/workdir')\n\n expect(result).toHaveLength(1)\n expect(result[0]).toMatchObject({\n dataset: 'production',\n projectId: 'test-project',\n tag: 'default',\n })\n expect(result[0].schema).toBeDefined()\n expect(result[0].schema.name).toBe('default')\n })\n\n test('calls worker with correct parameters', async () => {\n await getGraphQLAPIs('/test/workdir')\n\n expect(mockWorkerConstructor).toHaveBeenCalledWith(\n expect.objectContaining({\n href: expect.stringContaining('/actions/graphql/getGraphQLAPIs.worker.js'),\n }),\n expect.objectContaining({\n env: process.env,\n workerData: expect.objectContaining({\n workDir: '/test/workdir',\n }),\n }),\n )\n })\n\n test('handles multiple GraphQL APIs', async () => {\n // Create a new worker instance with custom response\n const mockWorkerInstance = {\n on: vi.fn((event, callback) => {\n if (event === 'message') {\n setImmediate(() =>\n callback([\n {\n dataset: 'production',\n id: 'production',\n projectId: 'test-project',\n schemaTypes: [{name: 'product', type: 'document'}],\n tag: 'default',\n },\n {\n dataset: 'staging',\n id: 'staging',\n projectId: 'test-project',\n schemaTypes: [{name: 'testProduct', type: 'document'}],\n tag: 'beta',\n },\n ]),\n )\n }\n }),\n terminate: vi.fn(),\n }\n\n mockWorkerConstructor.mockImplementationOnce(() => mockWorkerInstance)\n\n const result = await getGraphQLAPIs('/test/workdir')\n\n expect(result).toHaveLength(2)\n expect(result[0]).toMatchObject({\n dataset: 'production',\n id: 'production',\n tag: 'default',\n })\n expect(result[1]).toMatchObject({\n dataset: 'staging',\n id: 'staging',\n tag: 'beta',\n })\n })\n\n test('handles worker error event', async () => {\n const workerError = new Error('Worker failed')\n\n const mockWorkerInstance = {\n on: vi.fn((event, callback) => {\n if (event === 'error') {\n setImmediate(() => callback(workerError))\n }\n }),\n terminate: vi.fn(),\n }\n\n mockWorkerConstructor.mockImplementationOnce(() => mockWorkerInstance)\n\n await expect(getGraphQLAPIs('/test/workdir')).rejects.toThrow('Worker failed')\n })\n\n test('handles worker exit with non-zero code', async () => {\n const mockWorkerInstance = {\n on: vi.fn((event, callback) => {\n if (event === 'exit') {\n setImmediate(() => callback(1))\n }\n }),\n terminate: vi.fn(),\n }\n\n mockWorkerConstructor.mockImplementationOnce(() => mockWorkerInstance)\n\n await expect(getGraphQLAPIs('/test/workdir')).rejects.toThrow('Worker stopped with exit code 1')\n })\n\n test('throws error when package directory cannot be resolved', async () => {\n mockPackageDirectory.mockResolvedValueOnce(undefined)\n\n await expect(getGraphQLAPIs('/test/workdir')).rejects.toThrow(\n 'Unable to resolve @sanity/cli module root',\n )\n })\n\n test('passes CLI config to worker', async () => {\n const cliConfig = {\n api: {projectId: 'custom-project'},\n graphql: [{dataset: 'prod', id: 'api1'}],\n }\n\n mockGetCliConfig.mockResolvedValueOnce(cliConfig)\n\n await getGraphQLAPIs('/test/workdir')\n\n const workerCall = mockWorkerConstructor.mock.calls[0]\n expect(workerCall[1].workerData.cliConfig).toEqual(cliConfig)\n })\n\n test('passes studio workspaces to worker', async () => {\n const workspaces = [\n {\n dataset: 'production',\n name: 'default',\n projectId: 'test-project',\n unstable_sources: [\n {\n dataset: 'production',\n name: 'default',\n projectId: 'test-project',\n schema: {_original: {types: []}},\n },\n ],\n },\n ]\n\n mockGetStudioConfig.mockResolvedValueOnce(workspaces)\n\n await getGraphQLAPIs('/test/workdir')\n\n const workerCall = mockWorkerConstructor.mock.calls[0]\n expect(workerCall[1].workerData.workspaces).toEqual(workspaces)\n })\n\n test('extracts only GraphQL-related config properties', async () => {\n const configWithFunction = {\n api: {projectId: 'test'},\n graphql: [{id: 'test'}],\n vite: () => ({}), // Function that can't be serialized\n }\n\n mockGetCliConfig.mockResolvedValueOnce(configWithFunction)\n\n await getGraphQLAPIs('/test/workdir')\n\n // Verify only api and graphql properties were passed to worker\n const workerCall = mockWorkerConstructor.mock.calls[0]\n const workerData = workerCall[1].workerData\n\n expect(workerData.cliConfig).toEqual({\n api: {projectId: 'test'},\n graphql: [{id: 'test'}],\n })\n // Verify the vite function was not included\n expect(workerData.cliConfig).not.toHaveProperty('vite')\n })\n})\n"],"names":["afterEach","beforeEach","describe","expect","test","vi","getGraphQLAPIs","mockWorkerConstructor","hoisted","fn","mockGetCliConfig","mockGetStudioConfig","mockPackageDirectory","mockResolveLocalPackage","mock","isMainThread","Worker","getCliConfig","getStudioConfig","resolveLocalPackage","packageDirectory","testResponse","clearAllMocks","mockResolvedValue","api","projectId","graphql","dataset","name","unstable_sources","schema","_original","types","type","createSchema","getTypeNames","id","schemaTypes","tag","mockWorkerInstance","on","event","callback","setImmediate","terminate","mockImplementation","result","toHaveLength","toMatchObject","toBeDefined","toBe","toHaveBeenCalledWith","objectContaining","href","stringContaining","env","process","workerData","workDir","mockImplementationOnce","workerError","Error","rejects","toThrow","mockResolvedValueOnce","undefined","cliConfig","workerCall","calls","toEqual","workspaces","configWithFunction","vite","not","toHaveProperty"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/graphql/__tests__/getGraphQLAPIs.test.ts"],"sourcesContent":["import {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'\n\nimport {getGraphQLAPIs} from '../getGraphQLAPIs.js'\n\n// Hoist mocks\nconst mockWorkerConstructor = vi.hoisted(() => vi.fn())\nconst mockGetCliConfig = vi.hoisted(() => vi.fn())\nconst mockGetStudioConfig = vi.hoisted(() => vi.fn())\nconst mockPackageDirectory = vi.hoisted(() => vi.fn())\nconst mockResolveLocalPackage = vi.hoisted(() => vi.fn())\n\n// Mock dependencies\nvi.mock('node:worker_threads', () => ({\n isMainThread: true,\n Worker: mockWorkerConstructor,\n}))\n\nvi.mock('@sanity/cli-core', () => ({\n getCliConfig: mockGetCliConfig,\n getStudioConfig: mockGetStudioConfig,\n resolveLocalPackage: mockResolveLocalPackage,\n}))\n\nvi.mock('package-directory', () => ({\n packageDirectory: mockPackageDirectory,\n}))\n\ndescribe('getGraphQLAPIs', () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let testResponse: any\n\n beforeEach(() => {\n vi.clearAllMocks()\n\n // Default mocks\n mockGetCliConfig.mockResolvedValue({\n api: {projectId: 'test-project'},\n graphql: [],\n })\n\n mockGetStudioConfig.mockResolvedValue([\n {\n dataset: 'production',\n name: 'default',\n projectId: 'test-project',\n unstable_sources: [\n {\n dataset: 'production',\n name: 'default',\n projectId: 'test-project',\n schema: {\n _original: {\n types: [\n {name: 'customType', type: 'document'},\n {name: 'string', type: 'string'},\n ],\n },\n },\n },\n ],\n },\n ])\n\n mockPackageDirectory.mockResolvedValue('/test/cli/package')\n\n // Mock resolveLocalPackage to return a mock sanity package with createSchema\n mockResolveLocalPackage.mockResolvedValue({\n createSchema: vi.fn(({name, types}) => ({\n getTypeNames: vi.fn(() => []),\n name,\n types,\n })),\n })\n\n // Default successful worker response\n testResponse = [\n {\n dataset: 'production',\n id: 'default',\n projectId: 'test-project',\n schemaTypes: [{name: 'customType', type: 'document'}],\n tag: 'default',\n },\n ]\n\n // Mock worker instance\n const mockWorkerInstance = {\n on: vi.fn((event, callback) => {\n if (event === 'message') {\n setImmediate(() => callback(testResponse))\n }\n }),\n terminate: vi.fn(),\n }\n\n mockWorkerConstructor.mockImplementation(() => mockWorkerInstance)\n })\n\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('successfully returns GraphQL APIs with schema', async () => {\n const result = await getGraphQLAPIs('/test/workdir')\n\n expect(result).toHaveLength(1)\n expect(result[0]).toMatchObject({\n dataset: 'production',\n projectId: 'test-project',\n tag: 'default',\n })\n expect(result[0].schema).toBeDefined()\n expect(result[0].schema.name).toBe('default')\n })\n\n test('calls worker with correct parameters', async () => {\n await getGraphQLAPIs('/test/workdir')\n\n expect(mockWorkerConstructor).toHaveBeenCalledWith(\n expect.objectContaining({\n href: expect.stringContaining('/actions/graphql/getGraphQLAPIs.worker.js'),\n }),\n expect.objectContaining({\n env: process.env,\n workerData: expect.objectContaining({\n workDir: '/test/workdir',\n }),\n }),\n )\n })\n\n test('handles multiple GraphQL APIs', async () => {\n // Create a new worker instance with custom response\n const mockWorkerInstance = {\n on: vi.fn((event, callback) => {\n if (event === 'message') {\n setImmediate(() =>\n callback([\n {\n dataset: 'production',\n id: 'production',\n projectId: 'test-project',\n schemaTypes: [{name: 'product', type: 'document'}],\n tag: 'default',\n },\n {\n dataset: 'staging',\n id: 'staging',\n projectId: 'test-project',\n schemaTypes: [{name: 'testProduct', type: 'document'}],\n tag: 'beta',\n },\n ]),\n )\n }\n }),\n terminate: vi.fn(),\n }\n\n mockWorkerConstructor.mockImplementationOnce(() => mockWorkerInstance)\n\n const result = await getGraphQLAPIs('/test/workdir')\n\n expect(result).toHaveLength(2)\n expect(result[0]).toMatchObject({\n dataset: 'production',\n id: 'production',\n tag: 'default',\n })\n expect(result[1]).toMatchObject({\n dataset: 'staging',\n id: 'staging',\n tag: 'beta',\n })\n })\n\n test('handles worker error event', async () => {\n const workerError = new Error('Worker failed')\n\n const mockWorkerInstance = {\n on: vi.fn((event, callback) => {\n if (event === 'error') {\n setImmediate(() => callback(workerError))\n }\n }),\n terminate: vi.fn(),\n }\n\n mockWorkerConstructor.mockImplementationOnce(() => mockWorkerInstance)\n\n await expect(getGraphQLAPIs('/test/workdir')).rejects.toThrow('Worker failed')\n })\n\n test('handles worker exit with non-zero code', async () => {\n const mockWorkerInstance = {\n on: vi.fn((event, callback) => {\n if (event === 'exit') {\n setImmediate(() => callback(1))\n }\n }),\n terminate: vi.fn(),\n }\n\n mockWorkerConstructor.mockImplementationOnce(() => mockWorkerInstance)\n\n await expect(getGraphQLAPIs('/test/workdir')).rejects.toThrow('Worker stopped with exit code 1')\n })\n\n test('throws error when package directory cannot be resolved', async () => {\n mockPackageDirectory.mockResolvedValueOnce(undefined)\n\n await expect(getGraphQLAPIs('/test/workdir')).rejects.toThrow(\n 'Unable to resolve @sanity/cli module root',\n )\n })\n\n test('passes CLI config to worker', async () => {\n const cliConfig = {\n api: {projectId: 'custom-project'},\n graphql: [{dataset: 'prod', id: 'api1'}],\n }\n\n mockGetCliConfig.mockResolvedValueOnce(cliConfig)\n\n await getGraphQLAPIs('/test/workdir')\n\n const workerCall = mockWorkerConstructor.mock.calls[0]\n expect(workerCall[1].workerData.cliConfig).toEqual(cliConfig)\n })\n\n test('passes studio workspaces to worker', async () => {\n const workspaces = [\n {\n dataset: 'production',\n name: 'default',\n projectId: 'test-project',\n unstable_sources: [\n {\n dataset: 'production',\n name: 'default',\n projectId: 'test-project',\n schema: {_original: {types: []}},\n },\n ],\n },\n ]\n\n mockGetStudioConfig.mockResolvedValueOnce(workspaces)\n\n await getGraphQLAPIs('/test/workdir')\n\n const workerCall = mockWorkerConstructor.mock.calls[0]\n expect(workerCall[1].workerData.workspaces).toEqual(workspaces)\n })\n\n test('extracts only GraphQL-related config properties', async () => {\n const configWithFunction = {\n api: {projectId: 'test'},\n graphql: [{id: 'test'}],\n vite: () => ({}), // Function that can't be serialized\n }\n\n mockGetCliConfig.mockResolvedValueOnce(configWithFunction)\n\n await getGraphQLAPIs('/test/workdir')\n\n // Verify only api and graphql properties were passed to worker\n const workerCall = mockWorkerConstructor.mock.calls[0]\n const workerData = workerCall[1].workerData\n\n expect(workerData.cliConfig).toEqual({\n api: {projectId: 'test'},\n graphql: [{id: 'test'}],\n })\n // Verify the vite function was not included\n expect(workerData.cliConfig).not.toHaveProperty('vite')\n })\n})\n"],"names":["afterEach","beforeEach","describe","expect","test","vi","getGraphQLAPIs","mockWorkerConstructor","hoisted","fn","mockGetCliConfig","mockGetStudioConfig","mockPackageDirectory","mockResolveLocalPackage","mock","isMainThread","Worker","getCliConfig","getStudioConfig","resolveLocalPackage","packageDirectory","testResponse","clearAllMocks","mockResolvedValue","api","projectId","graphql","dataset","name","unstable_sources","schema","_original","types","type","createSchema","getTypeNames","id","schemaTypes","tag","mockWorkerInstance","on","event","callback","setImmediate","terminate","mockImplementation","result","toHaveLength","toMatchObject","toBeDefined","toBe","toHaveBeenCalledWith","objectContaining","href","stringContaining","env","process","workerData","workDir","mockImplementationOnce","workerError","Error","rejects","toThrow","mockResolvedValueOnce","undefined","cliConfig","workerCall","calls","toEqual","workspaces","configWithFunction","vite","not","toHaveProperty"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isMainThread, Worker } from 'node:worker_threads';
|
|
2
2
|
import { getCliConfig, getStudioConfig, resolveLocalPackage } from '@sanity/cli-core';
|
|
3
|
-
import { packageDirectory } from '
|
|
3
|
+
import { packageDirectory } from 'package-directory';
|
|
4
4
|
export async function getGraphQLAPIs(workDir) {
|
|
5
5
|
if (!isMainThread) {
|
|
6
6
|
throw new Error('getGraphQLAPIs() must be called from the main thread');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/graphql/getGraphQLAPIs.ts"],"sourcesContent":["import {isMainThread, Worker} from 'node:worker_threads'\n\nimport {type CliConfig, getCliConfig, getStudioConfig, resolveLocalPackage} from '@sanity/cli-core'\nimport {packageDirectory} from '
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/graphql/getGraphQLAPIs.ts"],"sourcesContent":["import {isMainThread, Worker} from 'node:worker_threads'\n\nimport {type CliConfig, getCliConfig, getStudioConfig, resolveLocalPackage} from '@sanity/cli-core'\nimport {packageDirectory} from 'package-directory'\n\nimport {\n type ResolvedGraphQLAPI,\n type ResolvedSourceProperties,\n type SchemaDefinitionish,\n type TypeResolvedGraphQLAPI,\n} from './types.js'\n\nexport async function getGraphQLAPIs(workDir: string): Promise<ResolvedGraphQLAPI[]> {\n if (!isMainThread) {\n throw new Error('getGraphQLAPIs() must be called from the main thread')\n }\n\n // Resolve `sanity` local to the project in order to avoid using incompatible versions, and to avoid circular dependencies\n const {createSchema} = await resolveLocalPackage<typeof import('sanity')>('sanity', workDir)\n\n const defaultSchema = createSchema({name: 'default', types: []})\n const defaultTypes = defaultSchema.getTypeNames()\n const isCustomType = (type: SchemaDefinitionish) => !defaultTypes.includes(type.name)\n\n const apis = await getApisWithSchemaTypes(workDir)\n const resolved = apis.map(\n ({schemaTypes, ...api}): ResolvedSourceProperties => ({\n schema: createSchema({\n name: 'default',\n types: schemaTypes.filter((element) => isCustomType(element)),\n }),\n ...api,\n }),\n )\n\n return resolved\n}\n\nasync function getApisWithSchemaTypes(workDir: string): Promise<TypeResolvedGraphQLAPI[]> {\n const cliConfig = await getCliConfig(workDir)\n const workspaces = await getStudioConfig(workDir, {resolvePlugins: true})\n\n const cliPkgDir = await packageDirectory({cwd: import.meta.dirname})\n if (!cliPkgDir) {\n throw new Error('Unable to resolve @sanity/cli module root')\n }\n\n return new Promise<TypeResolvedGraphQLAPI[]>((resolve, reject) => {\n const worker = new Worker(new URL(`getGraphQLAPIs.worker.js`, import.meta.url), {\n env: process.env,\n workerData: {\n cliConfig: extractGraphQLConfig(cliConfig),\n workDir,\n workspaces,\n },\n })\n worker.on('message', resolve)\n worker.on('error', (error) => {\n reject(error)\n worker.terminate()\n })\n worker.on('exit', (code) => {\n if (code !== 0) {\n reject(new Error(`Worker stopped with exit code ${code}`))\n }\n })\n })\n}\n\nfunction extractGraphQLConfig(config: CliConfig) {\n return structuredClone({\n api: config.api,\n graphql: config.graphql,\n })\n}\n"],"names":["isMainThread","Worker","getCliConfig","getStudioConfig","resolveLocalPackage","packageDirectory","getGraphQLAPIs","workDir","Error","createSchema","defaultSchema","name","types","defaultTypes","getTypeNames","isCustomType","type","includes","apis","getApisWithSchemaTypes","resolved","map","schemaTypes","api","schema","filter","element","cliConfig","workspaces","resolvePlugins","cliPkgDir","cwd","dirname","Promise","resolve","reject","worker","URL","url","env","process","workerData","extractGraphQLConfig","on","error","terminate","code","config","structuredClone","graphql"],"mappings":"AAAA,SAAQA,YAAY,EAAEC,MAAM,QAAO,sBAAqB;AAExD,SAAwBC,YAAY,EAAEC,eAAe,EAAEC,mBAAmB,QAAO,mBAAkB;AACnG,SAAQC,gBAAgB,QAAO,oBAAmB;AASlD,OAAO,eAAeC,eAAeC,OAAe;IAClD,IAAI,CAACP,cAAc;QACjB,MAAM,IAAIQ,MAAM;IAClB;IAEA,0HAA0H;IAC1H,MAAM,EAACC,YAAY,EAAC,GAAG,MAAML,oBAA6C,UAAUG;IAEpF,MAAMG,gBAAgBD,aAAa;QAACE,MAAM;QAAWC,OAAO,EAAE;IAAA;IAC9D,MAAMC,eAAeH,cAAcI,YAAY;IAC/C,MAAMC,eAAe,CAACC,OAA8B,CAACH,aAAaI,QAAQ,CAACD,KAAKL,IAAI;IAEpF,MAAMO,OAAO,MAAMC,uBAAuBZ;IAC1C,MAAMa,WAAWF,KAAKG,GAAG,CACvB,CAAC,EAACC,WAAW,EAAE,GAAGC,KAAI,GAAgC,CAAA;YACpDC,QAAQf,aAAa;gBACnBE,MAAM;gBACNC,OAAOU,YAAYG,MAAM,CAAC,CAACC,UAAYX,aAAaW;YACtD;YACA,GAAGH,GAAG;QACR,CAAA;IAGF,OAAOH;AACT;AAEA,eAAeD,uBAAuBZ,OAAe;IACnD,MAAMoB,YAAY,MAAMzB,aAAaK;IACrC,MAAMqB,aAAa,MAAMzB,gBAAgBI,SAAS;QAACsB,gBAAgB;IAAI;IAEvE,MAAMC,YAAY,MAAMzB,iBAAiB;QAAC0B,KAAK,YAAYC,OAAO;IAAA;IAClE,IAAI,CAACF,WAAW;QACd,MAAM,IAAItB,MAAM;IAClB;IAEA,OAAO,IAAIyB,QAAkC,CAACC,SAASC;QACrD,MAAMC,SAAS,IAAInC,OAAO,IAAIoC,IAAI,CAAC,wBAAwB,CAAC,EAAE,YAAYC,GAAG,GAAG;YAC9EC,KAAKC,QAAQD,GAAG;YAChBE,YAAY;gBACVd,WAAWe,qBAAqBf;gBAChCpB;gBACAqB;YACF;QACF;QACAQ,OAAOO,EAAE,CAAC,WAAWT;QACrBE,OAAOO,EAAE,CAAC,SAAS,CAACC;YAClBT,OAAOS;YACPR,OAAOS,SAAS;QAClB;QACAT,OAAOO,EAAE,CAAC,QAAQ,CAACG;YACjB,IAAIA,SAAS,GAAG;gBACdX,OAAO,IAAI3B,MAAM,CAAC,8BAA8B,EAAEsC,MAAM;YAC1D;QACF;IACF;AACF;AAEA,SAASJ,qBAAqBK,MAAiB;IAC7C,OAAOC,gBAAgB;QACrBzB,KAAKwB,OAAOxB,GAAG;QACf0B,SAASF,OAAOE,OAAO;IACzB;AACF"}
|
|
@@ -32,10 +32,7 @@ const CREATE_TIMER = 'create-manifest';
|
|
|
32
32
|
}
|
|
33
33
|
async function extractManifest(options) {
|
|
34
34
|
const { flags, workDir } = options;
|
|
35
|
-
const
|
|
36
|
-
const outputDir = resolve(defaultOutputDir);
|
|
37
|
-
const defaultStaticPath = join(outputDir, 'static');
|
|
38
|
-
const staticPath = `.${flags.path ?? defaultStaticPath}`;
|
|
35
|
+
const staticPath = resolve(join(workDir, flags.path));
|
|
39
36
|
const path = join(staticPath, MANIFEST_FILENAME);
|
|
40
37
|
const timer = getTimer();
|
|
41
38
|
timer.start(CREATE_TIMER);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/manifest/extractManifest.ts"],"sourcesContent":["import {createHash} from 'node:crypto'\nimport {mkdir, writeFile} from 'node:fs/promises'\nimport {join, resolve} from 'node:path'\n\nimport {getTimer, Output} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {type Workspace} from 'sanity'\n\nimport {type ExtractManifestCommand} from '../../commands/manifest/extract'\nimport {importStudioConfig} from '../../util/importStudioConfig.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\nimport {extractWorkspaceManifest} from './extractWorkspaceManifest.js'\nimport {\n type CreateManifest,\n type CreateWorkspaceManifest,\n type ManifestWorkspaceFile,\n} from './types'\n\nexport const MANIFEST_FILENAME = 'create-manifest.json'\nconst SCHEMA_FILENAME_SUFFIX = '.create-schema.json'\nconst TOOLS_FILENAME_SUFFIX = '.create-tools.json'\n\n/** Escape-hatch env flags to change action behavior */\nconst FEATURE_ENABLED_ENV_NAME = 'SANITY_CLI_EXTRACT_MANIFEST_ENABLED'\nconst EXTRACT_MANIFEST_ENABLED = process.env[FEATURE_ENABLED_ENV_NAME] !== 'false'\nconst EXTRACT_MANIFEST_LOG_ERRORS = process.env.SANITY_CLI_EXTRACT_MANIFEST_LOG_ERRORS === 'true'\n\nconst CREATE_TIMER = 'create-manifest'\n\ninterface ExtractManifestOptions {\n flags: ExtractManifestCommand['flags']\n output: Output\n workDir: string\n}\n\n/**\n * This function will never throw.\n * @returns `undefined` if extract succeeded - caught error if it failed\n */\nexport async function extractManifestSafe(\n options: ExtractManifestOptions,\n): Promise<Error | undefined> {\n if (!EXTRACT_MANIFEST_ENABLED) {\n return undefined\n }\n\n try {\n await extractManifest(options)\n return undefined\n } catch (err) {\n if (EXTRACT_MANIFEST_LOG_ERRORS) {\n options.output.error(err)\n }\n throw err\n }\n}\n\nasync function extractManifest(options: ExtractManifestOptions): Promise<void> {\n const {flags, workDir} = options\n const
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/manifest/extractManifest.ts"],"sourcesContent":["import {createHash} from 'node:crypto'\nimport {mkdir, writeFile} from 'node:fs/promises'\nimport {join, resolve} from 'node:path'\n\nimport {getTimer, Output} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {type Workspace} from 'sanity'\n\nimport {type ExtractManifestCommand} from '../../commands/manifest/extract'\nimport {importStudioConfig} from '../../util/importStudioConfig.js'\nimport {readModuleVersion} from '../../util/readModuleVersion.js'\nimport {extractWorkspaceManifest} from './extractWorkspaceManifest.js'\nimport {\n type CreateManifest,\n type CreateWorkspaceManifest,\n type ManifestWorkspaceFile,\n} from './types'\n\nexport const MANIFEST_FILENAME = 'create-manifest.json'\nconst SCHEMA_FILENAME_SUFFIX = '.create-schema.json'\nconst TOOLS_FILENAME_SUFFIX = '.create-tools.json'\n\n/** Escape-hatch env flags to change action behavior */\nconst FEATURE_ENABLED_ENV_NAME = 'SANITY_CLI_EXTRACT_MANIFEST_ENABLED'\nconst EXTRACT_MANIFEST_ENABLED = process.env[FEATURE_ENABLED_ENV_NAME] !== 'false'\nconst EXTRACT_MANIFEST_LOG_ERRORS = process.env.SANITY_CLI_EXTRACT_MANIFEST_LOG_ERRORS === 'true'\n\nconst CREATE_TIMER = 'create-manifest'\n\ninterface ExtractManifestOptions {\n flags: ExtractManifestCommand['flags']\n output: Output\n workDir: string\n}\n\n/**\n * This function will never throw.\n * @returns `undefined` if extract succeeded - caught error if it failed\n */\nexport async function extractManifestSafe(\n options: ExtractManifestOptions,\n): Promise<Error | undefined> {\n if (!EXTRACT_MANIFEST_ENABLED) {\n return undefined\n }\n\n try {\n await extractManifest(options)\n return undefined\n } catch (err) {\n if (EXTRACT_MANIFEST_LOG_ERRORS) {\n options.output.error(err)\n }\n throw err\n }\n}\n\nasync function extractManifest(options: ExtractManifestOptions): Promise<void> {\n const {flags, workDir} = options\n const staticPath = resolve(join(workDir, flags.path))\n const path = join(staticPath, MANIFEST_FILENAME)\n\n const timer = getTimer()\n timer.start(CREATE_TIMER)\n const spin = spinner('Extracting manifest').start()\n\n try {\n const workspaceManifests = await getWorkspaceManifests(workDir)\n await mkdir(staticPath, {recursive: true})\n\n const workspaceFiles = await writeWorkspaceFiles(workspaceManifests, staticPath)\n\n const manifest: CreateManifest = {\n /**\n * Version history:\n * 1: Initial release.\n * 2: Added tools file.\n * 3. Added studioVersion field.\n */\n createdAt: new Date().toISOString(),\n studioVersion: await readModuleVersion(workDir, 'sanity'),\n version: 3,\n workspaces: workspaceFiles,\n }\n\n await writeFile(path, JSON.stringify(manifest, null, 2))\n const manifestDuration = timer.end(CREATE_TIMER)\n\n spin.succeed(`Extracted manifest (${manifestDuration.toFixed(0)}ms)`)\n } catch (err) {\n spin.fail(err.message)\n throw err\n }\n}\n\nasync function getWorkspaceManifests(workDir: string): Promise<CreateWorkspaceManifest[]> {\n const workspaces = await importStudioConfig(workDir)\n return await extractWorkspaceManifest(workspaces as unknown as Workspace[])\n}\n\nfunction writeWorkspaceFiles(\n manifestWorkspaces: CreateWorkspaceManifest[],\n staticPath: string,\n): Promise<ManifestWorkspaceFile[]> {\n const output = manifestWorkspaces.map((workspace) => writeWorkspaceFile(workspace, staticPath))\n\n return Promise.all(output)\n}\n\nasync function writeWorkspaceFile(\n workspace: CreateWorkspaceManifest,\n staticPath: string,\n): Promise<ManifestWorkspaceFile> {\n const [schemaFilename, toolsFilename] = await Promise.all([\n createFile(staticPath, workspace.schema, SCHEMA_FILENAME_SUFFIX),\n createFile(staticPath, workspace.tools, TOOLS_FILENAME_SUFFIX),\n ])\n\n return {\n ...workspace,\n schema: schemaFilename,\n tools: toolsFilename,\n }\n}\n\nconst createFile = async (path: string, content: unknown, filenameSuffix: string) => {\n const stringifiedContent = JSON.stringify(content, null, 2)\n const hash = createHash('sha1').update(stringifiedContent).digest('hex')\n const filename = `${hash.slice(0, 8)}${filenameSuffix}`\n\n // workspaces with identical data will overwrite each others file. This is ok, since they are identical and can be shared\n await writeFile(join(path, filename), stringifiedContent)\n\n return filename\n}\n"],"names":["createHash","mkdir","writeFile","join","resolve","getTimer","spinner","importStudioConfig","readModuleVersion","extractWorkspaceManifest","MANIFEST_FILENAME","SCHEMA_FILENAME_SUFFIX","TOOLS_FILENAME_SUFFIX","FEATURE_ENABLED_ENV_NAME","EXTRACT_MANIFEST_ENABLED","process","env","EXTRACT_MANIFEST_LOG_ERRORS","SANITY_CLI_EXTRACT_MANIFEST_LOG_ERRORS","CREATE_TIMER","extractManifestSafe","options","undefined","extractManifest","err","output","error","flags","workDir","staticPath","path","timer","start","spin","workspaceManifests","getWorkspaceManifests","recursive","workspaceFiles","writeWorkspaceFiles","manifest","createdAt","Date","toISOString","studioVersion","version","workspaces","JSON","stringify","manifestDuration","end","succeed","toFixed","fail","message","manifestWorkspaces","map","workspace","writeWorkspaceFile","Promise","all","schemaFilename","toolsFilename","createFile","schema","tools","content","filenameSuffix","stringifiedContent","hash","update","digest","filename","slice"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAa;AACtC,SAAQC,KAAK,EAAEC,SAAS,QAAO,mBAAkB;AACjD,SAAQC,IAAI,EAAEC,OAAO,QAAO,YAAW;AAEvC,SAAQC,QAAQ,QAAe,mBAAkB;AACjD,SAAQC,OAAO,QAAO,sBAAqB;AAI3C,SAAQC,kBAAkB,QAAO,mCAAkC;AACnE,SAAQC,iBAAiB,QAAO,kCAAiC;AACjE,SAAQC,wBAAwB,QAAO,gCAA+B;AAOtE,OAAO,MAAMC,oBAAoB,uBAAsB;AACvD,MAAMC,yBAAyB;AAC/B,MAAMC,wBAAwB;AAE9B,qDAAqD,GACrD,MAAMC,2BAA2B;AACjC,MAAMC,2BAA2BC,QAAQC,GAAG,CAACH,yBAAyB,KAAK;AAC3E,MAAMI,8BAA8BF,QAAQC,GAAG,CAACE,sCAAsC,KAAK;AAE3F,MAAMC,eAAe;AAQrB;;;CAGC,GACD,OAAO,eAAeC,oBACpBC,OAA+B;IAE/B,IAAI,CAACP,0BAA0B;QAC7B,OAAOQ;IACT;IAEA,IAAI;QACF,MAAMC,gBAAgBF;QACtB,OAAOC;IACT,EAAE,OAAOE,KAAK;QACZ,IAAIP,6BAA6B;YAC/BI,QAAQI,MAAM,CAACC,KAAK,CAACF;QACvB;QACA,MAAMA;IACR;AACF;AAEA,eAAeD,gBAAgBF,OAA+B;IAC5D,MAAM,EAACM,KAAK,EAAEC,OAAO,EAAC,GAAGP;IACzB,MAAMQ,aAAazB,QAAQD,KAAKyB,SAASD,MAAMG,IAAI;IACnD,MAAMA,OAAO3B,KAAK0B,YAAYnB;IAE9B,MAAMqB,QAAQ1B;IACd0B,MAAMC,KAAK,CAACb;IACZ,MAAMc,OAAO3B,QAAQ,uBAAuB0B,KAAK;IAEjD,IAAI;QACF,MAAME,qBAAqB,MAAMC,sBAAsBP;QACvD,MAAM3B,MAAM4B,YAAY;YAACO,WAAW;QAAI;QAExC,MAAMC,iBAAiB,MAAMC,oBAAoBJ,oBAAoBL;QAErE,MAAMU,WAA2B;YAC/B;;;;;OAKC,GACDC,WAAW,IAAIC,OAAOC,WAAW;YACjCC,eAAe,MAAMnC,kBAAkBoB,SAAS;YAChDgB,SAAS;YACTC,YAAYR;QACd;QAEA,MAAMnC,UAAU4B,MAAMgB,KAAKC,SAAS,CAACR,UAAU,MAAM;QACrD,MAAMS,mBAAmBjB,MAAMkB,GAAG,CAAC9B;QAEnCc,KAAKiB,OAAO,CAAC,CAAC,oBAAoB,EAAEF,iBAAiBG,OAAO,CAAC,GAAG,GAAG,CAAC;IACtE,EAAE,OAAO3B,KAAK;QACZS,KAAKmB,IAAI,CAAC5B,IAAI6B,OAAO;QACrB,MAAM7B;IACR;AACF;AAEA,eAAeW,sBAAsBP,OAAe;IAClD,MAAMiB,aAAa,MAAMtC,mBAAmBqB;IAC5C,OAAO,MAAMnB,yBAAyBoC;AACxC;AAEA,SAASP,oBACPgB,kBAA6C,EAC7CzB,UAAkB;IAElB,MAAMJ,SAAS6B,mBAAmBC,GAAG,CAAC,CAACC,YAAcC,mBAAmBD,WAAW3B;IAEnF,OAAO6B,QAAQC,GAAG,CAAClC;AACrB;AAEA,eAAegC,mBACbD,SAAkC,EAClC3B,UAAkB;IAElB,MAAM,CAAC+B,gBAAgBC,cAAc,GAAG,MAAMH,QAAQC,GAAG,CAAC;QACxDG,WAAWjC,YAAY2B,UAAUO,MAAM,EAAEpD;QACzCmD,WAAWjC,YAAY2B,UAAUQ,KAAK,EAAEpD;KACzC;IAED,OAAO;QACL,GAAG4C,SAAS;QACZO,QAAQH;QACRI,OAAOH;IACT;AACF;AAEA,MAAMC,aAAa,OAAOhC,MAAcmC,SAAkBC;IACxD,MAAMC,qBAAqBrB,KAAKC,SAAS,CAACkB,SAAS,MAAM;IACzD,MAAMG,OAAOpE,WAAW,QAAQqE,MAAM,CAACF,oBAAoBG,MAAM,CAAC;IAClE,MAAMC,WAAW,GAAGH,KAAKI,KAAK,CAAC,GAAG,KAAKN,gBAAgB;IAEvD,yHAAyH;IACzH,MAAMhE,UAAUC,KAAK2B,MAAMyC,WAAWJ;IAEtC,OAAOI;AACT"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function getOrganizationChoices(withGrantInfo) {
|
|
2
|
+
const choices = withGrantInfo.map(({ hasAttachGrant, organization })=>({
|
|
3
|
+
disabled: hasAttachGrant ? false : 'Insufficient permissions',
|
|
4
|
+
name: `${organization.name} [${organization.id}]`,
|
|
5
|
+
value: organization.id
|
|
6
|
+
}));
|
|
7
|
+
choices.push({
|
|
8
|
+
disabled: true,
|
|
9
|
+
name: '─────────',
|
|
10
|
+
value: '---separator---'
|
|
11
|
+
}, {
|
|
12
|
+
disabled: false,
|
|
13
|
+
name: 'Create new organization',
|
|
14
|
+
value: '-new-'
|
|
15
|
+
}, {
|
|
16
|
+
disabled: true,
|
|
17
|
+
name: '─────────',
|
|
18
|
+
value: '---separator2---'
|
|
19
|
+
});
|
|
20
|
+
return choices;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=getOrganizationChoices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/organizations/getOrganizationChoices.ts"],"sourcesContent":["import {type OrganizationWithGrant} from '../../services/organizations.js'\n\nexport function getOrganizationChoices(withGrantInfo: OrganizationWithGrant[]): Array<{\n disabled: boolean | string\n name: string\n value: string\n}> {\n const choices = withGrantInfo.map(({hasAttachGrant, organization}) => ({\n disabled: hasAttachGrant ? false : 'Insufficient permissions',\n name: `${organization.name} [${organization.id}]`,\n value: organization.id,\n }))\n\n choices.push(\n {disabled: true, name: '─────────', value: '---separator---'},\n {disabled: false, name: 'Create new organization', value: '-new-'},\n {disabled: true, name: '─────────', value: '---separator2---'},\n )\n\n return choices\n}\n"],"names":["getOrganizationChoices","withGrantInfo","choices","map","hasAttachGrant","organization","disabled","name","id","value","push"],"mappings":"AAEA,OAAO,SAASA,uBAAuBC,aAAsC;IAK3E,MAAMC,UAAUD,cAAcE,GAAG,CAAC,CAAC,EAACC,cAAc,EAAEC,YAAY,EAAC,GAAM,CAAA;YACrEC,UAAUF,iBAAiB,QAAQ;YACnCG,MAAM,GAAGF,aAAaE,IAAI,CAAC,EAAE,EAAEF,aAAaG,EAAE,CAAC,CAAC,CAAC;YACjDC,OAAOJ,aAAaG,EAAE;QACxB,CAAA;IAEAN,QAAQQ,IAAI,CACV;QAACJ,UAAU;QAAMC,MAAM;QAAaE,OAAO;IAAiB,GAC5D;QAACH,UAAU;QAAOC,MAAM;QAA2BE,OAAO;IAAO,GACjE;QAACH,UAAU;QAAMC,MAAM;QAAaE,OAAO;IAAkB;IAG/D,OAAOP;AACT"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { hasProjectAttachGrant } from './hasProjectAttachGrant.js';
|
|
2
|
+
export async function getOrganizationsWithAttachGrantInfo(organizations) {
|
|
3
|
+
return Promise.all(organizations.map(async (organization)=>({
|
|
4
|
+
hasAttachGrant: await hasProjectAttachGrant(organization.id),
|
|
5
|
+
organization
|
|
6
|
+
})));
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=getOrganizationsWithAttachGrantInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/organizations/getOrganizationsWithAttachGrantInfo.ts"],"sourcesContent":["import {type OrganizationWithGrant, type ProjectOrganization} from '../../services/organizations.js'\nimport {hasProjectAttachGrant} from './hasProjectAttachGrant.js'\n\nexport async function getOrganizationsWithAttachGrantInfo(\n organizations: ProjectOrganization[],\n): Promise<OrganizationWithGrant[]> {\n return Promise.all(\n organizations.map(async (organization) => ({\n hasAttachGrant: await hasProjectAttachGrant(organization.id),\n organization,\n })),\n )\n}\n"],"names":["hasProjectAttachGrant","getOrganizationsWithAttachGrantInfo","organizations","Promise","all","map","organization","hasAttachGrant","id"],"mappings":"AACA,SAAQA,qBAAqB,QAAO,6BAA4B;AAEhE,OAAO,eAAeC,oCACpBC,aAAoC;IAEpC,OAAOC,QAAQC,GAAG,CAChBF,cAAcG,GAAG,CAAC,OAAOC,eAAkB,CAAA;YACzCC,gBAAgB,MAAMP,sBAAsBM,aAAaE,EAAE;YAC3DF;QACF,CAAA;AAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function hasProjectAttachGrant(orgId: string): Promise<boolean>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { subdebug } from '@sanity/cli-core';
|
|
2
|
+
import { getOrganizationGrants } from '../../services/organizations.js';
|
|
3
|
+
const debug = subdebug('organizations');
|
|
4
|
+
export async function hasProjectAttachGrant(orgId) {
|
|
5
|
+
const requiredGrantGroup = 'sanity.organization.projects';
|
|
6
|
+
const requiredGrant = 'attach';
|
|
7
|
+
try {
|
|
8
|
+
const grants = await getOrganizationGrants(orgId);
|
|
9
|
+
const group = grants[requiredGrantGroup] || [];
|
|
10
|
+
return group.some((resource)=>resource.grants && resource.grants.some((grant)=>grant.name === requiredGrant));
|
|
11
|
+
} catch (err) {
|
|
12
|
+
// If we get a 401, it means we don't have access to this organization
|
|
13
|
+
// probably because of implicit membership
|
|
14
|
+
if (err.statusCode === 401) {
|
|
15
|
+
debug('No access to organization %s (401)', orgId);
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
// For other errors, log them but still return false
|
|
19
|
+
debug('Error checking grants for organization %s: %s', orgId, err.message);
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=hasProjectAttachGrant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/organizations/hasProjectAttachGrant.ts"],"sourcesContent":["import {subdebug} from '@sanity/cli-core'\n\nimport {getOrganizationGrants} from '../../services/organizations.js'\n\nconst debug = subdebug('organizations')\n\nexport async function hasProjectAttachGrant(orgId: string) {\n const requiredGrantGroup = 'sanity.organization.projects'\n const requiredGrant = 'attach'\n\n try {\n const grants = await getOrganizationGrants(orgId)\n const group: {grants: {name: string}[]}[] = grants[requiredGrantGroup] || []\n return group.some(\n (resource) =>\n resource.grants && resource.grants.some((grant) => grant.name === requiredGrant),\n )\n } catch (err) {\n // If we get a 401, it means we don't have access to this organization\n // probably because of implicit membership\n if (err.statusCode === 401) {\n debug('No access to organization %s (401)', orgId)\n return false\n }\n // For other errors, log them but still return false\n debug('Error checking grants for organization %s: %s', orgId, err.message)\n return false\n }\n}\n"],"names":["subdebug","getOrganizationGrants","debug","hasProjectAttachGrant","orgId","requiredGrantGroup","requiredGrant","grants","group","some","resource","grant","name","err","statusCode","message"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,mBAAkB;AAEzC,SAAQC,qBAAqB,QAAO,kCAAiC;AAErE,MAAMC,QAAQF,SAAS;AAEvB,OAAO,eAAeG,sBAAsBC,KAAa;IACvD,MAAMC,qBAAqB;IAC3B,MAAMC,gBAAgB;IAEtB,IAAI;QACF,MAAMC,SAAS,MAAMN,sBAAsBG;QAC3C,MAAMI,QAAsCD,MAAM,CAACF,mBAAmB,IAAI,EAAE;QAC5E,OAAOG,MAAMC,IAAI,CACf,CAACC,WACCA,SAASH,MAAM,IAAIG,SAASH,MAAM,CAACE,IAAI,CAAC,CAACE,QAAUA,MAAMC,IAAI,KAAKN;IAExE,EAAE,OAAOO,KAAK;QACZ,sEAAsE;QACtE,0CAA0C;QAC1C,IAAIA,IAAIC,UAAU,KAAK,KAAK;YAC1BZ,MAAM,sCAAsCE;YAC5C,OAAO;QACT;QACA,oDAAoD;QACpDF,MAAM,iDAAiDE,OAAOS,IAAIE,OAAO;QACzE,OAAO;IACT;AACF"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import { type
|
|
3
|
-
|
|
1
|
+
import { type Output } from '@sanity/cli-core';
|
|
2
|
+
import { type SchemaStoreActionResult } from './schemaStoreTypes.js';
|
|
3
|
+
import { type WorkspaceSchemaId } from './utils/schemaStoreValidation.js';
|
|
4
|
+
interface DeleteSchemasOptions {
|
|
5
|
+
extractManifest: boolean;
|
|
6
|
+
ids: WorkspaceSchemaId[];
|
|
7
|
+
manifestDir: string;
|
|
8
|
+
output: Output;
|
|
9
|
+
projectId: string;
|
|
10
|
+
verbose: boolean;
|
|
11
|
+
workDir: string;
|
|
4
12
|
dataset?: string;
|
|
5
|
-
ids?: string;
|
|
6
13
|
}
|
|
7
14
|
/**
|
|
8
15
|
* Deletes all stored schemas matching --ids in workspace datasets.
|
|
@@ -12,4 +19,5 @@ export interface DeleteSchemaFlags extends SchemaStoreCommonFlags {
|
|
|
12
19
|
* Manifest generation can be optionally disabled with --no-manifest-extract.
|
|
13
20
|
* In this case the command uses and existing file or throws when missing.
|
|
14
21
|
*/
|
|
15
|
-
export declare function deleteSchemaAction(
|
|
22
|
+
export declare function deleteSchemaAction(options: DeleteSchemasOptions): Promise<SchemaStoreActionResult>;
|
|
23
|
+
export {};
|