@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.
- package/dist/actions/build/buildApp.js +10 -7
- package/dist/actions/build/buildApp.js.map +1 -1
- package/dist/actions/build/buildStudio.js +9 -6
- package/dist/actions/build/buildStudio.js.map +1 -1
- package/dist/actions/build/types.js.map +1 -1
- package/dist/actions/deploy/deployApp.js +205 -162
- package/dist/actions/deploy/deployApp.js.map +1 -1
- package/dist/actions/deploy/deployChecks.js +1 -1
- package/dist/actions/deploy/deployChecks.js.map +1 -1
- package/dist/actions/deploy/deployStudio.js +126 -87
- package/dist/actions/deploy/deployStudio.js.map +1 -1
- package/dist/actions/deploy/resolveDeployTarget.js +5 -9
- package/dist/actions/deploy/resolveDeployTarget.js.map +1 -1
- package/dist/actions/dev/devAction.js +1 -2
- package/dist/actions/dev/devAction.js.map +1 -1
- package/dist/actions/dev/servers/getDevServerConfig.js +8 -2
- package/dist/actions/dev/servers/getDevServerConfig.js.map +1 -1
- package/dist/actions/init/bootstrapLocalTemplate.js +18 -9
- package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -1
- package/dist/actions/init/createAppCliConfig.js.map +1 -1
- package/dist/actions/init/createCliConfig.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 +331 -331
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/datasets/import.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {createRequester} from '@sanity/cli-core/request'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {sanityImport} from '@sanity/import'\nimport prettyMs from 'pretty-ms'\n\nimport {NEW_DATASET_VALUE, promptForDataset} from '../../prompts/promptForDataset.js'\nimport {promptForDatasetName} from '../../prompts/promptForDatasetName.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {createDataset, listDatasets} from '../../services/datasets.js'\nimport {getDatasetFlag, getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst importDebug = subdebug('dataset:import')\n\ninterface ProgressEvent {\n step: string\n\n current?: number\n total?: number\n update?: string\n}\n\nfunction getAssetsBase(source: string): string | undefined {\n if (/^https?:\\/\\//i.test(source) || source === '-') {\n return undefined\n }\n\n try {\n const fileStats = fs.statSync(source)\n const sourceIsFolder = fileStats.isDirectory()\n return sourceIsFolder ? source : path.dirname(source)\n } catch {\n return undefined\n }\n}\n\nasync function getUriStream(uri: string): Promise<NodeJS.ReadableStream> {\n const request = createRequester({\n middleware: {promise: {onlyBody: false}},\n })\n\n try {\n const response = (await request({stream: true, url: uri})) as {body: NodeJS.ReadableStream}\n return response.body\n } catch (err) {\n throw new Error(`Error fetching source:\\n${(err as Error).message}`, {cause: err})\n }\n}\n\nfunction getPercentage(opts: ProgressEvent): string {\n if (!opts.total) {\n return ''\n }\n\n const percent = Math.floor(((opts.current || 0) / opts.total) * 100)\n return `[${percent}%] `\n}\n\nexport class ImportDatasetCommand extends SanityCommand<typeof ImportDatasetCommand> {\n static override args = {\n source: Args.string({\n description: 'Source file (use \"-\" for stdin)',\n required: true,\n }),\n targetDataset: Args.string({\n description: 'Target dataset (prefer --dataset flag instead)',\n required: false,\n }),\n }\n\n static override description = 'Import documents to a Sanity dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> -d staging my-dataset.ndjson',\n description: 'Import \"./my-dataset.ndjson\" into dataset \"staging\"',\n },\n {\n command: 'cat my-dataset.ndjson | <%= config.bin %> <%= command.id %> -d test -',\n description: 'Import into dataset \"test\" from stdin',\n },\n {\n command: '<%= config.bin %> <%= command.id %> -p projectId -d staging my-dataset.ndjson',\n description: 'Import with explicit project ID (overrides CLI configuration)',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> -d staging -t someSecretToken my-dataset.ndjson',\n description: 'Import with an explicit token (e.g. for CI/CD)',\n },\n ]\n\n static override flags = {\n 'allow-assets-in-different-dataset': Flags.boolean({\n default: false,\n description: 'Allow asset documents to reference different project/dataset',\n }),\n 'allow-failing-assets': Flags.boolean({\n default: false,\n description: 'Skip assets that cannot be fetched/uploaded',\n }),\n 'allow-replacement-characters': Flags.boolean({\n default: false,\n description: 'Allow unicode replacement characters in imported documents',\n }),\n 'allow-system-documents': Flags.boolean({\n default: false,\n description: 'Imports system documents',\n }),\n 'asset-concurrency': Flags.integer({\n description: 'Number of parallel asset imports',\n }),\n ...getDatasetFlag({\n description: 'Dataset to import to',\n semantics: 'specify',\n }),\n missing: Flags.boolean({\n default: false,\n description: 'Skip documents that already exist',\n exclusive: ['replace'],\n }),\n ...getProjectIdFlag({\n description: 'Project ID to import to',\n semantics: 'override',\n }),\n project: Flags.string({\n deprecated: {to: 'project-id'},\n description: 'Project ID to import to',\n hidden: true,\n }),\n replace: Flags.boolean({\n default: false,\n description: 'Replace documents with the same IDs',\n exclusive: ['missing'],\n }),\n 'replace-assets': Flags.boolean({\n default: false,\n description: 'Skip reuse of existing assets',\n }),\n 'skip-cross-dataset-references': Flags.boolean({\n default: false,\n description: 'Skips references to other datasets',\n }),\n token: Flags.string({\n char: 't',\n description: 'Token to authenticate with',\n env: 'SANITY_IMPORT_TOKEN',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:import']\n\n private currentProgress?: ReturnType<typeof spinner>\n private currentStep?: string\n private spinInterval?: NodeJS.Timeout | null\n private stepStart?: number\n\n private static async getStream(source: string): Promise<NodeJS.ReadableStream> {\n if (/^https?:\\/\\//i.test(source)) {\n return getUriStream(source)\n }\n\n return source === '-' ? process.stdin : fs.createReadStream(source)\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(ImportDatasetCommand)\n\n const {\n 'allow-assets-in-different-dataset': allowAssetsInDifferentDataset,\n 'allow-failing-assets': allowFailingAssets,\n 'allow-replacement-characters': allowReplacementCharacters,\n 'allow-system-documents': allowSystemDocuments,\n 'asset-concurrency': assetConcurrency,\n dataset: datasetFlag,\n missing,\n replace,\n 'replace-assets': replaceAssets,\n 'skip-cross-dataset-references': skipCrossDatasetReferences,\n token,\n } = flags\n\n const projectId = await this.getProjectId({\n deprecatedFlagName: 'project',\n fallback: () => promptForProject({}),\n })\n\n const {source, targetDataset: targetDatasetArg} = args\n\n if (targetDatasetArg && !datasetFlag) {\n this.output.warn(\n 'Positional dataset argument is deprecated. Use the --dataset flag instead: --dataset <name>',\n )\n }\n\n let dataset = datasetFlag ?? targetDatasetArg\n if (!dataset) {\n if (this.isUnattended()) {\n return this.output.error('Dataset is required. Pass it with `--dataset <name>`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n const datasets = await listDatasets(projectId)\n dataset = await promptForDataset({allowCreation: true, datasets})\n\n if (dataset === NEW_DATASET_VALUE) {\n const newDatasetName = await promptForDatasetName()\n\n try {\n await createDataset({datasetName: newDatasetName, projectId})\n dataset = newDatasetName\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n importDebug(`Failed to create dataset ${newDatasetName}: ${message}`, error)\n return this.output.error(`Failed to create dataset ${newDatasetName}: ${message}`, {\n exit: 1,\n })\n }\n }\n }\n\n let operation: 'create' | 'createIfNotExists' | 'createOrReplace' = 'create'\n let releasesOperation: 'fail' | 'ignore' | 'replace' = 'fail'\n\n if (replace || missing) {\n operation = replace ? 'createOrReplace' : 'createIfNotExists'\n releasesOperation = replace ? 'replace' : 'ignore'\n }\n\n const client = await getProjectCliClient({\n apiVersion: 'v2025-02-19',\n dataset,\n projectId,\n requireUser: true,\n ...(token ? {token} : {}),\n })\n\n try {\n const stream = await ImportDatasetCommand.getStream(source)\n const assetsBase = getAssetsBase(source)\n\n const importOptions = {\n allowAssetsInDifferentDataset,\n allowFailingAssets,\n allowReplacementCharacters,\n allowSystemDocuments,\n client,\n onProgress: this.onProgress.bind(this),\n operation,\n releasesOperation,\n replaceAssets,\n skipCrossDatasetReferences,\n tag: 'sanity.import',\n targetDataset: dataset,\n targetProjectId: projectId,\n ...(assetsBase ? {assetsBase} : {}),\n ...(assetConcurrency === undefined ? {} : {assetConcurrency}),\n }\n\n const {numDocs, warnings} = await sanityImport(stream, importOptions)\n\n if (this.stepStart) {\n const timeSpent = prettyMs(Date.now() - this.stepStart, {secondsDecimalDigits: 2})\n if (this.currentProgress) {\n if (this.spinInterval) {\n clearInterval(this.spinInterval)\n this.spinInterval = null\n }\n this.currentProgress.text = `[100%] ${this.currentStep} (${timeSpent})`\n this.currentProgress.succeed()\n }\n }\n\n this.output.log('Done! Imported %d documents to dataset \"%s\"\\n', numDocs, dataset)\n this.printWarnings(warnings)\n } catch (err) {\n if (this.spinInterval) {\n clearInterval(this.spinInterval)\n this.spinInterval = null\n }\n\n if (this.currentProgress) {\n this.currentProgress.fail()\n }\n\n return (err as Error).name === 'ReplacementCharError'\n ? this.output.error(\n `Import failed due to unicode replacement characters in the data.\\n${(err as Error).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.`,\n {exit: 1},\n )\n : this.output.error((err as Error).stack || (err as Error).message, {exit: 1})\n }\n }\n\n private onProgress(opts: ProgressEvent): void {\n const lengthComputable = opts.total\n const sameStep = opts.step === this.currentStep\n const percent = getPercentage(opts)\n\n if (lengthComputable && opts.total === opts.current && this.spinInterval) {\n clearInterval(this.spinInterval)\n this.spinInterval = null\n }\n\n if (sameStep && !lengthComputable) {\n return\n }\n\n if (sameStep) {\n if (this.stepStart) {\n const timeSpent = prettyMs(Date.now() - this.stepStart, {secondsDecimalDigits: 2})\n if (this.currentProgress) {\n this.currentProgress.text = `${percent}${opts.step} (${timeSpent})`\n this.currentProgress.render()\n }\n }\n return\n }\n\n // Moved to a new step\n const prevStep = this.currentStep\n const prevStepStart = this.stepStart\n this.stepStart = Date.now()\n this.currentStep = opts.step\n\n if (this.spinInterval) {\n clearInterval(this.spinInterval)\n this.spinInterval = null\n }\n\n if (this.currentProgress && this.currentProgress.succeed && prevStepStart) {\n const timeSpent = prettyMs(Date.now() - prevStepStart, {\n secondsDecimalDigits: 2,\n })\n this.currentProgress.text = `[100%] ${prevStep} (${timeSpent})`\n this.currentProgress.succeed()\n }\n\n this.currentProgress = spinner(`[0%] ${opts.step} (0.00s)`).start()\n\n if (!lengthComputable) {\n this.spinInterval = setInterval(() => {\n if (this.stepStart && this.currentProgress) {\n const timeSpent = prettyMs(Date.now() - this.stepStart, {\n secondsDecimalDigits: 2,\n })\n this.currentProgress.text = `${percent}${opts.step} (${timeSpent})`\n this.currentProgress.render()\n }\n }, 60)\n }\n }\n\n private printWarnings(warnings: Array<{message: string; type?: string; url?: string}>): void {\n const assetFails = warnings.filter((warn) => warn.type === 'asset')\n\n if (assetFails.length === 0) {\n return\n }\n\n this.output.warn(\n `Failed to import the following ${assetFails.length > 1 ? 'assets' : 'asset'}:`,\n )\n\n for (const warning of assetFails) {\n if (warning.url) {\n this.output.warn(` ${warning.url}`)\n }\n }\n }\n}\n"],"names":["fs","path","Args","Flags","exitCodes","getProjectCliClient","SanityCommand","subdebug","createRequester","spinner","sanityImport","prettyMs","NEW_DATASET_VALUE","promptForDataset","promptForDatasetName","promptForProject","createDataset","listDatasets","getDatasetFlag","getProjectIdFlag","importDebug","getAssetsBase","source","test","undefined","fileStats","statSync","sourceIsFolder","isDirectory","dirname","getUriStream","uri","request","middleware","promise","onlyBody","response","stream","url","body","err","Error","message","cause","getPercentage","opts","total","percent","Math","floor","current","ImportDatasetCommand","args","string","description","required","targetDataset","examples","command","flags","boolean","default","integer","semantics","missing","exclusive","project","deprecated","to","hidden","replace","token","char","env","hiddenAliases","currentProgress","currentStep","spinInterval","stepStart","getStream","process","stdin","createReadStream","run","parse","allowAssetsInDifferentDataset","allowFailingAssets","allowReplacementCharacters","allowSystemDocuments","assetConcurrency","dataset","datasetFlag","replaceAssets","skipCrossDatasetReferences","projectId","getProjectId","deprecatedFlagName","fallback","targetDatasetArg","output","warn","isUnattended","error","exit","USAGE_ERROR","datasets","allowCreation","newDatasetName","datasetName","String","operation","releasesOperation","client","apiVersion","requireUser","assetsBase","importOptions","onProgress","bind","tag","targetProjectId","numDocs","warnings","timeSpent","Date","now","secondsDecimalDigits","clearInterval","text","succeed","log","printWarnings","fail","name","stack","lengthComputable","sameStep","step","render","prevStep","prevStepStart","start","setInterval","assetFails","filter","type","length","warning"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/datasets/import.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, getProjectCliClient, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {createRequester} from '@sanity/cli-core/request'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {sanityImport} from '@sanity/import'\nimport prettyMs from 'pretty-ms'\n\nimport {NEW_DATASET_VALUE, promptForDataset} from '../../prompts/promptForDataset.js'\nimport {promptForDatasetName} from '../../prompts/promptForDatasetName.js'\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {createDataset, listDatasets} from '../../services/datasets.js'\nimport {getDatasetFlag, getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst importDebug = subdebug('dataset:import')\n\ninterface ProgressEvent {\n step: string\n\n current?: number\n total?: number\n update?: string\n}\n\nfunction getAssetsBase(source: string): string | undefined {\n if (/^https?:\\/\\//i.test(source) || source === '-') {\n return undefined\n }\n\n try {\n const fileStats = fs.statSync(source)\n const sourceIsFolder = fileStats.isDirectory()\n return sourceIsFolder ? source : path.dirname(source)\n } catch {\n return undefined\n }\n}\n\nasync function getUriStream(uri: string): Promise<NodeJS.ReadableStream> {\n const request = createRequester({\n middleware: {promise: {onlyBody: false}},\n })\n\n try {\n const response = (await request({stream: true, url: uri})) as {body: NodeJS.ReadableStream}\n return response.body\n } catch (err) {\n throw new Error(`Error fetching source:\\n${(err as Error).message}`, {cause: err})\n }\n}\n\nfunction getPercentage(opts: ProgressEvent): string {\n if (!opts.total) {\n return ''\n }\n\n const percent = Math.floor(((opts.current || 0) / opts.total) * 100)\n return `[${percent}%] `\n}\n\nexport class ImportDatasetCommand extends SanityCommand<typeof ImportDatasetCommand> {\n static override args = {\n source: Args.string({\n description: 'Source file (use \"-\" for stdin)',\n required: true,\n }),\n targetDataset: Args.string({\n description: 'Target dataset (prefer --dataset flag instead)',\n required: false,\n }),\n }\n\n static override description = 'Import documents to a Sanity dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> -d staging my-dataset.ndjson',\n description: 'Import \"./my-dataset.ndjson\" into dataset \"staging\"',\n },\n {\n command: 'cat my-dataset.ndjson | <%= config.bin %> <%= command.id %> -d test -',\n description: 'Import into dataset \"test\" from stdin',\n },\n {\n command: '<%= config.bin %> <%= command.id %> -p projectId -d staging my-dataset.ndjson',\n description: 'Import with explicit project ID (overrides CLI configuration)',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> -d staging -t someSecretToken my-dataset.ndjson',\n description: 'Import with an explicit token (e.g. for CI/CD)',\n },\n ]\n\n static override flags = {\n 'allow-assets-in-different-dataset': Flags.boolean({\n default: false,\n description: 'Allow asset documents to reference different project/dataset',\n }),\n 'allow-failing-assets': Flags.boolean({\n default: false,\n description: 'Skip assets that cannot be fetched/uploaded',\n }),\n 'allow-replacement-characters': Flags.boolean({\n default: false,\n description: 'Allow unicode replacement characters in imported documents',\n }),\n 'allow-system-documents': Flags.boolean({\n default: false,\n description: 'Imports system documents',\n }),\n 'asset-concurrency': Flags.integer({\n description: 'Number of parallel asset imports',\n }),\n ...getDatasetFlag({\n description: 'Dataset to import to',\n semantics: 'specify',\n }),\n missing: Flags.boolean({\n default: false,\n description: 'Skip documents that already exist',\n exclusive: ['replace'],\n }),\n ...getProjectIdFlag({\n description: 'Project ID to import to',\n semantics: 'override',\n }),\n project: Flags.string({\n deprecated: {to: 'project-id'},\n description: 'Project ID to import to',\n hidden: true,\n }),\n replace: Flags.boolean({\n default: false,\n description: 'Replace documents with the same IDs',\n exclusive: ['missing'],\n }),\n 'replace-assets': Flags.boolean({\n default: false,\n description: 'Skip reuse of existing assets',\n }),\n 'skip-cross-dataset-references': Flags.boolean({\n default: false,\n description: 'Skips references to other datasets',\n }),\n token: Flags.string({\n char: 't',\n description: 'Token to authenticate with',\n env: 'SANITY_IMPORT_TOKEN',\n required: false,\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:import']\n\n private currentProgress?: ReturnType<typeof spinner>\n private currentStep?: string\n private spinInterval?: NodeJS.Timeout | null\n private stepStart?: number\n\n private static async getStream(source: string): Promise<NodeJS.ReadableStream> {\n if (/^https?:\\/\\//i.test(source)) {\n return getUriStream(source)\n }\n\n return source === '-' ? process.stdin : fs.createReadStream(source)\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(ImportDatasetCommand)\n\n const {\n 'allow-assets-in-different-dataset': allowAssetsInDifferentDataset,\n 'allow-failing-assets': allowFailingAssets,\n 'allow-replacement-characters': allowReplacementCharacters,\n 'allow-system-documents': allowSystemDocuments,\n 'asset-concurrency': assetConcurrency,\n dataset: datasetFlag,\n missing,\n replace,\n 'replace-assets': replaceAssets,\n 'skip-cross-dataset-references': skipCrossDatasetReferences,\n token,\n } = flags\n\n const projectId = await this.getProjectId({\n deprecatedFlagName: 'project',\n fallback: () => promptForProject({}),\n })\n\n const {source, targetDataset: targetDatasetArg} = args\n\n if (targetDatasetArg && !datasetFlag) {\n this.output.warn(\n 'Positional dataset argument is deprecated. Use the --dataset flag instead: --dataset <name>',\n )\n }\n\n let dataset = datasetFlag ?? targetDatasetArg\n if (!dataset) {\n if (this.isUnattended()) {\n return this.output.error('Dataset is required. Pass it with `--dataset <name>`.', {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n\n const datasets = await listDatasets(projectId)\n dataset = await promptForDataset({allowCreation: true, datasets})\n\n if (dataset === NEW_DATASET_VALUE) {\n const newDatasetName = await promptForDatasetName()\n\n try {\n await createDataset({datasetName: newDatasetName, projectId})\n dataset = newDatasetName\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n importDebug(`Failed to create dataset ${newDatasetName}: ${message}`, error)\n return this.output.error(`Failed to create dataset ${newDatasetName}: ${message}`, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n }\n\n let operation: 'create' | 'createIfNotExists' | 'createOrReplace' = 'create'\n let releasesOperation: 'fail' | 'ignore' | 'replace' = 'fail'\n\n if (replace || missing) {\n operation = replace ? 'createOrReplace' : 'createIfNotExists'\n releasesOperation = replace ? 'replace' : 'ignore'\n }\n\n const client = await getProjectCliClient({\n apiVersion: 'v2025-02-19',\n dataset,\n projectId,\n requireUser: true,\n ...(token ? {token} : {}),\n })\n\n try {\n const stream = await ImportDatasetCommand.getStream(source)\n const assetsBase = getAssetsBase(source)\n\n const importOptions = {\n allowAssetsInDifferentDataset,\n allowFailingAssets,\n allowReplacementCharacters,\n allowSystemDocuments,\n client,\n onProgress: this.onProgress.bind(this),\n operation,\n releasesOperation,\n replaceAssets,\n skipCrossDatasetReferences,\n tag: 'sanity.import',\n targetDataset: dataset,\n targetProjectId: projectId,\n ...(assetsBase ? {assetsBase} : {}),\n ...(assetConcurrency === undefined ? {} : {assetConcurrency}),\n }\n\n const {numDocs, warnings} = await sanityImport(stream, importOptions)\n\n if (this.stepStart) {\n const timeSpent = prettyMs(Date.now() - this.stepStart, {secondsDecimalDigits: 2})\n if (this.currentProgress) {\n if (this.spinInterval) {\n clearInterval(this.spinInterval)\n this.spinInterval = null\n }\n this.currentProgress.text = `[100%] ${this.currentStep} (${timeSpent})`\n this.currentProgress.succeed()\n }\n }\n\n this.output.log('Done! Imported %d documents to dataset \"%s\"\\n', numDocs, dataset)\n this.printWarnings(warnings)\n } catch (err) {\n if (this.spinInterval) {\n clearInterval(this.spinInterval)\n this.spinInterval = null\n }\n\n if (this.currentProgress) {\n this.currentProgress.fail()\n }\n\n return (err as Error).name === 'ReplacementCharError'\n ? this.output.error(\n `Import failed due to unicode replacement characters in the data.\\n${(err as Error).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.`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n : this.output.error((err as Error).stack || (err as Error).message, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n\n private onProgress(opts: ProgressEvent): void {\n const lengthComputable = opts.total\n const sameStep = opts.step === this.currentStep\n const percent = getPercentage(opts)\n\n if (lengthComputable && opts.total === opts.current && this.spinInterval) {\n clearInterval(this.spinInterval)\n this.spinInterval = null\n }\n\n if (sameStep && !lengthComputable) {\n return\n }\n\n if (sameStep) {\n if (this.stepStart) {\n const timeSpent = prettyMs(Date.now() - this.stepStart, {secondsDecimalDigits: 2})\n if (this.currentProgress) {\n this.currentProgress.text = `${percent}${opts.step} (${timeSpent})`\n this.currentProgress.render()\n }\n }\n return\n }\n\n // Moved to a new step\n const prevStep = this.currentStep\n const prevStepStart = this.stepStart\n this.stepStart = Date.now()\n this.currentStep = opts.step\n\n if (this.spinInterval) {\n clearInterval(this.spinInterval)\n this.spinInterval = null\n }\n\n if (this.currentProgress && this.currentProgress.succeed && prevStepStart) {\n const timeSpent = prettyMs(Date.now() - prevStepStart, {\n secondsDecimalDigits: 2,\n })\n this.currentProgress.text = `[100%] ${prevStep} (${timeSpent})`\n this.currentProgress.succeed()\n }\n\n this.currentProgress = spinner(`[0%] ${opts.step} (0.00s)`).start()\n\n if (!lengthComputable) {\n this.spinInterval = setInterval(() => {\n if (this.stepStart && this.currentProgress) {\n const timeSpent = prettyMs(Date.now() - this.stepStart, {\n secondsDecimalDigits: 2,\n })\n this.currentProgress.text = `${percent}${opts.step} (${timeSpent})`\n this.currentProgress.render()\n }\n }, 60)\n }\n }\n\n private printWarnings(warnings: Array<{message: string; type?: string; url?: string}>): void {\n const assetFails = warnings.filter((warn) => warn.type === 'asset')\n\n if (assetFails.length === 0) {\n return\n }\n\n this.output.warn(\n `Failed to import the following ${assetFails.length > 1 ? 'assets' : 'asset'}:`,\n )\n\n for (const warning of assetFails) {\n if (warning.url) {\n this.output.warn(` ${warning.url}`)\n }\n }\n }\n}\n"],"names":["fs","path","Args","Flags","exitCodes","getProjectCliClient","SanityCommand","subdebug","createRequester","spinner","sanityImport","prettyMs","NEW_DATASET_VALUE","promptForDataset","promptForDatasetName","promptForProject","createDataset","listDatasets","getDatasetFlag","getProjectIdFlag","importDebug","getAssetsBase","source","test","undefined","fileStats","statSync","sourceIsFolder","isDirectory","dirname","getUriStream","uri","request","middleware","promise","onlyBody","response","stream","url","body","err","Error","message","cause","getPercentage","opts","total","percent","Math","floor","current","ImportDatasetCommand","args","string","description","required","targetDataset","examples","command","flags","boolean","default","integer","semantics","missing","exclusive","project","deprecated","to","hidden","replace","token","char","env","hiddenAliases","currentProgress","currentStep","spinInterval","stepStart","getStream","process","stdin","createReadStream","run","parse","allowAssetsInDifferentDataset","allowFailingAssets","allowReplacementCharacters","allowSystemDocuments","assetConcurrency","dataset","datasetFlag","replaceAssets","skipCrossDatasetReferences","projectId","getProjectId","deprecatedFlagName","fallback","targetDatasetArg","output","warn","isUnattended","error","exit","USAGE_ERROR","datasets","allowCreation","newDatasetName","datasetName","String","RUNTIME_ERROR","operation","releasesOperation","client","apiVersion","requireUser","assetsBase","importOptions","onProgress","bind","tag","targetProjectId","numDocs","warnings","timeSpent","Date","now","secondsDecimalDigits","clearInterval","text","succeed","log","printWarnings","fail","name","stack","lengthComputable","sameStep","step","render","prevStep","prevStepStart","start","setInterval","assetFails","filter","type","length","warning"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SanityCommand, subdebug } from '@sanity/cli-core';
|
|
1
|
+
import { exitCodes, SanityCommand, subdebug } from '@sanity/cli-core';
|
|
2
2
|
import { promptForProject } from '../../prompts/promptForProject.js';
|
|
3
3
|
import { listDatasetAliases, listDatasets } from '../../services/datasets.js';
|
|
4
4
|
import { getProjectIdFlag } from '../../util/sharedFlags.js';
|
|
@@ -43,7 +43,7 @@ export class ListDatasetCommand extends SanityCommand {
|
|
|
43
43
|
const err = datasets.reason;
|
|
44
44
|
listDatasetDebug(`Error listing datasets for project ${projectId}`, err);
|
|
45
45
|
this.error(`Dataset list retrieval failed: ${err.message}`, {
|
|
46
|
-
exit:
|
|
46
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
49
|
const datasetList = datasets.value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/datasets/list.ts"],"sourcesContent":["import {SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listDatasetAliases, listDatasets} from '../../services/datasets.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listDatasetDebug = subdebug('dataset:list')\n\nexport class ListDatasetCommand extends SanityCommand<typeof ListDatasetCommand> {\n static override description = 'List datasets for the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List datasets for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List datasets for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list datasets for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:list']\n\n public async run(): Promise<void> {\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.datasets'}],\n }),\n })\n\n const [datasets, aliases] = await Promise.allSettled([\n listDatasets(projectId),\n listDatasetAliases(projectId),\n ])\n\n if (datasets.status === 'rejected') {\n const err = datasets.reason as Error\n listDatasetDebug(`Error listing datasets for project ${projectId}`, err)\n this.error(`Dataset list retrieval failed: ${err.message}`, {exit:
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/datasets/list.ts"],"sourcesContent":["import {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {promptForProject} from '../../prompts/promptForProject.js'\nimport {listDatasetAliases, listDatasets} from '../../services/datasets.js'\nimport {getProjectIdFlag} from '../../util/sharedFlags.js'\n\nconst listDatasetDebug = subdebug('dataset:list')\n\nexport class ListDatasetCommand extends SanityCommand<typeof ListDatasetCommand> {\n static override description = 'List datasets for the project'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'List datasets for the project',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --project-id abc123',\n description: 'List datasets for a specific project',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to list datasets for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:list']\n\n public async run(): Promise<void> {\n const projectId = await this.getProjectId({\n fallback: () =>\n promptForProject({\n requiredPermissions: [{grant: 'read', permission: 'sanity.project.datasets'}],\n }),\n })\n\n const [datasets, aliases] = await Promise.allSettled([\n listDatasets(projectId),\n listDatasetAliases(projectId),\n ])\n\n if (datasets.status === 'rejected') {\n const err = datasets.reason as Error\n listDatasetDebug(`Error listing datasets for project ${projectId}`, err)\n this.error(`Dataset list retrieval failed: ${err.message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const datasetList = datasets.value\n if (datasetList.length === 0) {\n this.log('No datasets found for this project.')\n } else {\n for (const dataset of datasetList) {\n this.log(dataset.name)\n }\n }\n\n if (aliases.status === 'fulfilled' && aliases.value.length > 0) {\n for (const alias of aliases.value) {\n const targetDataset = alias.datasetName || '<unlinked>'\n this.log(`~${alias.name} -> ${targetDataset}`)\n }\n } else if (aliases.status === 'rejected') {\n listDatasetDebug(`Warning: Could not fetch aliases for project ${projectId}`, aliases.reason)\n }\n }\n}\n"],"names":["exitCodes","SanityCommand","subdebug","promptForProject","listDatasetAliases","listDatasets","getProjectIdFlag","listDatasetDebug","ListDatasetCommand","description","examples","command","flags","semantics","hiddenAliases","run","projectId","getProjectId","fallback","requiredPermissions","grant","permission","datasets","aliases","Promise","allSettled","status","err","reason","error","message","exit","RUNTIME_ERROR","datasetList","value","length","log","dataset","name","alias","targetDataset","datasetName"],"mappings":"AAAA,SAAQA,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAEnE,SAAQC,gBAAgB,QAAO,oCAAmC;AAClE,SAAQC,kBAAkB,EAAEC,YAAY,QAAO,6BAA4B;AAC3E,SAAQC,gBAAgB,QAAO,4BAA2B;AAE1D,MAAMC,mBAAmBL,SAAS;AAElC,OAAO,MAAMM,2BAA2BP;IACtC,OAAgBQ,cAAc,gCAA+B;IAE7D,OAAgBC,WAAW;QACzB;YACEC,SAAS;YACTF,aAAa;QACf;QACA;YACEE,SAAS;YACTF,aAAa;QACf;KACD,CAAA;IAED,OAAgBG,QAAQ;QACtB,GAAGN,iBAAiB;YAClBG,aAAa;YACbI,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAe,CAAA;IAE1D,MAAaC,MAAqB;QAChC,MAAMC,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRf,iBAAiB;oBACfgB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,MAAM,CAACC,UAAUC,QAAQ,GAAG,MAAMC,QAAQC,UAAU,CAAC;YACnDpB,aAAaW;YACbZ,mBAAmBY;SACpB;QAED,IAAIM,SAASI,MAAM,KAAK,YAAY;YAClC,MAAMC,MAAML,SAASM,MAAM;YAC3BrB,iBAAiB,CAAC,mCAAmC,EAAES,WAAW,EAAEW;YACpE,IAAI,CAACE,KAAK,CAAC,CAAC,+BAA+B,EAAEF,IAAIG,OAAO,EAAE,EAAE;gBAACC,MAAM/B,UAAUgC,aAAa;YAAA;QAC5F;QAEA,MAAMC,cAAcX,SAASY,KAAK;QAClC,IAAID,YAAYE,MAAM,KAAK,GAAG;YAC5B,IAAI,CAACC,GAAG,CAAC;QACX,OAAO;YACL,KAAK,MAAMC,WAAWJ,YAAa;gBACjC,IAAI,CAACG,GAAG,CAACC,QAAQC,IAAI;YACvB;QACF;QAEA,IAAIf,QAAQG,MAAM,KAAK,eAAeH,QAAQW,KAAK,CAACC,MAAM,GAAG,GAAG;YAC9D,KAAK,MAAMI,SAAShB,QAAQW,KAAK,CAAE;gBACjC,MAAMM,gBAAgBD,MAAME,WAAW,IAAI;gBAC3C,IAAI,CAACL,GAAG,CAAC,CAAC,CAAC,EAAEG,MAAMD,IAAI,CAAC,IAAI,EAAEE,eAAe;YAC/C;QACF,OAAO,IAAIjB,QAAQG,MAAM,KAAK,YAAY;YACxCnB,iBAAiB,CAAC,6CAA6C,EAAES,WAAW,EAAEO,QAAQK,MAAM;QAC9F;IACF;AACF"}
|
|
@@ -54,12 +54,12 @@ export class DatasetVisibilityGetCommand extends SanityCommand {
|
|
|
54
54
|
} catch (error) {
|
|
55
55
|
getDebug(`Error listing datasets`, error);
|
|
56
56
|
this.error(`Failed to list datasets: ${error instanceof Error ? error.message : String(error)}`, {
|
|
57
|
-
exit:
|
|
57
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
60
|
if (!current) {
|
|
61
61
|
this.error(`Dataset not found: ${dataset}`, {
|
|
62
|
-
exit:
|
|
62
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
63
63
|
});
|
|
64
64
|
}
|
|
65
65
|
this.log(current.aclMode);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/datasets/visibility/get.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {validateDatasetName} from '../../../actions/dataset/validateDatasetName.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {listDatasets} from '../../../services/datasets.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst getDebug = subdebug('dataset:visibility:get')\n\nexport class DatasetVisibilityGetCommand extends SanityCommand<typeof DatasetVisibilityGetCommand> {\n static override args = {\n dataset: Args.string({\n description: 'The name of the dataset to get visibility for',\n required: true,\n }),\n }\n\n static override description = 'Get the visibility of a dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> my-dataset',\n description: 'Check the visibility of a dataset',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to get dataset visibility for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:visibility:get']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(DatasetVisibilityGetCommand)\n const {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 const dsError = validateDatasetName(dataset)\n if (dsError) {\n this.error(dsError, {exit: exitCodes.USAGE_ERROR})\n }\n\n let current\n try {\n const datasets = await listDatasets(projectId)\n current = datasets.find((curr: {name: string}) => curr.name === dataset)\n } catch (error) {\n getDebug(`Error listing datasets`, error)\n this.error(\n `Failed to list datasets: ${error instanceof Error ? error.message : String(error)}`,\n {exit:
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/datasets/visibility/get.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\n\nimport {validateDatasetName} from '../../../actions/dataset/validateDatasetName.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {listDatasets} from '../../../services/datasets.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst getDebug = subdebug('dataset:visibility:get')\n\nexport class DatasetVisibilityGetCommand extends SanityCommand<typeof DatasetVisibilityGetCommand> {\n static override args = {\n dataset: Args.string({\n description: 'The name of the dataset to get visibility for',\n required: true,\n }),\n }\n\n static override description = 'Get the visibility of a dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> my-dataset',\n description: 'Check the visibility of a dataset',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to get dataset visibility for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:visibility:get']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(DatasetVisibilityGetCommand)\n const {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 const dsError = validateDatasetName(dataset)\n if (dsError) {\n this.error(dsError, {exit: exitCodes.USAGE_ERROR})\n }\n\n let current\n try {\n const datasets = await listDatasets(projectId)\n current = datasets.find((curr: {name: string}) => curr.name === dataset)\n } catch (error) {\n getDebug(`Error listing datasets`, error)\n this.error(\n `Failed to list datasets: ${error instanceof Error ? error.message : String(error)}`,\n {exit: exitCodes.RUNTIME_ERROR},\n )\n }\n\n if (!current) {\n this.error(`Dataset not found: ${dataset}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n this.log(current.aclMode)\n }\n}\n"],"names":["Args","exitCodes","SanityCommand","subdebug","validateDatasetName","promptForProject","listDatasets","getProjectIdFlag","getDebug","DatasetVisibilityGetCommand","args","dataset","string","description","required","examples","command","flags","semantics","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","dsError","error","exit","USAGE_ERROR","current","datasets","find","curr","name","Error","message","String","RUNTIME_ERROR","log","aclMode"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAEnE,SAAQC,mBAAmB,QAAO,kDAAiD;AACnF,SAAQC,gBAAgB,QAAO,uCAAsC;AACrE,SAAQC,YAAY,QAAO,gCAA+B;AAC1D,SAAQC,gBAAgB,QAAO,+BAA8B;AAE7D,MAAMC,WAAWL,SAAS;AAE1B,OAAO,MAAMM,oCAAoCP;IAC/C,OAAgBQ,OAAO;QACrBC,SAASX,KAAKY,MAAM,CAAC;YACnBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,kCAAiC;IAE/D,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;KAAyB,CAAA;IAEpE,MAAaC,MAAqB;QAChC,MAAM,EAACV,IAAI,EAAC,GAAG,MAAM,IAAI,CAACW,KAAK,CAACZ;QAChC,MAAM,EAACE,OAAO,EAAC,GAAGD;QAElB,MAAMY,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRnB,iBAAiB;oBACfoB,qBAAqB;wBAAC;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;qBAAE;gBAC/E;QACJ;QAEA,MAAMC,UAAUxB,oBAAoBO;QACpC,IAAIiB,SAAS;YACX,IAAI,CAACC,KAAK,CAACD,SAAS;gBAACE,MAAM7B,UAAU8B,WAAW;YAAA;QAClD;QAEA,IAAIC;QACJ,IAAI;YACF,MAAMC,WAAW,MAAM3B,aAAagB;YACpCU,UAAUC,SAASC,IAAI,CAAC,CAACC,OAAyBA,KAAKC,IAAI,KAAKzB;QAClE,EAAE,OAAOkB,OAAO;YACdrB,SAAS,CAAC,sBAAsB,CAAC,EAAEqB;YACnC,IAAI,CAACA,KAAK,CACR,CAAC,yBAAyB,EAAEA,iBAAiBQ,QAAQR,MAAMS,OAAO,GAAGC,OAAOV,QAAQ,EACpF;gBAACC,MAAM7B,UAAUuC,aAAa;YAAA;QAElC;QAEA,IAAI,CAACR,SAAS;YACZ,IAAI,CAACH,KAAK,CAAC,CAAC,mBAAmB,EAAElB,SAAS,EAAE;gBAACmB,MAAM7B,UAAUuC,aAAa;YAAA;QAC5E;QAEA,IAAI,CAACC,GAAG,CAACT,QAAQU,OAAO;IAC1B;AACF"}
|
|
@@ -70,13 +70,13 @@ export class DatasetVisibilitySetCommand extends SanityCommand {
|
|
|
70
70
|
const message = error instanceof Error ? error.message : String(error);
|
|
71
71
|
setDatasetVisibilityDebug(`Failed to list datasets: ${message}`, error);
|
|
72
72
|
this.error(`Failed to list datasets: ${message}`, {
|
|
73
|
-
exit:
|
|
73
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
74
74
|
});
|
|
75
75
|
}
|
|
76
76
|
const current = datasets.find((curr)=>curr.name === dataset);
|
|
77
77
|
if (!current) {
|
|
78
78
|
this.error(`Dataset "${dataset}" not found`, {
|
|
79
|
-
exit:
|
|
79
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
if (current.aclMode === mode) {
|
|
@@ -96,7 +96,7 @@ export class DatasetVisibilitySetCommand extends SanityCommand {
|
|
|
96
96
|
const message = error instanceof Error ? error.message : String(error);
|
|
97
97
|
setDatasetVisibilityDebug(`Failed to edit dataset: ${message}`, error);
|
|
98
98
|
this.error(`Failed to edit dataset: ${message}`, {
|
|
99
|
-
exit:
|
|
99
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
100
100
|
});
|
|
101
101
|
}
|
|
102
102
|
this.log('Dataset visibility changed');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/datasets/visibility/set.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {DatasetsResponse} from '@sanity/client'\n\nimport {validateDatasetName} from '../../../actions/dataset/validateDatasetName.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {editDatasetAcl, listDatasets} from '../../../services/datasets.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst setDatasetVisibilityDebug = subdebug('dataset:visibility:set')\n\nexport class DatasetVisibilitySetCommand extends SanityCommand<typeof DatasetVisibilitySetCommand> {\n static override args = {\n dataset: Args.string({\n description: 'The name of the dataset to set visibility for',\n required: true,\n }),\n mode: Args.string({\n description: 'The visibility mode to set',\n options: ['public', 'private'],\n required: true,\n }),\n }\n\n static override description = 'Set the visibility of a dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> my-dataset private',\n description: 'Make a dataset private',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-dataset public',\n description: 'Make a dataset public',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to set dataset visibility for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:visibility:set']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(DatasetVisibilitySetCommand)\n const {dataset, mode} = 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 const dsError = validateDatasetName(dataset)\n if (dsError) {\n this.error(dsError, {exit: exitCodes.USAGE_ERROR})\n }\n\n let datasets: DatasetsResponse\n\n try {\n datasets = await listDatasets(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n setDatasetVisibilityDebug(`Failed to list datasets: ${message}`, error)\n this.error(`Failed to list datasets: ${message}`, {exit:
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/datasets/visibility/set.ts"],"sourcesContent":["import {Args} from '@oclif/core'\nimport {exitCodes, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {DatasetsResponse} from '@sanity/client'\n\nimport {validateDatasetName} from '../../../actions/dataset/validateDatasetName.js'\nimport {promptForProject} from '../../../prompts/promptForProject.js'\nimport {editDatasetAcl, listDatasets} from '../../../services/datasets.js'\nimport {getProjectIdFlag} from '../../../util/sharedFlags.js'\n\nconst setDatasetVisibilityDebug = subdebug('dataset:visibility:set')\n\nexport class DatasetVisibilitySetCommand extends SanityCommand<typeof DatasetVisibilitySetCommand> {\n static override args = {\n dataset: Args.string({\n description: 'The name of the dataset to set visibility for',\n required: true,\n }),\n mode: Args.string({\n description: 'The visibility mode to set',\n options: ['public', 'private'],\n required: true,\n }),\n }\n\n static override description = 'Set the visibility of a dataset'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> my-dataset private',\n description: 'Make a dataset private',\n },\n {\n command: '<%= config.bin %> <%= command.id %> my-dataset public',\n description: 'Make a dataset public',\n },\n ]\n\n static override flags = {\n ...getProjectIdFlag({\n description: 'Project ID to set dataset visibility for',\n semantics: 'override',\n }),\n }\n\n static override hiddenAliases: string[] = ['dataset:visibility:set']\n\n public async run(): Promise<void> {\n const {args} = await this.parse(DatasetVisibilitySetCommand)\n const {dataset, mode} = 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 const dsError = validateDatasetName(dataset)\n if (dsError) {\n this.error(dsError, {exit: exitCodes.USAGE_ERROR})\n }\n\n let datasets: DatasetsResponse\n\n try {\n datasets = await listDatasets(projectId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n setDatasetVisibilityDebug(`Failed to list datasets: ${message}`, error)\n this.error(`Failed to list datasets: ${message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n const current = datasets.find((curr: {name: string}) => curr.name === dataset)\n\n if (!current) {\n this.error(`Dataset \"${dataset}\" not found`, {exit: exitCodes.RUNTIME_ERROR})\n }\n\n if (current.aclMode === mode) {\n this.log(`Dataset already in \"${mode}\" mode`)\n return\n }\n\n if (mode === 'private') {\n this.log(\n 'Please note that while documents are private, assets (files and images) are still public',\n )\n }\n\n try {\n await editDatasetAcl({\n aclMode: mode as 'private' | 'public',\n datasetName: dataset,\n projectId,\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n setDatasetVisibilityDebug(`Failed to edit dataset: ${message}`, error)\n this.error(`Failed to edit dataset: ${message}`, {exit: exitCodes.RUNTIME_ERROR})\n }\n this.log('Dataset visibility changed')\n }\n}\n"],"names":["Args","exitCodes","SanityCommand","subdebug","validateDatasetName","promptForProject","editDatasetAcl","listDatasets","getProjectIdFlag","setDatasetVisibilityDebug","DatasetVisibilitySetCommand","args","dataset","string","description","required","mode","options","examples","command","flags","semantics","hiddenAliases","run","parse","projectId","getProjectId","fallback","requiredPermissions","grant","permission","dsError","error","exit","USAGE_ERROR","datasets","message","Error","String","RUNTIME_ERROR","current","find","curr","name","aclMode","log","datasetName"],"mappings":"AAAA,SAAQA,IAAI,QAAO,cAAa;AAChC,SAAQC,SAAS,EAAEC,aAAa,EAAEC,QAAQ,QAAO,mBAAkB;AAGnE,SAAQC,mBAAmB,QAAO,kDAAiD;AACnF,SAAQC,gBAAgB,QAAO,uCAAsC;AACrE,SAAQC,cAAc,EAAEC,YAAY,QAAO,gCAA+B;AAC1E,SAAQC,gBAAgB,QAAO,+BAA8B;AAE7D,MAAMC,4BAA4BN,SAAS;AAE3C,OAAO,MAAMO,oCAAoCR;IAC/C,OAAgBS,OAAO;QACrBC,SAASZ,KAAKa,MAAM,CAAC;YACnBC,aAAa;YACbC,UAAU;QACZ;QACAC,MAAMhB,KAAKa,MAAM,CAAC;YAChBC,aAAa;YACbG,SAAS;gBAAC;gBAAU;aAAU;YAC9BF,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,kCAAiC;IAE/D,OAAgBI,WAAW;QACzB;YACEC,SAAS;YACTL,aAAa;QACf;QACA;YACEK,SAAS;YACTL,aAAa;QACf;KACD,CAAA;IAED,OAAgBM,QAAQ;QACtB,GAAGZ,iBAAiB;YAClBM,aAAa;YACbO,WAAW;QACb,EAAE;IACJ,EAAC;IAED,OAAgBC,gBAA0B;QAAC;KAAyB,CAAA;IAEpE,MAAaC,MAAqB;QAChC,MAAM,EAACZ,IAAI,EAAC,GAAG,MAAM,IAAI,CAACa,KAAK,CAACd;QAChC,MAAM,EAACE,OAAO,EAAEI,IAAI,EAAC,GAAGL;QAExB,MAAMc,YAAY,MAAM,IAAI,CAACC,YAAY,CAAC;YACxCC,UAAU,IACRtB,iBAAiB;oBACfuB,qBAAqB;wBACnB;4BAACC,OAAO;4BAAQC,YAAY;wBAAyB;wBACrD;4BAACD,OAAO;4BAAUC,YAAY;wBAAyB;qBACxD;gBACH;QACJ;QAEA,MAAMC,UAAU3B,oBAAoBQ;QACpC,IAAImB,SAAS;YACX,IAAI,CAACC,KAAK,CAACD,SAAS;gBAACE,MAAMhC,UAAUiC,WAAW;YAAA;QAClD;QAEA,IAAIC;QAEJ,IAAI;YACFA,WAAW,MAAM5B,aAAakB;QAChC,EAAE,OAAOO,OAAO;YACd,MAAMI,UAAUJ,iBAAiBK,QAAQL,MAAMI,OAAO,GAAGE,OAAON;YAChEvB,0BAA0B,CAAC,yBAAyB,EAAE2B,SAAS,EAAEJ;YACjE,IAAI,CAACA,KAAK,CAAC,CAAC,yBAAyB,EAAEI,SAAS,EAAE;gBAACH,MAAMhC,UAAUsC,aAAa;YAAA;QAClF;QAEA,MAAMC,UAAUL,SAASM,IAAI,CAAC,CAACC,OAAyBA,KAAKC,IAAI,KAAK/B;QAEtE,IAAI,CAAC4B,SAAS;YACZ,IAAI,CAACR,KAAK,CAAC,CAAC,SAAS,EAAEpB,QAAQ,WAAW,CAAC,EAAE;gBAACqB,MAAMhC,UAAUsC,aAAa;YAAA;QAC7E;QAEA,IAAIC,QAAQI,OAAO,KAAK5B,MAAM;YAC5B,IAAI,CAAC6B,GAAG,CAAC,CAAC,oBAAoB,EAAE7B,KAAK,MAAM,CAAC;YAC5C;QACF;QAEA,IAAIA,SAAS,WAAW;YACtB,IAAI,CAAC6B,GAAG,CACN;QAEJ;QAEA,IAAI;YACF,MAAMvC,eAAe;gBACnBsC,SAAS5B;gBACT8B,aAAalC;gBACba;YACF;QACF,EAAE,OAAOO,OAAO;YACd,MAAMI,UAAUJ,iBAAiBK,QAAQL,MAAMI,OAAO,GAAGE,OAAON;YAChEvB,0BAA0B,CAAC,wBAAwB,EAAE2B,SAAS,EAAEJ;YAChE,IAAI,CAACA,KAAK,CAAC,CAAC,wBAAwB,EAAEI,SAAS,EAAE;gBAACH,MAAMhC,UAAUsC,aAAa;YAAA;QACjF;QACA,IAAI,CAACM,GAAG,CAAC;IACX;AACF"}
|
package/dist/commands/deploy.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { Args, Flags } from '@oclif/core';
|
|
3
|
-
import { SanityCommand } from '@sanity/cli-core';
|
|
3
|
+
import { exitCodes, SanityCommand } from '@sanity/cli-core';
|
|
4
4
|
import { confirm } from '@sanity/cli-core/ux';
|
|
5
5
|
import { deployApp } from '../actions/deploy/deployApp.js';
|
|
6
6
|
import { deployDebug } from '../actions/deploy/deployDebug.js';
|
|
@@ -111,7 +111,7 @@ export class DeployCommand extends SanityCommand {
|
|
|
111
111
|
});
|
|
112
112
|
if (!shouldProceed) {
|
|
113
113
|
this.output.error('Cancelled.', {
|
|
114
|
-
exit:
|
|
114
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
115
115
|
});
|
|
116
116
|
}
|
|
117
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/deploy.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {deployApp} from '../actions/deploy/deployApp.js'\nimport {deployDebug} from '../actions/deploy/deployDebug.js'\nimport {deployStudio} from '../actions/deploy/deployStudio.js'\nimport {determineIsApp} from '../util/determineIsApp.js'\nimport {dirIsEmptyOrNonExistent} from '../util/dirIsEmptyOrNonExistent.js'\n\nexport class DeployCommand extends SanityCommand<typeof DeployCommand> {\n static override args = {\n sourceDir: Args.directory({\n description: 'Source directory',\n }),\n }\n\n static override description = 'Builds and deploys Sanity Studio or application to Sanity hosting'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Build and deploy the studio to Sanity hosting',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --no-minify --source-maps',\n description: 'Deploys non-minified build with source maps',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --schema-required',\n description:\n 'Fail fast on schema store fails - for when other services rely on the stored schema',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --external',\n description: 'Register an externally hosted studio (studioHost contains full URL)',\n },\n ]\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n deprecated: true,\n description: 'Automatically update the studio to the latest version',\n }),\n build: Flags.boolean({\n allowNo: true,\n default: true,\n description:\n 'Build the studio before deploying (use --no-build to deploy existing `dist/` output)',\n }),\n 'dry-run': Flags.boolean({\n default: false,\n description: 'Report what would be deployed without uploading or creating anything',\n }),\n external: Flags.boolean({\n default: false,\n description: 'Register an externally hosted studio',\n exclusive: ['source-maps', 'minify', 'build'],\n }),\n json: Flags.boolean({\n char: 'j',\n default: false,\n description: 'Output the result as JSON',\n }),\n minify: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Minify built JavaScript (use --no-minify to skip for faster builds)',\n }),\n 'schema-required': Flags.boolean({\n default: false,\n description: 'Fail if schema deployment fails',\n }),\n 'source-maps': Flags.boolean({\n default: false,\n description: 'Enable source maps for built bundles (increases size of bundle)',\n }),\n title: Flags.string({\n description:\n 'Title for a newly created application or studio. For apps it also skips the interactive title prompt, enabling unattended creation',\n }),\n url: Flags.string({\n description:\n 'Studio URL for deployment. For external studios, the full URL. For hosted studios, the hostname (e.g. \"my-studio\" or \"my-studio.sanity.studio\")',\n }),\n verbose: Flags.boolean({\n default: false,\n description: 'Enable verbose logging',\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description:\n 'Unattended mode, answers \"yes\" to any \"yes/no\" prompt and otherwise uses defaults',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(DeployCommand)\n\n const cliConfig = await this.getCliConfig()\n const projectRoot = await this.getProjectRoot()\n\n const isApp = determineIsApp(cliConfig)\n\n const defaultOutputDir = path.resolve(path.join(projectRoot.directory, 'dist'))\n const sourceDir = path.resolve(process.cwd(), this.args.sourceDir || defaultOutputDir)\n\n // Skip the directory check if the studio is externally hosted\n if (this.args.sourceDir && this.args.sourceDir !== 'dist' && !flags.external) {\n let relativeOutput = path.relative(process.cwd(), sourceDir)\n if (relativeOutput[0] !== '.') {\n relativeOutput = `./${relativeOutput}`\n }\n\n if (!this.isUnattended() && !flags['dry-run']) {\n const isEmpty = await dirIsEmptyOrNonExistent(sourceDir)\n const shouldProceed =\n isEmpty ||\n (await confirm({\n default: false,\n message: `\"${relativeOutput}\" is not empty, do you want to proceed?`,\n }))\n\n if (!shouldProceed) {\n this.output.error('Cancelled.', {exit:
|
|
1
|
+
{"version":3,"sources":["../../src/commands/deploy.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\n\nimport {deployApp} from '../actions/deploy/deployApp.js'\nimport {deployDebug} from '../actions/deploy/deployDebug.js'\nimport {deployStudio} from '../actions/deploy/deployStudio.js'\nimport {determineIsApp} from '../util/determineIsApp.js'\nimport {dirIsEmptyOrNonExistent} from '../util/dirIsEmptyOrNonExistent.js'\n\nexport class DeployCommand extends SanityCommand<typeof DeployCommand> {\n static override args = {\n sourceDir: Args.directory({\n description: 'Source directory',\n }),\n }\n\n static override description = 'Builds and deploys Sanity Studio or application to Sanity hosting'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %>',\n description: 'Build and deploy the studio to Sanity hosting',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --no-minify --source-maps',\n description: 'Deploys non-minified build with source maps',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --schema-required',\n description:\n 'Fail fast on schema store fails - for when other services rely on the stored schema',\n },\n {\n command: '<%= config.bin %> <%= command.id %> --external',\n description: 'Register an externally hosted studio (studioHost contains full URL)',\n },\n ]\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n deprecated: true,\n description: 'Automatically update the studio to the latest version',\n }),\n build: Flags.boolean({\n allowNo: true,\n default: true,\n description:\n 'Build the studio before deploying (use --no-build to deploy existing `dist/` output)',\n }),\n 'dry-run': Flags.boolean({\n default: false,\n description: 'Report what would be deployed without uploading or creating anything',\n }),\n external: Flags.boolean({\n default: false,\n description: 'Register an externally hosted studio',\n exclusive: ['source-maps', 'minify', 'build'],\n }),\n json: Flags.boolean({\n char: 'j',\n default: false,\n description: 'Output the result as JSON',\n }),\n minify: Flags.boolean({\n allowNo: true,\n default: true,\n description: 'Minify built JavaScript (use --no-minify to skip for faster builds)',\n }),\n 'schema-required': Flags.boolean({\n default: false,\n description: 'Fail if schema deployment fails',\n }),\n 'source-maps': Flags.boolean({\n default: false,\n description: 'Enable source maps for built bundles (increases size of bundle)',\n }),\n title: Flags.string({\n description:\n 'Title for a newly created application or studio. For apps it also skips the interactive title prompt, enabling unattended creation',\n }),\n url: Flags.string({\n description:\n 'Studio URL for deployment. For external studios, the full URL. For hosted studios, the hostname (e.g. \"my-studio\" or \"my-studio.sanity.studio\")',\n }),\n verbose: Flags.boolean({\n default: false,\n description: 'Enable verbose logging',\n }),\n yes: Flags.boolean({\n char: 'y',\n default: false,\n description:\n 'Unattended mode, answers \"yes\" to any \"yes/no\" prompt and otherwise uses defaults',\n }),\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(DeployCommand)\n\n const cliConfig = await this.getCliConfig()\n const projectRoot = await this.getProjectRoot()\n\n const isApp = determineIsApp(cliConfig)\n\n const defaultOutputDir = path.resolve(path.join(projectRoot.directory, 'dist'))\n const sourceDir = path.resolve(process.cwd(), this.args.sourceDir || defaultOutputDir)\n\n // Skip the directory check if the studio is externally hosted\n if (this.args.sourceDir && this.args.sourceDir !== 'dist' && !flags.external) {\n let relativeOutput = path.relative(process.cwd(), sourceDir)\n if (relativeOutput[0] !== '.') {\n relativeOutput = `./${relativeOutput}`\n }\n\n if (!this.isUnattended() && !flags['dry-run']) {\n const isEmpty = await dirIsEmptyOrNonExistent(sourceDir)\n const shouldProceed =\n isEmpty ||\n (await confirm({\n default: false,\n message: `\"${relativeOutput}\" is not empty, do you want to proceed?`,\n }))\n\n if (!shouldProceed) {\n this.output.error('Cancelled.', {exit: exitCodes.RUNTIME_ERROR})\n }\n }\n\n // Keep --json's stdout clean for the payload\n if (!flags.json) this.output.log(`Building to ${relativeOutput}\\n`)\n }\n\n // Force yes downstream: build/app resolution otherwise prompts for prerelease/version choices\n const deployFlags = this.isUnattended() || flags['dry-run'] ? {...flags, yes: true} : flags\n\n if (isApp) {\n deployDebug('Deploying app')\n await deployApp({\n cliConfig,\n flags: deployFlags,\n output: this.output,\n projectRoot,\n sourceDir,\n })\n } else {\n deployDebug('Deploying studio')\n await deployStudio({\n cliConfig,\n flags: deployFlags,\n output: this.output,\n projectRoot,\n sourceDir,\n })\n }\n }\n}\n"],"names":["path","Args","Flags","exitCodes","SanityCommand","confirm","deployApp","deployDebug","deployStudio","determineIsApp","dirIsEmptyOrNonExistent","DeployCommand","args","sourceDir","directory","description","examples","command","flags","boolean","allowNo","deprecated","build","default","external","exclusive","json","char","minify","title","string","url","verbose","yes","run","parse","cliConfig","getCliConfig","projectRoot","getProjectRoot","isApp","defaultOutputDir","resolve","join","process","cwd","relativeOutput","relative","isUnattended","isEmpty","shouldProceed","message","output","error","exit","RUNTIME_ERROR","log","deployFlags"],"mappings":"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"}
|
package/dist/commands/dev.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { styleText } from 'node:util';
|
|
2
2
|
import { Flags } from '@oclif/core';
|
|
3
|
-
import { SanityCommand } from '@sanity/cli-core';
|
|
3
|
+
import { exitCodes, SanityCommand } from '@sanity/cli-core';
|
|
4
4
|
import { isWorkbenchApp } from '@sanity/workbench-cli';
|
|
5
5
|
import { devAction } from '../actions/dev/devAction.js';
|
|
6
6
|
import { devDebug } from '../actions/dev/devDebug.js';
|
|
@@ -65,7 +65,7 @@ export class DevCommand extends SanityCommand {
|
|
|
65
65
|
'red',
|
|
66
66
|
'bgBlack'
|
|
67
67
|
], `Failed to start dev server: ${error.message}`), {
|
|
68
|
-
exit:
|
|
68
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
71
|
}
|
package/dist/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/dev.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {type CliConfig, SanityCommand} from '@sanity/cli-core'\nimport {isWorkbenchApp} from '@sanity/workbench-cli'\n\nimport {devAction} from '../actions/dev/devAction.js'\nimport {devDebug} from '../actions/dev/devDebug.js'\nimport {determineIsApp} from '../util/determineIsApp.js'\n\n/**\n * Workbench apps never load in the Sanity dashboard, so `--load-in-dashboard`\n * has no effect for them. The flag is defaulted later in `run`, so an\n * `undefined` value here still means the user never passed it.\n */\nexport function shouldWarnDashboardFlagIgnored(\n cliConfig: CliConfig | undefined,\n loadInDashboard: boolean | undefined,\n): boolean {\n return isWorkbenchApp(cliConfig?.app) && loadInDashboard !== undefined\n}\n\nexport class DevCommand extends SanityCommand<typeof DevCommand> {\n static override description = 'Start a local development server with live reloading'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %> --host=0.0.0.0',\n '<%= config.bin %> <%= command.id %> --port=1942',\n '<%= config.bin %> <%= command.id %> --load-in-dashboard',\n ]\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n description: 'Automatically update Sanity Studio dependencies',\n }),\n host: Flags.string({\n description: 'Local network interface to listen on (default: localhost)',\n }),\n 'load-in-dashboard': Flags.boolean({\n allowNo: true,\n description: 'Load the app/studio in the Sanity dashboard',\n }),\n port: Flags.string({\n description: 'TCP port to start server on (default: 3333)',\n }),\n }\n\n public async run(): Promise<{close?: () => Promise<void>}> {\n const {flags} = await this.parse(DevCommand)\n\n const workDir = (await this.getProjectRoot()).directory\n const cliConfig = await this.getCliConfig()\n const isApp = determineIsApp(cliConfig)\n\n if (shouldWarnDashboardFlagIgnored(cliConfig, flags['load-in-dashboard'])) {\n this.output.warn(\n 'Ignoring --load-in-dashboard: workbench apps do not load in the Sanity dashboard',\n )\n }\n\n // load-in-dashboard is defaulted to true for apps.\n if (isApp && flags['load-in-dashboard'] === undefined) {\n flags['load-in-dashboard'] = true\n } else if (flags['load-in-dashboard'] === undefined) {\n // For non-apps, load-in-dashboard is defaulted to false.\n flags['load-in-dashboard'] = false\n }\n\n try {\n const result = await devAction({\n cliConfig,\n flags,\n isApp,\n output: this.output,\n workDir,\n })\n return result\n } catch (error) {\n devDebug(`Failed to start dev server`, error)\n this.output.error(\n styleText(['red', 'bgBlack'], `Failed to start dev server: ${error.message}`),\n {\n exit:
|
|
1
|
+
{"version":3,"sources":["../../src/commands/dev.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Flags} from '@oclif/core'\nimport {type CliConfig, exitCodes, SanityCommand} from '@sanity/cli-core'\nimport {isWorkbenchApp} from '@sanity/workbench-cli'\n\nimport {devAction} from '../actions/dev/devAction.js'\nimport {devDebug} from '../actions/dev/devDebug.js'\nimport {determineIsApp} from '../util/determineIsApp.js'\n\n/**\n * Workbench apps never load in the Sanity dashboard, so `--load-in-dashboard`\n * has no effect for them. The flag is defaulted later in `run`, so an\n * `undefined` value here still means the user never passed it.\n */\nexport function shouldWarnDashboardFlagIgnored(\n cliConfig: CliConfig | undefined,\n loadInDashboard: boolean | undefined,\n): boolean {\n return isWorkbenchApp(cliConfig?.app) && loadInDashboard !== undefined\n}\n\nexport class DevCommand extends SanityCommand<typeof DevCommand> {\n static override description = 'Start a local development server with live reloading'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %> --host=0.0.0.0',\n '<%= config.bin %> <%= command.id %> --port=1942',\n '<%= config.bin %> <%= command.id %> --load-in-dashboard',\n ]\n\n static override flags = {\n 'auto-updates': Flags.boolean({\n allowNo: true,\n description: 'Automatically update Sanity Studio dependencies',\n }),\n host: Flags.string({\n description: 'Local network interface to listen on (default: localhost)',\n }),\n 'load-in-dashboard': Flags.boolean({\n allowNo: true,\n description: 'Load the app/studio in the Sanity dashboard',\n }),\n port: Flags.string({\n description: 'TCP port to start server on (default: 3333)',\n }),\n }\n\n public async run(): Promise<{close?: () => Promise<void>}> {\n const {flags} = await this.parse(DevCommand)\n\n const workDir = (await this.getProjectRoot()).directory\n const cliConfig = await this.getCliConfig()\n const isApp = determineIsApp(cliConfig)\n\n if (shouldWarnDashboardFlagIgnored(cliConfig, flags['load-in-dashboard'])) {\n this.output.warn(\n 'Ignoring --load-in-dashboard: workbench apps do not load in the Sanity dashboard',\n )\n }\n\n // load-in-dashboard is defaulted to true for apps.\n if (isApp && flags['load-in-dashboard'] === undefined) {\n flags['load-in-dashboard'] = true\n } else if (flags['load-in-dashboard'] === undefined) {\n // For non-apps, load-in-dashboard is defaulted to false.\n flags['load-in-dashboard'] = false\n }\n\n try {\n const result = await devAction({\n cliConfig,\n flags,\n isApp,\n output: this.output,\n workDir,\n })\n return result\n } catch (error) {\n devDebug(`Failed to start dev server`, error)\n this.output.error(\n styleText(['red', 'bgBlack'], `Failed to start dev server: ${error.message}`),\n {\n exit: exitCodes.RUNTIME_ERROR,\n },\n )\n }\n }\n}\n"],"names":["styleText","Flags","exitCodes","SanityCommand","isWorkbenchApp","devAction","devDebug","determineIsApp","shouldWarnDashboardFlagIgnored","cliConfig","loadInDashboard","app","undefined","DevCommand","description","examples","flags","boolean","allowNo","host","string","port","run","parse","workDir","getProjectRoot","directory","getCliConfig","isApp","output","warn","result","error","message","exit","RUNTIME_ERROR"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAEnC,SAAQC,KAAK,QAAO,cAAa;AACjC,SAAwBC,SAAS,EAAEC,aAAa,QAAO,mBAAkB;AACzE,SAAQC,cAAc,QAAO,wBAAuB;AAEpD,SAAQC,SAAS,QAAO,8BAA6B;AACrD,SAAQC,QAAQ,QAAO,6BAA4B;AACnD,SAAQC,cAAc,QAAO,4BAA2B;AAExD;;;;CAIC,GACD,OAAO,SAASC,+BACdC,SAAgC,EAChCC,eAAoC;IAEpC,OAAON,eAAeK,WAAWE,QAAQD,oBAAoBE;AAC/D;AAEA,OAAO,MAAMC,mBAAmBV;IAC9B,OAAgBW,cAAc,uDAAsD;IAEpF,OAAgBC,WAAW;QACzB;QACA;QACA;KACD,CAAA;IAED,OAAgBC,QAAQ;QACtB,gBAAgBf,MAAMgB,OAAO,CAAC;YAC5BC,SAAS;YACTJ,aAAa;QACf;QACAK,MAAMlB,MAAMmB,MAAM,CAAC;YACjBN,aAAa;QACf;QACA,qBAAqBb,MAAMgB,OAAO,CAAC;YACjCC,SAAS;YACTJ,aAAa;QACf;QACAO,MAAMpB,MAAMmB,MAAM,CAAC;YACjBN,aAAa;QACf;IACF,EAAC;IAED,MAAaQ,MAA8C;QACzD,MAAM,EAACN,KAAK,EAAC,GAAG,MAAM,IAAI,CAACO,KAAK,CAACV;QAEjC,MAAMW,UAAU,AAAC,CAAA,MAAM,IAAI,CAACC,cAAc,EAAC,EAAGC,SAAS;QACvD,MAAMjB,YAAY,MAAM,IAAI,CAACkB,YAAY;QACzC,MAAMC,QAAQrB,eAAeE;QAE7B,IAAID,+BAA+BC,WAAWO,KAAK,CAAC,oBAAoB,GAAG;YACzE,IAAI,CAACa,MAAM,CAACC,IAAI,CACd;QAEJ;QAEA,mDAAmD;QACnD,IAAIF,SAASZ,KAAK,CAAC,oBAAoB,KAAKJ,WAAW;YACrDI,KAAK,CAAC,oBAAoB,GAAG;QAC/B,OAAO,IAAIA,KAAK,CAAC,oBAAoB,KAAKJ,WAAW;YACnD,yDAAyD;YACzDI,KAAK,CAAC,oBAAoB,GAAG;QAC/B;QAEA,IAAI;YACF,MAAMe,SAAS,MAAM1B,UAAU;gBAC7BI;gBACAO;gBACAY;gBACAC,QAAQ,IAAI,CAACA,MAAM;gBACnBL;YACF;YACA,OAAOO;QACT,EAAE,OAAOC,OAAO;YACd1B,SAAS,CAAC,0BAA0B,CAAC,EAAE0B;YACvC,IAAI,CAACH,MAAM,CAACG,KAAK,CACfhC,UAAU;gBAAC;gBAAO;aAAU,EAAE,CAAC,4BAA4B,EAAEgC,MAAMC,OAAO,EAAE,GAC5E;gBACEC,MAAMhC,UAAUiC,aAAa;YAC/B;QAEJ;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/docs/read.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\nimport open from 'open'\n\nimport {readDoc} from '../../services/docs.js'\n\ninterface DocsInput {\n readPath: string\n webPath: string\n}\n\nfunction isSanityHostname(hostname: string): boolean {\n return hostname === 'sanity.io' || hostname.endsWith('.sanity.io')\n}\n\nfunction parseDocsInput(input: string): DocsInput {\n try {\n const url = new URL(input)\n\n if (isSanityHostname(url.hostname)) {\n return {\n readPath: url.pathname,\n webPath: `${url.pathname}${url.search}${url.hash}`,\n }\n }\n } catch {\n // Input is not an absolute URL.\n }\n\n if (input.startsWith('/') && !input.startsWith('//')) {\n const url = new URL(input, 'https://www.sanity.io')\n\n return {\n readPath: url.pathname,\n webPath: `${url.pathname}${url.search}${url.hash}`,\n }\n }\n\n return {\n readPath: input,\n webPath: input,\n }\n}\n\nexport class DocsReadCommand extends SanityCommand<typeof DocsReadCommand> {\n static override args = {\n path: Args.string({\n description: 'Path or URL to article, found in search results and docs content as links',\n required: true,\n }),\n }\n\n static override description = 'Read an article in terminal'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> /docs/studio/installation',\n description: 'Read as markdown in terminal',\n },\n {\n command: '<%= config.bin %> <%= command.id %> https://www.sanity.io/docs/studio/installation',\n description: 'Read using full URL',\n },\n {\n command: '<%= config.bin %> <%= command.id %> /docs/studio/installation --web',\n description: 'Open in web browser',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> https://www.sanity.io/docs/studio/installation -w',\n description: 'Open using full URL in web browser',\n },\n ]\n\n static override flags = {\n web: Flags.boolean({\n aliases: ['w'],\n description: 'Open in a web browser',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DocsReadCommand)\n const {path: input} = args\n const {web} = flags\n\n const {readPath, webPath} = parseDocsInput(input)\n\n if (!readPath.startsWith('/')) {\n this.error(\n 'Invalid path or URL. Expected a Sanity docs path or URL.\\nExamples:\\n /docs/studio/installation\\n https://www.sanity.io/docs/studio/installation',\n {\n exit: exitCodes.USAGE_ERROR,\n },\n )\n }\n\n if (readPath.includes('..') || !readPath.startsWith('/docs/')) {\n this.error(\n 'Invalid path. Must be a valid Sanity docs path starting with /docs/\\nExample: /docs/studio/installation',\n {\n exit: exitCodes.USAGE_ERROR,\n },\n )\n }\n\n if (web) {\n const url = `https://www.sanity.io${webPath}`\n this.log(`Opening ${url}`)\n await open(url)\n return\n }\n\n this.log(`Reading article: ${readPath}`)\n\n try {\n const content = await readDoc({path: readPath})\n this.log('\\n---\\n')\n this.log(content)\n } catch (error) {\n this.error(error instanceof Error ? error.message : 'Failed to read article', {\n exit:
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/docs/read.ts"],"sourcesContent":["import {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\nimport open from 'open'\n\nimport {readDoc} from '../../services/docs.js'\n\ninterface DocsInput {\n readPath: string\n webPath: string\n}\n\nfunction isSanityHostname(hostname: string): boolean {\n return hostname === 'sanity.io' || hostname.endsWith('.sanity.io')\n}\n\nfunction parseDocsInput(input: string): DocsInput {\n try {\n const url = new URL(input)\n\n if (isSanityHostname(url.hostname)) {\n return {\n readPath: url.pathname,\n webPath: `${url.pathname}${url.search}${url.hash}`,\n }\n }\n } catch {\n // Input is not an absolute URL.\n }\n\n if (input.startsWith('/') && !input.startsWith('//')) {\n const url = new URL(input, 'https://www.sanity.io')\n\n return {\n readPath: url.pathname,\n webPath: `${url.pathname}${url.search}${url.hash}`,\n }\n }\n\n return {\n readPath: input,\n webPath: input,\n }\n}\n\nexport class DocsReadCommand extends SanityCommand<typeof DocsReadCommand> {\n static override args = {\n path: Args.string({\n description: 'Path or URL to article, found in search results and docs content as links',\n required: true,\n }),\n }\n\n static override description = 'Read an article in terminal'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> /docs/studio/installation',\n description: 'Read as markdown in terminal',\n },\n {\n command: '<%= config.bin %> <%= command.id %> https://www.sanity.io/docs/studio/installation',\n description: 'Read using full URL',\n },\n {\n command: '<%= config.bin %> <%= command.id %> /docs/studio/installation --web',\n description: 'Open in web browser',\n },\n {\n command:\n '<%= config.bin %> <%= command.id %> https://www.sanity.io/docs/studio/installation -w',\n description: 'Open using full URL in web browser',\n },\n ]\n\n static override flags = {\n web: Flags.boolean({\n aliases: ['w'],\n description: 'Open in a web browser',\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DocsReadCommand)\n const {path: input} = args\n const {web} = flags\n\n const {readPath, webPath} = parseDocsInput(input)\n\n if (!readPath.startsWith('/')) {\n this.error(\n 'Invalid path or URL. Expected a Sanity docs path or URL.\\nExamples:\\n /docs/studio/installation\\n https://www.sanity.io/docs/studio/installation',\n {\n exit: exitCodes.USAGE_ERROR,\n },\n )\n }\n\n if (readPath.includes('..') || !readPath.startsWith('/docs/')) {\n this.error(\n 'Invalid path. Must be a valid Sanity docs path starting with /docs/\\nExample: /docs/studio/installation',\n {\n exit: exitCodes.USAGE_ERROR,\n },\n )\n }\n\n if (web) {\n const url = `https://www.sanity.io${webPath}`\n this.log(`Opening ${url}`)\n await open(url)\n return\n }\n\n this.log(`Reading article: ${readPath}`)\n\n try {\n const content = await readDoc({path: readPath})\n this.log('\\n---\\n')\n this.log(content)\n } catch (error) {\n this.error(error instanceof Error ? error.message : 'Failed to read article', {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n }\n}\n"],"names":["Args","Flags","exitCodes","SanityCommand","open","readDoc","isSanityHostname","hostname","endsWith","parseDocsInput","input","url","URL","readPath","pathname","webPath","search","hash","startsWith","DocsReadCommand","args","path","string","description","required","examples","command","flags","web","boolean","aliases","run","parse","error","exit","USAGE_ERROR","includes","log","content","Error","message","RUNTIME_ERROR"],"mappings":"AAAA,SAAQA,IAAI,EAAEC,KAAK,QAAO,cAAa;AACvC,SAAQC,SAAS,EAAEC,aAAa,QAAO,mBAAkB;AACzD,OAAOC,UAAU,OAAM;AAEvB,SAAQC,OAAO,QAAO,yBAAwB;AAO9C,SAASC,iBAAiBC,QAAgB;IACxC,OAAOA,aAAa,eAAeA,SAASC,QAAQ,CAAC;AACvD;AAEA,SAASC,eAAeC,KAAa;IACnC,IAAI;QACF,MAAMC,MAAM,IAAIC,IAAIF;QAEpB,IAAIJ,iBAAiBK,IAAIJ,QAAQ,GAAG;YAClC,OAAO;gBACLM,UAAUF,IAAIG,QAAQ;gBACtBC,SAAS,GAAGJ,IAAIG,QAAQ,GAAGH,IAAIK,MAAM,GAAGL,IAAIM,IAAI,EAAE;YACpD;QACF;IACF,EAAE,OAAM;IACN,gCAAgC;IAClC;IAEA,IAAIP,MAAMQ,UAAU,CAAC,QAAQ,CAACR,MAAMQ,UAAU,CAAC,OAAO;QACpD,MAAMP,MAAM,IAAIC,IAAIF,OAAO;QAE3B,OAAO;YACLG,UAAUF,IAAIG,QAAQ;YACtBC,SAAS,GAAGJ,IAAIG,QAAQ,GAAGH,IAAIK,MAAM,GAAGL,IAAIM,IAAI,EAAE;QACpD;IACF;IAEA,OAAO;QACLJ,UAAUH;QACVK,SAASL;IACX;AACF;AAEA,OAAO,MAAMS,wBAAwBhB;IACnC,OAAgBiB,OAAO;QACrBC,MAAMrB,KAAKsB,MAAM,CAAC;YAChBC,aAAa;YACbC,UAAU;QACZ;IACF,EAAC;IAED,OAAgBD,cAAc,8BAA6B;IAE3D,OAAgBE,WAAW;QACzB;YACEC,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SAAS;YACTH,aAAa;QACf;QACA;YACEG,SACE;YACFH,aAAa;QACf;KACD,CAAA;IAED,OAAgBI,QAAQ;QACtBC,KAAK3B,MAAM4B,OAAO,CAAC;YACjBC,SAAS;gBAAC;aAAI;YACdP,aAAa;QACf;IACF,EAAC;IAED,MAAaQ,MAAqB;QAChC,MAAM,EAACX,IAAI,EAAEO,KAAK,EAAC,GAAG,MAAM,IAAI,CAACK,KAAK,CAACb;QACvC,MAAM,EAACE,MAAMX,KAAK,EAAC,GAAGU;QACtB,MAAM,EAACQ,GAAG,EAAC,GAAGD;QAEd,MAAM,EAACd,QAAQ,EAAEE,OAAO,EAAC,GAAGN,eAAeC;QAE3C,IAAI,CAACG,SAASK,UAAU,CAAC,MAAM;YAC7B,IAAI,CAACe,KAAK,CACR,sJACA;gBACEC,MAAMhC,UAAUiC,WAAW;YAC7B;QAEJ;QAEA,IAAItB,SAASuB,QAAQ,CAAC,SAAS,CAACvB,SAASK,UAAU,CAAC,WAAW;YAC7D,IAAI,CAACe,KAAK,CACR,2GACA;gBACEC,MAAMhC,UAAUiC,WAAW;YAC7B;QAEJ;QAEA,IAAIP,KAAK;YACP,MAAMjB,MAAM,CAAC,qBAAqB,EAAEI,SAAS;YAC7C,IAAI,CAACsB,GAAG,CAAC,CAAC,QAAQ,EAAE1B,KAAK;YACzB,MAAMP,KAAKO;YACX;QACF;QAEA,IAAI,CAAC0B,GAAG,CAAC,CAAC,iBAAiB,EAAExB,UAAU;QAEvC,IAAI;YACF,MAAMyB,UAAU,MAAMjC,QAAQ;gBAACgB,MAAMR;YAAQ;YAC7C,IAAI,CAACwB,GAAG,CAAC;YACT,IAAI,CAACA,GAAG,CAACC;QACX,EAAE,OAAOL,OAAO;YACd,IAAI,CAACA,KAAK,CAACA,iBAAiBM,QAAQN,MAAMO,OAAO,GAAG,0BAA0B;gBAC5EN,MAAMhC,UAAUuC,aAAa;YAC/B;QACF;IACF;AACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { styleText } from 'node:util';
|
|
2
2
|
import { Args, Flags } from '@oclif/core';
|
|
3
|
-
import { isInteractive, SanityCommand, subdebug } from '@sanity/cli-core';
|
|
3
|
+
import { exitCodes, isInteractive, SanityCommand, subdebug } from '@sanity/cli-core';
|
|
4
4
|
import { select } from '@sanity/cli-core/ux';
|
|
5
5
|
import { readDoc, searchDocs } from '../../services/docs.js';
|
|
6
6
|
const searchDebug = subdebug('docs:search');
|
|
@@ -52,7 +52,7 @@ export class DocsSearchCommand extends SanityCommand {
|
|
|
52
52
|
searchDebug('error fetching results', error);
|
|
53
53
|
const message = error instanceof Error ? error.message : 'The documentation search API is currently unavailable. Please try again later.';
|
|
54
54
|
this.error(message, {
|
|
55
|
-
exit:
|
|
55
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
58
|
this.log(`\nFound ${results.length} result(s):\n`);
|
|
@@ -100,7 +100,7 @@ export class DocsSearchCommand extends SanityCommand {
|
|
|
100
100
|
this.log(content);
|
|
101
101
|
} catch (error) {
|
|
102
102
|
this.error(`Failed to read article: ${error instanceof Error ? error.message : 'Unknown error'}`, {
|
|
103
|
-
exit:
|
|
103
|
+
exit: exitCodes.RUNTIME_ERROR
|
|
104
104
|
});
|
|
105
105
|
}
|
|
106
106
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/commands/docs/search.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {isInteractive, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {readDoc, searchDocs, type SearchResult} from '../../services/docs.js'\n\nconst searchDebug = subdebug('docs:search')\n\nexport class DocsSearchCommand extends SanityCommand<typeof DocsSearchCommand> {\n static override args = {\n query: Args.string({\n description: 'Search query for documentation',\n required: true,\n }),\n }\n\n static override description = 'Search Sanity docs'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> schema',\n description: 'Search for documentation about schemas',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"groq functions\"',\n description: 'Search with phrase',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"deployment\" --limit=5',\n description: 'Limit search results',\n },\n ]\n\n static override flags = {\n limit: Flags.integer({\n default: 10,\n description: 'Maximum number of results to return',\n min: 1,\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DocsSearchCommand)\n const {query} = args\n const {limit} = flags\n\n this.log(`Searching documentation for: \"${query}\"`)\n\n let results: SearchResult[]\n try {\n results = await searchDocs({\n limit,\n query,\n })\n\n if (results.length === 0) {\n this.log('No results found. Try a different search term.')\n return\n }\n } catch (error) {\n searchDebug('error fetching results', error)\n const message =\n error instanceof Error\n ? error.message\n : 'The documentation search API is currently unavailable. Please try again later.'\n this.error(message, {\n exit:
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/docs/search.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, isInteractive, SanityCommand, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {readDoc, searchDocs, type SearchResult} from '../../services/docs.js'\n\nconst searchDebug = subdebug('docs:search')\n\nexport class DocsSearchCommand extends SanityCommand<typeof DocsSearchCommand> {\n static override args = {\n query: Args.string({\n description: 'Search query for documentation',\n required: true,\n }),\n }\n\n static override description = 'Search Sanity docs'\n\n static override examples = [\n {\n command: '<%= config.bin %> <%= command.id %> schema',\n description: 'Search for documentation about schemas',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"groq functions\"',\n description: 'Search with phrase',\n },\n {\n command: '<%= config.bin %> <%= command.id %> \"deployment\" --limit=5',\n description: 'Limit search results',\n },\n ]\n\n static override flags = {\n limit: Flags.integer({\n default: 10,\n description: 'Maximum number of results to return',\n min: 1,\n }),\n }\n\n public async run(): Promise<void> {\n const {args, flags} = await this.parse(DocsSearchCommand)\n const {query} = args\n const {limit} = flags\n\n this.log(`Searching documentation for: \"${query}\"`)\n\n let results: SearchResult[]\n try {\n results = await searchDocs({\n limit,\n query,\n })\n\n if (results.length === 0) {\n this.log('No results found. Try a different search term.')\n return\n }\n } catch (error) {\n searchDebug('error fetching results', error)\n const message =\n error instanceof Error\n ? error.message\n : 'The documentation search API is currently unavailable. Please try again later.'\n this.error(message, {\n exit: exitCodes.RUNTIME_ERROR,\n })\n }\n\n this.log(`\\nFound ${results.length} result(s):\\n`)\n\n for (const [index, result] of results.entries()) {\n this.log(`${index + 1}. ${result.title}`)\n this.log(` ${styleText('cyan', `URL: https://www.sanity.io${result.path}`)}`)\n if (result.description) {\n this.log(` ${result.description}`)\n }\n this.log('')\n }\n\n // Show usage hint in non-interactive mode\n if (!isInteractive()) {\n this.log('Use `sanity docs read <url>` to read an article in terminal.')\n this.log('Use `sanity docs read <path>` to follow links found within articles.')\n this.log('')\n return\n }\n\n // Interactive selection (only in interactive environments)\n if (results.length > 0) {\n const choices = results.map((result, index) => ({\n description: result.description,\n name: `${index + 1}. ${result.title} (${result.path})`,\n value: index,\n }))\n\n const selectedIndex = await select({\n choices: [...choices, {description: 'Exit without reading', name: 'Exit', value: -1}],\n message: 'Select an article to read in terminal:',\n })\n\n if (typeof selectedIndex === 'number' && selectedIndex >= 0) {\n const selected = results[selectedIndex]\n\n try {\n // Read and display the article\n const content = await readDoc({path: selected.path})\n this.log('\\n---\\n')\n this.log(content)\n } catch (error) {\n this.error(\n `Failed to read article: ${error instanceof Error ? error.message : 'Unknown error'}`,\n {\n exit: exitCodes.RUNTIME_ERROR,\n },\n )\n }\n }\n }\n }\n}\n"],"names":["styleText","Args","Flags","exitCodes","isInteractive","SanityCommand","subdebug","select","readDoc","searchDocs","searchDebug","DocsSearchCommand","args","query","string","description","required","examples","command","flags","limit","integer","default","min","run","parse","log","results","length","error","message","Error","exit","RUNTIME_ERROR","index","result","entries","title","path","choices","map","name","value","selectedIndex","selected","content"],"mappings":"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"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { styleText } from 'node:util';
|
|
2
2
|
import { Args, Flags } from '@oclif/core';
|
|
3
|
-
import { SanityCommand } from '@sanity/cli-core';
|
|
3
|
+
import { exitCodes, SanityCommand } from '@sanity/cli-core';
|
|
4
4
|
import { logSymbols } from '@sanity/cli-core/ux';
|
|
5
5
|
import { doctorChecks, KNOWN_CHECKS } from '../actions/doctor/checks/index.js';
|
|
6
6
|
import { runDoctorChecks } from '../actions/doctor/runDoctorChecks.js';
|
|
@@ -54,7 +54,7 @@ export class DoctorCommand extends SanityCommand {
|
|
|
54
54
|
checks = getChecks(argv);
|
|
55
55
|
} catch (err) {
|
|
56
56
|
return this.output.error(err instanceof Error ? err.message : String(err), {
|
|
57
|
-
exit:
|
|
57
|
+
exit: exitCodes.USAGE_ERROR
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
60
|
const cwd = process.cwd();
|
|
@@ -74,7 +74,7 @@ export class DoctorCommand extends SanityCommand {
|
|
|
74
74
|
}
|
|
75
75
|
// Exit with error code if any checks failed
|
|
76
76
|
if (results.summary.errors > 0) {
|
|
77
|
-
return this.exit(
|
|
77
|
+
return this.exit(exitCodes.RUNTIME_ERROR);
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
printCheck(check) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/doctor.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {SanityCommand} from '@sanity/cli-core'\nimport {logSymbols} from '@sanity/cli-core/ux'\n\nimport {type DoctorCheckName, doctorChecks, KNOWN_CHECKS} from '../actions/doctor/checks/index.js'\nimport {runDoctorChecks} from '../actions/doctor/runDoctorChecks.js'\nimport {\n type CheckMessage,\n type CheckResultStatus,\n type CheckResultWithMeta,\n type DoctorCheck,\n type DoctorResults,\n type MessageType,\n} from '../actions/doctor/types.js'\n\nconst STATUS_SYMBOLS: Record<CheckResultStatus, string> = {\n error: logSymbols.error,\n passed: logSymbols.success,\n warning: logSymbols.warning,\n}\n\nconst MESSAGE_SYMBOLS: Record<MessageType, string> = {\n error: logSymbols.error,\n info: logSymbols.info,\n success: logSymbols.success,\n warning: logSymbols.warning,\n}\n\nexport class DoctorCommand extends SanityCommand<typeof DoctorCommand> {\n // strict=false allows variadic args — validation is handled by getChecks().\n // options is omitted here because oclif's help formatter uses it for display,\n // but actual validation is done explicitly in getChecks() for clear error messages.\n static override args = {\n checks: Args.string({\n description: `Checks to enable (defaults to all). Valid: ${KNOWN_CHECKS.join(', ')}`,\n multiple: true,\n required: false,\n }),\n }\n\n static override description = 'Run diagnostics on your Sanity project'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %>',\n {command: '<%= config.bin %> <%= command.id %> --json', description: 'Output results as JSON'},\n {\n command: '<%= config.bin %> <%= command.id %> cli',\n description: 'Only run CLI-related diagnostics',\n },\n ]\n\n static override flags = {\n json: Flags.boolean({\n char: 'j',\n default: false,\n description: 'Output results as JSON',\n }),\n }\n\n // Needed for variable argument count\n static override strict = false\n\n public async run(): Promise<void> {\n const {argv, flags} = await this.parse(DoctorCommand)\n\n let checks: Array<DoctorCheck>\n try {\n checks = getChecks(argv)\n } catch (err) {\n return this.output.error(err instanceof Error ? err.message : String(err), {exit:
|
|
1
|
+
{"version":3,"sources":["../../src/commands/doctor.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {Args, Flags} from '@oclif/core'\nimport {exitCodes, SanityCommand} from '@sanity/cli-core'\nimport {logSymbols} from '@sanity/cli-core/ux'\n\nimport {type DoctorCheckName, doctorChecks, KNOWN_CHECKS} from '../actions/doctor/checks/index.js'\nimport {runDoctorChecks} from '../actions/doctor/runDoctorChecks.js'\nimport {\n type CheckMessage,\n type CheckResultStatus,\n type CheckResultWithMeta,\n type DoctorCheck,\n type DoctorResults,\n type MessageType,\n} from '../actions/doctor/types.js'\n\nconst STATUS_SYMBOLS: Record<CheckResultStatus, string> = {\n error: logSymbols.error,\n passed: logSymbols.success,\n warning: logSymbols.warning,\n}\n\nconst MESSAGE_SYMBOLS: Record<MessageType, string> = {\n error: logSymbols.error,\n info: logSymbols.info,\n success: logSymbols.success,\n warning: logSymbols.warning,\n}\n\nexport class DoctorCommand extends SanityCommand<typeof DoctorCommand> {\n // strict=false allows variadic args — validation is handled by getChecks().\n // options is omitted here because oclif's help formatter uses it for display,\n // but actual validation is done explicitly in getChecks() for clear error messages.\n static override args = {\n checks: Args.string({\n description: `Checks to enable (defaults to all). Valid: ${KNOWN_CHECKS.join(', ')}`,\n multiple: true,\n required: false,\n }),\n }\n\n static override description = 'Run diagnostics on your Sanity project'\n\n static override examples = [\n '<%= config.bin %> <%= command.id %>',\n {command: '<%= config.bin %> <%= command.id %> --json', description: 'Output results as JSON'},\n {\n command: '<%= config.bin %> <%= command.id %> cli',\n description: 'Only run CLI-related diagnostics',\n },\n ]\n\n static override flags = {\n json: Flags.boolean({\n char: 'j',\n default: false,\n description: 'Output results as JSON',\n }),\n }\n\n // Needed for variable argument count\n static override strict = false\n\n public async run(): Promise<void> {\n const {argv, flags} = await this.parse(DoctorCommand)\n\n let checks: Array<DoctorCheck>\n try {\n checks = getChecks(argv)\n } catch (err) {\n return this.output.error(err instanceof Error ? err.message : String(err), {\n exit: exitCodes.USAGE_ERROR,\n })\n }\n const cwd = process.cwd()\n\n if (!flags.json) {\n this.output.log('Running diagnostics...\\n')\n }\n\n const results = await runDoctorChecks({cwd}, checks)\n\n if (flags.json) {\n this.output.log(JSON.stringify(results, null, 2))\n } else {\n for (const check of results.checks) {\n this.printCheck(check)\n }\n\n this.printSummary(results.summary)\n }\n\n // Exit with error code if any checks failed\n if (results.summary.errors > 0) {\n return this.exit(exitCodes.RUNTIME_ERROR)\n }\n }\n\n private printCheck(check: CheckResultWithMeta): void {\n const symbol = STATUS_SYMBOLS[check.status]\n const title =\n check.status === 'passed'\n ? check.title\n : styleText(check.status === 'error' ? 'red' : 'yellow', check.title)\n\n this.output.log(`${symbol} ${title}`)\n\n for (const message of check.messages) {\n this.printMessage(message)\n }\n\n this.output.log('') // Empty line between checks\n }\n\n private printMessage(message: CheckMessage): void {\n const symbol = MESSAGE_SYMBOLS[message.type]\n const text =\n message.type === 'error'\n ? styleText('red', message.text)\n : message.type === 'warning'\n ? styleText('yellow', message.text)\n : message.text\n\n this.output.log(` ${symbol} ${text}`)\n\n if (message.suggestions?.length) {\n for (const suggestion of message.suggestions) {\n this.output.log(` ${styleText('dim', '→')} ${suggestion}`)\n }\n }\n }\n\n private printSummary(summary: DoctorResults['summary']): void {\n const parts: string[] = []\n\n if (summary.passed > 0) {\n parts.push(styleText('green', `${summary.passed} passed`))\n }\n if (summary.warnings > 0) {\n parts.push(\n styleText('yellow', `${summary.warnings} warning${summary.warnings === 1 ? '' : 's'}`),\n )\n }\n if (summary.errors > 0) {\n parts.push(styleText('red', `${summary.errors} error${summary.errors === 1 ? '' : 's'}`))\n }\n\n this.output.log(`Summary: ${parts.join(', ')}`)\n }\n}\n\nfunction getChecks(argv: unknown[]): Array<DoctorCheck> {\n // strict=false means oclif does NOT validate Args.string({ options }) — we must\n // validate explicitly. Filter to string args that aren't flags.\n const stringArgs = argv.filter(\n (item): item is string => typeof item === 'string' && !item.startsWith('-'),\n )\n\n const unknownChecks = stringArgs.filter(\n (item) => !(KNOWN_CHECKS as readonly string[]).includes(item),\n )\n if (unknownChecks.length > 0) {\n throw new Error(\n `Unknown check${unknownChecks.length === 1 ? '' : 's'}: ${unknownChecks.join(', ')}. Valid checks: ${KNOWN_CHECKS.join(', ')}`,\n )\n }\n\n const checkNames = stringArgs as DoctorCheckName[]\n return checkNames.length > 0\n ? checkNames.map((check) => doctorChecks[check])\n : Object.values(doctorChecks)\n}\n"],"names":["styleText","Args","Flags","exitCodes","SanityCommand","logSymbols","doctorChecks","KNOWN_CHECKS","runDoctorChecks","STATUS_SYMBOLS","error","passed","success","warning","MESSAGE_SYMBOLS","info","DoctorCommand","args","checks","string","description","join","multiple","required","examples","command","flags","json","boolean","char","default","strict","run","argv","parse","getChecks","err","output","Error","message","String","exit","USAGE_ERROR","cwd","process","log","results","JSON","stringify","check","printCheck","printSummary","summary","errors","RUNTIME_ERROR","symbol","status","title","messages","printMessage","type","text","suggestions","length","suggestion","parts","push","warnings","stringArgs","filter","item","startsWith","unknownChecks","includes","checkNames","map","Object","values"],"mappings":"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"}
|