@sanity/cli 6.4.0 → 6.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/README.md +201 -103
  2. package/dist/actions/build/buildApp.js +46 -17
  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 +80 -30
  7. package/dist/actions/build/buildStudio.js.map +1 -1
  8. package/dist/actions/build/buildVendorDependencies.js +10 -9
  9. package/dist/actions/build/buildVendorDependencies.js.map +1 -1
  10. package/dist/actions/build/checkRequiredDependencies.js +6 -9
  11. package/dist/actions/build/checkRequiredDependencies.js.map +1 -1
  12. package/dist/actions/build/checkStudioDependencyVersions.js +10 -11
  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 +4 -2
  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 +3 -3
  26. package/dist/actions/codemods/reactIconsV3.js.map +1 -1
  27. package/dist/actions/deploy/deployApp.js +1 -1
  28. package/dist/actions/deploy/deployApp.js.map +1 -1
  29. package/dist/actions/deploy/deployStudio.js +1 -2
  30. package/dist/actions/deploy/deployStudio.js.map +1 -1
  31. package/dist/actions/dev/startStudioDevServer.js +3 -4
  32. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  33. package/dist/actions/doctor/types.js.map +1 -1
  34. package/dist/actions/graphql/resolveGraphQLApisFromWorkspaces.js.map +1 -1
  35. package/dist/actions/init/bootstrapTemplate.js.map +1 -1
  36. package/dist/actions/init/checkNextJsReactCompatibility.js +3 -3
  37. package/dist/actions/init/checkNextJsReactCompatibility.js.map +1 -1
  38. package/dist/actions/init/initAction.js +287 -0
  39. package/dist/actions/init/initAction.js.map +1 -0
  40. package/dist/actions/init/initApp.js +7 -16
  41. package/dist/actions/init/initApp.js.map +1 -1
  42. package/dist/actions/init/initError.js +10 -0
  43. package/dist/actions/init/initError.js.map +1 -0
  44. package/dist/actions/init/initHelpers.js +3 -12
  45. package/dist/actions/init/initHelpers.js.map +1 -1
  46. package/dist/actions/init/initNextJs.js +17 -20
  47. package/dist/actions/init/initNextJs.js.map +1 -1
  48. package/dist/actions/init/initStudio.js +11 -20
  49. package/dist/actions/init/initStudio.js.map +1 -1
  50. package/dist/actions/init/plan/getPlan.js +15 -0
  51. package/dist/actions/init/plan/getPlan.js.map +1 -0
  52. package/dist/actions/init/plan/verifyCoupon.js +35 -0
  53. package/dist/actions/init/plan/verifyCoupon.js.map +1 -0
  54. package/dist/actions/init/plan/verifyPlan.js +34 -0
  55. package/dist/actions/init/plan/verifyPlan.js.map +1 -0
  56. package/dist/actions/init/project/createProjectFromName.js +44 -0
  57. package/dist/actions/init/project/createProjectFromName.js.map +1 -0
  58. package/dist/actions/init/project/getOrCreateDataset.js +126 -0
  59. package/dist/actions/init/project/getOrCreateDataset.js.map +1 -0
  60. package/dist/actions/init/project/getOrCreateProject.js +128 -0
  61. package/dist/actions/init/project/getOrCreateProject.js.map +1 -0
  62. package/dist/actions/init/project/getProjectDetails.js +87 -0
  63. package/dist/actions/init/project/getProjectDetails.js.map +1 -0
  64. package/dist/actions/init/project/getProjectOutputPath.js +17 -0
  65. package/dist/actions/init/project/getProjectOutputPath.js.map +1 -0
  66. package/dist/actions/init/project/promptForAppTemplateSetup.js +112 -0
  67. package/dist/actions/init/project/promptForAppTemplateSetup.js.map +1 -0
  68. package/dist/actions/init/project/promptForProjectCreation.js +40 -0
  69. package/dist/actions/init/project/promptForProjectCreation.js.map +1 -0
  70. package/dist/actions/init/project/promptUserForNewOrganization.js +12 -0
  71. package/dist/actions/init/project/promptUserForNewOrganization.js.map +1 -0
  72. package/dist/actions/init/project/promptUserForOrganization.js +38 -0
  73. package/dist/actions/init/project/promptUserForOrganization.js.map +1 -0
  74. package/dist/actions/init/scaffoldTemplate.js +23 -29
  75. package/dist/actions/init/scaffoldTemplate.js.map +1 -1
  76. package/dist/actions/init/types.js +47 -1
  77. package/dist/actions/init/types.js.map +1 -1
  78. package/dist/actions/manifest/extractAppManifest.js +3 -2
  79. package/dist/actions/manifest/extractAppManifest.js.map +1 -1
  80. package/dist/actions/manifest/types.js +9 -1
  81. package/dist/actions/manifest/types.js.map +1 -1
  82. package/dist/actions/manifest/writeManifestFile.js +1 -2
  83. package/dist/actions/manifest/writeManifestFile.js.map +1 -1
  84. package/dist/actions/schema/uploadSchemaToLexicon.js +1 -2
  85. package/dist/actions/schema/uploadSchemaToLexicon.js.map +1 -1
  86. package/dist/actions/versions/buildPackageArray.js +3 -3
  87. package/dist/actions/versions/buildPackageArray.js.map +1 -1
  88. package/dist/actions/versions/findSanityModulesVersions.js +3 -3
  89. package/dist/actions/versions/findSanityModulesVersions.js.map +1 -1
  90. package/dist/commands/datasets/copy.js.map +1 -1
  91. package/dist/commands/init.js +11 -911
  92. package/dist/commands/init.js.map +1 -1
  93. package/dist/constants.js +8 -0
  94. package/dist/constants.js.map +1 -0
  95. package/dist/server/previewServer.js +1 -1
  96. package/dist/server/previewServer.js.map +1 -1
  97. package/dist/server/vite/plugin-sanity-build-entries.js +2 -1
  98. package/dist/server/vite/plugin-sanity-build-entries.js.map +1 -1
  99. package/dist/services/datasets.js.map +1 -1
  100. package/dist/services/userApplications.js.map +1 -1
  101. package/dist/telemetry/init.telemetry.js.map +1 -1
  102. package/dist/util/compareDependencyVersions.js +5 -6
  103. package/dist/util/compareDependencyVersions.js.map +1 -1
  104. package/dist/util/createExpiringConfig.js +1 -1
  105. package/dist/util/createExpiringConfig.js.map +1 -1
  106. package/dist/util/packageManager/installationInfo/analyzeIssues.js +7 -7
  107. package/dist/util/packageManager/installationInfo/analyzeIssues.js.map +1 -1
  108. package/dist/util/packageManager/installationInfo/types.js.map +1 -1
  109. package/dist/util/packageManager/packageManagerChoice.js +2 -2
  110. package/dist/util/packageManager/packageManagerChoice.js.map +1 -1
  111. package/dist/util/packageManager/preferredPm.js +106 -0
  112. package/dist/util/packageManager/preferredPm.js.map +1 -0
  113. package/oclif.manifest.json +526 -526
  114. package/package.json +27 -26
  115. package/dist/util/getLocalPackageVersion.js +0 -55
  116. package/dist/util/getLocalPackageVersion.js.map +0 -1
