@sanity/cli 7.11.0 → 7.12.1

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.
Files changed (171) hide show
  1. package/dist/actions/build/buildApp.js +10 -7
  2. package/dist/actions/build/buildApp.js.map +1 -1
  3. package/dist/actions/build/buildStudio.js +9 -6
  4. package/dist/actions/build/buildStudio.js.map +1 -1
  5. package/dist/actions/build/types.js.map +1 -1
  6. package/dist/actions/deploy/deployApp.js +205 -162
  7. package/dist/actions/deploy/deployApp.js.map +1 -1
  8. package/dist/actions/deploy/deployChecks.js +1 -1
  9. package/dist/actions/deploy/deployChecks.js.map +1 -1
  10. package/dist/actions/deploy/deployStudio.js +126 -87
  11. package/dist/actions/deploy/deployStudio.js.map +1 -1
  12. package/dist/actions/deploy/resolveDeployTarget.js +5 -9
  13. package/dist/actions/deploy/resolveDeployTarget.js.map +1 -1
  14. package/dist/actions/dev/devAction.js +1 -2
  15. package/dist/actions/dev/devAction.js.map +1 -1
  16. package/dist/actions/dev/servers/getDevServerConfig.js +8 -2
  17. package/dist/actions/dev/servers/getDevServerConfig.js.map +1 -1
  18. package/dist/actions/init/bootstrapLocalTemplate.js +18 -9
  19. package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
  20. package/dist/actions/init/createAppCliConfig.js.map +1 -1
  21. package/dist/actions/init/createCliConfig.js.map +1 -1
  22. package/dist/commands/backups/disable.js +4 -4
  23. package/dist/commands/backups/disable.js.map +1 -1
  24. package/dist/commands/backups/download.js +7 -7
  25. package/dist/commands/backups/download.js.map +1 -1
  26. package/dist/commands/backups/enable.js +4 -4
  27. package/dist/commands/backups/enable.js.map +1 -1
  28. package/dist/commands/backups/list.js +7 -7
  29. package/dist/commands/backups/list.js.map +1 -1
  30. package/dist/commands/codemod.js +5 -5
  31. package/dist/commands/codemod.js.map +1 -1
  32. package/dist/commands/cors/add.js +1 -1
  33. package/dist/commands/cors/add.js.map +1 -1
  34. package/dist/commands/cors/delete.js +4 -4
  35. package/dist/commands/cors/delete.js.map +1 -1
  36. package/dist/commands/cors/list.js +2 -2
  37. package/dist/commands/cors/list.js.map +1 -1
  38. package/dist/commands/datasets/alias/create.js +5 -5
  39. package/dist/commands/datasets/alias/create.js.map +1 -1
  40. package/dist/commands/datasets/alias/delete.js +2 -2
  41. package/dist/commands/datasets/alias/delete.js.map +1 -1
  42. package/dist/commands/datasets/alias/link.js +5 -5
  43. package/dist/commands/datasets/alias/link.js.map +1 -1
  44. package/dist/commands/datasets/alias/unlink.js +3 -3
  45. package/dist/commands/datasets/alias/unlink.js.map +1 -1
  46. package/dist/commands/datasets/copy.js +7 -7
  47. package/dist/commands/datasets/copy.js.map +1 -1
  48. package/dist/commands/datasets/create.js +3 -3
  49. package/dist/commands/datasets/create.js.map +1 -1
  50. package/dist/commands/datasets/delete.js +2 -2
  51. package/dist/commands/datasets/delete.js.map +1 -1
  52. package/dist/commands/datasets/embeddings/disable.js +3 -3
  53. package/dist/commands/datasets/embeddings/disable.js.map +1 -1
  54. package/dist/commands/datasets/embeddings/enable.js +5 -5
  55. package/dist/commands/datasets/embeddings/enable.js.map +1 -1
  56. package/dist/commands/datasets/embeddings/status.js +3 -3
  57. package/dist/commands/datasets/embeddings/status.js.map +1 -1
  58. package/dist/commands/datasets/export.js +6 -6
  59. package/dist/commands/datasets/export.js.map +1 -1
  60. package/dist/commands/datasets/import.js +3 -3
  61. package/dist/commands/datasets/import.js.map +1 -1
  62. package/dist/commands/datasets/list.js +2 -2
  63. package/dist/commands/datasets/list.js.map +1 -1
  64. package/dist/commands/datasets/visibility/get.js +2 -2
  65. package/dist/commands/datasets/visibility/get.js.map +1 -1
  66. package/dist/commands/datasets/visibility/set.js +3 -3
  67. package/dist/commands/datasets/visibility/set.js.map +1 -1
  68. package/dist/commands/deploy.js +2 -2
  69. package/dist/commands/deploy.js.map +1 -1
  70. package/dist/commands/dev.js +2 -2
  71. package/dist/commands/dev.js.map +1 -1
  72. package/dist/commands/docs/read.js +1 -1
  73. package/dist/commands/docs/read.js.map +1 -1
  74. package/dist/commands/docs/search.js +3 -3
  75. package/dist/commands/docs/search.js.map +1 -1
  76. package/dist/commands/doctor.js +3 -3
  77. package/dist/commands/doctor.js.map +1 -1
  78. package/dist/commands/documents/create.js +3 -3
  79. package/dist/commands/documents/create.js.map +1 -1
  80. package/dist/commands/documents/delete.js +3 -3
  81. package/dist/commands/documents/delete.js.map +1 -1
  82. package/dist/commands/documents/get.js +2 -2
  83. package/dist/commands/documents/get.js.map +1 -1
  84. package/dist/commands/documents/query.js +2 -2
  85. package/dist/commands/documents/query.js.map +1 -1
  86. package/dist/commands/documents/validate.js +3 -3
  87. package/dist/commands/documents/validate.js.map +1 -1
  88. package/dist/commands/graphql/deploy.js +13 -13
  89. package/dist/commands/graphql/deploy.js.map +1 -1
  90. package/dist/commands/graphql/list.js +2 -2
  91. package/dist/commands/graphql/list.js.map +1 -1
  92. package/dist/commands/graphql/undeploy.js +2 -2
  93. package/dist/commands/graphql/undeploy.js.map +1 -1
  94. package/dist/commands/hooks/attempt.js +2 -2
  95. package/dist/commands/hooks/attempt.js.map +1 -1
  96. package/dist/commands/hooks/create.js +3 -3
  97. package/dist/commands/hooks/create.js.map +1 -1
  98. package/dist/commands/hooks/delete.js +4 -4
  99. package/dist/commands/hooks/delete.js.map +1 -1
  100. package/dist/commands/hooks/list.js +2 -2
  101. package/dist/commands/hooks/list.js.map +1 -1
  102. package/dist/commands/hooks/logs.js +5 -5
  103. package/dist/commands/hooks/logs.js.map +1 -1
  104. package/dist/commands/login.js +2 -2
  105. package/dist/commands/login.js.map +1 -1
  106. package/dist/commands/logout.js +2 -2
  107. package/dist/commands/logout.js.map +1 -1
  108. package/dist/commands/manifest/extract.js +3 -3
  109. package/dist/commands/manifest/extract.js.map +1 -1
  110. package/dist/commands/mcp/configure.js +4 -4
  111. package/dist/commands/mcp/configure.js.map +1 -1
  112. package/dist/commands/media/create-aspect.js +3 -3
  113. package/dist/commands/media/create-aspect.js.map +1 -1
  114. package/dist/commands/media/delete-aspect.js +1 -1
  115. package/dist/commands/media/delete-aspect.js.map +1 -1
  116. package/dist/commands/media/deploy-aspect.js +4 -4
  117. package/dist/commands/media/deploy-aspect.js.map +1 -1
  118. package/dist/commands/media/export.js +7 -7
  119. package/dist/commands/media/export.js.map +1 -1
  120. package/dist/commands/media/import.js +6 -6
  121. package/dist/commands/media/import.js.map +1 -1
  122. package/dist/commands/migrations/create.js +4 -4
  123. package/dist/commands/migrations/create.js.map +1 -1
  124. package/dist/commands/migrations/list.js +2 -2
  125. package/dist/commands/migrations/list.js.map +1 -1
  126. package/dist/commands/migrations/run.js +14 -14
  127. package/dist/commands/migrations/run.js.map +1 -1
  128. package/dist/commands/openapi/get.js +3 -3
  129. package/dist/commands/openapi/get.js.map +1 -1
  130. package/dist/commands/openapi/list.js +2 -2
  131. package/dist/commands/openapi/list.js.map +1 -1
  132. package/dist/commands/organizations/create.js +5 -5
  133. package/dist/commands/organizations/create.js.map +1 -1
  134. package/dist/commands/organizations/delete.js +6 -6
  135. package/dist/commands/organizations/delete.js.map +1 -1
  136. package/dist/commands/organizations/get.js +3 -3
  137. package/dist/commands/organizations/get.js.map +1 -1
  138. package/dist/commands/organizations/list.js +2 -2
  139. package/dist/commands/organizations/list.js.map +1 -1
  140. package/dist/commands/organizations/update.js +6 -6
  141. package/dist/commands/organizations/update.js.map +1 -1
  142. package/dist/commands/preview.js +2 -2
  143. package/dist/commands/preview.js.map +1 -1
  144. package/dist/commands/projects/create.js +2 -2
  145. package/dist/commands/projects/create.js.map +1 -1
  146. package/dist/commands/projects/list.js +2 -2
  147. package/dist/commands/projects/list.js.map +1 -1
  148. package/dist/commands/schemas/delete.js +2 -2
  149. package/dist/commands/schemas/delete.js.map +1 -1
  150. package/dist/commands/schemas/deploy.js +2 -2
  151. package/dist/commands/schemas/deploy.js.map +1 -1
  152. package/dist/commands/schemas/list.js +1 -1
  153. package/dist/commands/schemas/list.js.map +1 -1
  154. package/dist/commands/schemas/validate.js +2 -1
  155. package/dist/commands/schemas/validate.js.map +1 -1
  156. package/dist/commands/skills/install.js +2 -2
  157. package/dist/commands/skills/install.js.map +1 -1
  158. package/dist/commands/telemetry/disable.js +2 -2
  159. package/dist/commands/telemetry/disable.js.map +1 -1
  160. package/dist/commands/telemetry/enable.js +2 -2
  161. package/dist/commands/telemetry/enable.js.map +1 -1
  162. package/dist/commands/tokens/create.js +2 -2
  163. package/dist/commands/tokens/create.js.map +1 -1
  164. package/dist/commands/tokens/delete.js +2 -2
  165. package/dist/commands/tokens/delete.js.map +1 -1
  166. package/dist/commands/tokens/list.js +2 -2
  167. package/dist/commands/tokens/list.js.map +1 -1
  168. package/dist/commands/users/invite.js +3 -3
  169. package/dist/commands/users/invite.js.map +1 -1
  170. package/oclif.manifest.json +331 -331
  171. package/package.json +5 -5
@@ -107,12 +107,12 @@ export class CreateDatasetCommand extends SanityCommand {
107
107
  const message = error instanceof Error ? error.message : String(error);
108
108
  createDatasetDebug(`Failed to fetch project data: ${message}`, error);
109
109
  this.error(`Failed to fetch project data: ${message}`, {
110
- exit: 1
110
+ exit: exitCodes.RUNTIME_ERROR
111
111
  });
112
112
  }
