@sanity/cli 6.0.0-alpha.6 → 6.0.0-alpha.8
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 +2907 -109
- package/dist/actions/build/renderDocumentWorker/tryLoadDocumentComponent.js +2 -1
- package/dist/actions/build/renderDocumentWorker/tryLoadDocumentComponent.js.map +1 -1
- package/dist/actions/init/bootstrapLocalTemplate.d.ts +13 -0
- package/dist/actions/init/bootstrapLocalTemplate.js +136 -0
- package/dist/actions/init/bootstrapLocalTemplate.js.map +1 -0
- package/dist/actions/init/bootstrapRemoteTemplate.d.ts +12 -0
- package/dist/actions/init/bootstrapRemoteTemplate.js +109 -0
- package/dist/actions/init/bootstrapRemoteTemplate.js.map +1 -0
- package/dist/actions/init/bootstrapTemplate.d.ts +18 -0
- package/dist/actions/init/bootstrapTemplate.js +32 -0
- package/dist/actions/init/bootstrapTemplate.js.map +1 -0
- package/dist/actions/init/checkNextJsReactCompatibility.d.ts +9 -0
- package/dist/actions/init/checkNextJsReactCompatibility.js +21 -0
- package/dist/actions/init/checkNextJsReactCompatibility.js.map +1 -0
- package/dist/actions/init/countNestedFolders.d.ts +1 -0
- package/dist/actions/init/countNestedFolders.js +6 -0
- package/dist/actions/init/countNestedFolders.js.map +1 -0
- package/dist/actions/init/createAppCliConfig.d.ts +5 -0
- package/dist/actions/init/createAppCliConfig.js +19 -0
- package/dist/actions/init/createAppCliConfig.js.map +1 -0
- package/dist/actions/init/createCliConfig.d.ts +6 -0
- package/dist/actions/init/createCliConfig.js +27 -0
- package/dist/actions/init/createCliConfig.js.map +1 -0
- package/dist/actions/init/createPackageManifest.d.ts +6 -0
- package/dist/actions/init/createPackageManifest.js +86 -0
- package/dist/actions/init/createPackageManifest.js.map +1 -0
- package/dist/actions/init/createStudioConfig.d.ts +13 -0
- package/dist/actions/init/createStudioConfig.js +41 -0
- package/dist/actions/init/createStudioConfig.js.map +1 -0
- package/dist/actions/init/env/createOrAppendEnvVars.d.ts +12 -0
- package/dist/actions/init/env/createOrAppendEnvVars.js +25 -0
- package/dist/actions/init/env/createOrAppendEnvVars.js.map +1 -0
- package/dist/actions/init/env/parseAndUpdateEnvVars.d.ts +9 -0
- package/dist/actions/init/env/parseAndUpdateEnvVars.js +42 -0
- package/dist/actions/init/env/parseAndUpdateEnvVars.js.map +1 -0
- package/dist/actions/init/env/writeEnvVarsToFile.d.ts +12 -0
- package/dist/actions/init/env/writeEnvVarsToFile.js +49 -0
- package/dist/actions/init/env/writeEnvVarsToFile.js.map +1 -0
- package/dist/actions/init/fetchPostInitPrompt.d.ts +6 -0
- package/dist/actions/init/fetchPostInitPrompt.js +30 -0
- package/dist/actions/init/fetchPostInitPrompt.js.map +1 -0
- package/dist/actions/init/git.d.ts +1 -0
- package/dist/actions/init/git.js +65 -0
- package/dist/actions/init/git.js.map +1 -0
- package/dist/actions/init/processTemplate.d.ts +7 -0
- package/dist/actions/init/processTemplate.js +56 -0
- package/dist/actions/init/processTemplate.js.map +1 -0
- package/dist/actions/init/remoteTemplate.d.ts +0 -3
- package/dist/actions/init/remoteTemplate.js +2 -40
- package/dist/actions/init/remoteTemplate.js.map +1 -1
- package/dist/actions/init/resolvePackageManager.d.ts +10 -0
- package/dist/actions/init/resolvePackageManager.js +20 -0
- package/dist/actions/init/resolvePackageManager.js.map +1 -0
- package/dist/actions/init/setupMCP.d.ts +21 -0
- package/dist/actions/init/setupMCP.js +258 -0
- package/dist/actions/init/setupMCP.js.map +1 -0
- package/dist/actions/init/templates/appQuickstart.d.ts +3 -0
- package/dist/actions/init/templates/appQuickstart.js +28 -0
- package/dist/actions/init/templates/appQuickstart.js.map +1 -0
- package/dist/actions/init/templates/appSanityUi.d.ts +3 -0
- package/dist/actions/init/templates/appSanityUi.js +30 -0
- package/dist/actions/init/templates/appSanityUi.js.map +1 -0
- package/dist/actions/init/templates/blog.d.ts +3 -0
- package/dist/actions/init/templates/blog.js +4 -0
- package/dist/actions/init/templates/blog.js.map +1 -0
- package/dist/actions/init/templates/clean.d.ts +3 -0
- package/dist/actions/init/templates/clean.js +4 -0
- package/dist/actions/init/templates/clean.js.map +1 -0
- package/dist/actions/init/templates/getStarted.d.ts +3 -0
- package/dist/actions/init/templates/getStarted.js +35 -0
- package/dist/actions/init/templates/getStarted.js.map +1 -0
- package/dist/actions/init/templates/index.d.ts +3 -0
- package/dist/actions/init/templates/index.js +23 -0
- package/dist/actions/init/templates/index.js.map +1 -0
- package/dist/actions/init/templates/moviedb.d.ts +3 -0
- package/dist/actions/init/templates/moviedb.js +34 -0
- package/dist/actions/init/templates/moviedb.js.map +1 -0
- package/dist/actions/init/templates/nextjs/index.d.ts +6 -0
- package/dist/actions/init/templates/nextjs/index.js +213 -0
- package/dist/actions/init/templates/nextjs/index.js.map +1 -0
- package/dist/actions/init/templates/nextjs/schemaTypes/blog.d.ts +3 -0
- package/dist/actions/init/templates/nextjs/schemaTypes/blog.js +247 -0
- package/dist/actions/init/templates/nextjs/schemaTypes/blog.js.map +1 -0
- package/dist/actions/init/templates/quickstart.d.ts +3 -0
- package/dist/actions/init/templates/quickstart.js +4 -0
- package/dist/actions/init/templates/quickstart.js.map +1 -0
- package/dist/actions/init/templates/shopify.d.ts +3 -0
- package/dist/actions/init/templates/shopify.js +77 -0
- package/dist/actions/init/templates/shopify.js.map +1 -0
- package/dist/actions/init/templates/shopifyOnline.d.ts +3 -0
- package/dist/actions/init/templates/shopifyOnline.js +49 -0
- package/dist/actions/init/templates/shopifyOnline.js.map +1 -0
- package/dist/actions/init/types.d.ts +15 -0
- package/dist/actions/init/types.js +3 -0
- package/dist/actions/init/types.js.map +1 -0
- package/dist/actions/init/updateInitialTemplateMetadata.d.ts +1 -0
- package/dist/actions/init/updateInitialTemplateMetadata.js +17 -0
- package/dist/actions/init/updateInitialTemplateMetadata.js.map +1 -0
- package/dist/actions/telemetry/resolveConsent.d.ts +1 -9
- package/dist/actions/telemetry/resolveConsent.js +2 -2
- package/dist/actions/telemetry/resolveConsent.js.map +1 -1
- package/dist/actions/telemetry/setConsent.d.ts +1 -4
- package/dist/actions/telemetry/setConsent.js +4 -8
- package/dist/actions/telemetry/setConsent.js.map +1 -1
- package/dist/commands/init.d.ts +24 -14
- package/dist/commands/init.js +544 -26
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/telemetry/disable.js +0 -1
- package/dist/commands/telemetry/disable.js.map +1 -1
- package/dist/commands/telemetry/enable.js +0 -1
- package/dist/commands/telemetry/enable.js.map +1 -1
- package/dist/commands/telemetry/status.js +1 -3
- package/dist/commands/telemetry/status.js.map +1 -1
- package/dist/hooks/prerun/flushTelemetry.worker.d.ts +2 -0
- package/dist/hooks/prerun/flushTelemetry.worker.js +22 -0
- package/dist/hooks/prerun/flushTelemetry.worker.js.map +1 -0
- package/dist/hooks/prerun/setupTelemetry.js +65 -1
- package/dist/hooks/prerun/setupTelemetry.js.map +1 -1
- package/dist/prompts/init/nextjs.d.ts +5 -0
- package/dist/prompts/init/nextjs.js +56 -0
- package/dist/prompts/init/nextjs.js.map +1 -0
- package/dist/prompts/init/promptForTypescript.d.ts +0 -1
- package/dist/prompts/init/promptForTypescript.js +0 -6
- package/dist/prompts/init/promptForTypescript.js.map +1 -1
- package/dist/services/mcp.d.ts +10 -0
- package/dist/services/mcp.js +16 -0
- package/dist/services/mcp.js.map +1 -1
- package/dist/services/projects.d.ts +5 -2
- package/dist/services/projects.js +37 -0
- package/dist/services/projects.js.map +1 -1
- package/dist/services/telemetry.d.ts +2 -0
- package/dist/services/telemetry.js +20 -0
- package/dist/services/telemetry.js.map +1 -0
- package/dist/studioDependencies.d.ts +16 -0
- package/dist/studioDependencies.js +24 -0
- package/dist/studioDependencies.js.map +1 -0
- package/dist/telemetry/cli.telemetry.d.ts +20 -0
- package/dist/telemetry/cli.telemetry.js +8 -0
- package/dist/telemetry/cli.telemetry.js.map +1 -0
- package/dist/telemetry/store/cleanupOldTelemetryFiles.d.ts +5 -0
- package/dist/telemetry/store/cleanupOldTelemetryFiles.js +30 -0
- package/dist/telemetry/store/cleanupOldTelemetryFiles.js.map +1 -0
- package/dist/telemetry/store/createTelemetryStore.d.ts +39 -0
- package/dist/telemetry/store/createTelemetryStore.js +95 -0
- package/dist/telemetry/store/createTelemetryStore.js.map +1 -0
- package/dist/telemetry/store/createTraceId.d.ts +10 -0
- package/dist/telemetry/store/createTraceId.js +10 -0
- package/dist/telemetry/store/createTraceId.js.map +1 -0
- package/dist/telemetry/store/debug.d.ts +5 -0
- package/dist/telemetry/store/debug.js +7 -0
- package/dist/telemetry/store/debug.js.map +1 -0
- package/dist/telemetry/store/findTelemetryFiles.d.ts +13 -0
- package/dist/telemetry/store/findTelemetryFiles.js +34 -0
- package/dist/telemetry/store/findTelemetryFiles.js.map +1 -0
- package/dist/telemetry/store/flushTelemetryFiles.d.ts +20 -0
- package/dist/telemetry/store/flushTelemetryFiles.js +107 -0
- package/dist/telemetry/store/flushTelemetryFiles.js.map +1 -0
- package/dist/telemetry/store/generateTelemetryFilePath.d.ts +17 -0
- package/dist/telemetry/store/generateTelemetryFilePath.js +30 -0
- package/dist/telemetry/store/generateTelemetryFilePath.js.map +1 -0
- package/dist/telemetry/store/getTelemetryBaseInfo.d.ts +27 -0
- package/dist/telemetry/store/getTelemetryBaseInfo.js +34 -0
- package/dist/telemetry/store/getTelemetryBaseInfo.js.map +1 -0
- package/dist/telemetry/store/logger.d.ts +6 -0
- package/dist/telemetry/store/logger.js +54 -0
- package/dist/telemetry/store/logger.js.map +1 -0
- package/dist/telemetry/store/trace.d.ts +6 -0
- package/dist/telemetry/store/trace.js +150 -0
- package/dist/telemetry/store/trace.js.map +1 -0
- package/dist/telemetry/utils/readNDJSON.d.ts +10 -0
- package/dist/telemetry/utils/readNDJSON.js +18 -0
- package/dist/telemetry/utils/readNDJSON.js.map +1 -0
- package/dist/types.d.ts +33 -0
- package/dist/types.js.map +1 -1
- package/dist/typings/deepSortObject.d.js +2 -0
- package/dist/typings/deepSortObject.d.js.map +1 -0
- package/dist/util/copy.d.ts +5 -0
- package/dist/util/copy.js +37 -0
- package/dist/util/copy.js.map +1 -0
- package/dist/util/detectRuntime.d.ts +8 -0
- package/dist/util/detectRuntime.js +20 -0
- package/dist/util/detectRuntime.js.map +1 -0
- package/dist/util/frameworkPort.d.ts +12 -0
- package/dist/util/frameworkPort.js +61 -0
- package/dist/util/frameworkPort.js.map +1 -0
- package/dist/util/fsUtils.d.ts +2 -0
- package/dist/util/fsUtils.js +34 -0
- package/dist/util/fsUtils.js.map +1 -0
- package/dist/util/getProjectDefaults.d.ts +11 -0
- package/dist/util/getProjectDefaults.js +77 -0
- package/dist/util/getProjectDefaults.js.map +1 -0
- package/dist/util/isStaging.d.ts +7 -0
- package/dist/util/isStaging.js +10 -0
- package/dist/util/isStaging.js.map +1 -0
- package/dist/util/packageManager/packageManagerChoice.d.ts +2 -0
- package/dist/util/packageManager/packageManagerChoice.js +8 -0
- package/dist/util/packageManager/packageManagerChoice.js.map +1 -1
- package/dist/util/parseArguments.d.ts +35 -0
- package/dist/util/parseArguments.js +42 -0
- package/dist/util/parseArguments.js.map +1 -0
- package/dist/util/readdirRecursive.d.ts +5 -0
- package/dist/util/readdirRecursive.js +24 -0
- package/dist/util/readdirRecursive.js.map +1 -0
- package/dist/util/resolveLatestVersions.d.ts +7 -0
- package/dist/util/resolveLatestVersions.js +21 -0
- package/dist/util/resolveLatestVersions.js.map +1 -0
- package/oclif.manifest.json +154 -141
- package/package.json +26 -14
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import sortObject from 'deep-sort-object';
|
|
2
|
+
const manifestPropOrder = [
|
|
3
|
+
'name',
|
|
4
|
+
'private',
|
|
5
|
+
'version',
|
|
6
|
+
'description',
|
|
7
|
+
'main',
|
|
8
|
+
'author',
|
|
9
|
+
'license',
|
|
10
|
+
'scripts',
|
|
11
|
+
'keywords',
|
|
12
|
+
'dependencies',
|
|
13
|
+
'devDependencies'
|
|
14
|
+
];
|
|
15
|
+
export function createPackageManifest(data) {
|
|
16
|
+
const { isAppTemplate } = data;
|
|
17
|
+
const dependencies = data.dependencies ? {
|
|
18
|
+
dependencies: sortObject(data.dependencies)
|
|
19
|
+
} : {};
|
|
20
|
+
const devDependencies = data.devDependencies ? {
|
|
21
|
+
devDependencies: sortObject(data.devDependencies)
|
|
22
|
+
} : {};
|
|
23
|
+
// Don't write a prettier config for SDK apps; we want to allow developers to use their own
|
|
24
|
+
const prettierConfig = isAppTemplate ? {} : {
|
|
25
|
+
prettier: {
|
|
26
|
+
bracketSpacing: false,
|
|
27
|
+
printWidth: 100,
|
|
28
|
+
semi: false,
|
|
29
|
+
singleQuote: true
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const pkg = {
|
|
33
|
+
...getCommonManifest(data),
|
|
34
|
+
keywords: [
|
|
35
|
+
'sanity'
|
|
36
|
+
],
|
|
37
|
+
main: 'package.json',
|
|
38
|
+
scripts: data.scripts || {
|
|
39
|
+
build: 'sanity build',
|
|
40
|
+
deploy: 'sanity deploy',
|
|
41
|
+
'deploy-graphql': 'sanity graphql deploy',
|
|
42
|
+
dev: 'sanity dev',
|
|
43
|
+
start: 'sanity start'
|
|
44
|
+
},
|
|
45
|
+
...dependencies,
|
|
46
|
+
...devDependencies,
|
|
47
|
+
...prettierConfig
|
|
48
|
+
};
|
|
49
|
+
return serializeManifest(pkg);
|
|
50
|
+
}
|
|
51
|
+
function getCommonManifest(data) {
|
|
52
|
+
const pkg = {
|
|
53
|
+
author: data.author,
|
|
54
|
+
description: data.description,
|
|
55
|
+
devDependencies: {},
|
|
56
|
+
license: data.license || 'UNLICENSED',
|
|
57
|
+
name: data.name,
|
|
58
|
+
version: '1.0.0'
|
|
59
|
+
};
|
|
60
|
+
if (pkg.license === 'UNLICENSED') {
|
|
61
|
+
pkg.private = true;
|
|
62
|
+
}
|
|
63
|
+
if (data.gitRemote) {
|
|
64
|
+
pkg.repository = {
|
|
65
|
+
type: 'git',
|
|
66
|
+
url: data.gitRemote
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return pkg;
|
|
70
|
+
}
|
|
71
|
+
function serializeManifest(src) {
|
|
72
|
+
const props = [
|
|
73
|
+
...manifestPropOrder,
|
|
74
|
+
...Object.keys(src)
|
|
75
|
+
];
|
|
76
|
+
const ordered = {};
|
|
77
|
+
for (const prop of props){
|
|
78
|
+
const source = src;
|
|
79
|
+
if (source[prop] !== undefined && ordered[prop] === undefined) {
|
|
80
|
+
ordered[prop] = source[prop];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return `${JSON.stringify(ordered, null, 2)}\n`;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
//# sourceMappingURL=createPackageManifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/init/createPackageManifest.ts"],"sourcesContent":["import sortObject from 'deep-sort-object'\n\nimport {type PackageJson, type SanityJson} from '../../types.js'\n\nconst manifestPropOrder = [\n 'name',\n 'private',\n 'version',\n 'description',\n 'main',\n 'author',\n 'license',\n 'scripts',\n 'keywords',\n 'dependencies',\n 'devDependencies',\n]\n\nexport function createPackageManifest(\n data: Omit<PackageJson, 'version'> & {gitRemote?: string} & {isAppTemplate?: boolean},\n): string {\n const {isAppTemplate} = data\n\n const dependencies = data.dependencies\n ? {dependencies: sortObject(data.dependencies) as Record<string, string>}\n : {}\n\n const devDependencies = data.devDependencies\n ? {devDependencies: sortObject(data.devDependencies) as Record<string, string>}\n : {}\n\n // Don't write a prettier config for SDK apps; we want to allow developers to use their own\n const prettierConfig = isAppTemplate\n ? {}\n : {\n prettier: {\n bracketSpacing: false,\n printWidth: 100,\n semi: false,\n singleQuote: true,\n },\n }\n\n const pkg = {\n ...getCommonManifest(data),\n\n keywords: ['sanity'],\n main: 'package.json',\n scripts: data.scripts || {\n build: 'sanity build',\n deploy: 'sanity deploy',\n 'deploy-graphql': 'sanity graphql deploy',\n dev: 'sanity dev',\n start: 'sanity start',\n },\n\n ...dependencies,\n ...devDependencies,\n ...prettierConfig,\n }\n\n return serializeManifest(pkg)\n}\n\nfunction getCommonManifest(data: Omit<PackageJson, 'version'> & {gitRemote?: string}) {\n const pkg: PackageJson = {\n author: data.author,\n description: data.description,\n devDependencies: {},\n license: data.license || 'UNLICENSED',\n name: data.name,\n version: '1.0.0',\n }\n\n if (pkg.license === 'UNLICENSED') {\n pkg.private = true\n }\n\n if (data.gitRemote) {\n pkg.repository = {\n type: 'git',\n url: data.gitRemote,\n }\n }\n\n return pkg\n}\n\nfunction serializeManifest(src: PackageJson | SanityJson): string {\n const props = [...manifestPropOrder, ...Object.keys(src)]\n const ordered: Record<string, unknown> = {}\n for (const prop of props) {\n const source = src as Record<string, unknown>\n if (source[prop] !== undefined && ordered[prop] === undefined) {\n ordered[prop] = source[prop]\n }\n }\n\n return `${JSON.stringify(ordered, null, 2)}\\n`\n}\n"],"names":["sortObject","manifestPropOrder","createPackageManifest","data","isAppTemplate","dependencies","devDependencies","prettierConfig","prettier","bracketSpacing","printWidth","semi","singleQuote","pkg","getCommonManifest","keywords","main","scripts","build","deploy","dev","start","serializeManifest","author","description","license","name","version","private","gitRemote","repository","type","url","src","props","Object","keys","ordered","prop","source","undefined","JSON","stringify"],"mappings":"AAAA,OAAOA,gBAAgB,mBAAkB;AAIzC,MAAMC,oBAAoB;IACxB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAED,OAAO,SAASC,sBACdC,IAAqF;IAErF,MAAM,EAACC,aAAa,EAAC,GAAGD;IAExB,MAAME,eAAeF,KAAKE,YAAY,GAClC;QAACA,cAAcL,WAAWG,KAAKE,YAAY;IAA2B,IACtE,CAAC;IAEL,MAAMC,kBAAkBH,KAAKG,eAAe,GACxC;QAACA,iBAAiBN,WAAWG,KAAKG,eAAe;IAA2B,IAC5E,CAAC;IAEL,2FAA2F;IAC3F,MAAMC,iBAAiBH,gBACnB,CAAC,IACD;QACEI,UAAU;YACRC,gBAAgB;YAChBC,YAAY;YACZC,MAAM;YACNC,aAAa;QACf;IACF;IAEJ,MAAMC,MAAM;QACV,GAAGC,kBAAkBX,KAAK;QAE1BY,UAAU;YAAC;SAAS;QACpBC,MAAM;QACNC,SAASd,KAAKc,OAAO,IAAI;YACvBC,OAAO;YACPC,QAAQ;YACR,kBAAkB;YAClBC,KAAK;YACLC,OAAO;QACT;QAEA,GAAGhB,YAAY;QACf,GAAGC,eAAe;QAClB,GAAGC,cAAc;IACnB;IAEA,OAAOe,kBAAkBT;AAC3B;AAEA,SAASC,kBAAkBX,IAAyD;IAClF,MAAMU,MAAmB;QACvBU,QAAQpB,KAAKoB,MAAM;QACnBC,aAAarB,KAAKqB,WAAW;QAC7BlB,iBAAiB,CAAC;QAClBmB,SAAStB,KAAKsB,OAAO,IAAI;QACzBC,MAAMvB,KAAKuB,IAAI;QACfC,SAAS;IACX;IAEA,IAAId,IAAIY,OAAO,KAAK,cAAc;QAChCZ,IAAIe,OAAO,GAAG;IAChB;IAEA,IAAIzB,KAAK0B,SAAS,EAAE;QAClBhB,IAAIiB,UAAU,GAAG;YACfC,MAAM;YACNC,KAAK7B,KAAK0B,SAAS;QACrB;IACF;IAEA,OAAOhB;AACT;AAEA,SAASS,kBAAkBW,GAA6B;IACtD,MAAMC,QAAQ;WAAIjC;WAAsBkC,OAAOC,IAAI,CAACH;KAAK;IACzD,MAAMI,UAAmC,CAAC;IAC1C,KAAK,MAAMC,QAAQJ,MAAO;QACxB,MAAMK,SAASN;QACf,IAAIM,MAAM,CAACD,KAAK,KAAKE,aAAaH,OAAO,CAACC,KAAK,KAAKE,WAAW;YAC7DH,OAAO,CAACC,KAAK,GAAGC,MAAM,CAACD,KAAK;QAC9B;IACF;IAEA,OAAO,GAAGG,KAAKC,SAAS,CAACL,SAAS,MAAM,GAAG,EAAE,CAAC;AAChD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface GenerateConfigOptions {
|
|
2
|
+
variables: {
|
|
3
|
+
autoUpdates: boolean;
|
|
4
|
+
dataset: string;
|
|
5
|
+
organizationId?: string;
|
|
6
|
+
projectId: string;
|
|
7
|
+
projectName?: string;
|
|
8
|
+
sourceName?: string;
|
|
9
|
+
sourceTitle?: string;
|
|
10
|
+
};
|
|
11
|
+
template?: ((variables: GenerateConfigOptions['variables']) => string) | string;
|
|
12
|
+
}
|
|
13
|
+
export declare function createStudioConfig(options: GenerateConfigOptions): string;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { processTemplate } from './processTemplate.js';
|
|
2
|
+
const defaultTemplate = `
|
|
3
|
+
import {defineConfig} from 'sanity'
|
|
4
|
+
import {structureTool} from 'sanity/structure'
|
|
5
|
+
import {visionTool} from '@sanity/vision'
|
|
6
|
+
import {schemaTypes} from './schemaTypes'
|
|
7
|
+
|
|
8
|
+
export default defineConfig({
|
|
9
|
+
name: '%sourceName%',
|
|
10
|
+
title: '%projectName%',
|
|
11
|
+
|
|
12
|
+
projectId: '%projectId%',
|
|
13
|
+
dataset: '%dataset%',
|
|
14
|
+
|
|
15
|
+
plugins: [structureTool(), visionTool()],
|
|
16
|
+
|
|
17
|
+
schema: {
|
|
18
|
+
types: schemaTypes,
|
|
19
|
+
},
|
|
20
|
+
})
|
|
21
|
+
`;
|
|
22
|
+
const defaultVariables = {
|
|
23
|
+
projectName: 'Sanity Studio',
|
|
24
|
+
sourceName: 'default',
|
|
25
|
+
sourceTitle: 'Default'
|
|
26
|
+
};
|
|
27
|
+
export function createStudioConfig(options) {
|
|
28
|
+
const variables = {
|
|
29
|
+
...defaultVariables,
|
|
30
|
+
...options.variables
|
|
31
|
+
};
|
|
32
|
+
if (typeof options.template === 'function') {
|
|
33
|
+
return options.template(variables).trimStart();
|
|
34
|
+
}
|
|
35
|
+
return processTemplate({
|
|
36
|
+
template: options.template || defaultTemplate,
|
|
37
|
+
variables
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=createStudioConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/init/createStudioConfig.ts"],"sourcesContent":["import {processTemplate} from './processTemplate.js'\n\nconst defaultTemplate = `\nimport {defineConfig} from 'sanity'\nimport {structureTool} from 'sanity/structure'\nimport {visionTool} from '@sanity/vision'\nimport {schemaTypes} from './schemaTypes'\n\nexport default defineConfig({\n name: '%sourceName%',\n title: '%projectName%',\n\n projectId: '%projectId%',\n dataset: '%dataset%',\n\n plugins: [structureTool(), visionTool()],\n\n schema: {\n types: schemaTypes,\n },\n})\n`\n\nconst defaultVariables = {\n projectName: 'Sanity Studio',\n sourceName: 'default',\n sourceTitle: 'Default',\n}\n\nexport interface GenerateConfigOptions {\n variables: {\n autoUpdates: boolean\n dataset: string\n organizationId?: string\n projectId: string\n projectName?: string\n sourceName?: string\n sourceTitle?: string\n }\n\n template?: ((variables: GenerateConfigOptions['variables']) => string) | string\n}\n\nexport function createStudioConfig(options: GenerateConfigOptions): string {\n const variables = {...defaultVariables, ...options.variables}\n if (typeof options.template === 'function') {\n return options.template(variables).trimStart()\n }\n\n return processTemplate({\n template: options.template || defaultTemplate,\n variables,\n })\n}\n"],"names":["processTemplate","defaultTemplate","defaultVariables","projectName","sourceName","sourceTitle","createStudioConfig","options","variables","template","trimStart"],"mappings":"AAAA,SAAQA,eAAe,QAAO,uBAAsB;AAEpD,MAAMC,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;;AAmBzB,CAAC;AAED,MAAMC,mBAAmB;IACvBC,aAAa;IACbC,YAAY;IACZC,aAAa;AACf;AAgBA,OAAO,SAASC,mBAAmBC,OAA8B;IAC/D,MAAMC,YAAY;QAAC,GAAGN,gBAAgB;QAAE,GAAGK,QAAQC,SAAS;IAAA;IAC5D,IAAI,OAAOD,QAAQE,QAAQ,KAAK,YAAY;QAC1C,OAAOF,QAAQE,QAAQ,CAACD,WAAWE,SAAS;IAC9C;IAEA,OAAOV,gBAAgB;QACrBS,UAAUF,QAAQE,QAAQ,IAAIR;QAC9BO;IACF;AACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Output } from '@sanity/cli-core';
|
|
2
|
+
import { VersionedFramework } from '../types.js';
|
|
3
|
+
interface CreateOrAppendEnvVarsOptions {
|
|
4
|
+
envVars: Record<string, string>;
|
|
5
|
+
filename: string;
|
|
6
|
+
framework: VersionedFramework | null;
|
|
7
|
+
log: boolean;
|
|
8
|
+
output: Output;
|
|
9
|
+
outputPath: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function createOrAppendEnvVars({ envVars, filename, framework, log, output, outputPath, }: CreateOrAppendEnvVarsOptions): Promise<void>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { CLIError } from '@oclif/core/errors';
|
|
2
|
+
import { chalk } from '@sanity/cli-core/ux';
|
|
3
|
+
import { writeEnvVarsToFile } from './writeEnvVarsToFile.js';
|
|
4
|
+
export async function createOrAppendEnvVars({ envVars, filename, framework, log, output, outputPath }) {
|
|
5
|
+
try {
|
|
6
|
+
if (framework && framework.envPrefix && log) {
|
|
7
|
+
output.log(`\nDetected framework ${chalk.blue(framework?.name)}, using prefix '${framework.envPrefix}'`);
|
|
8
|
+
}
|
|
9
|
+
await writeEnvVarsToFile({
|
|
10
|
+
envVars,
|
|
11
|
+
filename,
|
|
12
|
+
framework,
|
|
13
|
+
log,
|
|
14
|
+
output,
|
|
15
|
+
outputPath
|
|
16
|
+
});
|
|
17
|
+
} catch (err) {
|
|
18
|
+
output.error(err);
|
|
19
|
+
throw new CLIError('An error occurred while creating .env', {
|
|
20
|
+
exit: 1
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=createOrAppendEnvVars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/env/createOrAppendEnvVars.ts"],"sourcesContent":["import {CLIError} from '@oclif/core/errors'\nimport {Output} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\n\nimport {VersionedFramework} from '../types.js'\nimport {writeEnvVarsToFile} from './writeEnvVarsToFile.js'\n\ninterface CreateOrAppendEnvVarsOptions {\n envVars: Record<string, string>\n filename: string\n framework: VersionedFramework | null\n log: boolean\n output: Output\n outputPath: string\n}\n\nexport async function createOrAppendEnvVars({\n envVars,\n filename,\n framework,\n log,\n output,\n outputPath,\n}: CreateOrAppendEnvVarsOptions) {\n try {\n if (framework && framework.envPrefix && log) {\n output.log(\n `\\nDetected framework ${chalk.blue(framework?.name)}, using prefix '${\n framework.envPrefix\n }'`,\n )\n }\n\n await writeEnvVarsToFile({\n envVars,\n filename,\n framework,\n log,\n output,\n outputPath,\n })\n } catch (err) {\n output.error(err)\n throw new CLIError('An error occurred while creating .env', {exit: 1})\n }\n}\n"],"names":["CLIError","chalk","writeEnvVarsToFile","createOrAppendEnvVars","envVars","filename","framework","log","output","outputPath","envPrefix","blue","name","err","error","exit"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,qBAAoB;AAE3C,SAAQC,KAAK,QAAO,sBAAqB;AAGzC,SAAQC,kBAAkB,QAAO,0BAAyB;AAW1D,OAAO,eAAeC,sBAAsB,EAC1CC,OAAO,EACPC,QAAQ,EACRC,SAAS,EACTC,GAAG,EACHC,MAAM,EACNC,UAAU,EACmB;IAC7B,IAAI;QACF,IAAIH,aAAaA,UAAUI,SAAS,IAAIH,KAAK;YAC3CC,OAAOD,GAAG,CACR,CAAC,qBAAqB,EAAEN,MAAMU,IAAI,CAACL,WAAWM,MAAM,gBAAgB,EAClEN,UAAUI,SAAS,CACpB,CAAC,CAAC;QAEP;QAEA,MAAMR,mBAAmB;YACvBE;YACAC;YACAC;YACAC;YACAC;YACAC;QACF;IACF,EAAE,OAAOI,KAAK;QACZL,OAAOM,KAAK,CAACD;QACb,MAAM,IAAIb,SAAS,yCAAyC;YAACe,MAAM;QAAC;IACtE;AACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Output } from '@sanity/cli-core';
|
|
2
|
+
interface ParseAndUpdateEnvVarsOptions {
|
|
3
|
+
envVars: Record<string, string>;
|
|
4
|
+
fileContents: string;
|
|
5
|
+
log: boolean;
|
|
6
|
+
output: Output;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseAndUpdateEnvVars({ envVars, fileContents, log, output, }: ParseAndUpdateEnvVarsOptions): string;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import dotenv from 'dotenv';
|
|
2
|
+
export function parseAndUpdateEnvVars({ envVars, fileContents, log, output }) {
|
|
3
|
+
const existingKeys = dotenv.parse(fileContents) // this will contain all vars
|
|
4
|
+
;
|
|
5
|
+
const updatedKeys = {} // this will only contain our vars
|
|
6
|
+
;
|
|
7
|
+
// find and update keys
|
|
8
|
+
for (const [key, value] of Object.entries(envVars)){
|
|
9
|
+
if (!existingKeys[key]) {
|
|
10
|
+
updatedKeys[key] = value;
|
|
11
|
+
if (log) {
|
|
12
|
+
output.log(`Appended ${key}="${envVars[key]}"`);
|
|
13
|
+
}
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (log) {
|
|
17
|
+
output.log(`Found existing ${key}, replacing value.`);
|
|
18
|
+
}
|
|
19
|
+
updatedKeys[key] = value;
|
|
20
|
+
}
|
|
21
|
+
// clone fileContents and replace existing keys by string matching
|
|
22
|
+
let updatedEnv = fileContents;
|
|
23
|
+
for (const [key, value] of Object.entries(updatedKeys)){
|
|
24
|
+
if (existingKeys[key]) {
|
|
25
|
+
const existingValue = existingKeys[key];
|
|
26
|
+
updatedEnv = updatedEnv.split('\n').map((line)=>{
|
|
27
|
+
if (!line.trim().startsWith('#') && // ignore comments
|
|
28
|
+
new RegExp(String.raw`(^\s*${key})((: )|( *=))`).test(line) // match key
|
|
29
|
+
) {
|
|
30
|
+
return line.replace(existingValue, value);
|
|
31
|
+
}
|
|
32
|
+
return line;
|
|
33
|
+
}).join('\n');
|
|
34
|
+
} else {
|
|
35
|
+
updatedEnv = `${updatedEnv.trim()}\n${key}="${value}"`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// if file is empty, add a newline
|
|
39
|
+
return `${updatedEnv}${fileContents === '' ? '\n' : ''}`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=parseAndUpdateEnvVars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/env/parseAndUpdateEnvVars.ts"],"sourcesContent":["import {Output} from '@sanity/cli-core'\nimport dotenv from 'dotenv'\n\ninterface ParseAndUpdateEnvVarsOptions {\n envVars: Record<string, string>\n fileContents: string\n log: boolean\n output: Output\n}\n\nexport function parseAndUpdateEnvVars({\n envVars,\n fileContents,\n log,\n output,\n}: ParseAndUpdateEnvVarsOptions): string {\n const existingKeys = dotenv.parse(fileContents) // this will contain all vars\n const updatedKeys: Record<string, string> = {} // this will only contain our vars\n\n // find and update keys\n for (const [key, value] of Object.entries(envVars)) {\n if (!existingKeys[key]) {\n updatedKeys[key] = value\n\n if (log) {\n output.log(`Appended ${key}=\"${envVars[key]}\"`)\n }\n\n continue\n }\n\n if (log) {\n output.log(`Found existing ${key}, replacing value.`)\n }\n updatedKeys[key] = value\n }\n\n // clone fileContents and replace existing keys by string matching\n let updatedEnv = fileContents\n for (const [key, value] of Object.entries(updatedKeys)) {\n if (existingKeys[key]) {\n const existingValue = existingKeys[key]\n\n updatedEnv = updatedEnv\n .split('\\n')\n .map((line) => {\n if (\n !line.trim().startsWith('#') && // ignore comments\n new RegExp(String.raw`(^\\s*${key})((: )|( *=))`).test(line) // match key\n ) {\n return line.replace(existingValue, value)\n }\n return line\n })\n .join('\\n')\n } else {\n updatedEnv = `${updatedEnv.trim()}\\n${key}=\"${value}\"`\n }\n }\n\n // if file is empty, add a newline\n return `${updatedEnv}${fileContents === '' ? '\\n' : ''}`\n}\n"],"names":["dotenv","parseAndUpdateEnvVars","envVars","fileContents","log","output","existingKeys","parse","updatedKeys","key","value","Object","entries","updatedEnv","existingValue","split","map","line","trim","startsWith","RegExp","String","raw","test","replace","join"],"mappings":"AACA,OAAOA,YAAY,SAAQ;AAS3B,OAAO,SAASC,sBAAsB,EACpCC,OAAO,EACPC,YAAY,EACZC,GAAG,EACHC,MAAM,EACuB;IAC7B,MAAMC,eAAeN,OAAOO,KAAK,CAACJ,cAAc,6BAA6B;;IAC7E,MAAMK,cAAsC,CAAC,EAAE,kCAAkC;;IAEjF,uBAAuB;IACvB,KAAK,MAAM,CAACC,KAAKC,MAAM,IAAIC,OAAOC,OAAO,CAACV,SAAU;QAClD,IAAI,CAACI,YAAY,CAACG,IAAI,EAAE;YACtBD,WAAW,CAACC,IAAI,GAAGC;YAEnB,IAAIN,KAAK;gBACPC,OAAOD,GAAG,CAAC,CAAC,SAAS,EAAEK,IAAI,EAAE,EAAEP,OAAO,CAACO,IAAI,CAAC,CAAC,CAAC;YAChD;YAEA;QACF;QAEA,IAAIL,KAAK;YACPC,OAAOD,GAAG,CAAC,CAAC,eAAe,EAAEK,IAAI,kBAAkB,CAAC;QACtD;QACAD,WAAW,CAACC,IAAI,GAAGC;IACrB;IAEA,kEAAkE;IAClE,IAAIG,aAAaV;IACjB,KAAK,MAAM,CAACM,KAAKC,MAAM,IAAIC,OAAOC,OAAO,CAACJ,aAAc;QACtD,IAAIF,YAAY,CAACG,IAAI,EAAE;YACrB,MAAMK,gBAAgBR,YAAY,CAACG,IAAI;YAEvCI,aAAaA,WACVE,KAAK,CAAC,MACNC,GAAG,CAAC,CAACC;gBACJ,IACE,CAACA,KAAKC,IAAI,GAAGC,UAAU,CAAC,QAAQ,kBAAkB;gBAClD,IAAIC,OAAOC,OAAOC,GAAG,CAAC,KAAK,EAAEb,IAAI,aAAa,CAAC,EAAEc,IAAI,CAACN,MAAM,YAAY;kBACxE;oBACA,OAAOA,KAAKO,OAAO,CAACV,eAAeJ;gBACrC;gBACA,OAAOO;YACT,GACCQ,IAAI,CAAC;QACV,OAAO;YACLZ,aAAa,GAAGA,WAAWK,IAAI,GAAG,EAAE,EAAET,IAAI,EAAE,EAAEC,MAAM,CAAC,CAAC;QACxD;IACF;IAEA,kCAAkC;IAClC,OAAO,GAAGG,aAAaV,iBAAiB,KAAK,OAAO,IAAI;AAC1D"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Output } from '@sanity/cli-core';
|
|
2
|
+
import { VersionedFramework } from '../types.js';
|
|
3
|
+
interface WriteEnvVarsToFileOptions {
|
|
4
|
+
envVars: Record<string, string>;
|
|
5
|
+
filename: string;
|
|
6
|
+
framework: VersionedFramework | null;
|
|
7
|
+
log: boolean;
|
|
8
|
+
output: Output;
|
|
9
|
+
outputPath: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function writeEnvVarsToFile({ envVars, filename, framework, log, output, outputPath, }: WriteEnvVarsToFileOptions): Promise<void>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { subdebug } from '@sanity/cli-core';
|
|
4
|
+
import { chalk } from '@sanity/cli-core/ux';
|
|
5
|
+
import { parseAndUpdateEnvVars } from './parseAndUpdateEnvVars.js';
|
|
6
|
+
const debug = subdebug('init:writeEnvVarsToFile');
|
|
7
|
+
export async function writeEnvVarsToFile({ envVars, filename, framework, log, output, outputPath }) {
|
|
8
|
+
const envPrefix = framework?.envPrefix || '';
|
|
9
|
+
const keyPrefix = envPrefix.includes('SANITY') ? envPrefix : `${envPrefix}SANITY_`;
|
|
10
|
+
const fileOutputPath = path.join(outputPath, filename);
|
|
11
|
+
// prepend framework and sanity prefix to envVars
|
|
12
|
+
for (const key of Object.keys(envVars)){
|
|
13
|
+
envVars[`${keyPrefix}${key}`] = envVars[key];
|
|
14
|
+
delete envVars[key];
|
|
15
|
+
}
|
|
16
|
+
// make folder if not exists (if output path is specified)
|
|
17
|
+
await fs.mkdir(outputPath, {
|
|
18
|
+
recursive: true
|
|
19
|
+
}).catch(()=>debug('Error creating folder %s', outputPath));
|
|
20
|
+
// time to update or create the file
|
|
21
|
+
const existingEnv = await fs.readFile(fileOutputPath, {
|
|
22
|
+
encoding: 'utf8'
|
|
23
|
+
}).catch((err)=>err.code === 'ENOENT' ? '' : Promise.reject(err));
|
|
24
|
+
const updatedEnv = parseAndUpdateEnvVars({
|
|
25
|
+
envVars,
|
|
26
|
+
fileContents: existingEnv,
|
|
27
|
+
log,
|
|
28
|
+
output
|
|
29
|
+
});
|
|
30
|
+
const warningComment = [
|
|
31
|
+
'# Warning: Do not add secrets (API keys and similar) to this file, as it source controlled!',
|
|
32
|
+
'# Use `.env.local` for any secrets, and ensure it is not added to source control'
|
|
33
|
+
].join('\n');
|
|
34
|
+
const shouldPrependWarning = filename !== '.env.local' && !existingEnv.includes(warningComment);
|
|
35
|
+
if (shouldPrependWarning) {
|
|
36
|
+
await fs.writeFile(fileOutputPath, `${warningComment}\n\n${updatedEnv}`, {
|
|
37
|
+
encoding: 'utf8'
|
|
38
|
+
});
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
await fs.writeFile(fileOutputPath, updatedEnv, {
|
|
42
|
+
encoding: 'utf8'
|
|
43
|
+
});
|
|
44
|
+
if (log) {
|
|
45
|
+
output.log(`\n${chalk.green('Success!')} Environment variables written to ${fileOutputPath}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=writeEnvVarsToFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/actions/init/env/writeEnvVarsToFile.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport {Output, subdebug} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\n\nimport {VersionedFramework} from '../types.js'\nimport {parseAndUpdateEnvVars} from './parseAndUpdateEnvVars.js'\n\nconst debug = subdebug('init:writeEnvVarsToFile')\n\ninterface WriteEnvVarsToFileOptions {\n envVars: Record<string, string>\n filename: string\n framework: VersionedFramework | null\n log: boolean\n output: Output\n outputPath: string\n}\n\nexport async function writeEnvVarsToFile({\n envVars,\n filename,\n framework,\n log,\n output,\n outputPath,\n}: WriteEnvVarsToFileOptions) {\n const envPrefix = framework?.envPrefix || ''\n const keyPrefix = envPrefix.includes('SANITY') ? envPrefix : `${envPrefix}SANITY_`\n const fileOutputPath = path.join(outputPath, filename)\n\n // prepend framework and sanity prefix to envVars\n for (const key of Object.keys(envVars)) {\n envVars[`${keyPrefix}${key}`] = envVars[key]\n delete envVars[key]\n }\n\n // make folder if not exists (if output path is specified)\n await fs\n .mkdir(outputPath, {recursive: true})\n .catch(() => debug('Error creating folder %s', outputPath))\n\n // time to update or create the file\n const existingEnv = await fs\n .readFile(fileOutputPath, {encoding: 'utf8'})\n .catch((err) => (err.code === 'ENOENT' ? '' : Promise.reject(err)))\n\n const updatedEnv = parseAndUpdateEnvVars({\n envVars,\n fileContents: existingEnv,\n log,\n output,\n })\n\n const warningComment = [\n '# Warning: Do not add secrets (API keys and similar) to this file, as it source controlled!',\n '# Use `.env.local` for any secrets, and ensure it is not added to source control',\n ].join('\\n')\n const shouldPrependWarning = filename !== '.env.local' && !existingEnv.includes(warningComment)\n if (shouldPrependWarning) {\n await fs.writeFile(fileOutputPath, `${warningComment}\\n\\n${updatedEnv}`, {\n encoding: 'utf8',\n })\n return\n }\n\n await fs.writeFile(fileOutputPath, updatedEnv, {\n encoding: 'utf8',\n })\n\n if (log) {\n output.log(`\\n${chalk.green('Success!')} Environment variables written to ${fileOutputPath}`)\n }\n}\n"],"names":["fs","path","subdebug","chalk","parseAndUpdateEnvVars","debug","writeEnvVarsToFile","envVars","filename","framework","log","output","outputPath","envPrefix","keyPrefix","includes","fileOutputPath","join","key","Object","keys","mkdir","recursive","catch","existingEnv","readFile","encoding","err","code","Promise","reject","updatedEnv","fileContents","warningComment","shouldPrependWarning","writeFile","green"],"mappings":"AAAA,OAAOA,QAAQ,mBAAkB;AACjC,OAAOC,UAAU,YAAW;AAE5B,SAAgBC,QAAQ,QAAO,mBAAkB;AACjD,SAAQC,KAAK,QAAO,sBAAqB;AAGzC,SAAQC,qBAAqB,QAAO,6BAA4B;AAEhE,MAAMC,QAAQH,SAAS;AAWvB,OAAO,eAAeI,mBAAmB,EACvCC,OAAO,EACPC,QAAQ,EACRC,SAAS,EACTC,GAAG,EACHC,MAAM,EACNC,UAAU,EACgB;IAC1B,MAAMC,YAAYJ,WAAWI,aAAa;IAC1C,MAAMC,YAAYD,UAAUE,QAAQ,CAAC,YAAYF,YAAY,GAAGA,UAAU,OAAO,CAAC;IAClF,MAAMG,iBAAiBf,KAAKgB,IAAI,CAACL,YAAYJ;IAE7C,iDAAiD;IACjD,KAAK,MAAMU,OAAOC,OAAOC,IAAI,CAACb,SAAU;QACtCA,OAAO,CAAC,GAAGO,YAAYI,KAAK,CAAC,GAAGX,OAAO,CAACW,IAAI;QAC5C,OAAOX,OAAO,CAACW,IAAI;IACrB;IAEA,0DAA0D;IAC1D,MAAMlB,GACHqB,KAAK,CAACT,YAAY;QAACU,WAAW;IAAI,GAClCC,KAAK,CAAC,IAAMlB,MAAM,4BAA4BO;IAEjD,oCAAoC;IACpC,MAAMY,cAAc,MAAMxB,GACvByB,QAAQ,CAACT,gBAAgB;QAACU,UAAU;IAAM,GAC1CH,KAAK,CAAC,CAACI,MAASA,IAAIC,IAAI,KAAK,WAAW,KAAKC,QAAQC,MAAM,CAACH;IAE/D,MAAMI,aAAa3B,sBAAsB;QACvCG;QACAyB,cAAcR;QACdd;QACAC;IACF;IAEA,MAAMsB,iBAAiB;QACrB;QACA;KACD,CAAChB,IAAI,CAAC;IACP,MAAMiB,uBAAuB1B,aAAa,gBAAgB,CAACgB,YAAYT,QAAQ,CAACkB;IAChF,IAAIC,sBAAsB;QACxB,MAAMlC,GAAGmC,SAAS,CAACnB,gBAAgB,GAAGiB,eAAe,IAAI,EAAEF,YAAY,EAAE;YACvEL,UAAU;QACZ;QACA;IACF;IAEA,MAAM1B,GAAGmC,SAAS,CAACnB,gBAAgBe,YAAY;QAC7CL,UAAU;IACZ;IAEA,IAAIhB,KAAK;QACPC,OAAOD,GAAG,CAAC,CAAC,EAAE,EAAEP,MAAMiC,KAAK,CAAC,YAAY,kCAAkC,EAAEpB,gBAAgB;IAC9F;AACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetches the post-init MCP prompt from the Journey API and interpolates editor names.
|
|
3
|
+
* Falls back to a hardcoded default if the API call fails, times out, or returns empty.
|
|
4
|
+
* Text wrapped in **markers** will be formatted with cyan color.
|
|
5
|
+
*/
|
|
6
|
+
export declare function fetchPostInitPrompt(editorNames: string): Promise<string>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { chalk } from '@sanity/cli-core/ux';
|
|
2
|
+
import { getPostInitPrompt } from '../../services/mcp.js';
|
|
3
|
+
const DEFAULT_MESSAGE = 'To set up your project with the MCP server, restart {{editorNames}} and type **"Get started with Sanity"** in the chat.';
|
|
4
|
+
/**
|
|
5
|
+
* Applies cyan formatting to text wrapped in **markers**.
|
|
6
|
+
*/ function applyCyanFormatting(text) {
|
|
7
|
+
return text.replaceAll(/\*\*([^*]+)\*\*/g, (_, content)=>chalk.cyan(content));
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Interpolates the editor names into the template.
|
|
11
|
+
*/ function interpolateTemplate(template, editorNames) {
|
|
12
|
+
return template.replaceAll('{{editorNames}}', editorNames);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Fetches the post-init MCP prompt from the Journey API and interpolates editor names.
|
|
16
|
+
* Falls back to a hardcoded default if the API call fails, times out, or returns empty.
|
|
17
|
+
* Text wrapped in **markers** will be formatted with cyan color.
|
|
18
|
+
*/ export async function fetchPostInitPrompt(editorNames) {
|
|
19
|
+
try {
|
|
20
|
+
const data = await getPostInitPrompt();
|
|
21
|
+
const template = data?.message || DEFAULT_MESSAGE;
|
|
22
|
+
const interpolated = interpolateTemplate(template, editorNames);
|
|
23
|
+
return applyCyanFormatting(interpolated);
|
|
24
|
+
} catch {
|
|
25
|
+
const interpolated = interpolateTemplate(DEFAULT_MESSAGE, editorNames);
|
|
26
|
+
return applyCyanFormatting(interpolated);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=fetchPostInitPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/init/fetchPostInitPrompt.ts"],"sourcesContent":["import {chalk} from '@sanity/cli-core/ux'\n\nimport {getPostInitPrompt} from '../../services/mcp.js'\n\nconst DEFAULT_MESSAGE =\n 'To set up your project with the MCP server, restart {{editorNames}} and type **\"Get started with Sanity\"** in the chat.'\n\n/**\n * Applies cyan formatting to text wrapped in **markers**.\n */\nfunction applyCyanFormatting(text: string): string {\n return text.replaceAll(/\\*\\*([^*]+)\\*\\*/g, (_, content) => chalk.cyan(content))\n}\n\n/**\n * Interpolates the editor names into the template.\n */\nfunction interpolateTemplate(template: string, editorNames: string): string {\n return template.replaceAll('{{editorNames}}', editorNames)\n}\n\n/**\n * Fetches the post-init MCP prompt from the Journey API and interpolates editor names.\n * Falls back to a hardcoded default if the API call fails, times out, or returns empty.\n * Text wrapped in **markers** will be formatted with cyan color.\n */\nexport async function fetchPostInitPrompt(editorNames: string): Promise<string> {\n try {\n const data = await getPostInitPrompt()\n const template = data?.message || DEFAULT_MESSAGE\n const interpolated = interpolateTemplate(template, editorNames)\n return applyCyanFormatting(interpolated)\n } catch {\n const interpolated = interpolateTemplate(DEFAULT_MESSAGE, editorNames)\n return applyCyanFormatting(interpolated)\n }\n}\n"],"names":["chalk","getPostInitPrompt","DEFAULT_MESSAGE","applyCyanFormatting","text","replaceAll","_","content","cyan","interpolateTemplate","template","editorNames","fetchPostInitPrompt","data","message","interpolated"],"mappings":"AAAA,SAAQA,KAAK,QAAO,sBAAqB;AAEzC,SAAQC,iBAAiB,QAAO,wBAAuB;AAEvD,MAAMC,kBACJ;AAEF;;CAEC,GACD,SAASC,oBAAoBC,IAAY;IACvC,OAAOA,KAAKC,UAAU,CAAC,oBAAoB,CAACC,GAAGC,UAAYP,MAAMQ,IAAI,CAACD;AACxE;AAEA;;CAEC,GACD,SAASE,oBAAoBC,QAAgB,EAAEC,WAAmB;IAChE,OAAOD,SAASL,UAAU,CAAC,mBAAmBM;AAChD;AAEA;;;;CAIC,GACD,OAAO,eAAeC,oBAAoBD,WAAmB;IAC3D,IAAI;QACF,MAAME,OAAO,MAAMZ;QACnB,MAAMS,WAAWG,MAAMC,WAAWZ;QAClC,MAAMa,eAAeN,oBAAoBC,UAAUC;QACnD,OAAOR,oBAAoBY;IAC7B,EAAE,OAAM;QACN,MAAMA,eAAeN,oBAAoBP,iBAAiBS;QAC1D,OAAOR,oBAAoBY;IAC7B;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function tryGitInit(rootDir: string, commitMessage?: string): boolean;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { execFileSync, execSync } from 'node:child_process';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { rimrafSync } from 'rimraf';
|
|
4
|
+
const defaultCommitMessage = 'feat: bootstrap sanity studio';
|
|
5
|
+
export function tryGitInit(rootDir, commitMessage) {
|
|
6
|
+
const execOptions = {
|
|
7
|
+
cwd: rootDir,
|
|
8
|
+
stdio: 'ignore'
|
|
9
|
+
};
|
|
10
|
+
let didInit = false;
|
|
11
|
+
try {
|
|
12
|
+
execSync('git --version', execOptions);
|
|
13
|
+
if (isInGitRepository(rootDir) || isInMercurialRepository(rootDir)) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
execSync('git init', execOptions);
|
|
17
|
+
didInit = true;
|
|
18
|
+
execSync('git checkout -b main', execOptions);
|
|
19
|
+
execSync('git add -A', execOptions);
|
|
20
|
+
execFileSync('git', [
|
|
21
|
+
'commit',
|
|
22
|
+
'-m',
|
|
23
|
+
commitMessage || defaultCommitMessage
|
|
24
|
+
], {
|
|
25
|
+
cwd: rootDir,
|
|
26
|
+
stdio: 'ignore'
|
|
27
|
+
});
|
|
28
|
+
return true;
|
|
29
|
+
} catch {
|
|
30
|
+
if (didInit) {
|
|
31
|
+
try {
|
|
32
|
+
rimrafSync(path.join(rootDir, '.git'));
|
|
33
|
+
} catch {
|
|
34
|
+
// intentional noop
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function isInGitRepository(rootDir) {
|
|
41
|
+
try {
|
|
42
|
+
execSync('git rev-parse --is-inside-work-tree', {
|
|
43
|
+
cwd: rootDir,
|
|
44
|
+
stdio: 'ignore'
|
|
45
|
+
});
|
|
46
|
+
return true;
|
|
47
|
+
} catch {
|
|
48
|
+
// intentional noop
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
function isInMercurialRepository(rootDir) {
|
|
53
|
+
try {
|
|
54
|
+
execSync('hg --cwd . root', {
|
|
55
|
+
cwd: rootDir,
|
|
56
|
+
stdio: 'ignore'
|
|
57
|
+
});
|
|
58
|
+
return true;
|
|
59
|
+
} catch {
|
|
60
|
+
// intentional noop
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/init/git.ts"],"sourcesContent":["import {execFileSync, execSync, type ExecSyncOptions} from 'node:child_process'\nimport path from 'node:path'\n\nimport {rimrafSync} from 'rimraf'\n\nconst defaultCommitMessage = 'feat: bootstrap sanity studio'\n\nexport function tryGitInit(rootDir: string, commitMessage?: string): boolean {\n const execOptions: ExecSyncOptions = {cwd: rootDir, stdio: 'ignore'}\n\n let didInit = false\n try {\n execSync('git --version', execOptions)\n if (isInGitRepository(rootDir) || isInMercurialRepository(rootDir)) {\n return false\n }\n\n execSync('git init', execOptions)\n didInit = true\n\n execSync('git checkout -b main', execOptions)\n\n execSync('git add -A', execOptions)\n execFileSync('git', ['commit', '-m', commitMessage || defaultCommitMessage], {\n cwd: rootDir,\n stdio: 'ignore',\n })\n return true\n } catch {\n if (didInit) {\n try {\n rimrafSync(path.join(rootDir, '.git'))\n } catch {\n // intentional noop\n }\n }\n return false\n }\n}\n\nfunction isInGitRepository(rootDir: string): boolean {\n try {\n execSync('git rev-parse --is-inside-work-tree', {cwd: rootDir, stdio: 'ignore'})\n return true\n } catch {\n // intentional noop\n }\n return false\n}\n\nfunction isInMercurialRepository(rootDir: string): boolean {\n try {\n execSync('hg --cwd . root', {cwd: rootDir, stdio: 'ignore'})\n return true\n } catch {\n // intentional noop\n }\n return false\n}\n"],"names":["execFileSync","execSync","path","rimrafSync","defaultCommitMessage","tryGitInit","rootDir","commitMessage","execOptions","cwd","stdio","didInit","isInGitRepository","isInMercurialRepository","join"],"mappings":"AAAA,SAAQA,YAAY,EAAEC,QAAQ,QAA6B,qBAAoB;AAC/E,OAAOC,UAAU,YAAW;AAE5B,SAAQC,UAAU,QAAO,SAAQ;AAEjC,MAAMC,uBAAuB;AAE7B,OAAO,SAASC,WAAWC,OAAe,EAAEC,aAAsB;IAChE,MAAMC,cAA+B;QAACC,KAAKH;QAASI,OAAO;IAAQ;IAEnE,IAAIC,UAAU;IACd,IAAI;QACFV,SAAS,iBAAiBO;QAC1B,IAAII,kBAAkBN,YAAYO,wBAAwBP,UAAU;YAClE,OAAO;QACT;QAEAL,SAAS,YAAYO;QACrBG,UAAU;QAEVV,SAAS,wBAAwBO;QAEjCP,SAAS,cAAcO;QACvBR,aAAa,OAAO;YAAC;YAAU;YAAMO,iBAAiBH;SAAqB,EAAE;YAC3EK,KAAKH;YACLI,OAAO;QACT;QACA,OAAO;IACT,EAAE,OAAM;QACN,IAAIC,SAAS;YACX,IAAI;gBACFR,WAAWD,KAAKY,IAAI,CAACR,SAAS;YAChC,EAAE,OAAM;YACN,mBAAmB;YACrB;QACF;QACA,OAAO;IACT;AACF;AAEA,SAASM,kBAAkBN,OAAe;IACxC,IAAI;QACFL,SAAS,uCAAuC;YAACQ,KAAKH;YAASI,OAAO;QAAQ;QAC9E,OAAO;IACT,EAAE,OAAM;IACN,mBAAmB;IACrB;IACA,OAAO;AACT;AAEA,SAASG,wBAAwBP,OAAe;IAC9C,IAAI;QACFL,SAAS,mBAAmB;YAACQ,KAAKH;YAASI,OAAO;QAAQ;QAC1D,OAAO;IACT,EAAE,OAAM;IACN,mBAAmB;IACrB;IACA,OAAO;AACT"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */ import _traverse from '@babel/traverse';
|
|
2
|
+
import { parse, print } from 'recast';
|
|
3
|
+
import * as parser from 'recast/parsers/typescript.js';
|
|
4
|
+
// @ts-expect-error - Babel's ESM exports require accessing .default
|
|
5
|
+
const traverse = _traverse.default;
|
|
6
|
+
export function processTemplate(options) {
|
|
7
|
+
const { includeBooleanTransform = false, template, variables } = options;
|
|
8
|
+
const ast = parse(template.trimStart(), {
|
|
9
|
+
parser
|
|
10
|
+
});
|
|
11
|
+
traverse(ast, {
|
|
12
|
+
StringLiteral: {
|
|
13
|
+
enter ({ node }) {
|
|
14
|
+
const value = node.value;
|
|
15
|
+
if (!value.startsWith('%') || !value.endsWith('%')) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const variableName = value.slice(1, -1);
|
|
19
|
+
if (!(variableName in variables)) {
|
|
20
|
+
throw new Error(`Template variable '${value}' not defined`);
|
|
21
|
+
}
|
|
22
|
+
const newValue = variables[variableName];
|
|
23
|
+
/*
|
|
24
|
+
* although there are valid non-strings in our config,
|
|
25
|
+
* they're not in StringLiteral nodes, so assume undefined
|
|
26
|
+
*/ node.value = typeof newValue === 'string' ? newValue : '';
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
...includeBooleanTransform && {
|
|
30
|
+
Identifier: {
|
|
31
|
+
enter (path) {
|
|
32
|
+
if (!path.node.name.startsWith('__BOOL__')) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const variableName = path.node.name.replace(/^__BOOL__(.+?)__$/, '$1');
|
|
36
|
+
if (!(variableName in variables)) {
|
|
37
|
+
throw new Error(`Template variable '${variableName.toString()}' not defined`);
|
|
38
|
+
}
|
|
39
|
+
const value = variables[variableName];
|
|
40
|
+
if (typeof value !== 'boolean') {
|
|
41
|
+
throw new TypeError(`Expected boolean value for '${variableName.toString()}'`);
|
|
42
|
+
}
|
|
43
|
+
path.replaceWith({
|
|
44
|
+
type: 'BooleanLiteral',
|
|
45
|
+
value
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
return print(ast, {
|
|
52
|
+
quote: 'single'
|
|
53
|
+
}).code;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=processTemplate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/init/processTemplate.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport _traverse from '@babel/traverse'\nimport {parse, print} from 'recast'\nimport * as parser from 'recast/parsers/typescript.js'\n\ninterface TemplateOptions<T> {\n template: string\n variables: T\n\n includeBooleanTransform?: boolean\n}\n\n// @ts-expect-error - Babel's ESM exports require accessing .default\nconst traverse = _traverse.default\n\nexport function processTemplate<T extends object>(options: TemplateOptions<T>): string {\n const {includeBooleanTransform = false, template, variables} = options\n const ast = parse(template.trimStart(), {parser})\n\n traverse(ast, {\n StringLiteral: {\n enter({node}: {node: any}) {\n const value = node.value\n if (!value.startsWith('%') || !value.endsWith('%')) {\n return\n }\n const variableName = value.slice(1, -1) as keyof T\n if (!(variableName in variables)) {\n throw new Error(`Template variable '${value}' not defined`)\n }\n const newValue = variables[variableName]\n /*\n * although there are valid non-strings in our config,\n * they're not in StringLiteral nodes, so assume undefined\n */\n node.value = typeof newValue === 'string' ? newValue : ''\n },\n },\n ...(includeBooleanTransform && {\n Identifier: {\n enter(path: any) {\n if (!path.node.name.startsWith('__BOOL__')) {\n return\n }\n const variableName = path.node.name.replace(/^__BOOL__(.+?)__$/, '$1') as keyof T\n if (!(variableName in variables)) {\n throw new Error(`Template variable '${variableName.toString()}' not defined`)\n }\n const value = variables[variableName]\n if (typeof value !== 'boolean') {\n throw new TypeError(`Expected boolean value for '${variableName.toString()}'`)\n }\n path.replaceWith({type: 'BooleanLiteral', value})\n },\n },\n }),\n })\n\n return print(ast, {quote: 'single'}).code\n}\n"],"names":["_traverse","parse","print","parser","traverse","default","processTemplate","options","includeBooleanTransform","template","variables","ast","trimStart","StringLiteral","enter","node","value","startsWith","endsWith","variableName","slice","Error","newValue","Identifier","path","name","replace","toString","TypeError","replaceWith","type","quote","code"],"mappings":"AAAA,qDAAqD,GACrD,OAAOA,eAAe,kBAAiB;AACvC,SAAQC,KAAK,EAAEC,KAAK,QAAO,SAAQ;AACnC,YAAYC,YAAY,+BAA8B;AAStD,oEAAoE;AACpE,MAAMC,WAAWJ,UAAUK,OAAO;AAElC,OAAO,SAASC,gBAAkCC,OAA2B;IAC3E,MAAM,EAACC,0BAA0B,KAAK,EAAEC,QAAQ,EAAEC,SAAS,EAAC,GAAGH;IAC/D,MAAMI,MAAMV,MAAMQ,SAASG,SAAS,IAAI;QAACT;IAAM;IAE/CC,SAASO,KAAK;QACZE,eAAe;YACbC,OAAM,EAACC,IAAI,EAAc;gBACvB,MAAMC,QAAQD,KAAKC,KAAK;gBACxB,IAAI,CAACA,MAAMC,UAAU,CAAC,QAAQ,CAACD,MAAME,QAAQ,CAAC,MAAM;oBAClD;gBACF;gBACA,MAAMC,eAAeH,MAAMI,KAAK,CAAC,GAAG,CAAC;gBACrC,IAAI,CAAED,CAAAA,gBAAgBT,SAAQ,GAAI;oBAChC,MAAM,IAAIW,MAAM,CAAC,mBAAmB,EAAEL,MAAM,aAAa,CAAC;gBAC5D;gBACA,MAAMM,WAAWZ,SAAS,CAACS,aAAa;gBACxC;;;SAGC,GACDJ,KAAKC,KAAK,GAAG,OAAOM,aAAa,WAAWA,WAAW;YACzD;QACF;QACA,GAAId,2BAA2B;YAC7Be,YAAY;gBACVT,OAAMU,IAAS;oBACb,IAAI,CAACA,KAAKT,IAAI,CAACU,IAAI,CAACR,UAAU,CAAC,aAAa;wBAC1C;oBACF;oBACA,MAAME,eAAeK,KAAKT,IAAI,CAACU,IAAI,CAACC,OAAO,CAAC,qBAAqB;oBACjE,IAAI,CAAEP,CAAAA,gBAAgBT,SAAQ,GAAI;wBAChC,MAAM,IAAIW,MAAM,CAAC,mBAAmB,EAAEF,aAAaQ,QAAQ,GAAG,aAAa,CAAC;oBAC9E;oBACA,MAAMX,QAAQN,SAAS,CAACS,aAAa;oBACrC,IAAI,OAAOH,UAAU,WAAW;wBAC9B,MAAM,IAAIY,UAAU,CAAC,4BAA4B,EAAET,aAAaQ,QAAQ,GAAG,CAAC,CAAC;oBAC/E;oBACAH,KAAKK,WAAW,CAAC;wBAACC,MAAM;wBAAkBd;oBAAK;gBACjD;YACF;QACF,CAAC;IACH;IAEA,OAAOd,MAAMS,KAAK;QAACoB,OAAO;IAAQ,GAAGC,IAAI;AAC3C"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { type SanityClient } from '@sanity/client';
|
|
2
1
|
type EnvData = {
|
|
3
2
|
dataset: string;
|
|
4
3
|
projectId: string;
|
|
@@ -18,6 +17,4 @@ export declare function downloadAndExtractRepo(root: string, { branch, filePath,
|
|
|
18
17
|
export declare function checkIfNeedsApiToken(root: string, type: 'read' | 'write'): Promise<boolean>;
|
|
19
18
|
export declare function applyEnvVariables(root: string, envData: EnvData, targetName?: string): Promise<void>;
|
|
20
19
|
export declare function tryApplyPackageName(root: string, name: string): Promise<void>;
|
|
21
|
-
export declare function generateSanityApiToken(client: SanityClient, label: string, type: 'read' | 'write', projectId: string): Promise<string>;
|
|
22
|
-
export declare function setCorsOrigin(client: SanityClient, origin: string, projectId: string): Promise<void>;
|
|
23
20
|
export {};
|
|
@@ -16,8 +16,6 @@ const ENV_VAR = {
|
|
|
16
16
|
READ_TOKEN: 'SANITY_API_READ_TOKEN',
|
|
17
17
|
WRITE_TOKEN: 'SANITY_API_WRITE_TOKEN'
|
|
18
18
|
};
|
|
19
|
-
const API_READ_TOKEN_ROLE = 'viewer';
|
|
20
|
-
const API_WRITE_TOKEN_ROLE = 'editor';
|
|
21
19
|
export function getGitHubRawContentUrl(repoInfo) {
|
|
22
20
|
const { branch, filePath, name, username } = repoInfo;
|
|
23
21
|
return `https://raw.githubusercontent.com/${username}/${name}/${branch}/${filePath}`;
|
|
@@ -34,7 +32,7 @@ function isGitHubRepoShorthand(value) {
|
|
|
34
32
|
return /^[\w-]+\/[\w-.]+(\/[@\w-.]+)*$/.test(value);
|
|
35
33
|
}
|
|
36
34
|
function isGitHubRepoUrl(value) {
|
|
37
|
-
if (URL.canParse(value)
|
|
35
|
+
if (!URL.canParse(value)) {
|
|
38
36
|
return false;
|
|
39
37
|
}
|
|
40
38
|
const url = new URL(value);
|
|
@@ -56,7 +54,7 @@ async function downloadTarStream(url, bearerToken) {
|
|
|
56
54
|
if (!res.body) {
|
|
57
55
|
throw new Error(`Failed to download: ${url}`);
|
|
58
56
|
}
|
|
59
|
-
// eslint-disable-next-line n/no-unsupported-features/node-builtins
|
|
57
|
+
// eslint-disable-next-line n/no-unsupported-features/node-builtins
|
|
60
58
|
return Readable.fromWeb(res.body);
|
|
61
59
|
}
|
|
62
60
|
export function checkIsRemoteTemplate(templateName) {
|
|
@@ -209,41 +207,5 @@ export async function tryApplyPackageName(root, name) {
|
|
|
209
207
|
// noop
|
|
210
208
|
}
|
|
211
209
|
}
|
|
212
|
-
export async function generateSanityApiToken(client, label, type, projectId) {
|
|
213
|
-
// const client = await getGlobalCliClient({
|
|
214
|
-
// apiVersion: 'v2021-06-07',
|
|
215
|
-
// requireUser: true,
|
|
216
|
-
// })
|
|
217
|
-
const response = await client.request({
|
|
218
|
-
body: {
|
|
219
|
-
label: `${label} (${Date.now()})`,
|
|
220
|
-
roleName: type === 'read' ? API_READ_TOKEN_ROLE : API_WRITE_TOKEN_ROLE
|
|
221
|
-
},
|
|
222
|
-
method: 'POST',
|
|
223
|
-
uri: `/projects/${projectId}/tokens`
|
|
224
|
-
});
|
|
225
|
-
return response.key;
|
|
226
|
-
}
|
|
227
|
-
export async function setCorsOrigin(client, origin, projectId) {
|
|
228
|
-
try {
|
|
229
|
-
// const client = await getGlobalCliClient({
|
|
230
|
-
// apiVersion: 'v2021-06-07',
|
|
231
|
-
// requireUser: true,
|
|
232
|
-
// })
|
|
233
|
-
await client.withConfig({
|
|
234
|
-
projectId
|
|
235
|
-
}).request({
|
|
236
|
-
body: {
|
|
237
|
-
allowCredentials: true,
|
|
238
|
-
origin: origin
|
|
239
|
-
},
|
|
240
|
-
method: 'POST',
|
|
241
|
-
url: '/cors'
|
|
242
|
-
});
|
|
243
|
-
} catch (error) {
|
|
244
|
-
// Silent fail, it most likely means that the origin is already set
|
|
245
|
-
debug('Failed to set CORS origin', error);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
210
|
|
|
249
211
|
//# sourceMappingURL=remoteTemplate.js.map
|