@sanity/cli 6.4.0 → 6.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +14 -8
  2. package/dist/actions/build/buildApp.js +12 -4
  3. package/dist/actions/build/buildApp.js.map +1 -1
  4. package/dist/actions/build/buildStaticFiles.js +3 -1
  5. package/dist/actions/build/buildStaticFiles.js.map +1 -1
  6. package/dist/actions/build/buildStudio.js +29 -7
  7. package/dist/actions/build/buildStudio.js.map +1 -1
  8. package/dist/actions/build/buildVendorDependencies.js +7 -7
  9. package/dist/actions/build/buildVendorDependencies.js.map +1 -1
  10. package/dist/actions/build/checkRequiredDependencies.js +4 -4
  11. package/dist/actions/build/checkRequiredDependencies.js.map +1 -1
  12. package/dist/actions/build/checkStudioDependencyVersions.js +9 -9
  13. package/dist/actions/build/checkStudioDependencyVersions.js.map +1 -1
  14. package/dist/actions/build/getAutoUpdatesImportMap.js +9 -0
  15. package/dist/actions/build/getAutoUpdatesImportMap.js.map +1 -1
  16. package/dist/actions/build/getViteConfig.js +2 -1
  17. package/dist/actions/build/getViteConfig.js.map +1 -1
  18. package/dist/actions/build/renderDocument.js.map +1 -1
  19. package/dist/actions/build/renderDocumentWorker/addTimestampImportMapScriptToHtml.js +34 -14
  20. package/dist/actions/build/renderDocumentWorker/addTimestampImportMapScriptToHtml.js.map +1 -1
  21. package/dist/actions/build/renderDocumentWorker/getDocumentHtml.js +2 -2
  22. package/dist/actions/build/renderDocumentWorker/getDocumentHtml.js.map +1 -1
  23. package/dist/actions/build/renderDocumentWorker/renderDocumentWorker.js +2 -2
  24. package/dist/actions/build/renderDocumentWorker/renderDocumentWorker.js.map +1 -1
  25. package/dist/actions/codemods/reactIconsV3.js +2 -2
  26. package/dist/actions/codemods/reactIconsV3.js.map +1 -1
  27. package/dist/actions/dev/startStudioDevServer.js +2 -2
  28. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  29. package/dist/actions/doctor/types.js.map +1 -1
  30. package/dist/actions/graphql/resolveGraphQLApisFromWorkspaces.js.map +1 -1
  31. package/dist/actions/init/bootstrapTemplate.js.map +1 -1
  32. package/dist/actions/init/checkNextJsReactCompatibility.js +3 -3
  33. package/dist/actions/init/checkNextJsReactCompatibility.js.map +1 -1
  34. package/dist/actions/init/initAction.js +287 -0
  35. package/dist/actions/init/initAction.js.map +1 -0
  36. package/dist/actions/init/initApp.js +7 -16
  37. package/dist/actions/init/initApp.js.map +1 -1
  38. package/dist/actions/init/initError.js +10 -0
  39. package/dist/actions/init/initError.js.map +1 -0
  40. package/dist/actions/init/initHelpers.js +3 -12
  41. package/dist/actions/init/initHelpers.js.map +1 -1
  42. package/dist/actions/init/initNextJs.js +17 -20
  43. package/dist/actions/init/initNextJs.js.map +1 -1
  44. package/dist/actions/init/initStudio.js +11 -20
  45. package/dist/actions/init/initStudio.js.map +1 -1
  46. package/dist/actions/init/plan/getPlan.js +15 -0
  47. package/dist/actions/init/plan/getPlan.js.map +1 -0
  48. package/dist/actions/init/plan/verifyCoupon.js +35 -0
  49. package/dist/actions/init/plan/verifyCoupon.js.map +1 -0
  50. package/dist/actions/init/plan/verifyPlan.js +34 -0
  51. package/dist/actions/init/plan/verifyPlan.js.map +1 -0
  52. package/dist/actions/init/project/createProjectFromName.js +44 -0
  53. package/dist/actions/init/project/createProjectFromName.js.map +1 -0
  54. package/dist/actions/init/project/getOrCreateDataset.js +126 -0
  55. package/dist/actions/init/project/getOrCreateDataset.js.map +1 -0
  56. package/dist/actions/init/project/getOrCreateProject.js +128 -0
  57. package/dist/actions/init/project/getOrCreateProject.js.map +1 -0
  58. package/dist/actions/init/project/getProjectDetails.js +87 -0
  59. package/dist/actions/init/project/getProjectDetails.js.map +1 -0
  60. package/dist/actions/init/project/getProjectOutputPath.js +17 -0
  61. package/dist/actions/init/project/getProjectOutputPath.js.map +1 -0
  62. package/dist/actions/init/project/promptForAppTemplateSetup.js +112 -0
  63. package/dist/actions/init/project/promptForAppTemplateSetup.js.map +1 -0
  64. package/dist/actions/init/project/promptForProjectCreation.js +40 -0
  65. package/dist/actions/init/project/promptForProjectCreation.js.map +1 -0
  66. package/dist/actions/init/project/promptUserForNewOrganization.js +12 -0
  67. package/dist/actions/init/project/promptUserForNewOrganization.js.map +1 -0
  68. package/dist/actions/init/project/promptUserForOrganization.js +38 -0
  69. package/dist/actions/init/project/promptUserForOrganization.js.map +1 -0
  70. package/dist/actions/init/scaffoldTemplate.js +23 -29
  71. package/dist/actions/init/scaffoldTemplate.js.map +1 -1
  72. package/dist/actions/init/types.js +47 -1
  73. package/dist/actions/init/types.js.map +1 -1
  74. package/dist/actions/manifest/types.js +0 -1
  75. package/dist/actions/manifest/types.js.map +1 -1
  76. package/dist/actions/versions/buildPackageArray.js +2 -2
  77. package/dist/actions/versions/buildPackageArray.js.map +1 -1
  78. package/dist/actions/versions/findSanityModulesVersions.js +3 -3
  79. package/dist/actions/versions/findSanityModulesVersions.js.map +1 -1
  80. package/dist/commands/datasets/copy.js.map +1 -1
  81. package/dist/commands/init.js +11 -911
  82. package/dist/commands/init.js.map +1 -1
  83. package/dist/server/vite/plugin-sanity-build-entries.js +2 -1
  84. package/dist/server/vite/plugin-sanity-build-entries.js.map +1 -1
  85. package/dist/services/datasets.js.map +1 -1
  86. package/dist/telemetry/init.telemetry.js.map +1 -1
  87. package/dist/util/compareDependencyVersions.js +4 -4
  88. package/dist/util/compareDependencyVersions.js.map +1 -1
  89. package/dist/util/createExpiringConfig.js +1 -1
  90. package/dist/util/createExpiringConfig.js.map +1 -1
  91. package/dist/util/packageManager/installationInfo/analyzeIssues.js +7 -7
  92. package/dist/util/packageManager/installationInfo/analyzeIssues.js.map +1 -1
  93. package/dist/util/packageManager/installationInfo/types.js.map +1 -1
  94. package/dist/util/packageManager/packageManagerChoice.js +2 -2
  95. package/dist/util/packageManager/packageManagerChoice.js.map +1 -1
  96. package/dist/util/packageManager/preferredPm.js +106 -0
  97. package/dist/util/packageManager/preferredPm.js.map +1 -0
  98. package/oclif.manifest.json +526 -526
  99. package/package.json +23 -22
@@ -0,0 +1,10 @@
1
+ export class InitError extends Error {
2
+ exitCode;
3
+ name = 'InitError';
4
+ constructor(message, exitCode = 1){
5
+ super(message);
6
+ this.exitCode = exitCode;
7
+ }
8
+ }
9
+
10
+ //# sourceMappingURL=initError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/init/initError.ts"],"sourcesContent":["export class InitError extends Error {\n exitCode: number\n override name = 'InitError'\n\n constructor(message: string, exitCode = 1) {\n super(message)\n this.exitCode = exitCode\n }\n}\n"],"names":["InitError","Error","exitCode","name","message"],"mappings":"AAAA,OAAO,MAAMA,kBAAkBC;IAC7BC,SAAgB;IACPC,OAAO,YAAW;IAE3B,YAAYC,OAAe,EAAEF,WAAW,CAAC,CAAE;QACzC,KAAK,CAACE;QACN,IAAI,CAACF,QAAQ,GAAGA;IAClB;AACF"}
@@ -1,25 +1,16 @@
1
1
  import { getSanityEnv } from '../../util/getSanityEnv.js';
2
2
  import { createOrAppendEnvVars } from './env/createOrAppendEnvVars.js';
3
3
  import { fetchPostInitPrompt } from './fetchPostInitPrompt.js';