113
113
  if (datasets.includes(datasetName)) {
114
114
  this.error(`Dataset "${datasetName}" already exists`, {
115
- exit: 1
115
+ exit: exitCodes.RUNTIME_ERROR
116
116
  });
117
117
  }
118
118
  const canCreatePrivate = projectFeatures.includes('privateDataset');
@@ -131,7 +131,7 @@ export class CreateDatasetCommand extends SanityCommand {
131
131
  } catch (error) {
132
132
  const message = error instanceof Error ? error.message : String(error);
133
133
  this.error(`Failed to create dataset: ${message}`, {
134
- exit: 1
134
+ exit: exitCodes.RUNTIME_ERROR
135
135
  });
136
136
  }
137
137
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/datasets/create.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {createDataset} from '../../actions/dataset/create.js'\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {promptForDatasetName} from '../../prompts/promptForDatasetName.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {getProjectFeatures} from '../../services/getProjectFeatures.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst createDatasetDebug = subdebug('dataset:create')\n\nconst ALLOWED_ACL_MODES = ['custom', 'private', 'public']\n\nexport class CreateDatasetCommand extends SanityCommand<typeof CreateDatasetCommand> {\n static override args = {\n name: Args.string({\n description: 'Name of the dataset to create',\n required: false,\n }),\n }\n\n static override description = 'Create a new dataset for the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively create a dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-dataset',\n description: 'Create a dataset named \"my-dataset\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-dataset --visibility private',\n description: 'Create a private dataset named \"my-dataset\"',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to create dataset in',\n semantics: 'override',\n }),\n embeddings: Flags.boolean({\n default: false,\n description: 'Enable embeddings for this dataset',\n }),\n 'embeddings-projection': Flags.string({\n dependsOn: ['embeddings'],\n description: 'GROQ projection for embeddings indexing (e.g. \"{ title, body }\")',\n }),\n visibility: Flags.string({\n description: 'Set visibility for this dataset (custom/private/public)',\n options: ALLOWED_ACL_MODES,\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:create']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CreateDatasetCommand)\n const {visibility} = flags\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.datasets'},\n {grant: 'create', permission: 'sanity.project.datasets'},\n ],\n }),\n })\n\n // Get dataset name from args or prompt\n let {name: datasetName} = args\n if (datasetName) {\n const nameError = validateDatasetName(datasetName)\n if (nameError) {\n this.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n } else {\n if (this.isUnattended()) {\n this.error('Dataset name is required. Pass it as the `<name>` argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n datasetName = await promptForDatasetName()\n }\n\n let datasets: string[]\n let projectFeatures: string[]\n\n try {\n const [datasetsResponse, featuresResponse] = await Promise.all([\n listDatasets(projectId),\n getProjectFeatures(projectId),\n ])\n datasets = datasetsResponse.map((ds) => ds.name)\n projectFeatures = featuresResponse\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n createDatasetDebug(`Failed to fetch project data: ${message}`, error)\n this.error(`Failed to fetch project data: ${message}`, {exit: 1})\n }\n\n if (datasets.includes(datasetName)) {\n this.error(`Dataset \"${datasetName}\" already exists`, {exit: 1})\n }\n\n const canCreatePrivate = projectFeatures.includes('privateDataset')\n createDatasetDebug('%s create private datasets', canCreatePrivate ? 'Can' : 'Cannot')\n\n try {\n await createDataset({\n datasetName,\n embeddings: flags.embeddings,\n embeddingsProjection: flags['embeddings-projection'],\n isUnattended: this.isUnattended(),\n output: this.output,\n projectFeatures,\n projectId,\n visibility,\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.error(`Failed to create dataset: ${message}`, {exit: 1})\n }\n }\n}\n"],"names":["Args","Flags","exitCodes","SanityCommand","subdebug","createDataset","validateDatasetName","promptForDatasetName","promptForProject","listDatasets","getProjectFeatures","getProjectIdFlag","createDatasetDebug","ALLOWED_ACL_MODES","CreateDatasetCommand","args","name","string","description","required","examples","command","flags","semantics","embeddings","boolean","default","dependsOn","visibility","options","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","datasetName","nameError","error","exit","USAGE_ERROR","isUnattended","datasets","projectFeatures","datasetsResponse","featuresResponse","Promise","all","map","ds","message","Error","String","includes","canCreatePrivate","embeddingsProjection","output"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/datasets/create.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {createDataset} from '../../actions/dataset/create.js'\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {promptForDatasetName} from '../../prompts/promptForDatasetName.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {getProjectFeatures} from '../../services/getProjectFeatures.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst createDatasetDebug = subdebug('dataset:create')\n\nconst ALLOWED_ACL_MODES = ['custom', 'private', 'public']\n\nexport class CreateDatasetCommand extends SanityCommand<typeof CreateDatasetCommand> {\n static override args = {\n name: Args.string({\n description: 'Name of the dataset to create',\n required: false,\n }),\n }\n\n static override description = 'Create a new dataset for the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively create a dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-dataset',\n description: 'Create a dataset named \"my-dataset\"',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-dataset --visibility private',\n description: 'Create a private dataset named \"my-dataset\"',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to create dataset in',\n semantics: 'override',\n }),\n embeddings: Flags.boolean({\n default: false,\n description: 'Enable embeddings for this dataset',\n }),\n 'embeddings-projection': Flags.string({\n dependsOn: ['embeddings'],\n description: 'GROQ projection for embeddings indexing (e.g. \"{ title, body }\")',\n }),\n visibility: Flags.string({\n description: 'Set visibility for this dataset (custom/private/public)',\n options: ALLOWED_ACL_MODES,\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:create']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CreateDatasetCommand)\n const {visibility} = flags\n\n // Ensure we have project context\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.datasets'},\n {grant: 'create', permission: 'sanity.project.datasets'},\n ],\n }),\n })\n\n // Get dataset name from args or prompt\n let {name: datasetName} = args\n if (datasetName) {\n const nameError = validateDatasetName(datasetName)\n if (nameError) {\n this.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n } else {\n if (this.isUnattended()) {\n this.error('Dataset name is required. Pass it as the `<name>` argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n datasetName = await promptForDatasetName()\n }\n\n let datasets: string[]\n let projectFeatures: string[]\n\n try {\n const [datasetsResponse, featuresResponse] = await Promise.all([\n listDatasets(projectId),\n getProjectFeatures(projectId),\n ])\n datasets = datasetsResponse.map((ds) => ds.name)\n projectFeatures = featuresResponse\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n createDatasetDebug(`Failed to fetch project data: ${message}`, error)\n this.error(`Failed to fetch project data: ${message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n if (datasets.includes(datasetName)) {\n this.error(`Dataset \"${datasetName}\" already exists`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const canCreatePrivate = projectFeatures.includes('privateDataset')\n createDatasetDebug('%s create private datasets', canCreatePrivate ? 'Can' : 'Cannot')\n\n try {\n await createDataset({\n datasetName,\n embeddings: flags.embeddings,\n embeddingsProjection: flags['embeddings-projection'],\n isUnattended: this.isUnattended(),\n output: this.output,\n projectFeatures,\n projectId,\n visibility,\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.error(`Failed to create dataset: ${message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["Args","Flags","exitCodes","SanityCommand","subdebug","createDataset","validateDatasetName","promptForDatasetName","promptForProject","listDatasets","getProjectFeatures","getProjectIdFlag","createDatasetDebug","ALLOWED_ACL_MODES","CreateDatasetCommand","args","name","string","description","required","examples","command","flags","semantics","embeddings","boolean","default","dependsOn","visibility","options","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","datasetName","nameError","error","exit","USAGE_ERROR","isUnattended","datasets","projectFeatures","datasetsResponse","featuresResponse","Promise","all","map","ds","message","Error","String","RUNTIME_ERROR","includes","canCreatePrivate","embeddingsProjection","output"],"mappings":"AAAA,SAAQA,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAEnE,SAAQC,aAAa,QAAO,kCAAiC;AAC7D,SAAQC,mBAAmB,QAAO,+CAA8C;AAChF,SAAQC,oBAAoB,QAAO,wCAAuC;AAC1E,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,YAAY,QAAO,6BAA4B;AACvD,SAAQC,kBAAkB,QAAO,uCAAsC;AACvE,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,qBAAqBR,SAAS;AAEpC,MAAMS,oBAAoB;IAAC;IAAU;IAAW;CAAS;AAEzD,OAAO,MAAMC,6BAA6BX;IACxC,OAAgBY,OAAO;QACrBC,MAAMhB,KAAKiB,MAAM,CAAC;YAChBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,uCAAsC;IAEpE,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGX,iBAAiB;YAClBO,aAAa;YACbK,WAAW;QACb,EAAE;QACFC,YAAYvB,MAAMwB,OAAO,CAAC;YACxBC,SAAS;YACTR,aAAa;QACf;QACA,yBAAyBjB,MAAMgB,MAAM,CAAC;YACpCU,WAAW;gBAAC;aAAa;YACzBT,aAAa;QACf;QACAU,YAAY3B,MAAMgB,MAAM,CAAC;YACvBC,aAAa;YACbW,SAAShB;YACTM,UAAU;QACZ;IACF,EAAC;IAED,OAAgBW,gBAA0B;QAAC;KAAiB,CAAA;IAE5D,MAAaC,MAAqB;QAChC,MAAM,EAAChB,IAAI,EAAEO,KAAK,EAAC,GAAG,MAAM,IAAI,CAACU,KAAK,CAAClB;QACvC,MAAM,EAACc,UAAU,EAAC,GAAGN;QAErB,iCAAiC;QACjC,MAAMW,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACR3B,iBAAiB;oBACf4B,qBAAqB;wBACnB;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;wBACrD;4BAACD,OAAO;4BAAUC,YAAY;wBAAyB;qBACxD;gBACH;QACJ;QAEA,uCAAuC;QACvC,IAAI,EAACtB,MAAMuB,WAAW,EAAC,GAAGxB;QAC1B,IAAIwB,aAAa;YACf,MAAMC,YAAYlC,oBAAoBiC;YACtC,IAAIC,WAAW;gBACb,IAAI,CAACC,KAAK,CAACD,WAAW;oBAACE,MAAMxC,UAAUyC,WAAW;gBAAA;YACpD;QACF,OAAO;YACL,IAAI,IAAI,CAACC,YAAY,IAAI;gBACvB,IAAI,CAACH,KAAK,CAAC,+DAA+D;oBACxEC,MAAMxC,UAAUyC,WAAW;gBAC7B;YACF;YACAJ,cAAc,MAAMhC;QACtB;QAEA,IAAIsC;QACJ,IAAIC;QAEJ,IAAI;YACF,MAAM,CAACC,kBAAkBC,iBAAiB,GAAG,MAAMC,QAAQC,GAAG,CAAC;gBAC7DzC,aAAawB;gBACbvB,mBAAmBuB;aACpB;YACDY,WAAWE,iBAAiBI,GAAG,CAAC,CAACC,KAAOA,GAAGpC,IAAI;YAC/C8B,kBAAkBE;QACpB,EAAE,OAAOP,OAAO;YACd,MAAMY,UAAUZ,iBAAiBa,QAAQb,MAAMY,OAAO,GAAGE,OAAOd;YAChE7B,mBAAmB,CAAC,8BAA8B,EAAEyC,SAAS,EAAEZ;YAC/D,IAAI,CAACA,KAAK,CAAC,CAAC,8BAA8B,EAAEY,SAAS,EAAE;gBAACX,MAAMxC,UAAUsD,aAAa;YAAA;QACvF;QAEA,IAAIX,SAASY,QAAQ,CAAClB,cAAc;YAClC,IAAI,CAACE,KAAK,CAAC,CAAC,SAAS,EAAEF,YAAY,gBAAgB,CAAC,EAAE;gBAACG,MAAMxC,UAAUsD,aAAa;YAAA;QACtF;QAEA,MAAME,mBAAmBZ,gBAAgBW,QAAQ,CAAC;QAClD7C,mBAAmB,8BAA8B8C,mBAAmB,QAAQ;QAE5E,IAAI;YACF,MAAMrD,cAAc;gBAClBkC;gBACAf,YAAYF,MAAME,UAAU;gBAC5BmC,sBAAsBrC,KAAK,CAAC,wBAAwB;gBACpDsB,cAAc,IAAI,CAACA,YAAY;gBAC/BgB,QAAQ,IAAI,CAACA,MAAM;gBACnBd;gBACAb;gBACAL;YACF;QACF,EAAE,OAAOa,OAAO;YACd,MAAMY,UAAUZ,iBAAiBa,QAAQb,MAAMY,OAAO,GAAGE,OAAOd;YAChE,IAAI,CAACA,KAAK,CAAC,CAAC,0BAA0B,EAAEY,SAAS,EAAE;gBAACX,MAAMxC,UAAUsD,aAAa;YAAA;QACnF;IACF;AACF"}
@@ -83,7 +83,7 @@ export class DeleteDatasetCommand extends SanityCommand {
83
83
  const err = error instanceof Error ? error : new Error(`${error}`);
84
84
  deleteDatasetDebug(`Error getting project ${projectId}`, err);
85
85
  this.error(`Project retrieval failed: ${err.message}`, {
86
- exit: 1
86
+ exit: exitCodes.RUNTIME_ERROR
87
87
  });
88
88
  }
89
89
  await input({
@@ -104,7 +104,7 @@ export class DeleteDatasetCommand extends SanityCommand {
104
104
  const err = error instanceof Error ? error : new Error(`${error}`);
105
105
  deleteDatasetDebug(`Error deleting dataset ${datasetName}`, err);
106
106
  this.error(`Dataset deletion failed: ${err.message}`, {
107
- exit: 1
107
+ exit: exitCodes.RUNTIME_ERROR
108
108
  });
109
109
  }
110
110
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/datasets/delete.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input, logSymbols} from '@sanity/cli-core/ux'\n\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteDataset} from '../../services/datasets.js'\nimport {getProjectById} from '../../services/projects.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteDatasetDebug = subdebug('dataset:delete')\n\nexport class DeleteDatasetCommand extends SanityCommand<typeof DeleteDatasetCommand> {\n static override args = {\n datasetName: Args.string({\n description: 'Dataset name to delete',\n required: true,\n }),\n }\n\n static override description = 'Delete a dataset from the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> my-dataset',\n description: 'Delete a specific dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-dataset --force',\n description: 'Delete a specific dataset without confirmation',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete dataset from',\n semantics: 'override',\n }),\n force: Flags.boolean({\n description: 'Do not prompt for delete confirmation - forcefully delete',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:delete']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DeleteDatasetCommand)\n const {force} = flags\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'delete', permission: 'sanity.project.datasets'}],\n }),\n })\n\n const datasetName = args.datasetName\n\n const dsError = validateDatasetName(datasetName)\n if (dsError) {\n this.error(dsError, {exit: exitCodes.USAGE_ERROR})\n }\n\n if (force) {\n this.warn(`'--force' used: skipping confirmation, deleting dataset \"${datasetName}\"`)\n } else {\n if (this.isUnattended()) {\n this.error('Dataset deletion requires confirmation. Re-run with `--force`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n try {\n const project = await getProjectById(projectId)\n this.log(\n styleText(\n 'yellow',\n `${logSymbols.warning} Deleting dataset \"${styleText(['bold', 'underline'], datasetName)}\" from project \"${styleText(['bold', 'underline'], project.displayName)} (${styleText(['bold', 'underline'], project.id)})\"\\n`,\n ),\n )\n } catch (error) {\n const err = error instanceof Error ? error : new Error(`${error}`)\n deleteDatasetDebug(`Error getting project ${projectId}`, err)\n this.error(`Project retrieval failed: ${err.message}`, {exit: 1})\n }\n\n await input({\n message: `Delete dataset \"${datasetName}\"?\\n Type the dataset name to confirm:`,\n validate: (input) => {\n const trimmed = input.trim()\n return (\n trimmed === datasetName ||\n `Dataset name doesn't match. Enter \"${datasetName}\" or press Ctrl+C to cancel.`\n )\n },\n })\n }\n\n try {\n await deleteDataset({datasetName, projectId})\n this.log('Dataset deleted successfully')\n } catch (error) {\n const err = error instanceof Error ? error : new Error(`${error}`)\n deleteDatasetDebug(`Error deleting dataset ${datasetName}`, err)\n this.error(`Dataset deletion failed: ${err.message}`, {exit: 1})\n }\n }\n}\n"],"names":["styleText","Args","Flags","exitCodes","SanityCommand","subdebug","input","logSymbols","validateDatasetName","promptForProject","deleteDataset","getProjectById","getProjectIdFlag","deleteDatasetDebug","DeleteDatasetCommand","args","datasetName","string","description","required","examples","command","flags","semantics","force","boolean","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","dsError","error","exit","USAGE_ERROR","warn","isUnattended","project","log","warning","displayName","id","err","Error","message","validate","trimmed","trim"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/datasets/delete.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {input, logSymbols} from '@sanity/cli-core/ux'\n\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {deleteDataset} from '../../services/datasets.js'\nimport {getProjectById} from '../../services/projects.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst deleteDatasetDebug = subdebug('dataset:delete')\n\nexport class DeleteDatasetCommand extends SanityCommand<typeof DeleteDatasetCommand> {\n static override args = {\n datasetName: Args.string({\n description: 'Dataset name to delete',\n required: true,\n }),\n }\n\n static override description = 'Delete a dataset from the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> my-dataset',\n description: 'Delete a specific dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-dataset --force',\n description: 'Delete a specific dataset without confirmation',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to delete dataset from',\n semantics: 'override',\n }),\n force: Flags.boolean({\n description: 'Do not prompt for delete confirmation - forcefully delete',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:delete']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DeleteDatasetCommand)\n const {force} = flags\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'delete', permission: 'sanity.project.datasets'}],\n }),\n })\n\n const datasetName = args.datasetName\n\n const dsError = validateDatasetName(datasetName)\n if (dsError) {\n this.error(dsError, {exit: exitCodes.USAGE_ERROR})\n }\n\n if (force) {\n this.warn(`'--force' used: skipping confirmation, deleting dataset \"${datasetName}\"`)\n } else {\n if (this.isUnattended()) {\n this.error('Dataset deletion requires confirmation. Re-run with `--force`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n try {\n const project = await getProjectById(projectId)\n this.log(\n styleText(\n 'yellow',\n `${logSymbols.warning} Deleting dataset \"${styleText(['bold', 'underline'], datasetName)}\" from project \"${styleText(['bold', 'underline'], project.displayName)} (${styleText(['bold', 'underline'], project.id)})\"\\n`,\n ),\n )\n } catch (error) {\n const err = error instanceof Error ? error : new Error(`${error}`)\n deleteDatasetDebug(`Error getting project ${projectId}`, err)\n this.error(`Project retrieval failed: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n await input({\n message: `Delete dataset \"${datasetName}\"?\\n Type the dataset name to confirm:`,\n validate: (input) => {\n const trimmed = input.trim()\n return (\n trimmed === datasetName ||\n `Dataset name doesn't match. Enter \"${datasetName}\" or press Ctrl+C to cancel.`\n )\n },\n })\n }\n\n try {\n await deleteDataset({datasetName, projectId})\n this.log('Dataset deleted successfully')\n } catch (error) {\n const err = error instanceof Error ? error : new Error(`${error}`)\n deleteDatasetDebug(`Error deleting dataset ${datasetName}`, err)\n this.error(`Dataset deletion failed: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["styleText","Args","Flags","exitCodes","SanityCommand","subdebug","input","logSymbols","validateDatasetName","promptForProject","deleteDataset","getProjectById","getProjectIdFlag","deleteDatasetDebug","DeleteDatasetCommand","args","datasetName","string","description","required","examples","command","flags","semantics","force","boolean","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","dsError","error","exit","USAGE_ERROR","warn","isUnattended","project","log","warning","displayName","id","err","Error","message","RUNTIME_ERROR","validate","trimmed","trim"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { styleText } from 'node:util';
2
2
  import { Args } from '@oclif/core';
