@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.
- package/README.md +201 -103
- package/dist/actions/build/buildApp.js +46 -17
- package/dist/actions/build/buildApp.js.map +1 -1
- package/dist/actions/build/buildStaticFiles.js +3 -1
- package/dist/actions/build/buildStaticFiles.js.map +1 -1
- package/dist/actions/build/buildStudio.js +80 -30
- package/dist/actions/build/buildStudio.js.map +1 -1
- package/dist/actions/build/buildVendorDependencies.js +10 -9
- package/dist/actions/build/buildVendorDependencies.js.map +1 -1
- package/dist/actions/build/checkRequiredDependencies.js +6 -9
- package/dist/actions/build/checkRequiredDependencies.js.map +1 -1
- package/dist/actions/build/checkStudioDependencyVersions.js +10 -11
- package/dist/actions/build/checkStudioDependencyVersions.js.map +1 -1
- package/dist/actions/build/getAutoUpdatesImportMap.js +9 -0
- package/dist/actions/build/getAutoUpdatesImportMap.js.map +1 -1
- package/dist/actions/build/getViteConfig.js +4 -2
- package/dist/actions/build/getViteConfig.js.map +1 -1
- package/dist/actions/build/renderDocument.js.map +1 -1
- package/dist/actions/build/renderDocumentWorker/addTimestampImportMapScriptToHtml.js +34 -14
- package/dist/actions/build/renderDocumentWorker/addTimestampImportMapScriptToHtml.js.map +1 -1
- package/dist/actions/build/renderDocumentWorker/getDocumentHtml.js +2 -2
- package/dist/actions/build/renderDocumentWorker/getDocumentHtml.js.map +1 -1
- package/dist/actions/build/renderDocumentWorker/renderDocumentWorker.js +2 -2
- package/dist/actions/build/renderDocumentWorker/renderDocumentWorker.js.map +1 -1
- package/dist/actions/codemods/reactIconsV3.js +3 -3
- package/dist/actions/codemods/reactIconsV3.js.map +1 -1
- package/dist/actions/deploy/deployApp.js +1 -1
- package/dist/actions/deploy/deployApp.js.map +1 -1
- package/dist/actions/deploy/deployStudio.js +1 -2
- package/dist/actions/deploy/deployStudio.js.map +1 -1
- package/dist/actions/dev/startStudioDevServer.js +3 -4
- package/dist/actions/dev/startStudioDevServer.js.map +1 -1
- package/dist/actions/doctor/types.js.map +1 -1
- package/dist/actions/graphql/resolveGraphQLApisFromWorkspaces.js.map +1 -1
- package/dist/actions/init/bootstrapTemplate.js.map +1 -1
- package/dist/actions/init/checkNextJsReactCompatibility.js +3 -3
- package/dist/actions/init/checkNextJsReactCompatibility.js.map +1 -1
- package/dist/actions/init/initAction.js +287 -0
- package/dist/actions/init/initAction.js.map +1 -0
- package/dist/actions/init/initApp.js +7 -16
- package/dist/actions/init/initApp.js.map +1 -1
- package/dist/actions/init/initError.js +10 -0
- package/dist/actions/init/initError.js.map +1 -0
- package/dist/actions/init/initHelpers.js +3 -12
- package/dist/actions/init/initHelpers.js.map +1 -1
- package/dist/actions/init/initNextJs.js +17 -20
- package/dist/actions/init/initNextJs.js.map +1 -1
- package/dist/actions/init/initStudio.js +11 -20
- package/dist/actions/init/initStudio.js.map +1 -1
- package/dist/actions/init/plan/getPlan.js +15 -0
- package/dist/actions/init/plan/getPlan.js.map +1 -0
- package/dist/actions/init/plan/verifyCoupon.js +35 -0
- package/dist/actions/init/plan/verifyCoupon.js.map +1 -0
- package/dist/actions/init/plan/verifyPlan.js +34 -0
- package/dist/actions/init/plan/verifyPlan.js.map +1 -0
- package/dist/actions/init/project/createProjectFromName.js +44 -0
- package/dist/actions/init/project/createProjectFromName.js.map +1 -0
- package/dist/actions/init/project/getOrCreateDataset.js +126 -0
- package/dist/actions/init/project/getOrCreateDataset.js.map +1 -0
- package/dist/actions/init/project/getOrCreateProject.js +128 -0
- package/dist/actions/init/project/getOrCreateProject.js.map +1 -0
- package/dist/actions/init/project/getProjectDetails.js +87 -0
- package/dist/actions/init/project/getProjectDetails.js.map +1 -0
- package/dist/actions/init/project/getProjectOutputPath.js +17 -0
- package/dist/actions/init/project/getProjectOutputPath.js.map +1 -0
- package/dist/actions/init/project/promptForAppTemplateSetup.js +112 -0
- package/dist/actions/init/project/promptForAppTemplateSetup.js.map +1 -0
- package/dist/actions/init/project/promptForProjectCreation.js +40 -0
- package/dist/actions/init/project/promptForProjectCreation.js.map +1 -0
- package/dist/actions/init/project/promptUserForNewOrganization.js +12 -0
- package/dist/actions/init/project/promptUserForNewOrganization.js.map +1 -0
- package/dist/actions/init/project/promptUserForOrganization.js +38 -0
- package/dist/actions/init/project/promptUserForOrganization.js.map +1 -0
- package/dist/actions/init/scaffoldTemplate.js +23 -29
- package/dist/actions/init/scaffoldTemplate.js.map +1 -1
- package/dist/actions/init/types.js +47 -1
- package/dist/actions/init/types.js.map +1 -1
- package/dist/actions/manifest/extractAppManifest.js +3 -2
- package/dist/actions/manifest/extractAppManifest.js.map +1 -1
- package/dist/actions/manifest/types.js +9 -1
- package/dist/actions/manifest/types.js.map +1 -1
- package/dist/actions/manifest/writeManifestFile.js +1 -2
- package/dist/actions/manifest/writeManifestFile.js.map +1 -1
- package/dist/actions/schema/uploadSchemaToLexicon.js +1 -2
- package/dist/actions/schema/uploadSchemaToLexicon.js.map +1 -1
- package/dist/actions/versions/buildPackageArray.js +3 -3
- package/dist/actions/versions/buildPackageArray.js.map +1 -1
- package/dist/actions/versions/findSanityModulesVersions.js +3 -3
- package/dist/actions/versions/findSanityModulesVersions.js.map +1 -1
- package/dist/commands/datasets/copy.js.map +1 -1
- package/dist/commands/init.js +11 -911
- package/dist/commands/init.js.map +1 -1
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -0
- package/dist/server/previewServer.js +1 -1
- package/dist/server/previewServer.js.map +1 -1
- package/dist/server/vite/plugin-sanity-build-entries.js +2 -1
- package/dist/server/vite/plugin-sanity-build-entries.js.map +1 -1
- package/dist/services/datasets.js.map +1 -1
- package/dist/services/userApplications.js.map +1 -1
- package/dist/telemetry/init.telemetry.js.map +1 -1
- package/dist/util/compareDependencyVersions.js +5 -6
- package/dist/util/compareDependencyVersions.js.map +1 -1
- package/dist/util/createExpiringConfig.js +1 -1
- package/dist/util/createExpiringConfig.js.map +1 -1
- package/dist/util/packageManager/installationInfo/analyzeIssues.js +7 -7
- package/dist/util/packageManager/installationInfo/analyzeIssues.js.map +1 -1
- package/dist/util/packageManager/installationInfo/types.js.map +1 -1
- package/dist/util/packageManager/packageManagerChoice.js +2 -2
- package/dist/util/packageManager/packageManagerChoice.js.map +1 -1
- package/dist/util/packageManager/preferredPm.js +106 -0
- package/dist/util/packageManager/preferredPm.js.map +1 -0
- package/oclif.manifest.json +526 -526
- package/package.json +27 -26
- package/dist/util/getLocalPackageVersion.js +0 -55
- 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({
|
|
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
|
-
|
|
9
|
-
trace,
|
|
10
|
-
typescript,
|
|
11
|
-
unattended
|
|
10
|
+
trace
|
|
12
11
|
});
|
|
13
12
|
if (!remoteTemplateInfo && !resolvedTemplate) {
|
|
14
|
-
|
|
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
|
-
|
|
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 ===
|
|
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
|
|
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 @@
|
|
|
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 {
|
|
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,
|
|
21
|
+
async function writeOrOverwrite(filePath, content, workDir, options) {
|
|
21
22
|
if (existsSync(filePath)) {
|
|
22
|
-
let overwrite = flagOrDefault(
|
|
23
|
-
if (shouldPrompt(
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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 (
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
}
|