4
- /**
5
- * Returns `true` when the user should be prompted for a flag value:
6
- * i.e. we are NOT in unattended mode AND the flag was not explicitly provided.
7
- */ export function shouldPrompt(unattended, flagValue) {
4
+ export function shouldPrompt(unattended, flagValue) {
8
5
  return !unattended && flagValue === undefined;
9
6
  }
10
- /**
11
- * Returns the flag value if it is a boolean, otherwise returns the default.
12
- */ export function flagOrDefault(flagValue, defaultValue) {
7
+ export function flagOrDefault(flagValue, defaultValue) {
13
8
  return typeof flagValue === 'boolean' ? flagValue : defaultValue;
14
9
  }
15
10
  export async function getPostInitMCPPrompt(editorsNames) {
16
11
  return fetchPostInitPrompt(new Intl.ListFormat('en').format(editorsNames));
17
12
  }
18
- /**
19
- * When running in a non-production Sanity environment (e.g. staging), write the
20
- * `SANITY_INTERNAL_ENV` variable to a `.env` file in the output directory so that
21
- * the bootstrapped project continues to target the same environment.
22
- */ export async function writeStagingEnvIfNeeded(output, outputPath) {
13
+ export async function writeStagingEnvIfNeeded(output, outputPath) {
23
14
  const sanityEnv = getSanityEnv();
24
15
  if (sanityEnv === 'production') return;
25
16
  await createOrAppendEnvVars({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/init/initHelpers.ts"],"sourcesContent":["import {type Output} from '@sanity/cli-core'\n\nimport {getSanityEnv} from '../../util/getSanityEnv.js'\nimport {type EditorName} from '../mcp/editorConfigs.js'\nimport {createOrAppendEnvVars} from './env/createOrAppendEnvVars.js'\nimport {fetchPostInitPrompt} from './fetchPostInitPrompt.js'\n\n/**\n * Returns `true` when the user should be prompted for a flag value:\n * i.e. we are NOT in unattended mode AND the flag was not explicitly provided.\n */\nexport function shouldPrompt(unattended: boolean, flagValue: unknown): boolean {\n return !unattended && flagValue === undefined\n}\n\n/**\n * Returns the flag value if it is a boolean, otherwise returns the default.\n */\nexport function flagOrDefault(flagValue: boolean | undefined, defaultValue: boolean): boolean {\n return typeof flagValue === 'boolean' ? flagValue : defaultValue\n}\n\nexport async function getPostInitMCPPrompt(editorsNames: EditorName[]): Promise<string> {\n return fetchPostInitPrompt(new Intl.ListFormat('en').format(editorsNames))\n}\n\n/**\n * When running in a non-production Sanity environment (e.g. staging), write the\n * `SANITY_INTERNAL_ENV` variable to a `.env` file in the output directory so that\n * the bootstrapped project continues to target the same environment.\n */\nexport async function writeStagingEnvIfNeeded(output: Output, outputPath: string): Promise<void> {\n const sanityEnv = getSanityEnv()\n if (sanityEnv === 'production') return\n\n await createOrAppendEnvVars({\n envVars: {INTERNAL_ENV: sanityEnv},\n filename: '.env',\n framework: null,\n log: false,\n output,\n outputPath,\n })\n}\n"],"names":["getSanityEnv","createOrAppendEnvVars","fetchPostInitPrompt","shouldPrompt","unattended","flagValue","undefined","flagOrDefault","defaultValue","getPostInitMCPPrompt","editorsNames","Intl","ListFormat","format","writeStagingEnvIfNeeded","output","outputPath","sanityEnv","envVars","INTERNAL_ENV","filename","framework","log"],"mappings":"AAEA,SAAQA,YAAY,QAAO,6BAA4B;AAEvD,SAAQC,qBAAqB,QAAO,iCAAgC;AACpE,SAAQC,mBAAmB,QAAO,2BAA0B;AAE5D;;;CAGC,GACD,OAAO,SAASC,aAAaC,UAAmB,EAAEC,SAAkB;IAClE,OAAO,CAACD,cAAcC,cAAcC;AACtC;AAEA;;CAEC,GACD,OAAO,SAASC,cAAcF,SAA8B,EAAEG,YAAqB;IACjF,OAAO,OAAOH,cAAc,YAAYA,YAAYG;AACtD;AAEA,OAAO,eAAeC,qBAAqBC,YAA0B;IACnE,OAAOR,oBAAoB,IAAIS,KAAKC,UAAU,CAAC,MAAMC,MAAM,CAACH;AAC9D;AAEA;;;;CAIC,GACD,OAAO,eAAeI,wBAAwBC,MAAc,EAAEC,UAAkB;IAC9E,MAAMC,YAAYjB;IAClB,IAAIiB,cAAc,cAAc;IAEhC,MAAMhB,sBAAsB;QAC1BiB,SAAS;YAACC,cAAcF;QAAS;QACjCG,UAAU;QACVC,WAAW;QACXC,KAAK;QACLP;QACAC;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/actions/init/initHelpers.ts"],"sourcesContent":["import {getSanityEnv} from '../../util/getSanityEnv.js'\nimport {type EditorName} from '../mcp/editorConfigs.js'\nimport {createOrAppendEnvVars} from './env/createOrAppendEnvVars.js'\nimport {fetchPostInitPrompt} from './fetchPostInitPrompt.js'\nimport {type InitContext} from './types.js'\n\nexport function shouldPrompt(unattended: boolean, flagValue: unknown): boolean {\n return !unattended && flagValue === undefined\n}\n\nexport function flagOrDefault(flagValue: boolean | undefined, defaultValue: boolean): boolean {\n return typeof flagValue === 'boolean' ? flagValue : defaultValue\n}\n\nexport async function getPostInitMCPPrompt(editorsNames: EditorName[]): Promise<string> {\n return fetchPostInitPrompt(new Intl.ListFormat('en').format(editorsNames))\n}\n\nexport async function writeStagingEnvIfNeeded(\n output: InitContext['output'],\n outputPath: string,\n): Promise<void> {\n const sanityEnv = getSanityEnv()\n if (sanityEnv === 'production') return\n\n await createOrAppendEnvVars({\n envVars: {INTERNAL_ENV: sanityEnv},\n filename: '.env',\n framework: null,\n log: false,\n output,\n outputPath,\n })\n}\n"],"names":["getSanityEnv","createOrAppendEnvVars","fetchPostInitPrompt","shouldPrompt","unattended","flagValue","undefined","flagOrDefault","defaultValue","getPostInitMCPPrompt","editorsNames","Intl","ListFormat","format","writeStagingEnvIfNeeded","output","outputPath","sanityEnv","envVars","INTERNAL_ENV","filename","framework","log"],"mappings":"AAAA,SAAQA,YAAY,QAAO,6BAA4B;AAEvD,SAAQC,qBAAqB,QAAO,iCAAgC;AACpE,SAAQC,mBAAmB,QAAO,2BAA0B;AAG5D,OAAO,SAASC,aAAaC,UAAmB,EAAEC,SAAkB;IAClE,OAAO,CAACD,cAAcC,cAAcC;AACtC;AAEA,OAAO,SAASC,cAAcF,SAA8B,EAAEG,YAAqB;IACjF,OAAO,OAAOH,cAAc,YAAYA,YAAYG;AACtD;AAEA,OAAO,eAAeC,qBAAqBC,YAA0B;IACnE,OAAOR,oBAAoB,IAAIS,KAAKC,UAAU,CAAC,MAAMC,MAAM,CAACH;AAC9D;AAEA,OAAO,eAAeI,wBACpBC,MAA6B,EAC7BC,UAAkB;IAElB,MAAMC,YAAYjB;IAClB,IAAIiB,cAAc,cAAc;IAEhC,MAAMhB,sBAAsB;QAC1BiB,SAAS;YAACC,cAAcF;QAAS;QACjCG,UAAU;QACVC,WAAW;QACXC,KAAK;QACLP;QACAC;IACF;AACF"}
@@ -13,14 +13,15 @@ import { installNewPackages } from '../../util/packageManager/installPackages.js
13
13
  import { getPartialEnvWithNpmPath } from '../../util/packageManager/packageManagerChoice.js';
14
14
  import { countNestedFolders } from './countNestedFolders.js';
15
15
  import { createOrAppendEnvVars } from './env/createOrAppendEnvVars.js';
16
+ import { InitError } from './initError.js';
16
17
  import { flagOrDefault, getPostInitMCPPrompt, shouldPrompt, writeStagingEnvIfNeeded } from './initHelpers.js';
17
18
  import { resolvePackageManager } from './resolvePackageManager.js';
18
19
  import { sanityCliTemplate, sanityConfigTemplate, sanityFolder, sanityStudioTemplate } from './templates/nextjs/index.js';
19
20
  const debug = subdebug('init');
20
- async function writeOrOverwrite(filePath, content, workDir, params) {
21
+ async function writeOrOverwrite(filePath, content, workDir, options) {
21
22
  if (existsSync(filePath)) {
22
- let overwrite = flagOrDefault(params.overwriteFiles, false);
23
- if (shouldPrompt(params.unattended, params.overwriteFiles)) {
23
+ let overwrite = flagOrDefault(options.overwriteFiles, false);
24
+ if (shouldPrompt(options.unattended, options.overwriteFiles)) {
24
25
  overwrite = await confirm({
25
26
  default: false,
26
27
  message: `File ${styleText('yellow', filePath.replace(workDir, ''))} already exists. Do you want to overwrite it?`
@@ -44,11 +45,11 @@ async function writeOrOverwrite(filePath, content, workDir, params) {
44
45
  });
45
46
  }
46
47
  // write sanity folder files
47
- async function writeSourceFiles({ fileExtension, files, folderPath, params, srcFolderPrefix, workDir }) {
48
+ async function writeSourceFiles({ fileExtension, files, folderPath, options, srcFolderPrefix, workDir }) {
48
49
  for (const [filePath, content] of Object.entries(files)){
49
50
  // check if file ends with full stop to indicate it's file and not directory (this only works with our template tree structure)
50
51
  if (filePath.includes('.') && typeof content === 'string') {
51
- await writeOrOverwrite(path.join(workDir, srcFolderPrefix ? 'src' : '', 'sanity', folderPath || '', `${filePath}${fileExtension}`), content, workDir, params);
52
+ await writeOrOverwrite(path.join(workDir, srcFolderPrefix ? 'src' : '', 'sanity', folderPath || '', `${filePath}${fileExtension}`), content, workDir, options);
52
53
  } else {
53
54
  await mkdir(path.join(workDir, srcFolderPrefix ? 'src' : '', 'sanity', filePath), {
54
55
  recursive: true
@@ -58,7 +59,7 @@ async function writeSourceFiles({ fileExtension, files, folderPath, params, srcF
58
59
  fileExtension,
59
60
  files: content,
60
61
  folderPath: filePath,
61
- params,
62
+ options,
62
63
  srcFolderPrefix,
63
64
  workDir
64
65
  });
@@ -66,7 +67,8 @@ async function writeSourceFiles({ fileExtension, files, folderPath, params, srcF
66
67
  }
67
68
  }
68
69
  }
69
- export async function initNextJs({ datasetName, detectedFramework, envFilename, mcpConfigured, nextjsAppendEnv, nextjsEmbedStudio, output, overwriteFiles, packageManager, projectId, template, trace, typescript, unattended, workDir }) {
70
+ export async function initNextJs({ datasetName, detectedFramework, envFilename, mcpConfigured, options, output, projectId, trace, workDir }) {
71
+ const { nextjsAppendEnv, nextjsEmbedStudio, packageManager, template, typescript, unattended } = options;
70
72
  let useTypeScript = flagOrDefault(typescript, true);
71
73
  if (shouldPrompt(unattended, typescript)) {
72
74
  useTypeScript = await promptForTypeScript();
@@ -81,10 +83,6 @@ export async function initNextJs({ datasetName, detectedFramework, envFilename,
81
83
  embeddedStudio = await promptForEmbeddedStudio();
82
84
  }
83
85
  let hasSrcFolder = false;
84
- const writeParams = {
85
- overwriteFiles,
86
- unattended
87
- };
88
86
  if (embeddedStudio) {
89
87
  // find source path (app or src/app)
90
88
  const appDir = 'app';
@@ -108,12 +106,12 @@ export async function initNextJs({ datasetName, detectedFramework, envFilename,
108
106
  // replaces the ":configPath:" placeholder in the template with the correct path to the sanity.config.ts file.
109
107
  // we account for the user-defined embeddedStudioPath (default /studio) is accounted for by creating enough "../"
110
108
  // relative paths to reach the root level of the project
111
- await writeOrOverwrite(embeddedStudioRouteFilePath, sanityStudioTemplate.replace(':configPath:', `${'../'.repeat(countNestedFolders(path.dirname(embeddedStudioRouteFilePath.slice(workDir.length))))}sanity.config`), workDir, writeParams);
109
+ await writeOrOverwrite(embeddedStudioRouteFilePath, sanityStudioTemplate.replace(':configPath:', `${'../'.repeat(countNestedFolders(path.dirname(embeddedStudioRouteFilePath.slice(workDir.length))))}sanity.config`), workDir, options);
112
110
  const sanityConfigPath = path.join(workDir, `sanity.config.${fileExtension}`);
113
- await writeOrOverwrite(sanityConfigPath, sanityConfigTemplate(hasSrcFolder).replace(':route:', embeddedStudioRouteFilePath.slice(workDir.length).replace('src/', '')).replace(':basePath:', studioPath), workDir, writeParams);
111
+ await writeOrOverwrite(sanityConfigPath, sanityConfigTemplate(hasSrcFolder).replace(':route:', embeddedStudioRouteFilePath.slice(workDir.length).replace('src/', '')).replace(':basePath:', studioPath), workDir, options);
114
112
  }
115
113
  const sanityCliPath = path.join(workDir, `sanity.cli.${fileExtension}`);
116
- await writeOrOverwrite(sanityCliPath, sanityCliTemplate, workDir, writeParams);
114
+ await writeOrOverwrite(sanityCliPath, sanityCliTemplate, workDir, options);
117
115
  let templateToUse = template ?? 'clean';
118
116
  if (shouldPrompt(unattended, template)) {
119
117
  templateToUse = await promptForNextTemplate();
@@ -122,7 +120,7 @@ export async function initNextJs({ datasetName, detectedFramework, envFilename,
122
120
  fileExtension,
123
121
  files: sanityFolder(useTypeScript, templateToUse),
124
122
  folderPath: undefined,
125
- params: writeParams,
123
+ options,
126
124
  srcFolderPrefix: hasSrcFolder,
127
125
  workDir
128
126
  });
@@ -155,11 +153,10 @@ export async function initNextJs({ datasetName, detectedFramework, envFilename,
155
153
  projectId
156
154
  });
157
155
  output.log(createCorsRes.id ? `Added ${nextjsLocalDevOrigin} to CORS origins` : `Failed to add ${nextjsLocalDevOrigin} to CORS origins`);
158
- } catch (corsError) {
159
- debug(`Error creating new CORS Origin ${nextjsLocalDevOrigin}: ${corsError}`);
160
- output.error(`Failed to add ${nextjsLocalDevOrigin} to CORS origins: ${corsError}`, {
161
- exit: 1
162
- });
156
+ } catch (error) {
157
+ const message = error instanceof Error ? error.message : String(error);
158
+ debug(`Error creating new CORS Origin ${nextjsLocalDevOrigin}: ${message}`);
159
+ throw new InitError(`Failed to add ${nextjsLocalDevOrigin} to CORS origins: ${message}`, 1);
163
160
  }
164
161
  }
165
162
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/init/initNextJs.ts"],"sourcesContent":["import {existsSync} from 'node:fs'\nimport {mkdir, writeFile} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {type Output, subdebug, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\nimport {execa, type Options} from 'execa'\n\nimport {\n promptForAppendEnv,\n promptForEmbeddedStudio,\n promptForNextTemplate,\n promptForStudioPath,\n} from '../../prompts/init/nextjs.js'\nimport {promptForTypeScript} from '../../prompts/init/promptForTypescript.js'\nimport {createCorsOrigin, listCorsOrigins} from '../../services/cors.js'\nimport {type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {getPeerDependencies} from '../../util/packageManager/getPeerDependencies.js'\nimport {installNewPackages} from '../../util/packageManager/installPackages.js'\nimport {\n getPartialEnvWithNpmPath,\n type PackageManager,\n} from '../../util/packageManager/packageManagerChoice.js'\nimport {type EditorName} from '../mcp/editorConfigs.js'\nimport {countNestedFolders} from './countNestedFolders.js'\nimport {createOrAppendEnvVars} from './env/createOrAppendEnvVars.js'\nimport {\n flagOrDefault,\n getPostInitMCPPrompt,\n shouldPrompt,\n writeStagingEnvIfNeeded,\n} from './initHelpers.js'\nimport {resolvePackageManager} from './resolvePackageManager.js'\nimport {\n sanityCliTemplate,\n sanityConfigTemplate,\n sanityFolder,\n sanityStudioTemplate,\n} from './templates/nextjs/index.js'\nimport {type VersionedFramework} from './types.js'\n\nconst debug = subdebug('init')\n\nasync function writeOrOverwrite(\n filePath: string,\n content: string,\n workDir: string,\n params: {overwriteFiles?: boolean; unattended: boolean},\n) {\n if (existsSync(filePath)) {\n let overwrite = flagOrDefault(params.overwriteFiles, false)\n if (shouldPrompt(params.unattended, params.overwriteFiles)) {\n overwrite = await confirm({\n default: false,\n message: `File ${styleText(\n 'yellow',\n filePath.replace(workDir, ''),\n )} already exists. Do you want to overwrite it?`,\n })\n }\n\n if (!overwrite) {\n return\n }\n }\n\n // make folder if not exists\n const folderPath = path.dirname(filePath)\n\n try {\n await mkdir(folderPath, {recursive: true})\n } catch {\n debug('Error creating folder %s', folderPath)\n }\n\n await writeFile(filePath, content, {\n encoding: 'utf8',\n })\n}\n\n// write sanity folder files\nasync function writeSourceFiles({\n fileExtension,\n files,\n folderPath,\n params,\n srcFolderPrefix,\n workDir,\n}: {\n fileExtension: string\n files: Record<string, Record<string, string> | string>\n folderPath?: string\n params: {overwriteFiles?: boolean; unattended: boolean}\n srcFolderPrefix?: boolean\n workDir: string\n}) {\n for (const [filePath, content] of Object.entries(files)) {\n // check if file ends with full stop to indicate it's file and not directory (this only works with our template tree structure)\n if (filePath.includes('.') && typeof content === 'string') {\n await writeOrOverwrite(\n path.join(\n workDir,\n srcFolderPrefix ? 'src' : '',\n 'sanity',\n folderPath || '',\n `${filePath}${fileExtension}`,\n ),\n content,\n workDir,\n params,\n )\n } else {\n await mkdir(path.join(workDir, srcFolderPrefix ? 'src' : '', 'sanity', filePath), {\n recursive: true,\n })\n if (typeof content === 'object') {\n await writeSourceFiles({\n fileExtension,\n files: content,\n folderPath: filePath,\n params,\n srcFolderPrefix,\n workDir,\n })\n }\n }\n }\n}\n\nexport async function initNextJs({\n datasetName,\n detectedFramework,\n envFilename,\n mcpConfigured,\n nextjsAppendEnv,\n nextjsEmbedStudio,\n output,\n overwriteFiles,\n packageManager,\n projectId,\n template,\n trace,\n typescript,\n unattended,\n workDir,\n}: {\n datasetName: string\n detectedFramework: VersionedFramework | null\n envFilename: string\n mcpConfigured: EditorName[]\n nextjsAppendEnv?: boolean\n nextjsEmbedStudio?: boolean\n output: Output\n overwriteFiles?: boolean\n packageManager?: string\n projectId: string\n template?: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n typescript?: boolean\n unattended: boolean\n workDir: string\n}): Promise<void> {\n let useTypeScript = flagOrDefault(typescript, true)\n if (shouldPrompt(unattended, typescript)) {\n useTypeScript = await promptForTypeScript()\n }\n trace.log({\n selectedOption: useTypeScript ? 'yes' : 'no',\n step: 'useTypeScript',\n })\n\n const fileExtension = useTypeScript ? 'ts' : 'js'\n let embeddedStudio = flagOrDefault(nextjsEmbedStudio, true)\n if (shouldPrompt(unattended, nextjsEmbedStudio)) {\n embeddedStudio = await promptForEmbeddedStudio()\n }\n let hasSrcFolder = false\n\n const writeParams = {overwriteFiles, unattended}\n\n if (embeddedStudio) {\n // find source path (app or src/app)\n const appDir = 'app'\n let srcPath = path.join(workDir, appDir)\n\n if (!existsSync(srcPath)) {\n srcPath = path.join(workDir, 'src', appDir)\n hasSrcFolder = true\n if (!existsSync(srcPath)) {\n try {\n await mkdir(srcPath, {recursive: true})\n } catch {\n debug('Error creating folder %s', srcPath)\n }\n }\n }\n\n const studioPath = unattended ? '/studio' : await promptForStudioPath()\n\n const embeddedStudioRouteFilePath = path.join(\n srcPath,\n `${studioPath}/`,\n `[[...tool]]/page.${fileExtension}x`,\n )\n\n // this selects the correct template string based on whether the user is using the app or pages directory and\n // replaces the \":configPath:\" placeholder in the template with the correct path to the sanity.config.ts file.\n // we account for the user-defined embeddedStudioPath (default /studio) is accounted for by creating enough \"../\"\n // relative paths to reach the root level of the project\n await writeOrOverwrite(\n embeddedStudioRouteFilePath,\n sanityStudioTemplate.replace(\n ':configPath:',\n `${'../'.repeat(countNestedFolders(path.dirname(embeddedStudioRouteFilePath.slice(workDir.length))))}sanity.config`,\n ),\n workDir,\n writeParams,\n )\n\n const sanityConfigPath = path.join(workDir, `sanity.config.${fileExtension}`)\n await writeOrOverwrite(\n sanityConfigPath,\n sanityConfigTemplate(hasSrcFolder)\n .replace(':route:', embeddedStudioRouteFilePath.slice(workDir.length).replace('src/', ''))\n .replace(':basePath:', studioPath),\n workDir,\n writeParams,\n )\n }\n\n const sanityCliPath = path.join(workDir, `sanity.cli.${fileExtension}`)\n await writeOrOverwrite(sanityCliPath, sanityCliTemplate, workDir, writeParams)\n\n let templateToUse = template ?? 'clean'\n if (shouldPrompt(unattended, template)) {\n templateToUse = await promptForNextTemplate()\n }\n\n await writeSourceFiles({\n fileExtension,\n files: sanityFolder(useTypeScript, templateToUse as 'blog' | 'clean'),\n folderPath: undefined,\n params: writeParams,\n srcFolderPrefix: hasSrcFolder,\n workDir,\n })\n\n let appendEnv = flagOrDefault(nextjsAppendEnv, true)\n if (shouldPrompt(unattended, nextjsAppendEnv)) {\n appendEnv = await promptForAppendEnv(envFilename)\n }\n\n if (appendEnv) {\n await createOrAppendEnvVars({\n envVars: {\n DATASET: datasetName,\n PROJECT_ID: projectId,\n },\n filename: envFilename,\n framework: detectedFramework,\n log: true,\n output,\n outputPath: workDir,\n })\n }\n\n if (embeddedStudio) {\n const nextjsLocalDevOrigin = 'http://localhost:3000'\n const existingCorsOrigins = await listCorsOrigins(projectId)\n const hasExistingCorsOrigin = existingCorsOrigins.some(\n (item: {origin: string}) => item.origin === nextjsLocalDevOrigin,\n )\n if (!hasExistingCorsOrigin) {\n try {\n const createCorsRes = await createCorsOrigin({\n allowCredentials: true,\n origin: nextjsLocalDevOrigin,\n projectId,\n })\n\n output.log(\n createCorsRes.id\n ? `Added ${nextjsLocalDevOrigin} to CORS origins`\n : `Failed to add ${nextjsLocalDevOrigin} to CORS origins`,\n )\n } catch (corsError) {\n debug(`Error creating new CORS Origin ${nextjsLocalDevOrigin}: ${corsError}`)\n output.error(`Failed to add ${nextjsLocalDevOrigin} to CORS origins: ${corsError}`, {\n exit: 1,\n })\n }\n }\n }\n\n const chosen = await resolvePackageManager({\n interactive: !unattended,\n output,\n packageManager: packageManager as PackageManager,\n targetDir: workDir,\n })\n trace.log({selectedOption: chosen, step: 'selectPackageManager'})\n const packages = ['@sanity/vision@5', 'sanity@5', '@sanity/image-url@2', 'styled-components@6']\n if (templateToUse === 'blog') {\n packages.push('@sanity/icons')\n }\n await installNewPackages(\n {\n packageManager: chosen,\n packages,\n },\n {\n output,\n workDir,\n },\n )\n\n // will refactor this later\n const execOptions: Options = {\n cwd: workDir,\n encoding: 'utf8',\n env: getPartialEnvWithNpmPath(workDir),\n stdio: 'inherit',\n }\n\n switch (chosen) {\n case 'npm': {\n await execa('npm', ['install', 'next-sanity@12'], execOptions)\n break\n }\n case 'pnpm': {\n await execa('pnpm', ['install', 'next-sanity@12'], execOptions)\n break\n }\n case 'yarn': {\n const peerDeps = await getPeerDependencies('next-sanity@12', workDir)\n await installNewPackages(\n {packageManager: 'yarn', packages: ['next-sanity@12', ...peerDeps]},\n {output, workDir},\n )\n break\n }\n default: {\n // bun and manual - do nothing or handle differently\n break\n }\n }\n\n output.log(\n `\\n${styleText('green', 'Success!')} Your Sanity configuration files has been added to this project`,\n )\n if (mcpConfigured && mcpConfigured.length > 0) {\n const message = await getPostInitMCPPrompt(mcpConfigured)\n output.log(`\\n${message}`)\n output.log(`\\nLearn more: ${styleText('cyan', 'https://mcp.sanity.io')}`)\n output.log(\n `\\nHave feedback? Tell us in the community: ${styleText('cyan', 'https://www.sanity.io/community/join')}`,\n )\n }\n\n await writeStagingEnvIfNeeded(output, workDir)\n}\n"],"names":["existsSync","mkdir","writeFile","path","styleText","subdebug","confirm","execa","promptForAppendEnv","promptForEmbeddedStudio","promptForNextTemplate","promptForStudioPath","promptForTypeScript","createCorsOrigin","listCorsOrigins","getPeerDependencies","installNewPackages","getPartialEnvWithNpmPath","countNestedFolders","createOrAppendEnvVars","flagOrDefault","getPostInitMCPPrompt","shouldPrompt","writeStagingEnvIfNeeded","resolvePackageManager","sanityCliTemplate","sanityConfigTemplate","sanityFolder","sanityStudioTemplate","debug","writeOrOverwrite","filePath","content","workDir","params","overwrite","overwriteFiles","unattended","default","message","replace","folderPath","dirname","recursive","encoding","writeSourceFiles","fileExtension","files","srcFolderPrefix","Object","entries","includes","join","initNextJs","datasetName","detectedFramework","envFilename","mcpConfigured","nextjsAppendEnv","nextjsEmbedStudio","output","packageManager","projectId","template","trace","typescript","useTypeScript","log","selectedOption","step","embeddedStudio","hasSrcFolder","writeParams","appDir","srcPath","studioPath","embeddedStudioRouteFilePath","repeat","slice","length","sanityConfigPath","sanityCliPath","templateToUse","undefined","appendEnv","envVars","DATASET","PROJECT_ID","filename","framework","outputPath","nextjsLocalDevOrigin","existingCorsOrigins","hasExistingCorsOrigin","some","item","origin","createCorsRes","allowCredentials","id","corsError","error","exit","chosen","interactive","targetDir","packages","push","execOptions","cwd","env","stdio","peerDeps"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/init/initNextJs.ts"],"sourcesContent":["import {existsSync} from 'node:fs'\nimport {mkdir, writeFile} from 'node:fs/promises'\nimport path from 'node:path'\nimport {styleText} from 'node:util'\n\nimport {type Output, subdebug, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\nimport {execa, type Options} from 'execa'\n\nimport {\n promptForAppendEnv,\n promptForEmbeddedStudio,\n promptForNextTemplate,\n promptForStudioPath,\n} from '../../prompts/init/nextjs.js'\nimport {promptForTypeScript} from '../../prompts/init/promptForTypescript.js'\nimport {createCorsOrigin, listCorsOrigins} from '../../services/cors.js'\nimport {type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {getPeerDependencies} from '../../util/packageManager/getPeerDependencies.js'\nimport {installNewPackages} from '../../util/packageManager/installPackages.js'\nimport {\n getPartialEnvWithNpmPath,\n type PackageManager,\n} from '../../util/packageManager/packageManagerChoice.js'\nimport {type EditorName} from '../mcp/editorConfigs.js'\nimport {countNestedFolders} from './countNestedFolders.js'\nimport {createOrAppendEnvVars} from './env/createOrAppendEnvVars.js'\nimport {InitError} from './initError.js'\nimport {\n flagOrDefault,\n getPostInitMCPPrompt,\n shouldPrompt,\n writeStagingEnvIfNeeded,\n} from './initHelpers.js'\nimport {resolvePackageManager} from './resolvePackageManager.js'\nimport {\n sanityCliTemplate,\n sanityConfigTemplate,\n sanityFolder,\n sanityStudioTemplate,\n} from './templates/nextjs/index.js'\nimport {type InitOptions, type VersionedFramework} from './types.js'\n\nconst debug = subdebug('init')\n\nasync function writeOrOverwrite(\n filePath: string,\n content: string,\n workDir: string,\n options: InitOptions,\n) {\n if (existsSync(filePath)) {\n let overwrite = flagOrDefault(options.overwriteFiles, false)\n if (shouldPrompt(options.unattended, options.overwriteFiles)) {\n overwrite = await confirm({\n default: false,\n message: `File ${styleText(\n 'yellow',\n filePath.replace(workDir, ''),\n )} already exists. Do you want to overwrite it?`,\n })\n }\n\n if (!overwrite) {\n return\n }\n }\n\n // make folder if not exists\n const folderPath = path.dirname(filePath)\n\n try {\n await mkdir(folderPath, {recursive: true})\n } catch {\n debug('Error creating folder %s', folderPath)\n }\n\n await writeFile(filePath, content, {\n encoding: 'utf8',\n })\n}\n\n// write sanity folder files\nasync function writeSourceFiles({\n fileExtension,\n files,\n folderPath,\n options,\n srcFolderPrefix,\n workDir,\n}: {\n fileExtension: string\n files: Record<string, Record<string, string> | string>\n folderPath?: string\n options: InitOptions\n srcFolderPrefix?: boolean\n workDir: string\n}) {\n for (const [filePath, content] of Object.entries(files)) {\n // check if file ends with full stop to indicate it's file and not directory (this only works with our template tree structure)\n if (filePath.includes('.') && typeof content === 'string') {\n await writeOrOverwrite(\n path.join(\n workDir,\n srcFolderPrefix ? 'src' : '',\n 'sanity',\n folderPath || '',\n `${filePath}${fileExtension}`,\n ),\n content,\n workDir,\n options,\n )\n } else {\n await mkdir(path.join(workDir, srcFolderPrefix ? 'src' : '', 'sanity', filePath), {\n recursive: true,\n })\n if (typeof content === 'object') {\n await writeSourceFiles({\n fileExtension,\n files: content,\n folderPath: filePath,\n options,\n srcFolderPrefix,\n workDir,\n })\n }\n }\n }\n}\n\nexport async function initNextJs({\n datasetName,\n detectedFramework,\n envFilename,\n mcpConfigured,\n options,\n output,\n projectId,\n trace,\n workDir,\n}: {\n datasetName: string\n detectedFramework: VersionedFramework | null\n envFilename: string\n mcpConfigured: EditorName[]\n options: InitOptions\n output: Output\n projectId: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n workDir: string\n}): Promise<void> {\n const {nextjsAppendEnv, nextjsEmbedStudio, packageManager, template, typescript, unattended} =\n options\n let useTypeScript = flagOrDefault(typescript, true)\n if (shouldPrompt(unattended, typescript)) {\n useTypeScript = await promptForTypeScript()\n }\n trace.log({\n selectedOption: useTypeScript ? 'yes' : 'no',\n step: 'useTypeScript',\n })\n\n const fileExtension = useTypeScript ? 'ts' : 'js'\n let embeddedStudio = flagOrDefault(nextjsEmbedStudio, true)\n if (shouldPrompt(unattended, nextjsEmbedStudio)) {\n embeddedStudio = await promptForEmbeddedStudio()\n }\n let hasSrcFolder = false\n\n if (embeddedStudio) {\n // find source path (app or src/app)\n const appDir = 'app'\n let srcPath = path.join(workDir, appDir)\n\n if (!existsSync(srcPath)) {\n srcPath = path.join(workDir, 'src', appDir)\n hasSrcFolder = true\n if (!existsSync(srcPath)) {\n try {\n await mkdir(srcPath, {recursive: true})\n } catch {\n debug('Error creating folder %s', srcPath)\n }\n }\n }\n\n const studioPath = unattended ? '/studio' : await promptForStudioPath()\n\n const embeddedStudioRouteFilePath = path.join(\n srcPath,\n `${studioPath}/`,\n `[[...tool]]/page.${fileExtension}x`,\n )\n\n // this selects the correct template string based on whether the user is using the app or pages directory and\n // replaces the \":configPath:\" placeholder in the template with the correct path to the sanity.config.ts file.\n // we account for the user-defined embeddedStudioPath (default /studio) is accounted for by creating enough \"../\"\n // relative paths to reach the root level of the project\n await writeOrOverwrite(\n embeddedStudioRouteFilePath,\n sanityStudioTemplate.replace(\n ':configPath:',\n `${'../'.repeat(countNestedFolders(path.dirname(embeddedStudioRouteFilePath.slice(workDir.length))))}sanity.config`,\n ),\n workDir,\n options,\n )\n\n const sanityConfigPath = path.join(workDir, `sanity.config.${fileExtension}`)\n await writeOrOverwrite(\n sanityConfigPath,\n sanityConfigTemplate(hasSrcFolder)\n .replace(':route:', embeddedStudioRouteFilePath.slice(workDir.length).replace('src/', ''))\n .replace(':basePath:', studioPath),\n workDir,\n options,\n )\n }\n\n const sanityCliPath = path.join(workDir, `sanity.cli.${fileExtension}`)\n await writeOrOverwrite(sanityCliPath, sanityCliTemplate, workDir, options)\n\n let templateToUse = template ?? 'clean'\n if (shouldPrompt(unattended, template)) {\n templateToUse = await promptForNextTemplate()\n }\n\n await writeSourceFiles({\n fileExtension,\n files: sanityFolder(useTypeScript, templateToUse as 'blog' | 'clean'),\n folderPath: undefined,\n options,\n srcFolderPrefix: hasSrcFolder,\n workDir,\n })\n\n let appendEnv = flagOrDefault(nextjsAppendEnv, true)\n if (shouldPrompt(unattended, nextjsAppendEnv)) {\n appendEnv = await promptForAppendEnv(envFilename)\n }\n\n if (appendEnv) {\n await createOrAppendEnvVars({\n envVars: {\n DATASET: datasetName,\n PROJECT_ID: projectId,\n },\n filename: envFilename,\n framework: detectedFramework,\n log: true,\n output,\n outputPath: workDir,\n })\n }\n\n if (embeddedStudio) {\n const nextjsLocalDevOrigin = 'http://localhost:3000'\n const existingCorsOrigins = await listCorsOrigins(projectId)\n const hasExistingCorsOrigin = existingCorsOrigins.some(\n (item: {origin: string}) => item.origin === nextjsLocalDevOrigin,\n )\n if (!hasExistingCorsOrigin) {\n try {\n const createCorsRes = await createCorsOrigin({\n allowCredentials: true,\n origin: nextjsLocalDevOrigin,\n projectId,\n })\n\n output.log(\n createCorsRes.id\n ? `Added ${nextjsLocalDevOrigin} to CORS origins`\n : `Failed to add ${nextjsLocalDevOrigin} to CORS origins`,\n )\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n debug(`Error creating new CORS Origin ${nextjsLocalDevOrigin}: ${message}`)\n throw new InitError(`Failed to add ${nextjsLocalDevOrigin} to CORS origins: ${message}`, 1)\n }\n }\n }\n\n const chosen = await resolvePackageManager({\n interactive: !unattended,\n output,\n packageManager: packageManager as PackageManager,\n targetDir: workDir,\n })\n trace.log({selectedOption: chosen, step: 'selectPackageManager'})\n const packages = ['@sanity/vision@5', 'sanity@5', '@sanity/image-url@2', 'styled-components@6']\n if (templateToUse === 'blog') {\n packages.push('@sanity/icons')\n }\n await installNewPackages(\n {\n packageManager: chosen,\n packages,\n },\n {\n output,\n workDir,\n },\n )\n\n // will refactor this later\n const execOptions: Options = {\n cwd: workDir,\n encoding: 'utf8',\n env: getPartialEnvWithNpmPath(workDir),\n stdio: 'inherit',\n }\n\n switch (chosen) {\n case 'npm': {\n await execa('npm', ['install', 'next-sanity@12'], execOptions)\n break\n }\n case 'pnpm': {\n await execa('pnpm', ['install', 'next-sanity@12'], execOptions)\n break\n }\n case 'yarn': {\n const peerDeps = await getPeerDependencies('next-sanity@12', workDir)\n await installNewPackages(\n {packageManager: 'yarn', packages: ['next-sanity@12', ...peerDeps]},\n {output, workDir},\n )\n break\n }\n default: {\n // bun and manual - do nothing or handle differently\n break\n }\n }\n\n output.log(\n `\\n${styleText('green', 'Success!')} Your Sanity configuration files has been added to this project`,\n )\n if (mcpConfigured && mcpConfigured.length > 0) {\n const message = await getPostInitMCPPrompt(mcpConfigured)\n output.log(`\\n${message}`)\n output.log(`\\nLearn more: ${styleText('cyan', 'https://mcp.sanity.io')}`)\n output.log(\n `\\nHave feedback? Tell us in the community: ${styleText('cyan', 'https://www.sanity.io/community/join')}`,\n )\n }\n\n await writeStagingEnvIfNeeded(output, workDir)\n}\n"],"names":["existsSync","mkdir","writeFile","path","styleText","subdebug","confirm","execa","promptForAppendEnv","promptForEmbeddedStudio","promptForNextTemplate","promptForStudioPath","promptForTypeScript","createCorsOrigin","listCorsOrigins","getPeerDependencies","installNewPackages","getPartialEnvWithNpmPath","countNestedFolders","createOrAppendEnvVars","InitError","flagOrDefault","getPostInitMCPPrompt","shouldPrompt","writeStagingEnvIfNeeded","resolvePackageManager","sanityCliTemplate","sanityConfigTemplate","sanityFolder","sanityStudioTemplate","debug","writeOrOverwrite","filePath","content","workDir","options","overwrite","overwriteFiles","unattended","default","message","replace","folderPath","dirname","recursive","encoding","writeSourceFiles","fileExtension","files","srcFolderPrefix","Object","entries","includes","join","initNextJs","datasetName","detectedFramework","envFilename","mcpConfigured","output","projectId","trace","nextjsAppendEnv","nextjsEmbedStudio","packageManager","template","typescript","useTypeScript","log","selectedOption","step","embeddedStudio","hasSrcFolder","appDir","srcPath","studioPath","embeddedStudioRouteFilePath","repeat","slice","length","sanityConfigPath","sanityCliPath","templateToUse","undefined","appendEnv","envVars","DATASET","PROJECT_ID","filename","framework","outputPath","nextjsLocalDevOrigin","existingCorsOrigins","hasExistingCorsOrigin","some","item","origin","createCorsRes","allowCredentials","id","error","Error","String","chosen","interactive","targetDir","packages","push","execOptions","cwd","env","stdio","peerDeps"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { styleText } from 'node:util';
2
2
  import { getCliToken, subdebug } from '@sanity/cli-core';
3
3
  import { confirm } from '@sanity/cli-core/ux';
4
- import { ImportDatasetCommand } from '../../commands/datasets/import.js';
5
4
  import { updateProjectInitializedAt } from '../../services/projects.js';
5
+ import { InitError } from './initError.js';
6
6
  import { getPostInitMCPPrompt } from './initHelpers.js';
7
7
  import { scaffoldAndInstall, selectTemplate } from './scaffoldTemplate.js';
8
8
  const debug = subdebug('init');
@@ -12,18 +12,15 @@ async function promptForDatasetImport(message) {
12
12
  message: message || 'This template includes a sample dataset, would you like to use it?'
13
13
  });
14
14
  }
15
- export async function initStudio({ autoUpdates, datasetName, defaults, displayName, error, git, importDataset, isFirstProject, mcpConfigured, noGit, organizationId, output, outputPath, overwriteFiles, packageManager, projectId, remoteTemplateInfo, sluggedName, template, templateToken, trace, typescript, unattended, workDir }) {
15
+ export async function initStudio({ datasetName, defaults, displayName, isFirstProject, mcpConfigured, options, organizationId, output, outputPath, projectId, remoteTemplateInfo, sluggedName, trace, workDir }) {
16
+ const { importDataset, unattended } = options;
16
17
  const { template: resolvedTemplate, templateName, useTypeScript } = await selectTemplate({
18
+ options,
17
19
  remoteTemplateInfo,
18
- template,
19
- trace,
20
- typescript,
21
- unattended
20
+ trace
22
21
  });
23
22
  if (!remoteTemplateInfo && !resolvedTemplate) {
24
- error(`Template "${templateName}" not found`, {
25
- exit: 1
26
- });
23
+ throw new InitError(`Template "${templateName}" not found`, 1);
27
24
  }
28
25
  // If the template has a sample dataset, prompt the user whether or not we should import it
29
26
  const shouldImport = resolvedTemplate?.datasetUrl && (importDataset ?? (!unattended && await promptForDatasetImport(resolvedTemplate.importPrompt)));
@@ -38,24 +35,18 @@ export async function initStudio({ autoUpdates, datasetName, defaults, displayNa
38
35
  debug('Failed to update cliInitializedAt metadata', err);
39
36
  }
40
37
  const { pkgManager } = await scaffoldAndInstall({
41
- autoUpdates,
42
38
  datasetName,
43
39
  defaults,
44
40
  displayName,
45
- git,
46
- noGit,
41
+ options,
47
42
  organizationId,
48
43
  output,
49
44
  outputPath,
50
- overwriteFiles,
51
- packageManager,
52
45
  projectId,
53
46
  remoteTemplateInfo,
54
47
  sluggedName,
55
48
  templateName,
56
- templateToken,
57
49
  trace,
58
- unattended,
59
50
  useTypeScript,
60
51
  workDir
61
52
  });
@@ -63,10 +54,10 @@ export async function initStudio({ autoUpdates, datasetName, defaults, displayNa
63
54
  if (shouldImport && resolvedTemplate?.datasetUrl) {
64
55
  const token = await getCliToken();
65
56
  if (!token) {
66
- return error('Authentication required to import dataset', {
67
- exit: 1
68
- });
57
+ throw new InitError('Authentication required to import dataset', 1);
69
58
  }
59
+ // eslint-disable-next-line no-restricted-syntax
60
+ const { ImportDatasetCommand } = await import('../../commands/datasets/import.js');
70
61
  await ImportDatasetCommand.run([
71
62
  resolvedTemplate.datasetUrl,
72
63
  '--project-id',
@@ -93,7 +84,7 @@ export async function initStudio({ autoUpdates, datasetName, defaults, displayNa
93
84
  yarn: 'yarn dev'
94
85
  };
95
86
  const devCommand = devCommandMap[pkgManager];
96
- const isCurrentDir = outputPath === process.cwd();
87
+ const isCurrentDir = outputPath === workDir;
97
88
  const goToProjectDir = `\n(${styleText('cyan', `cd ${outputPath}`)} to navigate to your new project directory)`;
98
89
  //output for Studios here
99
90
  output.log(`\u2705 ${styleText([
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/init/initStudio.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {getCliToken, type Output, subdebug, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {ImportDatasetCommand} from '../../commands/datasets/import.js'\nimport {updateProjectInitializedAt} from '../../services/projects.js'\nimport {type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {type PackageManager} from '../../util/packageManager/packageManagerChoice.js'\nimport {type EditorName} from '../mcp/editorConfigs.js'\nimport {getPostInitMCPPrompt} from './initHelpers.js'\nimport {type RepoInfo} from './remoteTemplate.js'\nimport {scaffoldAndInstall, selectTemplate} from './scaffoldTemplate.js'\n\nconst debug = subdebug('init')\n\nasync function promptForDatasetImport(message?: string): Promise<boolean> {\n return confirm({\n default: true,\n message: message || 'This template includes a sample dataset, would you like to use it?',\n })\n}\n\nexport async function initStudio({\n autoUpdates,\n datasetName,\n defaults,\n displayName,\n error,\n git,\n importDataset,\n isFirstProject,\n mcpConfigured,\n noGit,\n organizationId,\n output,\n outputPath,\n overwriteFiles,\n packageManager,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n template,\n templateToken,\n trace,\n typescript,\n unattended,\n workDir,\n}: {\n autoUpdates: boolean\n datasetName: string\n defaults: {projectName: string}\n displayName: string\n error: Output['error']\n git?: boolean | string\n importDataset?: boolean\n isFirstProject: boolean\n mcpConfigured: EditorName[]\n noGit?: boolean\n organizationId: string | undefined\n output: Output\n outputPath: string\n overwriteFiles?: boolean\n packageManager?: string\n projectId: string\n remoteTemplateInfo: RepoInfo | undefined\n sluggedName: string\n template?: string\n templateToken?: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n typescript?: boolean\n unattended: boolean\n workDir: string\n}): Promise<void> {\n const {\n template: resolvedTemplate,\n templateName,\n useTypeScript,\n } = await selectTemplate({\n remoteTemplateInfo,\n template,\n trace,\n typescript,\n unattended,\n })\n\n if (!remoteTemplateInfo && !resolvedTemplate) {\n error(`Template \"${templateName}\" not found`, {exit: 1})\n }\n\n // If the template has a sample dataset, prompt the user whether or not we should import it\n const shouldImport =\n resolvedTemplate?.datasetUrl &&\n (importDataset ??\n (!unattended && (await promptForDatasetImport(resolvedTemplate.importPrompt))))\n\n trace.log({\n selectedOption: shouldImport ? 'yes' : 'no',\n step: 'importTemplateDataset',\n })\n\n try {\n await updateProjectInitializedAt(projectId)\n } catch (err) {\n // Non-critical update\n debug('Failed to update cliInitializedAt metadata', err)\n }\n\n const {pkgManager} = await scaffoldAndInstall({\n autoUpdates,\n datasetName,\n defaults,\n displayName,\n git,\n noGit,\n organizationId,\n output,\n outputPath,\n overwriteFiles,\n packageManager,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n templateName,\n templateToken,\n trace,\n unattended,\n useTypeScript,\n workDir,\n })\n\n // Prompt for dataset import (if a dataset is defined)\n if (shouldImport && resolvedTemplate?.datasetUrl) {\n const token = await getCliToken()\n if (!token) {\n return error('Authentication required to import dataset', {exit: 1})\n }\n await ImportDatasetCommand.run(\n [\n resolvedTemplate.datasetUrl,\n '--project-id',\n projectId,\n '--dataset',\n datasetName,\n '--token',\n token,\n '--missing',\n ],\n {\n root: outputPath,\n },\n )\n\n output.log('')\n output.log('If you want to delete the imported data, use')\n output.log(` ${styleText('cyan', `npx sanity dataset delete ${datasetName}`)}`)\n output.log('and create a new clean dataset with')\n output.log(` ${styleText('cyan', `npx sanity dataset create <name>`)}\\n`)\n }\n\n const devCommandMap: Record<PackageManager, string> = {\n bun: 'bun dev',\n manual: 'npm run dev',\n npm: 'npm run dev',\n pnpm: 'pnpm dev',\n yarn: 'yarn dev',\n }\n const devCommand = devCommandMap[pkgManager]\n\n const isCurrentDir = outputPath === process.cwd()\n const goToProjectDir = `\\n(${styleText('cyan', `cd ${outputPath}`)} to navigate to your new project directory)`\n\n //output for Studios here\n output.log(`\\u2705 ${styleText(['green', 'bold'], 'Success!')} Your Studio has been created.`)\n if (!isCurrentDir) output.log(goToProjectDir)\n output.log(\n `\\nGet started by running ${styleText('cyan', devCommand)} to launch your Studio's development server`,\n )\n if (mcpConfigured && mcpConfigured.length > 0) {\n const message = await getPostInitMCPPrompt(mcpConfigured)\n output.log(`\\n${message}`)\n output.log(`\\nLearn more: ${styleText('cyan', 'https://mcp.sanity.io')}`)\n output.log(\n `\\nHave feedback? Tell us in the community: ${styleText('cyan', 'https://www.sanity.io/community/join')}`,\n )\n }\n output.log('\\n')\n output.log(`Other helpful commands:`)\n output.log(`npx sanity docs browse to open the documentation in a browser`)\n output.log(`npx sanity manage to open the project settings in a browser`)\n output.log(`npx sanity help to explore the CLI manual`)\n\n if (isFirstProject) {\n trace.log({selectedOption: 'yes', step: 'sendCommunityInvite'})\n\n const DISCORD_INVITE_LINK = 'https://www.sanity.io/community/join'\n\n output.log(`\\nJoin the Sanity community: ${styleText('cyan', DISCORD_INVITE_LINK)}`)\n output.log('We look forward to seeing you there!\\n')\n }\n}\n"],"names":["styleText","getCliToken","subdebug","confirm","ImportDatasetCommand","updateProjectInitializedAt","getPostInitMCPPrompt","scaffoldAndInstall","selectTemplate","debug","promptForDatasetImport","message","default","initStudio","autoUpdates","datasetName","defaults","displayName","error","git","importDataset","isFirstProject","mcpConfigured","noGit","organizationId","output","outputPath","overwriteFiles","packageManager","projectId","remoteTemplateInfo","sluggedName","template","templateToken","trace","typescript","unattended","workDir","resolvedTemplate","templateName","useTypeScript","exit","shouldImport","datasetUrl","importPrompt","log","selectedOption","step","err","pkgManager","token","run","root","devCommandMap","bun","manual","npm","pnpm","yarn","devCommand","isCurrentDir","process","cwd","goToProjectDir","length","DISCORD_INVITE_LINK"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/actions/init/initStudio.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {getCliToken, type Output, subdebug, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {updateProjectInitializedAt} from '../../services/projects.js'\nimport {type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {type PackageManager} from '../../util/packageManager/packageManagerChoice.js'\nimport {type EditorName} from '../mcp/editorConfigs.js'\nimport {InitError} from './initError.js'\nimport {getPostInitMCPPrompt} from './initHelpers.js'\nimport {type RepoInfo} from './remoteTemplate.js'\nimport {scaffoldAndInstall, selectTemplate} from './scaffoldTemplate.js'\nimport {type InitOptions} from './types.js'\n\nconst debug = subdebug('init')\n\nasync function promptForDatasetImport(message?: string): Promise<boolean> {\n return confirm({\n default: true,\n message: message || 'This template includes a sample dataset, would you like to use it?',\n })\n}\n\nexport async function initStudio({\n datasetName,\n defaults,\n displayName,\n isFirstProject,\n mcpConfigured,\n options,\n organizationId,\n output,\n outputPath,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n trace,\n workDir,\n}: {\n datasetName: string\n defaults: {projectName: string}\n displayName: string\n isFirstProject: boolean\n mcpConfigured: EditorName[]\n options: InitOptions\n organizationId: string | undefined\n output: Output\n outputPath: string\n projectId: string\n remoteTemplateInfo: RepoInfo | undefined\n sluggedName: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n workDir: string\n}): Promise<void> {\n const {importDataset, unattended} = options\n const {\n template: resolvedTemplate,\n templateName,\n useTypeScript,\n } = await selectTemplate({\n options,\n remoteTemplateInfo,\n trace,\n })\n\n if (!remoteTemplateInfo && !resolvedTemplate) {\n throw new InitError(`Template \"${templateName}\" not found`, 1)\n }\n\n // If the template has a sample dataset, prompt the user whether or not we should import it\n const shouldImport =\n resolvedTemplate?.datasetUrl &&\n (importDataset ??\n (!unattended && (await promptForDatasetImport(resolvedTemplate.importPrompt))))\n\n trace.log({\n selectedOption: shouldImport ? 'yes' : 'no',\n step: 'importTemplateDataset',\n })\n\n try {\n await updateProjectInitializedAt(projectId)\n } catch (err) {\n // Non-critical update\n debug('Failed to update cliInitializedAt metadata', err)\n }\n\n const {pkgManager} = await scaffoldAndInstall({\n datasetName,\n defaults,\n displayName,\n options,\n organizationId,\n output,\n outputPath,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n templateName,\n trace,\n useTypeScript,\n workDir,\n })\n\n // Prompt for dataset import (if a dataset is defined)\n if (shouldImport && resolvedTemplate?.datasetUrl) {\n const token = await getCliToken()\n if (!token) {\n throw new InitError('Authentication required to import dataset', 1)\n }\n // eslint-disable-next-line no-restricted-syntax\n const {ImportDatasetCommand} = await import('../../commands/datasets/import.js')\n await ImportDatasetCommand.run(\n [\n resolvedTemplate.datasetUrl,\n '--project-id',\n projectId,\n '--dataset',\n datasetName,\n '--token',\n token,\n '--missing',\n ],\n {\n root: outputPath,\n },\n )\n\n output.log('')\n output.log('If you want to delete the imported data, use')\n output.log(` ${styleText('cyan', `npx sanity dataset delete ${datasetName}`)}`)\n output.log('and create a new clean dataset with')\n output.log(` ${styleText('cyan', `npx sanity dataset create <name>`)}\\n`)\n }\n\n const devCommandMap: Record<PackageManager, string> = {\n bun: 'bun dev',\n manual: 'npm run dev',\n npm: 'npm run dev',\n pnpm: 'pnpm dev',\n yarn: 'yarn dev',\n }\n const devCommand = devCommandMap[pkgManager]\n\n const isCurrentDir = outputPath === workDir\n const goToProjectDir = `\\n(${styleText('cyan', `cd ${outputPath}`)} to navigate to your new project directory)`\n\n //output for Studios here\n output.log(`\\u2705 ${styleText(['green', 'bold'], 'Success!')} Your Studio has been created.`)\n if (!isCurrentDir) output.log(goToProjectDir)\n output.log(\n `\\nGet started by running ${styleText('cyan', devCommand)} to launch your Studio's development server`,\n )\n if (mcpConfigured && mcpConfigured.length > 0) {\n const message = await getPostInitMCPPrompt(mcpConfigured)\n output.log(`\\n${message}`)\n output.log(`\\nLearn more: ${styleText('cyan', 'https://mcp.sanity.io')}`)\n output.log(\n `\\nHave feedback? Tell us in the community: ${styleText('cyan', 'https://www.sanity.io/community/join')}`,\n )\n }\n output.log('\\n')\n output.log(`Other helpful commands:`)\n output.log(`npx sanity docs browse to open the documentation in a browser`)\n output.log(`npx sanity manage to open the project settings in a browser`)\n output.log(`npx sanity help to explore the CLI manual`)\n\n if (isFirstProject) {\n trace.log({selectedOption: 'yes', step: 'sendCommunityInvite'})\n\n const DISCORD_INVITE_LINK = 'https://www.sanity.io/community/join'\n\n output.log(`\\nJoin the Sanity community: ${styleText('cyan', DISCORD_INVITE_LINK)}`)\n output.log('We look forward to seeing you there!\\n')\n }\n}\n"],"names":["styleText","getCliToken","subdebug","confirm","updateProjectInitializedAt","InitError","getPostInitMCPPrompt","scaffoldAndInstall","selectTemplate","debug","promptForDatasetImport","message","default","initStudio","datasetName","defaults","displayName","isFirstProject","mcpConfigured","options","organizationId","output","outputPath","projectId","remoteTemplateInfo","sluggedName","trace","workDir","importDataset","unattended","template","resolvedTemplate","templateName","useTypeScript","shouldImport","datasetUrl","importPrompt","log","selectedOption","step","err","pkgManager","token","ImportDatasetCommand","run","root","devCommandMap","bun","manual","npm","pnpm","yarn","devCommand","isCurrentDir","goToProjectDir","length","DISCORD_INVITE_LINK"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { verifyCoupon } from './verifyCoupon.js';
2
+ import { verifyPlan } from './verifyPlan.js';
3
+ export async function getPlan(options, output, trace) {
4
+ const intendedPlan = options.projectPlan;
5
+ const intendedCoupon = options.coupon;
6
+ if (intendedCoupon) {
7
+ return verifyCoupon(intendedCoupon, options.unattended, output, trace);
8
+ } else if (intendedPlan) {
9
+ return verifyPlan(intendedPlan, options.unattended, output, trace);
10
+ } else {
11
+ return undefined;
12
+ }
13
+ }
14
+
15
+ //# sourceMappingURL=getPlan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/actions/init/plan/getPlan.ts"],"sourcesContent":["import {type TelemetryUserProperties} from '@sanity/cli-core'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {type InitStepResult} from '../../../telemetry/init.telemetry.js'\nimport {type InitContext, type InitOptions} from '../types.js'\nimport {verifyCoupon} from './verifyCoupon.js'\nimport {verifyPlan} from './verifyPlan.js'\n\nexport async function getPlan(\n options: InitOptions,\n output: InitContext['output'],\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>,\n): Promise<string | undefined> {\n const intendedPlan = options.projectPlan\n const intendedCoupon = options.coupon\n\n if (intendedCoupon) {\n return verifyCoupon(intendedCoupon, options.unattended, output, trace)\n } else if (intendedPlan) {\n return verifyPlan(intendedPlan, options.unattended, output, trace)\n } else {\n return undefined\n }\n}\n"],"names":["verifyCoupon","verifyPlan","getPlan","options","output","trace","intendedPlan","projectPlan","intendedCoupon","coupon","unattended","undefined"],"mappings":"AAKA,SAAQA,YAAY,QAAO,oBAAmB;AAC9C,SAAQC,UAAU,QAAO,kBAAiB;AAE1C,OAAO,eAAeC,QACpBC,OAAoB,EACpBC,MAA6B,EAC7BC,KAA8D;IAE9D,MAAMC,eAAeH,QAAQI,WAAW;IACxC,MAAMC,iBAAiBL,QAAQM,MAAM;IAErC,IAAID,gBAAgB;QAClB,OAAOR,aAAaQ,gBAAgBL,QAAQO,UAAU,EAAEN,QAAQC;IAClE,OAAO,IAAIC,cAAc;QACvB,OAAOL,WAAWK,cAAcH,QAAQO,UAAU,EAAEN,QAAQC;IAC9D,OAAO;QACL,OAAOM;IACT;AACF"}
@@ -0,0 +1,35 @@
1
+ import { confirm } from '@sanity/cli-core/ux';
2
+ import { isHttpError } from '@sanity/client';
3
+ import { getPlanIdFromCoupon } from '../../../services/plans.js';
4
+ import { InitError } from '../initError.js';
5
+ export async function verifyCoupon(intendedCoupon, unattended, output, trace) {
6
+ try {
7
+ const planId = await getPlanIdFromCoupon(intendedCoupon);
8
+ output.log(`Coupon "${intendedCoupon}" validated!\n`);
9
+ return planId;
10
+ } catch (err) {
11
+ if (!isHttpError(err) || err.statusCode !== 404) {
12
+ const message = err instanceof Error ? err.message : `${err}`;
13
+ throw new InitError(`Unable to validate coupon, please try again later:\n\n${message}`, 1);
14
+ }
15
+ const useDefaultPlan = unattended || await confirm({
16
+ default: true,
17
+ message: `Coupon "${intendedCoupon}" is not available, use default plan instead?`
18
+ });
19
+ if (unattended) {
20
+ output.warn(`Coupon "${intendedCoupon}" is not available - using default plan`);
21
+ }
22
+ trace.log({
23
+ coupon: intendedCoupon,
24
+ selectedOption: useDefaultPlan ? 'yes' : 'no',
25
+ step: 'useDefaultPlanCoupon'
26
+ });
27
+ if (useDefaultPlan) {
28
+ output.log('Using default plan.');
29
+ return undefined;
30
+ }
31
+ throw new InitError(`Coupon "${intendedCoupon}" does not exist`, 1);
32
+ }
33
+ }
34
+
35
+ //# sourceMappingURL=verifyCoupon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/actions/init/plan/verifyCoupon.ts"],"sourcesContent":["import {type TelemetryUserProperties} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\nimport {isHttpError} from '@sanity/client'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {getPlanIdFromCoupon} from '../../../services/plans.js'\nimport {type InitStepResult} from '../../../telemetry/init.telemetry.js'\nimport {InitError} from '../initError.js'\nimport {type InitContext} from '../types.js'\n\nexport async function verifyCoupon(\n intendedCoupon: string,\n unattended: boolean,\n output: InitContext['output'],\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>,\n): Promise<string | undefined> {\n try {\n const planId = await getPlanIdFromCoupon(intendedCoupon)\n output.log(`Coupon \"${intendedCoupon}\" validated!\\n`)\n return planId\n } catch (err: unknown) {\n if (!isHttpError(err) || err.statusCode !== 404) {\n const message = err instanceof Error ? err.message : `${err}`\n throw new InitError(`Unable to validate coupon, please try again later:\\n\\n${message}`, 1)\n }\n\n const useDefaultPlan =\n unattended ||\n (await confirm({\n default: true,\n message: `Coupon \"${intendedCoupon}\" is not available, use default plan instead?`,\n }))\n\n if (unattended) {\n output.warn(`Coupon \"${intendedCoupon}\" is not available - using default plan`)\n }\n\n trace.log({\n coupon: intendedCoupon,\n selectedOption: useDefaultPlan ? 'yes' : 'no',\n step: 'useDefaultPlanCoupon',\n })\n\n if (useDefaultPlan) {\n output.log('Using default plan.')\n return undefined\n }\n\n throw new InitError(`Coupon \"${intendedCoupon}\" does not exist`, 1)\n }\n}\n"],"names":["confirm","isHttpError","getPlanIdFromCoupon","InitError","verifyCoupon","intendedCoupon","unattended","output","trace","planId","log","err","statusCode","message","Error","useDefaultPlan","default","warn","coupon","selectedOption","step","undefined"],"mappings":"AACA,SAAQA,OAAO,QAAO,sBAAqB;AAC3C,SAAQC,WAAW,QAAO,iBAAgB;AAG1C,SAAQC,mBAAmB,QAAO,6BAA4B;AAE9D,SAAQC,SAAS,QAAO,kBAAiB;AAGzC,OAAO,eAAeC,aACpBC,cAAsB,EACtBC,UAAmB,EACnBC,MAA6B,EAC7BC,KAA8D;IAE9D,IAAI;QACF,MAAMC,SAAS,MAAMP,oBAAoBG;QACzCE,OAAOG,GAAG,CAAC,CAAC,QAAQ,EAAEL,eAAe,cAAc,CAAC;QACpD,OAAOI;IACT,EAAE,OAAOE,KAAc;QACrB,IAAI,CAACV,YAAYU,QAAQA,IAAIC,UAAU,KAAK,KAAK;YAC/C,MAAMC,UAAUF,eAAeG,QAAQH,IAAIE,OAAO,GAAG,GAAGF,KAAK;YAC7D,MAAM,IAAIR,UAAU,CAAC,sDAAsD,EAAEU,SAAS,EAAE;QAC1F;QAEA,MAAME,iBACJT,cACC,MAAMN,QAAQ;YACbgB,SAAS;YACTH,SAAS,CAAC,QAAQ,EAAER,eAAe,6CAA6C,CAAC;QACnF;QAEF,IAAIC,YAAY;YACdC,OAAOU,IAAI,CAAC,CAAC,QAAQ,EAAEZ,eAAe,uCAAuC,CAAC;QAChF;QAEAG,MAAME,GAAG,CAAC;YACRQ,QAAQb;YACRc,gBAAgBJ,iBAAiB,QAAQ;YACzCK,MAAM;QACR;QAEA,IAAIL,gBAAgB;YAClBR,OAAOG,GAAG,CAAC;YACX,OAAOW;QACT;QAEA,MAAM,IAAIlB,UAAU,CAAC,QAAQ,EAAEE,eAAe,gBAAgB,CAAC,EAAE;IACnE;AACF"}
@@ -0,0 +1,34 @@
1
+ import { confirm } from '@sanity/cli-core/ux';
2
+ import { isHttpError } from '@sanity/client';
3
+ import { getPlanId } from '../../../services/plans.js';
4
+ import { InitError } from '../initError.js';
5
+ export async function verifyPlan(intendedPlan, unattended, output, trace) {
6
+ try {
7
+ const planId = await getPlanId(intendedPlan);
8
+ return planId;
9
+ } catch (err) {
10
+ if (!isHttpError(err) || err.statusCode !== 404) {
11
+ const message = err instanceof Error ? err.message : `${err}`;
12
+ throw new InitError(`Unable to validate plan, please try again later:\n\n${message}`, 1);
13
+ }
14
+ const useDefaultPlan = unattended || await confirm({
15
+ default: true,
16
+ message: `Project plan "${intendedPlan}" does not exist, use default plan instead?`
17
+ });
18
+ if (unattended) {
19
+ output.warn(`Project plan "${intendedPlan}" does not exist - using default plan`);
20
+ }
21
+ trace.log({
22
+ planId: intendedPlan,
23
+ selectedOption: useDefaultPlan ? 'yes' : 'no',
24
+ step: 'useDefaultPlanId'
25
+ });
26
+ if (useDefaultPlan) {
27
+ output.log('Using default plan.');
28
+ return undefined;
29
+ }
30
+ throw new InitError(`Plan id "${intendedPlan}" does not exist`, 1);
31
+ }
32
+ }
33
+
34
+ //# sourceMappingURL=verifyPlan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/actions/init/plan/verifyPlan.ts"],"sourcesContent":["import {type TelemetryUserProperties} from '@sanity/cli-core'\nimport {confirm} from '@sanity/cli-core/ux'\nimport {isHttpError} from '@sanity/client'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {getPlanId} from '../../../services/plans.js'\nimport {type InitStepResult} from '../../../telemetry/init.telemetry.js'\nimport {InitError} from '../initError.js'\nimport {type InitContext} from '../types.js'\n\nexport async function verifyPlan(\n intendedPlan: string,\n unattended: boolean,\n output: InitContext['output'],\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>,\n): Promise<string | undefined> {\n try {\n const planId = await getPlanId(intendedPlan)\n return planId\n } catch (err: unknown) {\n if (!isHttpError(err) || err.statusCode !== 404) {\n const message = err instanceof Error ? err.message : `${err}`\n throw new InitError(`Unable to validate plan, please try again later:\\n\\n${message}`, 1)\n }\n\n const useDefaultPlan =\n unattended ||\n (await confirm({\n default: true,\n message: `Project plan \"${intendedPlan}\" does not exist, use default plan instead?`,\n }))\n\n if (unattended) {\n output.warn(`Project plan \"${intendedPlan}\" does not exist - using default plan`)\n }\n\n trace.log({\n planId: intendedPlan,\n selectedOption: useDefaultPlan ? 'yes' : 'no',\n step: 'useDefaultPlanId',\n })\n\n if (useDefaultPlan) {\n output.log('Using default plan.')\n return undefined\n }\n\n throw new InitError(`Plan id \"${intendedPlan}\" does not exist`, 1)\n }\n}\n"],"names":["confirm","isHttpError","getPlanId","InitError","verifyPlan","intendedPlan","unattended","output","trace","planId","err","statusCode","message","Error","useDefaultPlan","default","warn","log","selectedOption","step","undefined"],"mappings":"AACA,SAAQA,OAAO,QAAO,sBAAqB;AAC3C,SAAQC,WAAW,QAAO,iBAAgB;AAG1C,SAAQC,SAAS,QAAO,6BAA4B;AAEpD,SAAQC,SAAS,QAAO,kBAAiB;AAGzC,OAAO,eAAeC,WACpBC,YAAoB,EACpBC,UAAmB,EACnBC,MAA6B,EAC7BC,KAA8D;IAE9D,IAAI;QACF,MAAMC,SAAS,MAAMP,UAAUG;QAC/B,OAAOI;IACT,EAAE,OAAOC,KAAc;QACrB,IAAI,CAACT,YAAYS,QAAQA,IAAIC,UAAU,KAAK,KAAK;YAC/C,MAAMC,UAAUF,eAAeG,QAAQH,IAAIE,OAAO,GAAG,GAAGF,KAAK;YAC7D,MAAM,IAAIP,UAAU,CAAC,oDAAoD,EAAES,SAAS,EAAE;QACxF;QAEA,MAAME,iBACJR,cACC,MAAMN,QAAQ;YACbe,SAAS;YACTH,SAAS,CAAC,cAAc,EAAEP,aAAa,2CAA2C,CAAC;QACrF;QAEF,IAAIC,YAAY;YACdC,OAAOS,IAAI,CAAC,CAAC,cAAc,EAAEX,aAAa,qCAAqC,CAAC;QAClF;QAEAG,MAAMS,GAAG,CAAC;YACRR,QAAQJ;YACRa,gBAAgBJ,iBAAiB,QAAQ;YACzCK,MAAM;QACR;QAEA,IAAIL,gBAAgB;YAClBP,OAAOU,GAAG,CAAC;YACX,OAAOG;QACT;QAEA,MAAM,IAAIjB,UAAU,CAAC,SAAS,EAAEE,aAAa,gBAAgB,CAAC,EAAE;IAClE;AACF"}
@@ -0,0 +1,44 @@
1
+ import { subdebug } from '@sanity/cli-core';
2
+ import { spinner } from '@sanity/cli-core/ux';
3
+ import { createDataset as createDatasetService } from '../../../services/datasets.js';
4
+ import { listOrganizations } from '../../../services/organizations.js';
5
+ import { createProject } from '../../../services/projects.js';
6
+ import { promptUserForOrganization } from './promptUserForOrganization.js';
7
+ const debug = subdebug('init');
8
+ export async function createProjectFromName({ coupon, createProjectName, dataset, organization, planId, user, visibility }) {
9
+ debug('--project-name specified, creating a new project');
10
+ let orgForCreateProjectFlag = organization;
11
+ if (!orgForCreateProjectFlag) {
12
+ debug('no organization specified, selecting one');
13
+ const organizations = await listOrganizations();
14
+ orgForCreateProjectFlag = await promptUserForOrganization({
15
+ organizations,
16
+ user
17
+ });
18
+ }
19
+ debug('creating a new project');
20
+ const createdProject = await createProject({
21
+ displayName: createProjectName.trim(),
22
+ metadata: {
23
+ coupon
24
+ },
25
+ organizationId: orgForCreateProjectFlag,
26
+ subscription: planId ? {
27
+ planId
28
+ } : undefined
29
+ });
30
+ debug('Project with ID %s created', createdProject.projectId);
31
+ if (dataset) {
32
+ debug('--dataset specified, creating dataset (%s)', dataset);
33
+ const spin = spinner('Creating dataset').start();
34
+ await createDatasetService({
35
+ aclMode: visibility,
36
+ datasetName: dataset,
37
+ projectId: createdProject.projectId
38
+ });
39
+ spin.succeed();
40
+ }
41
+ return createdProject.projectId;
42
+ }
43
+
44
+ //# sourceMappingURL=createProjectFromName.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/actions/init/project/createProjectFromName.ts"],"sourcesContent":["import {type SanityOrgUser, subdebug} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\nimport {type DatasetAclMode} from '@sanity/client'\n\nimport {createDataset as createDatasetService} from '../../../services/datasets.js'\nimport {listOrganizations} from '../../../services/organizations.js'\nimport {createProject} from '../../../services/projects.js'\nimport {promptUserForOrganization} from './promptUserForOrganization.js'\n\nconst debug = subdebug('init')\n\nexport async function createProjectFromName({\n coupon,\n createProjectName,\n dataset,\n organization,\n planId,\n user,\n visibility,\n}: {\n coupon: string | undefined\n createProjectName: string\n dataset: string | undefined\n organization: string | undefined\n planId: string | undefined\n user: SanityOrgUser\n visibility: 'private' | 'public' | undefined\n}): Promise<string> {\n debug('--project-name specified, creating a new project')\n\n let orgForCreateProjectFlag = organization\n\n if (!orgForCreateProjectFlag) {\n debug('no organization specified, selecting one')\n const organizations = await listOrganizations()\n orgForCreateProjectFlag = await promptUserForOrganization({\n organizations,\n user,\n })\n }\n\n debug('creating a new project')\n const createdProject = await createProject({\n displayName: createProjectName.trim(),\n metadata: {coupon},\n organizationId: orgForCreateProjectFlag,\n subscription: planId ? {planId} : undefined,\n })\n\n debug('Project with ID %s created', createdProject.projectId)\n if (dataset) {\n debug('--dataset specified, creating dataset (%s)', dataset)\n const spin = spinner('Creating dataset').start()\n await createDatasetService({\n aclMode: visibility as DatasetAclMode | undefined,\n datasetName: dataset,\n projectId: createdProject.projectId,\n })\n spin.succeed()\n }\n\n return createdProject.projectId\n}\n"],"names":["subdebug","spinner","createDataset","createDatasetService","listOrganizations","createProject","promptUserForOrganization","debug","createProjectFromName","coupon","createProjectName","dataset","organization","planId","user","visibility","orgForCreateProjectFlag","organizations","createdProject","displayName","trim","metadata","organizationId","subscription","undefined","projectId","spin","start","aclMode","datasetName","succeed"],"mappings":"AAAA,SAA4BA,QAAQ,QAAO,mBAAkB;AAC7D,SAAQC,OAAO,QAAO,sBAAqB;AAG3C,SAAQC,iBAAiBC,oBAAoB,QAAO,gCAA+B;AACnF,SAAQC,iBAAiB,QAAO,qCAAoC;AACpE,SAAQC,aAAa,QAAO,gCAA+B;AAC3D,SAAQC,yBAAyB,QAAO,iCAAgC;AAExE,MAAMC,QAAQP,SAAS;AAEvB,OAAO,eAAeQ,sBAAsB,EAC1CC,MAAM,EACNC,iBAAiB,EACjBC,OAAO,EACPC,YAAY,EACZC,MAAM,EACNC,IAAI,EACJC,UAAU,EASX;IACCR,MAAM;IAEN,IAAIS,0BAA0BJ;IAE9B,IAAI,CAACI,yBAAyB;QAC5BT,MAAM;QACN,MAAMU,gBAAgB,MAAMb;QAC5BY,0BAA0B,MAAMV,0BAA0B;YACxDW;YACAH;QACF;IACF;IAEAP,MAAM;IACN,MAAMW,iBAAiB,MAAMb,cAAc;QACzCc,aAAaT,kBAAkBU,IAAI;QACnCC,UAAU;YAACZ;QAAM;QACjBa,gBAAgBN;QAChBO,cAAcV,SAAS;YAACA;QAAM,IAAIW;IACpC;IAEAjB,MAAM,8BAA8BW,eAAeO,SAAS;IAC5D,IAAId,SAAS;QACXJ,MAAM,8CAA8CI;QACpD,MAAMe,OAAOzB,QAAQ,oBAAoB0B,KAAK;QAC9C,MAAMxB,qBAAqB;YACzByB,SAASb;YACTc,aAAalB;YACbc,WAAWP,eAAeO,SAAS;QACrC;QACAC,KAAKI,OAAO;IACd;IAEA,OAAOZ,eAAeO,SAAS;AACjC"}