@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/commands/schema/__tests__/delete.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig} from '@sanity/cli-core'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'\n\nimport {deleteSchemaAction} from '../../../actions/schema/deleteSchemaAction.js'\nimport {DeleteSchemaCommand} from '../delete.js'\n\n// Mock the delete schema action\nvi.mock('../../../actions/schema/deleteSchemaAction.js', () => ({\n deleteSchemaAction: vi.fn(),\n}))\n\n// Mock the manifest extractor\nvi.mock('../../../actions/schema/utils/manifestExtractor.js', () => ({\n createManifestExtractor: vi.fn(() => vi.fn()),\n}))\n\n// Mock the config functions\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', () => ({\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: vi.fn().mockResolvedValue({\n api: {\n dataset: 'production',\n projectId: 'test-project',\n },\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/services/apiClient.js', () => ({\n getProjectCliClient: vi.fn(),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\n\nconst mockedDeleteSchemaAction = vi.mocked(deleteSchemaAction)\nconst mockedGetCliConfig = vi.mocked(getCliConfig)\n\ndescribe('#schema:delete', () => {\n beforeEach(() => {\n mockedDeleteSchemaAction.mockResolvedValue('success')\n })\n\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['schema delete', '--help'])\n\n expect(stdout).toContain('Delete schema documents by id')\n expect(stdout).toContain('--ids')\n expect(stdout).toContain('--dataset')\n expect(stdout).toContain('--extract-manifest')\n expect(stdout).toContain('--manifest-dir')\n expect(stdout).toContain('--verbose')\n })\n\n test('deletes a single schema successfully', async () => {\n mockedDeleteSchemaAction.mockResolvedValue('success')\n\n await testCommand(DeleteSchemaCommand, ['--ids', 'sanity.workspace.schema.workspaceName'])\n\n expect(mockedDeleteSchemaAction).toHaveBeenCalledWith(\n expect.objectContaining({\n ids: 'sanity.workspace.schema.workspaceName',\n }),\n expect.any(Object),\n )\n })\n\n test('deletes multiple schemas successfully', async () => {\n mockedDeleteSchemaAction.mockResolvedValue('success')\n\n await testCommand(DeleteSchemaCommand, [\n '--ids',\n 'sanity.workspace.schema.workspace1,sanity.workspace.schema.workspace2',\n ])\n\n expect(mockedDeleteSchemaAction).toHaveBeenCalledWith(\n expect.objectContaining({\n ids: 'sanity.workspace.schema.workspace1,sanity.workspace.schema.workspace2',\n }),\n expect.any(Object),\n )\n })\n\n test('uses custom dataset when --dataset flag is provided', async () => {\n mockedDeleteSchemaAction.mockResolvedValue('success')\n\n await testCommand(DeleteSchemaCommand, [\n '--ids',\n 'sanity.workspace.schema.workspaceName',\n '--dataset',\n 'staging',\n ])\n\n expect(mockedDeleteSchemaAction).toHaveBeenCalledWith(\n expect.objectContaining({\n dataset: 'staging',\n ids: 'sanity.workspace.schema.workspaceName',\n }),\n expect.any(Object),\n )\n })\n\n test('disables manifest extraction with --no-extract-manifest', async () => {\n mockedDeleteSchemaAction.mockResolvedValue('success')\n\n await testCommand(DeleteSchemaCommand, [\n '--ids',\n 'sanity.workspace.schema.workspaceName',\n '--no-extract-manifest',\n ])\n\n expect(mockedDeleteSchemaAction).toHaveBeenCalledWith(\n expect.objectContaining({\n 'extract-manifest': false,\n ids: 'sanity.workspace.schema.workspaceName',\n }),\n expect.any(Object),\n )\n })\n\n test('uses custom manifest directory when --manifest-dir is provided', async () => {\n mockedDeleteSchemaAction.mockResolvedValue('success')\n\n await testCommand(DeleteSchemaCommand, [\n '--ids',\n 'sanity.workspace.schema.workspaceName',\n '--manifest-dir',\n './custom/path',\n ])\n\n expect(mockedDeleteSchemaAction).toHaveBeenCalledWith(\n expect.objectContaining({\n ids: 'sanity.workspace.schema.workspaceName',\n 'manifest-dir': './custom/path',\n }),\n expect.any(Object),\n )\n })\n\n test('enables verbose logging when --verbose is provided', async () => {\n mockedDeleteSchemaAction.mockResolvedValue('success')\n\n await testCommand(DeleteSchemaCommand, [\n '--ids',\n 'sanity.workspace.schema.workspaceName',\n '--verbose',\n ])\n\n expect(mockedDeleteSchemaAction).toHaveBeenCalledWith(\n expect.objectContaining({\n ids: 'sanity.workspace.schema.workspaceName',\n verbose: true,\n }),\n expect.any(Object),\n )\n })\n\n test('handles action failure', async () => {\n mockedDeleteSchemaAction.mockResolvedValue('failure')\n\n const {error} = await testCommand(DeleteSchemaCommand, [\n '--ids',\n 'sanity.workspace.schema.workspaceName',\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Failed to delete schemas')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles action errors gracefully', async () => {\n mockedDeleteSchemaAction.mockRejectedValue(new Error('Schema delete failed'))\n\n const {error} = await testCommand(DeleteSchemaCommand, [\n '--ids',\n 'sanity.workspace.schema.workspaceName',\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Failed to delete schemas: Schema delete failed')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('requires --ids flag', async () => {\n const {error} = await testCommand(DeleteSchemaCommand, [])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Missing required flag ids')\n })\n\n test.each([\n {desc: 'no project ID is found', projectId: undefined},\n {desc: 'project ID is empty string', projectId: ''},\n ])('throws error when $desc', async ({projectId}) => {\n // Mock getCliConfig twice since it's called by both run() and getProjectId()\n const mockConfig = {\n api: {\n dataset: 'production',\n projectId,\n },\n }\n mockedGetCliConfig.mockResolvedValueOnce(mockConfig).mockResolvedValueOnce(mockConfig)\n\n const {error} = await testCommand(DeleteSchemaCommand, [\n '--ids',\n 'sanity.workspace.schema.workspaceName',\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('No project ID found')\n expect(error?.message).toContain('Sanity project directory')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test.each([\n {dataset: undefined, desc: 'no dataset is found'},\n {dataset: '', desc: 'dataset is empty string'},\n ])('throws error when $desc', async ({dataset}) => {\n // Mock getCliConfig twice since it's called by both run() and getProjectId()\n const mockConfig = {\n api: {\n dataset,\n projectId: 'test-project',\n },\n }\n mockedGetCliConfig.mockResolvedValueOnce(mockConfig).mockResolvedValueOnce(mockConfig)\n\n const {error} = await testCommand(DeleteSchemaCommand, [\n '--ids',\n 'sanity.workspace.schema.workspaceName',\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('No dataset found')\n expect(error?.message).toContain('sanity.config.ts')\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","getCliConfig","testCommand","afterEach","beforeEach","describe","expect","test","vi","deleteSchemaAction","DeleteSchemaCommand","mock","fn","createManifestExtractor","findProjectRoot","mockResolvedValue","directory","root","type","api","dataset","projectId","getProjectCliClient","getCliToken","mockedDeleteSchemaAction","mocked","mockedGetCliConfig","clearAllMocks","stdout","toContain","toHaveBeenCalledWith","objectContaining","ids","any","Object","verbose","error","toBeInstanceOf","Error","message","oclif","exit","toBe","mockRejectedValue","each","desc","undefined","mockConfig","mockResolvedValueOnce"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/schema/__tests__/delete.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'\n\nimport {extractManifestSafe} from '../../../actions/manifest/extractManifest.js'\nimport {createManifestReader} from '../../../actions/schema/utils/manifestReader.js'\nimport {SCHEMA_API_VERSION} from '../../../services/schemas.js'\nimport {NO_DATASET_ID, NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {DeleteSchemaCommand} from '../delete.js'\n\nconst mockManifest = {\n createdAt: '2024-01-01T00:00:00.000Z',\n studioVersion: '3.0.0',\n version: 3,\n workspaces: [\n {\n basePath: '/',\n dataset: 'production',\n icon: null,\n name: 'default',\n projectId: 'test-project',\n schema: 'default.create-schema.json',\n tools: 'default.create-tools.json',\n },\n {\n basePath: '/staging',\n dataset: 'staging',\n icon: null,\n name: 'staging',\n projectId: 'test-project',\n schema: 'staging.create-schema.json',\n tools: 'staging.create-tools.json',\n },\n ],\n}\n\nconst mockSchemas = ['_.schemas.default', '_.schemas.staging']\n\nvi.mock('../../../actions/manifest/extractManifest.js')\nvi.mock('../../../actions/schema/utils/manifestReader.js')\n\nconst mockExtractManifestSafe = vi.mocked(extractManifestSafe)\nconst mockedCreateManifestReader = vi.mocked(createManifestReader)\nconst testProjectId = 'test-project'\n\nconst defaultMocks = {\n cliConfig: {api: {dataset: 'production', projectId: testProjectId}},\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n type: 'studio' as const,\n },\n token: 'test-token',\n}\n\ndescribe('#schema:delete', () => {\n beforeEach(() => {\n vi.clearAllMocks()\n\n for (const schema of mockSchemas) {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: `/projects/test-project/datasets/production/schemas/${schema}`,\n }).reply(200, [{}])\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: `/projects/test-project/datasets/staging/schemas/${schema}`,\n }).reply(200, [{}])\n }\n\n mockedCreateManifestReader.mockReturnValue({\n getManifest: vi.fn().mockResolvedValue(mockManifest),\n getWorkspaceSchema: vi.fn(),\n })\n\n mockExtractManifestSafe.mockResolvedValue(undefined)\n })\n\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['schema delete', '--help'])\n\n expect(stdout).toContain('Delete schema documents by id')\n expect(stdout).toContain('--ids')\n expect(stdout).toContain('--dataset')\n expect(stdout).toContain('--extract-manifest')\n expect(stdout).toContain('--manifest-dir')\n expect(stdout).toContain('--verbose')\n })\n\n test('successfully deletes a single schema', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'delete',\n uri: '/projects/test-project/datasets/production/schemas/_.schemas.default',\n }).reply(200, {deleted: true})\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'delete',\n uri: '/projects/test-project/datasets/staging/schemas/_.schemas.default',\n }).reply(200, {deleted: true})\n\n const {error, stdout} = await testCommand(DeleteSchemaCommand, ['--ids', '_.schemas.default'], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toContain('Successfully deleted 1/1 schemas')\n expect(error).toBeUndefined()\n })\n\n test('successfully deletes multiple schemas', async () => {\n for (const schema of mockSchemas) {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'delete',\n uri: `/projects/test-project/datasets/production/schemas/${schema}`,\n }).reply(200, {deleted: true})\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'delete',\n uri: `/projects/test-project/datasets/staging/schemas/${schema}`,\n }).reply(200, {deleted: true})\n }\n\n const {error, stdout} = await testCommand(\n DeleteSchemaCommand,\n ['--ids', '_.schemas.default,_.schemas.staging'],\n {mocks: defaultMocks},\n )\n\n expect(stdout).toContain('Successfully deleted 2/2 schemas')\n expect(error).toBeUndefined()\n })\n\n test('filters schemas by dataset when dataset flag is provided', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'delete',\n uri: '/projects/test-project/datasets/production/schemas/_.schemas.default',\n }).reply(200, {deleted: true})\n\n const {error, stdout} = await testCommand(\n DeleteSchemaCommand,\n ['--ids', '_.schemas.default', '--dataset', 'production'],\n {mocks: defaultMocks},\n )\n\n expect(stdout).toContain('Successfully deleted 1/1 schemas')\n expect(error).toBeUndefined()\n })\n\n test.each([\n {desc: 'no project ID is found', projectId: undefined},\n {desc: 'project ID is empty string', projectId: ''},\n ])('throws an error if $desc', async ({projectId}) => {\n const {error} = await testCommand(DeleteSchemaCommand, ['--ids', '_.schemas.default'], {\n mocks: {...defaultMocks, cliConfig: {api: {dataset: 'production', projectId}}},\n })\n\n expect(error?.message).toContain(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test.each([\n {dataset: undefined, desc: 'no dataset is found'},\n {dataset: '', desc: 'dataset is empty string'},\n ])('throws an error if $desc', async ({dataset}) => {\n const {error} = await testCommand(DeleteSchemaCommand, ['--ids', '_.schemas.default'], {\n mocks: {...defaultMocks, cliConfig: {api: {dataset, projectId: 'test-project'}}},\n })\n\n expect(error?.message).toContain(NO_DATASET_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('throws an error if ids is an empty string', async () => {\n const {error} = await testCommand(DeleteSchemaCommand, ['--ids'], {mocks: defaultMocks})\n\n expect(error?.message).toContain('Flag --ids expects a value')\n expect(error?.oclif?.exit).toBe(2)\n })\n\n test.each([\n {\n desc: 'ids with invalid characters (!)',\n expectedError: 'id can only contain characters in [a-zA-Z0-9._-]',\n ids: 'test-id!!',\n },\n {\n desc: 'ids with invalid characters (@)',\n expectedError: 'id can only contain characters in [a-zA-Z0-9._-]',\n ids: '_.schemas.default@tag',\n },\n {\n desc: 'id starts with dash',\n expectedError: 'id cannot start with - (dash)',\n ids: '-_.schemas.default',\n },\n {\n desc: 'id has consecutive periods',\n expectedError: 'id cannot have consecutive . (period) characters',\n ids: '_.schemas..default',\n },\n {\n desc: 'id missing required prefix',\n expectedError: 'id must either match _.schemas.<workspaceName>',\n ids: 'schemas.default',\n },\n {\n desc: 'id has invalid workspace name (space)',\n expectedError: 'id can only contain characters in [a-zA-Z0-9._-]',\n ids: '_.schemas.default workspace',\n },\n {\n desc: 'duplicate ids in comma-separated list',\n expectedError: 'ids contains duplicates',\n ids: '_.schemas.default,_.schemas.default',\n },\n {\n desc: 'comma-separated with one duplicate',\n expectedError: 'ids contains duplicates',\n ids: '_.schemas.production,_.schemas.staging,_.schemas.production',\n },\n {\n desc: 'all entries are empty after trimming',\n expectedError: 'ids contains no valid id strings',\n ids: ' , , ',\n },\n ])('throws error when $desc', async ({expectedError, ids}) => {\n const {error} = await testCommand(DeleteSchemaCommand, ['--ids', ids], {mocks: defaultMocks})\n\n expect(error?.message).toContain(expectedError)\n expect(error?.oclif?.exit).toBe(2)\n })\n\n test('throws error when dataset flag is not provided a value', async () => {\n const {error} = await testCommand(\n DeleteSchemaCommand,\n ['--ids', '_.schemas.default', '--dataset'],\n {mocks: defaultMocks},\n )\n\n expect(error?.message).toContain('Flag --dataset expects a value')\n expect(error?.oclif?.exit).toBe(2)\n })\n\n test('throws an error when schema is not found', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: `/projects/test-project/datasets/production/schemas/_.schemas.nonexistent`,\n }).reply(200, [])\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: `/projects/test-project/datasets/staging/schemas/_.schemas.nonexistent`,\n }).reply(200, [])\n\n const {error} = await testCommand(DeleteSchemaCommand, ['--ids', '_.schemas.nonexistent'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Deleted 0/1 schemas')\n expect(error?.message).toContain('not found')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('throws an error when some schemas are not found', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'delete',\n uri: '/projects/test-project/datasets/production/schemas/_.schemas.default',\n }).reply(200, {deleted: true})\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'delete',\n uri: '/projects/test-project/datasets/staging/schemas/_.schemas.default',\n }).reply(200, {deleted: true})\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: `/projects/test-project/datasets/production/schemas/_.schemas.nonexistent`,\n }).reply(200, [])\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n uri: `/projects/test-project/datasets/staging/schemas/_.schemas.nonexistent`,\n }).reply(200, [])\n\n const {error} = await testCommand(\n DeleteSchemaCommand,\n ['--ids', '_.schemas.default,_.schemas.nonexistent'],\n {mocks: defaultMocks},\n )\n\n expect(error?.message).toContain('Deleted 1/2 schemas')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('throws an error if delete request fails', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'delete',\n uri: '/projects/test-project/datasets/production/schemas/_.schemas.default',\n }).reply(403, {\n error: 'Delete failed',\n })\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'delete',\n uri: '/projects/test-project/datasets/staging/schemas/_.schemas.default',\n }).reply(403, {\n error: 'Delete failed',\n })\n\n const {error} = await testCommand(DeleteSchemaCommand, ['--ids', '_.schemas.default'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Failed to delete schema')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('outputs a verbose warning when verbose flag is enabled', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'delete',\n uri: '/projects/test-project/datasets/production/schemas/_.schemas.default',\n }).reply(403, {\n error: 'Delete failed',\n })\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'delete',\n uri: '/projects/test-project/datasets/staging/schemas/_.schemas.default',\n }).reply(403, {\n error: 'Delete failed',\n })\n\n const {error, stderr} = await testCommand(\n DeleteSchemaCommand,\n ['--ids', '_.schemas.default', '--verbose'],\n {mocks: defaultMocks},\n )\n\n expect(stderr).toContain('Failed to delete schema \"_.schemas.default\"')\n expect(stderr).toContain('DeleteIdError: Delete failed')\n expect(error?.message).toContain('Deleted 0/1 schemas')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('outputs a warning on projectId mismatch', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'delete',\n uri: '/projects/test-project/datasets/production/schemas/_.schemas.default',\n }).reply(200, {deleted: true})\n\n const mismatchManifest = {\n ...mockManifest,\n workspaces: [\n {...mockManifest.workspaces[0], projectId: 'test-project'},\n {...mockManifest.workspaces[1], projectId: 'different-project'},\n ],\n }\n\n mockedCreateManifestReader.mockReturnValue({\n getManifest: vi.fn().mockResolvedValue(mismatchManifest),\n getWorkspaceSchema: vi.fn(),\n })\n\n const {stderr, stdout} = await testCommand(\n DeleteSchemaCommand,\n ['--ids', '_.schemas.default'],\n {mocks: defaultMocks},\n )\n\n expect(stderr).toContain('No permissions to read schema for workspace \"staging\"')\n expect(stdout).toContain('Successfully deleted 1/1 schemas')\n })\n\n test('skips manifest extraction with no-extract-manifest flag', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'delete',\n uri: '/projects/test-project/datasets/production/schemas/_.schemas.default',\n }).reply(200, {deleted: true})\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'delete',\n uri: '/projects/test-project/datasets/staging/schemas/_.schemas.default',\n }).reply(200, {deleted: true})\n\n await testCommand(DeleteSchemaCommand, ['--ids', '_.schemas.default', '--no-manifest-extract'])\n\n expect(mockExtractManifestSafe).not.toHaveBeenCalled()\n })\n})\n"],"names":["runCommand","mockApi","testCommand","afterEach","beforeEach","describe","expect","test","vi","extractManifestSafe","createManifestReader","SCHEMA_API_VERSION","NO_DATASET_ID","NO_PROJECT_ID","DeleteSchemaCommand","mockManifest","createdAt","studioVersion","version","workspaces","basePath","dataset","icon","name","projectId","schema","tools","mockSchemas","mock","mockExtractManifestSafe","mocked","mockedCreateManifestReader","testProjectId","defaultMocks","cliConfig","api","projectRoot","directory","path","type","token","clearAllMocks","apiVersion","uri","reply","mockReturnValue","getManifest","fn","mockResolvedValue","getWorkspaceSchema","undefined","stdout","toContain","method","deleted","error","mocks","toBeUndefined","each","desc","message","oclif","exit","toBe","expectedError","ids","stderr","mismatchManifest","not","toHaveBeenCalled"],"mappings":"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"}
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import { runCommand } from '@oclif/test';
|
|
2
|
+
import { getCliConfig } from '@sanity/cli-core';
|
|
3
|
+
import { mockApi, testCommand } from '@sanity/cli-test';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
|
|
5
|
+
import { extractManifestSafe } from '../../../actions/manifest/extractManifest.js';
|
|
6
|
+
import { createManifestReader } from '../../../actions/schema/utils/manifestReader.js';
|
|
7
|
+
import { SCHEMA_API_VERSION } from '../../../services/schemas.js';
|
|
8
|
+
import { NO_DATASET_ID, NO_PROJECT_ID } from '../../../util/errorMessages.js';
|
|
9
|
+
import { DeploySchemaCommand } from '../deploy.js';
|
|
10
|
+
const mockManifest = {
|
|
11
|
+
createdAt: '2024-01-01T00:00:00.000Z',
|
|
12
|
+
studioVersion: '3.0.0',
|
|
13
|
+
version: 3,
|
|
14
|
+
workspaces: [
|
|
15
|
+
{
|
|
16
|
+
basePath: '/',
|
|
17
|
+
dataset: 'production',
|
|
18
|
+
icon: null,
|
|
19
|
+
name: 'default',
|
|
20
|
+
projectId: 'test-project',
|
|
21
|
+
schema: 'default.create-schema.json',
|
|
22
|
+
tools: 'default.create-tools.json'
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
basePath: '/staging',
|
|
26
|
+
dataset: 'staging',
|
|
27
|
+
icon: null,
|
|
28
|
+
name: 'staging',
|
|
29
|
+
projectId: 'test-project',
|
|
30
|
+
schema: 'staging.create-schema.json',
|
|
31
|
+
tools: 'staging.create-tools.json'
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
};
|
|
35
|
+
vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', async ()=>({
|
|
36
|
+
findProjectRoot: vi.fn().mockResolvedValue({})
|
|
37
|
+
}));
|
|
38
|
+
vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
|
|
39
|
+
getCliConfig: vi.fn()
|
|
40
|
+
}));
|
|
41
|
+
vi.mock('../../../actions/manifest/extractManifest.js');
|
|
42
|
+
vi.mock('../../../actions/schema/utils/manifestReader.js');
|
|
43
|
+
const mockedGetCliConfig = vi.mocked(getCliConfig);
|
|
44
|
+
const mockExtractManifestSafe = vi.mocked(extractManifestSafe);
|
|
45
|
+
const mockedCreateManifestReader = vi.mocked(createManifestReader);
|
|
46
|
+
describe('#schema:deploy', ()=>{
|
|
47
|
+
beforeEach(()=>{
|
|
48
|
+
vi.clearAllMocks();
|
|
49
|
+
mockedGetCliConfig.mockResolvedValue({
|
|
50
|
+
api: {
|
|
51
|
+
dataset: 'production',
|
|
52
|
+
projectId: 'test-project'
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
mockedCreateManifestReader.mockReturnValue({
|
|
56
|
+
getManifest: vi.fn().mockResolvedValue(mockManifest),
|
|
57
|
+
getWorkspaceSchema: vi.fn()
|
|
58
|
+
});
|
|
59
|
+
mockExtractManifestSafe.mockResolvedValue(undefined);
|
|
60
|
+
});
|
|
61
|
+
afterEach(()=>{
|
|
62
|
+
vi.clearAllMocks();
|
|
63
|
+
});
|
|
64
|
+
test('should show --help text', async ()=>{
|
|
65
|
+
const { stdout } = await runCommand('schema deploy --help');
|
|
66
|
+
expect(stdout).toMatchInlineSnapshot(`
|
|
67
|
+
"Deploy schema documents into workspace datasets.
|
|
68
|
+
|
|
69
|
+
USAGE
|
|
70
|
+
$ sanity schema deploy [--extract-manifest] [--manifest-dir <directory>]
|
|
71
|
+
[--tag <tag>] [--verbose] [--workspace <name>]
|
|
72
|
+
|
|
73
|
+
FLAGS
|
|
74
|
+
--[no-]extract-manifest Disables manifest generation - the command will
|
|
75
|
+
fail if no manifest exists
|
|
76
|
+
--manifest-dir=<directory> [default: ./dist/static] Directory containing
|
|
77
|
+
manifest file
|
|
78
|
+
--tag=<tag> Add a tag suffix to the schema id
|
|
79
|
+
--verbose Print detailed information during deployment
|
|
80
|
+
--workspace=<name> The name of the workspace to deploy a schema for
|
|
81
|
+
|
|
82
|
+
DESCRIPTION
|
|
83
|
+
Deploy schema documents into workspace datasets.
|
|
84
|
+
|
|
85
|
+
**Note**: This command is experimental and subject to change.
|
|
86
|
+
|
|
87
|
+
This operation (re-)generates a manifest file describing the sanity config
|
|
88
|
+
workspace by default.
|
|
89
|
+
To re-use an existing manifest file, use --no-extract-manifest.
|
|
90
|
+
|
|
91
|
+
EXAMPLES
|
|
92
|
+
Deploy all workspace schemas
|
|
93
|
+
|
|
94
|
+
$ sanity schema deploy
|
|
95
|
+
|
|
96
|
+
Deploy the schema for only the workspace "default"
|
|
97
|
+
|
|
98
|
+
$ sanity schema deploy --workspace default
|
|
99
|
+
|
|
100
|
+
Runs using a pre-existing manifest file. Config changes in sanity.config
|
|
101
|
+
will not be picked up in this case.
|
|
102
|
+
|
|
103
|
+
$ sanity schema deploy --no-extract-manifest
|
|
104
|
+
|
|
105
|
+
"
|
|
106
|
+
`);
|
|
107
|
+
});
|
|
108
|
+
test('should deploy schemas', async ()=>{
|
|
109
|
+
mockApi({
|
|
110
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
111
|
+
method: 'put',
|
|
112
|
+
uri: '/projects/test-project/datasets/production/schemas'
|
|
113
|
+
}).reply(200, undefined);
|
|
114
|
+
mockApi({
|
|
115
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
116
|
+
method: 'put',
|
|
117
|
+
uri: '/projects/test-project/datasets/staging/schemas'
|
|
118
|
+
}).reply(200, undefined);
|
|
119
|
+
const { stdout } = await testCommand(DeploySchemaCommand);
|
|
120
|
+
expect(stdout).toContain('Deployed 2/2 schemas');
|
|
121
|
+
expect(stdout).toContain('↳ List deployed schemas with: sanity schema list');
|
|
122
|
+
});
|
|
123
|
+
test('should deploy a specific schema based on workspace flag', async ()=>{
|
|
124
|
+
mockApi({
|
|
125
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
126
|
+
method: 'put',
|
|
127
|
+
uri: '/projects/test-project/datasets/production/schemas'
|
|
128
|
+
}).reply(200, undefined);
|
|
129
|
+
const { stdout } = await testCommand(DeploySchemaCommand, [
|
|
130
|
+
'--workspace',
|
|
131
|
+
'default'
|
|
132
|
+
]);
|
|
133
|
+
expect(stdout).toContain('Deployed 1/1 schemas');
|
|
134
|
+
expect(stdout).toContain('↳ List deployed schemas with: sanity schema list');
|
|
135
|
+
});
|
|
136
|
+
test('should enable verbose logging with verbose flag', async ()=>{
|
|
137
|
+
mockApi({
|
|
138
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
139
|
+
method: 'put',
|
|
140
|
+
uri: '/projects/test-project/datasets/production/schemas'
|
|
141
|
+
}).reply(200, undefined);
|
|
142
|
+
mockApi({
|
|
143
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
144
|
+
method: 'put',
|
|
145
|
+
uri: '/projects/test-project/datasets/staging/schemas'
|
|
146
|
+
}).reply(200, undefined);
|
|
147
|
+
const { stdout } = await testCommand(DeploySchemaCommand, [
|
|
148
|
+
'--verbose'
|
|
149
|
+
]);
|
|
150
|
+
expect(stdout).toContain('↳ schemaId: _.schemas.default, projectId: test-project, dataset: production');
|
|
151
|
+
});
|
|
152
|
+
test.each([
|
|
153
|
+
{
|
|
154
|
+
desc: 'no project ID is found',
|
|
155
|
+
projectId: undefined
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
desc: 'project ID is empty string',
|
|
159
|
+
projectId: ''
|
|
160
|
+
}
|
|
161
|
+
])('throws an error if $desc', async ({ projectId })=>{
|
|
162
|
+
mockedGetCliConfig.mockResolvedValue({
|
|
163
|
+
api: {
|
|
164
|
+
dataset: 'production',
|
|
165
|
+
projectId
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
const { error } = await testCommand(DeploySchemaCommand);
|
|
169
|
+
expect(error?.message).toContain(NO_PROJECT_ID);
|
|
170
|
+
});
|
|
171
|
+
test.each([
|
|
172
|
+
{
|
|
173
|
+
dataset: undefined,
|
|
174
|
+
desc: 'no dataset is found'
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
dataset: '',
|
|
178
|
+
desc: 'dataset is empty string'
|
|
179
|
+
}
|
|
180
|
+
])('throws an error if $desc', async ({ dataset })=>{
|
|
181
|
+
mockedGetCliConfig.mockResolvedValue({
|
|
182
|
+
api: {
|
|
183
|
+
dataset,
|
|
184
|
+
projectId: 'test-project'
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
const { error } = await testCommand(DeploySchemaCommand);
|
|
188
|
+
expect(error?.message).toContain(NO_DATASET_ID);
|
|
189
|
+
});
|
|
190
|
+
test.each([
|
|
191
|
+
{
|
|
192
|
+
flag: 'tag'
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
flag: 'workspace'
|
|
196
|
+
}
|
|
197
|
+
])('throws error when $flag flag is empty string', async ({ flag })=>{
|
|
198
|
+
const { error } = await testCommand(DeploySchemaCommand, [
|
|
199
|
+
`--${flag}`,
|
|
200
|
+
''
|
|
201
|
+
]);
|
|
202
|
+
expect(error?.message).toContain(`${flag} argument is empty`);
|
|
203
|
+
});
|
|
204
|
+
test.each([
|
|
205
|
+
{
|
|
206
|
+
desc: 'contains period',
|
|
207
|
+
expectedError: 'tag cannot contain . (period)',
|
|
208
|
+
tag: 'test.tag'
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
desc: 'starts with dash',
|
|
212
|
+
expectedError: 'tag cannot start with - (dash)',
|
|
213
|
+
tag: '-testtag'
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
desc: 'contains invalid character (space)',
|
|
217
|
+
expectedError: 'tag can only contain characters in [a-zA-Z0-9_-]',
|
|
218
|
+
tag: 'test tag'
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
desc: 'contains invalid character (@)',
|
|
222
|
+
expectedError: 'tag can only contain characters in [a-zA-Z0-9_-]',
|
|
223
|
+
tag: 'test@tag'
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
desc: 'contains invalid character (!)',
|
|
227
|
+
expectedError: 'tag can only contain characters in [a-zA-Z0-9_-]',
|
|
228
|
+
tag: 'test!'
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
desc: 'contains multiple periods',
|
|
232
|
+
expectedError: 'tag cannot contain . (period)',
|
|
233
|
+
tag: 'test.tag.name'
|
|
234
|
+
}
|
|
235
|
+
])('throws error when tag $desc', async ({ expectedError, tag })=>{
|
|
236
|
+
const { error } = await testCommand(DeploySchemaCommand, [
|
|
237
|
+
'--tag',
|
|
238
|
+
tag
|
|
239
|
+
]);
|
|
240
|
+
expect(error?.message).toContain(expectedError);
|
|
241
|
+
});
|
|
242
|
+
test.each([
|
|
243
|
+
{
|
|
244
|
+
desc: 'valid tag with alphanumeric',
|
|
245
|
+
tag: 'v1'
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
desc: 'valid tag with underscore',
|
|
249
|
+
tag: 'feature_branch'
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
desc: 'valid tag with dash in middle',
|
|
253
|
+
tag: 'test-tag'
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
desc: 'valid tag with mixed case',
|
|
257
|
+
tag: 'TestTag123'
|
|
258
|
+
}
|
|
259
|
+
])('successfully parses $desc', async ({ tag })=>{
|
|
260
|
+
mockApi({
|
|
261
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
262
|
+
method: 'put',
|
|
263
|
+
uri: '/projects/test-project/datasets/production/schemas'
|
|
264
|
+
}).reply(200, undefined);
|
|
265
|
+
mockApi({
|
|
266
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
267
|
+
method: 'put',
|
|
268
|
+
uri: '/projects/test-project/datasets/staging/schemas'
|
|
269
|
+
}).reply(200, undefined);
|
|
270
|
+
const { error } = await testCommand(DeploySchemaCommand, [
|
|
271
|
+
'--tag',
|
|
272
|
+
tag
|
|
273
|
+
]);
|
|
274
|
+
expect(error).toBeUndefined();
|
|
275
|
+
});
|
|
276
|
+
test('throw an error if some schemas fail to deploy', async ()=>{
|
|
277
|
+
mockApi({
|
|
278
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
279
|
+
method: 'put',
|
|
280
|
+
uri: '/projects/test-project/datasets/production/schemas'
|
|
281
|
+
}).reply(200, undefined);
|
|
282
|
+
mockApi({
|
|
283
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
284
|
+
method: 'put',
|
|
285
|
+
uri: '/projects/test-project/datasets/staging/schemas'
|
|
286
|
+
}).reply(404, undefined);
|
|
287
|
+
const { error, stdout } = await testCommand(DeploySchemaCommand);
|
|
288
|
+
expect(error?.message).toContain('Failed to deploy 1/2 schemas. Successfully deployed 1/2 schemas.');
|
|
289
|
+
expect(stdout).toContain('↳ List deployed schemas with: sanity schema list');
|
|
290
|
+
});
|
|
291
|
+
test('throws an error if workspace is not found', async ()=>{
|
|
292
|
+
const { error } = await testCommand(DeploySchemaCommand, [
|
|
293
|
+
'--workspace',
|
|
294
|
+
'test'
|
|
295
|
+
]);
|
|
296
|
+
expect(error?.message).toContain('Found no workspaces named "test"');
|
|
297
|
+
});
|
|
298
|
+
test('throws an error if schema request fails', async ()=>{
|
|
299
|
+
mockApi({
|
|
300
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
301
|
+
method: 'put',
|
|
302
|
+
uri: '/projects/test-project/datasets/production/schemas'
|
|
303
|
+
}).reply(400, {
|
|
304
|
+
error: 'Bad request'
|
|
305
|
+
});
|
|
306
|
+
mockApi({
|
|
307
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
308
|
+
method: 'put',
|
|
309
|
+
uri: '/projects/test-project/datasets/staging/schemas'
|
|
310
|
+
}).reply(400, {
|
|
311
|
+
error: 'Bad request'
|
|
312
|
+
});
|
|
313
|
+
const { error } = await testCommand(DeploySchemaCommand);
|
|
314
|
+
expect(error?.message).toContain('↳ Error when storing schemas');
|
|
315
|
+
});
|
|
316
|
+
test('throws an error if schema request fails due to permissions', async ()=>{
|
|
317
|
+
mockApi({
|
|
318
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
319
|
+
method: 'put',
|
|
320
|
+
uri: '/projects/test-project/datasets/production/schemas'
|
|
321
|
+
}).reply(401);
|
|
322
|
+
mockApi({
|
|
323
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
324
|
+
method: 'put',
|
|
325
|
+
uri: '/projects/test-project/datasets/staging/schemas'
|
|
326
|
+
}).reply(200, undefined);
|
|
327
|
+
const { stderr } = await testCommand(DeploySchemaCommand);
|
|
328
|
+
expect(stderr).toContain('↳ No permissions to write schema for workspace "default"');
|
|
329
|
+
});
|
|
330
|
+
test('skips manifest extraction with no-extract-manifest flag', async ()=>{
|
|
331
|
+
mockApi({
|
|
332
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
333
|
+
method: 'put',
|
|
334
|
+
uri: '/projects/test-project/datasets/production/schemas'
|
|
335
|
+
}).reply(200, undefined);
|
|
336
|
+
mockApi({
|
|
337
|
+
apiVersion: SCHEMA_API_VERSION,
|
|
338
|
+
method: 'put',
|
|
339
|
+
uri: '/projects/test-project/datasets/staging/schemas'
|
|
340
|
+
}).reply(200, undefined);
|
|
341
|
+
await testCommand(DeploySchemaCommand, [
|
|
342
|
+
'--no-extract-manifest'
|
|
343
|
+
]);
|
|
344
|
+
expect(mockExtractManifestSafe).not.toHaveBeenCalled();
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
//# sourceMappingURL=deploy.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/schema/__tests__/deploy.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig} from '@sanity/cli-core'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'\n\nimport {extractManifestSafe} from '../../../actions/manifest/extractManifest.js'\nimport {createManifestReader} from '../../../actions/schema/utils/manifestReader.js'\nimport {SCHEMA_API_VERSION} from '../../../services/schemas.js'\nimport {NO_DATASET_ID, NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {DeploySchemaCommand} from '../deploy.js'\n\nconst mockManifest = {\n createdAt: '2024-01-01T00:00:00.000Z',\n studioVersion: '3.0.0',\n version: 3,\n workspaces: [\n {\n basePath: '/',\n dataset: 'production',\n icon: null,\n name: 'default',\n projectId: 'test-project',\n schema: 'default.create-schema.json',\n tools: 'default.create-tools.json',\n },\n {\n basePath: '/staging',\n dataset: 'staging',\n icon: null,\n name: 'staging',\n projectId: 'test-project',\n schema: 'staging.create-schema.json',\n tools: 'staging.create-tools.json',\n },\n ],\n}\n\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', async () => ({\n findProjectRoot: vi.fn().mockResolvedValue({}),\n}))\n\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: vi.fn(),\n}))\n\nvi.mock('../../../actions/manifest/extractManifest.js')\nvi.mock('../../../actions/schema/utils/manifestReader.js')\n\nconst mockedGetCliConfig = vi.mocked(getCliConfig)\nconst mockExtractManifestSafe = vi.mocked(extractManifestSafe)\nconst mockedCreateManifestReader = vi.mocked(createManifestReader)\n\ndescribe('#schema:deploy', () => {\n beforeEach(() => {\n vi.clearAllMocks()\n\n mockedGetCliConfig.mockResolvedValue({\n api: {\n dataset: 'production',\n projectId: 'test-project',\n },\n })\n\n mockedCreateManifestReader.mockReturnValue({\n getManifest: vi.fn().mockResolvedValue(mockManifest),\n getWorkspaceSchema: vi.fn(),\n })\n\n mockExtractManifestSafe.mockResolvedValue(undefined)\n })\n\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('should show --help text', async () => {\n const {stdout} = await runCommand('schema deploy --help')\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Deploy schema documents into workspace datasets.\n\n USAGE\n $ sanity schema deploy [--extract-manifest] [--manifest-dir <directory>]\n [--tag <tag>] [--verbose] [--workspace <name>]\n\n FLAGS\n --[no-]extract-manifest Disables manifest generation - the command will\n fail if no manifest exists\n --manifest-dir=<directory> [default: ./dist/static] Directory containing\n manifest file\n --tag=<tag> Add a tag suffix to the schema id\n --verbose Print detailed information during deployment\n --workspace=<name> The name of the workspace to deploy a schema for\n\n DESCRIPTION\n Deploy schema documents into workspace datasets.\n\n **Note**: This command is experimental and subject to change.\n\n This operation (re-)generates a manifest file describing the sanity config\n workspace by default.\n To re-use an existing manifest file, use --no-extract-manifest.\n\n EXAMPLES\n Deploy all workspace schemas\n\n $ sanity schema deploy\n\n Deploy the schema for only the workspace \"default\"\n\n $ sanity schema deploy --workspace default\n\n Runs using a pre-existing manifest file. Config changes in sanity.config\n will not be picked up in this case.\n\n $ sanity schema deploy --no-extract-manifest\n\n \"\n `)\n })\n\n test('should deploy schemas', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/production/schemas',\n }).reply(200, undefined)\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/staging/schemas',\n }).reply(200, undefined)\n\n const {stdout} = await testCommand(DeploySchemaCommand)\n\n expect(stdout).toContain('Deployed 2/2 schemas')\n expect(stdout).toContain('↳ List deployed schemas with: sanity schema list')\n })\n\n test('should deploy a specific schema based on workspace flag', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/production/schemas',\n }).reply(200, undefined)\n\n const {stdout} = await testCommand(DeploySchemaCommand, ['--workspace', 'default'])\n\n expect(stdout).toContain('Deployed 1/1 schemas')\n expect(stdout).toContain('↳ List deployed schemas with: sanity schema list')\n })\n\n test('should enable verbose logging with verbose flag', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/production/schemas',\n }).reply(200, undefined)\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/staging/schemas',\n }).reply(200, undefined)\n\n const {stdout} = await testCommand(DeploySchemaCommand, ['--verbose'])\n\n expect(stdout).toContain(\n '↳ schemaId: _.schemas.default, projectId: test-project, dataset: production',\n )\n })\n\n test.each([\n {desc: 'no project ID is found', projectId: undefined},\n {desc: 'project ID is empty string', projectId: ''},\n ])('throws an error if $desc', async ({projectId}) => {\n mockedGetCliConfig.mockResolvedValue({\n api: {\n dataset: 'production',\n projectId,\n },\n })\n\n const {error} = await testCommand(DeploySchemaCommand)\n\n expect(error?.message).toContain(NO_PROJECT_ID)\n })\n\n test.each([\n {dataset: undefined, desc: 'no dataset is found'},\n {dataset: '', desc: 'dataset is empty string'},\n ])('throws an error if $desc', async ({dataset}) => {\n mockedGetCliConfig.mockResolvedValue({\n api: {\n dataset,\n projectId: 'test-project',\n },\n })\n\n const {error} = await testCommand(DeploySchemaCommand)\n\n expect(error?.message).toContain(NO_DATASET_ID)\n })\n\n test.each([{flag: 'tag'}, {flag: 'workspace'}])(\n 'throws error when $flag flag is empty string',\n async ({flag}) => {\n const {error} = await testCommand(DeploySchemaCommand, [`--${flag}`, ''])\n\n expect(error?.message).toContain(`${flag} argument is empty`)\n },\n )\n\n test.each([\n {\n desc: 'contains period',\n expectedError: 'tag cannot contain . (period)',\n tag: 'test.tag',\n },\n {\n desc: 'starts with dash',\n expectedError: 'tag cannot start with - (dash)',\n tag: '-testtag',\n },\n {\n desc: 'contains invalid character (space)',\n expectedError: 'tag can only contain characters in [a-zA-Z0-9_-]',\n tag: 'test tag',\n },\n {\n desc: 'contains invalid character (@)',\n expectedError: 'tag can only contain characters in [a-zA-Z0-9_-]',\n tag: 'test@tag',\n },\n {\n desc: 'contains invalid character (!)',\n expectedError: 'tag can only contain characters in [a-zA-Z0-9_-]',\n tag: 'test!',\n },\n {\n desc: 'contains multiple periods',\n expectedError: 'tag cannot contain . (period)',\n tag: 'test.tag.name',\n },\n ])('throws error when tag $desc', async ({expectedError, tag}) => {\n const {error} = await testCommand(DeploySchemaCommand, ['--tag', tag])\n\n expect(error?.message).toContain(expectedError)\n })\n\n test.each([\n {\n desc: 'valid tag with alphanumeric',\n tag: 'v1',\n },\n {\n desc: 'valid tag with underscore',\n tag: 'feature_branch',\n },\n {\n desc: 'valid tag with dash in middle',\n tag: 'test-tag',\n },\n {\n desc: 'valid tag with mixed case',\n tag: 'TestTag123',\n },\n ])('successfully parses $desc', async ({tag}) => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/production/schemas',\n }).reply(200, undefined)\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/staging/schemas',\n }).reply(200, undefined)\n\n const {error} = await testCommand(DeploySchemaCommand, ['--tag', tag])\n\n expect(error).toBeUndefined()\n })\n\n test('throw an error if some schemas fail to deploy', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/production/schemas',\n }).reply(200, undefined)\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/staging/schemas',\n }).reply(404, undefined)\n\n const {error, stdout} = await testCommand(DeploySchemaCommand)\n\n expect(error?.message).toContain(\n 'Failed to deploy 1/2 schemas. Successfully deployed 1/2 schemas.',\n )\n expect(stdout).toContain('↳ List deployed schemas with: sanity schema list')\n })\n\n test('throws an error if workspace is not found', async () => {\n const {error} = await testCommand(DeploySchemaCommand, ['--workspace', 'test'])\n\n expect(error?.message).toContain('Found no workspaces named \"test\"')\n })\n\n test('throws an error if schema request fails', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/production/schemas',\n }).reply(400, {\n error: 'Bad request',\n })\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/staging/schemas',\n }).reply(400, {\n error: 'Bad request',\n })\n\n const {error} = await testCommand(DeploySchemaCommand)\n\n expect(error?.message).toContain('↳ Error when storing schemas')\n })\n\n test('throws an error if schema request fails due to permissions', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/production/schemas',\n }).reply(401)\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/staging/schemas',\n }).reply(200, undefined)\n\n const {stderr} = await testCommand(DeploySchemaCommand)\n\n expect(stderr).toContain('↳ No permissions to write schema for workspace \"default\"')\n })\n\n test('skips manifest extraction with no-extract-manifest flag', async () => {\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/production/schemas',\n }).reply(200, undefined)\n mockApi({\n apiVersion: SCHEMA_API_VERSION,\n method: 'put',\n uri: '/projects/test-project/datasets/staging/schemas',\n }).reply(200, undefined)\n\n await testCommand(DeploySchemaCommand, ['--no-extract-manifest'])\n\n expect(mockExtractManifestSafe).not.toHaveBeenCalled()\n })\n})\n"],"names":["runCommand","getCliConfig","mockApi","testCommand","afterEach","beforeEach","describe","expect","test","vi","extractManifestSafe","createManifestReader","SCHEMA_API_VERSION","NO_DATASET_ID","NO_PROJECT_ID","DeploySchemaCommand","mockManifest","createdAt","studioVersion","version","workspaces","basePath","dataset","icon","name","projectId","schema","tools","mock","findProjectRoot","fn","mockResolvedValue","mockedGetCliConfig","mocked","mockExtractManifestSafe","mockedCreateManifestReader","clearAllMocks","api","mockReturnValue","getManifest","getWorkspaceSchema","undefined","stdout","toMatchInlineSnapshot","apiVersion","method","uri","reply","toContain","each","desc","error","message","flag","expectedError","tag","toBeUndefined","stderr","not","toHaveBeenCalled"],"mappings":"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"}
|
|
@@ -4,13 +4,13 @@ import { testCommand } from '@sanity/cli-test';
|
|
|
4
4
|
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
5
5
|
import { ExtractSchemaCommand } from '../extract.js';
|
|
6
6
|
vi.mock('node:fs/promises');
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
const defaultMocks = {
|
|
8
|
+
projectRoot: {
|
|
9
|
+
directory: '/test/project',
|
|
10
|
+
path: '/test/project/sanity.config.ts',
|
|
11
|
+
type: 'studio'
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
14
|
vi.mock('../../../util/getWorkspace.js', ()=>({
|
|
15
15
|
getWorkspace: vi.fn().mockReturnValue({})
|
|
16
16
|
}));
|
|
@@ -71,7 +71,9 @@ describe('#schema:extract', ()=>{
|
|
|
71
71
|
});
|
|
72
72
|
test('should extract schema', async ()=>{
|
|
73
73
|
mockWriteFile.mockResolvedValue(undefined);
|
|
74
|
-
const { stderr } = await testCommand(ExtractSchemaCommand
|
|
74
|
+
const { stderr } = await testCommand(ExtractSchemaCommand, [], {
|
|
75
|
+
mocks: defaultMocks
|
|
76
|
+
});
|
|
75
77
|
expect(stderr).toContain('Extracting schema');
|
|
76
78
|
expect(stderr).toContain('✔ Extracted schema');
|
|
77
79
|
expect(mockWriteFile).toHaveBeenCalledWith(expect.stringContaining('schema.json'), // eslint-disable-next-line no-useless-escape
|
|
@@ -81,7 +83,9 @@ describe('#schema:extract', ()=>{
|
|
|
81
83
|
mockWriteFile.mockResolvedValue(undefined);
|
|
82
84
|
const { stderr } = await testCommand(ExtractSchemaCommand, [
|
|
83
85
|
'--enforce-required-fields'
|
|
84
|
-
]
|
|
86
|
+
], {
|
|
87
|
+
mocks: defaultMocks
|
|
88
|
+
});
|
|
85
89
|
expect(stderr).toContain('Extracting schema with enforced required fields');
|
|
86
90
|
});
|
|
87
91
|
test('should extract schema with path flag', async ()=>{
|
|
@@ -90,7 +94,9 @@ describe('#schema:extract', ()=>{
|
|
|
90
94
|
const { stderr } = await testCommand(ExtractSchemaCommand, [
|
|
91
95
|
'--path',
|
|
92
96
|
'/test'
|
|
93
|
-
]
|
|
97
|
+
], {
|
|
98
|
+
mocks: defaultMocks
|
|
99
|
+
});
|
|
94
100
|
expect(stderr).toContain('Extracting schema');
|
|
95
101
|
expect(stderr).toContain('✔ Extracted schema');
|
|
96
102
|
expect(mockMkdir).toHaveBeenCalledWith('/test/project/test', {
|
|
@@ -103,7 +109,9 @@ describe('#schema:extract', ()=>{
|
|
|
103
109
|
const { error, stderr } = await testCommand(ExtractSchemaCommand, [
|
|
104
110
|
'--format',
|
|
105
111
|
'test-format'
|
|
106
|
-
]
|
|
112
|
+
], {
|
|
113
|
+
mocks: defaultMocks
|
|
114
|
+
});
|
|
107
115
|
expect(stderr).toContain('Extracting schema');
|
|
108
116
|
expect(stderr).toContain('Failed to extract schema');
|
|
109
117
|
expect(error?.message).toContain('Unsupported format: "test-format"');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/schema/__tests__/extract.test.ts"],"sourcesContent":["import {mkdir, writeFile} from 'node:fs/promises'\n\nimport {runCommand} from '@oclif/test'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {ExtractSchemaCommand} from '../extract.js'\n\nvi.mock('node:fs/promises')\n\
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/schema/__tests__/extract.test.ts"],"sourcesContent":["import {mkdir, writeFile} from 'node:fs/promises'\n\nimport {runCommand} from '@oclif/test'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {ExtractSchemaCommand} from '../extract.js'\n\nvi.mock('node:fs/promises')\n\nconst defaultMocks = {\n projectRoot: {\n directory: '/test/project',\n path: '/test/project/sanity.config.ts',\n type: 'studio' as const,\n },\n}\n\nvi.mock('../../../util/getWorkspace.js', () => ({\n getWorkspace: vi.fn().mockReturnValue({}),\n}))\n\nvi.mock('../../../util/importStudioConfig.js', async () => ({\n importStudioConfig: vi.fn(),\n}))\n\nvi.mock('@sanity/schema/_internal', () => ({\n extractSchema: vi.fn().mockReturnValue([\n {\n fields: [\n {\n name: 'type',\n title: 'string',\n },\n ],\n name: 'post',\n type: 'document',\n },\n ]),\n}))\n\nconst mockMkdir = vi.mocked(mkdir)\nconst mockWriteFile = vi.mocked(writeFile)\n\ndescribe('#schema:extract', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('should show --help text', async () => {\n const {stdout} = await runCommand('schema extract --help')\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Extracts a JSON representation of a Sanity schema within a Studio context.\n\n USAGE\n $ sanity schema extract [--enforce-required-fields] [--format <format>]\n [--path <value>] [--workspace <name>]\n\n FLAGS\n --enforce-required-fields Makes the schema generated treat fields marked as\n required as non-optional\n --format=<format> [default: groq-type-nodes] Format the schema as\n GROQ type nodes. Only available format at the\n moment.\n --path=<value> Optional path to specify destination of the schema\n file\n --workspace=<name> The name of the workspace to generate a schema for\n\n DESCRIPTION\n Extracts a JSON representation of a Sanity schema within a Studio context.\n\n **Note**: This command is experimental and subject to change.\n\n EXAMPLES\n Extracts schema types in a Sanity project with more than one workspace\n\n $ sanity schema extract --workspace default\n\n \"\n `)\n })\n\n test('should extract schema', async () => {\n mockWriteFile.mockResolvedValue(undefined)\n\n const {stderr} = await testCommand(ExtractSchemaCommand, [], {mocks: defaultMocks})\n\n expect(stderr).toContain('Extracting schema')\n expect(stderr).toContain('✔ Extracted schema')\n\n expect(mockWriteFile).toHaveBeenCalledWith(\n expect.stringContaining('schema.json'),\n // eslint-disable-next-line no-useless-escape\n expect.stringContaining(`\\\"name\\\": \\\"post\\\"`),\n )\n })\n\n test('should extract schema with enforce-required-fields flag', async () => {\n mockWriteFile.mockResolvedValue(undefined)\n\n const {stderr} = await testCommand(ExtractSchemaCommand, ['--enforce-required-fields'], {mocks: defaultMocks})\n\n expect(stderr).toContain('Extracting schema with enforced required fields')\n })\n\n test('should extract schema with path flag', async () => {\n mockMkdir.mockResolvedValue(undefined)\n mockWriteFile.mockResolvedValue(undefined)\n\n const {stderr} = await testCommand(ExtractSchemaCommand, ['--path', '/test'], {mocks: defaultMocks})\n\n expect(stderr).toContain('Extracting schema')\n expect(stderr).toContain('✔ Extracted schema')\n\n expect(mockMkdir).toHaveBeenCalledWith('/test/project/test', {recursive: true})\n\n expect(mockWriteFile).toHaveBeenCalledWith(\n '/test/project/test/schema.json',\n // eslint-disable-next-line no-useless-escape\n expect.stringContaining(`\\\"name\\\": \\\"post\\\"`),\n )\n })\n\n test('throws an error if format flag is not groq-type-nodes', async () => {\n const {error, stderr} = await testCommand(ExtractSchemaCommand, ['--format', 'test-format'], {mocks: defaultMocks})\n\n expect(stderr).toContain('Extracting schema')\n expect(stderr).toContain('Failed to extract schema')\n expect(error?.message).toContain('Unsupported format: \"test-format\"')\n })\n})\n"],"names":["mkdir","writeFile","runCommand","testCommand","afterEach","describe","expect","test","vi","ExtractSchemaCommand","mock","defaultMocks","projectRoot","directory","path","type","getWorkspace","fn","mockReturnValue","importStudioConfig","extractSchema","fields","name","title","mockMkdir","mocked","mockWriteFile","clearAllMocks","stdout","toMatchInlineSnapshot","mockResolvedValue","undefined","stderr","mocks","toContain","toHaveBeenCalledWith","stringContaining","recursive","error","message"],"mappings":"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"}
|