@@ -0,0 +1,287 @@
1
+ import { styleText } from 'node:util';
2
+ import { subdebug } from '@sanity/cli-core';
3
+ import { logSymbols, spinner } from '@sanity/cli-core/ux';
4
+ import { frameworks } from '@vercel/frameworks';
5
+ import deburr from 'lodash-es/deburr.js';
6
+ import { promptForConfigFiles } from '../../prompts/init/nextjs.js';
7
+ import { getCliUser } from '../../services/user.js';
8
+ import { CLIInitStepCompleted } from '../../telemetry/init.telemetry.js';
9
+ import { detectFrameworkRecord } from '../../util/detectFramework.js';
10
+ import { getProjectDefaults } from '../../util/getProjectDefaults.js';
11
+ import { validateSession } from '../auth/ensureAuthenticated.js';
12
+ import { getProviderName } from '../auth/getProviderName.js';
13
+ import { login } from '../auth/login/login.js';
14
+ import { setupMCP } from '../mcp/setupMCP.js';
15
+ import { checkNextJsReactCompatibility } from './checkNextJsReactCompatibility.js';
16
+ import { determineAppTemplate } from './determineAppTemplate.js';
17
+ import { createOrAppendEnvVars } from './env/createOrAppendEnvVars.js';
18
+ import { initApp } from './initApp.js';
19
+ import { InitError } from './initError.js';
20
+ import { flagOrDefault, shouldPrompt, writeStagingEnvIfNeeded } from './initHelpers.js';
21
+ import { initNextJs } from './initNextJs.js';
22
+ import { initStudio } from './initStudio.js';
23
+ import { getPlan } from './plan/getPlan.js';
24
+ import { createProjectFromName } from './project/createProjectFromName.js';
25
+ import { getProjectDetails } from './project/getProjectDetails.js';
26
+ import { getProjectOutputPath } from './project/getProjectOutputPath.js';
27
+ import { checkIsRemoteTemplate, getGitHubRepoInfo } from './remoteTemplate.js';
28
+ const debug = subdebug('init');
29
+ export async function initAction(options, context) {
30
+ const { output, workDir } = context;
31
+ if (options.argType) {
32
+ throw new InitError(options.argType === 'plugin' ? 'Initializing plugins through the CLI is no longer supported' : `Unknown init type "${options.argType}"`, 1);
33
+ }
34
+ const trace = context.telemetry.trace(CLIInitStepCompleted);
35
+ if (options.reconfigure) {
36
+ throw new InitError('--reconfigure is deprecated - manual configuration is now required', 1);
37
+ }
38
+ if (options.project && options.organization) {
39
+ throw new InitError('You have specified both a project and an organization. To move a project to an organization please visit https://www.sanity.io/manage', 1);
40
+ }
41
+ const defaultConfig = options.datasetDefault;
42
+ let showDefaultConfigPrompt = !defaultConfig;
43
+ if (options.dataset || options.visibility || options.datasetDefault || options.unattended) {
44
+ showDefaultConfigPrompt = false;
45
+ }
46
+ const detectedFramework = await detectFrameworkRecord({
47
+ frameworkList: frameworks,
48
+ rootPath: workDir
49
+ });
50
+ const isNextJs = detectedFramework?.slug === 'nextjs';
51
+ let remoteTemplateInfo;
52
+ if (options.template && checkIsRemoteTemplate(options.template)) {
53
+ remoteTemplateInfo = await getGitHubRepoInfo(options.template, options.templateToken);
54
+ }
55
+ if (detectedFramework && detectedFramework.slug !== 'sanity' && remoteTemplateInfo) {
56
+ throw new InitError(`A remote template cannot be used with a detected framework. Detected: ${detectedFramework.name}`, 1);
57
+ }
58
+ const isAppTemplate = options.template ? determineAppTemplate(options.template) : false;
59
+ if (options.unattended) {
60
+ checkFlagsInUnattendedMode(options, {
61
+ isAppTemplate,
62
+ isNextJs
63
+ });
64
+ }
65
+ trace.start();
66
+ trace.log({
67
+ flags: {
68
+ bare: options.bare,
69
+ coupon: options.coupon,
70
+ defaultConfig,
71
+ env: options.env,
72
+ git: typeof options.git === 'string' ? options.git : undefined,
73
+ plan: options.projectPlan,
74
+ reconfigure: options.reconfigure,
75
+ unattended: options.unattended
76
+ },
77
+ step: 'start'
78
+ });
79
+ const planId = await getPlan(options, output, trace);
80
+ let envFilenameDefault = '.env';
81
+ if (detectedFramework && detectedFramework.slug === 'nextjs') {
82
+ envFilenameDefault = '.env.local';
83
+ }
84
+ const envFilename = typeof options.env === 'string' ? options.env : envFilenameDefault;
85
+ const { user } = await ensureAuthenticated(options, output, trace);
86
+ if (!isAppTemplate) {
87
+ output.log(`${logSymbols.success} Fetching existing projects`);
88
+ output.log('');
89
+ }
90
+ let newProject;
91
+ if (options.projectName) {
92
+ newProject = await createProjectFromName({
93
+ coupon: options.coupon,
94
+ createProjectName: options.projectName,
95
+ dataset: options.dataset,
96
+ organization: options.organization,
97
+ planId,
98
+ user,
99
+ visibility: options.visibility
100
+ });
101
+ }
102
+ const { datasetName, displayName, isFirstProject, organizationId, projectId } = await getProjectDetails({
103
+ coupon: options.coupon,
104
+ dataset: options.dataset,
105
+ datasetDefault: options.datasetDefault,
106
+ isAppTemplate,
107
+ newProject,
108
+ organization: options.organization,
109
+ output,
110
+ planId,
111
+ project: options.project,
112
+ showDefaultConfigPrompt,
113
+ trace,
114
+ unattended: options.unattended,
115
+ user,
116
+ visibility: options.visibility
117
+ });
118
+ if (options.bare) {
119
+ output.log(`${logSymbols.success} Below are your project details`);
120
+ output.log('');
121
+ output.log(`Project ID: ${styleText('cyan', projectId)}`);
122
+ output.log(`Dataset: ${styleText('cyan', datasetName)}`);
123
+ output.log(`\nYou can find your project on Sanity Manage — https://www.sanity.io/manage/project/${projectId}\n`);
124
+ trace.complete();
125
+ return;
126
+ }
127
+ let initNext = flagOrDefault(options.nextjsAddConfigFiles, false);
128
+ if (isNextJs && shouldPrompt(options.unattended, options.nextjsAddConfigFiles)) {
129
+ initNext = await promptForConfigFiles();
130
+ }
131
+ trace.log({
132
+ detectedFramework: detectedFramework?.name,
133
+ selectedOption: initNext ? 'yes' : 'no',
134
+ step: 'useDetectedFramework'
135
+ });
136
+ const sluggedName = deburr(displayName.toLowerCase()).replaceAll(/\s+/g, '-').replaceAll(/[^a-z0-9-]/g, '');
137
+ const initFramework = initNext;
138
+ const defaults = await getProjectDefaults({
139
+ isPlugin: false,
140
+ workDir
141
+ });
142
+ const outputPath = await getProjectOutputPath({
143
+ initFramework,
144
+ outputPath: options.outputPath,
145
+ sluggedName,
146
+ unattended: options.unattended,
147
+ useEnv: Boolean(options.env),
148
+ workDir
149
+ });
150
+ const mcpResult = await setupMCP({
151
+ mode: options.mcpMode
152
+ });
153
+ trace.log({
154
+ configuredEditors: mcpResult.configuredEditors,
155
+ detectedEditors: mcpResult.detectedEditors,
156
+ skipped: mcpResult.skipped,
157
+ step: 'mcpSetup'
158
+ });
159
+ if (mcpResult.error) {
160
+ trace.error(mcpResult.error);
161
+ }
162
+ const mcpConfigured = mcpResult.configuredEditors;
163
+ const { alreadyConfiguredEditors } = mcpResult;
164
+ if (alreadyConfiguredEditors.length > 0) {
165
+ const label = alreadyConfiguredEditors.length === 1 ? `${alreadyConfiguredEditors[0]} already configured for Sanity MCP` : `${alreadyConfiguredEditors.length} editors already configured for Sanity MCP`;
166
+ spinner(label).start().succeed();
167
+ }
168
+ if (isNextJs) {
169
+ await checkNextJsReactCompatibility({
170
+ detectedFramework,
171
+ output,
172
+ outputPath
173
+ });
174
+ }
175
+ if (initNext) {
176
+ await initNextJs({
177
+ datasetName,
178
+ detectedFramework,
179
+ envFilename,
180
+ mcpConfigured,
181
+ options,
182
+ output,
183
+ projectId,
184
+ trace,
185
+ workDir
186
+ });
187
+ trace.complete();
188
+ return;
189
+ }
190
+ if (options.env) {
191
+ await createOrAppendEnvVars({
192
+ envVars: {
193
+ DATASET: datasetName,
194
+ PROJECT_ID: projectId
195
+ },
196
+ filename: envFilename,
197
+ framework: detectedFramework,
198
+ log: false,
199
+ output,
200
+ outputPath
201
+ });
202
+ await writeStagingEnvIfNeeded(output, outputPath);
203
+ trace.complete();
204
+ return;
205
+ }
206
+ const sharedParams = {
207
+ defaults,
208
+ mcpConfigured,
209
+ options,
210
+ organizationId,
211
+ output,
212
+ outputPath,
213
+ remoteTemplateInfo,
214
+ sluggedName,
215
+ trace,
216
+ workDir
217
+ };
218
+ await (isAppTemplate ? initApp({
219
+ ...sharedParams,
220
+ datasetName,
221
+ projectId
222
+ }) : initStudio({
223
+ ...sharedParams,
224
+ datasetName,
225
+ displayName,
226
+ isFirstProject,
227
+ projectId
228
+ }));
229
+ trace.complete();
230
+ }
231
+ function checkFlagsInUnattendedMode(options, { isAppTemplate, isNextJs }) {
232
+ debug('Unattended mode, validating required options');
233
+ if (options.projectName && !options.organization) {
234
+ throw new InitError('`--project-name` requires `--organization <id>` in unattended mode', 1);
235
+ }
236
+ if (isAppTemplate) {
237
+ if (!options.outputPath) {
238
+ throw new InitError('`--output-path` must be specified in unattended mode', 1);
239
+ }
240
+ const hasProjectFlag = Boolean(options.project || options.projectName);
241
+ if (!hasProjectFlag && !options.organization) {
242
+ throw new InitError('The --organization flag is required for app templates in unattended mode. ' + 'Use --organization <id>, or pass --project <id> / --project-name <name>.', 1);
243
+ }
244
+ return;
245
+ }
246
+ if (!isNextJs && !options.bare && !options.outputPath) {
247
+ throw new InitError('`--output-path` must be specified in unattended mode', 1);
248
+ }
249
+ if (!options.project && !options.projectName) {
250
+ throw new InitError('`--project <id>` or `--project-name <name>` must be specified in unattended mode', 1);
251
+ }
252
+ }
253
+ async function ensureAuthenticated(options, output, trace) {
254
+ const user = await validateSession();
255
+ if (user) {
256
+ trace.log({
257
+ alreadyLoggedIn: true,
258
+ step: 'login'
259
+ });
260
+ output.log(`${logSymbols.success} You are logged in as ${user.email} using ${getProviderName(user.provider)}`);
261
+ return {
262
+ user
263
+ };
264
+ }
265
+ if (options.unattended) {
266
+ throw new InitError('Must be logged in to run this command in unattended mode, run `sanity login`', 1);
267
+ }
268
+ trace.log({
269
+ step: 'login'
270
+ });
271
+ try {
272
+ await login({
273
+ output,
274
+ telemetry: trace.newContext('login')
275
+ });
276
+ } catch (error) {
277
+ const message = error instanceof Error ? error.message : String(error);
278
+ throw new InitError(`Login failed: ${message}`, 1);
279
+ }
280
+ const loggedInUser = await getCliUser();
281
+ output.log(`${logSymbols.success} You are logged in as ${loggedInUser.email} using ${getProviderName(loggedInUser.provider)}`);
282
+ return {
283
+ user: loggedInUser
284
+ };
285
+ }
286
+
287
+ //# sourceMappingURL=initAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/init/initAction.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {type SanityOrgUser, subdebug, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {logSymbols, spinner} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\nimport {type Framework, frameworks} from '@vercel/frameworks'\nimport deburr from 'lodash-es/deburr.js'\n\nimport {promptForConfigFiles} from '../../prompts/init/nextjs.js'\nimport {getCliUser} from '../../services/user.js'\nimport {CLIInitStepCompleted, type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {detectFrameworkRecord} from '../../util/detectFramework.js'\nimport {getProjectDefaults} from '../../util/getProjectDefaults.js'\nimport {validateSession} from '../auth/ensureAuthenticated.js'\nimport {getProviderName} from '../auth/getProviderName.js'\nimport {login} from '../auth/login/login.js'\nimport {setupMCP} from '../mcp/setupMCP.js'\nimport {checkNextJsReactCompatibility} from './checkNextJsReactCompatibility.js'\nimport {determineAppTemplate} from './determineAppTemplate.js'\nimport {createOrAppendEnvVars} from './env/createOrAppendEnvVars.js'\nimport {initApp} from './initApp.js'\nimport {InitError} from './initError.js'\nimport {flagOrDefault, shouldPrompt, writeStagingEnvIfNeeded} from './initHelpers.js'\nimport {initNextJs} from './initNextJs.js'\nimport {initStudio} from './initStudio.js'\nimport {getPlan} from './plan/getPlan.js'\nimport {createProjectFromName} from './project/createProjectFromName.js'\nimport {getProjectDetails} from './project/getProjectDetails.js'\nimport {getProjectOutputPath} from './project/getProjectOutputPath.js'\nimport {checkIsRemoteTemplate, getGitHubRepoInfo, type RepoInfo} from './remoteTemplate.js'\nimport {type InitContext, type InitOptions} from './types.js'\n\nconst debug = subdebug('init')\n\nexport async function initAction(options: InitOptions, context: InitContext): Promise<void> {\n const {output, workDir} = context\n\n if (options.argType) {\n throw new InitError(\n options.argType === 'plugin'\n ? 'Initializing plugins through the CLI is no longer supported'\n : `Unknown init type \"${options.argType}\"`,\n 1,\n )\n }\n\n const trace = context.telemetry.trace(CLIInitStepCompleted)\n\n if (options.reconfigure) {\n throw new InitError('--reconfigure is deprecated - manual configuration is now required', 1)\n }\n\n if (options.project && options.organization) {\n throw new InitError(\n 'You have specified both a project and an organization. To move a project to an organization please visit https://www.sanity.io/manage',\n 1,\n )\n }\n\n const defaultConfig = options.datasetDefault\n let showDefaultConfigPrompt = !defaultConfig\n if (options.dataset || options.visibility || options.datasetDefault || options.unattended) {\n showDefaultConfigPrompt = false\n }\n\n const detectedFramework = await detectFrameworkRecord({\n frameworkList: frameworks as readonly Framework[],\n rootPath: workDir,\n })\n const isNextJs = detectedFramework?.slug === 'nextjs'\n\n let remoteTemplateInfo: RepoInfo | undefined\n if (options.template && checkIsRemoteTemplate(options.template)) {\n remoteTemplateInfo = await getGitHubRepoInfo(options.template, options.templateToken)\n }\n\n if (detectedFramework && detectedFramework.slug !== 'sanity' && remoteTemplateInfo) {\n throw new InitError(\n `A remote template cannot be used with a detected framework. Detected: ${detectedFramework.name}`,\n 1,\n )\n }\n\n const isAppTemplate = options.template ? determineAppTemplate(options.template) : false\n\n if (options.unattended) {\n checkFlagsInUnattendedMode(options, {isAppTemplate, isNextJs})\n }\n\n trace.start()\n trace.log({\n flags: {\n bare: options.bare,\n coupon: options.coupon,\n defaultConfig,\n env: options.env,\n git: typeof options.git === 'string' ? options.git : undefined,\n plan: options.projectPlan,\n reconfigure: options.reconfigure,\n unattended: options.unattended,\n },\n step: 'start',\n })\n\n const planId = await getPlan(options, output, trace)\n\n let envFilenameDefault = '.env'\n if (detectedFramework && detectedFramework.slug === 'nextjs') {\n envFilenameDefault = '.env.local'\n }\n const envFilename = typeof options.env === 'string' ? options.env : envFilenameDefault\n\n const {user} = await ensureAuthenticated(options, output, trace)\n if (!isAppTemplate) {\n output.log(`${logSymbols.success} Fetching existing projects`)\n output.log('')\n }\n\n let newProject: string | undefined\n if (options.projectName) {\n newProject = await createProjectFromName({\n coupon: options.coupon,\n createProjectName: options.projectName,\n dataset: options.dataset,\n organization: options.organization,\n planId,\n user,\n visibility: options.visibility,\n })\n }\n\n const {datasetName, displayName, isFirstProject, organizationId, projectId} =\n await getProjectDetails({\n coupon: options.coupon,\n dataset: options.dataset,\n datasetDefault: options.datasetDefault,\n isAppTemplate,\n newProject,\n organization: options.organization,\n output,\n planId,\n project: options.project,\n showDefaultConfigPrompt,\n trace,\n unattended: options.unattended,\n user,\n visibility: options.visibility,\n })\n\n if (options.bare) {\n output.log(`${logSymbols.success} Below are your project details`)\n output.log('')\n output.log(`Project ID: ${styleText('cyan', projectId)}`)\n output.log(`Dataset: ${styleText('cyan', datasetName)}`)\n output.log(\n `\\nYou can find your project on Sanity Manage — https://www.sanity.io/manage/project/${projectId}\\n`,\n )\n trace.complete()\n return\n }\n\n let initNext = flagOrDefault(options.nextjsAddConfigFiles, false)\n if (isNextJs && shouldPrompt(options.unattended, options.nextjsAddConfigFiles)) {\n initNext = await promptForConfigFiles()\n }\n\n trace.log({\n detectedFramework: detectedFramework?.name,\n selectedOption: initNext ? 'yes' : 'no',\n step: 'useDetectedFramework',\n })\n\n const sluggedName = deburr(displayName.toLowerCase())\n .replaceAll(/\\s+/g, '-')\n .replaceAll(/[^a-z0-9-]/g, '')\n\n const initFramework = initNext\n\n const defaults = await getProjectDefaults({isPlugin: false, workDir})\n\n const outputPath = await getProjectOutputPath({\n initFramework,\n outputPath: options.outputPath,\n sluggedName,\n unattended: options.unattended,\n useEnv: Boolean(options.env),\n workDir,\n })\n\n const mcpResult = await setupMCP({mode: options.mcpMode})\n\n trace.log({\n configuredEditors: mcpResult.configuredEditors,\n detectedEditors: mcpResult.detectedEditors,\n skipped: mcpResult.skipped,\n step: 'mcpSetup',\n })\n if (mcpResult.error) {\n trace.error(mcpResult.error)\n }\n const mcpConfigured = mcpResult.configuredEditors\n\n const {alreadyConfiguredEditors} = mcpResult\n if (alreadyConfiguredEditors.length > 0) {\n const label =\n alreadyConfiguredEditors.length === 1\n ? `${alreadyConfiguredEditors[0]} already configured for Sanity MCP`\n : `${alreadyConfiguredEditors.length} editors already configured for Sanity MCP`\n spinner(label).start().succeed()\n }\n\n if (isNextJs) {\n await checkNextJsReactCompatibility({\n detectedFramework,\n output,\n outputPath,\n })\n }\n\n if (initNext) {\n await initNextJs({\n datasetName,\n detectedFramework,\n envFilename,\n mcpConfigured,\n options,\n output,\n projectId,\n trace,\n workDir,\n })\n trace.complete()\n return\n }\n\n if (options.env) {\n await createOrAppendEnvVars({\n envVars: {\n DATASET: datasetName,\n PROJECT_ID: projectId,\n },\n filename: envFilename,\n framework: detectedFramework,\n log: false,\n output,\n outputPath,\n })\n await writeStagingEnvIfNeeded(output, outputPath)\n trace.complete()\n return\n }\n\n const sharedParams = {\n defaults,\n mcpConfigured,\n options,\n organizationId,\n output,\n outputPath,\n remoteTemplateInfo,\n sluggedName,\n trace,\n workDir,\n }\n\n await (isAppTemplate\n ? initApp({...sharedParams, datasetName, projectId})\n : initStudio({\n ...sharedParams,\n datasetName,\n displayName,\n isFirstProject,\n projectId,\n }))\n\n trace.complete()\n}\n\nfunction checkFlagsInUnattendedMode(\n options: InitOptions,\n {isAppTemplate, isNextJs}: {isAppTemplate: boolean; isNextJs: boolean},\n): void {\n debug('Unattended mode, validating required options')\n\n if (options.projectName && !options.organization) {\n throw new InitError('`--project-name` requires `--organization <id>` in unattended mode', 1)\n }\n\n if (isAppTemplate) {\n if (!options.outputPath) {\n throw new InitError('`--output-path` must be specified in unattended mode', 1)\n }\n\n const hasProjectFlag = Boolean(options.project || options.projectName)\n\n if (!hasProjectFlag && !options.organization) {\n throw new InitError(\n 'The --organization flag is required for app templates in unattended mode. ' +\n 'Use --organization <id>, or pass --project <id> / --project-name <name>.',\n 1,\n )\n }\n\n return\n }\n\n if (!isNextJs && !options.bare && !options.outputPath) {\n throw new InitError('`--output-path` must be specified in unattended mode', 1)\n }\n\n if (!options.project && !options.projectName) {\n throw new InitError(\n '`--project <id>` or `--project-name <name>` must be specified in unattended mode',\n 1,\n )\n }\n}\n\nasync function ensureAuthenticated(\n options: InitOptions,\n output: InitContext['output'],\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>,\n): Promise<{user: SanityOrgUser}> {\n const user = await validateSession()\n\n if (user) {\n trace.log({alreadyLoggedIn: true, step: 'login'})\n output.log(\n `${logSymbols.success} You are logged in as ${user.email} using ${getProviderName(user.provider)}`,\n )\n return {user}\n }\n\n if (options.unattended) {\n throw new InitError(\n 'Must be logged in to run this command in unattended mode, run `sanity login`',\n 1,\n )\n }\n\n trace.log({step: 'login'})\n\n try {\n await login({\n output,\n telemetry: trace.newContext('login'),\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new InitError(`Login failed: ${message}`, 1)\n }\n\n const loggedInUser = await getCliUser()\n\n output.log(\n `${logSymbols.success} You are logged in as ${loggedInUser.email} using ${getProviderName(loggedInUser.provider)}`,\n )\n return {user: loggedInUser}\n}\n"],"names":["styleText","subdebug","logSymbols","spinner","frameworks","deburr","promptForConfigFiles","getCliUser","CLIInitStepCompleted","detectFrameworkRecord","getProjectDefaults","validateSession","getProviderName","login","setupMCP","checkNextJsReactCompatibility","determineAppTemplate","createOrAppendEnvVars","initApp","InitError","flagOrDefault","shouldPrompt","writeStagingEnvIfNeeded","initNextJs","initStudio","getPlan","createProjectFromName","getProjectDetails","getProjectOutputPath","checkIsRemoteTemplate","getGitHubRepoInfo","debug","initAction","options","context","output","workDir","argType","trace","telemetry","reconfigure","project","organization","defaultConfig","datasetDefault","showDefaultConfigPrompt","dataset","visibility","unattended","detectedFramework","frameworkList","rootPath","isNextJs","slug","remoteTemplateInfo","template","templateToken","name","isAppTemplate","checkFlagsInUnattendedMode","start","log","flags","bare","coupon","env","git","undefined","plan","projectPlan","step","planId","envFilenameDefault","envFilename","user","ensureAuthenticated","success","newProject","projectName","createProjectName","datasetName","displayName","isFirstProject","organizationId","projectId","complete","initNext","nextjsAddConfigFiles","selectedOption","sluggedName","toLowerCase","replaceAll","initFramework","defaults","isPlugin","outputPath","useEnv","Boolean","mcpResult","mode","mcpMode","configuredEditors","detectedEditors","skipped","error","mcpConfigured","alreadyConfiguredEditors","length","label","succeed","envVars","DATASET","PROJECT_ID","filename","framework","sharedParams","hasProjectFlag","alreadyLoggedIn","email","provider","newContext","message","Error","String","loggedInUser"],"mappings":"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"}
@@ -1,43 +1,34 @@
1
1
  import { styleText } from 'node:util';
