@sanity/cli 6.4.0 → 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 +14 -8
- 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/bootstrapTemplate.js.map +1 -1
- package/dist/actions/init/checkNextJsReactCompatibility.js +3 -3
- package/dist/actions/init/checkNextJsReactCompatibility.js.map +1 -1
- package/dist/actions/init/initAction.js +287 -0
- package/dist/actions/init/initAction.js.map +1 -0
- package/dist/actions/init/initApp.js +7 -16
- package/dist/actions/init/initApp.js.map +1 -1
- package/dist/actions/init/initError.js +10 -0
- package/dist/actions/init/initError.js.map +1 -0
- package/dist/actions/init/initHelpers.js +3 -12
- package/dist/actions/init/initHelpers.js.map +1 -1
- package/dist/actions/init/initNextJs.js +17 -20
- package/dist/actions/init/initNextJs.js.map +1 -1
- package/dist/actions/init/initStudio.js +11 -20
- package/dist/actions/init/initStudio.js.map +1 -1
- package/dist/actions/init/plan/getPlan.js +15 -0
- package/dist/actions/init/plan/getPlan.js.map +1 -0
- package/dist/actions/init/plan/verifyCoupon.js +35 -0
- package/dist/actions/init/plan/verifyCoupon.js.map +1 -0
- package/dist/actions/init/plan/verifyPlan.js +34 -0
- package/dist/actions/init/plan/verifyPlan.js.map +1 -0
- package/dist/actions/init/project/createProjectFromName.js +44 -0
- package/dist/actions/init/project/createProjectFromName.js.map +1 -0
- package/dist/actions/init/project/getOrCreateDataset.js +126 -0
- package/dist/actions/init/project/getOrCreateDataset.js.map +1 -0
- package/dist/actions/init/project/getOrCreateProject.js +128 -0
- package/dist/actions/init/project/getOrCreateProject.js.map +1 -0
- package/dist/actions/init/project/getProjectDetails.js +87 -0
- package/dist/actions/init/project/getProjectDetails.js.map +1 -0
- package/dist/actions/init/project/getProjectOutputPath.js +17 -0
- package/dist/actions/init/project/getProjectOutputPath.js.map +1 -0
- package/dist/actions/init/project/promptForAppTemplateSetup.js +112 -0
- package/dist/actions/init/project/promptForAppTemplateSetup.js.map +1 -0
- package/dist/actions/init/project/promptForProjectCreation.js +40 -0
- package/dist/actions/init/project/promptForProjectCreation.js.map +1 -0
- package/dist/actions/init/project/promptUserForNewOrganization.js +12 -0
- package/dist/actions/init/project/promptUserForNewOrganization.js.map +1 -0
- package/dist/actions/init/project/promptUserForOrganization.js +38 -0
- package/dist/actions/init/project/promptUserForOrganization.js.map +1 -0
- package/dist/actions/init/scaffoldTemplate.js +23 -29
- package/dist/actions/init/scaffoldTemplate.js.map +1 -1
- package/dist/actions/init/types.js +47 -1
- package/dist/actions/init/types.js.map +1 -1
- package/dist/actions/manifest/types.js +0 -1
- package/dist/actions/manifest/types.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.map +1 -1
- package/dist/commands/init.js +11 -911
- package/dist/commands/init.js.map +1 -1
- package/dist/server/vite/plugin-sanity-build-entries.js +2 -1
- package/dist/server/vite/plugin-sanity-build-entries.js.map +1 -1
- package/dist/services/datasets.js.map +1 -1
- package/dist/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/types.js.map +1 -1
- package/dist/util/packageManager/packageManagerChoice.js +2 -2
- package/dist/util/packageManager/packageManagerChoice.js.map +1 -1
- package/dist/util/packageManager/preferredPm.js +106 -0
- package/dist/util/packageManager/preferredPm.js.map +1 -0
- package/oclif.manifest.json +526 -526
- package/package.json +23 -22
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { subdebug } from '@sanity/cli-core';
|
|
2
|
+
import { select, Separator } from '@sanity/cli-core/ux';
|
|
3
|
+
import { promptForDatasetName } from '../../../prompts/promptForDatasetName.js';
|
|
4
|
+
import { promptForDefaultConfig } from '../../../prompts/promptForDefaultConfig.js';
|
|
5
|
+
import { listDatasets } from '../../../services/datasets.js';
|
|
6
|
+
import { getProjectFeatures } from '../../../services/getProjectFeatures.js';
|
|
7
|
+
import { createDataset } from '../../dataset/create.js';
|
|
8
|
+
const debug = subdebug('init');
|
|
9
|
+
export async function getOrCreateDataset(opts) {
|
|
10
|
+
const { dataset, visibility } = opts;
|
|
11
|
+
let { defaultConfig } = opts;
|
|
12
|
+
if (dataset && opts.unattended) {
|
|
13
|
+
return {
|
|
14
|
+
datasetName: dataset,
|
|
15
|
+
userAction: 'none'
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const [datasets, projectFeatures] = await Promise.all([
|
|
19
|
+
listDatasets(opts.projectId),
|
|
20
|
+
getProjectFeatures(opts.projectId)
|
|
21
|
+
]);
|
|
22
|
+
if (dataset) {
|
|
23
|
+
debug('User has specified dataset through a flag (%s)', dataset);
|
|
24
|
+
const existing = datasets.find((ds)=>ds.name === dataset);
|
|
25
|
+
if (!existing) {
|
|
26
|
+
debug('Specified dataset not found, creating it');
|
|
27
|
+
await createDataset({
|
|
28
|
+
datasetName: dataset,
|
|
29
|
+
forcePublic: defaultConfig,
|
|
30
|
+
output: opts.output,
|
|
31
|
+
projectFeatures,
|
|
32
|
+
projectId: opts.projectId,
|
|
33
|
+
visibility
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
datasetName: dataset,
|
|
38
|
+
userAction: 'none'
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
if (opts.unattended) {
|
|
42
|
+
debug('Unattended mode without --dataset, defaulting to "production" dataset');
|
|
43
|
+
const datasetName = 'production';
|
|
44
|
+
const existing = datasets.find((ds)=>ds.name === datasetName);
|
|
45
|
+
if (!existing) {
|
|
46
|
+
await createDataset({
|
|
47
|
+
datasetName,
|
|
48
|
+
forcePublic: visibility === undefined,
|
|
49
|
+
isUnattended: true,
|
|
50
|
+
output: opts.output,
|
|
51
|
+
projectFeatures,
|
|
52
|
+
projectId: opts.projectId,
|
|
53
|
+
visibility
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
datasetName,
|
|
58
|
+
userAction: existing ? 'none' : 'create'
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (datasets.length === 0) {
|
|
62
|
+
debug('No datasets found for project, prompting for name');
|
|
63
|
+
if (opts.showDefaultConfigPrompt) {
|
|
64
|
+
defaultConfig = await promptForDefaultConfig();
|
|
65
|
+
}
|
|
66
|
+
const name = defaultConfig ? 'production' : await promptForDatasetName({
|
|
67
|
+
message: 'Name of your first dataset:'
|
|
68
|
+
});
|
|
69
|
+
await createDataset({
|
|
70
|
+
datasetName: name,
|
|
71
|
+
forcePublic: defaultConfig,
|
|
72
|
+
output: opts.output,
|
|
73
|
+
projectFeatures,
|
|
74
|
+
projectId: opts.projectId,
|
|
75
|
+
visibility
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
datasetName: name,
|
|
79
|
+
userAction: 'create'
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
debug(`User has ${datasets.length} dataset(s) already, showing list of choices`);
|
|
83
|
+
const datasetChoices = datasets.map((dataset)=>({
|
|
84
|
+
value: dataset.name
|
|
85
|
+
}));
|
|
86
|
+
const selected = await select({
|
|
87
|
+
choices: [
|
|
88
|
+
{
|
|
89
|
+
name: 'Create new dataset',
|
|
90
|
+
value: 'new'
|
|
91
|
+
},
|
|
92
|
+
new Separator(),
|
|
93
|
+
...datasetChoices
|
|
94
|
+
],
|
|
95
|
+
message: 'Select dataset to use'
|
|
96
|
+
});
|
|
97
|
+
if (selected === 'new') {
|
|
98
|
+
const existingDatasetNames = datasets.map((ds)=>ds.name);
|
|
99
|
+
debug('User wants to create a new dataset, prompting for name');
|
|
100
|
+
if (opts.showDefaultConfigPrompt && !existingDatasetNames.includes('production')) {
|
|
101
|
+
defaultConfig = await promptForDefaultConfig();
|
|
102
|
+
}
|
|
103
|
+
const newDatasetName = defaultConfig ? 'production' : await promptForDatasetName({
|
|
104
|
+
message: 'Dataset name:'
|
|
105
|
+
}, existingDatasetNames);
|
|
106
|
+
await createDataset({
|
|
107
|
+
datasetName: newDatasetName,
|
|
108
|
+
forcePublic: defaultConfig,
|
|
109
|
+
output: opts.output,
|
|
110
|
+
projectFeatures,
|
|
111
|
+
projectId: opts.projectId,
|
|
112
|
+
visibility
|
|
113
|
+
});
|
|
114
|
+
return {
|
|
115
|
+
datasetName: newDatasetName,
|
|
116
|
+
userAction: 'create'
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
debug(`Returning selected dataset (${selected})`);
|
|
120
|
+
return {
|
|
121
|
+
datasetName: selected,
|
|
122
|
+
userAction: 'select'
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
//# sourceMappingURL=getOrCreateDataset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/project/getOrCreateDataset.ts"],"sourcesContent":["import {subdebug} from '@sanity/cli-core'\nimport {select, Separator} from '@sanity/cli-core/ux'\n\nimport {promptForDatasetName} from '../../../prompts/promptForDatasetName.js'\nimport {promptForDefaultConfig} from '../../../prompts/promptForDefaultConfig.js'\nimport {listDatasets} from '../../../services/datasets.js'\nimport {getProjectFeatures} from '../../../services/getProjectFeatures.js'\nimport {createDataset} from '../../dataset/create.js'\nimport {type InitContext} from '../types.js'\n\nconst debug = subdebug('init')\n\nexport async function getOrCreateDataset(opts: {\n dataset?: string\n defaultConfig: boolean | undefined\n displayName: string\n output: InitContext['output']\n projectId: string\n showDefaultConfigPrompt: boolean\n unattended: boolean\n visibility?: string\n}): Promise<{\n datasetName: string\n userAction: 'create' | 'none' | 'select'\n}> {\n const {dataset, visibility} = opts\n let {defaultConfig} = opts\n\n if (dataset && opts.unattended) {\n return {datasetName: dataset, userAction: 'none'}\n }\n\n const [datasets, projectFeatures] = await Promise.all([\n listDatasets(opts.projectId),\n getProjectFeatures(opts.projectId),\n ])\n\n if (dataset) {\n debug('User has specified dataset through a flag (%s)', dataset)\n const existing = datasets.find((ds) => ds.name === dataset)\n if (!existing) {\n debug('Specified dataset not found, creating it')\n await createDataset({\n datasetName: dataset,\n forcePublic: defaultConfig,\n output: opts.output,\n projectFeatures,\n projectId: opts.projectId,\n visibility,\n })\n }\n\n return {datasetName: dataset, userAction: 'none'}\n }\n\n if (opts.unattended) {\n debug('Unattended mode without --dataset, defaulting to \"production\" dataset')\n const datasetName = 'production'\n const existing = datasets.find((ds) => ds.name === datasetName)\n if (!existing) {\n await createDataset({\n datasetName,\n forcePublic: visibility === undefined,\n isUnattended: true,\n output: opts.output,\n projectFeatures,\n projectId: opts.projectId,\n visibility,\n })\n }\n return {datasetName, userAction: existing ? 'none' : 'create'}\n }\n\n if (datasets.length === 0) {\n debug('No datasets found for project, prompting for name')\n if (opts.showDefaultConfigPrompt) {\n defaultConfig = await promptForDefaultConfig()\n }\n const name = defaultConfig\n ? 'production'\n : await promptForDatasetName({\n message: 'Name of your first dataset:',\n })\n await createDataset({\n datasetName: name,\n forcePublic: defaultConfig,\n output: opts.output,\n projectFeatures,\n projectId: opts.projectId,\n visibility,\n })\n return {datasetName: name, userAction: 'create'}\n }\n\n debug(`User has ${datasets.length} dataset(s) already, showing list of choices`)\n const datasetChoices = datasets.map((dataset) => ({value: dataset.name}))\n\n const selected = await select({\n choices: [{name: 'Create new dataset', value: 'new'}, new Separator(), ...datasetChoices],\n message: 'Select dataset to use',\n })\n\n if (selected === 'new') {\n const existingDatasetNames = datasets.map((ds) => ds.name)\n debug('User wants to create a new dataset, prompting for name')\n if (opts.showDefaultConfigPrompt && !existingDatasetNames.includes('production')) {\n defaultConfig = await promptForDefaultConfig()\n }\n\n const newDatasetName = defaultConfig\n ? 'production'\n : await promptForDatasetName(\n {\n message: 'Dataset name:',\n },\n existingDatasetNames,\n )\n await createDataset({\n datasetName: newDatasetName,\n forcePublic: defaultConfig,\n output: opts.output,\n projectFeatures,\n projectId: opts.projectId,\n visibility,\n })\n return {datasetName: newDatasetName, userAction: 'create'}\n }\n\n debug(`Returning selected dataset (${selected})`)\n return {datasetName: selected, userAction: 'select'}\n}\n"],"names":["subdebug","select","Separator","promptForDatasetName","promptForDefaultConfig","listDatasets","getProjectFeatures","createDataset","debug","getOrCreateDataset","opts","dataset","visibility","defaultConfig","unattended","datasetName","userAction","datasets","projectFeatures","Promise","all","projectId","existing","find","ds","name","forcePublic","output","undefined","isUnattended","length","showDefaultConfigPrompt","message","datasetChoices","map","value","selected","choices","existingDatasetNames","includes","newDatasetName"],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { subdebug } from '@sanity/cli-core';
|
|
2
|
+
import { select, Separator } from '@sanity/cli-core/ux';
|
|
3
|
+
import { listOrganizations } from '../../../services/organizations.js';
|
|
4
|
+
import { listProjects } from '../../../services/projects.js';
|
|
5
|
+
import { hasProjectAttachGrant } from '../../organizations/hasProjectAttachGrant.js';
|
|
6
|
+
import { InitError } from '../initError.js';
|
|
7
|
+
import { promptForProjectCreation } from './promptForProjectCreation.js';
|
|
8
|
+
const debug = subdebug('init');
|
|
9
|
+
export async function getOrCreateProject({ coupon, newProject, organization, planId, project, unattended, user }) {
|
|
10
|
+
const projectId = project || newProject;
|
|
11
|
+
let projects;
|
|
12
|
+
let organizations;
|
|
13
|
+
// When a projectId is provided, organizations aren't needed for the fast path, so
|
|
14
|
+
// skip that request entirely. Only fetch both in parallel when prompting is required.
|
|
15
|
+
try {
|
|
16
|
+
if (projectId) {
|
|
17
|
+
projects = (await listProjects()).toSorted((a, b)=>b.createdAt.localeCompare(a.createdAt));
|
|
18
|
+
organizations = [];
|
|
19
|
+
} else {
|
|
20
|
+
const [allProjects, allOrgs] = await Promise.all([
|
|
21
|
+
listProjects(),
|
|
22
|
+
listOrganizations()
|
|
23
|
+
]);
|
|
24
|
+
projects = allProjects.toSorted((a, b)=>b.createdAt.localeCompare(a.createdAt));
|
|
25
|
+
organizations = allOrgs;
|
|
26
|
+
}
|
|
27
|
+
} catch (err) {
|
|
28
|
+
if (unattended && projectId) {
|
|
29
|
+
return {
|
|
30
|
+
displayName: 'Unknown project',
|
|
31
|
+
isFirstProject: false,
|
|
32
|
+
organizationId: organization,
|
|
33
|
+
projectId,
|
|
34
|
+
userAction: 'select'
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
38
|
+
throw new InitError(`Failed to communicate with the Sanity API:\n${message}`, 1);
|
|
39
|
+
}
|
|
40
|
+
if (projects.length === 0 && unattended) {
|
|
41
|
+
throw new InitError('No projects found for current user', 1);
|
|
42
|
+
}
|
|
43
|
+
if (projectId) {
|
|
44
|
+
// When called after createProjectFromName (--project-name flow), the new project
|
|
45
|
+
// is expected to appear here since listProjects reads the same user's own projects.
|
|
46
|
+
// If it doesn't, fail loudly rather than continuing with an "Unknown project" placeholder.
|
|
47
|
+
const proj = projects.find((p)=>p.id === projectId);
|
|
48
|
+
if (!proj) {
|
|
49
|
+
throw new InitError(`Given project ID (${projectId}) not found, or you do not have access to it`, 1);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
displayName: proj.displayName,
|
|
53
|
+
isFirstProject: false,
|
|
54
|
+
organizationId: proj.organizationId ?? undefined,
|
|
55
|
+
projectId,
|
|
56
|
+
userAction: 'select'
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (organization) {
|
|
60
|
+
const org = organizations.find((o)=>o.id === organization) || organizations.find((o)=>o.slug === organization);
|
|
61
|
+
if (!org) {
|
|
62
|
+
throw new InitError(`Given organization ID (${organization}) not found, or you do not have access to it`, 1);
|
|
63
|
+
}
|
|
64
|
+
if (!await hasProjectAttachGrant(organization)) {
|
|
65
|
+
throw new InitError('You lack the necessary permissions to attach a project to this organization', 1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const isUsersFirstProject = projects.length === 0;
|
|
69
|
+
if (isUsersFirstProject || coupon) {
|
|
70
|
+
debug(isUsersFirstProject ? 'No projects found for user, prompting for name' : 'Using a coupon - skipping project selection');
|
|
71
|
+
const created = await promptForProjectCreation({
|
|
72
|
+
coupon,
|
|
73
|
+
isUsersFirstProject,
|
|
74
|
+
organizationId: organization,
|
|
75
|
+
organizations,
|
|
76
|
+
planId,
|
|
77
|
+
user
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
...created,
|
|
81
|
+
isFirstProject: isUsersFirstProject,
|
|
82
|
+
userAction: 'create'
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
debug(`User has ${projects.length} project(s) already, showing list of choices`);
|
|
86
|
+
const projectChoices = projects.map((project)=>({
|
|
87
|
+
name: `${project.displayName} (${project.id})`,
|
|
88
|
+
value: project.id
|
|
89
|
+
}));
|
|
90
|
+
const selected = await select({
|
|
91
|
+
choices: [
|
|
92
|
+
{
|
|
93
|
+
name: 'Create new project',
|
|
94
|
+
value: 'new'
|
|
95
|
+
},
|
|
96
|
+
new Separator(),
|
|
97
|
+
...projectChoices
|
|
98
|
+
],
|
|
99
|
+
message: 'Create a new project or select an existing one'
|
|
100
|
+
});
|
|
101
|
+
if (selected === 'new') {
|
|
102
|
+
debug('User wants to create a new project, prompting for name');
|
|
103
|
+
const created = await promptForProjectCreation({
|
|
104
|
+
coupon,
|
|
105
|
+
isUsersFirstProject,
|
|
106
|
+
organizationId: organization,
|
|
107
|
+
organizations,
|
|
108
|
+
planId,
|
|
109
|
+
user
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
...created,
|
|
113
|
+
isFirstProject: isUsersFirstProject,
|
|
114
|
+
userAction: 'create'
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
debug(`Returning selected project (${selected})`);
|
|
118
|
+
const selectedProject = projects.find((proj)=>proj.id === selected);
|
|
119
|
+
return {
|
|
120
|
+
displayName: selectedProject?.displayName || '',
|
|
121
|
+
isFirstProject: isUsersFirstProject,
|
|
122
|
+
organizationId: selectedProject?.organizationId ?? undefined,
|
|
123
|
+
projectId: selected,
|
|
124
|
+
userAction: 'select'
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
//# sourceMappingURL=getOrCreateProject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/project/getOrCreateProject.ts"],"sourcesContent":["import {type SanityOrgUser, subdebug} from '@sanity/cli-core'\nimport {select, Separator} from '@sanity/cli-core/ux'\n\nimport {listOrganizations, type ProjectOrganization} from '../../../services/organizations.js'\nimport {listProjects} from '../../../services/projects.js'\nimport {hasProjectAttachGrant} from '../../organizations/hasProjectAttachGrant.js'\nimport {InitError} from '../initError.js'\nimport {promptForProjectCreation} from './promptForProjectCreation.js'\n\nconst debug = subdebug('init')\n\nexport async function getOrCreateProject({\n coupon,\n newProject,\n organization,\n planId,\n project,\n unattended,\n user,\n}: {\n coupon?: string\n newProject: string | undefined\n organization: string | undefined\n planId: string | undefined\n project: string | undefined\n unattended: boolean\n user: SanityOrgUser\n}): Promise<{\n displayName: string\n isFirstProject: boolean\n organizationId?: string\n projectId: string\n userAction: 'create' | 'select'\n}> {\n const projectId = project || newProject\n let projects\n let organizations: ProjectOrganization[]\n\n // When a projectId is provided, organizations aren't needed for the fast path, so\n // skip that request entirely. Only fetch both in parallel when prompting is required.\n try {\n if (projectId) {\n projects = (await listProjects()).toSorted((a, b) => b.createdAt.localeCompare(a.createdAt))\n organizations = []\n } else {\n const [allProjects, allOrgs] = await Promise.all([listProjects(), listOrganizations()])\n projects = allProjects.toSorted((a, b) => b.createdAt.localeCompare(a.createdAt))\n organizations = allOrgs\n }\n } catch (err: unknown) {\n if (unattended && projectId) {\n return {\n displayName: 'Unknown project',\n isFirstProject: false,\n organizationId: organization,\n projectId,\n userAction: 'select',\n }\n }\n const message = err instanceof Error ? err.message : String(err)\n throw new InitError(`Failed to communicate with the Sanity API:\\n${message}`, 1)\n }\n\n if (projects.length === 0 && unattended) {\n throw new InitError('No projects found for current user', 1)\n }\n\n if (projectId) {\n // When called after createProjectFromName (--project-name flow), the new project\n // is expected to appear here since listProjects reads the same user's own projects.\n // If it doesn't, fail loudly rather than continuing with an \"Unknown project\" placeholder.\n const proj = projects.find((p) => p.id === projectId)\n if (!proj) {\n throw new InitError(\n `Given project ID (${projectId}) not found, or you do not have access to it`,\n 1,\n )\n }\n\n return {\n displayName: proj.displayName,\n isFirstProject: false,\n organizationId: proj.organizationId ?? undefined,\n projectId,\n userAction: 'select',\n }\n }\n\n if (organization) {\n const org =\n organizations.find((o) => o.id === organization) ||\n organizations.find((o) => o.slug === organization)\n\n if (!org) {\n throw new InitError(\n `Given organization ID (${organization}) not found, or you do not have access to it`,\n 1,\n )\n }\n\n if (!(await hasProjectAttachGrant(organization))) {\n throw new InitError(\n 'You lack the necessary permissions to attach a project to this organization',\n 1,\n )\n }\n }\n\n const isUsersFirstProject = projects.length === 0\n if (isUsersFirstProject || coupon) {\n debug(\n isUsersFirstProject\n ? 'No projects found for user, prompting for name'\n : 'Using a coupon - skipping project selection',\n )\n\n const created = await promptForProjectCreation({\n coupon,\n isUsersFirstProject,\n organizationId: organization,\n organizations,\n planId,\n user,\n })\n\n return {\n ...created,\n isFirstProject: isUsersFirstProject,\n userAction: 'create',\n }\n }\n\n debug(`User has ${projects.length} project(s) already, showing list of choices`)\n\n const projectChoices = projects.map((project) => ({\n name: `${project.displayName} (${project.id})`,\n value: project.id,\n }))\n\n const selected = await select({\n choices: [{name: 'Create new project', value: 'new'}, new Separator(), ...projectChoices],\n message: 'Create a new project or select an existing one',\n })\n\n if (selected === 'new') {\n debug('User wants to create a new project, prompting for name')\n\n const created = await promptForProjectCreation({\n coupon,\n isUsersFirstProject,\n organizationId: organization,\n organizations,\n planId,\n user,\n })\n\n return {\n ...created,\n isFirstProject: isUsersFirstProject,\n userAction: 'create',\n }\n }\n\n debug(`Returning selected project (${selected})`)\n const selectedProject = projects.find((proj) => proj.id === selected)\n return {\n displayName: selectedProject?.displayName || '',\n isFirstProject: isUsersFirstProject,\n organizationId: selectedProject?.organizationId ?? undefined,\n projectId: selected,\n userAction: 'select',\n }\n}\n"],"names":["subdebug","select","Separator","listOrganizations","listProjects","hasProjectAttachGrant","InitError","promptForProjectCreation","debug","getOrCreateProject","coupon","newProject","organization","planId","project","unattended","user","projectId","projects","organizations","toSorted","a","b","createdAt","localeCompare","allProjects","allOrgs","Promise","all","err","displayName","isFirstProject","organizationId","userAction","message","Error","String","length","proj","find","p","id","undefined","org","o","slug","isUsersFirstProject","created","projectChoices","map","name","value","selected","choices","selectedProject"],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { subdebug } from '@sanity/cli-core';
|
|
2
|
+
import { listOrganizations } from '../../../services/organizations.js';
|
|
3
|
+
import { InitError } from '../initError.js';
|
|
4
|
+
import { getOrCreateDataset } from './getOrCreateDataset.js';
|
|
5
|
+
import { getOrCreateProject } from './getOrCreateProject.js';
|
|
6
|
+
import { promptForAppTemplateSetup } from './promptForAppTemplateSetup.js';
|
|
7
|
+
import { promptUserForOrganization } from './promptUserForOrganization.js';
|
|
8
|
+
const debug = subdebug('init');
|
|
9
|
+
export async function getProjectDetails({ coupon, dataset, datasetDefault, isAppTemplate, newProject, organization, output, planId, project, showDefaultConfigPrompt, trace, unattended, user, visibility }) {
|
|
10
|
+
if (isAppTemplate) {
|
|
11
|
+
const hasProjectFlag = Boolean(project || newProject);
|
|
12
|
+
let appOrganizationId = organization;
|
|
13
|
+
if (!appOrganizationId && !hasProjectFlag) {
|
|
14
|
+
let organizations;
|
|
15
|
+
try {
|
|
16
|
+
organizations = await listOrganizations();
|
|
17
|
+
} catch (err) {
|
|
18
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
19
|
+
throw new InitError(`Failed to communicate with the Sanity API:\n${message}`, 1);
|
|
20
|
+
}
|
|
21
|
+
appOrganizationId = await promptUserForOrganization({
|
|
22
|
+
isAppTemplate: true,
|
|
23
|
+
organizations,
|
|
24
|
+
user
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const { datasetName: appDatasetName, displayName: appDisplayName, organizationId: resolvedOrganizationId, projectId: appProjectId } = await promptForAppTemplateSetup({
|
|
28
|
+
coupon,
|
|
29
|
+
dataset,
|
|
30
|
+
datasetDefault,
|
|
31
|
+
newProject,
|
|
32
|
+
organization,
|
|
33
|
+
organizationId: appOrganizationId,
|
|
34
|
+
output,
|
|
35
|
+
planId,
|
|
36
|
+
project,
|
|
37
|
+
trace,
|
|
38
|
+
unattended,
|
|
39
|
+
user,
|
|
40
|
+
visibility
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
datasetName: appDatasetName,
|
|
44
|
+
displayName: appDisplayName,
|
|
45
|
+
isFirstProject: false,
|
|
46
|
+
organizationId: resolvedOrganizationId ?? appOrganizationId,
|
|
47
|
+
projectId: appProjectId
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
debug('Prompting user to select or create a project');
|
|
51
|
+
const projectResult = await getOrCreateProject({
|
|
52
|
+
coupon,
|
|
53
|
+
newProject,
|
|
54
|
+
organization,
|
|
55
|
+
planId,
|
|
56
|
+
project,
|
|
57
|
+
unattended,
|
|
58
|
+
user
|
|
59
|
+
});
|
|
60
|
+
debug(`Project with name ${projectResult.displayName} selected`);
|
|
61
|
+
debug('Prompting user to select or create a dataset');
|
|
62
|
+
const datasetResult = await getOrCreateDataset({
|
|
63
|
+
dataset,
|
|
64
|
+
defaultConfig: datasetDefault || undefined,
|
|
65
|
+
displayName: projectResult.displayName,
|
|
66
|
+
output,
|
|
67
|
+
projectId: projectResult.projectId,
|
|
68
|
+
showDefaultConfigPrompt,
|
|
69
|
+
unattended,
|
|
70
|
+
visibility
|
|
71
|
+
});
|
|
72
|
+
debug(`Dataset with name ${datasetResult.datasetName} selected`);
|
|
73
|
+
trace.log({
|
|
74
|
+
datasetName: datasetResult.datasetName,
|
|
75
|
+
selectedOption: datasetResult.userAction,
|
|
76
|
+
step: 'createOrSelectDataset',
|
|
77
|
+
visibility
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
datasetName: datasetResult.datasetName,
|
|
81
|
+
displayName: projectResult.displayName,
|
|
82
|
+
isFirstProject: projectResult.isFirstProject,
|
|
83
|
+
projectId: projectResult.projectId
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
//# sourceMappingURL=getProjectDetails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/project/getProjectDetails.ts"],"sourcesContent":["import {type SanityOrgUser, subdebug, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {listOrganizations, type ProjectOrganization} from '../../../services/organizations.js'\nimport {type InitStepResult} from '../../../telemetry/init.telemetry.js'\nimport {InitError} from '../initError.js'\nimport {type InitContext} from '../types.js'\nimport {getOrCreateDataset} from './getOrCreateDataset.js'\nimport {getOrCreateProject} from './getOrCreateProject.js'\nimport {promptForAppTemplateSetup} from './promptForAppTemplateSetup.js'\nimport {promptUserForOrganization} from './promptUserForOrganization.js'\n\nconst debug = subdebug('init')\n\nexport async function getProjectDetails({\n coupon,\n dataset,\n datasetDefault,\n isAppTemplate,\n newProject,\n organization,\n output,\n planId,\n project,\n showDefaultConfigPrompt,\n trace,\n unattended,\n user,\n visibility,\n}: {\n coupon: string | undefined\n dataset: string | undefined\n datasetDefault: boolean\n isAppTemplate: boolean\n newProject: string | undefined\n organization: string | undefined\n output: InitContext['output']\n planId: string | undefined\n project: string | undefined\n showDefaultConfigPrompt: boolean\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n unattended: boolean\n user: SanityOrgUser\n visibility: 'private' | 'public' | undefined\n}): Promise<{\n datasetName: string\n displayName: string\n isFirstProject: boolean\n organizationId?: string\n projectId: string\n schemaUrl?: string\n}> {\n if (isAppTemplate) {\n const hasProjectFlag = Boolean(project || newProject)\n let appOrganizationId: string | undefined = organization\n if (!appOrganizationId && !hasProjectFlag) {\n let organizations: ProjectOrganization[]\n try {\n organizations = await listOrganizations()\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err)\n throw new InitError(`Failed to communicate with the Sanity API:\\n${message}`, 1)\n }\n appOrganizationId = await promptUserForOrganization({\n isAppTemplate: true,\n organizations,\n user,\n })\n }\n\n const {\n datasetName: appDatasetName,\n displayName: appDisplayName,\n organizationId: resolvedOrganizationId,\n projectId: appProjectId,\n } = await promptForAppTemplateSetup({\n coupon,\n dataset,\n datasetDefault,\n newProject,\n organization,\n organizationId: appOrganizationId,\n output,\n planId,\n project,\n trace,\n unattended,\n user,\n visibility,\n })\n\n return {\n datasetName: appDatasetName,\n displayName: appDisplayName,\n isFirstProject: false,\n organizationId: resolvedOrganizationId ?? appOrganizationId,\n projectId: appProjectId,\n }\n }\n\n debug('Prompting user to select or create a project')\n const projectResult = await getOrCreateProject({\n coupon,\n newProject,\n organization,\n planId,\n project,\n unattended,\n user,\n })\n debug(`Project with name ${projectResult.displayName} selected`)\n\n debug('Prompting user to select or create a dataset')\n const datasetResult = await getOrCreateDataset({\n dataset,\n defaultConfig: datasetDefault || undefined,\n displayName: projectResult.displayName,\n output,\n projectId: projectResult.projectId,\n showDefaultConfigPrompt,\n unattended,\n visibility,\n })\n debug(`Dataset with name ${datasetResult.datasetName} selected`)\n\n trace.log({\n datasetName: datasetResult.datasetName,\n selectedOption: datasetResult.userAction,\n step: 'createOrSelectDataset',\n visibility,\n })\n\n return {\n datasetName: datasetResult.datasetName,\n displayName: projectResult.displayName,\n isFirstProject: projectResult.isFirstProject,\n projectId: projectResult.projectId,\n }\n}\n"],"names":["subdebug","listOrganizations","InitError","getOrCreateDataset","getOrCreateProject","promptForAppTemplateSetup","promptUserForOrganization","debug","getProjectDetails","coupon","dataset","datasetDefault","isAppTemplate","newProject","organization","output","planId","project","showDefaultConfigPrompt","trace","unattended","user","visibility","hasProjectFlag","Boolean","appOrganizationId","organizations","err","message","Error","String","datasetName","appDatasetName","displayName","appDisplayName","organizationId","resolvedOrganizationId","projectId","appProjectId","isFirstProject","projectResult","datasetResult","defaultConfig","undefined","log","selectedOption","userAction","step"],"mappings":"AAAA,SAA4BA,QAAQ,QAAqC,mBAAkB;AAG3F,SAAQC,iBAAiB,QAAiC,qCAAoC;AAE9F,SAAQC,SAAS,QAAO,kBAAiB;AAEzC,SAAQC,kBAAkB,QAAO,0BAAyB;AAC1D,SAAQC,kBAAkB,QAAO,0BAAyB;AAC1D,SAAQC,yBAAyB,QAAO,iCAAgC;AACxE,SAAQC,yBAAyB,QAAO,iCAAgC;AAExE,MAAMC,QAAQP,SAAS;AAEvB,OAAO,eAAeQ,kBAAkB,EACtCC,MAAM,EACNC,OAAO,EACPC,cAAc,EACdC,aAAa,EACbC,UAAU,EACVC,YAAY,EACZC,MAAM,EACNC,MAAM,EACNC,OAAO,EACPC,uBAAuB,EACvBC,KAAK,EACLC,UAAU,EACVC,IAAI,EACJC,UAAU,EAgBX;IAQC,IAAIV,eAAe;QACjB,MAAMW,iBAAiBC,QAAQP,WAAWJ;QAC1C,IAAIY,oBAAwCX;QAC5C,IAAI,CAACW,qBAAqB,CAACF,gBAAgB;YACzC,IAAIG;YACJ,IAAI;gBACFA,gBAAgB,MAAMzB;YACxB,EAAE,OAAO0B,KAAc;gBACrB,MAAMC,UAAUD,eAAeE,QAAQF,IAAIC,OAAO,GAAGE,OAAOH;gBAC5D,MAAM,IAAIzB,UAAU,CAAC,4CAA4C,EAAE0B,SAAS,EAAE;YAChF;YACAH,oBAAoB,MAAMnB,0BAA0B;gBAClDM,eAAe;gBACfc;gBACAL;YACF;QACF;QAEA,MAAM,EACJU,aAAaC,cAAc,EAC3BC,aAAaC,cAAc,EAC3BC,gBAAgBC,sBAAsB,EACtCC,WAAWC,YAAY,EACxB,GAAG,MAAMjC,0BAA0B;YAClCI;YACAC;YACAC;YACAE;YACAC;YACAqB,gBAAgBV;YAChBV;YACAC;YACAC;YACAE;YACAC;YACAC;YACAC;QACF;QAEA,OAAO;YACLS,aAAaC;YACbC,aAAaC;YACbK,gBAAgB;YAChBJ,gBAAgBC,0BAA0BX;YAC1CY,WAAWC;QACb;IACF;IAEA/B,MAAM;IACN,MAAMiC,gBAAgB,MAAMpC,mBAAmB;QAC7CK;QACAI;QACAC;QACAE;QACAC;QACAG;QACAC;IACF;IACAd,MAAM,CAAC,kBAAkB,EAAEiC,cAAcP,WAAW,CAAC,SAAS,CAAC;IAE/D1B,MAAM;IACN,MAAMkC,gBAAgB,MAAMtC,mBAAmB;QAC7CO;QACAgC,eAAe/B,kBAAkBgC;QACjCV,aAAaO,cAAcP,WAAW;QACtClB;QACAsB,WAAWG,cAAcH,SAAS;QAClCnB;QACAE;QACAE;IACF;IACAf,MAAM,CAAC,kBAAkB,EAAEkC,cAAcV,WAAW,CAAC,SAAS,CAAC;IAE/DZ,MAAMyB,GAAG,CAAC;QACRb,aAAaU,cAAcV,WAAW;QACtCc,gBAAgBJ,cAAcK,UAAU;QACxCC,MAAM;QACNzB;IACF;IAEA,OAAO;QACLS,aAAaU,cAAcV,WAAW;QACtCE,aAAaO,cAAcP,WAAW;QACtCM,gBAAgBC,cAAcD,cAAc;QAC5CF,WAAWG,cAAcH,SAAS;IACpC;AACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { input } from '@sanity/cli-core/ux';
|
|
3
|
+
import { absolutify, validateEmptyPath } from '../../../util/fsUtils.js';
|
|
4
|
+
export async function getProjectOutputPath({ initFramework, outputPath, sluggedName, unattended, useEnv, workDir }) {
|
|
5
|
+
const specifiedPath = outputPath && path.resolve(outputPath);
|
|
6
|
+
if (unattended || specifiedPath || useEnv || initFramework) {
|
|
7
|
+
return specifiedPath || workDir;
|
|
8
|
+
}
|
|
9
|
+
const inputPath = await input({
|
|
10
|
+
default: path.join(workDir, sluggedName),
|
|
11
|
+
message: 'Project output path:',
|
|
12
|
+
validate: validateEmptyPath
|
|
13
|
+
});
|
|
14
|
+
return absolutify(inputPath);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=getProjectOutputPath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/project/getProjectOutputPath.ts"],"sourcesContent":["import path from 'node:path'\n\nimport {input} from '@sanity/cli-core/ux'\n\nimport {absolutify, validateEmptyPath} from '../../../util/fsUtils.js'\n\nexport async function getProjectOutputPath({\n initFramework,\n outputPath,\n sluggedName,\n unattended,\n useEnv,\n workDir,\n}: {\n initFramework: boolean\n outputPath: string | undefined\n sluggedName: string\n unattended: boolean\n useEnv: boolean\n workDir: string\n}): Promise<string> {\n const specifiedPath = outputPath && path.resolve(outputPath)\n if (unattended || specifiedPath || useEnv || initFramework) {\n return specifiedPath || workDir\n }\n\n const inputPath = await input({\n default: path.join(workDir, sluggedName),\n message: 'Project output path:',\n validate: validateEmptyPath,\n })\n\n return absolutify(inputPath)\n}\n"],"names":["path","input","absolutify","validateEmptyPath","getProjectOutputPath","initFramework","outputPath","sluggedName","unattended","useEnv","workDir","specifiedPath","resolve","inputPath","default","join","message","validate"],"mappings":"AAAA,OAAOA,UAAU,YAAW;AAE5B,SAAQC,KAAK,QAAO,sBAAqB;AAEzC,SAAQC,UAAU,EAAEC,iBAAiB,QAAO,2BAA0B;AAEtE,OAAO,eAAeC,qBAAqB,EACzCC,aAAa,EACbC,UAAU,EACVC,WAAW,EACXC,UAAU,EACVC,MAAM,EACNC,OAAO,EAQR;IACC,MAAMC,gBAAgBL,cAAcN,KAAKY,OAAO,CAACN;IACjD,IAAIE,cAAcG,iBAAiBF,UAAUJ,eAAe;QAC1D,OAAOM,iBAAiBD;IAC1B;IAEA,MAAMG,YAAY,MAAMZ,MAAM;QAC5Ba,SAASd,KAAKe,IAAI,CAACL,SAASH;QAC5BS,SAAS;QACTC,UAAUd;IACZ;IAEA,OAAOD,WAAWW;AACpB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { select, Separator } from '@sanity/cli-core/ux';
|
|
2
|
+
import { listProjects } from '../../../services/projects.js';
|
|
3
|
+
import { getOrCreateDataset } from './getOrCreateDataset.js';
|
|
4
|
+
import { getOrCreateProject } from './getOrCreateProject.js';
|
|
5
|
+
import { promptForProjectCreation } from './promptForProjectCreation.js';
|
|
6
|
+
export async function promptForAppTemplateSetup({ coupon, dataset, datasetDefault, newProject, organization, organizationId, output, planId, project, trace, unattended, user, visibility }) {
|
|
7
|
+
const hasProjectFlag = Boolean(project || newProject);
|
|
8
|
+
if (unattended || hasProjectFlag) {
|
|
9
|
+
if (!project && !newProject) {
|
|
10
|
+
return {
|
|
11
|
+
datasetName: '',
|
|
12
|
+
displayName: '',
|
|
13
|
+
projectId: ''
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const projectResult = await getOrCreateProject({
|
|
17
|
+
coupon,
|
|
18
|
+
newProject,
|
|
19
|
+
organization,
|
|
20
|
+
planId,
|
|
21
|
+
project,
|
|
22
|
+
unattended,
|
|
23
|
+
user
|
|
24
|
+
});
|
|
25
|
+
const datasetResult = await getOrCreateDataset({
|
|
26
|
+
dataset,
|
|
27
|
+
defaultConfig: datasetDefault || undefined,
|
|
28
|
+
displayName: projectResult.displayName,
|
|
29
|
+
output,
|
|
30
|
+
projectId: projectResult.projectId,
|
|
31
|
+
showDefaultConfigPrompt: false,
|
|
32
|
+
unattended,
|
|
33
|
+
visibility
|
|
34
|
+
});
|
|
35
|
+
return {
|
|
36
|
+
datasetName: datasetResult.datasetName,
|
|
37
|
+
displayName: projectResult.displayName,
|
|
38
|
+
organizationId: projectResult.organizationId,
|
|
39
|
+
projectId: projectResult.projectId
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const projects = (await listProjects()).toSorted((a, b)=>b.createdAt.localeCompare(a.createdAt));
|
|
43
|
+
const projectChoices = projects.map((p)=>({
|
|
44
|
+
name: `${p.displayName} (${p.id})`,
|
|
45
|
+
value: p.id
|
|
46
|
+
}));
|
|
47
|
+
const SKIP_PROJECT = '__skip__';
|
|
48
|
+
const NEW_PROJECT = '__new__';
|
|
49
|
+
const selected = await select({
|
|
50
|
+
choices: [
|
|
51
|
+
{
|
|
52
|
+
name: "Skip — I'll configure later",
|
|
53
|
+
value: SKIP_PROJECT
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'Create new project',
|
|
57
|
+
value: NEW_PROJECT
|
|
58
|
+
},
|
|
59
|
+
...projectChoices.length > 0 ? [
|
|
60
|
+
new Separator(),
|
|
61
|
+
...projectChoices
|
|
62
|
+
] : []
|
|
63
|
+
],
|
|
64
|
+
message: 'Configure a project for this app?'
|
|
65
|
+
});
|
|
66
|
+
if (selected === SKIP_PROJECT) {
|
|
67
|
+
trace.log({
|
|
68
|
+
selectedOption: 'skip',
|
|
69
|
+
step: 'configureAppProject'
|
|
70
|
+
});
|
|
71
|
+
return {
|
|
72
|
+
datasetName: '',
|
|
73
|
+
displayName: '',
|
|
74
|
+
projectId: ''
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
trace.log({
|
|
78
|
+
selectedOption: selected === NEW_PROJECT ? 'create' : 'existing',
|
|
79
|
+
step: 'configureAppProject'
|
|
80
|
+
});
|
|
81
|
+
const selectedProject = projects.find((p)=>p.id === selected);
|
|
82
|
+
const projectResult = selected === NEW_PROJECT ? await promptForProjectCreation({
|
|
83
|
+
coupon,
|
|
84
|
+
isUsersFirstProject: projects.length === 0,
|
|
85
|
+
organizationId,
|
|
86
|
+
organizations: [],
|
|
87
|
+
planId,
|
|
88
|
+
user
|
|
89
|
+
}) : {
|
|
90
|
+
displayName: selectedProject?.displayName ?? '',
|
|
91
|
+
organizationId: selectedProject?.organizationId ?? undefined,
|
|
92
|
+
projectId: selected
|
|
93
|
+
};
|
|
94
|
+
const datasetResult = await getOrCreateDataset({
|
|
95
|
+
dataset,
|
|
96
|
+
defaultConfig: datasetDefault || undefined,
|
|
97
|
+
displayName: projectResult.displayName,
|
|
98
|
+
output,
|
|
99
|
+
projectId: projectResult.projectId,
|
|
100
|
+
showDefaultConfigPrompt: false,
|
|
101
|
+
unattended: false,
|
|
102
|
+
visibility
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
datasetName: datasetResult.datasetName,
|
|
106
|
+
displayName: projectResult.displayName,
|
|
107
|
+
organizationId: projectResult.organizationId,
|
|
108
|
+
projectId: projectResult.projectId
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
//# sourceMappingURL=promptForAppTemplateSetup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/project/promptForAppTemplateSetup.ts"],"sourcesContent":["import {type SanityOrgUser, type TelemetryUserProperties} from '@sanity/cli-core'\nimport {select, Separator} from '@sanity/cli-core/ux'\nimport {type TelemetryTrace} from '@sanity/telemetry'\n\nimport {listProjects} from '../../../services/projects.js'\nimport {type InitStepResult} from '../../../telemetry/init.telemetry.js'\nimport {type InitContext} from '../types.js'\nimport {getOrCreateDataset} from './getOrCreateDataset.js'\nimport {getOrCreateProject} from './getOrCreateProject.js'\nimport {promptForProjectCreation} from './promptForProjectCreation.js'\n\nexport async function promptForAppTemplateSetup({\n coupon,\n dataset,\n datasetDefault,\n newProject,\n organization,\n organizationId,\n output,\n planId,\n project,\n trace,\n unattended,\n user,\n visibility,\n}: {\n coupon: string | undefined\n dataset: string | undefined\n datasetDefault: boolean\n newProject: string | undefined\n organization: string | undefined\n organizationId: string | undefined\n output: InitContext['output']\n planId: string | undefined\n project: string | undefined\n trace: TelemetryTrace<TelemetryUserProperties, InitStepResult>\n unattended: boolean\n user: SanityOrgUser\n visibility: 'private' | 'public' | undefined\n}): Promise<{\n datasetName: string\n displayName: string\n organizationId?: string\n projectId: string\n}> {\n const hasProjectFlag = Boolean(project || newProject)\n\n if (unattended || hasProjectFlag) {\n if (!project && !newProject) {\n return {datasetName: '', displayName: '', projectId: ''}\n }\n const projectResult = await getOrCreateProject({\n coupon,\n newProject,\n organization,\n planId,\n project,\n unattended,\n user,\n })\n const datasetResult = await getOrCreateDataset({\n dataset,\n defaultConfig: datasetDefault || undefined,\n displayName: projectResult.displayName,\n output,\n projectId: projectResult.projectId,\n showDefaultConfigPrompt: false,\n unattended,\n visibility,\n })\n return {\n datasetName: datasetResult.datasetName,\n displayName: projectResult.displayName,\n organizationId: projectResult.organizationId,\n projectId: projectResult.projectId,\n }\n }\n\n const projects = (await listProjects()).toSorted((a, b) => b.createdAt.localeCompare(a.createdAt))\n\n const projectChoices = projects.map((p) => ({\n name: `${p.displayName} (${p.id})`,\n value: p.id,\n }))\n\n const SKIP_PROJECT = '__skip__'\n const NEW_PROJECT = '__new__'\n\n const selected = await select({\n choices: [\n {name: \"Skip — I'll configure later\", value: SKIP_PROJECT},\n {name: 'Create new project', value: NEW_PROJECT},\n ...(projectChoices.length > 0 ? [new Separator(), ...projectChoices] : []),\n ],\n message: 'Configure a project for this app?',\n })\n\n if (selected === SKIP_PROJECT) {\n trace.log({selectedOption: 'skip', step: 'configureAppProject'})\n return {datasetName: '', displayName: '', projectId: ''}\n }\n\n trace.log({\n selectedOption: selected === NEW_PROJECT ? 'create' : 'existing',\n step: 'configureAppProject',\n })\n\n const selectedProject = projects.find((p) => p.id === selected)\n const projectResult =\n selected === NEW_PROJECT\n ? await promptForProjectCreation({\n coupon,\n isUsersFirstProject: projects.length === 0,\n organizationId,\n organizations: [],\n planId,\n user,\n })\n : {\n displayName: selectedProject?.displayName ?? '',\n organizationId: selectedProject?.organizationId ?? undefined,\n projectId: selected,\n }\n\n const datasetResult = await getOrCreateDataset({\n dataset,\n defaultConfig: datasetDefault || undefined,\n displayName: projectResult.displayName,\n output,\n projectId: projectResult.projectId,\n showDefaultConfigPrompt: false,\n unattended: false,\n visibility,\n })\n return {\n datasetName: datasetResult.datasetName,\n displayName: projectResult.displayName,\n organizationId: projectResult.organizationId,\n projectId: projectResult.projectId,\n }\n}\n"],"names":["select","Separator","listProjects","getOrCreateDataset","getOrCreateProject","promptForProjectCreation","promptForAppTemplateSetup","coupon","dataset","datasetDefault","newProject","organization","organizationId","output","planId","project","trace","unattended","user","visibility","hasProjectFlag","Boolean","datasetName","displayName","projectId","projectResult","datasetResult","defaultConfig","undefined","showDefaultConfigPrompt","projects","toSorted","a","b","createdAt","localeCompare","projectChoices","map","p","name","id","value","SKIP_PROJECT","NEW_PROJECT","selected","choices","length","message","log","selectedOption","step","selectedProject","find","isUsersFirstProject","organizations"],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { input } from '@sanity/cli-core/ux';
|
|
2
|
+
import { createProject } from '../../../services/projects.js';
|
|
3
|
+
import { promptUserForOrganization } from './promptUserForOrganization.js';
|
|
4
|
+
export async function promptForProjectCreation({ coupon, isUsersFirstProject, organizationId, organizations, planId, user }) {
|
|
5
|
+
const projectName = await input({
|
|
6
|
+
default: 'My Sanity Project',
|
|
7
|
+
message: 'Project name:',
|
|
8
|
+
validate (val) {
|
|
9
|
+
if (!val || val.trim() === '') {
|
|
10
|
+
return 'Project name cannot be empty';
|
|
11
|
+
}
|
|
12
|
+
if (val.length > 80) {
|
|
13
|
+
return 'Project name cannot be longer than 80 characters';
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
const org = organizationId || await promptUserForOrganization({
|
|
19
|
+
organizations,
|
|
20
|
+
user
|
|
21
|
+
});
|
|
22
|
+
const newProjectResult = await createProject({
|
|
23
|
+
displayName: projectName,
|
|
24
|
+
metadata: {
|
|
25
|
+
coupon
|
|
26
|
+
},
|
|
27
|
+
organizationId: org,
|
|
28
|
+
subscription: planId ? {
|
|
29
|
+
planId
|
|
30
|
+
} : undefined
|
|
31
|
+
});
|
|
32
|
+
return {
|
|
33
|
+
...newProjectResult,
|
|
34
|
+
isFirstProject: isUsersFirstProject,
|
|
35
|
+
organizationId: org,
|
|
36
|
+
userAction: 'create'
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=promptForProjectCreation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/project/promptForProjectCreation.ts"],"sourcesContent":["import {type SanityOrgUser} from '@sanity/cli-core'\nimport {input} from '@sanity/cli-core/ux'\n\nimport {type ProjectOrganization} from '../../../services/organizations.js'\nimport {createProject} from '../../../services/projects.js'\nimport {promptUserForOrganization} from './promptUserForOrganization.js'\n\nexport async function promptForProjectCreation({\n coupon,\n isUsersFirstProject,\n organizationId,\n organizations,\n planId,\n user,\n}: {\n coupon: string | undefined\n isUsersFirstProject: boolean\n organizationId: string | undefined\n organizations: ProjectOrganization[]\n planId: string | undefined\n user: SanityOrgUser\n}) {\n const projectName = await input({\n default: 'My Sanity Project',\n message: 'Project name:',\n validate(val) {\n if (!val || val.trim() === '') {\n return 'Project name cannot be empty'\n }\n\n if (val.length > 80) {\n return 'Project name cannot be longer than 80 characters'\n }\n\n return true\n },\n })\n\n const org = organizationId || (await promptUserForOrganization({organizations, user}))\n\n const newProjectResult = await createProject({\n displayName: projectName,\n metadata: {coupon},\n organizationId: org,\n subscription: planId ? {planId} : undefined,\n })\n\n return {\n ...newProjectResult,\n isFirstProject: isUsersFirstProject,\n organizationId: org,\n userAction: 'create' as const,\n }\n}\n"],"names":["input","createProject","promptUserForOrganization","promptForProjectCreation","coupon","isUsersFirstProject","organizationId","organizations","planId","user","projectName","default","message","validate","val","trim","length","org","newProjectResult","displayName","metadata","subscription","undefined","isFirstProject","userAction"],"mappings":"AACA,SAAQA,KAAK,QAAO,sBAAqB;AAGzC,SAAQC,aAAa,QAAO,gCAA+B;AAC3D,SAAQC,yBAAyB,QAAO,iCAAgC;AAExE,OAAO,eAAeC,yBAAyB,EAC7CC,MAAM,EACNC,mBAAmB,EACnBC,cAAc,EACdC,aAAa,EACbC,MAAM,EACNC,IAAI,EAQL;IACC,MAAMC,cAAc,MAAMV,MAAM;QAC9BW,SAAS;QACTC,SAAS;QACTC,UAASC,GAAG;YACV,IAAI,CAACA,OAAOA,IAAIC,IAAI,OAAO,IAAI;gBAC7B,OAAO;YACT;YAEA,IAAID,IAAIE,MAAM,GAAG,IAAI;gBACnB,OAAO;YACT;YAEA,OAAO;QACT;IACF;IAEA,MAAMC,MAAMX,kBAAmB,MAAMJ,0BAA0B;QAACK;QAAeE;IAAI;IAEnF,MAAMS,mBAAmB,MAAMjB,cAAc;QAC3CkB,aAAaT;QACbU,UAAU;YAAChB;QAAM;QACjBE,gBAAgBW;QAChBI,cAAcb,SAAS;YAACA;QAAM,IAAIc;IACpC;IAEA,OAAO;QACL,GAAGJ,gBAAgB;QACnBK,gBAAgBlB;QAChBC,gBAAgBW;QAChBO,YAAY;IACd;AACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { spinner } from '@sanity/cli-core/ux';
|
|
2
|
+
import { promptForOrganizationName } from '../../../prompts/promptForOrganizationName.js';
|
|
3
|
+
import { createOrganization } from '../../../services/organizations.js';
|
|
4
|
+
export async function promptUserForNewOrganization(user) {
|
|
5
|
+
const name = await promptForOrganizationName(user);
|
|
6
|
+
const spin = spinner('Creating organization').start();
|
|
7
|
+
const organization = await createOrganization(name);
|
|
8
|
+
spin.succeed();
|
|
9
|
+
return organization;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=promptUserForNewOrganization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/project/promptUserForNewOrganization.ts"],"sourcesContent":["import {type SanityOrgUser} from '@sanity/cli-core'\nimport {spinner} from '@sanity/cli-core/ux'\n\nimport {promptForOrganizationName} from '../../../prompts/promptForOrganizationName.js'\nimport {\n createOrganization,\n type OrganizationCreateResponse,\n} from '../../../services/organizations.js'\n\nexport async function promptUserForNewOrganization(\n user: SanityOrgUser,\n): Promise<OrganizationCreateResponse> {\n const name = await promptForOrganizationName(user)\n\n const spin = spinner('Creating organization').start()\n const organization = await createOrganization(name)\n spin.succeed()\n\n return organization\n}\n"],"names":["spinner","promptForOrganizationName","createOrganization","promptUserForNewOrganization","user","name","spin","start","organization","succeed"],"mappings":"AACA,SAAQA,OAAO,QAAO,sBAAqB;AAE3C,SAAQC,yBAAyB,QAAO,gDAA+C;AACvF,SACEC,kBAAkB,QAEb,qCAAoC;AAE3C,OAAO,eAAeC,6BACpBC,IAAmB;IAEnB,MAAMC,OAAO,MAAMJ,0BAA0BG;IAE7C,MAAME,OAAON,QAAQ,yBAAyBO,KAAK;IACnD,MAAMC,eAAe,MAAMN,mBAAmBG;IAC9CC,KAAKG,OAAO;IAEZ,OAAOD;AACT"}
|