@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,38 @@
|
|
|
1
|
+
import { subdebug } from '@sanity/cli-core';
|
|
2
|
+
import { select } from '@sanity/cli-core/ux';
|
|
3
|
+
import { findOrganizationByUserName } from '../../organizations/findOrganizationByUserName.js';
|
|
4
|
+
import { getOrganizationChoices } from '../../organizations/getOrganizationChoices.js';
|
|
5
|
+
import { getOrganizationsWithAttachGrantInfo } from '../../organizations/getOrganizationsWithAttachGrantInfo.js';
|
|
6
|
+
import { promptUserForNewOrganization } from './promptUserForNewOrganization.js';
|
|
7
|
+
const debug = subdebug('init');
|
|
8
|
+
export async function promptUserForOrganization({ isAppTemplate = false, organizations, user }) {
|
|
9
|
+
if (organizations.length === 0) {
|
|
10
|
+
const newOrganization = await promptUserForNewOrganization(user);
|
|
11
|
+
return newOrganization.id;
|
|
12
|
+
}
|
|
13
|
+
let organizationChoices;
|
|
14
|
+
let defaultOrganizationId;
|
|
15
|
+
if (isAppTemplate) {
|
|
16
|
+
organizationChoices = getOrganizationChoices(organizations);
|
|
17
|
+
defaultOrganizationId = organizations.length === 1 ? organizations[0].id : findOrganizationByUserName(organizations, user);
|
|
18
|
+
} else {
|
|
19
|
+
debug(`User has ${organizations.length} organization(s), checking attach access`);
|
|
20
|
+
const withGrantInfo = await getOrganizationsWithAttachGrantInfo(organizations);
|
|
21
|
+
const withAttach = withGrantInfo.filter(({ hasAttachGrant })=>hasAttachGrant);
|
|
22
|
+
debug('User has attach access to %d organizations.', withAttach.length);
|
|
23
|
+
organizationChoices = getOrganizationChoices(withGrantInfo);
|
|
24
|
+
defaultOrganizationId = withAttach.length === 1 ? withAttach[0].organization.id : findOrganizationByUserName(organizations, user);
|
|
25
|
+
}
|
|
26
|
+
const chosenOrg = await select({
|
|
27
|
+
choices: organizationChoices,
|
|
28
|
+
default: defaultOrganizationId || undefined,
|
|
29
|
+
message: 'Select organization:'
|
|
30
|
+
});
|
|
31
|
+
if (chosenOrg === '-new-') {
|
|
32
|
+
const newOrganization = await promptUserForNewOrganization(user);
|
|
33
|
+
return newOrganization.id;
|
|
34
|
+
}
|
|
35
|
+
return chosenOrg || undefined;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=promptUserForOrganization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/project/promptUserForOrganization.ts"],"sourcesContent":["import {type SanityOrgUser, subdebug} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\n\nimport {type ProjectOrganization} from '../../../services/organizations.js'\nimport {findOrganizationByUserName} from '../../organizations/findOrganizationByUserName.js'\nimport {getOrganizationChoices} from '../../organizations/getOrganizationChoices.js'\nimport {getOrganizationsWithAttachGrantInfo} from '../../organizations/getOrganizationsWithAttachGrantInfo.js'\nimport {type OrganizationChoices} from '../../organizations/types.js'\nimport {promptUserForNewOrganization} from './promptUserForNewOrganization.js'\n\nconst debug = subdebug('init')\n\nexport async function promptUserForOrganization({\n isAppTemplate = false,\n organizations,\n user,\n}: {\n isAppTemplate?: boolean\n organizations: ProjectOrganization[]\n user: SanityOrgUser\n}) {\n if (organizations.length === 0) {\n const newOrganization = await promptUserForNewOrganization(user)\n return newOrganization.id\n }\n\n let organizationChoices: OrganizationChoices\n let defaultOrganizationId: string | undefined\n\n if (isAppTemplate) {\n organizationChoices = getOrganizationChoices(organizations)\n defaultOrganizationId =\n organizations.length === 1\n ? organizations[0].id\n : findOrganizationByUserName(organizations, user)\n } else {\n debug(`User has ${organizations.length} organization(s), checking attach access`)\n const withGrantInfo = await getOrganizationsWithAttachGrantInfo(organizations)\n const withAttach = withGrantInfo.filter(({hasAttachGrant}) => hasAttachGrant)\n\n debug('User has attach access to %d organizations.', withAttach.length)\n organizationChoices = getOrganizationChoices(withGrantInfo)\n defaultOrganizationId =\n withAttach.length === 1\n ? withAttach[0].organization.id\n : findOrganizationByUserName(organizations, user)\n }\n\n const chosenOrg = await select({\n choices: organizationChoices,\n default: defaultOrganizationId || undefined,\n message: 'Select organization:',\n })\n\n if (chosenOrg === '-new-') {\n const newOrganization = await promptUserForNewOrganization(user)\n return newOrganization.id\n }\n\n return chosenOrg || undefined\n}\n"],"names":["subdebug","select","findOrganizationByUserName","getOrganizationChoices","getOrganizationsWithAttachGrantInfo","promptUserForNewOrganization","debug","promptUserForOrganization","isAppTemplate","organizations","user","length","newOrganization","id","organizationChoices","defaultOrganizationId","withGrantInfo","withAttach","filter","hasAttachGrant","organization","chosenOrg","choices","default","undefined","message"],"mappings":"AAAA,SAA4BA,QAAQ,QAAO,mBAAkB;AAC7D,SAAQC,MAAM,QAAO,sBAAqB;AAG1C,SAAQC,0BAA0B,QAAO,oDAAmD;AAC5F,SAAQC,sBAAsB,QAAO,gDAA+C;AACpF,SAAQC,mCAAmC,QAAO,6DAA4D;AAE9G,SAAQC,4BAA4B,QAAO,oCAAmC;AAE9E,MAAMC,QAAQN,SAAS;AAEvB,OAAO,eAAeO,0BAA0B,EAC9CC,gBAAgB,KAAK,EACrBC,aAAa,EACbC,IAAI,EAKL;IACC,IAAID,cAAcE,MAAM,KAAK,GAAG;QAC9B,MAAMC,kBAAkB,MAAMP,6BAA6BK;QAC3D,OAAOE,gBAAgBC,EAAE;IAC3B;IAEA,IAAIC;IACJ,IAAIC;IAEJ,IAAIP,eAAe;QACjBM,sBAAsBX,uBAAuBM;QAC7CM,wBACEN,cAAcE,MAAM,KAAK,IACrBF,aAAa,CAAC,EAAE,CAACI,EAAE,GACnBX,2BAA2BO,eAAeC;IAClD,OAAO;QACLJ,MAAM,CAAC,SAAS,EAAEG,cAAcE,MAAM,CAAC,wCAAwC,CAAC;QAChF,MAAMK,gBAAgB,MAAMZ,oCAAoCK;QAChE,MAAMQ,aAAaD,cAAcE,MAAM,CAAC,CAAC,EAACC,cAAc,EAAC,GAAKA;QAE9Db,MAAM,+CAA+CW,WAAWN,MAAM;QACtEG,sBAAsBX,uBAAuBa;QAC7CD,wBACEE,WAAWN,MAAM,KAAK,IAClBM,UAAU,CAAC,EAAE,CAACG,YAAY,CAACP,EAAE,GAC7BX,2BAA2BO,eAAeC;IAClD;IAEA,MAAMW,YAAY,MAAMpB,OAAO;QAC7BqB,SAASR;QACTS,SAASR,yBAAyBS;QAClCC,SAAS;IACX;IAEA,IAAIJ,cAAc,SAAS;QACzB,MAAMT,kBAAkB,MAAMP,6BAA6BK;QAC3D,OAAOE,gBAAgBC,EAAE;IAC3B;IAEA,OAAOQ,aAAaG;AACtB"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { select } from '@sanity/cli-core/ux';
|
|
2
|
+
import { promptForTypeScript } from '../../prompts/init/promptForTypescript.js';
|
|
3
|
+
import { installDeclaredPackages } from '../../util/packageManager/installPackages.js';
|
|
4
|
+
import { bootstrapTemplate } from './bootstrapTemplate.js';
|
|
5
|
+
import { tryGitInit } from './git.js';
|
|
6
|
+
import { flagOrDefault, shouldPrompt, writeStagingEnvIfNeeded } from './initHelpers.js';
|
|
7
|
+
import { resolvePackageManager } from './resolvePackageManager.js';
|
|
8
|
+
import templates from './templates/index.js';
|
|
9
|
+
async function promptForTemplate(params) {
|
|
10
|
+
const defaultTemplate = params.unattended || params.template ? params.template || 'clean' : null;
|
|
11
|
+
if (defaultTemplate) {
|
|
12
|
+
return defaultTemplate;
|
|
13
|
+
}
|
|
14
|
+
return select({
|
|
15
|
+
choices: [
|
|
16
|
+
{
|
|
17
|
+
name: 'Clean project with no predefined schema types',
|
|
18
|
+
value: 'clean'
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'Blog (schema)',
|
|
22
|
+
value: 'blog'
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'E-commerce (Shopify)',
|
|
26
|
+
value: 'shopify'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'Movie project (schema + sample data)',
|
|
30
|
+
value: 'moviedb'
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
message: 'Select project template'
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export async function selectTemplate({ options, remoteTemplateInfo, trace }) {
|
|
37
|
+
const { template, typescript, unattended } = options;
|
|
38
|
+
const templateName = await promptForTemplate({
|
|
39
|
+
template,
|
|
40
|
+
unattended
|
|
41
|
+
});
|
|
42
|
+
trace.log({
|
|
43
|
+
selectedOption: templateName,
|
|
44
|
+
step: 'selectProjectTemplate'
|
|
45
|
+
});
|
|
46
|
+
const resolvedTemplate = templates[templateName];
|
|
47
|
+
let useTypeScript = flagOrDefault(typescript, true);
|
|
48
|
+
if (!remoteTemplateInfo && resolvedTemplate && resolvedTemplate.typescriptOnly === true) {
|
|
49
|
+
useTypeScript = true;
|
|
50
|
+
} else if (shouldPrompt(unattended, typescript)) {
|
|
51
|
+
useTypeScript = await promptForTypeScript();
|
|
52
|
+
trace.log({
|
|
53
|
+
selectedOption: useTypeScript ? 'yes' : 'no',
|
|
54
|
+
step: 'useTypeScript'
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
template: resolvedTemplate,
|
|
59
|
+
templateName,
|
|
60
|
+
useTypeScript
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export async function scaffoldAndInstall({ datasetName, defaults, displayName, options, organizationId, output, outputPath, projectId, remoteTemplateInfo, sluggedName, templateName, trace, useTypeScript, workDir }) {
|
|
64
|
+
const { autoUpdates, git, overwriteFiles, packageManager, templateToken, unattended } = options;
|
|
65
|
+
const noGit = typeof git === 'boolean' && !git ? true : undefined;
|
|
66
|
+
await bootstrapTemplate({
|
|
67
|
+
autoUpdates,
|
|
68
|
+
bearerToken: templateToken,
|
|
69
|
+
dataset: datasetName,
|
|
70
|
+
organizationId,
|
|
71
|
+
output,
|
|
72
|
+
outputPath,
|
|
73
|
+
overwriteFiles,
|
|
74
|
+
packageName: sluggedName,
|
|
75
|
+
projectId,
|
|
76
|
+
projectName: displayName || defaults.projectName,
|
|
77
|
+
remoteTemplateInfo,
|
|
78
|
+
templateName,
|
|
79
|
+
useTypeScript
|
|
80
|
+
});
|
|
81
|
+
const pkgManager = await resolvePackageManager({
|
|
82
|
+
interactive: !unattended,
|
|
83
|
+
output,
|
|
84
|
+
packageManager: packageManager,
|
|
85
|
+
targetDir: outputPath
|
|
86
|
+
});
|
|
87
|
+
trace.log({
|
|
88
|
+
selectedOption: pkgManager,
|
|
89
|
+
step: 'selectPackageManager'
|
|
90
|
+
});
|
|
91
|
+
// Now for the slow part... installing dependencies
|
|
92
|
+
await installDeclaredPackages(outputPath, pkgManager, {
|
|
93
|
+
output,
|
|
94
|
+
workDir
|
|
95
|
+
});
|
|
96
|
+
const useGit = !noGit && (git === undefined || Boolean(git));
|
|
97
|
+
const commitMessage = git;
|
|
98
|
+
await writeStagingEnvIfNeeded(output, outputPath);
|
|
99
|
+
// Try initializing a git repository
|
|
100
|
+
if (useGit) {
|
|
101
|
+
tryGitInit(outputPath, typeof commitMessage === 'string' ? commitMessage : undefined);
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
pkgManager
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
//# sourceMappingURL=scaffoldTemplate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/init/scaffoldTemplate.ts"],"sourcesContent":["import {type Output, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {select} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {promptForTypeScript} from '../../prompts/init/promptForTypescript.js'\nimport {type InitStepResult} from '../../telemetry/init.telemetry.js'\nimport {installDeclaredPackages} from '../../util/packageManager/installPackages.js'\nimport {type PackageManager} from '../../util/packageManager/packageManagerChoice.js'\nimport {bootstrapTemplate} from './bootstrapTemplate.js'\nimport {tryGitInit} from './git.js'\nimport {flagOrDefault, shouldPrompt, writeStagingEnvIfNeeded} from './initHelpers.js'\nimport {type RepoInfo} from './remoteTemplate.js'\nimport {resolvePackageManager} from './resolvePackageManager.js'\nimport templates from './templates/index.js'\nimport {type InitOptions, type ProjectTemplate} from './types.js'\n\ninterface SelectedTemplate {\n template: ProjectTemplate | undefined\n templateName: string\n useTypeScript: boolean\n}\n\nasync function promptForTemplate(params: {\n template?: string\n unattended: boolean\n}): Promise<string> {\n const defaultTemplate = params.unattended || params.template ? params.template || 'clean' : null\n if (defaultTemplate) {\n return defaultTemplate\n }\n\n return select({\n choices: [\n {\n name: 'Clean project with no predefined schema types',\n value: 'clean',\n },\n {\n name: 'Blog (schema)',\n value: 'blog',\n },\n {\n name: 'E-commerce (Shopify)',\n value: 'shopify',\n },\n {\n name: 'Movie project (schema + sample data)',\n value: 'moviedb',\n },\n ],\n message: 'Select project template',\n })\n}\n\nexport async function selectTemplate({\n options,\n remoteTemplateInfo,\n trace,\n}: {\n options: InitOptions\n remoteTemplateInfo: RepoInfo | undefined\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n}): Promise<SelectedTemplate> {\n const {template, typescript, unattended} = options\n const templateName = await promptForTemplate({template, unattended})\n trace.log({\n selectedOption: templateName,\n step: 'selectProjectTemplate',\n })\n\n const resolvedTemplate = templates[templateName]\n\n let useTypeScript = flagOrDefault(typescript, true)\n if (!remoteTemplateInfo && resolvedTemplate && resolvedTemplate.typescriptOnly === true) {\n useTypeScript = true\n } else if (shouldPrompt(unattended, typescript)) {\n useTypeScript = await promptForTypeScript()\n trace.log({\n selectedOption: useTypeScript ? 'yes' : 'no',\n step: 'useTypeScript',\n })\n }\n\n return {\n template: resolvedTemplate,\n templateName,\n useTypeScript,\n }\n}\n\nexport async function scaffoldAndInstall({\n datasetName,\n defaults,\n displayName,\n options,\n organizationId,\n output,\n outputPath,\n projectId,\n remoteTemplateInfo,\n sluggedName,\n templateName,\n trace,\n useTypeScript,\n workDir,\n}: {\n datasetName: string\n defaults: {projectName: string}\n displayName: string\n options: InitOptions\n organizationId: string | undefined\n output: Output\n outputPath: string\n projectId: string\n remoteTemplateInfo: RepoInfo | undefined\n sluggedName: string\n templateName: string\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n useTypeScript: boolean\n workDir: string\n}): Promise<{pkgManager: PackageManager}> {\n const {autoUpdates, git, overwriteFiles, packageManager, templateToken, unattended} = options\n const noGit = typeof git === 'boolean' && !git ? true : undefined\n\n await bootstrapTemplate({\n autoUpdates,\n bearerToken: templateToken,\n dataset: datasetName,\n organizationId,\n output,\n outputPath,\n overwriteFiles,\n packageName: sluggedName,\n projectId,\n projectName: displayName || defaults.projectName,\n remoteTemplateInfo,\n templateName,\n useTypeScript,\n })\n\n const pkgManager = await resolvePackageManager({\n interactive: !unattended,\n output,\n packageManager: packageManager as PackageManager,\n targetDir: outputPath,\n })\n\n trace.log({\n selectedOption: pkgManager,\n step: 'selectPackageManager',\n })\n\n // Now for the slow part... installing dependencies\n await installDeclaredPackages(outputPath, pkgManager, {\n output,\n workDir,\n })\n\n const useGit = !noGit && (git === undefined || Boolean(git))\n const commitMessage = git\n await writeStagingEnvIfNeeded(output, outputPath)\n\n // Try initializing a git repository\n if (useGit) {\n tryGitInit(outputPath, typeof commitMessage === 'string' ? commitMessage : undefined)\n }\n\n return {pkgManager}\n}\n"],"names":["select","promptForTypeScript","installDeclaredPackages","bootstrapTemplate","tryGitInit","flagOrDefault","shouldPrompt","writeStagingEnvIfNeeded","resolvePackageManager","templates","promptForTemplate","params","defaultTemplate","unattended","template","choices","name","value","message","selectTemplate","options","remoteTemplateInfo","trace","typescript","templateName","log","selectedOption","step","resolvedTemplate","useTypeScript","typescriptOnly","scaffoldAndInstall","datasetName","defaults","displayName","organizationId","output","outputPath","projectId","sluggedName","workDir","autoUpdates","git","overwriteFiles","packageManager","templateToken","noGit","undefined","bearerToken","dataset","packageName","projectName","pkgManager","interactive","targetDir","useGit","Boolean","commitMessage"],"mappings":"AACA,SAAQA,MAAM,QAAO,sBAAqB;AAG1C,SAAQC,mBAAmB,QAAO,4CAA2C;AAE7E,SAAQC,uBAAuB,QAAO,+CAA8C;AAEpF,SAAQC,iBAAiB,QAAO,yBAAwB;AACxD,SAAQC,UAAU,QAAO,WAAU;AACnC,SAAQC,aAAa,EAAEC,YAAY,EAAEC,uBAAuB,QAAO,mBAAkB;AAErF,SAAQC,qBAAqB,QAAO,6BAA4B;AAChE,OAAOC,eAAe,uBAAsB;AAS5C,eAAeC,kBAAkBC,MAGhC;IACC,MAAMC,kBAAkBD,OAAOE,UAAU,IAAIF,OAAOG,QAAQ,GAAGH,OAAOG,QAAQ,IAAI,UAAU;IAC5F,IAAIF,iBAAiB;QACnB,OAAOA;IACT;IAEA,OAAOZ,OAAO;QACZe,SAAS;YACP;gBACEC,MAAM;gBACNC,OAAO;YACT;YACA;gBACED,MAAM;gBACNC,OAAO;YACT;YACA;gBACED,MAAM;gBACNC,OAAO;YACT;YACA;gBACED,MAAM;gBACNC,OAAO;YACT;SACD;QACDC,SAAS;IACX;AACF;AAEA,OAAO,eAAeC,eAAe,EACnCC,OAAO,EACPC,kBAAkB,EAClBC,KAAK,EAKN;IACC,MAAM,EAACR,QAAQ,EAAES,UAAU,EAAEV,UAAU,EAAC,GAAGO;IAC3C,MAAMI,eAAe,MAAMd,kBAAkB;QAACI;QAAUD;IAAU;IAClES,MAAMG,GAAG,CAAC;QACRC,gBAAgBF;QAChBG,MAAM;IACR;IAEA,MAAMC,mBAAmBnB,SAAS,CAACe,aAAa;IAEhD,IAAIK,gBAAgBxB,cAAckB,YAAY;IAC9C,IAAI,CAACF,sBAAsBO,oBAAoBA,iBAAiBE,cAAc,KAAK,MAAM;QACvFD,gBAAgB;IAClB,OAAO,IAAIvB,aAAaO,YAAYU,aAAa;QAC/CM,gBAAgB,MAAM5B;QACtBqB,MAAMG,GAAG,CAAC;YACRC,gBAAgBG,gBAAgB,QAAQ;YACxCF,MAAM;QACR;IACF;IAEA,OAAO;QACLb,UAAUc;QACVJ;QACAK;IACF;AACF;AAEA,OAAO,eAAeE,mBAAmB,EACvCC,WAAW,EACXC,QAAQ,EACRC,WAAW,EACXd,OAAO,EACPe,cAAc,EACdC,MAAM,EACNC,UAAU,EACVC,SAAS,EACTjB,kBAAkB,EAClBkB,WAAW,EACXf,YAAY,EACZF,KAAK,EACLO,aAAa,EACbW,OAAO,EAgBR;IACC,MAAM,EAACC,WAAW,EAAEC,GAAG,EAAEC,cAAc,EAAEC,cAAc,EAAEC,aAAa,EAAEhC,UAAU,EAAC,GAAGO;IACtF,MAAM0B,QAAQ,OAAOJ,QAAQ,aAAa,CAACA,MAAM,OAAOK;IAExD,MAAM5C,kBAAkB;QACtBsC;QACAO,aAAaH;QACbI,SAASjB;QACTG;QACAC;QACAC;QACAM;QACAO,aAAaX;QACbD;QACAa,aAAajB,eAAeD,SAASkB,WAAW;QAChD9B;QACAG;QACAK;IACF;IAEA,MAAMuB,aAAa,MAAM5C,sBAAsB;QAC7C6C,aAAa,CAACxC;QACduB;QACAQ,gBAAgBA;QAChBU,WAAWjB;IACb;IAEAf,MAAMG,GAAG,CAAC;QACRC,gBAAgB0B;QAChBzB,MAAM;IACR;IAEA,mDAAmD;IACnD,MAAMzB,wBAAwBmC,YAAYe,YAAY;QACpDhB;QACAI;IACF;IAEA,MAAMe,SAAS,CAACT,SAAUJ,CAAAA,QAAQK,aAAaS,QAAQd,IAAG;IAC1D,MAAMe,gBAAgBf;IACtB,MAAMnC,wBAAwB6B,QAAQC;IAEtC,oCAAoC;IACpC,IAAIkB,QAAQ;QACVnD,WAAWiC,YAAY,OAAOoB,kBAAkB,WAAWA,gBAAgBV;IAC7E;IAEA,OAAO;QAACK;IAAU;AACpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/actions/init/templates/appQuickstart.ts"],"sourcesContent":["import {type ProjectTemplate} from '../types.js'\n\nconst appTemplate: ProjectTemplate = {\n entry: './src/App.tsx',\n type: 'module',\n}\n\nexport default appTemplate\n"],"names":["appTemplate","entry","type"],"mappings":"AAEA,MAAMA,cAA+B;IACnCC,OAAO;IACPC,MAAM;
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/templates/appQuickstart.ts"],"sourcesContent":["import {type ProjectTemplate} from '../types.js'\n\nconst appTemplate: ProjectTemplate = {\n entry: './src/App.tsx',\n type: 'module',\n typescriptOnly: true,\n}\n\nexport default appTemplate\n"],"names":["appTemplate","entry","type","typescriptOnly"],"mappings":"AAEA,MAAMA,cAA+B;IACnCC,OAAO;IACPC,MAAM;IACNC,gBAAgB;AAClB;AAEA,eAAeH,YAAW"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/actions/init/templates/appSanityUi.ts"],"sourcesContent":["import {type ProjectTemplate} from '../types.js'\n\nconst appSanityUiTemplate: ProjectTemplate = {\n dependencies: {\n '@sanity/ui': '^3',\n 'styled-components': '^6.1.18',\n },\n entry: './src/App.tsx',\n type: 'module',\n}\n\nexport default appSanityUiTemplate\n"],"names":["appSanityUiTemplate","dependencies","entry","type"],"mappings":"AAEA,MAAMA,sBAAuC;IAC3CC,cAAc;QACZ,cAAc;QACd,qBAAqB;IACvB;IACAC,OAAO;IACPC,MAAM;
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/templates/appSanityUi.ts"],"sourcesContent":["import {type ProjectTemplate} from '../types.js'\n\nconst appSanityUiTemplate: ProjectTemplate = {\n dependencies: {\n '@sanity/ui': '^3',\n 'styled-components': '^6.1.18',\n },\n entry: './src/App.tsx',\n type: 'module',\n typescriptOnly: true,\n}\n\nexport default appSanityUiTemplate\n"],"names":["appSanityUiTemplate","dependencies","entry","type","typescriptOnly"],"mappings":"AAEA,MAAMA,sBAAuC;IAC3CC,cAAc;QACZ,cAAc;QACd,qBAAqB;IACvB;IACAC,OAAO;IACPC,MAAM;IACNC,gBAAgB;AAClB;AAEA,eAAeJ,oBAAmB"}
|
|
@@ -56,14 +56,14 @@ export default defineConfig({
|
|
|
56
56
|
const shopifyTemplate = {
|
|
57
57
|
configTemplate,
|
|
58
58
|
dependencies: {
|
|
59
|
-
'@sanity/asset-utils': '^
|
|
60
|
-
'@sanity/color-input': '^
|
|
61
|
-
'@sanity/icons': '^
|
|
62
|
-
'@sanity/ui': '^
|
|
59
|
+
'@sanity/asset-utils': '^2.3.0',
|
|
60
|
+
'@sanity/color-input': '^6.0.4',
|
|
61
|
+
'@sanity/icons': '^3.7.4',
|
|
62
|
+
'@sanity/ui': '^3.1.14',
|
|
63
63
|
'lodash.get': '^4.4.2',
|
|
64
64
|
'pluralize-esm': '^9.0.2',
|
|
65
|
-
'sanity-plugin-hotspot-array': '^
|
|
66
|
-
'sanity-plugin-media': '^
|
|
65
|
+
'sanity-plugin-hotspot-array': '^3.0.2',
|
|
66
|
+
'sanity-plugin-media': '^4.1.1',
|
|
67
67
|
slug: '^8.2.2'
|
|
68
68
|
},
|
|
69
69
|
devDependencies: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/actions/init/templates/shopify.ts"],"sourcesContent":["import {type ProjectTemplate} from '../types.js'\n\nconst configTemplate = `\nimport {defineConfig, isDev} from 'sanity'\n\nimport {structureTool} from 'sanity/structure'\nimport {schemaTypes} from './schemaTypes'\nimport {structure} from './structure'\n\nimport {visionTool} from '@sanity/vision'\nimport {colorInput} from '@sanity/color-input'\nimport {imageHotspotArrayPlugin} from 'sanity-plugin-hotspot-array'\nimport {media, mediaAssetSource} from 'sanity-plugin-media'\nimport {customDocumentActions} from './plugins/customDocumentActions'\nimport Navbar from './components/studio/Navbar'\n\nconst devOnlyPlugins = [visionTool()]\n\nexport default defineConfig({\n name: '%sourceName%',\n title: '%projectName%',\n\n projectId: '%projectId%',\n dataset: '%dataset%',\n\n plugins: [\n structureTool({structure}),\n colorInput(),\n imageHotspotArrayPlugin(),\n customDocumentActions(),\n media(),\n ...(isDev ? devOnlyPlugins : []),\n ],\n\n schema: {\n types: schemaTypes,\n },\n\n form: {\n file: {\n assetSources: (previousAssetSources) => {\n return previousAssetSources.filter((assetSource) => assetSource !== mediaAssetSource)\n },\n },\n image: {\n assetSources: (previousAssetSources) => {\n return previousAssetSources.filter((assetSource) => assetSource === mediaAssetSource)\n },\n },\n },\n\n studio: {\n components: {\n navbar: Navbar,\n },\n },\n})`\n\nconst shopifyTemplate: ProjectTemplate = {\n configTemplate,\n dependencies: {\n '@sanity/asset-utils': '^
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/templates/shopify.ts"],"sourcesContent":["import {type ProjectTemplate} from '../types.js'\n\nconst configTemplate = `\nimport {defineConfig, isDev} from 'sanity'\n\nimport {structureTool} from 'sanity/structure'\nimport {schemaTypes} from './schemaTypes'\nimport {structure} from './structure'\n\nimport {visionTool} from '@sanity/vision'\nimport {colorInput} from '@sanity/color-input'\nimport {imageHotspotArrayPlugin} from 'sanity-plugin-hotspot-array'\nimport {media, mediaAssetSource} from 'sanity-plugin-media'\nimport {customDocumentActions} from './plugins/customDocumentActions'\nimport Navbar from './components/studio/Navbar'\n\nconst devOnlyPlugins = [visionTool()]\n\nexport default defineConfig({\n name: '%sourceName%',\n title: '%projectName%',\n\n projectId: '%projectId%',\n dataset: '%dataset%',\n\n plugins: [\n structureTool({structure}),\n colorInput(),\n imageHotspotArrayPlugin(),\n customDocumentActions(),\n media(),\n ...(isDev ? devOnlyPlugins : []),\n ],\n\n schema: {\n types: schemaTypes,\n },\n\n form: {\n file: {\n assetSources: (previousAssetSources) => {\n return previousAssetSources.filter((assetSource) => assetSource !== mediaAssetSource)\n },\n },\n image: {\n assetSources: (previousAssetSources) => {\n return previousAssetSources.filter((assetSource) => assetSource === mediaAssetSource)\n },\n },\n },\n\n studio: {\n components: {\n navbar: Navbar,\n },\n },\n})`\n\nconst shopifyTemplate: ProjectTemplate = {\n configTemplate,\n dependencies: {\n '@sanity/asset-utils': '^2.3.0',\n '@sanity/color-input': '^6.0.4',\n '@sanity/icons': '^3.7.4',\n '@sanity/ui': '^3.1.14',\n 'lodash.get': '^4.4.2',\n 'pluralize-esm': '^9.0.2',\n 'sanity-plugin-hotspot-array': '^3.0.2',\n 'sanity-plugin-media': '^4.1.1',\n slug: '^8.2.2',\n },\n devDependencies: {\n '@portabletext/types': '^2.0.2',\n '@types/lodash.get': '^4.4.7',\n '@types/slug': '^5.0.3',\n },\n}\nexport default shopifyTemplate\n"],"names":["configTemplate","shopifyTemplate","dependencies","slug","devDependencies"],"mappings":"AAEA,MAAMA,iBAAiB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsDtB,CAAC;AAEH,MAAMC,kBAAmC;IACvCD;IACAE,cAAc;QACZ,uBAAuB;QACvB,uBAAuB;QACvB,iBAAiB;QACjB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,+BAA+B;QAC/B,uBAAuB;QACvBC,MAAM;IACR;IACAC,iBAAiB;QACf,uBAAuB;QACvB,qBAAqB;QACrB,eAAe;IACjB;AACF;AACA,eAAeH,gBAAe"}
|
|
@@ -35,8 +35,8 @@ const shopifyTemplate = {
|
|
|
35
35
|
configTemplate,
|
|
36
36
|
dependencies: {
|
|
37
37
|
'@portabletext/toolkit': '^2.0.1',
|
|
38
|
-
'@sanity/icons': '^
|
|
39
|
-
'@sanity/ui': '^
|
|
38
|
+
'@sanity/icons': '^3.7.4',
|
|
39
|
+
'@sanity/ui': '^3.1.14',
|
|
40
40
|
'@types/lodash.get': '^4.4.7',
|
|
41
41
|
'lodash.get': '^4.4.2',
|
|
42
42
|
'pluralize-esm': '^9.0.4',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/actions/init/templates/shopifyOnline.ts"],"sourcesContent":["import {type ProjectTemplate} from '../types.js'\n\nconst configTemplate = `\nimport {shopifyAssets} from 'sanity-plugin-shopify-assets'\nimport {defineConfig, isDev} from 'sanity'\nimport {structureTool} from 'sanity/structure'\nimport {visionTool} from '@sanity/vision'\nimport {shopifyDocumentActions} from './plugins/shopifyDocumentActions'\nimport {schemaTypes} from './schemaTypes'\nimport {structure} from './structure'\nimport {SHOPIFY_STORE_ID} from './constants'\n\nconst devOnlyPlugins = [visionTool()]\n\nexport default defineConfig({\n name: '%sourceName%',\n title: '%projectName%',\n\n projectId: '%projectId%',\n dataset: '%dataset%',\n\n plugins: [\n structureTool({structure}),\n shopifyDocumentActions(),\n shopifyAssets({\n shopifyDomain: SHOPIFY_STORE_ID,\n }),\n ...(isDev ? devOnlyPlugins : []),\n ],\n\n schema: {\n types: schemaTypes,\n },\n})\n`\n\nconst shopifyTemplate: ProjectTemplate = {\n configTemplate,\n dependencies: {\n '@portabletext/toolkit': '^2.0.1',\n '@sanity/icons': '^
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/templates/shopifyOnline.ts"],"sourcesContent":["import {type ProjectTemplate} from '../types.js'\n\nconst configTemplate = `\nimport {shopifyAssets} from 'sanity-plugin-shopify-assets'\nimport {defineConfig, isDev} from 'sanity'\nimport {structureTool} from 'sanity/structure'\nimport {visionTool} from '@sanity/vision'\nimport {shopifyDocumentActions} from './plugins/shopifyDocumentActions'\nimport {schemaTypes} from './schemaTypes'\nimport {structure} from './structure'\nimport {SHOPIFY_STORE_ID} from './constants'\n\nconst devOnlyPlugins = [visionTool()]\n\nexport default defineConfig({\n name: '%sourceName%',\n title: '%projectName%',\n\n projectId: '%projectId%',\n dataset: '%dataset%',\n\n plugins: [\n structureTool({structure}),\n shopifyDocumentActions(),\n shopifyAssets({\n shopifyDomain: SHOPIFY_STORE_ID,\n }),\n ...(isDev ? devOnlyPlugins : []),\n ],\n\n schema: {\n types: schemaTypes,\n },\n})\n`\n\nconst shopifyTemplate: ProjectTemplate = {\n configTemplate,\n dependencies: {\n '@portabletext/toolkit': '^2.0.1',\n '@sanity/icons': '^3.7.4',\n '@sanity/ui': '^3.1.14',\n '@types/lodash.get': '^4.4.7',\n 'lodash.get': '^4.4.2',\n 'pluralize-esm': '^9.0.4',\n 'sanity-plugin-shopify-assets': '^1.1.0',\n },\n typescriptOnly: true,\n}\nexport default shopifyTemplate\n"],"names":["configTemplate","shopifyTemplate","dependencies","typescriptOnly"],"mappings":"AAEA,MAAMA,iBAAiB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCxB,CAAC;AAED,MAAMC,kBAAmC;IACvCD;IACAE,cAAc;QACZ,yBAAyB;QACzB,iBAAiB;QACjB,cAAc;QACd,qBAAqB;QACrB,cAAc;QACd,iBAAiB;QACjB,gCAAgC;IAClC;IACAC,gBAAgB;AAClB;AACA,eAAeF,gBAAe"}
|
|
@@ -1,3 +1,49 @@
|
|
|
1
|
-
|
|
1
|
+
const VALID_PACKAGE_MANAGERS = new Set([
|
|
2
|
+
'npm',
|
|
3
|
+
'pnpm',
|
|
4
|
+
'yarn'
|
|
5
|
+
]);
|
|
6
|
+
function narrowPackageManager(value) {
|
|
7
|
+
return value !== undefined && VALID_PACKAGE_MANAGERS.has(value) ? value : undefined;
|
|
8
|
+
}
|
|
9
|
+
const VALID_VISIBILITIES = new Set([
|
|
10
|
+
'private',
|
|
11
|
+
'public'
|
|
12
|
+
]);
|
|
13
|
+
function narrowVisibility(value) {
|
|
14
|
+
return value !== undefined && VALID_VISIBILITIES.has(value) ? value : undefined;
|
|
15
|
+
}
|
|
16
|
+
export function flagsToInitOptions(flags, isUnattended, args, mcpMode) {
|
|
17
|
+
return {
|
|
18
|
+
argType: args?.type,
|
|
19
|
+
autoUpdates: flags['auto-updates'],
|
|
20
|
+
bare: flags.bare,
|
|
21
|
+
coupon: flags.coupon,
|
|
22
|
+
dataset: flags.dataset,
|
|
23
|
+
datasetDefault: flags['dataset-default'],
|
|
24
|
+
env: flags.env,
|
|
25
|
+
fromCreate: flags['from-create'],
|
|
26
|
+
git: flags['no-git'] ? false : flags.git,
|
|
27
|
+
importDataset: flags['import-dataset'],
|
|
28
|
+
mcpMode,
|
|
29
|
+
nextjsAddConfigFiles: flags['nextjs-add-config-files'],
|
|
30
|
+
nextjsAppendEnv: flags['nextjs-append-env'],
|
|
31
|
+
nextjsEmbedStudio: flags['nextjs-embed-studio'],
|
|
32
|
+
organization: flags.organization,
|
|
33
|
+
outputPath: flags['output-path'],
|
|
34
|
+
overwriteFiles: flags['overwrite-files'],
|
|
35
|
+
packageManager: narrowPackageManager(flags['package-manager']),
|
|
36
|
+
project: flags.project,
|
|
37
|
+
projectName: flags['project-name'] ?? flags['create-project'],
|
|
38
|
+
projectPlan: flags['project-plan'],
|
|
39
|
+
provider: flags.provider,
|
|
40
|
+
reconfigure: flags.reconfigure,
|
|
41
|
+
template: flags.template,
|
|
42
|
+
templateToken: flags['template-token'],
|
|
43
|
+
typescript: flags.typescript,
|
|
44
|
+
unattended: isUnattended,
|
|
45
|
+
visibility: narrowVisibility(flags.visibility)
|
|
46
|
+
};
|
|
47
|
+
}
|
|
2
48
|
|
|
3
49
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/init/types.ts"],"sourcesContent":["import {Framework} from '@vercel/frameworks'\n\nimport {GenerateConfigOptions} from './createStudioConfig'\n\nexport type VersionedFramework = Framework & {\n detectedVersion?: string\n}\n\nexport interface ProjectTemplate {\n configTemplate?: ((variables: GenerateConfigOptions['variables']) => string) | string\n datasetUrl?: string\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n entry?: string\n importPrompt?: string\n scripts?: Record<string, string>\n type?: 'commonjs' | 'module'\n typescriptOnly?: boolean\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/init/types.ts"],"sourcesContent":["import {type CLITelemetryStore, type Output} from '@sanity/cli-core'\nimport {type Framework} from '@vercel/frameworks'\n\nimport {type GenerateConfigOptions} from './createStudioConfig.js'\n\nexport type VersionedFramework = Framework & {\n detectedVersion?: string\n}\n\nexport interface ProjectTemplate {\n configTemplate?: ((variables: GenerateConfigOptions['variables']) => string) | string\n datasetUrl?: string\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n entry?: string\n importPrompt?: string\n scripts?: Record<string, string>\n type?: 'commonjs' | 'module'\n typescriptOnly?: boolean\n}\n\nexport interface InitOptions {\n autoUpdates: boolean\n bare: boolean\n datasetDefault: boolean\n fromCreate: boolean\n mcpMode: 'auto' | 'prompt' | 'skip'\n unattended: boolean\n\n argType?: string\n coupon?: string\n dataset?: string\n env?: string\n git?: boolean | string\n importDataset?: boolean\n nextjsAddConfigFiles?: boolean\n nextjsAppendEnv?: boolean\n nextjsEmbedStudio?: boolean\n organization?: string\n outputPath?: string\n overwriteFiles?: boolean\n packageManager?: 'npm' | 'pnpm' | 'yarn'\n project?: string\n projectName?: string\n projectPlan?: string\n provider?: string\n reconfigure?: boolean\n template?: string\n templateToken?: string\n typescript?: boolean\n visibility?: 'private' | 'public'\n}\n\nexport interface InitContext {\n output: Output\n telemetry: CLITelemetryStore\n workDir: string\n}\n\ninterface InitCommandFlags {\n 'auto-updates': boolean\n bare: boolean\n 'dataset-default': boolean\n 'from-create': boolean\n mcp: boolean\n 'no-git': boolean\n\n coupon?: string\n 'create-project'?: string\n dataset?: string\n env?: string\n git?: string\n 'import-dataset'?: boolean\n 'nextjs-add-config-files'?: boolean\n 'nextjs-append-env'?: boolean\n 'nextjs-embed-studio'?: boolean\n organization?: string\n 'output-path'?: string\n 'overwrite-files'?: boolean\n 'package-manager'?: string\n project?: string\n 'project-name'?: string\n 'project-plan'?: string\n provider?: string\n reconfigure?: boolean\n template?: string\n 'template-token'?: string\n typescript?: boolean\n visibility?: string\n}\n\ninterface InitCommandArgs {\n type?: string\n}\n\nconst VALID_PACKAGE_MANAGERS = new Set<string>(['npm', 'pnpm', 'yarn'])\nfunction narrowPackageManager(value: string | undefined): InitOptions['packageManager'] {\n return value !== undefined && VALID_PACKAGE_MANAGERS.has(value)\n ? (value as InitOptions['packageManager'])\n : undefined\n}\n\nconst VALID_VISIBILITIES = new Set<string>(['private', 'public'])\nfunction narrowVisibility(value: string | undefined): InitOptions['visibility'] {\n return value !== undefined && VALID_VISIBILITIES.has(value)\n ? (value as InitOptions['visibility'])\n : undefined\n}\n\nexport function flagsToInitOptions(\n flags: InitCommandFlags,\n isUnattended: boolean,\n args: InitCommandArgs | undefined,\n mcpMode: InitOptions['mcpMode'],\n): InitOptions {\n return {\n argType: args?.type,\n autoUpdates: flags['auto-updates'],\n bare: flags.bare,\n coupon: flags.coupon,\n dataset: flags.dataset,\n datasetDefault: flags['dataset-default'],\n env: flags.env,\n fromCreate: flags['from-create'],\n git: flags['no-git'] ? false : flags.git,\n importDataset: flags['import-dataset'],\n mcpMode,\n nextjsAddConfigFiles: flags['nextjs-add-config-files'],\n nextjsAppendEnv: flags['nextjs-append-env'],\n nextjsEmbedStudio: flags['nextjs-embed-studio'],\n organization: flags.organization,\n outputPath: flags['output-path'],\n overwriteFiles: flags['overwrite-files'],\n packageManager: narrowPackageManager(flags['package-manager']),\n project: flags.project,\n projectName: flags['project-name'] ?? flags['create-project'],\n projectPlan: flags['project-plan'],\n provider: flags.provider,\n reconfigure: flags.reconfigure,\n template: flags.template,\n templateToken: flags['template-token'],\n typescript: flags.typescript,\n unattended: isUnattended,\n visibility: narrowVisibility(flags.visibility),\n }\n}\n"],"names":["VALID_PACKAGE_MANAGERS","Set","narrowPackageManager","value","undefined","has","VALID_VISIBILITIES","narrowVisibility","flagsToInitOptions","flags","isUnattended","args","mcpMode","argType","type","autoUpdates","bare","coupon","dataset","datasetDefault","env","fromCreate","git","importDataset","nextjsAddConfigFiles","nextjsAppendEnv","nextjsEmbedStudio","organization","outputPath","overwriteFiles","packageManager","project","projectName","projectPlan","provider","reconfigure","template","templateToken","typescript","unattended","visibility"],"mappings":"AA+FA,MAAMA,yBAAyB,IAAIC,IAAY;IAAC;IAAO;IAAQ;CAAO;AACtE,SAASC,qBAAqBC,KAAyB;IACrD,OAAOA,UAAUC,aAAaJ,uBAAuBK,GAAG,CAACF,SACpDA,QACDC;AACN;AAEA,MAAME,qBAAqB,IAAIL,IAAY;IAAC;IAAW;CAAS;AAChE,SAASM,iBAAiBJ,KAAyB;IACjD,OAAOA,UAAUC,aAAaE,mBAAmBD,GAAG,CAACF,SAChDA,QACDC;AACN;AAEA,OAAO,SAASI,mBACdC,KAAuB,EACvBC,YAAqB,EACrBC,IAAiC,EACjCC,OAA+B;IAE/B,OAAO;QACLC,SAASF,MAAMG;QACfC,aAAaN,KAAK,CAAC,eAAe;QAClCO,MAAMP,MAAMO,IAAI;QAChBC,QAAQR,MAAMQ,MAAM;QACpBC,SAAST,MAAMS,OAAO;QACtBC,gBAAgBV,KAAK,CAAC,kBAAkB;QACxCW,KAAKX,MAAMW,GAAG;QACdC,YAAYZ,KAAK,CAAC,cAAc;QAChCa,KAAKb,KAAK,CAAC,SAAS,GAAG,QAAQA,MAAMa,GAAG;QACxCC,eAAed,KAAK,CAAC,iBAAiB;QACtCG;QACAY,sBAAsBf,KAAK,CAAC,0BAA0B;QACtDgB,iBAAiBhB,KAAK,CAAC,oBAAoB;QAC3CiB,mBAAmBjB,KAAK,CAAC,sBAAsB;QAC/CkB,cAAclB,MAAMkB,YAAY;QAChCC,YAAYnB,KAAK,CAAC,cAAc;QAChCoB,gBAAgBpB,KAAK,CAAC,kBAAkB;QACxCqB,gBAAgB5B,qBAAqBO,KAAK,CAAC,kBAAkB;QAC7DsB,SAAStB,MAAMsB,OAAO;QACtBC,aAAavB,KAAK,CAAC,eAAe,IAAIA,KAAK,CAAC,iBAAiB;QAC7DwB,aAAaxB,KAAK,CAAC,eAAe;QAClCyB,UAAUzB,MAAMyB,QAAQ;QACxBC,aAAa1B,MAAM0B,WAAW;QAC9BC,UAAU3B,MAAM2B,QAAQ;QACxBC,eAAe5B,KAAK,CAAC,iBAAiB;QACtC6B,YAAY7B,MAAM6B,UAAU;QAC5BC,YAAY7B;QACZ8B,YAAYjC,iBAAiBE,MAAM+B,UAAU;IAC/C;AACF"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod/mini';
|
|
2
2
|
export const SANITY_WORKSPACE_SCHEMA_ID_PREFIX = '_.schemas';
|
|
3
|
-
export const SANITY_WORKSPACE_SCHEMA_TYPE = 'system.schema';
|
|
4
3
|
export const CURRENT_WORKSPACE_SCHEMA_VERSION = '2025-05-01';
|
|
5
4
|
export const extractManifestWorkerData = z.object({
|
|
6
5
|
configPath: z.string(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/manifest/types.ts"],"sourcesContent":["import {type SanityDocumentLike} from '@sanity/types'\nimport {type MediaLibraryConfig} from 'sanity'\nimport {z} from 'zod/mini'\n\nexport const SANITY_WORKSPACE_SCHEMA_ID_PREFIX = '_.schemas'\nexport const
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/manifest/types.ts"],"sourcesContent":["import {type SanityDocumentLike} from '@sanity/types'\nimport {type MediaLibraryConfig} from 'sanity'\nimport {z} from 'zod/mini'\n\nexport const SANITY_WORKSPACE_SCHEMA_ID_PREFIX = '_.schemas'\nexport const CURRENT_WORKSPACE_SCHEMA_VERSION = '2025-05-01'\n\nexport type ManifestSerializable =\n | boolean\n | ManifestSerializable[]\n | number\n | string\n | {[k: string]: ManifestSerializable}\n\nexport interface CreateManifest {\n createdAt: string\n studioVersion: string | null\n version: number\n workspaces: ManifestWorkspaceFile[]\n}\n\nexport interface AppManifest {\n version: '1'\n\n icon?: string\n title?: string\n}\n\nexport interface ManifestWorkspaceFile extends Omit<CreateWorkspaceManifest, 'schema' | 'tools'> {\n schema: string // filename\n tools: string // filename\n}\n\nexport interface CreateWorkspaceManifest {\n basePath: string\n dataset: string\n /**\n * returns null in the case of the icon not being able to be stringified\n */\n icon: string | null\n name: string\n projectId: string\n schema: ManifestSchemaType[]\n tools: ManifestTool[]\n\n mediaLibrary?: MediaLibraryConfig\n subtitle?: string\n title?: string\n}\n\nexport interface ManifestSchemaType {\n name: string\n type: string\n\n deprecated?: {\n reason: string\n }\n fields?: ManifestField[]\n fieldsets?: ManifestFieldset[]\n hidden?: 'conditional' | boolean\n lists?: ManifestTitledValue[]\n //portable text\n marks?: {\n annotations?: ManifestArrayMember[]\n decorators?: ManifestTitledValue[]\n }\n of?: ManifestArrayMember[]\n options?: Record<string, ManifestSerializable>\n preview?: {\n select: Record<string, string>\n }\n readOnly?: 'conditional' | boolean\n styles?: ManifestTitledValue[]\n title?: string\n to?: ManifestReferenceMember[]\n validation?: ManifestValidationGroup[]\n\n // userland (assignable to ManifestSerializable | undefined)\n // not included to add some typesafty to extractManifest\n // [index: string]: unknown\n}\n\nexport interface ManifestFieldset {\n [index: string]: ManifestSerializable | undefined\n name: string\n\n title?: string\n}\n\nexport interface ManifestTitledValue {\n value: string\n\n title?: string\n}\n\ntype ManifestArrayMember = Omit<ManifestSchemaType, 'name'> & {name?: string}\ntype ManifestReferenceMember = Omit<ManifestSchemaType, 'name'> & {name?: string}\nexport type ManifestField = ManifestSchemaType & {fieldset?: string}\n\nexport interface ManifestValidationGroup {\n rules: ManifestValidationRule[]\n\n level?: 'error' | 'info' | 'warning'\n message?: string\n}\n\nexport type ManifestValidationRule = {\n [index: string]: ManifestSerializable | undefined\n constraint?: ManifestSerializable\n flag: string\n}\n\nexport interface ManifestTool {\n /**\n * returns null in the case of the icon not being able to be stringified\n */\n icon: string | null\n name: string\n title: string\n type: string | null\n}\n\nexport type DefaultWorkspaceSchemaId = `${typeof SANITY_WORKSPACE_SCHEMA_ID_PREFIX}.${string}`\ntype PrefixedWorkspaceSchemaId = `${DefaultWorkspaceSchemaId}.${string}`\nexport type WorkspaceSchemaId = DefaultWorkspaceSchemaId | PrefixedWorkspaceSchemaId\n\nexport interface StoredWorkspaceSchema extends SanityDocumentLike {\n _id: WorkspaceSchemaId\n _type: 'system.schema'\n /**\n * The API expects JSON coming in, but will store a string to save on attribute paths.\n * Consumers must use JSON.parse on the value, but we deploy to the API using ManifestSchemaType[]\n */\n schema: ManifestSchemaType[] | string\n /* api-like version string: date at which the format had a meaningful change */\n version: typeof CURRENT_WORKSPACE_SCHEMA_VERSION | undefined\n workspace: {\n name: string\n title?: string\n }\n\n tag?: string\n}\n\nexport const extractManifestWorkerData = z.object({configPath: z.string(), workDir: z.string()})\n\nexport type ExtractManifestWorkerData = z.infer<typeof extractManifestWorkerData>\n"],"names":["z","SANITY_WORKSPACE_SCHEMA_ID_PREFIX","CURRENT_WORKSPACE_SCHEMA_VERSION","extractManifestWorkerData","object","configPath","string","workDir"],"mappings":"AAEA,SAAQA,CAAC,QAAO,WAAU;AAE1B,OAAO,MAAMC,oCAAoC,YAAW;AAC5D,OAAO,MAAMC,mCAAmC,aAAY;AA2I5D,OAAO,MAAMC,4BAA4BH,EAAEI,MAAM,CAAC;IAACC,YAAYL,EAAEM,MAAM;IAAIC,SAASP,EAAEM,MAAM;AAAE,GAAE"}
|
|
@@ -3,7 +3,7 @@ import fs from 'node:fs/promises';
|
|
|
3
3
|
import { subdebug } from '@sanity/cli-core';
|
|
4
4
|
import { parse as parseJsonc } from 'jsonc-parser';
|
|
5
5
|
import { parse as parseToml } from 'smol-toml';
|
|
6
|
-
import { EDITOR_CONFIGS } from './editorConfigs.js';
|
|
6
|
+
import { createDetectionEnv, EDITOR_CONFIGS } from './editorConfigs.js';
|
|
7
7
|
const debug = subdebug('mcp:detectAvailableEditors');
|
|
8
8
|
/**
|
|
9
9
|
* Safely parse config file content
|
|
@@ -66,6 +66,15 @@ const debug = subdebug('mcp:detectAvailableEditors');
|
|
|
66
66
|
if (configured && typeof sanityConfig === 'object' && sanityConfig !== null) {
|
|
67
67
|
existingToken = readToken(sanityConfig);
|
|
68
68
|
}
|
|
69
|
+
const { oauthOnly } = EDITOR_CONFIGS[name];
|
|
70
|
+
if (configured && !existingToken && oauthOnly) {
|
|
71
|
+
return {
|
|
72
|
+
authStatus: 'valid',
|
|
73
|
+
configPath,
|
|
74
|
+
configured,
|
|
75
|
+
name
|
|
76
|
+
};
|
|
77
|
+
}
|
|
69
78
|
return {
|
|
70
79
|
configPath,
|
|
71
80
|
configured,
|
|
@@ -80,13 +89,17 @@ const debug = subdebug('mcp:detectAvailableEditors');
|
|
|
80
89
|
/**
|
|
81
90
|
* Detect which editors are installed and have parseable configs.
|
|
82
91
|
* Editors with unparseable configs are skipped to avoid data loss.
|
|
83
|
-
|
|
92
|
+
*
|
|
93
|
+
* Accepts an optional `DetectionEnv` for testability. When omitted,
|
|
94
|
+
* uses the real process/OS environment.
|
|
95
|
+
*/ export async function detectAvailableEditors(env) {
|
|
96
|
+
const ctx = env ?? createDetectionEnv();
|
|
84
97
|
// Detect all editors in parallel to avoid stacking timeouts —
|
|
85
98
|
// CLI-based editors (Claude Code, Codex CLI, OpenCode) each have a
|
|
86
99
|
// 5s execa timeout, so sequential detection can add ~15s on machines
|
|
87
100
|
// where none are installed.
|
|
88
101
|
const results = await Promise.all(Object.entries(EDITOR_CONFIGS).map(async ([name, config])=>{
|
|
89
|
-
const configPath = await config.detect();
|
|
102
|
+
const configPath = await config.detect(ctx);
|
|
90
103
|
if (!configPath) return null;
|
|
91
104
|
return checkEditorConfig(name, configPath);
|
|
92
105
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/mcp/detectAvailableEditors.ts"],"sourcesContent":["import {existsSync} from 'node:fs'\nimport fs from 'node:fs/promises'\n\nimport {subdebug} from '@sanity/cli-core'\nimport {type ParseError, parse as parseJsonc} from 'jsonc-parser'\nimport {parse as parseToml} from 'smol-toml'\n\nimport {EDITOR_CONFIGS
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/mcp/detectAvailableEditors.ts"],"sourcesContent":["import {existsSync} from 'node:fs'\nimport fs from 'node:fs/promises'\n\nimport {subdebug} from '@sanity/cli-core'\nimport {type ParseError, parse as parseJsonc} from 'jsonc-parser'\nimport {parse as parseToml} from 'smol-toml'\n\nimport {\n createDetectionEnv,\n type DetectionEnv,\n EDITOR_CONFIGS,\n type EditorName,\n} from './editorConfigs.js'\nimport {type Editor} from './types.js'\n\nconst debug = subdebug('mcp:detectAvailableEditors')\n\ninterface MCPConfig {\n [key: string]: Record<string, unknown> | undefined\n}\n\n/**\n * Safely parse config file content\n * Returns parsed config or null if unparseable\n */\nfunction parseConfig(content: string, format: 'jsonc' | 'toml'): MCPConfig | null {\n const trimmed = content.trim()\n if (trimmed === '') {\n return {} // Empty file - safe to write, treat as empty config\n }\n\n if (format === 'toml') {\n try {\n const parsed = parseToml(content)\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return null\n }\n\n return parsed as MCPConfig\n } catch {\n return null\n }\n }\n\n const errors: ParseError[] = []\n const parsed = parseJsonc(content, errors, {allowTrailingComma: true})\n\n if (errors.length > 0 || typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return null // Parse failed\n }\n\n return parsed as MCPConfig\n}\n\n/**\n * Check if an editor's config is usable and whether Sanity MCP is already configured.\n * If configured, extracts the existing auth token.\n * Returns null only if config exists but can't be parsed (to avoid data loss).\n */\nasync function checkEditorConfig(name: EditorName, configPath: string): Promise<Editor | null> {\n const {configKey, format, readToken} = EDITOR_CONFIGS[name]\n\n // Config file doesn't exist - can create it\n if (!existsSync(configPath)) {\n return {configPath, configured: false, name}\n }\n\n // Config exists - try to parse it\n try {\n const content = await fs.readFile(configPath, 'utf8')\n const config = parseConfig(content, format)\n\n if (config === null) {\n debug('Skipping %s: could not parse %s', name, configPath)\n return null // Can't parse - skip this editor\n }\n\n // Check if Sanity MCP is already configured\n const sanityConfig = config[configKey]?.Sanity\n const configured = Boolean(sanityConfig)\n\n // Extract existing token if configured\n let existingToken: string | undefined\n if (configured && typeof sanityConfig === 'object' && sanityConfig !== null) {\n existingToken = readToken(sanityConfig as Record<string, unknown>)\n }\n\n const {oauthOnly} = EDITOR_CONFIGS[name]\n if (configured && !existingToken && oauthOnly) {\n return {authStatus: 'valid', configPath, configured, name}\n }\n\n return {configPath, configured, existingToken, name}\n } catch (err) {\n debug('Skipping %s: could not read %s: %s', name, configPath, err)\n return null\n }\n}\n\n/**\n * Detect which editors are installed and have parseable configs.\n * Editors with unparseable configs are skipped to avoid data loss.\n *\n * Accepts an optional `DetectionEnv` for testability. When omitted,\n * uses the real process/OS environment.\n */\nexport async function detectAvailableEditors(env?: DetectionEnv): Promise<Editor[]> {\n const ctx = env ?? createDetectionEnv()\n\n // Detect all editors in parallel to avoid stacking timeouts —\n // CLI-based editors (Claude Code, Codex CLI, OpenCode) each have a\n // 5s execa timeout, so sequential detection can add ~15s on machines\n // where none are installed.\n const results = await Promise.all(\n Object.entries(EDITOR_CONFIGS).map(async ([name, config]) => {\n const configPath = await config.detect(ctx)\n if (!configPath) return null\n return checkEditorConfig(name as EditorName, configPath)\n }),\n )\n\n return results.filter((editor): editor is Editor => editor !== null)\n}\n"],"names":["existsSync","fs","subdebug","parse","parseJsonc","parseToml","createDetectionEnv","EDITOR_CONFIGS","debug","parseConfig","content","format","trimmed","trim","parsed","Array","isArray","errors","allowTrailingComma","length","checkEditorConfig","name","configPath","configKey","readToken","configured","readFile","config","sanityConfig","Sanity","Boolean","existingToken","oauthOnly","authStatus","err","detectAvailableEditors","env","ctx","results","Promise","all","Object","entries","map","detect","filter","editor"],"mappings":"AAAA,SAAQA,UAAU,QAAO,UAAS;AAClC,OAAOC,QAAQ,mBAAkB;AAEjC,SAAQC,QAAQ,QAAO,mBAAkB;AACzC,SAAyBC,SAASC,UAAU,QAAO,eAAc;AACjE,SAAQD,SAASE,SAAS,QAAO,YAAW;AAE5C,SACEC,kBAAkB,EAElBC,cAAc,QAET,qBAAoB;AAG3B,MAAMC,QAAQN,SAAS;AAMvB;;;CAGC,GACD,SAASO,YAAYC,OAAe,EAAEC,MAAwB;IAC5D,MAAMC,UAAUF,QAAQG,IAAI;IAC5B,IAAID,YAAY,IAAI;QAClB,OAAO,CAAC,EAAE,oDAAoD;;IAChE;IAEA,IAAID,WAAW,QAAQ;QACrB,IAAI;YACF,MAAMG,SAAST,UAAUK;YACzB,IAAI,OAAOI,WAAW,YAAYA,WAAW,QAAQC,MAAMC,OAAO,CAACF,SAAS;gBAC1E,OAAO;YACT;YAEA,OAAOA;QACT,EAAE,OAAM;YACN,OAAO;QACT;IACF;IAEA,MAAMG,SAAuB,EAAE;IAC/B,MAAMH,SAASV,WAAWM,SAASO,QAAQ;QAACC,oBAAoB;IAAI;IAEpE,IAAID,OAAOE,MAAM,GAAG,KAAK,OAAOL,WAAW,YAAYA,WAAW,QAAQC,MAAMC,OAAO,CAACF,SAAS;QAC/F,OAAO,KAAK,eAAe;;IAC7B;IAEA,OAAOA;AACT;AAEA;;;;CAIC,GACD,eAAeM,kBAAkBC,IAAgB,EAAEC,UAAkB;IACnE,MAAM,EAACC,SAAS,EAAEZ,MAAM,EAAEa,SAAS,EAAC,GAAGjB,cAAc,CAACc,KAAK;IAE3D,4CAA4C;IAC5C,IAAI,CAACrB,WAAWsB,aAAa;QAC3B,OAAO;YAACA;YAAYG,YAAY;YAAOJ;QAAI;IAC7C;IAEA,kCAAkC;IAClC,IAAI;QACF,MAAMX,UAAU,MAAMT,GAAGyB,QAAQ,CAACJ,YAAY;QAC9C,MAAMK,SAASlB,YAAYC,SAASC;QAEpC,IAAIgB,WAAW,MAAM;YACnBnB,MAAM,mCAAmCa,MAAMC;YAC/C,OAAO,KAAK,iCAAiC;;QAC/C;QAEA,4CAA4C;QAC5C,MAAMM,eAAeD,MAAM,CAACJ,UAAU,EAAEM;QACxC,MAAMJ,aAAaK,QAAQF;QAE3B,uCAAuC;QACvC,IAAIG;QACJ,IAAIN,cAAc,OAAOG,iBAAiB,YAAYA,iBAAiB,MAAM;YAC3EG,gBAAgBP,UAAUI;QAC5B;QAEA,MAAM,EAACI,SAAS,EAAC,GAAGzB,cAAc,CAACc,KAAK;QACxC,IAAII,cAAc,CAACM,iBAAiBC,WAAW;YAC7C,OAAO;gBAACC,YAAY;gBAASX;gBAAYG;gBAAYJ;YAAI;QAC3D;QAEA,OAAO;YAACC;YAAYG;YAAYM;YAAeV;QAAI;IACrD,EAAE,OAAOa,KAAK;QACZ1B,MAAM,sCAAsCa,MAAMC,YAAYY;QAC9D,OAAO;IACT;AACF;AAEA;;;;;;CAMC,GACD,OAAO,eAAeC,uBAAuBC,GAAkB;IAC7D,MAAMC,MAAMD,OAAO9B;IAEnB,8DAA8D;IAC9D,mEAAmE;IACnE,qEAAqE;IACrE,4BAA4B;IAC5B,MAAMgC,UAAU,MAAMC,QAAQC,GAAG,CAC/BC,OAAOC,OAAO,CAACnC,gBAAgBoC,GAAG,CAAC,OAAO,CAACtB,MAAMM,OAAO;QACtD,MAAML,aAAa,MAAMK,OAAOiB,MAAM,CAACP;QACvC,IAAI,CAACf,YAAY,OAAO;QACxB,OAAOF,kBAAkBC,MAAoBC;IAC/C;IAGF,OAAOgB,QAAQO,MAAM,CAAC,CAACC,SAA6BA,WAAW;AACjE"}
|