2
2
  import { logSymbols } from '@sanity/cli-core/ux';
3
+ import { InitError } from './initError.js';
3
4
  import { getPostInitMCPPrompt } from './initHelpers.js';
4
5
  import { scaffoldAndInstall, selectTemplate } from './scaffoldTemplate.js';
5
- export async function initApp({ autoUpdates, datasetName, defaults, error, git, mcpConfigured, noGit, organizationId, output, outputPath, overwriteFiles, packageManager, projectId, remoteTemplateInfo, sluggedName, template, templateToken, trace, typescript, unattended, workDir }) {
6
+ export async function initApp({ datasetName, defaults, mcpConfigured, options, organizationId, output, outputPath, projectId, remoteTemplateInfo, sluggedName, trace, workDir }) {
6
7
  const { template: resolvedTemplate, templateName, useTypeScript } = await selectTemplate({
8
+ options,
7
9
  remoteTemplateInfo,
8
- template,
9
- trace,
10
- typescript,
11
- unattended
10
+ trace
12
11
  });
13
12
  if (!remoteTemplateInfo && !resolvedTemplate) {
14
- error(`Template "${templateName}" not found`, {
15
- exit: 1
16
- });
13
+ throw new InitError(`Template "${templateName}" not found`, 1);
17
14
  }
18
15
  await scaffoldAndInstall({
19
- autoUpdates,
20
16
  datasetName,
21
17
  defaults,
22
18
  displayName: '',
23
- git,
24
- noGit,
19
+ options,
25
20
  organizationId,
26
21
  output,
27
22
  outputPath,
28
- overwriteFiles,
29
- packageManager,
30
23
  projectId,
31
24
  remoteTemplateInfo,
32
25
  sluggedName,
33
26
  templateName,
34
- templateToken,
35
27
  trace,
36
- unattended,
37
28
  useTypeScript,
38
29
  workDir
39
30
  });
40
- const isCurrentDir = outputPath === process.cwd();
31
+ const isCurrentDir = outputPath === workDir;
41
32
  const goToProjectDir = `\n(${styleText('cyan', `cd ${outputPath}`)} to navigate to your new project directory)`;
42
33
  //output for custom apps here
43
34
  output.log(`${logSymbols.success} ${styleText([
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/init/initApp.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {type Output, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {logSymbols} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {type InitStepResult} from '../../telemetry/init.telemetry.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\nexport async function initApp({\n autoUpdates,\n datasetName,\n defaults,\n error,\n git,\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 error: Output['error']\n git?: boolean | string\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 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 const isCurrentDir = outputPath === process.cwd()\n const goToProjectDir = `\\n(${styleText('cyan', `cd ${outputPath}`)} to navigate to your new project directory)`\n\n //output for custom apps here\n output.log(\n `${logSymbols.success} ${styleText(['green', 'bold'], 'Success!')} Your custom app has been scaffolded.`,\n )\n if (!isCurrentDir) output.log(goToProjectDir)\n\n if (projectId && datasetName) {\n output.log(\n `\\nConfigured with project ${styleText('cyan', projectId)} and dataset ${styleText('cyan', datasetName)}.`,\n )\n output.log(\n 'Edit `src/App.tsx` to change these values or add more project / dataset pairs to your config.',\n )\n } else {\n output.log(\n `\\n${styleText('bold', 'Next')}, configure the project(s) and dataset(s) your app should work with in \\`src/App.tsx\\`.`,\n )\n }\n output.log('\\nRefer to our documentation for a walkthrough:')\n output.log(\n styleText(['blue', 'underline'], 'https://www.sanity.io/docs/app-sdk/sdk-configuration'),\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 dev to start the development server for your app`)\n output.log(`npx sanity deploy to deploy your app`)\n}\n"],"names":["styleText","logSymbols","getPostInitMCPPrompt","scaffoldAndInstall","selectTemplate","initApp","autoUpdates","datasetName","defaults","error","git","mcpConfigured","noGit","organizationId","output","outputPath","overwriteFiles","packageManager","projectId","remoteTemplateInfo","sluggedName","template","templateToken","trace","typescript","unattended","workDir","resolvedTemplate","templateName","useTypeScript","exit","displayName","isCurrentDir","process","cwd","goToProjectDir","log","success","length","message"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAGnC,SAAQC,UAAU,QAAO,sBAAqB;AAK9C,SAAQC,oBAAoB,QAAO,mBAAkB;AAErD,SAAQC,kBAAkB,EAAEC,cAAc,QAAO,wBAAuB;AAExE,OAAO,eAAeC,QAAQ,EAC5BC,WAAW,EACXC,WAAW,EACXC,QAAQ,EACRC,KAAK,EACLC,GAAG,EACHC,aAAa,EACbC,KAAK,EACLC,cAAc,EACdC,MAAM,EACNC,UAAU,EACVC,cAAc,EACdC,cAAc,EACdC,SAAS,EACTC,kBAAkB,EAClBC,WAAW,EACXC,QAAQ,EACRC,aAAa,EACbC,KAAK,EACLC,UAAU,EACVC,UAAU,EACVC,OAAO,EAuBR;IACC,MAAM,EACJL,UAAUM,gBAAgB,EAC1BC,YAAY,EACZC,aAAa,EACd,GAAG,MAAMzB,eAAe;QACvBe;QACAE;QACAE;QACAC;QACAC;IACF;IAEA,IAAI,CAACN,sBAAsB,CAACQ,kBAAkB;QAC5ClB,MAAM,CAAC,UAAU,EAAEmB,aAAa,WAAW,CAAC,EAAE;YAACE,MAAM;QAAC;IACxD;IAEA,MAAM3B,mBAAmB;QACvBG;QACAC;QACAC;QACAuB,aAAa;QACbrB;QACAE;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAQ;QACAN;QACAC;QACAE;QACAI;QACAH;IACF;IAEA,MAAMM,eAAejB,eAAekB,QAAQC,GAAG;IAC/C,MAAMC,iBAAiB,CAAC,GAAG,EAAEnC,UAAU,QAAQ,CAAC,GAAG,EAAEe,YAAY,EAAE,2CAA2C,CAAC;IAE/G,6BAA6B;IAC7BD,OAAOsB,GAAG,CACR,GAAGnC,WAAWoC,OAAO,CAAC,CAAC,EAAErC,UAAU;QAAC;QAAS;KAAO,EAAE,YAAY,qCAAqC,CAAC;IAE1G,IAAI,CAACgC,cAAclB,OAAOsB,GAAG,CAACD;IAE9B,IAAIjB,aAAaX,aAAa;QAC5BO,OAAOsB,GAAG,CACR,CAAC,0BAA0B,EAAEpC,UAAU,QAAQkB,WAAW,aAAa,EAAElB,UAAU,QAAQO,aAAa,CAAC,CAAC;QAE5GO,OAAOsB,GAAG,CACR;IAEJ,OAAO;QACLtB,OAAOsB,GAAG,CACR,CAAC,EAAE,EAAEpC,UAAU,QAAQ,QAAQ,uFAAuF,CAAC;IAE3H;IACAc,OAAOsB,GAAG,CAAC;IACXtB,OAAOsB,GAAG,CACRpC,UAAU;QAAC;QAAQ;KAAY,EAAE;IAEnC,IAAIW,iBAAiBA,cAAc2B,MAAM,GAAG,GAAG;QAC7C,MAAMC,UAAU,MAAMrC,qBAAqBS;QAC3CG,OAAOsB,GAAG,CAAC,CAAC,EAAE,EAAEG,SAAS;QACzBzB,OAAOsB,GAAG,CAAC,CAAC,cAAc,EAAEpC,UAAU,QAAQ,0BAA0B;QACxEc,OAAOsB,GAAG,CACR,CAAC,2CAA2C,EAAEpC,UAAU,QAAQ,yCAAyC;IAE7G;IACAc,OAAOsB,GAAG,CAAC;IACXtB,OAAOsB,GAAG,CAAC,CAAC,uBAAuB,CAAC;IACpCtB,OAAOsB,GAAG,CAAC,CAAC,iEAAiE,CAAC;IAC9EtB,OAAOsB,GAAG,CAAC,CAAC,uEAAuE,CAAC;IACpFtB,OAAOsB,GAAG,CAAC,CAAC,6CAA6C,CAAC;AAC5D"}
1
+ {"version":3,"sources":["../../../src/actions/init/initApp.ts"],"sourcesContent":["import {styleText} from 'node:util'\n\nimport {type Output, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {logSymbols} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {type InitStepResult} from '../../telemetry/init.telemetry.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\nexport async function initApp({\n datasetName,\n defaults,\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 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 {\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 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 const isCurrentDir = outputPath === workDir\n const goToProjectDir = `\\n(${styleText('cyan', `cd ${outputPath}`)} to navigate to your new project directory)`\n\n //output for custom apps here\n output.log(\n `${logSymbols.success} ${styleText(['green', 'bold'], 'Success!')} Your custom app has been scaffolded.`,\n )\n if (!isCurrentDir) output.log(goToProjectDir)\n\n if (projectId && datasetName) {\n output.log(\n `\\nConfigured with project ${styleText('cyan', projectId)} and dataset ${styleText('cyan', datasetName)}.`,\n )\n output.log(\n 'Edit `src/App.tsx` to change these values or add more project / dataset pairs to your config.',\n )\n } else {\n output.log(\n `\\n${styleText('bold', 'Next')}, configure the project(s) and dataset(s) your app should work with in \\`src/App.tsx\\`.`,\n )\n }\n output.log('\\nRefer to our documentation for a walkthrough:')\n output.log(\n styleText(['blue', 'underline'], 'https://www.sanity.io/docs/app-sdk/sdk-configuration'),\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 dev to start the development server for your app`)\n output.log(`npx sanity deploy to deploy your app`)\n}\n"],"names":["styleText","logSymbols","InitError","getPostInitMCPPrompt","scaffoldAndInstall","selectTemplate","initApp","datasetName","defaults","mcpConfigured","options","organizationId","output","outputPath","projectId","remoteTemplateInfo","sluggedName","trace","workDir","template","resolvedTemplate","templateName","useTypeScript","displayName","isCurrentDir","goToProjectDir","log","success","length","message"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAGnC,SAAQC,UAAU,QAAO,sBAAqB;AAK9C,SAAQC,SAAS,QAAO,iBAAgB;AACxC,SAAQC,oBAAoB,QAAO,mBAAkB;AAErD,SAAQC,kBAAkB,EAAEC,cAAc,QAAO,wBAAuB;AAGxE,OAAO,eAAeC,QAAQ,EAC5BC,WAAW,EACXC,QAAQ,EACRC,aAAa,EACbC,OAAO,EACPC,cAAc,EACdC,MAAM,EACNC,UAAU,EACVC,SAAS,EACTC,kBAAkB,EAClBC,WAAW,EACXC,KAAK,EACLC,OAAO,EAcR;IACC,MAAM,EACJC,UAAUC,gBAAgB,EAC1BC,YAAY,EACZC,aAAa,EACd,GAAG,MAAMjB,eAAe;QACvBK;QACAK;QACAE;IACF;IAEA,IAAI,CAACF,sBAAsB,CAACK,kBAAkB;QAC5C,MAAM,IAAIlB,UAAU,CAAC,UAAU,EAAEmB,aAAa,WAAW,CAAC,EAAE;IAC9D;IAEA,MAAMjB,mBAAmB;QACvBG;QACAC;QACAe,aAAa;QACbb;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAK;QACAJ;QACAK;QACAJ;IACF;IAEA,MAAMM,eAAeX,eAAeK;IACpC,MAAMO,iBAAiB,CAAC,GAAG,EAAEzB,UAAU,QAAQ,CAAC,GAAG,EAAEa,YAAY,EAAE,2CAA2C,CAAC;IAE/G,6BAA6B;IAC7BD,OAAOc,GAAG,CACR,GAAGzB,WAAW0B,OAAO,CAAC,CAAC,EAAE3B,UAAU;QAAC;QAAS;KAAO,EAAE,YAAY,qCAAqC,CAAC;IAE1G,IAAI,CAACwB,cAAcZ,OAAOc,GAAG,CAACD;IAE9B,IAAIX,aAAaP,aAAa;QAC5BK,OAAOc,GAAG,CACR,CAAC,0BAA0B,EAAE1B,UAAU,QAAQc,WAAW,aAAa,EAAEd,UAAU,QAAQO,aAAa,CAAC,CAAC;QAE5GK,OAAOc,GAAG,CACR;IAEJ,OAAO;QACLd,OAAOc,GAAG,CACR,CAAC,EAAE,EAAE1B,UAAU,QAAQ,QAAQ,uFAAuF,CAAC;IAE3H;IACAY,OAAOc,GAAG,CAAC;IACXd,OAAOc,GAAG,CACR1B,UAAU;QAAC;QAAQ;KAAY,EAAE;IAEnC,IAAIS,iBAAiBA,cAAcmB,MAAM,GAAG,GAAG;QAC7C,MAAMC,UAAU,MAAM1B,qBAAqBM;QAC3CG,OAAOc,GAAG,CAAC,CAAC,EAAE,EAAEG,SAAS;QACzBjB,OAAOc,GAAG,CAAC,CAAC,cAAc,EAAE1B,UAAU,QAAQ,0BAA0B;QACxEY,OAAOc,GAAG,CACR,CAAC,2CAA2C,EAAE1B,UAAU,QAAQ,yCAAyC;IAE7G;IACAY,OAAOc,GAAG,CAAC;IACXd,OAAOc,GAAG,CAAC,CAAC,uBAAuB,CAAC;IACpCd,OAAOc,GAAG,CAAC,CAAC,iEAAiE,CAAC;IAC9Ed,OAAOc,GAAG,CAAC,CAAC,uEAAuE,CAAC;IACpFd,OAAOc,GAAG,CAAC,CAAC,6CAA6C,CAAC;AAC5D"}
@@ -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
  }