@sanity/cli 8.9.0 → 8.10.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.
package/README.md CHANGED
@@ -2981,7 +2981,7 @@ Initialize a new Sanity Studio, project and/or app
2981
2981
  ```
2982
2982
  USAGE
2983
2983
  $ sanity init [--json] [--auto-updates | --bare] [--coupon <code> | --project-plan <name>] [--dataset
2984
- <name> | --dataset-default] [--env <filename> | ] [--git <message> | ] [--import-dataset] [--mcp]
2984
+ <name> | --dataset-default] [--env <filename> | ] [--git <message> | ] [--import-dataset] [--install | ] [--mcp]
2985
2985
  [--nextjs-add-config-files] [--nextjs-append-env] [--nextjs-embed-studio] [--organization <id>] [--output-path
2986
2986
  <path> | ] [--overwrite-files] [--package-manager <manager> | ] [--project <id> | | --project-name <name>]
2987
2987
  [--provider <provider>] [--skills] [--template <template> | ] [--typescript | ] [--visibility <mode>] [-y]
@@ -2997,6 +2997,7 @@ FLAGS
2997
2997
  --env=<filename> Write environment variables to file
2998
2998
  --[no-]git=<message> Specify a commit message for initial commit, or disable git init
2999
2999
  --[no-]import-dataset Import template sample dataset
3000
+ --[no-]install Install dependencies after scaffolding
3000
3001
  --[no-]mcp Enable AI editor integration (MCP) setup
3001
3002
  --organization=<id> Organization ID to use for the project (required for unattended project creation)
3002
3003
  --output-path=<path> Path to write studio project to
@@ -1,5 +1,6 @@
1
1
  import { styleText } from 'node:util';
2
2
  import { logSymbols } from '@sanity/cli-core/ux';
3
+ import { getInstallCommand } from '../../util/packageManager/installPackages.js';
3
4
  import { InitError } from './initError.js';
4
5
  import { getPostInitMCPPrompt } from './initHelpers.js';
5
6
  import { scaffoldAndInstall, selectTemplate } from './scaffoldTemplate.js';
@@ -12,7 +13,7 @@ export async function initApp({ datasetName, defaults, mcpConfigured, options, o
12
13
  if (!remoteTemplateInfo && !resolvedTemplate) {
13
14
  throw new InitError(`Template "${templateName}" not found`, 1);
14
15
  }
15
- await scaffoldAndInstall({
16
+ const { pkgManager } = await scaffoldAndInstall({
16
17
  datasetName,
17
18
  defaults,
18
19
  displayName: '',
@@ -37,6 +38,9 @@ export async function initApp({ datasetName, defaults, mcpConfigured, options, o
37
38
  'bold'
38
39
  ], 'Success!')} Your custom app has been scaffolded.`);
39
40
  if (!isCurrentDir) output.log(goToProjectDir);
