@sanity/cli 7.12.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.
- package/dist/actions/build/buildApp.js +1 -1
- package/dist/actions/build/buildApp.js.map +1 -1
- package/dist/actions/build/buildStudio.js +1 -1
- package/dist/actions/build/buildStudio.js.map +1 -1
- package/dist/commands/backups/disable.js +4 -4
- package/dist/commands/backups/disable.js.map +1 -1
- package/dist/commands/backups/download.js +7 -7
- package/dist/commands/backups/download.js.map +1 -1
- package/dist/commands/backups/enable.js +4 -4
- package/dist/commands/backups/enable.js.map +1 -1
- package/dist/commands/backups/list.js +7 -7
- package/dist/commands/backups/list.js.map +1 -1
- package/dist/commands/codemod.js +5 -5
- package/dist/commands/codemod.js.map +1 -1
- package/dist/commands/cors/add.js +1 -1
- package/dist/commands/cors/add.js.map +1 -1
- package/dist/commands/cors/delete.js +4 -4
- package/dist/commands/cors/delete.js.map +1 -1
- package/dist/commands/cors/list.js +2 -2
- package/dist/commands/cors/list.js.map +1 -1
- package/dist/commands/datasets/alias/create.js +5 -5
- package/dist/commands/datasets/alias/create.js.map +1 -1
- package/dist/commands/datasets/alias/delete.js +2 -2
- package/dist/commands/datasets/alias/delete.js.map +1 -1
- package/dist/commands/datasets/alias/link.js +5 -5
- package/dist/commands/datasets/alias/link.js.map +1 -1
- package/dist/commands/datasets/alias/unlink.js +3 -3
- package/dist/commands/datasets/alias/unlink.js.map +1 -1
- package/dist/commands/datasets/copy.js +7 -7
- package/dist/commands/datasets/copy.js.map +1 -1
- package/dist/commands/datasets/create.js +3 -3
- package/dist/commands/datasets/create.js.map +1 -1
- package/dist/commands/datasets/delete.js +2 -2
- package/dist/commands/datasets/delete.js.map +1 -1
- package/dist/commands/datasets/embeddings/disable.js +3 -3
- package/dist/commands/datasets/embeddings/disable.js.map +1 -1
- package/dist/commands/datasets/embeddings/enable.js +5 -5
- package/dist/commands/datasets/embeddings/enable.js.map +1 -1
- package/dist/commands/datasets/embeddings/status.js +3 -3
- package/dist/commands/datasets/embeddings/status.js.map +1 -1
- package/dist/commands/datasets/export.js +6 -6
- package/dist/commands/datasets/export.js.map +1 -1
- package/dist/commands/datasets/import.js +3 -3
- package/dist/commands/datasets/import.js.map +1 -1
- package/dist/commands/datasets/list.js +2 -2
- package/dist/commands/datasets/list.js.map +1 -1
- package/dist/commands/datasets/visibility/get.js +2 -2
- package/dist/commands/datasets/visibility/get.js.map +1 -1
- package/dist/commands/datasets/visibility/set.js +3 -3
- package/dist/commands/datasets/visibility/set.js.map +1 -1
- package/dist/commands/deploy.js +2 -2
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.js +2 -2
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/docs/read.js +1 -1
- package/dist/commands/docs/read.js.map +1 -1
- package/dist/commands/docs/search.js +3 -3
- package/dist/commands/docs/search.js.map +1 -1
- package/dist/commands/doctor.js +3 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/documents/create.js +3 -3
- package/dist/commands/documents/create.js.map +1 -1
- package/dist/commands/documents/delete.js +3 -3
- package/dist/commands/documents/delete.js.map +1 -1
- package/dist/commands/documents/get.js +2 -2
- package/dist/commands/documents/get.js.map +1 -1
- package/dist/commands/documents/query.js +2 -2
- package/dist/commands/documents/query.js.map +1 -1
- package/dist/commands/documents/validate.js +3 -3
- package/dist/commands/documents/validate.js.map +1 -1
- package/dist/commands/graphql/deploy.js +13 -13
- package/dist/commands/graphql/deploy.js.map +1 -1
- package/dist/commands/graphql/list.js +2 -2
- package/dist/commands/graphql/list.js.map +1 -1
- package/dist/commands/graphql/undeploy.js +2 -2
- package/dist/commands/graphql/undeploy.js.map +1 -1
- package/dist/commands/hooks/attempt.js +2 -2
- package/dist/commands/hooks/attempt.js.map +1 -1
- package/dist/commands/hooks/create.js +3 -3
- package/dist/commands/hooks/create.js.map +1 -1
- package/dist/commands/hooks/delete.js +4 -4
- package/dist/commands/hooks/delete.js.map +1 -1
- package/dist/commands/hooks/list.js +2 -2
- package/dist/commands/hooks/list.js.map +1 -1
- package/dist/commands/hooks/logs.js +5 -5
- package/dist/commands/hooks/logs.js.map +1 -1
- package/dist/commands/login.js +2 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +2 -2
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/manifest/extract.js +3 -3
- package/dist/commands/manifest/extract.js.map +1 -1
- package/dist/commands/mcp/configure.js +4 -4
- package/dist/commands/mcp/configure.js.map +1 -1
- package/dist/commands/media/create-aspect.js +3 -3
- package/dist/commands/media/create-aspect.js.map +1 -1
- package/dist/commands/media/delete-aspect.js +1 -1
- package/dist/commands/media/delete-aspect.js.map +1 -1
- package/dist/commands/media/deploy-aspect.js +4 -4
- package/dist/commands/media/deploy-aspect.js.map +1 -1
- package/dist/commands/media/export.js +7 -7
- package/dist/commands/media/export.js.map +1 -1
- package/dist/commands/media/import.js +6 -6
- package/dist/commands/media/import.js.map +1 -1
- package/dist/commands/migrations/create.js +4 -4
- package/dist/commands/migrations/create.js.map +1 -1
- package/dist/commands/migrations/list.js +2 -2
- package/dist/commands/migrations/list.js.map +1 -1
- package/dist/commands/migrations/run.js +14 -14
- package/dist/commands/migrations/run.js.map +1 -1
- package/dist/commands/openapi/get.js +3 -3
- package/dist/commands/openapi/get.js.map +1 -1
- package/dist/commands/openapi/list.js +2 -2
- package/dist/commands/openapi/list.js.map +1 -1
- package/dist/commands/organizations/create.js +5 -5
- package/dist/commands/organizations/create.js.map +1 -1
- package/dist/commands/organizations/delete.js +6 -6
- package/dist/commands/organizations/delete.js.map +1 -1
- package/dist/commands/organizations/get.js +3 -3
- package/dist/commands/organizations/get.js.map +1 -1
- package/dist/commands/organizations/list.js +2 -2
- package/dist/commands/organizations/list.js.map +1 -1
- package/dist/commands/organizations/update.js +6 -6
- package/dist/commands/organizations/update.js.map +1 -1
- package/dist/commands/preview.js +2 -2
- package/dist/commands/preview.js.map +1 -1
- package/dist/commands/projects/create.js +2 -2
- package/dist/commands/projects/create.js.map +1 -1
- package/dist/commands/projects/list.js +2 -2
- package/dist/commands/projects/list.js.map +1 -1
- package/dist/commands/schemas/delete.js +2 -2
- package/dist/commands/schemas/delete.js.map +1 -1
- package/dist/commands/schemas/deploy.js +2 -2
- package/dist/commands/schemas/deploy.js.map +1 -1
- package/dist/commands/schemas/list.js +1 -1
- package/dist/commands/schemas/list.js.map +1 -1
- package/dist/commands/schemas/validate.js +2 -1
- package/dist/commands/schemas/validate.js.map +1 -1
- package/dist/commands/skills/install.js +2 -2
- package/dist/commands/skills/install.js.map +1 -1
- package/dist/commands/telemetry/disable.js +2 -2
- package/dist/commands/telemetry/disable.js.map +1 -1
- package/dist/commands/telemetry/enable.js +2 -2
- package/dist/commands/telemetry/enable.js.map +1 -1
- package/dist/commands/tokens/create.js +2 -2
- package/dist/commands/tokens/create.js.map +1 -1
- package/dist/commands/tokens/delete.js +2 -2
- package/dist/commands/tokens/delete.js.map +1 -1
- package/dist/commands/tokens/list.js +2 -2
- package/dist/commands/tokens/list.js.map +1 -1
- package/dist/commands/users/invite.js +3 -3
- package/dist/commands/users/invite.js.map +1 -1
- package/oclif.manifest.json +512 -512
- package/package.json +6 -6
|
@@ -263,7 +263,7 @@ export class CopyDatasetCommand extends SanityCommand {
|
|
|
263
263
|
copyDatasetDebug('Attaching to copy job %s', jobId);
|
|
264
264
|
if (jobId.trim() === '') {
|
|
265
265
|
return this.output.error('Please supply a valid jobId', {
|
|
266
|
-
exit:
|
|
266
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
267
267
|
});
|
|
268
268
|
}
|
|
269
269
|
try {
|
|
@@ -273,7 +273,7 @@ export class CopyDatasetCommand extends SanityCommand {
|
|
|
273
273
|
const message = error instanceof Error ? error.message : String(error);
|
|
274
274
|
copyDatasetDebug('Failed to attach to copy job: %s', message, error);
|
|
275
275
|
return this.output.error(`Failed to attach to copy job: ${message}`, {
|
|
276
|
-
exit:
|
|
276
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
277
277
|
});
|
|
278
278
|
}
|
|
279
279
|
}
|
|
@@ -298,7 +298,7 @@ export class CopyDatasetCommand extends SanityCommand {
|
|
|
298
298
|
const message = error instanceof Error ? error.message : String(error);
|
|
299
299
|
copyDatasetDebug('Failed to fetch datasets: %s', message, error);
|
|
300
300
|
return this.output.error(`Failed to fetch datasets: ${message}`, {
|
|
301
|
-
exit:
|
|
301
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
302
302
|
});
|
|
303
303
|
}
|
|
304
304
|
const datasetNames = new Set(datasetsResponse.map((ds)=>ds.name));
|
|
@@ -310,7 +310,7 @@ export class CopyDatasetCommand extends SanityCommand {
|
|
|
310
310
|
}
|
|
311
311
|
if (!datasetNames.has(sourceDataset)) {
|
|
312
312
|
return this.output.error(`Source dataset "${sourceDataset}" doesn't exist`, {
|
|
313
|
-
exit:
|
|
313
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
314
314
|
});
|
|
315
315
|
}
|
|
316
316
|
// Get and validate target dataset
|
|
@@ -329,7 +329,7 @@ export class CopyDatasetCommand extends SanityCommand {
|
|
|
329
329
|
}
|
|
330
330
|
if (datasetNames.has(targetDataset)) {
|
|
331
331
|
return this.output.error(`Target dataset "${targetDataset}" already exists`, {
|
|
332
|
-
exit:
|
|
332
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
333
333
|
});
|
|
334
334
|
}
|
|
335
335
|
// Start the copy job
|
|
@@ -355,7 +355,7 @@ export class CopyDatasetCommand extends SanityCommand {
|
|
|
355
355
|
const message = error instanceof Error ? error.message : String(error);
|
|
356
356
|
copyDatasetDebug('Dataset copying failed: %s', message, error);
|
|
357
357
|
return this.output.error(`Dataset copying failed: ${message}`, {
|
|
358
|
-
exit:
|
|
358
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
359
359
|
});
|
|
360
360
|
}
|
|
361
361
|
}
|
|
@@ -376,7 +376,7 @@ export class CopyDatasetCommand extends SanityCommand {
|
|
|
376
376
|
const message = error instanceof Error ? error.message : String(error);
|
|
377
377
|
copyDatasetDebug('Failed to list dataset copy jobs: %s', message, error);
|
|
378
378
|
return this.output.error(`Failed to list dataset copy jobs: ${message}`, {
|
|
379
|
-
exit:
|
|
379
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
380
380
|
});
|
|
381
381
|
}
|
|
382
382
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/datasets/copy.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exit} from '@oclif/core/errors'\nimport {exitCodes} from '@sanity/cli-core'\nimport {subdebug} from '@sanity/cli-core/debug'\nimport {SanityCommand} from '@sanity/cli-core/SanityCommand'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {Table} from 'console-table-printer'\nimport {formatDistance} from 'date-fns/formatDistance'\nimport {formatDistanceToNow} from 'date-fns/formatDistanceToNow'\nimport {parseISO} from 'date-fns/parseISO'\n\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {promptForDataset} from '../../prompts/promptForDataset.js'\nimport {promptForDatasetName} from '../../prompts/promptForDatasetName.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n copyDataset,\n type CopyJobProgressEvent,\n type DatasetCopyJob,\n followCopyJobProgress,\n listDatasetCopyJobs,\n listDatasets,\n} from '../../services/datasets.js'\nimport {formatCliErrorMessages} from '../../util/formatCliErrorMessages.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst copyDatasetDebug = subdebug('dataset:copy')\n\nexport class CopyDatasetCommand extends SanityCommand<typeof CopyDatasetCommand> {\n static override args = {\n source: Args.string({\n description: 'Name of the dataset to copy from',\n required: false,\n }),\n target: Args.string({\n description: 'Name of the dataset to copy to',\n required: false,\n }),\n }\n\n static override description = 'Copy a dataset or manage copy jobs'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively copy a dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> source-dataset',\n description: 'Copy from source-dataset (prompts for target)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> source-dataset target-dataset',\n description: 'Copy from source-dataset to target-dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --skip-history source target',\n description: 'Copy without preserving document history (faster for large datasets)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --skip-content-releases source target',\n description: 'Copy without content release documents',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --detach source target',\n description: 'Start copy job without waiting for completion',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --attach <job-id>',\n description: 'Attach to a running copy job to follow progress',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --list',\n description: 'List all dataset copy jobs',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --list --offset 2 --limit 10',\n description: 'List copy jobs with pagination',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to copy dataset in',\n semantics: 'override',\n }),\n attach: Flags.string({\n description: 'Attach to the running copy process to show progress',\n exclusive: ['list', 'detach', 'skip-history'],\n required: false,\n }),\n detach: Flags.boolean({\n description: 'Start the copy without waiting for it to finish',\n exclusive: ['list', 'attach'],\n required: false,\n }),\n limit: Flags.integer({\n dependsOn: ['list'],\n description: 'Maximum number of jobs returned (default 10, max 1000)',\n max: 1000,\n required: false,\n }),\n list: Flags.boolean({\n description: 'Lists all dataset copy jobs',\n exclusive: ['attach', 'detach', 'skip-history'],\n required: false,\n }),\n offset: Flags.integer({\n dependsOn: ['list'],\n description: 'Start position in the list of jobs (default 0)',\n required: false,\n }),\n 'skip-content-releases': Flags.boolean({\n description: \"Don't copy content release documents to the target dataset\",\n exclusive: ['list', 'attach'],\n required: false,\n }),\n 'skip-history': Flags.boolean({\n description: \"Don't preserve document history on copy\",\n exclusive: ['list', 'attach'],\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:copy']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CopyDatasetCommand)\n\n if (!flags.list && !flags.attach && this.isUnattended()) {\n const errors: string[] = []\n\n if (!args.source) {\n errors.push('Source dataset is required. Pass it as the `<source>` argument.')\n }\n if (!args.target) {\n errors.push('Target dataset is required. Pass it as the `<target>` argument.')\n }\n\n if (errors.length > 0) {\n this.output.error(formatCliErrorMessages(errors), {exit: exitCodes.USAGE_ERROR})\n }\n }\n\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 // Route to appropriate mode\n if (flags.list) {\n return this.handleListMode(projectId, flags)\n }\n\n if (flags.attach) {\n return this.handleAttachMode(projectId, flags.attach)\n }\n\n return this.handleCopyMode(projectId, args, flags)\n }\n\n private displayCopyJobsTable(jobs: DatasetCopyJob[]): void {\n const table = new Table({\n columns: [\n {alignment: 'left', name: 'id', title: 'Job ID'},\n {alignment: 'left', name: 'sourceDataset', title: 'Source Dataset'},\n {alignment: 'left', name: 'targetDataset', title: 'Target Dataset'},\n {alignment: 'left', name: 'state', title: 'State'},\n {alignment: 'left', name: 'withHistory', title: 'With history'},\n {alignment: 'left', name: 'timeStarted', title: 'Time started'},\n {alignment: 'left', name: 'timeTaken', title: 'Time taken'},\n ],\n title: 'Dataset copy jobs for this project in descending order',\n })\n\n for (const job of jobs) {\n const {createdAt, id, sourceDataset, state, targetDataset, updatedAt, withHistory} = job\n\n let timeStarted = ''\n if (createdAt !== '') {\n timeStarted = formatDistanceToNow(parseISO(createdAt))\n }\n\n let timeTaken = ''\n if (updatedAt !== '') {\n timeTaken = formatDistance(parseISO(updatedAt), parseISO(createdAt))\n }\n\n let color: '' | 'green' | 'red' | 'yellow'\n switch (state) {\n case 'completed': {\n color = 'green'\n break\n }\n case 'failed': {\n color = 'red'\n break\n }\n case 'pending': {\n color = 'yellow'\n break\n }\n default: {\n color = ''\n }\n }\n\n table.addRow(\n {\n id,\n sourceDataset,\n state,\n targetDataset,\n timeStarted: `${timeStarted} ago`,\n timeTaken,\n withHistory,\n },\n {color},\n )\n }\n\n this.output.log(table.render())\n }\n\n private async handleAttachMode(projectId: string, jobId: string): Promise<void> {\n copyDatasetDebug('Attaching to copy job %s', jobId)\n\n if (jobId.trim() === '') {\n return this.output.error('Please supply a valid jobId', {exit: 1})\n }\n\n try {\n await this.subscribeToProgress(projectId, jobId)\n this.output.log(`Job ${styleText('green', jobId)} completed`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Failed to attach to copy job: %s', message, error)\n return this.output.error(`Failed to attach to copy job: ${message}`, {exit: 1})\n }\n }\n\n private async handleCopyMode(\n projectId: string,\n args: {source?: string; target?: string},\n flags: {detach?: boolean; 'skip-content-releases'?: boolean; 'skip-history'?: boolean},\n ): Promise<void> {\n copyDatasetDebug('Starting copy mode')\n\n const skipHistory = Boolean(flags['skip-history'])\n const skipContentReleases = Boolean(flags['skip-content-releases'])\n\n // Get and validate source dataset\n let sourceDataset = args.source\n if (sourceDataset) {\n const nameError = validateDatasetName(sourceDataset)\n if (nameError) {\n return this.output.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n let datasetsResponse\n try {\n datasetsResponse = await listDatasets(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Failed to fetch datasets: %s', message, error)\n return this.output.error(`Failed to fetch datasets: ${message}`, {exit: 1})\n }\n\n const datasetNames = new Set(datasetsResponse.map((ds) => ds.name))\n\n // Prompt for source if not provided\n if (!sourceDataset) {\n sourceDataset = await promptForDataset({\n datasets: datasetsResponse,\n })\n }\n\n if (!datasetNames.has(sourceDataset)) {\n return this.output.error(`Source dataset \"${sourceDataset}\" doesn't exist`, {exit: 1})\n }\n\n // Get and validate target dataset\n let targetDataset = args.target\n if (targetDataset) {\n const nameError = validateDatasetName(targetDataset)\n if (nameError) {\n return this.output.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n } else {\n targetDataset = await promptForDatasetName({\n message: 'Target dataset name:',\n })\n }\n\n if (datasetNames.has(targetDataset)) {\n return this.output.error(`Target dataset \"${targetDataset}\" already exists`, {exit: 1})\n }\n\n // Start the copy job\n try {\n this.output.log(\n `Copying dataset ${styleText('green', sourceDataset)} to ${styleText('green', targetDataset)}...`,\n )\n\n if (!skipHistory) {\n this.output.log(\n `Note: You can run this command with flag '--skip-history'. The flag will reduce copy time in larger datasets.`,\n )\n }\n\n const response = await copyDataset({\n projectId,\n skipContentReleases,\n skipHistory,\n sourceDataset,\n targetDataset,\n })\n\n this.output.log(`Job ${styleText('green', response.jobId)} started`)\n\n if (flags.detach) {\n return\n }\n\n await this.subscribeToProgress(projectId, response.jobId)\n this.output.log(`Job ${styleText('green', response.jobId)} completed`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Dataset copying failed: %s', message, error)\n return this.output.error(`Dataset copying failed: ${message}`, {exit: 1})\n }\n }\n\n private async handleListMode(\n projectId: string,\n flags: {limit?: number; offset?: number},\n ): Promise<void> {\n copyDatasetDebug('Listing dataset copy jobs')\n\n try {\n const jobs = await listDatasetCopyJobs({\n limit: flags.limit,\n offset: flags.offset,\n projectId,\n })\n\n if (jobs.length === 0) {\n this.output.log(\"This project doesn't have any dataset copy jobs\")\n return\n }\n\n this.displayCopyJobsTable(jobs)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Failed to list dataset copy jobs: %s', message, error)\n return this.output.error(`Failed to list dataset copy jobs: ${message}`, {exit: 1})\n }\n }\n\n private async subscribeToProgress(projectId: string, jobId: string): Promise<void> {\n const spin = spinner('').start()\n\n return new Promise<void>((resolve, reject) => {\n const sigintHandler = () => {\n subscription.unsubscribe()\n spin.fail('Copy interrupted.')\n exit(130)\n }\n\n const subscription = followCopyJobProgress({jobId, projectId}).subscribe({\n complete: () => {\n process.off('SIGINT', sigintHandler)\n spin.succeed('Copy finished.')\n resolve()\n },\n error: (err) => {\n process.off('SIGINT', sigintHandler)\n spin.fail('Copy failed.')\n reject(err)\n },\n next: (event: CopyJobProgressEvent) => {\n if (typeof event.progress === 'number') {\n spin.text = `Copy in progress: ${event.progress}%`\n }\n },\n })\n\n process.once('SIGINT', sigintHandler)\n })\n }\n}\n"],"names":["styleText","Args","Flags","exit","exitCodes","subdebug","SanityCommand","spinner","Table","formatDistance","formatDistanceToNow","parseISO","validateDatasetName","promptForDataset","promptForDatasetName","promptForProject","copyDataset","followCopyJobProgress","listDatasetCopyJobs","listDatasets","formatCliErrorMessages","getProjectIdFlag","copyDatasetDebug","CopyDatasetCommand","args","source","string","description","required","target","examples","command","flags","semantics","attach","exclusive","detach","boolean","limit","integer","dependsOn","max","list","offset","hiddenAliases","run","parse","isUnattended","errors","push","length","output","error","USAGE_ERROR","projectId","getProjectId","fallback","requiredPermissions","grant","permission","handleListMode","handleAttachMode","handleCopyMode","displayCopyJobsTable","jobs","table","columns","alignment","name","title","job","createdAt","id","sourceDataset","state","targetDataset","updatedAt","withHistory","timeStarted","timeTaken","color","addRow","log","render","jobId","trim","subscribeToProgress","message","Error","String","skipHistory","Boolean","skipContentReleases","nameError","datasetsResponse","datasetNames","Set","map","ds","datasets","has","response","spin","start","Promise","resolve","reject","sigintHandler","subscription","unsubscribe","fail","subscribe","complete","process","off","succeed","err","next","event","progress","text","once"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/datasets/copy.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exit} from '@oclif/core/errors'\nimport {exitCodes} from '@sanity/cli-core'\nimport {subdebug} from '@sanity/cli-core/debug'\nimport {SanityCommand} from '@sanity/cli-core/SanityCommand'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {Table} from 'console-table-printer'\nimport {formatDistance} from 'date-fns/formatDistance'\nimport {formatDistanceToNow} from 'date-fns/formatDistanceToNow'\nimport {parseISO} from 'date-fns/parseISO'\n\nimport {validateDatasetName} from '../../actions/dataset/validateDatasetName.js'\nimport {promptForDataset} from '../../prompts/promptForDataset.js'\nimport {promptForDatasetName} from '../../prompts/promptForDatasetName.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {\n copyDataset,\n type CopyJobProgressEvent,\n type DatasetCopyJob,\n followCopyJobProgress,\n listDatasetCopyJobs,\n listDatasets,\n} from '../../services/datasets.js'\nimport {formatCliErrorMessages} from '../../util/formatCliErrorMessages.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst copyDatasetDebug = subdebug('dataset:copy')\n\nexport class CopyDatasetCommand extends SanityCommand<typeof CopyDatasetCommand> {\n static override args = {\n source: Args.string({\n description: 'Name of the dataset to copy from',\n required: false,\n }),\n target: Args.string({\n description: 'Name of the dataset to copy to',\n required: false,\n }),\n }\n\n static override description = 'Copy a dataset or manage copy jobs'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Interactively copy a dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> source-dataset',\n description: 'Copy from source-dataset (prompts for target)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> source-dataset target-dataset',\n description: 'Copy from source-dataset to target-dataset',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --skip-history source target',\n description: 'Copy without preserving document history (faster for large datasets)',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --skip-content-releases source target',\n description: 'Copy without content release documents',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --detach source target',\n description: 'Start copy job without waiting for completion',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --attach <job-id>',\n description: 'Attach to a running copy job to follow progress',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --list',\n description: 'List all dataset copy jobs',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --list --offset 2 --limit 10',\n description: 'List copy jobs with pagination',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to copy dataset in',\n semantics: 'override',\n }),\n attach: Flags.string({\n description: 'Attach to the running copy process to show progress',\n exclusive: ['list', 'detach', 'skip-history'],\n required: false,\n }),\n detach: Flags.boolean({\n description: 'Start the copy without waiting for it to finish',\n exclusive: ['list', 'attach'],\n required: false,\n }),\n limit: Flags.integer({\n dependsOn: ['list'],\n description: 'Maximum number of jobs returned (default 10, max 1000)',\n max: 1000,\n required: false,\n }),\n list: Flags.boolean({\n description: 'Lists all dataset copy jobs',\n exclusive: ['attach', 'detach', 'skip-history'],\n required: false,\n }),\n offset: Flags.integer({\n dependsOn: ['list'],\n description: 'Start position in the list of jobs (default 0)',\n required: false,\n }),\n 'skip-content-releases': Flags.boolean({\n description: \"Don't copy content release documents to the target dataset\",\n exclusive: ['list', 'attach'],\n required: false,\n }),\n 'skip-history': Flags.boolean({\n description: \"Don't preserve document history on copy\",\n exclusive: ['list', 'attach'],\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:copy']\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(CopyDatasetCommand)\n\n if (!flags.list && !flags.attach && this.isUnattended()) {\n const errors: string[] = []\n\n if (!args.source) {\n errors.push('Source dataset is required. Pass it as the `<source>` argument.')\n }\n if (!args.target) {\n errors.push('Target dataset is required. Pass it as the `<target>` argument.')\n }\n\n if (errors.length > 0) {\n this.output.error(formatCliErrorMessages(errors), {exit: exitCodes.USAGE_ERROR})\n }\n }\n\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 // Route to appropriate mode\n if (flags.list) {\n return this.handleListMode(projectId, flags)\n }\n\n if (flags.attach) {\n return this.handleAttachMode(projectId, flags.attach)\n }\n\n return this.handleCopyMode(projectId, args, flags)\n }\n\n private displayCopyJobsTable(jobs: DatasetCopyJob[]): void {\n const table = new Table({\n columns: [\n {alignment: 'left', name: 'id', title: 'Job ID'},\n {alignment: 'left', name: 'sourceDataset', title: 'Source Dataset'},\n {alignment: 'left', name: 'targetDataset', title: 'Target Dataset'},\n {alignment: 'left', name: 'state', title: 'State'},\n {alignment: 'left', name: 'withHistory', title: 'With history'},\n {alignment: 'left', name: 'timeStarted', title: 'Time started'},\n {alignment: 'left', name: 'timeTaken', title: 'Time taken'},\n ],\n title: 'Dataset copy jobs for this project in descending order',\n })\n\n for (const job of jobs) {\n const {createdAt, id, sourceDataset, state, targetDataset, updatedAt, withHistory} = job\n\n let timeStarted = ''\n if (createdAt !== '') {\n timeStarted = formatDistanceToNow(parseISO(createdAt))\n }\n\n let timeTaken = ''\n if (updatedAt !== '') {\n timeTaken = formatDistance(parseISO(updatedAt), parseISO(createdAt))\n }\n\n let color: '' | 'green' | 'red' | 'yellow'\n switch (state) {\n case 'completed': {\n color = 'green'\n break\n }\n case 'failed': {\n color = 'red'\n break\n }\n case 'pending': {\n color = 'yellow'\n break\n }\n default: {\n color = ''\n }\n }\n\n table.addRow(\n {\n id,\n sourceDataset,\n state,\n targetDataset,\n timeStarted: `${timeStarted} ago`,\n timeTaken,\n withHistory,\n },\n {color},\n )\n }\n\n this.output.log(table.render())\n }\n\n private async handleAttachMode(projectId: string, jobId: string): Promise<void> {\n copyDatasetDebug('Attaching to copy job %s', jobId)\n\n if (jobId.trim() === '') {\n return this.output.error('Please supply a valid jobId', {exit: exitCodes.RUNTIME_ERROR})\n }\n\n try {\n await this.subscribeToProgress(projectId, jobId)\n this.output.log(`Job ${styleText('green', jobId)} completed`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Failed to attach to copy job: %s', message, error)\n return this.output.error(`Failed to attach to copy job: ${message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n\n private async handleCopyMode(\n projectId: string,\n args: {source?: string; target?: string},\n flags: {detach?: boolean; 'skip-content-releases'?: boolean; 'skip-history'?: boolean},\n ): Promise<void> {\n copyDatasetDebug('Starting copy mode')\n\n const skipHistory = Boolean(flags['skip-history'])\n const skipContentReleases = Boolean(flags['skip-content-releases'])\n\n // Get and validate source dataset\n let sourceDataset = args.source\n if (sourceDataset) {\n const nameError = validateDatasetName(sourceDataset)\n if (nameError) {\n return this.output.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n }\n\n let datasetsResponse\n try {\n datasetsResponse = await listDatasets(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Failed to fetch datasets: %s', message, error)\n return this.output.error(`Failed to fetch datasets: ${message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n const datasetNames = new Set(datasetsResponse.map((ds) => ds.name))\n\n // Prompt for source if not provided\n if (!sourceDataset) {\n sourceDataset = await promptForDataset({\n datasets: datasetsResponse,\n })\n }\n\n if (!datasetNames.has(sourceDataset)) {\n return this.output.error(`Source dataset \"${sourceDataset}\" doesn't exist`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n // Get and validate target dataset\n let targetDataset = args.target\n if (targetDataset) {\n const nameError = validateDatasetName(targetDataset)\n if (nameError) {\n return this.output.error(nameError, {exit: exitCodes.USAGE_ERROR})\n }\n } else {\n targetDataset = await promptForDatasetName({\n message: 'Target dataset name:',\n })\n }\n\n if (datasetNames.has(targetDataset)) {\n return this.output.error(`Target dataset \"${targetDataset}\" already exists`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n // Start the copy job\n try {\n this.output.log(\n `Copying dataset ${styleText('green', sourceDataset)} to ${styleText('green', targetDataset)}...`,\n )\n\n if (!skipHistory) {\n this.output.log(\n `Note: You can run this command with flag '--skip-history'. The flag will reduce copy time in larger datasets.`,\n )\n }\n\n const response = await copyDataset({\n projectId,\n skipContentReleases,\n skipHistory,\n sourceDataset,\n targetDataset,\n })\n\n this.output.log(`Job ${styleText('green', response.jobId)} started`)\n\n if (flags.detach) {\n return\n }\n\n await this.subscribeToProgress(projectId, response.jobId)\n this.output.log(`Job ${styleText('green', response.jobId)} completed`)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Dataset copying failed: %s', message, error)\n return this.output.error(`Dataset copying failed: ${message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n\n private async handleListMode(\n projectId: string,\n flags: {limit?: number; offset?: number},\n ): Promise<void> {\n copyDatasetDebug('Listing dataset copy jobs')\n\n try {\n const jobs = await listDatasetCopyJobs({\n limit: flags.limit,\n offset: flags.offset,\n projectId,\n })\n\n if (jobs.length === 0) {\n this.output.log(\"This project doesn't have any dataset copy jobs\")\n return\n }\n\n this.displayCopyJobsTable(jobs)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n copyDatasetDebug('Failed to list dataset copy jobs: %s', message, error)\n return this.output.error(`Failed to list dataset copy jobs: ${message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n\n private async subscribeToProgress(projectId: string, jobId: string): Promise<void> {\n const spin = spinner('').start()\n\n return new Promise<void>((resolve, reject) => {\n const sigintHandler = () => {\n subscription.unsubscribe()\n spin.fail('Copy interrupted.')\n exit(130)\n }\n\n const subscription = followCopyJobProgress({jobId, projectId}).subscribe({\n complete: () => {\n process.off('SIGINT', sigintHandler)\n spin.succeed('Copy finished.')\n resolve()\n },\n error: (err) => {\n process.off('SIGINT', sigintHandler)\n spin.fail('Copy failed.')\n reject(err)\n },\n next: (event: CopyJobProgressEvent) => {\n if (typeof event.progress === 'number') {\n spin.text = `Copy in progress: ${event.progress}%`\n }\n },\n })\n\n process.once('SIGINT', sigintHandler)\n })\n }\n}\n"],"names":["styleText","Args","Flags","exit","exitCodes","subdebug","SanityCommand","spinner","Table","formatDistance","formatDistanceToNow","parseISO","validateDatasetName","promptForDataset","promptForDatasetName","promptForProject","copyDataset","followCopyJobProgress","listDatasetCopyJobs","listDatasets","formatCliErrorMessages","getProjectIdFlag","copyDatasetDebug","CopyDatasetCommand","args","source","string","description","required","target","examples","command","flags","semantics","attach","exclusive","detach","boolean","limit","integer","dependsOn","max","list","offset","hiddenAliases","run","parse","isUnattended","errors","push","length","output","error","USAGE_ERROR","projectId","getProjectId","fallback","requiredPermissions","grant","permission","handleListMode","handleAttachMode","handleCopyMode","displayCopyJobsTable","jobs","table","columns","alignment","name","title","job","createdAt","id","sourceDataset","state","targetDataset","updatedAt","withHistory","timeStarted","timeTaken","color","addRow","log","render","jobId","trim","RUNTIME_ERROR","subscribeToProgress","message","Error","String","skipHistory","Boolean","skipContentReleases","nameError","datasetsResponse","datasetNames","Set","map","ds","datasets","has","response","spin","start","Promise","resolve","reject","sigintHandler","subscription","unsubscribe","fail","subscribe","complete","process","off","succeed","err","next","event","progress","text","once"],"mappings":"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"}
|
|
@@ -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:
|
|
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:
|
|
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:
|
|
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
|
+
{"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":"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"}
|
|
@@ -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:
|
|
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:
|
|
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
|
+
{"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:
|
|
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:
|
|
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
|
+
{"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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
+
{"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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
268
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
269
269
|
});
|
|
270
270
|
} else {
|
|
271
271
|
this.error(`Failed to create directory "${createPath}": ${err.message}`, {
|
|
272
|
-
exit:
|
|
272
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
273
273
|
});
|
|
274
274
|
}
|
|
275
275
|
}
|