3
3
  import { CLIError } from '@oclif/core/errors';
4
- import { SanityCommand, subdebug } from '@sanity/cli-core';
4
+ import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
5
5
  import { resolveDataset } from '../../../actions/dataset/resolveDataset.js';
6
6
  import { promptForProject } from '../../../prompts/promptForProject.js';
7
7
  import { setEmbeddingsSettings } from '../../../services/embeddings.js';
@@ -60,7 +60,7 @@ export class DatasetEmbeddingsDisableCommand extends SanityCommand {
60
60
  const message = error instanceof Error ? error.message : String(error);
61
61
  debug(`Failed to resolve dataset: ${message}`, error);
62
62
  this.error(message, {
63
- exit: 1
63
+ exit: exitCodes.RUNTIME_ERROR
64
64
  });
65
65
  }
66
66
  try {
@@ -73,7 +73,7 @@ export class DatasetEmbeddingsDisableCommand extends SanityCommand {
73
73
  const message = error instanceof Error ? error.message : String(error);
74
74
  debug(`Failed to disable embeddings: ${message}`, error);
75
75
  this.error(`Failed to disable embeddings: ${message}`, {
76
- exit: 1
76
+ exit: exitCodes.RUNTIME_ERROR
77
77
  });
78
78
  }
79
79
  this.log(styleText('green', `Disabled embeddings for dataset ${dataset}.`));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/datasets/embeddings/disable.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {resolveDataset} from '../../../actions/dataset/resolveDataset.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {setEmbeddingsSettings} from '../../../services/embeddings.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst debug = subdebug('dataset:embeddings:disable')\n\nexport class DatasetEmbeddingsDisableCommand extends SanityCommand<\n typeof DatasetEmbeddingsDisableCommand\n> {\n static override args = {\n dataset: Args.string({\n description: 'Dataset name to disable embeddings for',\n required: false,\n }),\n }\n\n static override description = 'Disable embeddings for a dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> production',\n description: 'Disable embeddings for the production dataset',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to disable embeddings for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:embeddings:disable']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(DatasetEmbeddingsDisableCommand)\n let {dataset} = args\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.datasets'},\n {grant: 'update', permission: 'sanity.project.datasets'},\n ],\n }),\n })\n\n try {\n ;({dataset} = await resolveDataset({\n dataset,\n isUnattended: this.isUnattended(),\n output: this.output,\n projectId,\n }))\n } catch (error) {\n if (error instanceof CLIError) throw error\n const message = error instanceof Error ? error.message : String(error)\n debug(`Failed to resolve dataset: ${message}`, error)\n this.error(message, {exit: 1})\n }\n\n try {\n await setEmbeddingsSettings({dataset, enabled: false, projectId})\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n debug(`Failed to disable embeddings: ${message}`, error)\n this.error(`Failed to disable embeddings: ${message}`, {exit: 1})\n }\n\n this.log(styleText('green', `Disabled embeddings for dataset ${dataset}.`))\n this.log(styleText('yellow', 'Note: Existing embedding data will be removed.'))\n }\n}\n"],"names":["styleText","Args","CLIError","SanityCommand","subdebug","resolveDataset","promptForProject","setEmbeddingsSettings","getProjectIdFlag","debug","DatasetEmbeddingsDisableCommand","args","dataset","string","description","required","examples","command","flags","semantics","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","isUnattended","output","error","message","Error","String","exit","enabled","log"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,IAAI,QAAO,cAAa;AAChC,SAAQC,QAAQ,QAAO,qBAAoB;AAC3C,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExD,SAAQC,cAAc,QAAO,6CAA4C;AACzE,SAAQC,gBAAgB,QAAO,uCAAsC;AACrE,SAAQC,qBAAqB,QAAO,kCAAiC;AACrE,SAAQC,gBAAgB,QAAO,+BAA8B;AAE7D,MAAMC,QAAQL,SAAS;AAEvB,OAAO,MAAMM,wCAAwCP;IAGnD,OAAgBQ,OAAO;QACrBC,SAASX,KAAKY,MAAM,CAAC;YACnBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,mCAAkC;IAEhE,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGV,iBAAiB;YAClBM,aAAa;YACbK,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAA6B,CAAA;IAExE,MAAaC,MAAqB;QAChC,MAAM,EAACV,IAAI,EAAC,GAAG,MAAM,IAAI,CAACW,KAAK,CAACZ;QAChC,IAAI,EAACE,OAAO,EAAC,GAAGD;QAEhB,MAAMY,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRnB,iBAAiB;oBACfoB,qBAAqB;wBACnB;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;wBACrD;4BAACD,OAAO;4BAAUC,YAAY;wBAAyB;qBACxD;gBACH;QACJ;QAEA,IAAI;;YACA,CAAA,EAAChB,OAAO,EAAC,GAAG,MAAMP,eAAe;gBACjCO;gBACAiB,cAAc,IAAI,CAACA,YAAY;gBAC/BC,QAAQ,IAAI,CAACA,MAAM;gBACnBP;YACF,EAAC;QACH,EAAE,OAAOQ,OAAO;YACd,IAAIA,iBAAiB7B,UAAU,MAAM6B;YACrC,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAChEtB,MAAM,CAAC,2BAA2B,EAAEuB,SAAS,EAAED;YAC/C,IAAI,CAACA,KAAK,CAACC,SAAS;gBAACG,MAAM;YAAC;QAC9B;QAEA,IAAI;YACF,MAAM5B,sBAAsB;gBAACK;gBAASwB,SAAS;gBAAOb;YAAS;QACjE,EAAE,OAAOQ,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAChEtB,MAAM,CAAC,8BAA8B,EAAEuB,SAAS,EAAED;YAClD,IAAI,CAACA,KAAK,CAAC,CAAC,8BAA8B,EAAEC,SAAS,EAAE;gBAACG,MAAM;YAAC;QACjE;QAEA,IAAI,CAACE,GAAG,CAACrC,UAAU,SAAS,CAAC,gCAAgC,EAAEY,QAAQ,CAAC,CAAC;QACzE,IAAI,CAACyB,GAAG,CAACrC,UAAU,UAAU;IAC/B;AACF"}