41
+ if (!options.install) {
42
+ output.log(`\nRun ${styleText('cyan', getInstallCommand(pkgManager))} to install dependencies.`);
43
+ }
40
44
  if (projectId && datasetName) {
41
45
  output.log(`\nConfigured with project ${styleText('cyan', projectId)} and dataset ${styleText('cyan', datasetName)}.`);
42
46
  output.log('Edit `src/App.tsx` to change these values or add more project / dataset pairs to your config.');
@@ -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 {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 workbench,\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 workbench: boolean\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 workbench,\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","workbench","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,SAAS,EACTC,OAAO,EAeR;IACC,MAAM,EACJC,UAAUC,gBAAgB,EAC1BC,YAAY,EACZC,aAAa,EACd,GAAG,MAAMlB,eAAe;QACvBK;QACAK;QACAE;IACF;IAEA,IAAI,CAACF,sBAAsB,CAACM,kBAAkB;QAC5C,MAAM,IAAInB,UAAU,CAAC,UAAU,EAAEoB,aAAa,WAAW,CAAC,EAAE;IAC9D;IAEA,MAAMlB,mBAAmB;QACvBG;QACAC;QACAgB,aAAa;QACbd;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAM;QACAL;QACAM;QACAL;QACAC;IACF;IAEA,MAAMM,eAAeZ,eAAeM;IACpC,MAAMO,iBAAiB,CAAC,GAAG,EAAE1B,UAAU,QAAQ,CAAC,GAAG,EAAEa,YAAY,EAAE,2CAA2C,CAAC;IAE/G,6BAA6B;IAC7BD,OAAOe,GAAG,CACR,GAAG1B,WAAW2B,OAAO,CAAC,CAAC,EAAE5B,UAAU;QAAC;QAAS;KAAO,EAAE,YAAY,qCAAqC,CAAC;IAE1G,IAAI,CAACyB,cAAcb,OAAOe,GAAG,CAACD;IAE9B,IAAIZ,aAAaP,aAAa;QAC5BK,OAAOe,GAAG,CACR,CAAC,0BAA0B,EAAE3B,UAAU,QAAQc,WAAW,aAAa,EAAEd,UAAU,QAAQO,aAAa,CAAC,CAAC;QAE5GK,OAAOe,GAAG,CACR;IAEJ,OAAO;QACLf,OAAOe,GAAG,CACR,CAAC,EAAE,EAAE3B,UAAU,QAAQ,QAAQ,uFAAuF,CAAC;IAE3H;IACAY,OAAOe,GAAG,CAAC;IACXf,OAAOe,GAAG,CACR3B,UAAU;QAAC;QAAQ;KAAY,EAAE;IAEnC,IAAIS,iBAAiBA,cAAcoB,MAAM,GAAG,GAAG;QAC7C,MAAMC,UAAU,MAAM3B,qBAAqBM;QAC3CG,OAAOe,GAAG,CAAC,CAAC,EAAE,EAAEG,SAAS;QACzBlB,OAAOe,GAAG,CAAC,CAAC,cAAc,EAAE3B,UAAU,QAAQ,0BAA0B;QACxEY,OAAOe,GAAG,CACR,CAAC,2CAA2C,EAAE3B,UAAU,QAAQ,yCAAyC;IAE7G;IACAY,OAAOe,GAAG,CAAC;IACXf,OAAOe,GAAG,CAAC,CAAC,uBAAuB,CAAC;IACpCf,OAAOe,GAAG,CAAC,CAAC,iEAAiE,CAAC;IAC9Ef,OAAOe,GAAG,CAAC,CAAC,uEAAuE,CAAC;IACpFf,OAAOe,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 {getInstallCommand} from '../../util/packageManager/installPackages.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 workbench,\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 workbench: boolean\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 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 workbench,\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 if (!options.install) {\n output.log(`\\nRun ${styleText('cyan', getInstallCommand(pkgManager))} to install dependencies.`)\n }\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","getInstallCommand","InitError","getPostInitMCPPrompt","scaffoldAndInstall","selectTemplate","initApp","datasetName","defaults","mcpConfigured","options","organizationId","output","outputPath","projectId","remoteTemplateInfo","sluggedName","trace","workbench","workDir","template","resolvedTemplate","templateName","useTypeScript","pkgManager","displayName","isCurrentDir","goToProjectDir","log","success","install","length","message"],"mappings":"AAAA,SAAQA,SAAS,QAAO,YAAW;AAGnC,SAAQC,UAAU,QAAO,sBAAqB;AAI9C,SAAQC,iBAAiB,QAAO,+CAA8C;AAE9E,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,SAAS,EACTC,OAAO,EAeR;IACC,MAAM,EACJC,UAAUC,gBAAgB,EAC1BC,YAAY,EACZC,aAAa,EACd,GAAG,MAAMlB,eAAe;QACvBK;QACAK;QACAE;IACF;IAEA,IAAI,CAACF,sBAAsB,CAACM,kBAAkB;QAC5C,MAAM,IAAInB,UAAU,CAAC,UAAU,EAAEoB,aAAa,WAAW,CAAC,EAAE;IAC9D;IAEA,MAAM,EAACE,UAAU,EAAC,GAAG,MAAMpB,mBAAmB;QAC5CG;QACAC;QACAiB,aAAa;QACbf;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAM;QACAL;QACAM;QACAL;QACAC;IACF;IAEA,MAAMO,eAAeb,eAAeM;IACpC,MAAMQ,iBAAiB,CAAC,GAAG,EAAE5B,UAAU,QAAQ,CAAC,GAAG,EAAEc,YAAY,EAAE,2CAA2C,CAAC;IAE/G,6BAA6B;IAC7BD,OAAOgB,GAAG,CACR,GAAG5B,WAAW6B,OAAO,CAAC,CAAC,EAAE9B,UAAU;QAAC;QAAS;KAAO,EAAE,YAAY,qCAAqC,CAAC;IAE1G,IAAI,CAAC2B,cAAcd,OAAOgB,GAAG,CAACD;IAC9B,IAAI,CAACjB,QAAQoB,OAAO,EAAE;QACpBlB,OAAOgB,GAAG,CAAC,CAAC,MAAM,EAAE7B,UAAU,QAAQE,kBAAkBuB,aAAa,yBAAyB,CAAC;IACjG;IAEA,IAAIV,aAAaP,aAAa;QAC5BK,OAAOgB,GAAG,CACR,CAAC,0BAA0B,EAAE7B,UAAU,QAAQe,WAAW,aAAa,EAAEf,UAAU,QAAQQ,aAAa,CAAC,CAAC;QAE5GK,OAAOgB,GAAG,CACR;IAEJ,OAAO;QACLhB,OAAOgB,GAAG,CACR,CAAC,EAAE,EAAE7B,UAAU,QAAQ,QAAQ,uFAAuF,CAAC;IAE3H;IACAa,OAAOgB,GAAG,CAAC;IACXhB,OAAOgB,GAAG,CACR7B,UAAU;QAAC;QAAQ;KAAY,EAAE;IAEnC,IAAIU,iBAAiBA,cAAcsB,MAAM,GAAG,GAAG;QAC7C,MAAMC,UAAU,MAAM7B,qBAAqBM;QAC3CG,OAAOgB,GAAG,CAAC,CAAC,EAAE,EAAEI,SAAS;QACzBpB,OAAOgB,GAAG,CAAC,CAAC,cAAc,EAAE7B,UAAU,QAAQ,0BAA0B;QACxEa,OAAOgB,GAAG,CACR,CAAC,2CAA2C,EAAE7B,UAAU,QAAQ,yCAAyC;IAE7G;IACAa,OAAOgB,GAAG,CAAC;IACXhB,OAAOgB,GAAG,CAAC,CAAC,uBAAuB,CAAC;IACpChB,OAAOgB,GAAG,CAAC,CAAC,iEAAiE,CAAC;IAC9EhB,OAAOgB,GAAG,CAAC,CAAC,uEAAuE,CAAC;IACpFhB,OAAOgB,GAAG,CAAC,CAAC,6CAA6C,CAAC;AAC5D"}
@@ -9,7 +9,7 @@ import { promptForAppendEnv, promptForEmbeddedStudio, promptForNextTemplate, pro
9
9
  import { promptForTypeScript } from '../../prompts/init/promptForTypescript.js';
10
10
  import { createCorsOrigin, listCorsOrigins } from '../../services/cors.js';
11
11
  import { getPeerDependencies } from '../../util/packageManager/getPeerDependencies.js';
12
- import { installNewPackages } from '../../util/packageManager/installPackages.js';
12
+ import { getAddCommand, 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';
@@ -18,6 +18,7 @@ import { flagOrDefault, getPostInitMCPPrompt, shouldPrompt, writeStagingEnvIfNee
18
18
  import { resolvePackageManager } from './resolvePackageManager.js';
19
19
  import { sanityCliTemplate, sanityConfigTemplate, sanityFolder, sanityStudioTemplate } from './templates/nextjs/index.js';
20
20
  const debug = subdebug('init');
21
+ const NEXT_SANITY_PACKAGE = 'next-sanity@13';
21
22
  async function writeOrOverwrite(filePath, content, workDir, options) {
22
23
  if (existsSync(filePath)) {
23
24
  let overwrite = flagOrDefault(options.overwriteFiles, false);
@@ -68,7 +69,7 @@ async function writeSourceFiles({ fileExtension, files, folderPath, options, src
68
69
  }
69
70
  }
70
71
  export async function initNextJs({ datasetName, detectedFramework, envFilename, mcpConfigured, options, output, projectId, trace, workDir }) {
71
- const { nextjsAppendEnv, nextjsEmbedStudio, packageManager, template, typescript, unattended } = options;
72
+ const { install, nextjsAppendEnv, nextjsEmbedStudio, packageManager, template, typescript, unattended } = options;
72
73
  let useTypeScript = flagOrDefault(typescript, true);
73
74
  if (shouldPrompt(unattended, typescript)) {
74
75
  useTypeScript = await promptForTypeScript();
@@ -179,56 +180,66 @@ export async function initNextJs({ datasetName, detectedFramework, envFilename,
179
180
  if (templateToUse === 'blog') {
180
181
  packages.push('@sanity/icons@5');
181
182
  }
182
- await installNewPackages({
183
- packageManager: chosen,
184
- packages
185
- }, {
186
- output,
187
- workDir
188
- });
189
- // will refactor this later
190
- const execOptions = {
191
- cwd: workDir,
192
- encoding: 'utf8',
193
- env: getPartialEnvWithNpmPath(workDir),
194
- stdio: 'inherit'
195
- };
196
- switch(chosen){
197
- case 'npm':
198
- {
199
- await execa('npm', [
200
- 'install',
201
- 'next-sanity@13'
202
- ], execOptions);
203
- break;
204
- }
205
- case 'pnpm':
206
- {
207
- await execa('pnpm', [
208
- 'install',
209
- 'next-sanity@13'
210
- ], execOptions);
211
- break;
212
- }
213
- case 'yarn':
214
- {
215
- const peerDeps = await getPeerDependencies('next-sanity@13', workDir);
216
- await installNewPackages({
217
- packageManager: 'yarn',
218
- packages: [
219
- 'next-sanity@13',
220
- ...peerDeps
221
- ]
222
- }, {
223
- output,
224
- workDir
225
- });
226
- break;
227
- }
228
- default:
229
- {
230
- break;
231
- }
183
+ if (install) {
184
+ await installNewPackages({
185
+ packageManager: chosen,
186
+ packages
187
+ }, {
188
+ output,
189
+ workDir
190
+ });
191
+ // will refactor this later
192
+ const execOptions = {
193
+ cwd: workDir,
194
+ encoding: 'utf8',
195
+ env: getPartialEnvWithNpmPath(workDir),
196
+ stdio: 'inherit'
197
+ };
198
+ switch(chosen){
199
+ case 'npm':
200
+ {
201
+ await execa('npm', [
202
+ 'install',
203
+ NEXT_SANITY_PACKAGE
204
+ ], execOptions);
205
+ break;
206
+ }
207
+ case 'pnpm':
208
+ {
209
+ await execa('pnpm', [
210
+ 'install',
211
+ NEXT_SANITY_PACKAGE
212
+ ], execOptions);
213
+ break;
214
+ }
215
+ case 'yarn':
216
+ {
217
+ const peerDeps = await getPeerDependencies(NEXT_SANITY_PACKAGE, workDir);
218
+ await installNewPackages({
219
+ packageManager: 'yarn',
220
+ packages: [
221
+ NEXT_SANITY_PACKAGE,
222
+ ...peerDeps
223
+ ]
224
+ }, {
225
+ output,
226
+ workDir
227
+ });
228
+ break;
229
+ }
230
+ default:
231
+ {
232
+ break;
233
+ }
234
+ }
235
+ } else {
236
+ // Unlike the studio templates, none of this is declared in a scaffolded
237
+ // package.json - the packages only land by way of the package manager - so
238
+ // name them rather than pointing at a bare install.
239
+ output.log(`Skipped dependency install. Run ${getAddCommand(chosen, [
240
+ ...packages,
241
+ NEXT_SANITY_PACKAGE
242
+ ])} to add them.`);
232
243
  }
233
244
  output.log(`\n${styleText('green', 'Success!')} Your Sanity configuration files has been added to this project`);
234
245
  if (mcpConfigured && mcpConfigured.length > 0) {
@@ -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 {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@5')\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@13'], execOptions)\n break\n }\n case 'pnpm': {\n await execa('pnpm', ['install', 'next-sanity@13'], execOptions)\n break\n }\n case 'yarn': {\n const peerDeps = await getPeerDependencies('next-sanity@13', workDir)\n await installNewPackages(\n {packageManager: 'yarn', packages: ['next-sanity@13', ...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
+ {"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 {getAddCommand, 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\nconst NEXT_SANITY_PACKAGE = 'next-sanity@13'\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 {\n install,\n nextjsAppendEnv,\n nextjsEmbedStudio,\n packageManager,\n template,\n typescript,\n 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@5')\n }\n\n if (install) {\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_PACKAGE], execOptions)\n break\n }\n case 'pnpm': {\n await execa('pnpm', ['install', NEXT_SANITY_PACKAGE], execOptions)\n break\n }\n case 'yarn': {\n const peerDeps = await getPeerDependencies(NEXT_SANITY_PACKAGE, workDir)\n await installNewPackages(\n {packageManager: 'yarn', packages: [NEXT_SANITY_PACKAGE, ...peerDeps]},\n {output, workDir},\n )\n break\n }\n default: {\n // bun and manual - do nothing or handle differently\n break\n }\n }\n } else {\n // Unlike the studio templates, none of this is declared in a scaffolded\n // package.json - the packages only land by way of the package manager - so\n // name them rather than pointing at a bare install.\n output.log(\n `Skipped dependency install. Run ${getAddCommand(chosen, [...packages, NEXT_SANITY_PACKAGE])} to add them.`,\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","getAddCommand","installNewPackages","getPartialEnvWithNpmPath","countNestedFolders","createOrAppendEnvVars","InitError","flagOrDefault","getPostInitMCPPrompt","shouldPrompt","writeStagingEnvIfNeeded","resolvePackageManager","sanityCliTemplate","sanityConfigTemplate","sanityFolder","sanityStudioTemplate","debug","NEXT_SANITY_PACKAGE","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","install","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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"}
@@ -2,6 +2,7 @@ import { styleText } from 'node:util';
2
2
  import { getCliToken, subdebug } from '@sanity/cli-core';
3
3
  import { confirm } from '@sanity/cli-core/ux';
4
4
  import { updateProjectInitializedAt } from '../../services/projects.js';
5
+ import { getInstallCommand } from '../../util/packageManager/installPackages.js';
5
6
  import { InitError } from './initError.js';
6
7
  import { getPostInitMCPPrompt } from './initHelpers.js';
7
8
  import { scaffoldAndInstall, selectTemplate } from './scaffoldTemplate.js';
@@ -13,7 +14,7 @@ async function promptForDatasetImport(message) {
13
14
  });
14
15
  }
15
16
  export async function initStudio({ datasetName, defaults, displayName, isFirstProject, mcpConfigured, options, organizationId, output, outputPath, preclaim = false, projectId, remoteTemplateInfo, sluggedName, trace, workbench, workDir }) {
16
- const { importDataset, unattended } = options;
17
+ const { importDataset, install, unattended } = options;
17
18
  const { template: resolvedTemplate, templateName, useTypeScript } = await selectTemplate({
18
19
  options,
19
20
  remoteTemplateInfo,
@@ -97,7 +98,8 @@ export async function initStudio({ datasetName, defaults, displayName, isFirstPr
97
98
  'bold'
98
99
  ], 'Success!')} Your Studio has been created.`);
99
100
  if (!isCurrentDir) output.log(goToProjectDir);
100
- output.log(`\nGet started by running ${styleText('cyan', devCommand)} to launch your Studio's development server`);
101
+ const startupCommands = install ? styleText('cyan', devCommand) : `${styleText('cyan', getInstallCommand(pkgManager))}, then ${styleText('cyan', devCommand)}`;
102
+ output.log(`\nGet started by running ${startupCommands} to launch your Studio's development server`);
101
103
  if (mcpConfigured && mcpConfigured.length > 0) {
102
104
  const message = await getPostInitMCPPrompt(mcpConfigured);
103
105
  output.log(`\n${message}`);
@@ -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 {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 preclaim = false,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n trace,\n workbench,\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 preclaim?: boolean\n projectId: string\n remoteTemplateInfo: RepoInfo | undefined\n sluggedName: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n workbench: boolean\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 if (!preclaim) {\n try {\n await updateProjectInitializedAt(projectId)\n } catch (err) {\n // Non-critical update\n debug('Failed to update cliInitializedAt metadata', err)\n }\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 workbench,\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 // `sanity new` owns the combined Studio/frontend outro.\n if (preclaim) return\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","preclaim","projectId","remoteTemplateInfo","sluggedName","trace","workbench","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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"}
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 {getInstallCommand} from '../../util/packageManager/installPackages.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 preclaim = false,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n trace,\n workbench,\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 preclaim?: boolean\n projectId: string\n remoteTemplateInfo: RepoInfo | undefined\n sluggedName: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n workbench: boolean\n workDir: string\n}): Promise<void> {\n const {importDataset, install, 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 if (!preclaim) {\n try {\n await updateProjectInitializedAt(projectId)\n } catch (err) {\n // Non-critical update\n debug('Failed to update cliInitializedAt metadata', err)\n }\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 workbench,\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 // `sanity new` owns the combined Studio/frontend outro.\n if (preclaim) return\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 const startupCommands = install\n ? styleText('cyan', devCommand)\n : `${styleText('cyan', getInstallCommand(pkgManager))}, then ${styleText('cyan', devCommand)}`\n output.log(\n `\\nGet started by running ${startupCommands} 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","getInstallCommand","InitError","getPostInitMCPPrompt","scaffoldAndInstall","selectTemplate","debug","promptForDatasetImport","message","default","initStudio","datasetName","defaults","displayName","isFirstProject","mcpConfigured","options","organizationId","output","outputPath","preclaim","projectId","remoteTemplateInfo","sluggedName","trace","workbench","workDir","importDataset","install","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","startupCommands","length","DISCORD_INVITE_LINK"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { select } from '@sanity/cli-core/ux';
2
2
  import { promptForTypeScript } from '../../prompts/init/promptForTypescript.js';
3
- import { installDeclaredPackages } from '../../util/packageManager/installPackages.js';
3
+ import { getInstallCommand, installDeclaredPackages } from '../../util/packageManager/installPackages.js';
4
4
  import { bootstrapTemplate } from './bootstrapTemplate.js';
5
5
  import { tryGitInit } from './git.js';
6
6
  import { flagOrDefault, shouldPrompt, writeStagingEnvIfNeeded } from './initHelpers.js';
@@ -66,7 +66,7 @@ export async function selectTemplate({ options, remoteTemplateInfo, trace }) {
66
66
  };
67
67
  }
68
68
  export async function scaffoldAndInstall({ datasetName, defaults, displayName, options, organizationId, output, outputPath, projectId, remoteTemplateInfo, sluggedName, templateName, trace, useTypeScript, workbench, workDir }) {
69
- const { autoUpdates, git, overwriteFiles, packageManager, templateToken, unattended } = options;
69
+ const { autoUpdates, git, install, overwriteFiles, packageManager, templateToken, unattended } = options;
70
70
  const noGit = typeof git === 'boolean' && !git ? true : undefined;
71
71
  await bootstrapTemplate({
72
72
  autoUpdates,
@@ -94,11 +94,14 @@ export async function scaffoldAndInstall({ datasetName, defaults, displayName, o
94
94
  selectedOption: pkgManager,
95
95
  step: 'selectPackageManager'
96
96
  });
97
- // Now for the slow part... installing dependencies
98
- await installDeclaredPackages(outputPath, pkgManager, {
99
- output,
100
- workDir
101
- });
97
+ if (install) {
98
+ await installDeclaredPackages(outputPath, pkgManager, {
99
+ output,
100
+ workDir
101
+ });
102
+ } else {
103
+ output.log(`Skipped dependency install. Run ${getInstallCommand(pkgManager)} to install them.`);
104
+ }
102
105
  const useGit = !noGit && (git === undefined || Boolean(git));
103
106
  const commitMessage = git;
104
107
  await writeStagingEnvIfNeeded(output, outputPath);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/init/scaffoldTemplate.ts"],"sourcesContent":["import {type Output, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {promptForTypeScript} from '../../prompts/init/promptForTypescript.js'\nimport {type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {installDeclaredPackages} from '../../util/packageManager/installPackages.js'\nimport {type PackageManager} from '../../util/packageManager/packageManagerChoice.js'\nimport {bootstrapTemplate} from './bootstrapTemplate.js'\nimport {tryGitInit} from './git.js'\nimport {flagOrDefault, shouldPrompt, writeStagingEnvIfNeeded} from './initHelpers.js'\nimport {type RepoInfo} from './remoteTemplate.js'\nimport {resolvePackageManager} from './resolvePackageManager.js'\nimport templates from './templates/index.js'\nimport {type InitOptions, type ProjectTemplate} from './types.js'\n\ninterface SelectedTemplate {\n template: ProjectTemplate | undefined\n templateName: string\n useTypeScript: boolean\n}\n\ninterface TemplateChoice {\n name: string\n value: string\n}\n\nexport const templateChoices: TemplateChoice[] = [\n {name: 'Clean project with no predefined schema types', value: 'clean'},\n {name: 'Blog (schema)', value: 'blog'},\n {name: 'E-commerce (Shopify)', value: 'shopify'},\n {name: 'Movie project (schema + sample data)', value: 'moviedb'},\n {name: 'Page Builder (presets)', value: 'page-builder'},\n]\n\nasync function promptForTemplate(params: {\n template?: string\n unattended: boolean\n}): Promise<string> {\n const defaultTemplate = params.unattended || params.template ? params.template || 'clean' : null\n if (defaultTemplate) {\n return defaultTemplate\n }\n\n return select({\n choices: templateChoices,\n message: 'Select project template',\n })\n}\n\nexport async function selectTemplate({\n options,\n remoteTemplateInfo,\n trace,\n}: {\n options: InitOptions\n remoteTemplateInfo: RepoInfo | undefined\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n}): Promise<SelectedTemplate> {\n const {template, typescript, unattended} = options\n const templateName = await promptForTemplate({template, unattended})\n trace.log({\n selectedOption: templateName,\n step: 'selectProjectTemplate',\n })\n\n const resolvedTemplate = templates[templateName]\n\n let useTypeScript = flagOrDefault(typescript, true)\n if (!remoteTemplateInfo && resolvedTemplate && resolvedTemplate.typescriptOnly === true) {\n useTypeScript = true\n } else if (shouldPrompt(unattended, typescript)) {\n useTypeScript = await promptForTypeScript()\n trace.log({\n selectedOption: useTypeScript ? 'yes' : 'no',\n step: 'useTypeScript',\n })\n }\n\n return {\n template: resolvedTemplate,\n templateName,\n useTypeScript,\n }\n}\n\nexport async function 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 workbench,\n workDir,\n}: {\n datasetName: string\n defaults: {projectName: string}\n displayName: string\n options: InitOptions\n organizationId: string | undefined\n output: Output\n outputPath: string\n projectId: string\n remoteTemplateInfo: RepoInfo | undefined\n sluggedName: string\n templateName: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n useTypeScript: boolean\n workbench: boolean\n workDir: string\n}): Promise<{pkgManager: PackageManager}> {\n const {autoUpdates, git, overwriteFiles, packageManager, templateToken, unattended} = options\n const noGit = typeof git === 'boolean' && !git ? true : undefined\n\n await bootstrapTemplate({\n autoUpdates,\n bearerToken: templateToken,\n dataset: datasetName,\n organizationId,\n output,\n outputPath,\n overwriteFiles,\n packageName: sluggedName,\n projectId,\n projectName: displayName || defaults.projectName,\n remoteTemplateInfo,\n templateName,\n useTypeScript,\n workbench,\n })\n\n const pkgManager = await resolvePackageManager({\n interactive: !unattended,\n output,\n packageManager: packageManager as PackageManager,\n targetDir: outputPath,\n })\n\n trace.log({\n selectedOption: pkgManager,\n step: 'selectPackageManager',\n })\n\n // Now for the slow part... installing dependencies\n await installDeclaredPackages(outputPath, pkgManager, {\n output,\n workDir,\n })\n\n const useGit = !noGit && (git === undefined || Boolean(git))\n const commitMessage = git\n await writeStagingEnvIfNeeded(output, outputPath)\n\n // Try initializing a git repository\n if (useGit) {\n tryGitInit(outputPath, typeof commitMessage === 'string' ? commitMessage : undefined)\n }\n\n return {pkgManager}\n}\n"],"names":["select","promptForTypeScript","installDeclaredPackages","bootstrapTemplate","tryGitInit","flagOrDefault","shouldPrompt","writeStagingEnvIfNeeded","resolvePackageManager","templates","templateChoices","name","value","promptForTemplate","params","defaultTemplate","unattended","template","choices","message","selectTemplate","options","remoteTemplateInfo","trace","typescript","templateName","log","selectedOption","step","resolvedTemplate","useTypeScript","typescriptOnly","scaffoldAndInstall","datasetName","defaults","displayName","organizationId","output","outputPath","projectId","sluggedName","workbench","workDir","autoUpdates","git","overwriteFiles","packageManager","templateToken","noGit","undefined","bearerToken","dataset","packageName","projectName","pkgManager","interactive","targetDir","useGit","Boolean","commitMessage"],"mappings":"AACA,SAAQA,MAAM,QAAO,sBAAqB;AAG1C,SAAQC,mBAAmB,QAAO,4CAA2C;AAE7E,SAAQC,uBAAuB,QAAO,+CAA8C;AAEpF,SAAQC,iBAAiB,QAAO,yBAAwB;AACxD,SAAQC,UAAU,QAAO,WAAU;AACnC,SAAQC,aAAa,EAAEC,YAAY,EAAEC,uBAAuB,QAAO,mBAAkB;AAErF,SAAQC,qBAAqB,QAAO,6BAA4B;AAChE,OAAOC,eAAe,uBAAsB;AAc5C,OAAO,MAAMC,kBAAoC;IAC/C;QAACC,MAAM;QAAiDC,OAAO;IAAO;IACtE;QAACD,MAAM;QAAiBC,OAAO;IAAM;IACrC;QAACD,MAAM;QAAwBC,OAAO;IAAS;IAC/C;QAACD,MAAM;QAAwCC,OAAO;IAAS;IAC/D;QAACD,MAAM;QAA0BC,OAAO;IAAc;CACvD,CAAA;AAED,eAAeC,kBAAkBC,MAGhC;IACC,MAAMC,kBAAkBD,OAAOE,UAAU,IAAIF,OAAOG,QAAQ,GAAGH,OAAOG,QAAQ,IAAI,UAAU;IAC5F,IAAIF,iBAAiB;QACnB,OAAOA;IACT;IAEA,OAAOf,OAAO;QACZkB,SAASR;QACTS,SAAS;IACX;AACF;AAEA,OAAO,eAAeC,eAAe,EACnCC,OAAO,EACPC,kBAAkB,EAClBC,KAAK,EAKN;IACC,MAAM,EAACN,QAAQ,EAAEO,UAAU,EAAER,UAAU,EAAC,GAAGK;IAC3C,MAAMI,eAAe,MAAMZ,kBAAkB;QAACI;QAAUD;IAAU;IAClEO,MAAMG,GAAG,CAAC;QACRC,gBAAgBF;QAChBG,MAAM;IACR;IAEA,MAAMC,mBAAmBpB,SAAS,CAACgB,aAAa;IAEhD,IAAIK,gBAAgBzB,cAAcmB,YAAY;IAC9C,IAAI,CAACF,sBAAsBO,oBAAoBA,iBAAiBE,cAAc,KAAK,MAAM;QACvFD,gBAAgB;IAClB,OAAO,IAAIxB,aAAaU,YAAYQ,aAAa;QAC/CM,gBAAgB,MAAM7B;QACtBsB,MAAMG,GAAG,CAAC;YACRC,gBAAgBG,gBAAgB,QAAQ;YACxCF,MAAM;QACR;IACF;IAEA,OAAO;QACLX,UAAUY;QACVJ;QACAK;IACF;AACF;AAEA,OAAO,eAAeE,mBAAmB,EACvCC,WAAW,EACXC,QAAQ,EACRC,WAAW,EACXd,OAAO,EACPe,cAAc,EACdC,MAAM,EACNC,UAAU,EACVC,SAAS,EACTjB,kBAAkB,EAClBkB,WAAW,EACXf,YAAY,EACZF,KAAK,EACLO,aAAa,EACbW,SAAS,EACTC,OAAO,EAiBR;IACC,MAAM,EAACC,WAAW,EAAEC,GAAG,EAAEC,cAAc,EAAEC,cAAc,EAAEC,aAAa,EAAE/B,UAAU,EAAC,GAAGK;IACtF,MAAM2B,QAAQ,OAAOJ,QAAQ,aAAa,CAACA,MAAM,OAAOK;IAExD,MAAM9C,kBAAkB;QACtBwC;QACAO,aAAaH;QACbI,SAASlB;QACTG;QACAC;QACAC;QACAO;QACAO,aAAaZ;QACbD;QACAc,aAAalB,eAAeD,SAASmB,WAAW;QAChD/B;QACAG;QACAK;QACAW;IACF;IAEA,MAAMa,aAAa,MAAM9C,sBAAsB;QAC7C+C,aAAa,CAACvC;QACdqB;QACAS,gBAAgBA;QAChBU,WAAWlB;IACb;IAEAf,MAAMG,GAAG,CAAC;QACRC,gBAAgB2B;QAChB1B,MAAM;IACR;IAEA,mDAAmD;IACnD,MAAM1B,wBAAwBoC,YAAYgB,YAAY;QACpDjB;QACAK;IACF;IAEA,MAAMe,SAAS,CAACT,SAAUJ,CAAAA,QAAQK,aAAaS,QAAQd,IAAG;IAC1D,MAAMe,gBAAgBf;IACtB,MAAMrC,wBAAwB8B,QAAQC;IAEtC,oCAAoC;IACpC,IAAImB,QAAQ;QACVrD,WAAWkC,YAAY,OAAOqB,kBAAkB,WAAWA,gBAAgBV;IAC7E;IAEA,OAAO;QAACK;IAAU;AACpB"}
1
+ {"version":3,"sources":["../../../src/actions/init/scaffoldTemplate.ts"],"sourcesContent":["import {type Output, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {promptForTypeScript} from '../../prompts/init/promptForTypescript.js'\nimport {type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {\n getInstallCommand,\n installDeclaredPackages,\n} from '../../util/packageManager/installPackages.js'\nimport {type PackageManager} from '../../util/packageManager/packageManagerChoice.js'\nimport {bootstrapTemplate} from './bootstrapTemplate.js'\nimport {tryGitInit} from './git.js'\nimport {flagOrDefault, shouldPrompt, writeStagingEnvIfNeeded} from './initHelpers.js'\nimport {type RepoInfo} from './remoteTemplate.js'\nimport {resolvePackageManager} from './resolvePackageManager.js'\nimport templates from './templates/index.js'\nimport {type InitOptions, type ProjectTemplate} from './types.js'\n\ninterface SelectedTemplate {\n template: ProjectTemplate | undefined\n templateName: string\n useTypeScript: boolean\n}\n\ninterface TemplateChoice {\n name: string\n value: string\n}\n\nexport const templateChoices: TemplateChoice[] = [\n {name: 'Clean project with no predefined schema types', value: 'clean'},\n {name: 'Blog (schema)', value: 'blog'},\n {name: 'E-commerce (Shopify)', value: 'shopify'},\n {name: 'Movie project (schema + sample data)', value: 'moviedb'},\n {name: 'Page Builder (presets)', value: 'page-builder'},\n]\n\nasync function promptForTemplate(params: {\n template?: string\n unattended: boolean\n}): Promise<string> {\n const defaultTemplate = params.unattended || params.template ? params.template || 'clean' : null\n if (defaultTemplate) {\n return defaultTemplate\n }\n\n return select({\n choices: templateChoices,\n message: 'Select project template',\n })\n}\n\nexport async function selectTemplate({\n options,\n remoteTemplateInfo,\n trace,\n}: {\n options: InitOptions\n remoteTemplateInfo: RepoInfo | undefined\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n}): Promise<SelectedTemplate> {\n const {template, typescript, unattended} = options\n const templateName = await promptForTemplate({template, unattended})\n trace.log({\n selectedOption: templateName,\n step: 'selectProjectTemplate',\n })\n\n const resolvedTemplate = templates[templateName]\n\n let useTypeScript = flagOrDefault(typescript, true)\n if (!remoteTemplateInfo && resolvedTemplate && resolvedTemplate.typescriptOnly === true) {\n useTypeScript = true\n } else if (shouldPrompt(unattended, typescript)) {\n useTypeScript = await promptForTypeScript()\n trace.log({\n selectedOption: useTypeScript ? 'yes' : 'no',\n step: 'useTypeScript',\n })\n }\n\n return {\n template: resolvedTemplate,\n templateName,\n useTypeScript,\n }\n}\n\nexport async function 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 workbench,\n workDir,\n}: {\n datasetName: string\n defaults: {projectName: string}\n displayName: string\n options: InitOptions\n organizationId: string | undefined\n output: Output\n outputPath: string\n projectId: string\n remoteTemplateInfo: RepoInfo | undefined\n sluggedName: string\n templateName: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n useTypeScript: boolean\n workbench: boolean\n workDir: string\n}): Promise<{pkgManager: PackageManager}> {\n const {autoUpdates, git, install, overwriteFiles, packageManager, templateToken, unattended} =\n options\n const noGit = typeof git === 'boolean' && !git ? true : undefined\n\n await bootstrapTemplate({\n autoUpdates,\n bearerToken: templateToken,\n dataset: datasetName,\n organizationId,\n output,\n outputPath,\n overwriteFiles,\n packageName: sluggedName,\n projectId,\n projectName: displayName || defaults.projectName,\n remoteTemplateInfo,\n templateName,\n useTypeScript,\n workbench,\n })\n\n const pkgManager = await resolvePackageManager({\n interactive: !unattended,\n output,\n packageManager: packageManager as PackageManager,\n targetDir: outputPath,\n })\n\n trace.log({\n selectedOption: pkgManager,\n step: 'selectPackageManager',\n })\n\n if (install) {\n await installDeclaredPackages(outputPath, pkgManager, {\n output,\n workDir,\n })\n } else {\n output.log(`Skipped dependency install. Run ${getInstallCommand(pkgManager)} to install them.`)\n }\n\n const useGit = !noGit && (git === undefined || Boolean(git))\n const commitMessage = git\n await writeStagingEnvIfNeeded(output, outputPath)\n\n // Try initializing a git repository\n if (useGit) {\n tryGitInit(outputPath, typeof commitMessage === 'string' ? commitMessage : undefined)\n }\n\n return {pkgManager}\n}\n"],"names":["select","promptForTypeScript","getInstallCommand","installDeclaredPackages","bootstrapTemplate","tryGitInit","flagOrDefault","shouldPrompt","writeStagingEnvIfNeeded","resolvePackageManager","templates","templateChoices","name","value","promptForTemplate","params","defaultTemplate","unattended","template","choices","message","selectTemplate","options","remoteTemplateInfo","trace","typescript","templateName","log","selectedOption","step","resolvedTemplate","useTypeScript","typescriptOnly","scaffoldAndInstall","datasetName","defaults","displayName","organizationId","output","outputPath","projectId","sluggedName","workbench","workDir","autoUpdates","git","install","overwriteFiles","packageManager","templateToken","noGit","undefined","bearerToken","dataset","packageName","projectName","pkgManager","interactive","targetDir","useGit","Boolean","commitMessage"],"mappings":"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"}
@@ -25,6 +25,7 @@ export function flagsToInitOptions(flags, isUnattended, args, mcpMode, skillsMod
25
25
  fromCreate: flags['from-create'],
26
26
  git: flags['no-git'] ? false : flags.git,
27
27
  importDataset: flags['import-dataset'],
28
+ install: flags.install,
28
29
  mcpMode,
29
30
  nextjsAddConfigFiles: flags['nextjs-add-config-files'],
30
31
  nextjsAppendEnv: flags['nextjs-append-env'],
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/actions/init/types.ts"],"sourcesContent":["import {type CLITelemetryStore, type Output} from '@sanity/cli-core'\nimport {type Framework} from '@vercel/frameworks'\n\nimport {type GenerateConfigOptions} from './createStudioConfig.js'\n\nexport type VersionedFramework = Framework & {\n detectedVersion?: string\n}\n\nexport interface ProjectTemplate {\n configTemplate?: ((variables: GenerateConfigOptions['variables']) => string) | string\n datasetUrl?: string\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n entry?: string\n importPrompt?: string\n scripts?: Record<string, string>\n type?: 'commonjs' | 'module'\n typescriptOnly?: boolean\n}\n\nexport interface InitOptions {\n autoUpdates: boolean\n bare: boolean\n datasetDefault: boolean\n fromCreate: boolean\n mcpMode: 'auto' | 'prompt' | 'skip'\n skillsMode: 'auto' | 'prompt' | 'skip'\n unattended: boolean\n\n argType?: string\n coupon?: string\n dataset?: string\n env?: string\n git?: boolean | string\n importDataset?: boolean\n nextjsAddConfigFiles?: boolean\n nextjsAppendEnv?: boolean\n nextjsEmbedStudio?: boolean\n organization?: string\n outputPath?: string\n overwriteFiles?: boolean\n packageManager?: 'npm' | 'pnpm' | 'yarn'\n project?: string\n projectName?: string\n projectPlan?: string\n provider?: string\n reconfigure?: boolean\n template?: string\n templateToken?: string\n typescript?: boolean\n unstableWorkbench?: boolean\n visibility?: 'private' | 'public'\n}\n\nexport interface InitContext {\n output: Output\n telemetry: CLITelemetryStore\n workDir: string\n}\n\ninterface InitCommandFlags {\n 'auto-updates': boolean\n bare: boolean\n 'dataset-default': boolean\n 'from-create': boolean\n mcp: boolean\n 'no-git': boolean\n skills: boolean\n\n coupon?: string\n 'create-project'?: string\n dataset?: string\n env?: string\n git?: string\n 'import-dataset'?: boolean\n 'nextjs-add-config-files'?: boolean\n 'nextjs-append-env'?: boolean\n 'nextjs-embed-studio'?: boolean\n organization?: string\n 'output-path'?: string\n 'overwrite-files'?: boolean\n 'package-manager'?: string\n project?: string\n 'project-name'?: string\n 'project-plan'?: string\n provider?: string\n reconfigure?: boolean\n template?: string\n 'template-token'?: string\n typescript?: boolean\n 'unstable--workbench'?: boolean\n visibility?: string\n}\n\ninterface InitCommandArgs {\n type?: string\n}\n\nconst VALID_PACKAGE_MANAGERS = new Set<string>(['npm', 'pnpm', 'yarn'])\nfunction narrowPackageManager(value: string | undefined): InitOptions['packageManager'] {\n return value !== undefined && VALID_PACKAGE_MANAGERS.has(value)\n ? (value as InitOptions['packageManager'])\n : undefined\n}\n\nconst VALID_VISIBILITIES = new Set<string>(['private', 'public'])\nfunction narrowVisibility(value: string | undefined): InitOptions['visibility'] {\n return value !== undefined && VALID_VISIBILITIES.has(value)\n ? (value as InitOptions['visibility'])\n : undefined\n}\n\nexport function flagsToInitOptions(\n flags: InitCommandFlags,\n isUnattended: boolean,\n args: InitCommandArgs | undefined,\n mcpMode: InitOptions['mcpMode'],\n skillsMode: InitOptions['skillsMode'],\n): InitOptions {\n return {\n argType: args?.type,\n autoUpdates: flags['auto-updates'],\n bare: flags.bare,\n coupon: flags.coupon,\n dataset: flags.dataset,\n datasetDefault: flags['dataset-default'],\n env: flags.env,\n fromCreate: flags['from-create'],\n git: flags['no-git'] ? false : flags.git,\n importDataset: flags['import-dataset'],\n mcpMode,\n nextjsAddConfigFiles: flags['nextjs-add-config-files'],\n nextjsAppendEnv: flags['nextjs-append-env'],\n nextjsEmbedStudio: flags['nextjs-embed-studio'],\n organization: flags.organization,\n outputPath: flags['output-path'],\n overwriteFiles: flags['overwrite-files'],\n packageManager: narrowPackageManager(flags['package-manager']),\n project: flags.project,\n projectName: flags['project-name'] ?? flags['create-project'],\n projectPlan: flags['project-plan'],\n provider: flags.provider,\n reconfigure: flags.reconfigure,\n skillsMode,\n template: flags.template,\n templateToken: flags['template-token'],\n typescript: flags.typescript,\n unattended: isUnattended,\n unstableWorkbench: flags['unstable--workbench'],\n visibility: narrowVisibility(flags.visibility),\n }\n}\n"],"names":["VALID_PACKAGE_MANAGERS","Set","narrowPackageManager","value","undefined","has","VALID_VISIBILITIES","narrowVisibility","flagsToInitOptions","flags","isUnattended","args","mcpMode","skillsMode","argType","type","autoUpdates","bare","coupon","dataset","datasetDefault","env","fromCreate","git","importDataset","nextjsAddConfigFiles","nextjsAppendEnv","nextjsEmbedStudio","organization","outputPath","overwriteFiles","packageManager","project","projectName","projectPlan","provider","reconfigure","template","templateToken","typescript","unattended","unstableWorkbench","visibility"],"mappings":"AAmGA,MAAMA,yBAAyB,IAAIC,IAAY;IAAC;IAAO;IAAQ;CAAO;AACtE,SAASC,qBAAqBC,KAAyB;IACrD,OAAOA,UAAUC,aAAaJ,uBAAuBK,GAAG,CAACF,SACpDA,QACDC;AACN;AAEA,MAAME,qBAAqB,IAAIL,IAAY;IAAC;IAAW;CAAS;AAChE,SAASM,iBAAiBJ,KAAyB;IACjD,OAAOA,UAAUC,aAAaE,mBAAmBD,GAAG,CAACF,SAChDA,QACDC;AACN;AAEA,OAAO,SAASI,mBACdC,KAAuB,EACvBC,YAAqB,EACrBC,IAAiC,EACjCC,OAA+B,EAC/BC,UAAqC;IAErC,OAAO;QACLC,SAASH,MAAMI;QACfC,aAAaP,KAAK,CAAC,eAAe;QAClCQ,MAAMR,MAAMQ,IAAI;QAChBC,QAAQT,MAAMS,MAAM;QACpBC,SAASV,MAAMU,OAAO;QACtBC,gBAAgBX,KAAK,CAAC,kBAAkB;QACxCY,KAAKZ,MAAMY,GAAG;QACdC,YAAYb,KAAK,CAAC,cAAc;QAChCc,KAAKd,KAAK,CAAC,SAAS,GAAG,QAAQA,MAAMc,GAAG;QACxCC,eAAef,KAAK,CAAC,iBAAiB;QACtCG;QACAa,sBAAsBhB,KAAK,CAAC,0BAA0B;QACtDiB,iBAAiBjB,KAAK,CAAC,oBAAoB;QAC3CkB,mBAAmBlB,KAAK,CAAC,sBAAsB;QAC/CmB,cAAcnB,MAAMmB,YAAY;QAChCC,YAAYpB,KAAK,CAAC,cAAc;QAChCqB,gBAAgBrB,KAAK,CAAC,kBAAkB;QACxCsB,gBAAgB7B,qBAAqBO,KAAK,CAAC,kBAAkB;QAC7DuB,SAASvB,MAAMuB,OAAO;QACtBC,aAAaxB,KAAK,CAAC,eAAe,IAAIA,KAAK,CAAC,iBAAiB;QAC7DyB,aAAazB,KAAK,CAAC,eAAe;QAClC0B,UAAU1B,MAAM0B,QAAQ;QACxBC,aAAa3B,MAAM2B,WAAW;QAC9BvB;QACAwB,UAAU5B,MAAM4B,QAAQ;QACxBC,eAAe7B,KAAK,CAAC,iBAAiB;QACtC8B,YAAY9B,MAAM8B,UAAU;QAC5BC,YAAY9B;QACZ+B,mBAAmBhC,KAAK,CAAC,sBAAsB;QAC/CiC,YAAYnC,iBAAiBE,MAAMiC,UAAU;IAC/C;AACF"}
1
+ {"version":3,"sources":["../../../src/actions/init/types.ts"],"sourcesContent":["import {type CLITelemetryStore, type Output} from '@sanity/cli-core'\nimport {type Framework} from '@vercel/frameworks'\n\nimport {type GenerateConfigOptions} from './createStudioConfig.js'\n\nexport type VersionedFramework = Framework & {\n detectedVersion?: string\n}\n\nexport interface ProjectTemplate {\n configTemplate?: ((variables: GenerateConfigOptions['variables']) => string) | string\n datasetUrl?: string\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n entry?: string\n importPrompt?: string\n scripts?: Record<string, string>\n type?: 'commonjs' | 'module'\n typescriptOnly?: boolean\n}\n\nexport interface InitOptions {\n autoUpdates: boolean\n bare: boolean\n datasetDefault: boolean\n fromCreate: boolean\n install: boolean\n mcpMode: 'auto' | 'prompt' | 'skip'\n skillsMode: 'auto' | 'prompt' | 'skip'\n unattended: boolean\n\n argType?: string\n coupon?: string\n dataset?: string\n env?: string\n git?: boolean | string\n importDataset?: boolean\n nextjsAddConfigFiles?: boolean\n nextjsAppendEnv?: boolean\n nextjsEmbedStudio?: boolean\n organization?: string\n outputPath?: string\n overwriteFiles?: boolean\n packageManager?: 'npm' | 'pnpm' | 'yarn'\n project?: string\n projectName?: string\n projectPlan?: string\n provider?: string\n reconfigure?: boolean\n template?: string\n templateToken?: string\n typescript?: boolean\n unstableWorkbench?: boolean\n visibility?: 'private' | 'public'\n}\n\nexport interface InitContext {\n output: Output\n telemetry: CLITelemetryStore\n workDir: string\n}\n\ninterface InitCommandFlags {\n 'auto-updates': boolean\n bare: boolean\n 'dataset-default': boolean\n 'from-create': boolean\n install: boolean\n mcp: boolean\n 'no-git': boolean\n skills: boolean\n\n coupon?: string\n 'create-project'?: string\n dataset?: string\n env?: string\n git?: string\n 'import-dataset'?: boolean\n 'nextjs-add-config-files'?: boolean\n 'nextjs-append-env'?: boolean\n 'nextjs-embed-studio'?: boolean\n organization?: string\n 'output-path'?: string\n 'overwrite-files'?: boolean\n 'package-manager'?: string\n project?: string\n 'project-name'?: string\n 'project-plan'?: string\n provider?: string\n reconfigure?: boolean\n template?: string\n 'template-token'?: string\n typescript?: boolean\n 'unstable--workbench'?: boolean\n visibility?: string\n}\n\ninterface InitCommandArgs {\n type?: string\n}\n\nconst VALID_PACKAGE_MANAGERS = new Set<string>(['npm', 'pnpm', 'yarn'])\nfunction narrowPackageManager(value: string | undefined): InitOptions['packageManager'] {\n return value !== undefined && VALID_PACKAGE_MANAGERS.has(value)\n ? (value as InitOptions['packageManager'])\n : undefined\n}\n\nconst VALID_VISIBILITIES = new Set<string>(['private', 'public'])\nfunction narrowVisibility(value: string | undefined): InitOptions['visibility'] {\n return value !== undefined && VALID_VISIBILITIES.has(value)\n ? (value as InitOptions['visibility'])\n : undefined\n}\n\nexport function flagsToInitOptions(\n flags: InitCommandFlags,\n isUnattended: boolean,\n args: InitCommandArgs | undefined,\n mcpMode: InitOptions['mcpMode'],\n skillsMode: InitOptions['skillsMode'],\n): InitOptions {\n return {\n argType: args?.type,\n autoUpdates: flags['auto-updates'],\n bare: flags.bare,\n coupon: flags.coupon,\n dataset: flags.dataset,\n datasetDefault: flags['dataset-default'],\n env: flags.env,\n fromCreate: flags['from-create'],\n git: flags['no-git'] ? false : flags.git,\n importDataset: flags['import-dataset'],\n install: flags.install,\n mcpMode,\n nextjsAddConfigFiles: flags['nextjs-add-config-files'],\n nextjsAppendEnv: flags['nextjs-append-env'],\n nextjsEmbedStudio: flags['nextjs-embed-studio'],\n organization: flags.organization,\n outputPath: flags['output-path'],\n overwriteFiles: flags['overwrite-files'],\n packageManager: narrowPackageManager(flags['package-manager']),\n project: flags.project,\n projectName: flags['project-name'] ?? flags['create-project'],\n projectPlan: flags['project-plan'],\n provider: flags.provider,\n reconfigure: flags.reconfigure,\n skillsMode,\n template: flags.template,\n templateToken: flags['template-token'],\n typescript: flags.typescript,\n unattended: isUnattended,\n unstableWorkbench: flags['unstable--workbench'],\n visibility: narrowVisibility(flags.visibility),\n }\n}\n"],"names":["VALID_PACKAGE_MANAGERS","Set","narrowPackageManager","value","undefined","has","VALID_VISIBILITIES","narrowVisibility","flagsToInitOptions","flags","isUnattended","args","mcpMode","skillsMode","argType","type","autoUpdates","bare","coupon","dataset","datasetDefault","env","fromCreate","git","importDataset","install","nextjsAddConfigFiles","nextjsAppendEnv","nextjsEmbedStudio","organization","outputPath","overwriteFiles","packageManager","project","projectName","projectPlan","provider","reconfigure","template","templateToken","typescript","unattended","unstableWorkbench","visibility"],"mappings":"AAqGA,MAAMA,yBAAyB,IAAIC,IAAY;IAAC;IAAO;IAAQ;CAAO;AACtE,SAASC,qBAAqBC,KAAyB;IACrD,OAAOA,UAAUC,aAAaJ,uBAAuBK,GAAG,CAACF,SACpDA,QACDC;AACN;AAEA,MAAME,qBAAqB,IAAIL,IAAY;IAAC;IAAW;CAAS;AAChE,SAASM,iBAAiBJ,KAAyB;IACjD,OAAOA,UAAUC,aAAaE,mBAAmBD,GAAG,CAACF,SAChDA,QACDC;AACN;AAEA,OAAO,SAASI,mBACdC,KAAuB,EACvBC,YAAqB,EACrBC,IAAiC,EACjCC,OAA+B,EAC/BC,UAAqC;IAErC,OAAO;QACLC,SAASH,MAAMI;QACfC,aAAaP,KAAK,CAAC,eAAe;QAClCQ,MAAMR,MAAMQ,IAAI;QAChBC,QAAQT,MAAMS,MAAM;QACpBC,SAASV,MAAMU,OAAO;QACtBC,gBAAgBX,KAAK,CAAC,kBAAkB;QACxCY,KAAKZ,MAAMY,GAAG;QACdC,YAAYb,KAAK,CAAC,cAAc;QAChCc,KAAKd,KAAK,CAAC,SAAS,GAAG,QAAQA,MAAMc,GAAG;QACxCC,eAAef,KAAK,CAAC,iBAAiB;QACtCgB,SAAShB,MAAMgB,OAAO;QACtBb;QACAc,sBAAsBjB,KAAK,CAAC,0BAA0B;QACtDkB,iBAAiBlB,KAAK,CAAC,oBAAoB;QAC3CmB,mBAAmBnB,KAAK,CAAC,sBAAsB;QAC/CoB,cAAcpB,MAAMoB,YAAY;QAChCC,YAAYrB,KAAK,CAAC,cAAc;QAChCsB,gBAAgBtB,KAAK,CAAC,kBAAkB;QACxCuB,gBAAgB9B,qBAAqBO,KAAK,CAAC,kBAAkB;QAC7DwB,SAASxB,MAAMwB,OAAO;QACtBC,aAAazB,KAAK,CAAC,eAAe,IAAIA,KAAK,CAAC,iBAAiB;QAC7D0B,aAAa1B,KAAK,CAAC,eAAe;QAClC2B,UAAU3B,MAAM2B,QAAQ;QACxBC,aAAa5B,MAAM4B,WAAW;QAC9BxB;QACAyB,UAAU7B,MAAM6B,QAAQ;QACxBC,eAAe9B,KAAK,CAAC,iBAAiB;QACtC+B,YAAY/B,MAAM+B,UAAU;QAC5BC,YAAY/B;QACZgC,mBAAmBjC,KAAK,CAAC,sBAAsB;QAC/CkC,YAAYpC,iBAAiBE,MAAMkC,UAAU;IAC/C;AACF"}
@@ -94,6 +94,7 @@ export async function scaffoldProject({ cancelSignal, dataset, displayName, outp
94
94
  datasetDefault: true,
95
95
  fromCreate: false,
96
96
  git: false,
97
+ install: true,
97
98
  mcpMode: 'skip',
98
99
  outputPath: studioPath,
99
100
  packageManager: STUDIO_PACKAGE_MANAGERS.has(resolvedPackageManager) ? resolvedPackageManager : undefined,