@sanity/cli 6.3.2 → 6.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -18
- package/dist/actions/build/buildApp.js +12 -4
- 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 +29 -7
- package/dist/actions/build/buildStudio.js.map +1 -1
- package/dist/actions/build/buildVendorDependencies.js +7 -7
- package/dist/actions/build/buildVendorDependencies.js.map +1 -1
- package/dist/actions/build/checkRequiredDependencies.js +4 -4
- package/dist/actions/build/checkRequiredDependencies.js.map +1 -1
- package/dist/actions/build/checkStudioDependencyVersions.js +9 -9
- 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 +2 -1
- 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 +2 -2
- package/dist/actions/codemods/reactIconsV3.js.map +1 -1
- package/dist/actions/dev/startStudioDevServer.js +2 -2
- 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/bootstrapLocalTemplate.js +16 -1
- package/dist/actions/init/bootstrapLocalTemplate.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 +63 -0
- package/dist/actions/init/initApp.js.map +1 -0
- package/dist/actions/init/initError.js +10 -0
- package/dist/actions/init/initError.js.map +1 -0
- package/dist/actions/init/initHelpers.js +28 -0
- package/dist/actions/init/initHelpers.js.map +1 -0
- package/dist/actions/init/initNextJs.js +243 -0
- package/dist/actions/init/initNextJs.js.map +1 -0
- package/dist/actions/init/initStudio.js +118 -0
- package/dist/actions/init/initStudio.js.map +1 -0
- 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 +108 -0
- package/dist/actions/init/scaffoldTemplate.js.map +1 -0
- package/dist/actions/init/templates/appQuickstart.js +2 -1
- package/dist/actions/init/templates/appQuickstart.js.map +1 -1
- package/dist/actions/init/templates/appSanityUi.js +2 -1
- package/dist/actions/init/templates/appSanityUi.js.map +1 -1
- package/dist/actions/init/templates/shopify.js +6 -6
- package/dist/actions/init/templates/shopify.js.map +1 -1
- package/dist/actions/init/templates/shopifyOnline.js +2 -2
- package/dist/actions/init/templates/shopifyOnline.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/types.js +0 -1
- package/dist/actions/manifest/types.js.map +1 -1
- package/dist/actions/mcp/detectAvailableEditors.js +16 -3
- package/dist/actions/mcp/detectAvailableEditors.js.map +1 -1
- package/dist/actions/mcp/editorConfigs.js +192 -132
- package/dist/actions/mcp/editorConfigs.js.map +1 -1
- package/dist/actions/mcp/setupMCP.js +4 -1
- package/dist/actions/mcp/setupMCP.js.map +1 -1
- package/dist/actions/mcp/writeMCPConfig.js +2 -2
- package/dist/actions/mcp/writeMCPConfig.js.map +1 -1
- package/dist/actions/schema/extractSchema.js +5 -7
- package/dist/actions/schema/extractSchema.js.map +1 -1
- package/dist/actions/versions/buildPackageArray.js +2 -2
- 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 +14 -0
- package/dist/commands/datasets/copy.js.map +1 -1
- package/dist/commands/init.js +11 -1244
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp/configure.js +1 -1
- package/dist/commands/mcp/configure.js.map +1 -1
- package/dist/hooks/prerun/injectEnvVariables.js +3 -5
- package/dist/hooks/prerun/injectEnvVariables.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 +2 -1
- package/dist/services/datasets.js.map +1 -1
- package/dist/telemetry/init.telemetry.js.map +1 -1
- package/dist/util/compareDependencyVersions.js +4 -4
- 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/detectPackages.js +13 -7
- package/dist/util/packageManager/installationInfo/detectPackages.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/dist/util/update/fetchUpdateInfo.js +40 -0
- package/dist/util/update/fetchUpdateInfo.js.map +1 -0
- package/dist/util/update/fetchUpdateInfo.worker.js +19 -0
- package/dist/util/update/fetchUpdateInfo.worker.js.map +1 -0
- package/dist/util/update/getRunnerUpdateCommand.js +33 -0
- package/dist/util/update/getRunnerUpdateCommand.js.map +1 -0
- package/dist/util/update/getUpdateCommand.js +6 -7
- package/dist/util/update/getUpdateCommand.js.map +1 -1
- package/dist/util/update/packageRunner.js +10 -0
- package/dist/util/update/packageRunner.js.map +1 -0
- package/dist/util/update/resolveRunnerPackage.js +45 -0
- package/dist/util/update/resolveRunnerPackage.js.map +1 -0
- package/dist/util/update/resolveUpdateTarget.js +31 -0
- package/dist/util/update/resolveUpdateTarget.js.map +1 -0
- package/dist/util/update/showNotificationUpdate.js +8 -6
- package/dist/util/update/showNotificationUpdate.js.map +1 -1
- package/dist/util/update/updateChecker.js +73 -38
- package/dist/util/update/updateChecker.js.map +1 -1
- package/oclif.manifest.json +17 -2
- package/package.json +23 -22
- package/templates/app-quickstart/src/App.tsx +2 -2
- package/templates/app-sanity-ui/src/App.tsx +2 -2
- package/templates/shopify/schemaTypes/objects/hotspot/imageWithProductHotspotsType.ts +1 -1
- package/dist/util/update/fetchLatestVersion.js +0 -21
- package/dist/util/update/fetchLatestVersion.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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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { styleText } from 'node:util';
|
|
2
|
+
import { logSymbols } from '@sanity/cli-core/ux';
|
|
3
|
+
import { InitError } from './initError.js';
|
|
4
|
+
import { getPostInitMCPPrompt } from './initHelpers.js';
|
|
5
|
+
import { scaffoldAndInstall, selectTemplate } from './scaffoldTemplate.js';
|
|
6
|
+
export async function initApp({ datasetName, defaults, mcpConfigured, options, organizationId, output, outputPath, projectId, remoteTemplateInfo, sluggedName, trace, workDir }) {
|
|
7
|
+
const { template: resolvedTemplate, templateName, useTypeScript } = await selectTemplate({
|
|
8
|
+
options,
|
|
9
|
+
remoteTemplateInfo,
|
|
10
|
+
trace
|
|
11
|
+
});
|
|
12
|
+
if (!remoteTemplateInfo && !resolvedTemplate) {
|
|
13
|
+
throw new InitError(`Template "${templateName}" not found`, 1);
|
|
14
|
+
}
|
|
15
|
+
await scaffoldAndInstall({
|
|
16
|
+
datasetName,
|
|
17
|
+
defaults,
|
|
18
|
+
displayName: '',
|
|
19
|
+
options,
|
|
20
|
+
organizationId,
|
|
21
|
+
output,
|
|
22
|
+
outputPath,
|
|
23
|
+
projectId,
|
|
24
|
+
remoteTemplateInfo,
|
|
25
|
+
sluggedName,
|
|
26
|
+
templateName,
|
|
27
|
+
trace,
|
|
28
|
+
useTypeScript,
|
|
29
|
+
workDir
|
|
30
|
+
});
|
|
31
|
+
const isCurrentDir = outputPath === workDir;
|
|
32
|
+
const goToProjectDir = `\n(${styleText('cyan', `cd ${outputPath}`)} to navigate to your new project directory)`;
|
|
33
|
+
//output for custom apps here
|
|
34
|
+
output.log(`${logSymbols.success} ${styleText([
|
|
35
|
+
'green',
|
|
36
|
+
'bold'
|
|
37
|
+
], 'Success!')} Your custom app has been scaffolded.`);
|
|
38
|
+
if (!isCurrentDir) output.log(goToProjectDir);
|
|
39
|
+
if (projectId && datasetName) {
|
|
40
|
+
output.log(`\nConfigured with project ${styleText('cyan', projectId)} and dataset ${styleText('cyan', datasetName)}.`);
|
|
41
|
+
output.log('Edit `src/App.tsx` to change these values or add more project / dataset pairs to your config.');
|
|
42
|
+
} else {
|
|
43
|
+
output.log(`\n${styleText('bold', 'Next')}, configure the project(s) and dataset(s) your app should work with in \`src/App.tsx\`.`);
|
|
44
|
+
}
|
|
45
|
+
output.log('\nRefer to our documentation for a walkthrough:');
|
|
46
|
+
output.log(styleText([
|
|
47
|
+
'blue',
|
|
48
|
+
'underline'
|
|
49
|
+
], 'https://www.sanity.io/docs/app-sdk/sdk-configuration'));
|
|
50
|
+
if (mcpConfigured && mcpConfigured.length > 0) {
|
|
51
|
+
const message = await getPostInitMCPPrompt(mcpConfigured);
|
|
52
|
+
output.log(`\n${message}`);
|
|
53
|
+
output.log(`\nLearn more: ${styleText('cyan', 'https://mcp.sanity.io')}`);
|
|
54
|
+
output.log(`\nHave feedback? Tell us in the community: ${styleText('cyan', 'https://www.sanity.io/community/join')}`);
|
|
55
|
+
}
|
|
56
|
+
output.log('\n');
|
|
57
|
+
output.log(`Other helpful commands:`);
|
|
58
|
+
output.log(`npx sanity docs browse to open the documentation in a browser`);
|
|
59
|
+
output.log(`npx sanity dev to start the development server for your app`);
|
|
60
|
+
output.log(`npx sanity deploy to deploy your app`);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=initApp.js.map
|
|
@@ -0,0 +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 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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { getSanityEnv } from '../../util/getSanityEnv.js';
|
|
2
|
+
import { createOrAppendEnvVars } from './env/createOrAppendEnvVars.js';
|
|
3
|
+
import { fetchPostInitPrompt } from './fetchPostInitPrompt.js';
|
|
4
|
+
export function shouldPrompt(unattended, flagValue) {
|
|
5
|
+
return !unattended && flagValue === undefined;
|
|
6
|
+
}
|
|
7
|
+
export function flagOrDefault(flagValue, defaultValue) {
|
|
8
|
+
return typeof flagValue === 'boolean' ? flagValue : defaultValue;
|
|
9
|
+
}
|
|
10
|
+
export async function getPostInitMCPPrompt(editorsNames) {
|
|
11
|
+
return fetchPostInitPrompt(new Intl.ListFormat('en').format(editorsNames));
|
|
12
|
+
}
|
|
13
|
+
export async function writeStagingEnvIfNeeded(output, outputPath) {
|
|
14
|
+
const sanityEnv = getSanityEnv();
|
|
15
|
+
if (sanityEnv === 'production') return;
|
|
16
|
+
await createOrAppendEnvVars({
|
|
17
|
+
envVars: {
|
|
18
|
+
INTERNAL_ENV: sanityEnv
|
|
19
|
+
},
|
|
20
|
+
filename: '.env',
|
|
21
|
+
framework: null,
|
|
22
|
+
log: false,
|
|
23
|
+
output,
|
|
24
|
+
outputPath
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=initHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|