1
+ {"version":3,"sources":["../../../../src/commands/datasets/embeddings/disable.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {resolveDataset} from '../../../actions/dataset/resolveDataset.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {setEmbeddingsSettings} from '../../../services/embeddings.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst debug = subdebug('dataset:embeddings:disable')\n\nexport class DatasetEmbeddingsDisableCommand extends SanityCommand<\n typeof DatasetEmbeddingsDisableCommand\n> {\n static override args = {\n dataset: Args.string({\n description: 'Dataset name to disable embeddings for',\n required: false,\n }),\n }\n\n static override description = 'Disable embeddings for a dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> production',\n description: 'Disable embeddings for the production dataset',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to disable embeddings for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:embeddings:disable']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(DatasetEmbeddingsDisableCommand)\n let {dataset} = args\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.datasets'},\n {grant: 'update', permission: 'sanity.project.datasets'},\n ],\n }),\n })\n\n try {\n ;({dataset} = await resolveDataset({\n dataset,\n isUnattended: this.isUnattended(),\n output: this.output,\n projectId,\n }))\n } catch (error) {\n if (error instanceof CLIError) throw error\n const message = error instanceof Error ? error.message : String(error)\n debug(`Failed to resolve dataset: ${message}`, error)\n this.error(message, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n try {\n await setEmbeddingsSettings({dataset, enabled: false, projectId})\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n debug(`Failed to disable embeddings: ${message}`, error)\n this.error(`Failed to disable embeddings: ${message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n this.log(styleText('green', `Disabled embeddings for dataset ${dataset}.`))\n this.log(styleText('yellow', 'Note: Existing embedding data will be removed.'))\n }\n}\n"],"names":["styleText","Args","CLIError","exitCodes","SanityCommand","subdebug","resolveDataset","promptForProject","setEmbeddingsSettings","getProjectIdFlag","debug","DatasetEmbeddingsDisableCommand","args","dataset","string","description","required","examples","command","flags","semantics","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","isUnattended","output","error","message","Error","String","exit","RUNTIME_ERROR","enabled","log"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,IAAI,QAAO,cAAa;AAChC,SAAQC,QAAQ,QAAO,qBAAoB;AAC3C,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAEnE,SAAQC,cAAc,QAAO,6CAA4C;AACzE,SAAQC,gBAAgB,QAAO,uCAAsC;AACrE,SAAQC,qBAAqB,QAAO,kCAAiC;AACrE,SAAQC,gBAAgB,QAAO,+BAA8B;AAE7D,MAAMC,QAAQL,SAAS;AAEvB,OAAO,MAAMM,wCAAwCP;IAGnD,OAAgBQ,OAAO;QACrBC,SAASZ,KAAKa,MAAM,CAAC;YACnBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,mCAAkC;IAEhE,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGV,iBAAiB;YAClBM,aAAa;YACbK,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAA6B,CAAA;IAExE,MAAaC,MAAqB;QAChC,MAAM,EAACV,IAAI,EAAC,GAAG,MAAM,IAAI,CAACW,KAAK,CAACZ;QAChC,IAAI,EAACE,OAAO,EAAC,GAAGD;QAEhB,MAAMY,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRnB,iBAAiB;oBACfoB,qBAAqB;wBACnB;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;wBACrD;4BAACD,OAAO;4BAAUC,YAAY;wBAAyB;qBACxD;gBACH;QACJ;QAEA,IAAI;;YACA,CAAA,EAAChB,OAAO,EAAC,GAAG,MAAMP,eAAe;gBACjCO;gBACAiB,cAAc,IAAI,CAACA,YAAY;gBAC/BC,QAAQ,IAAI,CAACA,MAAM;gBACnBP;YACF,EAAC;QACH,EAAE,OAAOQ,OAAO;YACd,IAAIA,iBAAiB9B,UAAU,MAAM8B;YACrC,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAChEtB,MAAM,CAAC,2BAA2B,EAAEuB,SAAS,EAAED;YAC/C,IAAI,CAACA,KAAK,CAACC,SAAS;gBAACG,MAAMjC,UAAUkC,aAAa;YAAA;QACpD;QAEA,IAAI;YACF,MAAM7B,sBAAsB;gBAACK;gBAASyB,SAAS;gBAAOd;YAAS;QACjE,EAAE,OAAOQ,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAChEtB,MAAM,CAAC,8BAA8B,EAAEuB,SAAS,EAAED;YAClD,IAAI,CAACA,KAAK,CAAC,CAAC,8BAA8B,EAAEC,SAAS,EAAE;gBAACG,MAAMjC,UAAUkC,aAAa;YAAA;QACvF;QAEA,IAAI,CAACE,GAAG,CAACvC,UAAU,SAAS,CAAC,gCAAgC,EAAEa,QAAQ,CAAC,CAAC;QACzE,IAAI,CAAC0B,GAAG,CAACvC,UAAU,UAAU;IAC/B;AACF"}
@@ -82,7 +82,7 @@ export class DatasetEmbeddingsEnableCommand extends SanityCommand {
82
82
  const message = error instanceof Error ? error.message : String(error);
83
83
  debug(`Failed to resolve dataset: ${message}`, error);
84
84
  this.error(message, {
85
- exit: 1
85
+ exit: exitCodes.RUNTIME_ERROR
86
86
  });
87
87
  }
88
88
  if (projection) {
@@ -106,7 +106,7 @@ export class DatasetEmbeddingsEnableCommand extends SanityCommand {
106
106
  const message = error instanceof Error ? error.message : String(error);
107
107
  debug(`Failed to enable embeddings: ${message}`, error);
108
108
  this.error(`Failed to enable embeddings: ${message}`, {
109
- exit: 1
109
+ exit: exitCodes.RUNTIME_ERROR
110
110
  });
111
111
  }
112
112
  this.log(styleText('green', `Embeddings enabled for dataset ${dataset}.`));
@@ -133,7 +133,7 @@ export class DatasetEmbeddingsEnableCommand extends SanityCommand {
133
133
  const message = error instanceof Error ? error.message : String(error);
134
134
  spin.fail('Failed while waiting for embeddings.');
135
135
  this.error(`Failed while waiting for embeddings: ${message}`, {
136
- exit: 1
136
+ exit: exitCodes.RUNTIME_ERROR
137
137
  });
138
138
  }
139
139
  debug(`Poll status: ${settings.status}, next interval: ${Math.round(interval)}ms`);
@@ -144,14 +144,14 @@ export class DatasetEmbeddingsEnableCommand extends SanityCommand {
144
144
  if (settings.status !== 'updating') {
145
145
  spin.fail(`Unexpected status: ${settings.status}`);
146
146
  this.error(`Embeddings entered unexpected status: ${settings.status}`, {
147
- exit: 1
147
+ exit: exitCodes.RUNTIME_ERROR
148
148
  });
149
149
  }
150
150
  spin.text = 'Still processing...';
151
151
  }
152
152
  spin.fail('Timed out waiting for embeddings.');
153
153
  this.error('Timed out. Check status with: sanity dataset embeddings status', {
154
- exit: 1
154
+ exit: exitCodes.RUNTIME_ERROR
155
155
  });
156
156
  }
157
157
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/datasets/embeddings/enable.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\n\nimport {resolveDataset} from '../../../actions/dataset/resolveDataset.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {getEmbeddingsSettings, setEmbeddingsSettings} from '../../../services/embeddings.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\nimport {validateProjection} from '../../../util/validateProjection.js'\n\nconst debug = subdebug('dataset:embeddings:enable')\n\nconst INITIAL_POLL_INTERVAL_MS = 10_000\nconst MAX_POLL_INTERVAL_MS = 10 * 60 * 1000\nconst POLL_TIMEOUT_MS = 24 * 60 * 60 * 1000\n\nexport class DatasetEmbeddingsEnableCommand extends SanityCommand<\n typeof DatasetEmbeddingsEnableCommand\n> {\n static override args = {\n dataset: Args.string({\n description: 'Dataset name to enable embeddings for',\n required: false,\n }),\n }\n\n static override description = 'Enable embeddings for a dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> production',\n description: 'Enable embeddings for the production dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> production --projection \"{ title, body }\"',\n description: 'Enable embeddings with a specific projection',\n },\n {\n command: '<%= config.bin %> <%= command.id %> production --wait',\n description: 'Enable embeddings and wait for processing to complete',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to enable embeddings for',\n semantics: 'override',\n }),\n projection: Flags.string({\n description: 'GROQ projection defining which fields to embed (e.g. \"{ title, body }\")',\n required: false,\n }),\n wait: Flags.boolean({\n default: false,\n description: 'Wait for embeddings processing to complete before returning',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:embeddings:enable']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DatasetEmbeddingsEnableCommand)\n let {dataset} = args\n const {projection, wait} = flags\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.datasets'},\n {grant: 'update', permission: 'sanity.project.datasets'},\n ],\n }),\n })\n\n try {\n ;({dataset} = await resolveDataset({\n dataset,\n isUnattended: this.isUnattended(),\n output: this.output,\n projectId,\n }))\n } catch (error) {\n if (error instanceof CLIError) throw error\n const message = error instanceof Error ? error.message : String(error)\n debug(`Failed to resolve dataset: ${message}`, error)\n this.error(message, {exit: 1})\n }\n\n if (projection) {\n try {\n validateProjection(projection)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.error(`Invalid projection: ${message}`, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n try {\n await setEmbeddingsSettings({dataset, enabled: true, projectId, projection})\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n debug(`Failed to enable embeddings: ${message}`, error)\n this.error(`Failed to enable embeddings: ${message}`, {exit: 1})\n }\n\n this.log(styleText('green', `Embeddings enabled for dataset ${dataset}.`))\n if (projection) {\n this.log(`Projection: ${projection}`)\n }\n\n if (wait) {\n await this.waitForReady(projectId, dataset)\n } else {\n this.log('Processing documents in the background. Use --wait to wait for completion.')\n }\n }\n\n private async waitForReady(projectId: string, dataset: string): Promise<void> {\n const spin = spinner('Waiting for embeddings to be ready...').start()\n const deadline = Date.now() + POLL_TIMEOUT_MS\n let interval = INITIAL_POLL_INTERVAL_MS\n\n while (Date.now() < deadline) {\n await new Promise<void>((resolve) => setTimeout(resolve, interval))\n interval = Math.min(interval * 1.5, MAX_POLL_INTERVAL_MS)\n\n let settings\n try {\n settings = await getEmbeddingsSettings(projectId, dataset)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n spin.fail('Failed while waiting for embeddings.')\n this.error(`Failed while waiting for embeddings: ${message}`, {exit: 1})\n }\n debug(`Poll status: ${settings.status}, next interval: ${Math.round(interval)}ms`)\n\n if (settings.status === 'ready') {\n spin.succeed('Embeddings ready.')\n return\n }\n\n if (settings.status !== 'updating') {\n spin.fail(`Unexpected status: ${settings.status}`)\n this.error(`Embeddings entered unexpected status: ${settings.status}`, {exit: 1})\n }\n\n spin.text = 'Still processing...'\n }\n\n spin.fail('Timed out waiting for embeddings.')\n this.error('Timed out. Check status with: sanity dataset embeddings status', {exit: 1})\n }\n}\n"],"names":["styleText","Args","Flags","CLIError","exitCodes","SanityCommand","subdebug","spinner","resolveDataset","promptForProject","getEmbeddingsSettings","setEmbeddingsSettings","getProjectIdFlag","validateProjection","debug","INITIAL_POLL_INTERVAL_MS","MAX_POLL_INTERVAL_MS","POLL_TIMEOUT_MS","DatasetEmbeddingsEnableCommand","args","dataset","string","description","required","examples","command","flags","semantics","projection","wait","boolean","default","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","isUnattended","output","error","message","Error","String","exit","USAGE_ERROR","enabled","log","waitForReady","spin","start","deadline","Date","now","interval","Promise","resolve","setTimeout","Math","min","settings","fail","status","round","succeed","text"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/commands/datasets/embeddings/enable.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\n\nimport {resolveDataset} from '../../../actions/dataset/resolveDataset.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {getEmbeddingsSettings, setEmbeddingsSettings} from '../../../services/embeddings.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\nimport {validateProjection} from '../../../util/validateProjection.js'\n\nconst debug = subdebug('dataset:embeddings:enable')\n\nconst INITIAL_POLL_INTERVAL_MS = 10_000\nconst MAX_POLL_INTERVAL_MS = 10 * 60 * 1000\nconst POLL_TIMEOUT_MS = 24 * 60 * 60 * 1000\n\nexport class DatasetEmbeddingsEnableCommand extends SanityCommand<\n typeof DatasetEmbeddingsEnableCommand\n> {\n static override args = {\n dataset: Args.string({\n description: 'Dataset name to enable embeddings for',\n required: false,\n }),\n }\n\n static override description = 'Enable embeddings for a dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> production',\n description: 'Enable embeddings for the production dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> production --projection \"{ title, body }\"',\n description: 'Enable embeddings with a specific projection',\n },\n {\n command: '<%= config.bin %> <%= command.id %> production --wait',\n description: 'Enable embeddings and wait for processing to complete',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to enable embeddings for',\n semantics: 'override',\n }),\n projection: Flags.string({\n description: 'GROQ projection defining which fields to embed (e.g. \"{ title, body }\")',\n required: false,\n }),\n wait: Flags.boolean({\n default: false,\n description: 'Wait for embeddings processing to complete before returning',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:embeddings:enable']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DatasetEmbeddingsEnableCommand)\n let {dataset} = args\n const {projection, wait} = flags\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [\n {grant: 'read', permission: 'sanity.project.datasets'},\n {grant: 'update', permission: 'sanity.project.datasets'},\n ],\n }),\n })\n\n try {\n ;({dataset} = await resolveDataset({\n dataset,\n isUnattended: this.isUnattended(),\n output: this.output,\n projectId,\n }))\n } catch (error) {\n if (error instanceof CLIError) throw error\n const message = error instanceof Error ? error.message : String(error)\n debug(`Failed to resolve dataset: ${message}`, error)\n this.error(message, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n if (projection) {\n try {\n validateProjection(projection)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.error(`Invalid projection: ${message}`, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n try {\n await setEmbeddingsSettings({dataset, enabled: true, projectId, projection})\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n debug(`Failed to enable embeddings: ${message}`, error)\n this.error(`Failed to enable embeddings: ${message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n this.log(styleText('green', `Embeddings enabled for dataset ${dataset}.`))\n if (projection) {\n this.log(`Projection: ${projection}`)\n }\n\n if (wait) {\n await this.waitForReady(projectId, dataset)\n } else {\n this.log('Processing documents in the background. Use --wait to wait for completion.')\n }\n }\n\n private async waitForReady(projectId: string, dataset: string): Promise<void> {\n const spin = spinner('Waiting for embeddings to be ready...').start()\n const deadline = Date.now() + POLL_TIMEOUT_MS\n let interval = INITIAL_POLL_INTERVAL_MS\n\n while (Date.now() < deadline) {\n await new Promise<void>((resolve) => setTimeout(resolve, interval))\n interval = Math.min(interval * 1.5, MAX_POLL_INTERVAL_MS)\n\n let settings\n try {\n settings = await getEmbeddingsSettings(projectId, dataset)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n spin.fail('Failed while waiting for embeddings.')\n this.error(`Failed while waiting for embeddings: ${message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n debug(`Poll status: ${settings.status}, next interval: ${Math.round(interval)}ms`)\n\n if (settings.status === 'ready') {\n spin.succeed('Embeddings ready.')\n return\n }\n\n if (settings.status !== 'updating') {\n spin.fail(`Unexpected status: ${settings.status}`)\n this.error(`Embeddings entered unexpected status: ${settings.status}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n spin.text = 'Still processing...'\n }\n\n spin.fail('Timed out waiting for embeddings.')\n this.error('Timed out. Check status with: sanity dataset embeddings status', {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n}\n"],"names":["styleText","Args","Flags","CLIError","exitCodes","SanityCommand","subdebug","spinner","resolveDataset","promptForProject","getEmbeddingsSettings","setEmbeddingsSettings","getProjectIdFlag","validateProjection","debug","INITIAL_POLL_INTERVAL_MS","MAX_POLL_INTERVAL_MS","POLL_TIMEOUT_MS","DatasetEmbeddingsEnableCommand","args","dataset","string","description","required","examples","command","flags","semantics","projection","wait","boolean","default","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","isUnattended","output","error","message","Error","String","exit","RUNTIME_ERROR","USAGE_ERROR","enabled","log","waitForReady","spin","start","deadline","Date","now","interval","Promise","resolve","setTimeout","Math","min","settings","fail","status","round","succeed","text"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Args } from '@oclif/core';
2
2
  import { CLIError } from '@oclif/core/errors';
3
- import { SanityCommand, subdebug } from '@sanity/cli-core';
3
+ import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
4
4
  import { resolveDataset } from '../../../actions/dataset/resolveDataset.js';
5
5
  import { promptForProject } from '../../../prompts/promptForProject.js';
6
6
  import { getEmbeddingsSettings } from '../../../services/embeddings.js';
@@ -55,7 +55,7 @@ export class DatasetEmbeddingsStatusCommand extends SanityCommand {
55
55
  const message = error instanceof Error ? error.message : String(error);
56
56
  debug(`Failed to resolve dataset: ${message}`, error);
57
57
  this.error(message, {
58
- exit: 1
58
+ exit: exitCodes.RUNTIME_ERROR
59
59
  });
60
60
  }
61
61
  try {
@@ -70,7 +70,7 @@ export class DatasetEmbeddingsStatusCommand extends SanityCommand {
70
70
  const message = error instanceof Error ? error.message : String(error);
71
71
  debug(`Failed to get embeddings settings: ${message}`, error);
72
72
  this.error(`Failed to get embeddings settings: ${message}`, {
73
- exit: 1
73
+ exit: exitCodes.RUNTIME_ERROR
74
74
  });
75
75
  }
76
76
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/datasets/embeddings/status.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {resolveDataset} from '../../../actions/dataset/resolveDataset.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {getEmbeddingsSettings} from '../../../services/embeddings.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst debug = subdebug('dataset:embeddings:status')\n\nexport class DatasetEmbeddingsStatusCommand extends SanityCommand<\n typeof DatasetEmbeddingsStatusCommand\n> {\n static override args = {\n dataset: Args.string({\n description: 'The name of the dataset to check embeddings status for',\n required: false,\n }),\n }\n\n static override description = 'Show embeddings settings and status for a dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> production',\n description: 'Show embeddings status for the production dataset',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to check embeddings status for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:embeddings:status']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(DatasetEmbeddingsStatusCommand)\n let {dataset} = args\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.datasets'}],\n }),\n })\n\n try {\n ;({dataset} = await resolveDataset({\n dataset,\n isUnattended: this.isUnattended(),\n output: this.output,\n projectId,\n }))\n } catch (error) {\n if (error instanceof CLIError) throw error\n const message = error instanceof Error ? error.message : String(error)\n debug(`Failed to resolve dataset: ${message}`, error)\n this.error(message, {exit: 1})\n }\n\n try {\n const settings = await getEmbeddingsSettings(projectId, dataset)\n\n this.log(`Dataset: ${dataset}`)\n this.log(`Embeddings: ${settings.enabled ? 'enabled' : 'disabled'}`)\n if (settings.projection) {\n this.log(`Projection: ${settings.projection}`)\n }\n this.log(`Status: ${settings.status}`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n debug(`Failed to get embeddings settings: ${message}`, error)\n this.error(`Failed to get embeddings settings: ${message}`, {exit: 1})\n }\n }\n}\n"],"names":["Args","CLIError","SanityCommand","subdebug","resolveDataset","promptForProject","getEmbeddingsSettings","getProjectIdFlag","debug","DatasetEmbeddingsStatusCommand","args","dataset","string","description","required","examples","command","flags","semantics","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","isUnattended","output","error","message","Error","String","exit","settings","log","enabled","projection","status"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,QAAQ,QAAO,qBAAoB;AAC3C,SAAQC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAExD,SAAQC,cAAc,QAAO,6CAA4C;AACzE,SAAQC,gBAAgB,QAAO,uCAAsC;AACrE,SAAQC,qBAAqB,QAAO,kCAAiC;AACrE,SAAQC,gBAAgB,QAAO,+BAA8B;AAE7D,MAAMC,QAAQL,SAAS;AAEvB,OAAO,MAAMM,uCAAuCP;IAGlD,OAAgBQ,OAAO;QACrBC,SAASX,KAAKY,MAAM,CAAC;YACnBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,oDAAmD;IAEjF,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGV,iBAAiB;YAClBM,aAAa;YACbK,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAA4B,CAAA;IAEvE,MAAaC,MAAqB;QAChC,MAAM,EAACV,IAAI,EAAC,GAAG,MAAM,IAAI,CAACW,KAAK,CAACZ;QAChC,IAAI,EAACE,OAAO,EAAC,GAAGD;QAEhB,MAAMY,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRnB,iBAAiB;oBACfoB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,IAAI;;YACA,CAAA,EAAChB,OAAO,EAAC,GAAG,MAAMP,eAAe;gBACjCO;gBACAiB,cAAc,IAAI,CAACA,YAAY;gBAC/BC,QAAQ,IAAI,CAACA,MAAM;gBACnBP;YACF,EAAC;QACH,EAAE,OAAOQ,OAAO;YACd,IAAIA,iBAAiB7B,UAAU,MAAM6B;YACrC,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAChEtB,MAAM,CAAC,2BAA2B,EAAEuB,SAAS,EAAED;YAC/C,IAAI,CAACA,KAAK,CAACC,SAAS;gBAACG,MAAM;YAAC;QAC9B;QAEA,IAAI;YACF,MAAMC,WAAW,MAAM7B,sBAAsBgB,WAAWX;YAExD,IAAI,CAACyB,GAAG,CAAC,CAAC,YAAY,EAAEzB,SAAS;YACjC,IAAI,CAACyB,GAAG,CAAC,CAAC,YAAY,EAAED,SAASE,OAAO,GAAG,YAAY,YAAY;YACnE,IAAIF,SAASG,UAAU,EAAE;gBACvB,IAAI,CAACF,GAAG,CAAC,CAAC,YAAY,EAAED,SAASG,UAAU,EAAE;YAC/C;YACA,IAAI,CAACF,GAAG,CAAC,CAAC,YAAY,EAAED,SAASI,MAAM,EAAE;QAC3C,EAAE,OAAOT,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAChEtB,MAAM,CAAC,mCAAmC,EAAEuB,SAAS,EAAED;YACvD,IAAI,CAACA,KAAK,CAAC,CAAC,mCAAmC,EAAEC,SAAS,EAAE;gBAACG,MAAM;YAAC;QACtE;IACF;AACF"}
1
+ {"version":3,"sources":["../../../../src/commands/datasets/embeddings/status.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {CLIError} from '@oclif/core/errors'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {resolveDataset} from '../../../actions/dataset/resolveDataset.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {getEmbeddingsSettings} from '../../../services/embeddings.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst debug = subdebug('dataset:embeddings:status')\n\nexport class DatasetEmbeddingsStatusCommand extends SanityCommand<\n typeof DatasetEmbeddingsStatusCommand\n> {\n static override args = {\n dataset: Args.string({\n description: 'The name of the dataset to check embeddings status for',\n required: false,\n }),\n }\n\n static override description = 'Show embeddings settings and status for a dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> production',\n description: 'Show embeddings status for the production dataset',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to check embeddings status for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:embeddings:status']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(DatasetEmbeddingsStatusCommand)\n let {dataset} = args\n\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.datasets'}],\n }),\n })\n\n try {\n ;({dataset} = await resolveDataset({\n dataset,\n isUnattended: this.isUnattended(),\n output: this.output,\n projectId,\n }))\n } catch (error) {\n if (error instanceof CLIError) throw error\n const message = error instanceof Error ? error.message : String(error)\n debug(`Failed to resolve dataset: ${message}`, error)\n this.error(message, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n try {\n const settings = await getEmbeddingsSettings(projectId, dataset)\n\n this.log(`Dataset: ${dataset}`)\n this.log(`Embeddings: ${settings.enabled ? 'enabled' : 'disabled'}`)\n if (settings.projection) {\n this.log(`Projection: ${settings.projection}`)\n }\n this.log(`Status: ${settings.status}`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n debug(`Failed to get embeddings settings: ${message}`, error)\n this.error(`Failed to get embeddings settings: ${message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n}\n"],"names":["Args","CLIError","exitCodes","SanityCommand","subdebug","resolveDataset","promptForProject","getEmbeddingsSettings","getProjectIdFlag","debug","DatasetEmbeddingsStatusCommand","args","dataset","string","description","required","examples","command","flags","semantics","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","isUnattended","output","error","message","Error","String","exit","RUNTIME_ERROR","settings","log","enabled","projection","status"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,QAAQ,QAAO,qBAAoB;AAC3C,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAEnE,SAAQC,cAAc,QAAO,6CAA4C;AACzE,SAAQC,gBAAgB,QAAO,uCAAsC;AACrE,SAAQC,qBAAqB,QAAO,kCAAiC;AACrE,SAAQC,gBAAgB,QAAO,+BAA8B;AAE7D,MAAMC,QAAQL,SAAS;AAEvB,OAAO,MAAMM,uCAAuCP;IAGlD,OAAgBQ,OAAO;QACrBC,SAASZ,KAAKa,MAAM,CAAC;YACnBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,oDAAmD;IAEjF,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtB,GAAGV,iBAAiB;YAClBM,aAAa;YACbK,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAA4B,CAAA;IAEvE,MAAaC,MAAqB;QAChC,MAAM,EAACV,IAAI,EAAC,GAAG,MAAM,IAAI,CAACW,KAAK,CAACZ;QAChC,IAAI,EAACE,OAAO,EAAC,GAAGD;QAEhB,MAAMY,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRnB,iBAAiB;oBACfoB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,IAAI;;YACA,CAAA,EAAChB,OAAO,EAAC,GAAG,MAAMP,eAAe;gBACjCO;gBACAiB,cAAc,IAAI,CAACA,YAAY;gBAC/BC,QAAQ,IAAI,CAACA,MAAM;gBACnBP;YACF,EAAC;QACH,EAAE,OAAOQ,OAAO;YACd,IAAIA,iBAAiB9B,UAAU,MAAM8B;YACrC,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAChEtB,MAAM,CAAC,2BAA2B,EAAEuB,SAAS,EAAED;YAC/C,IAAI,CAACA,KAAK,CAACC,SAAS;gBAACG,MAAMjC,UAAUkC,aAAa;YAAA;QACpD;QAEA,IAAI;YACF,MAAMC,WAAW,MAAM9B,sBAAsBgB,WAAWX;YAExD,IAAI,CAAC0B,GAAG,CAAC,CAAC,YAAY,EAAE1B,SAAS;YACjC,IAAI,CAAC0B,GAAG,CAAC,CAAC,YAAY,EAAED,SAASE,OAAO,GAAG,YAAY,YAAY;YACnE,IAAIF,SAASG,UAAU,EAAE;gBACvB,IAAI,CAACF,GAAG,CAAC,CAAC,YAAY,EAAED,SAASG,UAAU,EAAE;YAC/C;YACA,IAAI,CAACF,GAAG,CAAC,CAAC,YAAY,EAAED,SAASI,MAAM,EAAE;QAC3C,EAAE,OAAOV,OAAO;YACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;YAChEtB,MAAM,CAAC,mCAAmC,EAAEuB,SAAS,EAAED;YACvD,IAAI,CAACA,KAAK,CAAC,CAAC,mCAAmC,EAAEC,SAAS,EAAE;gBAACG,MAAMjC,UAAUkC,aAAa;YAAA;QAC5F;IACF;AACF"}
@@ -120,7 +120,7 @@ export class DatasetExportCommand extends SanityCommand {
120
120
  } catch (error) {
121
121
  exportDebug('Error listing datasets', error);
122
122
  this.error(`Failed to list datasets:\n${error instanceof Error ? error.message : error}`, {
123
- exit: 1
123
+ exit: exitCodes.RUNTIME_ERROR
124
124
  });
125
125
  }
126
126
  // Determine dataset name
@@ -168,7 +168,7 @@ export class DatasetExportCommand extends SanityCommand {
168
168
  // Verify existence of dataset before trying to export from it
169
169
  if (!datasets.some((set)=>set.name === dataset)) {
170
170
  this.error(`Dataset with name "${dataset}" not found`, {
171
- exit: 1
171
+ exit: exitCodes.RUNTIME_ERROR
172
172
  });
173
173
  }
174
174
  this.log(boxen(`Exporting from:
@@ -187,7 +187,7 @@ dataset: ${dataset.padEnd(46)}`, {
187
187
  const outputPath = await this.getOutputPath(destinationPath, dataset, flags);
188
188
  if (!outputPath) {
189
189
  this.error('Cancelled', {
190
- exit: 1
190
+ exit: exitCodes.RUNTIME_ERROR
191
191
  });
192
192
  }
193
193
  // Prepare export options
@@ -216,7 +216,7 @@ dataset: ${dataset.padEnd(46)}`, {
216
216
  const err = error instanceof Error ? error : new Error(String(error));
217
217
  exportDebug('Export failed', err);
218
218
  this.error(`Export failed: ${err.message}`, {
219
- exit: 1
219
+ exit: exitCodes.RUNTIME_ERROR
220
220
  });
221
221
  }
222
222
  }
@@ -265,11 +265,11 @@ dataset: ${dataset.padEnd(46)}`, {
265
265
  const errorWithCode = err;
266
266
  if (errorWithCode.code === 'EACCES') {
267
267
  this.error(`Permission denied: Cannot create directory "${createPath}". Please check write permissions.`, {
268
- exit: 1
268
+ exit: exitCodes.RUNTIME_ERROR
269
269
  });
270
270
  } else {
271
271
  this.error(`Failed to create directory "${createPath}": ${err.message}`, {
272
- exit: 1
272
+ exit: exitCodes.RUNTIME_ERROR
273
273
  });
274
274
  }
275
275
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/commands/datasets/export.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport {type Writable} from 'node:stream'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {boxen, input, spinner} from '@sanity/cli-core/ux'\nimport {type DatasetsResponse} from '@sanity/client'\nimport {exportDataset, type ExportOptions, type ExportProgress} from '@sanity/export'\nimport prettyMs from 'pretty-ms'\n\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {promptForDataset} from '../../prompts/promptForDataset.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {absolutify} from '../../util/absolutify.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst noop = () => null\nconst exportDebug = subdebug('dataset:export')\n\nexport class DatasetExportCommand extends SanityCommand<typeof DatasetExportCommand> {\n static override args = {\n name: Args.string({\n description: 'Name of the dataset to export',\n }),\n // Args are order dependent\n // eslint-disable-next-line perfectionist/sort-objects\n destination: Args.string({\n description: 'Output destination file path',\n }),\n }\n\n static override description =\n 'Export a dataset to a local gzipped tarball. Assets returning 401, 403, or 404 are excluded from the export.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> moviedb localPath.tar.gz',\n description: 'Export dataset \"moviedb\" to localPath.tar.gz',\n },\n {\n command: '<%= config.bin %> <%= command.id %> moviedb assetless.tar.gz --no-assets',\n description: 'Export dataset without assets',\n },\n {\n command: '<%= config.bin %> <%= command.id %> staging staging.tar.gz --raw',\n description: 'Export raw documents without asset reference rewriting',\n },\n {\n command: '<%= config.bin %> <%= command.id %> staging staging.tar.gz --types products,shops',\n description: 'Export specific document types',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> moviedb moviedb.tar.gz --no-strict-asset-verification',\n description: 'Export dataset without aborting on asset verification failures',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to export dataset from',\n semantics: 'override',\n }),\n 'asset-concurrency': Flags.integer({\n default: 8,\n description: 'Concurrent number of asset downloads',\n }),\n mode: Flags.string({\n default: 'stream',\n description:\n \"Export mode ('cursor' is faster for large datasets but may miss concurrent changes)\",\n options: ['stream', 'cursor'],\n }),\n 'no-assets': Flags.boolean({\n default: false,\n description: 'Export only non-asset documents and remove references to image assets',\n }),\n 'no-compress': Flags.boolean({\n default: false,\n description: 'Skips compressing tarball entries (still generates a gzip file)',\n }),\n 'no-drafts': Flags.boolean({\n default: false,\n description: 'Export only published versions of documents',\n }),\n 'no-strict-asset-verification': Flags.boolean({\n default: false,\n description:\n 'Do not abort the export when an asset fails hash or content-length verification',\n }),\n overwrite: Flags.boolean({\n default: false,\n description: 'Overwrite any file with the same name',\n }),\n raw: Flags.boolean({\n default: false,\n description: 'Extract only documents, without rewriting asset references',\n }),\n types: Flags.string({\n description: 'Defines which document types to export (comma-separated)',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:export']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DatasetExportCommand)\n const {destination: targetDestination, name: targetDataset} = args\n\n // Get project configuration\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.datasets'}],\n }),\n })\n\n const projectClient = await getProjectCliClient({\n apiVersion: '2023-05-26',\n projectId,\n requireUser: true,\n })\n\n let datasets: DatasetsResponse\n\n try {\n datasets = await listDatasets(projectId)\n } catch (error) {\n exportDebug('Error listing datasets', error)\n this.error(`Failed to list datasets:\\n${error instanceof Error ? error.message : error}`, {\n exit: 1,\n })\n }\n\n // Determine dataset name\n let dataset = targetDataset\n if (!dataset) {\n let defaultDataset: string | undefined\n try {\n // Get default dataset from config (only available when running from a project directory)\n const cliConfig = await this.tryGetCliConfig()\n defaultDataset = cliConfig.api?.dataset\n } catch (error) {\n exportDebug('Error selecting dataset', error)\n this.error(`Failed to select dataset:\\n${error instanceof Error ? error.message : error}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n if (defaultDataset) {\n dataset = defaultDataset\n this.log(`Using default dataset: ${dataset}`)\n } else if (this.isUnattended()) {\n this.error('Dataset name is required. Pass it as the `<name>` argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n } else {\n try {\n dataset = await promptForDataset({allowCreation: false, datasets})\n } catch (error) {\n exportDebug('Error selecting dataset', error)\n this.error(\n `Failed to select dataset:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: exitCodes.RUNTIME_ERROR,\n },\n )\n }\n }\n }\n\n // Validate dataset name\n const dsError = validateDatasetName(dataset)\n if (dsError) {\n this.error(dsError, {exit: exitCodes.USAGE_ERROR})\n }\n\n // Verify existence of dataset before trying to export from it\n if (!datasets.some((set) => set.name === dataset)) {\n this.error(`Dataset with name \"${dataset}\" not found`, {exit: 1})\n }\n\n this.log(\n boxen(\n `Exporting from:\nprojectId: ${projectId.padEnd(44)}\ndataset: ${dataset.padEnd(46)}`,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n // Determine output path\n let destinationPath = targetDestination\n if (!destinationPath) {\n destinationPath = this.isUnattended()\n ? path.join(process.cwd(), `${dataset}.tar.gz`)\n : await this.promptForDestination({dataset})\n }\n\n const outputPath = await this.getOutputPath(destinationPath, dataset, flags)\n if (!outputPath) {\n this.error('Cancelled', {exit: 1})\n }\n\n // Prepare export options\n const {fail, onProgress, succeed} = this.createProgressHandler()\n const exportOptions: ExportOptions = {\n assetConcurrency: flags['asset-concurrency'],\n assets: !flags['no-assets'],\n client: projectClient,\n compress: !flags['no-compress'],\n dataset,\n drafts: !flags['no-drafts'],\n mode: flags.mode === 'cursor' || flags.mode === 'stream' ? flags.mode : undefined,\n onProgress,\n outputPath,\n raw: flags.raw,\n strictAssetVerification: !flags['no-strict-asset-verification'],\n types: flags.types ? flags.types.split(',') : undefined,\n }\n\n const start = Date.now()\n try {\n await exportDataset(exportOptions)\n succeed()\n this.log(`Export finished (${prettyMs(Date.now() - start)})`)\n } catch (error) {\n fail()\n const err = error instanceof Error ? error : new Error(String(error))\n exportDebug('Export failed', err)\n this.error(`Export failed: ${err.message}`, {exit: 1})\n }\n }\n\n private createProgressHandler() {\n let currentSpinner: ReturnType<typeof spinner> | null = null\n let currentStep = ''\n\n const onProgress = (progress: ExportProgress) => {\n if (progress.step !== currentStep) {\n // Complete previous step\n succeed()\n\n // Start new step\n currentStep = progress.step\n currentSpinner = spinner(progress.step).start()\n } else if (progress.step === currentStep && progress.update && currentSpinner) {\n // Update current step with progress info\n currentSpinner.text = `${progress.step} (${progress.current}/${progress.total})`\n }\n }\n\n const succeed = () => {\n currentSpinner?.succeed()\n }\n\n const fail = () => {\n currentSpinner?.fail()\n }\n\n return {fail, onProgress, succeed}\n }\n\n private async getOutputPath(\n destination: string,\n dataset: string,\n flags: {overwrite?: boolean},\n ): Promise<string | Writable> {\n if (destination === '-') {\n return process.stdout\n }\n\n const dstPath = path.isAbsolute(destination)\n ? destination\n : path.resolve(process.cwd(), destination)\n\n const dstStats = await fs.stat(dstPath).catch(noop)\n const looksLikeFile = dstStats ? dstStats.isFile() : path.basename(dstPath).includes('.')\n\n if (!dstStats) {\n const createPath = looksLikeFile ? path.dirname(dstPath) : dstPath\n try {\n await fs.mkdir(createPath, {recursive: true})\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n const errorWithCode = err as Error & {code?: string}\n if (errorWithCode.code === 'EACCES') {\n this.error(\n `Permission denied: Cannot create directory \"${createPath}\". Please check write permissions.`,\n {\n exit: 1,\n },\n )\n } else {\n this.error(`Failed to create directory \"${createPath}\": ${err.message}`, {\n exit: 1,\n })\n }\n }\n }\n\n const finalPath = looksLikeFile ? dstPath : path.join(dstPath, `${dataset}.tar.gz`)\n const finalPathStats = await fs.stat(finalPath).catch(noop)\n\n if (!flags.overwrite && finalPathStats && finalPathStats.isFile()) {\n this.error(`File \"${finalPath}\" already exists. Pass \\`--overwrite\\` to replace it.`, {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n return finalPath\n }\n\n private promptForDestination(options: {dataset: string; workDir?: string}): Promise<string> {\n const {dataset, workDir = process.cwd()} = options\n\n const defaultPath = path.join(workDir, `${dataset}.tar.gz`)\n\n return input({\n default: defaultPath,\n message: 'Output path:',\n transformer: (value: string) => absolutify(value.trim()),\n validate: (value: string) => {\n const trimmed = value.trim()\n if (!trimmed) {\n return 'Please provide a valid output path'\n }\n return true\n },\n })\n }\n}\n"],"names":["fs","path","Args","Flags","exitCodes","getProjectCliClient","SanityCommand","subdebug","boxen","input","spinner","exportDataset","prettyMs","validateDatasetName","promptForDataset","promptForProject","listDatasets","absolutify","getProjectIdFlag","noop","exportDebug","DatasetExportCommand","args","name","string","description","destination","examples","command","flags","semantics","integer","default","mode","options","boolean","overwrite","raw","types","hiddenAliases","run","parse","targetDestination","targetDataset","projectId","getProjectId","fallback","requiredPermissions","grant","permission","projectClient","apiVersion","requireUser","datasets","error","Error","message","exit","dataset","defaultDataset","cliConfig","tryGetCliConfig","api","RUNTIME_ERROR","log","isUnattended","USAGE_ERROR","allowCreation","dsError","some","set","padEnd","borderColor","borderStyle","destinationPath","join","process","cwd","promptForDestination","outputPath","getOutputPath","fail","onProgress","succeed","createProgressHandler","exportOptions","assetConcurrency","assets","client","compress","drafts","undefined","strictAssetVerification","split","start","Date","now","err","String","currentSpinner","currentStep","progress","step","update","text","current","total","stdout","dstPath","isAbsolute","resolve","dstStats","stat","catch","looksLikeFile","isFile","basename","includes","createPath","dirname","mkdir","recursive","errorWithCode","code","finalPath","finalPathStats","workDir","defaultPath","transformer","value","trim","validate","trimmed"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/commands/datasets/export.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport {type Writable} from 'node:stream'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {boxen, input, spinner} from '@sanity/cli-core/ux'\nimport {type DatasetsResponse} from '@sanity/client'\nimport {exportDataset, type ExportOptions, type ExportProgress} from '@sanity/export'\nimport prettyMs from 'pretty-ms'\n\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {promptForDataset} from '../../prompts/promptForDataset.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listDatasets} from '../../services/datasets.js'\nimport {absolutify} from '../../util/absolutify.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst noop = () => null\nconst exportDebug = subdebug('dataset:export')\n\nexport class DatasetExportCommand extends SanityCommand<typeof DatasetExportCommand> {\n static override args = {\n name: Args.string({\n description: 'Name of the dataset to export',\n }),\n // Args are order dependent\n // eslint-disable-next-line perfectionist/sort-objects\n destination: Args.string({\n description: 'Output destination file path',\n }),\n }\n\n static override description =\n 'Export a dataset to a local gzipped tarball. Assets returning 401, 403, or 404 are excluded from the export.'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> moviedb localPath.tar.gz',\n description: 'Export dataset \"moviedb\" to localPath.tar.gz',\n },\n {\n command: '<%= config.bin %> <%= command.id %> moviedb assetless.tar.gz --no-assets',\n description: 'Export dataset without assets',\n },\n {\n command: '<%= config.bin %> <%= command.id %> staging staging.tar.gz --raw',\n description: 'Export raw documents without asset reference rewriting',\n },\n {\n command: '<%= config.bin %> <%= command.id %> staging staging.tar.gz --types products,shops',\n description: 'Export specific document types',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> moviedb moviedb.tar.gz --no-strict-asset-verification',\n description: 'Export dataset without aborting on asset verification failures',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to export dataset from',\n semantics: 'override',\n }),\n 'asset-concurrency': Flags.integer({\n default: 8,\n description: 'Concurrent number of asset downloads',\n }),\n mode: Flags.string({\n default: 'stream',\n description:\n \"Export mode ('cursor' is faster for large datasets but may miss concurrent changes)\",\n options: ['stream', 'cursor'],\n }),\n 'no-assets': Flags.boolean({\n default: false,\n description: 'Export only non-asset documents and remove references to image assets',\n }),\n 'no-compress': Flags.boolean({\n default: false,\n description: 'Skips compressing tarball entries (still generates a gzip file)',\n }),\n 'no-drafts': Flags.boolean({\n default: false,\n description: 'Export only published versions of documents',\n }),\n 'no-strict-asset-verification': Flags.boolean({\n default: false,\n description:\n 'Do not abort the export when an asset fails hash or content-length verification',\n }),\n overwrite: Flags.boolean({\n default: false,\n description: 'Overwrite any file with the same name',\n }),\n raw: Flags.boolean({\n default: false,\n description: 'Extract only documents, without rewriting asset references',\n }),\n types: Flags.string({\n description: 'Defines which document types to export (comma-separated)',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:export']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DatasetExportCommand)\n const {destination: targetDestination, name: targetDataset} = args\n\n // Get project configuration\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.datasets'}],\n }),\n })\n\n const projectClient = await getProjectCliClient({\n apiVersion: '2023-05-26',\n projectId,\n requireUser: true,\n })\n\n let datasets: DatasetsResponse\n\n try {\n datasets = await listDatasets(projectId)\n } catch (error) {\n exportDebug('Error listing datasets', error)\n this.error(`Failed to list datasets:\\n${error instanceof Error ? error.message : error}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n // Determine dataset name\n let dataset = targetDataset\n if (!dataset) {\n let defaultDataset: string | undefined\n try {\n // Get default dataset from config (only available when running from a project directory)\n const cliConfig = await this.tryGetCliConfig()\n defaultDataset = cliConfig.api?.dataset\n } catch (error) {\n exportDebug('Error selecting dataset', error)\n this.error(`Failed to select dataset:\\n${error instanceof Error ? error.message : error}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n if (defaultDataset) {\n dataset = defaultDataset\n this.log(`Using default dataset: ${dataset}`)\n } else if (this.isUnattended()) {\n this.error('Dataset name is required. Pass it as the `<name>` argument.', {\n exit: exitCodes.USAGE_ERROR,\n })\n } else {\n try {\n dataset = await promptForDataset({allowCreation: false, datasets})\n } catch (error) {\n exportDebug('Error selecting dataset', error)\n this.error(\n `Failed to select dataset:\\n${error instanceof Error ? error.message : error}`,\n {\n exit: exitCodes.RUNTIME_ERROR,\n },\n )\n }\n }\n }\n\n // Validate dataset name\n const dsError = validateDatasetName(dataset)\n if (dsError) {\n this.error(dsError, {exit: exitCodes.USAGE_ERROR})\n }\n\n // Verify existence of dataset before trying to export from it\n if (!datasets.some((set) => set.name === dataset)) {\n this.error(`Dataset with name \"${dataset}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n this.log(\n boxen(\n `Exporting from:\nprojectId: ${projectId.padEnd(44)}\ndataset: ${dataset.padEnd(46)}`,\n {\n borderColor: 'yellow',\n borderStyle: 'round',\n },\n ),\n )\n\n // Determine output path\n let destinationPath = targetDestination\n if (!destinationPath) {\n destinationPath = this.isUnattended()\n ? path.join(process.cwd(), `${dataset}.tar.gz`)\n : await this.promptForDestination({dataset})\n }\n\n const outputPath = await this.getOutputPath(destinationPath, dataset, flags)\n if (!outputPath) {\n this.error('Cancelled', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n // Prepare export options\n const {fail, onProgress, succeed} = this.createProgressHandler()\n const exportOptions: ExportOptions = {\n assetConcurrency: flags['asset-concurrency'],\n assets: !flags['no-assets'],\n client: projectClient,\n compress: !flags['no-compress'],\n dataset,\n drafts: !flags['no-drafts'],\n mode: flags.mode === 'cursor' || flags.mode === 'stream' ? flags.mode : undefined,\n onProgress,\n outputPath,\n raw: flags.raw,\n strictAssetVerification: !flags['no-strict-asset-verification'],\n types: flags.types ? flags.types.split(',') : undefined,\n }\n\n const start = Date.now()\n try {\n await exportDataset(exportOptions)\n succeed()\n this.log(`Export finished (${prettyMs(Date.now() - start)})`)\n } catch (error) {\n fail()\n const err = error instanceof Error ? error : new Error(String(error))\n exportDebug('Export failed', err)\n this.error(`Export failed: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n private createProgressHandler() {\n let currentSpinner: ReturnType<typeof spinner> | null = null\n let currentStep = ''\n\n const onProgress = (progress: ExportProgress) => {\n if (progress.step !== currentStep) {\n // Complete previous step\n succeed()\n\n // Start new step\n currentStep = progress.step\n currentSpinner = spinner(progress.step).start()\n } else if (progress.step === currentStep && progress.update && currentSpinner) {\n // Update current step with progress info\n currentSpinner.text = `${progress.step} (${progress.current}/${progress.total})`\n }\n }\n\n const succeed = () => {\n currentSpinner?.succeed()\n }\n\n const fail = () => {\n currentSpinner?.fail()\n }\n\n return {fail, onProgress, succeed}\n }\n\n private async getOutputPath(\n destination: string,\n dataset: string,\n flags: {overwrite?: boolean},\n ): Promise<string | Writable> {\n if (destination === '-') {\n return process.stdout\n }\n\n const dstPath = path.isAbsolute(destination)\n ? destination\n : path.resolve(process.cwd(), destination)\n\n const dstStats = await fs.stat(dstPath).catch(noop)\n const looksLikeFile = dstStats ? dstStats.isFile() : path.basename(dstPath).includes('.')\n\n if (!dstStats) {\n const createPath = looksLikeFile ? path.dirname(dstPath) : dstPath\n try {\n await fs.mkdir(createPath, {recursive: true})\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error))\n const errorWithCode = err as Error & {code?: string}\n if (errorWithCode.code === 'EACCES') {\n this.error(\n `Permission denied: Cannot create directory \"${createPath}\". Please check write permissions.`,\n {\n exit: exitCodes.RUNTIME_ERROR,\n },\n )\n } else {\n this.error(`Failed to create directory \"${createPath}\": ${err.message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n }\n\n const finalPath = looksLikeFile ? dstPath : path.join(dstPath, `${dataset}.tar.gz`)\n const finalPathStats = await fs.stat(finalPath).catch(noop)\n\n if (!flags.overwrite && finalPathStats && finalPathStats.isFile()) {\n this.error(`File \"${finalPath}\" already exists. Pass \\`--overwrite\\` to replace it.`, {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n return finalPath\n }\n\n private promptForDestination(options: {dataset: string; workDir?: string}): Promise<string> {\n const {dataset, workDir = process.cwd()} = options\n\n const defaultPath = path.join(workDir, `${dataset}.tar.gz`)\n\n return input({\n default: defaultPath,\n message: 'Output path:',\n transformer: (value: string) => absolutify(value.trim()),\n validate: (value: string) => {\n const trimmed = value.trim()\n if (!trimmed) {\n return 'Please provide a valid output path'\n }\n return true\n },\n })\n }\n}\n"],"names":["fs","path","Args","Flags","exitCodes","getProjectCliClient","SanityCommand","subdebug","boxen","input","spinner","exportDataset","prettyMs","validateDatasetName","promptForDataset","promptForProject","listDatasets","absolutify","getProjectIdFlag","noop","exportDebug","DatasetExportCommand","args","name","string","description","destination","examples","command","flags","semantics","integer","default","mode","options","boolean","overwrite","raw","types","hiddenAliases","run","parse","targetDestination","targetDataset","projectId","getProjectId","fallback","requiredPermissions","grant","permission","projectClient","apiVersion","requireUser","datasets","error","Error","message","exit","RUNTIME_ERROR","dataset","defaultDataset","cliConfig","tryGetCliConfig","api","log","isUnattended","USAGE_ERROR","allowCreation","dsError","some","set","padEnd","borderColor","borderStyle","destinationPath","join","process","cwd","promptForDestination","outputPath","getOutputPath","fail","onProgress","succeed","createProgressHandler","exportOptions","assetConcurrency","assets","client","compress","drafts","undefined","strictAssetVerification","split","start","Date","now","err","String","currentSpinner","currentStep","progress","step","update","text","current","total","stdout","dstPath","isAbsolute","resolve","dstStats","stat","catch","looksLikeFile","isFile","basename","includes","createPath","dirname","mkdir","recursive","errorWithCode","code","finalPath","finalPathStats","workDir","defaultPath","transformer","value","trim","validate","trimmed"],"mappings":"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"}
@@ -193,7 +193,7 @@ export class ImportDatasetCommand extends SanityCommand {
193
193
  const message = error instanceof Error ? error.message : String(error);
194
194
  importDebug(`Failed to create dataset ${newDatasetName}: ${message}`, error);
195
195
  return this.output.error(`Failed to create dataset ${newDatasetName}: ${message}`, {
196
- exit: 1
196
+ exit: exitCodes.RUNTIME_ERROR
197
197
  });
198
198
  }
199
199
  }
@@ -262,9 +262,9 @@ export class ImportDatasetCommand extends SanityCommand {
262
262
  this.currentProgress.fail();
263
263
  }
264
264
  return err.name === 'ReplacementCharError' ? this.output.error(`Import failed due to unicode replacement characters in the data.\n${err.message}\n\nIf you are certain you want to proceed with the import despite potentially corrupt data, re-run the import with the \`--allow-replacement-characters\` flag set.`, {
265
- exit: 1
265
+ exit: exitCodes.RUNTIME_ERROR
266
266
  }) : this.output.error(err.stack || err.message, {
267
- exit: 1
267
+ exit: exitCodes.RUNTIME_ERROR
268
268
  });
269
269
  }
270
270
  }