@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,14 +1,12 @@
|
|
|
1
1
|
import { runCommand } from '@oclif/test';
|
|
2
|
-
import { getCliConfig } from '@sanity/cli-core';
|
|
3
2
|
import { select } from '@sanity/cli-core/ux';
|
|
4
|
-
import { mockApi, testCommand } from '@sanity/cli-test';
|
|
3
|
+
import { createTestToken, mockApi, testCommand } from '@sanity/cli-test';
|
|
5
4
|
import { MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME } from '@sanity/types';
|
|
6
5
|
import nock from 'nock';
|
|
7
6
|
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
|
|
8
7
|
import { MEDIA_LIBRARY_API_VERSION } from '../../../services/mediaLibraries.js';
|
|
9
8
|
import { NO_MEDIA_LIBRARY_ASPECTS_PATH, NO_PROJECT_ID } from '../../../util/errorMessages.js';
|
|
10
9
|
import { MediaDeployAspectCommand } from '../deploy-aspect.js';
|
|
11
|
-
// Create hoisted mock functions
|
|
12
10
|
const mockFsAccess = vi.hoisted(()=>vi.fn());
|
|
13
11
|
const mockFsReaddir = vi.hoisted(()=>vi.fn());
|
|
14
12
|
const mockTsImport = vi.hoisted(()=>vi.fn());
|
|
@@ -30,28 +28,24 @@ vi.mock('@sanity/cli-core/ux', async ()=>{
|
|
|
30
28
|
select: vi.fn()
|
|
31
29
|
};
|
|
32
30
|
});
|
|
33
|
-
vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
|
|
34
|
-
findProjectRoot: vi.fn().mockResolvedValue({
|
|
35
|
-
directory: '/test/project',
|
|
36
|
-
root: '/test/project',
|
|
37
|
-
type: 'studio'
|
|
38
|
-
})
|
|
39
|
-
}));
|
|
40
|
-
vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
|
|
41
|
-
getCliConfig: vi.fn().mockResolvedValue({
|
|
42
|
-
api: {
|
|
43
|
-
projectId: 'test-project-id'
|
|
44
|
-
},
|
|
45
|
-
mediaLibrary: {
|
|
46
|
-
aspectsPath: '/test/project/aspects'
|
|
47
|
-
}
|
|
48
|
-
})
|
|
49
|
-
}));
|
|
50
|
-
vi.mock('../../../../../cli-core/src/services/getCliToken.js', ()=>({
|
|
51
|
-
getCliToken: vi.fn().mockResolvedValue('test-token')
|
|
52
|
-
}));
|
|
53
31
|
const mockSelect = vi.mocked(select);
|
|
54
|
-
const
|
|
32
|
+
const defaultMocks = {
|
|
33
|
+
cliConfig: {
|
|
34
|
+
api: {
|
|
35
|
+
projectId: 'test-project-id'
|
|
36
|
+
},
|
|
37
|
+
mediaLibrary: {
|
|
38
|
+
aspectsPath: '/test/project/aspects'
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
projectRoot: {
|
|
42
|
+
directory: '/test/project',
|
|
43
|
+
path: '/test/project/sanity.config.ts',
|
|
44
|
+
root: '/test/project',
|
|
45
|
+
type: 'studio'
|
|
46
|
+
},
|
|
47
|
+
token: 'test-token'
|
|
48
|
+
};
|
|
55
49
|
/**
|
|
56
50
|
* Helper to create a mock aspect definition with valid schema
|
|
57
51
|
*/ function createMockAspect(id) {
|
|
@@ -136,19 +130,11 @@ const mockGetCliConfig = vi.mocked(getCliConfig);
|
|
|
136
130
|
}
|
|
137
131
|
describe('#media:deploy-aspect', ()=>{
|
|
138
132
|
beforeEach(()=>{
|
|
139
|
-
vi.clearAllMocks();
|
|
140
133
|
setupDefaultMocks();
|
|
141
|
-
// Reset getCliConfig mock to default
|
|
142
|
-
mockGetCliConfig.mockResolvedValue({
|
|
143
|
-
api: {
|
|
144
|
-
projectId: 'test-project-id'
|
|
145
|
-
},
|
|
146
|
-
mediaLibrary: {
|
|
147
|
-
aspectsPath: '/test/project/aspects'
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
134
|
});
|
|
151
135
|
afterEach(()=>{
|
|
136
|
+
vi.clearAllMocks();
|
|
137
|
+
vi.unstubAllEnvs();
|
|
152
138
|
const pending = nock.pendingMocks();
|
|
153
139
|
nock.cleanAll();
|
|
154
140
|
expect(pending, 'pending mocks').toEqual([]);
|
|
@@ -200,7 +186,9 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
200
186
|
expectedError: 'Specified both an aspect name and `--all`.'
|
|
201
187
|
}
|
|
202
188
|
])('should error if $description', async ({ args, expectedError })=>{
|
|
203
|
-
const { error } = await testCommand(MediaDeployAspectCommand, args
|
|
189
|
+
const { error } = await testCommand(MediaDeployAspectCommand, args, {
|
|
190
|
+
mocks: defaultMocks
|
|
191
|
+
});
|
|
204
192
|
expect(error?.message).toContain(expectedError);
|
|
205
193
|
expect(error?.oclif?.exit).toBe(1);
|
|
206
194
|
});
|
|
@@ -224,28 +212,30 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
224
212
|
expectedError: NO_MEDIA_LIBRARY_ASPECTS_PATH
|
|
225
213
|
}
|
|
226
214
|
])('should error if $description', async ({ config, expectedError })=>{
|
|
227
|
-
mockGetCliConfig.mockResolvedValue(config);
|
|
228
215
|
const { error } = await testCommand(MediaDeployAspectCommand, [
|
|
229
216
|
'myAspect'
|
|
230
|
-
]
|
|
217
|
+
], {
|
|
218
|
+
mocks: {
|
|
219
|
+
...defaultMocks,
|
|
220
|
+
cliConfig: config
|
|
221
|
+
}
|
|
222
|
+
});
|
|
231
223
|
expect(error?.message).toContain(expectedError);
|
|
232
224
|
expect(error?.oclif?.exit).toBe(1);
|
|
233
225
|
});
|
|
234
226
|
test('should successfully deploy a single aspect', async ()=>{
|
|
235
|
-
// Setup filesystem to return a single aspect file
|
|
236
227
|
setupFileSystemMock([
|
|
237
228
|
{
|
|
238
229
|
filename: 'myAspect.ts',
|
|
239
230
|
isFile: true
|
|
240
231
|
}
|
|
241
232
|
]);
|
|
242
|
-
// Setup tsImport to return the aspect definition
|
|
243
233
|
setupTsImportMock({
|
|
244
234
|
'myAspect.ts': {
|
|
245
235
|
aspect: createMockAspect('myAspect')
|
|
246
236
|
}
|
|
247
237
|
});
|
|
248
|
-
|
|
238
|
+
createTestToken('test-token');
|
|
249
239
|
mockApi({
|
|
250
240
|
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
251
241
|
method: 'get',
|
|
@@ -262,8 +252,6 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
262
252
|
}
|
|
263
253
|
]
|
|
264
254
|
});
|
|
265
|
-
mockSelect.mockResolvedValue('test-library-id');
|
|
266
|
-
// Mock deploy API call
|
|
267
255
|
mockApi({
|
|
268
256
|
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
269
257
|
method: 'post',
|
|
@@ -276,9 +264,12 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
276
264
|
}
|
|
277
265
|
]
|
|
278
266
|
});
|
|
267
|
+
mockSelect.mockResolvedValue('test-library-id');
|
|
279
268
|
const { stdout } = await testCommand(MediaDeployAspectCommand, [
|
|
280
269
|
'myAspect'
|
|
281
|
-
]
|
|
270
|
+
], {
|
|
271
|
+
mocks: defaultMocks
|
|
272
|
+
});
|
|
282
273
|
expect(mockFsReaddir).toHaveBeenCalledWith('/test/project/aspects', {
|
|
283
274
|
withFileTypes: true
|
|
284
275
|
});
|
|
@@ -288,7 +279,6 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
288
279
|
expect(stdout).toContain('myAspect');
|
|
289
280
|
});
|
|
290
281
|
test('should deploy all aspects with --all flag', async ()=>{
|
|
291
|
-
// Setup filesystem to return multiple aspect files
|
|
292
282
|
setupFileSystemMock([
|
|
293
283
|
{
|
|
294
284
|
filename: 'aspect1.ts',
|
|
@@ -299,7 +289,6 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
299
289
|
isFile: true
|
|
300
290
|
}
|
|
301
291
|
]);
|
|
302
|
-
// Setup tsImport to return aspect definitions for both files
|
|
303
292
|
setupTsImportMock({
|
|
304
293
|
'aspect1.ts': {
|
|
305
294
|
aspect: createMockAspect('aspect1')
|
|
@@ -308,7 +297,7 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
308
297
|
aspect: createMockAspect('aspect2')
|
|
309
298
|
}
|
|
310
299
|
});
|
|
311
|
-
|
|
300
|
+
createTestToken('test-token');
|
|
312
301
|
mockApi({
|
|
313
302
|
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
314
303
|
method: 'get',
|
|
@@ -325,8 +314,6 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
325
314
|
}
|
|
326
315
|
]
|
|
327
316
|
});
|
|
328
|
-
mockSelect.mockResolvedValue('test-library-id');
|
|
329
|
-
// Mock deploy API call
|
|
330
317
|
mockApi({
|
|
331
318
|
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
332
319
|
method: 'post',
|
|
@@ -343,29 +330,30 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
343
330
|
}
|
|
344
331
|
]
|
|
345
332
|
});
|
|
333
|
+
mockSelect.mockResolvedValue('test-library-id');
|
|
346
334
|
const { stdout } = await testCommand(MediaDeployAspectCommand, [
|
|
347
335
|
'--all'
|
|
348
|
-
]
|
|
336
|
+
], {
|
|
337
|
+
mocks: defaultMocks
|
|
338
|
+
});
|
|
349
339
|
expect(stdout).toContain('✓');
|
|
350
340
|
expect(stdout).toContain('Deployed 2 aspects');
|
|
351
341
|
expect(stdout).toContain('aspect1');
|
|
352
342
|
expect(stdout).toContain('aspect2');
|
|
353
343
|
});
|
|
354
344
|
test('should use --media-library-id flag when provided', async ()=>{
|
|
355
|
-
// Setup filesystem to return a single aspect file
|
|
356
345
|
setupFileSystemMock([
|
|
357
346
|
{
|
|
358
347
|
filename: 'myAspect.ts',
|
|
359
348
|
isFile: true
|
|
360
349
|
}
|
|
361
350
|
]);
|
|
362
|
-
// Setup tsImport to return the aspect definition
|
|
363
351
|
setupTsImportMock({
|
|
364
352
|
'myAspect.ts': {
|
|
365
353
|
aspect: createMockAspect('myAspect')
|
|
366
354
|
}
|
|
367
355
|
});
|
|
368
|
-
|
|
356
|
+
createTestToken('test-token');
|
|
369
357
|
mockApi({
|
|
370
358
|
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
371
359
|
method: 'post',
|
|
@@ -382,11 +370,12 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
382
370
|
'myAspect',
|
|
383
371
|
'--media-library-id',
|
|
384
372
|
'custom-library-id'
|
|
385
|
-
]
|
|
373
|
+
], {
|
|
374
|
+
mocks: defaultMocks
|
|
375
|
+
});
|
|
386
376
|
expect(mockSelect).not.toHaveBeenCalled();
|
|
387
377
|
});
|
|
388
378
|
test('should error if aspect is not found', async ()=>{
|
|
389
|
-
// Setup filesystem with aspect files that don't match the requested name
|
|
390
379
|
setupFileSystemMock([
|
|
391
380
|
{
|
|
392
381
|
filename: 'someOtherAspect.ts',
|
|
@@ -397,7 +386,6 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
397
386
|
isFile: true
|
|
398
387
|
}
|
|
399
388
|
]);
|
|
400
|
-
// Setup tsImport to return aspects with different IDs
|
|
401
389
|
setupTsImportMock({
|
|
402
390
|
'anotherAspect.ts': {
|
|
403
391
|
aspect: createMockAspect('anotherAspect')
|
|
@@ -406,7 +394,7 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
406
394
|
aspect: createMockAspect('someOtherAspect')
|
|
407
395
|
}
|
|
408
396
|
});
|
|
409
|
-
|
|
397
|
+
createTestToken('test-token');
|
|
410
398
|
mockApi({
|
|
411
399
|
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
412
400
|
method: 'get',
|
|
@@ -426,13 +414,14 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
426
414
|
mockSelect.mockResolvedValue('test-library-id');
|
|
427
415
|
const { error } = await testCommand(MediaDeployAspectCommand, [
|
|
428
416
|
'nonExistentAspect'
|
|
429
|
-
]
|
|
417
|
+
], {
|
|
418
|
+
mocks: defaultMocks
|
|
419
|
+
});
|
|
430
420
|
expect(error?.message).toContain('Could not find aspect');
|
|
431
421
|
expect(error?.message).toContain('nonExistentAspect');
|
|
432
422
|
expect(error?.oclif?.exit).toBe(1);
|
|
433
423
|
});
|
|
434
424
|
test('should skip invalid aspects and deploy only valid ones', async ()=>{
|
|
435
|
-
// Setup filesystem with both valid and invalid aspect files
|
|
436
425
|
setupFileSystemMock([
|
|
437
426
|
{
|
|
438
427
|
filename: 'invalidAspect.ts',
|
|
@@ -443,7 +432,6 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
443
432
|
isFile: true
|
|
444
433
|
}
|
|
445
434
|
]);
|
|
446
|
-
// Setup tsImport to return aspect definitions (one invalid, one valid)
|
|
447
435
|
setupTsImportMock({
|
|
448
436
|
'invalidAspect.ts': {
|
|
449
437
|
aspect: createInvalidMockAspect('invalidAspect')
|
|
@@ -452,7 +440,7 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
452
440
|
aspect: createMockAspect('validAspect')
|
|
453
441
|
}
|
|
454
442
|
});
|
|
455
|
-
|
|
443
|
+
createTestToken('test-token');
|
|
456
444
|
mockApi({
|
|
457
445
|
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
458
446
|
method: 'get',
|
|
@@ -469,8 +457,6 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
469
457
|
}
|
|
470
458
|
]
|
|
471
459
|
});
|
|
472
|
-
mockSelect.mockResolvedValue('test-library-id');
|
|
473
|
-
// Mock deploy API call
|
|
474
460
|
mockApi({
|
|
475
461
|
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
476
462
|
method: 'post',
|
|
@@ -483,29 +469,30 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
483
469
|
}
|
|
484
470
|
]
|
|
485
471
|
});
|
|
472
|
+
mockSelect.mockResolvedValue('test-library-id');
|
|
486
473
|
const { stderr, stdout } = await testCommand(MediaDeployAspectCommand, [
|
|
487
474
|
'--all'
|
|
488
|
-
]
|
|
475
|
+
], {
|
|
476
|
+
mocks: defaultMocks
|
|
477
|
+
});
|
|
489
478
|
expect(stderr).toContain('Skipped 1 invalid aspect');
|
|
490
479
|
expect(stderr).toContain('invalidAspect');
|
|
491
480
|
expect(stdout).toContain('Deployed 1 aspect');
|
|
492
481
|
expect(stdout).toContain('validAspect');
|
|
493
482
|
});
|
|
494
483
|
test('should warn if no valid aspects to deploy', async ()=>{
|
|
495
|
-
// Setup filesystem with only invalid aspect files
|
|
496
484
|
setupFileSystemMock([
|
|
497
485
|
{
|
|
498
486
|
filename: 'invalidAspect.ts',
|
|
499
487
|
isFile: true
|
|
500
488
|
}
|
|
501
489
|
]);
|
|
502
|
-
// Setup tsImport to return an invalid aspect definition
|
|
503
490
|
setupTsImportMock({
|
|
504
491
|
'invalidAspect.ts': {
|
|
505
492
|
aspect: createInvalidMockAspect('invalidAspect')
|
|
506
493
|
}
|
|
507
494
|
});
|
|
508
|
-
|
|
495
|
+
createTestToken('test-token');
|
|
509
496
|
mockApi({
|
|
510
497
|
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
511
498
|
method: 'get',
|
|
@@ -525,25 +512,25 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
525
512
|
mockSelect.mockResolvedValue('test-library-id');
|
|
526
513
|
const { stderr } = await testCommand(MediaDeployAspectCommand, [
|
|
527
514
|
'--all'
|
|
528
|
-
]
|
|
515
|
+
], {
|
|
516
|
+
mocks: defaultMocks
|
|
517
|
+
});
|
|
529
518
|
expect(stderr).toContain('Skipped 1 invalid aspect');
|
|
530
519
|
expect(stderr).toContain('No valid aspects to deploy');
|
|
531
520
|
});
|
|
532
521
|
test('should handle API errors gracefully', async ()=>{
|
|
533
|
-
// Setup filesystem to return a single aspect file
|
|
534
522
|
setupFileSystemMock([
|
|
535
523
|
{
|
|
536
524
|
filename: 'myAspect.ts',
|
|
537
525
|
isFile: true
|
|
538
526
|
}
|
|
539
527
|
]);
|
|
540
|
-
// Setup tsImport to return the aspect definition
|
|
541
528
|
setupTsImportMock({
|
|
542
529
|
'myAspect.ts': {
|
|
543
530
|
aspect: createMockAspect('myAspect')
|
|
544
531
|
}
|
|
545
532
|
});
|
|
546
|
-
|
|
533
|
+
createTestToken('test-token');
|
|
547
534
|
mockApi({
|
|
548
535
|
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
549
536
|
method: 'get',
|
|
@@ -560,36 +547,35 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
560
547
|
}
|
|
561
548
|
]
|
|
562
549
|
});
|
|
563
|
-
mockSelect.mockResolvedValue('test-library-id');
|
|
564
|
-
// Mock deploy API call to fail
|
|
565
550
|
mockApi({
|
|
566
551
|
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
567
552
|
method: 'post',
|
|
568
553
|
uri: '/media-libraries/test-library-id/mutate'
|
|
569
554
|
}).reply(500, {
|
|
570
|
-
|
|
555
|
+
error: 'Internal server error'
|
|
571
556
|
});
|
|
557
|
+
mockSelect.mockResolvedValue('test-library-id');
|
|
572
558
|
const { error } = await testCommand(MediaDeployAspectCommand, [
|
|
573
559
|
'myAspect'
|
|
574
|
-
]
|
|
560
|
+
], {
|
|
561
|
+
mocks: defaultMocks
|
|
562
|
+
});
|
|
575
563
|
expect(error?.message).toContain('Failed to deploy aspects');
|
|
576
564
|
expect(error?.oclif?.exit).toBe(1);
|
|
577
565
|
});
|
|
578
566
|
test('should fetch and present media libraries for selection', async ()=>{
|
|
579
|
-
// Setup filesystem to return a single aspect file
|
|
580
567
|
setupFileSystemMock([
|
|
581
568
|
{
|
|
582
569
|
filename: 'myAspect.ts',
|
|
583
570
|
isFile: true
|
|
584
571
|
}
|
|
585
572
|
]);
|
|
586
|
-
// Setup tsImport to return the aspect definition
|
|
587
573
|
setupTsImportMock({
|
|
588
574
|
'myAspect.ts': {
|
|
589
575
|
aspect: createMockAspect('myAspect')
|
|
590
576
|
}
|
|
591
577
|
});
|
|
592
|
-
|
|
578
|
+
createTestToken('test-token');
|
|
593
579
|
mockApi({
|
|
594
580
|
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
595
581
|
method: 'get',
|
|
@@ -606,8 +592,6 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
606
592
|
}
|
|
607
593
|
]
|
|
608
594
|
});
|
|
609
|
-
mockSelect.mockResolvedValue('selected-library-id');
|
|
610
|
-
// Mock deploy API call
|
|
611
595
|
mockApi({
|
|
612
596
|
apiVersion: MEDIA_LIBRARY_API_VERSION,
|
|
613
597
|
method: 'post',
|
|
@@ -620,9 +604,12 @@ describe('#media:deploy-aspect', ()=>{
|
|
|
620
604
|
}
|
|
621
605
|
]
|
|
622
606
|
});
|
|
607
|
+
mockSelect.mockResolvedValue('selected-library-id');
|
|
623
608
|
await testCommand(MediaDeployAspectCommand, [
|
|
624
609
|
'myAspect'
|
|
625
|
-
]
|
|
610
|
+
], {
|
|
611
|
+
mocks: defaultMocks
|
|
612
|
+
});
|
|
626
613
|
expect(mockSelect).toHaveBeenCalledWith(expect.objectContaining({
|
|
627
614
|
message: 'Select media library'
|
|
628
615
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/media/__tests__/deploy-aspect.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport {\n MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n type MediaLibraryAssetAspectDocument,\n} from '@sanity/types'\nimport nock from 'nock'\nimport {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'\n\nimport {MEDIA_LIBRARY_API_VERSION} from '../../../services/mediaLibraries.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH, NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {MediaDeployAspectCommand} from '../deploy-aspect.js'\n\n// Create hoisted mock functions\nconst mockFsAccess = vi.hoisted(() => vi.fn())\nconst mockFsReaddir = vi.hoisted(() => vi.fn())\nconst mockTsImport = vi.hoisted(() => vi.fn())\nconst mockGetTsconfig = vi.hoisted(() => vi.fn())\n\nvi.mock('node:fs/promises', () => ({\n access: mockFsAccess,\n readdir: mockFsReaddir,\n}))\n\nvi.mock('tsx/esm/api', () => ({\n tsImport: mockTsImport,\n}))\n\nvi.mock('get-tsconfig', () => ({\n getTsconfig: mockGetTsconfig,\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n select: vi.fn(),\n }\n})\n\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', () => ({\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/project',\n root: '/test/project',\n type: 'studio',\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: vi.fn().mockResolvedValue({\n api: {\n projectId: 'test-project-id',\n },\n mediaLibrary: {\n aspectsPath: '/test/project/aspects',\n },\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\n\nconst mockSelect = vi.mocked(select)\nconst mockGetCliConfig = vi.mocked(getCliConfig)\n\n/**\n * Helper to create a mock aspect definition with valid schema\n */\nfunction createMockAspect(id: string): MediaLibraryAssetAspectDocument {\n return {\n _createdAt: new Date().toISOString(),\n _id: id,\n _rev: 'mock-revision',\n _type: MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n _updatedAt: new Date().toISOString(),\n definition: {\n fields: [\n {\n name: 'testField',\n title: 'Test Field',\n type: 'string',\n },\n ],\n name: id,\n title: id,\n type: 'object',\n },\n } as MediaLibraryAssetAspectDocument\n}\n\n/**\n * Helper to create an invalid aspect definition\n * Uses unsupported field types (image/file) which are not allowed in aspects\n */\nfunction createInvalidMockAspect(id: string): MediaLibraryAssetAspectDocument {\n return {\n _createdAt: new Date().toISOString(),\n _id: id,\n _rev: 'mock-revision',\n _type: MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n _updatedAt: new Date().toISOString(),\n definition: {\n fields: [\n {\n name: 'invalidImageField',\n title: 'Invalid Image Field',\n type: 'image', // Image type is not allowed in aspects\n },\n ],\n name: id,\n title: id,\n type: 'object',\n },\n } as MediaLibraryAssetAspectDocument\n}\n\n/**\n * Helper to setup filesystem mocks for aspect files\n */\nfunction setupFileSystemMock(files: Array<{filename: string; isFile: boolean}>) {\n mockFsAccess.mockResolvedValue(undefined)\n mockFsReaddir.mockResolvedValue(\n files.map((file) => ({\n isFile: () => file.isFile,\n name: file.filename,\n })),\n )\n}\n\n/**\n * Helper to setup tsImport mock to return aspect definitions\n */\nfunction setupTsImportMock(\n imports: Record<\n string,\n {\n aspect: unknown\n errorMessage?: string\n shouldFail?: boolean\n }\n >,\n) {\n mockTsImport.mockImplementation(async (filePath: string) => {\n const filename = filePath.split('/').pop() || ''\n const importConfig = imports[filename]\n\n if (!importConfig) {\n throw new Error(`No mock configured for ${filename}`)\n }\n\n if (importConfig.shouldFail) {\n throw new Error(importConfig.errorMessage || 'Import failed')\n }\n\n return {\n default: importConfig.aspect,\n }\n })\n}\n\n/**\n * Setup default mocks for a successful test scenario\n */\nfunction setupDefaultMocks() {\n mockFsAccess.mockResolvedValue(undefined)\n mockFsReaddir.mockResolvedValue([])\n mockGetTsconfig.mockReturnValue({path: '/test/tsconfig.json'} as never)\n}\n\ndescribe('#media:deploy-aspect', () => {\n beforeEach(() => {\n vi.clearAllMocks()\n setupDefaultMocks()\n // Reset getCliConfig mock to default\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: 'test-project-id',\n },\n mediaLibrary: {\n aspectsPath: '/test/project/aspects',\n },\n })\n })\n\n afterEach(() => {\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('should show help text correctly', async () => {\n const {stdout} = await runCommand(['media deploy-aspect --help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Deploy an aspect\n\n USAGE\n $ sanity media deploy-aspect [ASPECTNAME] [--all] [--media-library-id <value>]\n\n ARGUMENTS\n [ASPECTNAME] Name of the aspect to deploy\n\n FLAGS\n --all Deploy all aspects\n --media-library-id=<value> The id of the target media library\n\n DESCRIPTION\n Deploy an aspect\n\n EXAMPLES\n Deploy the aspect named \"someAspect\"\n\n $ sanity media deploy-aspect someAspect\n\n Deploy all aspects\n\n $ sanity media deploy-aspect --all\n\n \"\n `)\n })\n\n test.each([\n {\n args: [],\n description: 'neither aspect name nor --all flag is provided',\n expectedError:\n 'Specify an aspect name, or use the `--all` option to deploy all aspect definitions.',\n },\n {\n args: ['myAspect', '--all'],\n description: 'both aspect name and --all flag are provided',\n expectedError: 'Specified both an aspect name and `--all`.',\n },\n ])('should error if $description', async ({args, expectedError}) => {\n const {error} = await testCommand(MediaDeployAspectCommand, args)\n\n expect(error?.message).toContain(expectedError)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test.each([\n {\n config: {\n mediaLibrary: {\n aspectsPath: '/test/project/aspects',\n },\n },\n description: 'project ID is not configured',\n expectedError: NO_PROJECT_ID,\n },\n {\n config: {\n api: {\n projectId: 'test-project-id',\n },\n },\n description: 'media library aspects path is not configured',\n expectedError: NO_MEDIA_LIBRARY_ASPECTS_PATH,\n },\n ])('should error if $description', async ({config, expectedError}) => {\n mockGetCliConfig.mockResolvedValue(config)\n\n const {error} = await testCommand(MediaDeployAspectCommand, ['myAspect'])\n\n expect(error?.message).toContain(expectedError)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should successfully deploy a single aspect', async () => {\n // Setup filesystem to return a single aspect file\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n // Setup tsImport to return the aspect definition\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n // Mock the media libraries API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'test-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n // Mock deploy API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(200, {\n results: [{id: 'myAspect', operation: 'created'}],\n })\n\n const {stdout} = await testCommand(MediaDeployAspectCommand, ['myAspect'])\n\n expect(mockFsReaddir).toHaveBeenCalledWith('/test/project/aspects', {withFileTypes: true})\n expect(mockTsImport).toHaveBeenCalled()\n expect(stdout).toContain('✓')\n expect(stdout).toContain('Deployed 1 aspect')\n expect(stdout).toContain('myAspect')\n })\n\n test('should deploy all aspects with --all flag', async () => {\n // Setup filesystem to return multiple aspect files\n setupFileSystemMock([\n {filename: 'aspect1.ts', isFile: true},\n {filename: 'aspect2.ts', isFile: true},\n ])\n\n // Setup tsImport to return aspect definitions for both files\n setupTsImportMock({\n 'aspect1.ts': {\n aspect: createMockAspect('aspect1'),\n },\n 'aspect2.ts': {\n aspect: createMockAspect('aspect2'),\n },\n })\n\n // Mock the media libraries API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'test-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n // Mock deploy API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(200, {\n results: [\n {id: 'aspect1', operation: 'created'},\n {id: 'aspect2', operation: 'created'},\n ],\n })\n\n const {stdout} = await testCommand(MediaDeployAspectCommand, ['--all'])\n\n expect(stdout).toContain('✓')\n expect(stdout).toContain('Deployed 2 aspects')\n expect(stdout).toContain('aspect1')\n expect(stdout).toContain('aspect2')\n })\n\n test('should use --media-library-id flag when provided', async () => {\n // Setup filesystem to return a single aspect file\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n // Setup tsImport to return the aspect definition\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n // Mock deploy API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/custom-library-id/mutate',\n }).reply(200, {\n results: [{id: 'myAspect', operation: 'created'}],\n })\n\n await testCommand(MediaDeployAspectCommand, [\n 'myAspect',\n '--media-library-id',\n 'custom-library-id',\n ])\n\n expect(mockSelect).not.toHaveBeenCalled()\n })\n\n test('should error if aspect is not found', async () => {\n // Setup filesystem with aspect files that don't match the requested name\n setupFileSystemMock([\n {filename: 'someOtherAspect.ts', isFile: true},\n {filename: 'anotherAspect.ts', isFile: true},\n ])\n\n // Setup tsImport to return aspects with different IDs\n setupTsImportMock({\n 'anotherAspect.ts': {\n aspect: createMockAspect('anotherAspect'),\n },\n 'someOtherAspect.ts': {\n aspect: createMockAspect('someOtherAspect'),\n },\n })\n\n // Mock the media libraries API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'test-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {error} = await testCommand(MediaDeployAspectCommand, ['nonExistentAspect'])\n\n expect(error?.message).toContain('Could not find aspect')\n expect(error?.message).toContain('nonExistentAspect')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should skip invalid aspects and deploy only valid ones', async () => {\n // Setup filesystem with both valid and invalid aspect files\n setupFileSystemMock([\n {filename: 'invalidAspect.ts', isFile: true},\n {filename: 'validAspect.ts', isFile: true},\n ])\n\n // Setup tsImport to return aspect definitions (one invalid, one valid)\n setupTsImportMock({\n 'invalidAspect.ts': {\n aspect: createInvalidMockAspect('invalidAspect'),\n },\n 'validAspect.ts': {\n aspect: createMockAspect('validAspect'),\n },\n })\n\n // Mock the media libraries API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'test-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n // Mock deploy API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(200, {\n results: [{id: 'validAspect', operation: 'created'}],\n })\n\n const {stderr, stdout} = await testCommand(MediaDeployAspectCommand, ['--all'])\n\n expect(stderr).toContain('Skipped 1 invalid aspect')\n expect(stderr).toContain('invalidAspect')\n expect(stdout).toContain('Deployed 1 aspect')\n expect(stdout).toContain('validAspect')\n })\n\n test('should warn if no valid aspects to deploy', async () => {\n // Setup filesystem with only invalid aspect files\n setupFileSystemMock([{filename: 'invalidAspect.ts', isFile: true}])\n\n // Setup tsImport to return an invalid aspect definition\n setupTsImportMock({\n 'invalidAspect.ts': {\n aspect: createInvalidMockAspect('invalidAspect'),\n },\n })\n\n // Mock the media libraries API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'test-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {stderr} = await testCommand(MediaDeployAspectCommand, ['--all'])\n\n expect(stderr).toContain('Skipped 1 invalid aspect')\n expect(stderr).toContain('No valid aspects to deploy')\n })\n\n test('should handle API errors gracefully', async () => {\n // Setup filesystem to return a single aspect file\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n // Setup tsImport to return the aspect definition\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n // Mock the media libraries API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'test-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n // Mock deploy API call to fail\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(500, {message: 'Internal server error'})\n\n const {error} = await testCommand(MediaDeployAspectCommand, ['myAspect'])\n\n expect(error?.message).toContain('Failed to deploy aspects')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fetch and present media libraries for selection', async () => {\n // Setup filesystem to return a single aspect file\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n // Setup tsImport to return the aspect definition\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n // Mock the media libraries API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'selected-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockSelect.mockResolvedValue('selected-library-id')\n\n // Mock deploy API call\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/selected-library-id/mutate',\n }).reply(200, {\n results: [{id: 'myAspect', operation: 'created'}],\n })\n\n await testCommand(MediaDeployAspectCommand, ['myAspect'])\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Select media library',\n }),\n )\n })\n})\n"],"names":["runCommand","getCliConfig","select","mockApi","testCommand","MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME","nock","afterEach","beforeEach","describe","expect","test","vi","MEDIA_LIBRARY_API_VERSION","NO_MEDIA_LIBRARY_ASPECTS_PATH","NO_PROJECT_ID","MediaDeployAspectCommand","mockFsAccess","hoisted","fn","mockFsReaddir","mockTsImport","mockGetTsconfig","mock","access","readdir","tsImport","getTsconfig","actual","importActual","findProjectRoot","mockResolvedValue","directory","root","type","api","projectId","mediaLibrary","aspectsPath","getCliToken","mockSelect","mocked","mockGetCliConfig","createMockAspect","id","_createdAt","Date","toISOString","_id","_rev","_type","_updatedAt","definition","fields","name","title","createInvalidMockAspect","setupFileSystemMock","files","undefined","map","file","isFile","filename","setupTsImportMock","imports","mockImplementation","filePath","split","pop","importConfig","Error","shouldFail","errorMessage","default","aspect","setupDefaultMocks","mockReturnValue","path","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","each","args","description","expectedError","error","message","toContain","oclif","exit","toBe","config","apiVersion","method","query","uri","reply","data","organizationId","status","results","operation","toHaveBeenCalledWith","withFileTypes","toHaveBeenCalled","not","stderr","objectContaining"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/media/__tests__/deploy-aspect.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {select} from '@sanity/cli-core/ux'\nimport {createTestToken, mockApi, testCommand} from '@sanity/cli-test'\nimport {\n MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n type MediaLibraryAssetAspectDocument,\n} from '@sanity/types'\nimport nock from 'nock'\nimport {afterEach, beforeEach, describe, expect, test, vi} from 'vitest'\n\nimport {MEDIA_LIBRARY_API_VERSION} from '../../../services/mediaLibraries.js'\nimport {NO_MEDIA_LIBRARY_ASPECTS_PATH, NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {MediaDeployAspectCommand} from '../deploy-aspect.js'\n\nconst mockFsAccess = vi.hoisted(() => vi.fn())\nconst mockFsReaddir = vi.hoisted(() => vi.fn())\nconst mockTsImport = vi.hoisted(() => vi.fn())\nconst mockGetTsconfig = vi.hoisted(() => vi.fn())\n\nvi.mock('node:fs/promises', () => ({\n access: mockFsAccess,\n readdir: mockFsReaddir,\n}))\n\nvi.mock('tsx/esm/api', () => ({\n tsImport: mockTsImport,\n}))\n\nvi.mock('get-tsconfig', () => ({\n getTsconfig: mockGetTsconfig,\n}))\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n select: vi.fn(),\n }\n})\n\nconst mockSelect = vi.mocked(select)\n\nconst defaultMocks = {\n cliConfig: {\n api: {\n projectId: 'test-project-id',\n },\n mediaLibrary: {\n aspectsPath: '/test/project/aspects',\n },\n },\n projectRoot: {\n directory: '/test/project',\n path: '/test/project/sanity.config.ts',\n root: '/test/project',\n type: 'studio' as const,\n },\n token: 'test-token',\n}\n\n/**\n * Helper to create a mock aspect definition with valid schema\n */\nfunction createMockAspect(id: string): MediaLibraryAssetAspectDocument {\n return {\n _createdAt: new Date().toISOString(),\n _id: id,\n _rev: 'mock-revision',\n _type: MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n _updatedAt: new Date().toISOString(),\n definition: {\n fields: [\n {\n name: 'testField',\n title: 'Test Field',\n type: 'string',\n },\n ],\n name: id,\n title: id,\n type: 'object',\n },\n } as MediaLibraryAssetAspectDocument\n}\n\n/**\n * Helper to create an invalid aspect definition\n * Uses unsupported field types (image/file) which are not allowed in aspects\n */\nfunction createInvalidMockAspect(id: string): MediaLibraryAssetAspectDocument {\n return {\n _createdAt: new Date().toISOString(),\n _id: id,\n _rev: 'mock-revision',\n _type: MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME,\n _updatedAt: new Date().toISOString(),\n definition: {\n fields: [\n {\n name: 'invalidImageField',\n title: 'Invalid Image Field',\n type: 'image', // Image type is not allowed in aspects\n },\n ],\n name: id,\n title: id,\n type: 'object',\n },\n } as MediaLibraryAssetAspectDocument\n}\n\n/**\n * Helper to setup filesystem mocks for aspect files\n */\nfunction setupFileSystemMock(files: Array<{filename: string; isFile: boolean}>) {\n mockFsAccess.mockResolvedValue(undefined)\n mockFsReaddir.mockResolvedValue(\n files.map((file) => ({\n isFile: () => file.isFile,\n name: file.filename,\n })),\n )\n}\n\n/**\n * Helper to setup tsImport mock to return aspect definitions\n */\nfunction setupTsImportMock(\n imports: Record<\n string,\n {\n aspect: unknown\n errorMessage?: string\n shouldFail?: boolean\n }\n >,\n) {\n mockTsImport.mockImplementation(async (filePath: string) => {\n const filename = filePath.split('/').pop() || ''\n const importConfig = imports[filename]\n\n if (!importConfig) {\n throw new Error(`No mock configured for ${filename}`)\n }\n\n if (importConfig.shouldFail) {\n throw new Error(importConfig.errorMessage || 'Import failed')\n }\n\n return {\n default: importConfig.aspect,\n }\n })\n}\n\n/**\n * Setup default mocks for a successful test scenario\n */\nfunction setupDefaultMocks() {\n mockFsAccess.mockResolvedValue(undefined)\n mockFsReaddir.mockResolvedValue([])\n mockGetTsconfig.mockReturnValue({path: '/test/tsconfig.json'} as never)\n}\n\ndescribe('#media:deploy-aspect', () => {\n beforeEach(() => {\n setupDefaultMocks()\n })\n\n afterEach(() => {\n vi.clearAllMocks()\n vi.unstubAllEnvs()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('should show help text correctly', async () => {\n const {stdout} = await runCommand(['media deploy-aspect --help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Deploy an aspect\n\n USAGE\n $ sanity media deploy-aspect [ASPECTNAME] [--all] [--media-library-id <value>]\n\n ARGUMENTS\n [ASPECTNAME] Name of the aspect to deploy\n\n FLAGS\n --all Deploy all aspects\n --media-library-id=<value> The id of the target media library\n\n DESCRIPTION\n Deploy an aspect\n\n EXAMPLES\n Deploy the aspect named \"someAspect\"\n\n $ sanity media deploy-aspect someAspect\n\n Deploy all aspects\n\n $ sanity media deploy-aspect --all\n\n \"\n `)\n })\n\n test.each([\n {\n args: [],\n description: 'neither aspect name nor --all flag is provided',\n expectedError:\n 'Specify an aspect name, or use the `--all` option to deploy all aspect definitions.',\n },\n {\n args: ['myAspect', '--all'],\n description: 'both aspect name and --all flag are provided',\n expectedError: 'Specified both an aspect name and `--all`.',\n },\n ])('should error if $description', async ({args, expectedError}) => {\n const {error} = await testCommand(MediaDeployAspectCommand, args, {mocks: defaultMocks})\n\n expect(error?.message).toContain(expectedError)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test.each([\n {\n config: {\n mediaLibrary: {\n aspectsPath: '/test/project/aspects',\n },\n },\n description: 'project ID is not configured',\n expectedError: NO_PROJECT_ID,\n },\n {\n config: {\n api: {\n projectId: 'test-project-id',\n },\n },\n description: 'media library aspects path is not configured',\n expectedError: NO_MEDIA_LIBRARY_ASPECTS_PATH,\n },\n ])('should error if $description', async ({config, expectedError}) => {\n const {error} = await testCommand(MediaDeployAspectCommand, ['myAspect'], {\n mocks: {\n ...defaultMocks,\n cliConfig: config,\n },\n })\n\n expect(error?.message).toContain(expectedError)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should successfully deploy a single aspect', async () => {\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-library-id', organizationId: 'test-org-id', status: 'active'}],\n })\n\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(200, {\n results: [{id: 'myAspect', operation: 'created'}],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {stdout} = await testCommand(MediaDeployAspectCommand, ['myAspect'], {\n mocks: defaultMocks,\n })\n\n expect(mockFsReaddir).toHaveBeenCalledWith('/test/project/aspects', {withFileTypes: true})\n expect(mockTsImport).toHaveBeenCalled()\n expect(stdout).toContain('✓')\n expect(stdout).toContain('Deployed 1 aspect')\n expect(stdout).toContain('myAspect')\n })\n\n test('should deploy all aspects with --all flag', async () => {\n setupFileSystemMock([\n {filename: 'aspect1.ts', isFile: true},\n {filename: 'aspect2.ts', isFile: true},\n ])\n\n setupTsImportMock({\n 'aspect1.ts': {\n aspect: createMockAspect('aspect1'),\n },\n 'aspect2.ts': {\n aspect: createMockAspect('aspect2'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-library-id', organizationId: 'test-org-id', status: 'active'}],\n })\n\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(200, {\n results: [\n {id: 'aspect1', operation: 'created'},\n {id: 'aspect2', operation: 'created'},\n ],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {stdout} = await testCommand(MediaDeployAspectCommand, ['--all'], {mocks: defaultMocks})\n\n expect(stdout).toContain('✓')\n expect(stdout).toContain('Deployed 2 aspects')\n expect(stdout).toContain('aspect1')\n expect(stdout).toContain('aspect2')\n })\n\n test('should use --media-library-id flag when provided', async () => {\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/custom-library-id/mutate',\n }).reply(200, {\n results: [{id: 'myAspect', operation: 'created'}],\n })\n\n await testCommand(\n MediaDeployAspectCommand,\n ['myAspect', '--media-library-id', 'custom-library-id'],\n {mocks: defaultMocks},\n )\n\n expect(mockSelect).not.toHaveBeenCalled()\n })\n\n test('should error if aspect is not found', async () => {\n setupFileSystemMock([\n {filename: 'someOtherAspect.ts', isFile: true},\n {filename: 'anotherAspect.ts', isFile: true},\n ])\n\n setupTsImportMock({\n 'anotherAspect.ts': {\n aspect: createMockAspect('anotherAspect'),\n },\n 'someOtherAspect.ts': {\n aspect: createMockAspect('someOtherAspect'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-library-id', organizationId: 'test-org-id', status: 'active'}],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {error} = await testCommand(MediaDeployAspectCommand, ['nonExistentAspect'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Could not find aspect')\n expect(error?.message).toContain('nonExistentAspect')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should skip invalid aspects and deploy only valid ones', async () => {\n setupFileSystemMock([\n {filename: 'invalidAspect.ts', isFile: true},\n {filename: 'validAspect.ts', isFile: true},\n ])\n\n setupTsImportMock({\n 'invalidAspect.ts': {\n aspect: createInvalidMockAspect('invalidAspect'),\n },\n 'validAspect.ts': {\n aspect: createMockAspect('validAspect'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-library-id', organizationId: 'test-org-id', status: 'active'}],\n })\n\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(200, {\n results: [{id: 'validAspect', operation: 'created'}],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {stderr, stdout} = await testCommand(MediaDeployAspectCommand, ['--all'], {\n mocks: defaultMocks,\n })\n\n expect(stderr).toContain('Skipped 1 invalid aspect')\n expect(stderr).toContain('invalidAspect')\n expect(stdout).toContain('Deployed 1 aspect')\n expect(stdout).toContain('validAspect')\n })\n\n test('should warn if no valid aspects to deploy', async () => {\n setupFileSystemMock([{filename: 'invalidAspect.ts', isFile: true}])\n\n setupTsImportMock({\n 'invalidAspect.ts': {\n aspect: createInvalidMockAspect('invalidAspect'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-library-id', organizationId: 'test-org-id', status: 'active'}],\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {stderr} = await testCommand(MediaDeployAspectCommand, ['--all'], {mocks: defaultMocks})\n\n expect(stderr).toContain('Skipped 1 invalid aspect')\n expect(stderr).toContain('No valid aspects to deploy')\n })\n\n test('should handle API errors gracefully', async () => {\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [{id: 'test-library-id', organizationId: 'test-org-id', status: 'active'}],\n })\n\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/test-library-id/mutate',\n }).reply(500, {\n error: 'Internal server error',\n })\n\n mockSelect.mockResolvedValue('test-library-id')\n\n const {error} = await testCommand(MediaDeployAspectCommand, ['myAspect'], {\n mocks: defaultMocks,\n })\n\n expect(error?.message).toContain('Failed to deploy aspects')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('should fetch and present media libraries for selection', async () => {\n setupFileSystemMock([{filename: 'myAspect.ts', isFile: true}])\n\n setupTsImportMock({\n 'myAspect.ts': {\n aspect: createMockAspect('myAspect'),\n },\n })\n\n createTestToken('test-token')\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'get',\n query: {projectId: 'test-project-id'},\n uri: '/media-libraries',\n }).reply(200, {\n data: [\n {\n id: 'selected-library-id',\n organizationId: 'test-org-id',\n status: 'active',\n },\n ],\n })\n\n mockApi({\n apiVersion: MEDIA_LIBRARY_API_VERSION,\n method: 'post',\n uri: '/media-libraries/selected-library-id/mutate',\n }).reply(200, {\n results: [{id: 'myAspect', operation: 'created'}],\n })\n\n mockSelect.mockResolvedValue('selected-library-id')\n\n await testCommand(MediaDeployAspectCommand, ['myAspect'], {mocks: defaultMocks})\n\n expect(mockSelect).toHaveBeenCalledWith(\n expect.objectContaining({\n message: 'Select media library',\n }),\n )\n })\n})\n"],"names":["runCommand","select","createTestToken","mockApi","testCommand","MEDIA_LIBRARY_ASSET_ASPECT_TYPE_NAME","nock","afterEach","beforeEach","describe","expect","test","vi","MEDIA_LIBRARY_API_VERSION","NO_MEDIA_LIBRARY_ASPECTS_PATH","NO_PROJECT_ID","MediaDeployAspectCommand","mockFsAccess","hoisted","fn","mockFsReaddir","mockTsImport","mockGetTsconfig","mock","access","readdir","tsImport","getTsconfig","actual","importActual","mockSelect","mocked","defaultMocks","cliConfig","api","projectId","mediaLibrary","aspectsPath","projectRoot","directory","path","root","type","token","createMockAspect","id","_createdAt","Date","toISOString","_id","_rev","_type","_updatedAt","definition","fields","name","title","createInvalidMockAspect","setupFileSystemMock","files","mockResolvedValue","undefined","map","file","isFile","filename","setupTsImportMock","imports","mockImplementation","filePath","split","pop","importConfig","Error","shouldFail","errorMessage","default","aspect","setupDefaultMocks","mockReturnValue","clearAllMocks","unstubAllEnvs","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","each","args","description","expectedError","error","mocks","message","toContain","oclif","exit","toBe","config","apiVersion","method","query","uri","reply","data","organizationId","status","results","operation","toHaveBeenCalledWith","withFileTypes","toHaveBeenCalled","not","stderr","objectContaining"],"mappings":"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"}
|