@sanity/plugin-kit 5.0.0 → 5.0.2
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/assets/inject/semver-workflow/.github/workflows/main.yml +3 -3
- package/dist/_chunks-es/init.js +2 -2
- package/dist/_chunks-es/init.js.map +1 -1
- package/dist/_chunks-es/inject.js +1 -1
- package/dist/_chunks-es/inject.js.map +1 -1
- package/dist/_chunks-es/package.js.map +1 -1
- package/dist/_chunks-es/package2.js +1 -1
- package/dist/_chunks-es/ts.js +7 -9
- package/dist/_chunks-es/ts.js.map +1 -1
- package/dist/_chunks-es/verify-package.js +1 -1
- package/dist/_chunks-es/verify-package.js.map +1 -1
- package/package.json +25 -25
|
@@ -45,7 +45,7 @@ jobs:
|
|
|
45
45
|
runs-on: ubuntu-latest
|
|
46
46
|
name: Lint & Build
|
|
47
47
|
steps:
|
|
48
|
-
- uses: actions/checkout@
|
|
48
|
+
- uses: actions/checkout@v5
|
|
49
49
|
- uses: actions/setup-node@v4
|
|
50
50
|
with:
|
|
51
51
|
cache: npm
|
|
@@ -85,7 +85,7 @@ jobs:
|
|
|
85
85
|
run: |
|
|
86
86
|
git config --global core.autocrlf false
|
|
87
87
|
git config --global core.eol lf
|
|
88
|
-
- uses: actions/checkout@
|
|
88
|
+
- uses: actions/checkout@v5
|
|
89
89
|
- uses: actions/setup-node@v4
|
|
90
90
|
with:
|
|
91
91
|
cache: npm
|
|
@@ -105,7 +105,7 @@ jobs:
|
|
|
105
105
|
runs-on: ubuntu-latest
|
|
106
106
|
name: Semantic release
|
|
107
107
|
steps:
|
|
108
|
-
- uses: actions/checkout@
|
|
108
|
+
- uses: actions/checkout@v5
|
|
109
109
|
with:
|
|
110
110
|
# Need to fetch entire commit history to
|
|
111
111
|
# analyze every commit since last release
|
package/dist/_chunks-es/init.js
CHANGED
|
@@ -46,7 +46,7 @@ Options
|
|
|
46
46
|
--author [name] Use the provided author
|
|
47
47
|
--repo [url] Use the provided repo url
|
|
48
48
|
--license [spdx] Use the license with the given SPDX identifier
|
|
49
|
-
--force No
|
|
49
|
+
--force No prompt when overwriting files
|
|
50
50
|
|
|
51
51
|
--preset [preset-name] Adds config and files from a named preset. --preset can be supplied multiple times.
|
|
52
52
|
The following presets are available:
|
|
@@ -71,7 +71,7 @@ async function run({ argv }) {
|
|
|
71
71
|
const { v3ConfigFile } = await findStudioV3Config(basePath);
|
|
72
72
|
if (v3ConfigFile)
|
|
73
73
|
throw new Error(
|
|
74
|
-
`${v3ConfigFile}
|
|
74
|
+
`${v3ConfigFile} exists - are you trying to init into a studio instead of a plugin?`
|
|
75
75
|
);
|
|
76
76
|
if (log.info('Initializing new plugin in "%s"', basePath), !cli.flags.force && !await isEmptyish(basePath) && !await prompt("Directory is not empty, proceed?", { type: "confirm", default: !1 })) {
|
|
77
77
|
log.error("Directory is not empty. Cancelled.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sources":["../../src/npm/manager.ts","../../src/cmds/init.ts"],"sourcesContent":["import execa from 'execa'\n\nimport {prompt} from '../util/prompt'\n\nfunction npmIsAvailable() {\n return execa('npm', ['-v'])\n .then(() => true)\n .catch(() => false)\n}\n\nfunction yarnIsAvailable() {\n return execa('yarn', ['-v'])\n .then(() => true)\n .catch(() => false)\n}\n\nfunction pnpmAvailable() {\n return execa('pnpm', ['-v'])\n .then(() => true)\n .catch(() => false)\n}\n\nexport async function promptForPackageManager() {\n const [npm, yarn, pnpm] = await Promise.all([\n npmIsAvailable(),\n yarnIsAvailable(),\n pnpmAvailable(),\n ])\n\n const choices = [npm && 'npm', yarn && 'yarn', pnpm && 'pnpm'].filter(Boolean)\n if (choices.length < 2) {\n return choices[0] || 'npm'\n }\n\n return prompt('Which package manager do you prefer?', {\n choices: choices.map((value) => ({value, name: value})),\n default: choices[0],\n })\n}\n\nexport async function installDependencies(pm: string, {cwd}: {cwd?: string}) {\n const proc = execa(pm, ['install'], {cwd, stdio: 'inherit'})\n const {exitCode} = await proc\n return exitCode <= 0\n}\n","import path from 'path'\n\nimport meow from 'meow'\n\nimport {init, initFlags} from '../actions/init'\nimport {cliName} from '../constants'\nimport {installDependencies, promptForPackageManager} from '../npm/manager'\nimport {presetHelpList} from '../presets/presets'\nimport {findStudioV3Config, hasSanityJson} from '../sanity/manifest'\nimport {isEmptyish, ensureDir} from '../util/files'\nimport log from '../util/log'\nimport {prompt} from '../util/prompt'\n\nconst description = `Initialize a new Sanity plugin`\n\nconst help = `\nUsage\n $ ${cliName} init [dir] [<args>]\n\nOptions\n --no-eslint Disables ESLint config and dependencies from being added\n --no-prettier Disables prettier config and dependencies from being added\n --no-typescript Disables typescript config and dependencies from being added\n --no-license Disables LICENSE + package.json license field from being added\n --no-editorconfig Disables .editorconfig from being added\n --no-gitignore Disables .gitignore from being added\n --no-scripts Disables scripts from being added to package.json\n --no-install Disables automatically running package manager install\n\n --name [package-name] Use the provided package-name\n --author [name] Use the provided author\n --repo [url] Use the provided repo url\n --license [spdx] Use the license with the given SPDX identifier\n --force No
|
|
1
|
+
{"version":3,"file":"init.js","sources":["../../src/npm/manager.ts","../../src/cmds/init.ts"],"sourcesContent":["import execa from 'execa'\n\nimport {prompt} from '../util/prompt'\n\nfunction npmIsAvailable() {\n return execa('npm', ['-v'])\n .then(() => true)\n .catch(() => false)\n}\n\nfunction yarnIsAvailable() {\n return execa('yarn', ['-v'])\n .then(() => true)\n .catch(() => false)\n}\n\nfunction pnpmAvailable() {\n return execa('pnpm', ['-v'])\n .then(() => true)\n .catch(() => false)\n}\n\nexport async function promptForPackageManager() {\n const [npm, yarn, pnpm] = await Promise.all([\n npmIsAvailable(),\n yarnIsAvailable(),\n pnpmAvailable(),\n ])\n\n const choices = [npm && 'npm', yarn && 'yarn', pnpm && 'pnpm'].filter(Boolean)\n if (choices.length < 2) {\n return choices[0] || 'npm'\n }\n\n return prompt('Which package manager do you prefer?', {\n choices: choices.map((value) => ({value, name: value})),\n default: choices[0],\n })\n}\n\nexport async function installDependencies(pm: string, {cwd}: {cwd?: string}) {\n const proc = execa(pm, ['install'], {cwd, stdio: 'inherit'})\n const {exitCode} = await proc\n return exitCode <= 0\n}\n","import path from 'path'\n\nimport meow from 'meow'\n\nimport {init, initFlags} from '../actions/init'\nimport {cliName} from '../constants'\nimport {installDependencies, promptForPackageManager} from '../npm/manager'\nimport {presetHelpList} from '../presets/presets'\nimport {findStudioV3Config, hasSanityJson} from '../sanity/manifest'\nimport {isEmptyish, ensureDir} from '../util/files'\nimport log from '../util/log'\nimport {prompt} from '../util/prompt'\n\nconst description = `Initialize a new Sanity plugin`\n\nconst help = `\nUsage\n $ ${cliName} init [dir] [<args>]\n\nOptions\n --no-eslint Disables ESLint config and dependencies from being added\n --no-prettier Disables prettier config and dependencies from being added\n --no-typescript Disables typescript config and dependencies from being added\n --no-license Disables LICENSE + package.json license field from being added\n --no-editorconfig Disables .editorconfig from being added\n --no-gitignore Disables .gitignore from being added\n --no-scripts Disables scripts from being added to package.json\n --no-install Disables automatically running package manager install\n\n --name [package-name] Use the provided package-name\n --author [name] Use the provided author\n --repo [url] Use the provided repo url\n --license [spdx] Use the license with the given SPDX identifier\n --force No prompt when overwriting files\n\n --preset [preset-name] Adds config and files from a named preset. --preset can be supplied multiple times.\n The following presets are available:\n${presetHelpList(30)}\n\nExamples\n # Initialize a new plugin in the current directory\n $ ${cliName} init\n\n # Initialize a plugin in the directory ~/my-plugin\n $ ${cliName} init ~/my-plugin\n\n # Don't add eslint or prettier\n $ ${cliName} init --no-eslint --no-prettier\n`\n\nasync function run({argv}: {argv: string[]}) {\n const cli = meow(help, {flags: initFlags, argv, description})\n const basePath = path.resolve(cli.input[0] || process.cwd())\n\n const {exists, isRoot} = await hasSanityJson(basePath)\n if (exists && isRoot) {\n throw new Error(\n `sanity.json has a \"root\" property set to true - are you trying to init into a studio instead of a plugin?`,\n )\n }\n\n const {v3ConfigFile} = await findStudioV3Config(basePath)\n if (v3ConfigFile) {\n throw new Error(\n `${v3ConfigFile} exists - are you trying to init into a studio instead of a plugin?`,\n )\n }\n\n log.info('Initializing new plugin in \"%s\"', basePath)\n if (\n !cli.flags.force &&\n !(await isEmptyish(basePath)) &&\n !(await prompt('Directory is not empty, proceed?', {type: 'confirm', default: false}))\n ) {\n log.error('Directory is not empty. Cancelled.')\n return\n }\n\n await ensureDir(basePath)\n await init({basePath, flags: cli.flags})\n if (cli.flags.install) {\n if (await installDependencies(await promptForPackageManager(), {cwd: basePath})) {\n log.info('Done!')\n } else {\n log.error('Failed to install dependencies, try manually running `npm install`')\n }\n } else {\n log.info('Dependency installation skipped.')\n }\n}\n\nexport default run\n"],"names":[],"mappings":";;;;;;AAIA,SAAS,iBAAiB;AACxB,SAAO,MAAM,OAAO,CAAC,IAAI,CAAC,EACvB,KAAK,MAAM,EAAI,EACf,MAAM,MAAM,EAAK;AACtB;AAEA,SAAS,kBAAkB;AACzB,SAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,EACxB,KAAK,MAAM,EAAI,EACf,MAAM,MAAM,EAAK;AACtB;AAEA,SAAS,gBAAgB;AACvB,SAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,EACxB,KAAK,MAAM,EAAI,EACf,MAAM,MAAM,EAAK;AACtB;AAEA,eAAsB,0BAA0B;AAC9C,QAAM,CAAC,KAAK,MAAM,IAAI,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC1C,eAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,EAAc,CACf,GAEK,UAAU,CAAC,OAAO,OAAO,QAAQ,QAAQ,QAAQ,MAAM,EAAE,OAAO,OAAO;AAC7E,SAAI,QAAQ,SAAS,IACZ,QAAQ,CAAC,KAAK,QAGhB,OAAO,wCAAwC;AAAA,IACpD,SAAS,QAAQ,IAAI,CAAC,WAAW,EAAC,OAAO,MAAM,MAAA,EAAO;AAAA,IACtD,SAAS,QAAQ,CAAC;AAAA,EAAA,CACnB;AACH;AAEA,eAAsB,oBAAoB,IAAY,EAAC,OAAsB;AAC3E,QAAM,OAAO,MAAM,IAAI,CAAC,SAAS,GAAG,EAAC,KAAK,OAAO,WAAU,GACrD,EAAC,SAAA,IAAY,MAAM;AACzB,SAAO,YAAY;AACrB;AC/BA,MAAM,cAAc,kCAEd,OAAO;AAAA;AAAA,MAEP,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBX,eAAe,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,MAId,OAAO;AAAA;AAAA;AAAA,MAGP,OAAO;AAAA;AAAA;AAAA,MAGP,OAAO;AAAA;AAGb,eAAe,IAAI,EAAC,QAAyB;AAC3C,QAAM,MAAM,KAAK,MAAM,EAAC,OAAO,WAAW,MAAM,YAAA,CAAY,GACtD,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,QAAQ,IAAA,CAAK,GAErD,EAAC,QAAQ,OAAA,IAAU,MAAM,cAAc,QAAQ;AACrD,MAAI,UAAU;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAIJ,QAAM,EAAC,aAAA,IAAgB,MAAM,mBAAmB,QAAQ;AACxD,MAAI;AACF,UAAM,IAAI;AAAA,MACR,GAAG,YAAY;AAAA,IAAA;AAKnB,MADA,IAAI,KAAK,mCAAmC,QAAQ,GAElD,CAAC,IAAI,MAAM,SACX,CAAE,MAAM,WAAW,QAAQ,KAC3B,CAAE,MAAM,OAAO,oCAAoC,EAAC,MAAM,WAAW,SAAS,GAAA,CAAM,GACpF;AACA,QAAI,MAAM,oCAAoC;AAC9C;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,GACxB,MAAM,KAAK,EAAC,UAAU,OAAO,IAAI,OAAM,GACnC,IAAI,MAAM,UACR,MAAM,oBAAoB,MAAM,wBAAA,GAA2B,EAAC,KAAK,SAAA,CAAS,IAC5E,IAAI,KAAK,OAAO,IAEhB,IAAI,MAAM,oEAAoE,IAGhF,IAAI,KAAK,kCAAkC;AAE/C;"}
|
|
@@ -18,7 +18,7 @@ Options
|
|
|
18
18
|
--no-scripts Disables scripts from being added to package.json
|
|
19
19
|
|
|
20
20
|
--license [spdx] Use the license with the given SPDX identifier
|
|
21
|
-
--force No
|
|
21
|
+
--force No prompt when overwriting files
|
|
22
22
|
|
|
23
23
|
--preset [preset-name] Adds config and files from a named preset. --preset can be supplied multiple times.
|
|
24
24
|
The following presets are available:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inject.js","sources":["../../src/cmds/inject.ts"],"sourcesContent":["import path from 'path'\n\nimport meow from 'meow'\n\nimport {initFlags} from '../actions/init'\nimport {inject} from '../actions/inject'\nimport {cliName, defaultOutDir} from '../constants'\nimport {presetHelpList} from '../presets/presets'\nimport {findStudioV3Config} from '../sanity/manifest'\nimport {loadPackageConfig} from '../util/load-package-config'\nimport log from '../util/log'\n\nconst description = `Inject configuration into a Sanity plugin`\n\nconst help = `\nUsage\n $ ${cliName} inject [dir] [<args>]\n\nOptions\n --no-eslint Disables ESLint config and dependencies from being added\n --no-prettier Disables prettier config and dependencies from being added\n --no-typescript Disables typescript config and dependencies from being added\n --no-license Disables LICENSE + package.json license field from being added\n --no-editorconfig Disables .editorconfig from being added\n --no-gitignore Disables .gitignore from being added\n --no-scripts Disables scripts from being added to package.json\n\n --license [spdx] Use the license with the given SPDX identifier\n --force No
|
|
1
|
+
{"version":3,"file":"inject.js","sources":["../../src/cmds/inject.ts"],"sourcesContent":["import path from 'path'\n\nimport meow from 'meow'\n\nimport {initFlags} from '../actions/init'\nimport {inject} from '../actions/inject'\nimport {cliName, defaultOutDir} from '../constants'\nimport {presetHelpList} from '../presets/presets'\nimport {findStudioV3Config} from '../sanity/manifest'\nimport {loadPackageConfig} from '../util/load-package-config'\nimport log from '../util/log'\n\nconst description = `Inject configuration into a Sanity plugin`\n\nconst help = `\nUsage\n $ ${cliName} inject [dir] [<args>]\n\nOptions\n --no-eslint Disables ESLint config and dependencies from being added\n --no-prettier Disables prettier config and dependencies from being added\n --no-typescript Disables typescript config and dependencies from being added\n --no-license Disables LICENSE + package.json license field from being added\n --no-editorconfig Disables .editorconfig from being added\n --no-gitignore Disables .gitignore from being added\n --no-scripts Disables scripts from being added to package.json\n\n --license [spdx] Use the license with the given SPDX identifier\n --force No prompt when overwriting files\n\n --preset [preset-name] Adds config and files from a named preset. --preset can be supplied multiple times.\n The following presets are available:\n${presetHelpList(30)}\n --preset-only Skips the default inject steps. Use this to apply a preset to an otherwise complete plugin.\n\nExamples\n # Inject configuration into the plugin in the current directory\n $ ${cliName} inject\n\n # Inject configuration into the plugin in ~/my-plugin\n $ ${cliName} inject ~/my-plugin\n\n # Don't inject eslint or prettier\n $ ${cliName} inject --no-eslint --no-prettier\n\n # Inject plugin configuration and semver-workflow into the plugin in the current directory\n $ @sanity/plugin-kit inject --preset semver-workflow\n\n # Only inject semver-workflow and renovatebot config from presets\n $ ${cliName} inject --preset-only --preset semver-workflow --preset renovatebot\n\n`\n\nasync function run({argv}: {argv: string[]}) {\n const cli = meow(help, {flags: initFlags, argv, description})\n const basePath = path.resolve(cli.input[0] || process.cwd())\n const packageConfig = await loadPackageConfig({basePath})\n const outDir = packageConfig?.dist ?? defaultOutDir\n\n const {v3ConfigFile} = await findStudioV3Config(basePath)\n if (v3ConfigFile) {\n throw new Error(\n `${v3ConfigFile} exists - are you trying to INJECT into a studio instead of a plugin?`,\n )\n }\n log.info('Inject config into plugin in \"%s\"', basePath)\n\n await inject({basePath, outDir, flags: cli.flags, validate: false})\n log.info('Done!')\n}\n\nexport default run\n"],"names":[],"mappings":";;;;;;AAYA,MAAM,cAAc,6CAEd,OAAO;AAAA;AAAA,MAEP,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBX,eAAe,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAKd,OAAO;AAAA;AAAA;AAAA,MAGP,OAAO;AAAA;AAAA;AAAA,MAGP,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMP,OAAO;AAAA;AAAA;AAIb,eAAe,IAAI,EAAC,QAAyB;AAC3C,QAAM,MAAM,KAAK,MAAM,EAAC,OAAO,WAAW,MAAM,YAAA,CAAY,GACtD,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,QAAQ,IAAA,CAAK,GAErD,UADgB,MAAM,kBAAkB,EAAC,SAAA,CAAS,IAC1B,QAAQ,eAEhC,EAAC,aAAA,IAAgB,MAAM,mBAAmB,QAAQ;AACxD,MAAI;AACF,UAAM,IAAI;AAAA,MACR,GAAG,YAAY;AAAA,IAAA;AAGnB,MAAI,KAAK,qCAAqC,QAAQ,GAEtD,MAAM,OAAO,EAAC,UAAU,QAAQ,OAAO,IAAI,OAAO,UAAU,GAAA,CAAM,GAClE,IAAI,KAAK,OAAO;AAClB;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.js","sources":["../../src/configs/eslint.ts","../../src/configs/git.ts","../../src/configs/pkg-config.ts","../../src/configs/prettier.ts","../../src/configs/tsconfig.ts","../../src/presets/renovatebot.ts","../../src/npm/resolveLatestVersions.ts","../../src/util/errorToUndefined.ts","../../src/configs/buildExtensions.ts","../../src/sanity/manifest.ts","../../src/util/prompt.ts","../../src/util/files.ts","../../src/util/request.ts","../../src/util/user.ts","../../src/util/readme.ts","../../src/presets/semver-workflow.ts","../../src/configs/forced-package-versions.ts","../../src/presets/ui.ts","../../src/presets/ui-workshop.ts","../../src/presets/presets.ts","../../src/actions/inject.ts","../../src/configs/banned-packages.ts","../../src/actions/verify/validations.ts","../../src/npm/package.ts"],"sourcesContent":["import {InitFlags} from '../actions/init'\nimport {InjectTemplate} from '../actions/inject'\n\nexport function eslintrcTemplate(options: {flags: InitFlags}): InjectTemplate {\n const {flags} = options\n\n const eslintConfig = {\n root: true,\n env: {\n node: true,\n browser: true,\n },\n extends: [\n 'sanity',\n flags.typescript && 'sanity/typescript',\n 'sanity/react',\n 'plugin:react-hooks/recommended',\n flags.prettier && 'plugin:prettier/recommended',\n 'plugin:react/jsx-runtime',\n ].filter(Boolean),\n }\n\n return {\n type: 'template',\n force: flags.force,\n to: '.eslintrc',\n value: JSON.stringify(eslintConfig, null, 2),\n }\n}\n\nexport function eslintignoreTemplate(options: {flags: InitFlags; outDir: string}): InjectTemplate {\n const {flags, outDir} = options\n\n const patterns = [\n '.eslintrc.js',\n 'commitlint.config.js',\n outDir,\n 'lint-staged.config.js',\n 'package.config.ts',\n flags.typescript ? '*.js' : '',\n ].filter(Boolean)\n\n patterns.sort()\n\n return {\n type: 'template',\n force: flags.force,\n to: '.eslintignore',\n value: patterns.join('\\n'),\n }\n}\n","import {outdent} from 'outdent'\n\nimport {InjectTemplate} from '../actions/inject'\n\nexport function gitignoreTemplate(): InjectTemplate {\n return {\n type: 'template',\n to: '.gitignore',\n value: outdent`\n # Logs\n logs\n *.log\n npm-debug.log*\n\n # Runtime data\n pids\n *.pid\n *.seed\n\n # Directory for instrumented libs generated by jscoverage/JSCover\n lib-cov\n\n # Coverage directory used by tools like istanbul\n coverage\n\n # nyc test coverage\n .nyc_output\n\n # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n .grunt\n\n # node-waf configuration\n .lock-wscript\n\n # Compiled binary addons (http://nodejs.org/api/addons.html)\n build/Release\n\n # Dependency directories\n node_modules\n jspm_packages\n\n # Optional npm cache directory\n .npm\n\n # Optional REPL history\n .node_repl_history\n\n # macOS finder cache file\n .DS_Store\n\n # VS Code settings\n .vscode\n\n # IntelliJ\n .idea\n *.iml\n\n # Cache\n .cache\n\n # Yalc\n .yalc\n yalc.lock\n\n # npm package zips\n *.tgz\n `,\n }\n}\n","import {outdent} from 'outdent'\n\nimport {InitFlags} from '../actions/init'\nimport {InjectTemplate} from '../actions/inject'\n\nexport function pkgConfigTemplate(options: {outDir: string; flags: InitFlags}): InjectTemplate {\n const {flags, outDir} = options\n\n return {\n type: 'template',\n force: flags.force,\n // Always a `.ts` config: plugins are ESM (`\"type\": \"module\"`), so `@sanity/pkg-utils`\n // loads it without needing a `.mts`/`.mjs` extension to force ESM interpretation.\n to: 'package.config.ts',\n value: outdent`\n import {defineConfig} from '@sanity/pkg-utils'\n\n export default defineConfig({\n dist: '${outDir}',\n tsconfig: 'tsconfig.${outDir}.json',\n\n // Remove this block to enable strict export validation\n extract: {\n rules: {\n 'ae-incompatible-release-tags': 'off',\n 'ae-internal-missing-underscore': 'off',\n 'ae-missing-release-tag': 'off',\n },\n },\n })\n `,\n }\n}\n","import {InjectTemplate} from '../actions/inject'\n\nexport function prettierignoreTemplate(options: {outDir: string}): InjectTemplate {\n const {outDir} = options\n\n return {\n type: 'template',\n to: '.prettierignore',\n value: [outDir, 'pnpm-lock.yaml', 'yarn.lock', 'package-lock.json'].join('\\n'),\n }\n}\n","import {outdent} from 'outdent'\n\nimport {InitFlags} from '../actions/init'\nimport {InjectTemplate} from '../actions/inject'\n\nexport function tsconfigTemplate(options: {flags: InitFlags}): InjectTemplate {\n const {flags} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: 'tsconfig.json',\n value: outdent`\n {\n \"extends\": \"./tsconfig.settings\",\n \"include\": [\"./src\", \"./package.config.ts\"]\n }\n `,\n }\n}\n\nexport function tsconfigTemplateDist(options: {outDir: string; flags: InitFlags}): InjectTemplate {\n const {flags, outDir} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: `tsconfig.${outDir}.json`,\n value: outdent`\n {\n \"extends\": \"./tsconfig.settings\",\n \"include\": [\"./src\"],\n \"exclude\": [\n \"./src/**/__fixtures__\",\n \"./src/**/__mocks__\",\n \"./src/**/*.test.ts\",\n \"./src/**/*.test.tsx\"\n ]\n }\n `,\n }\n}\n\nexport function tsconfigTemplateSettings(options: {\n outDir: string\n flags: InitFlags\n}): InjectTemplate {\n const {flags, outDir} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: `tsconfig.settings.json`,\n value: outdent`\n {\n \"compilerOptions\": {\n \"rootDir\": \".\",\n \"outDir\": \"./${outDir}\",\n\n \"target\": \"esnext\",\n \"jsx\": \"preserve\",\n \"module\": \"preserve\",\n \"moduleResolution\": \"bundler\",\n \"esModuleInterop\": true,\n \"resolveJsonModule\": true,\n \"moduleDetection\": \"force\",\n \"strict\": true,\n \"allowSyntheticDefaultImports\": true,\n \"skipLibCheck\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"isolatedModules\": true,\n\n // Don't emit by default, pkg-utils will ignore this when generating .d.ts files\n \"noEmit\": true\n }\n }\n `,\n }\n}\n","import {InjectOptions, writeAssets} from '../actions/inject'\nimport {Preset} from './presets'\n\nexport const renovatePreset: Preset = {\n name: 'renovatebot',\n description: 'Files to enable renovatebot.',\n apply: applyPreset,\n}\n\nasync function applyPreset(options: InjectOptions) {\n await writeAssets(\n [\n {\n type: 'copy',\n from: ['renovatebot', 'renovate.json'],\n to: 'renovate.json',\n },\n ],\n options,\n )\n}\n","import getLatestVersion from 'get-latest-version'\nimport pProps from 'p-props'\n\n// We may want to lock certain dependencies to specific versions\nconst lockedDependencies: Record<string, string> = {\n 'styled-components': '^6.1',\n 'eslint': '^8.57.0',\n}\n\nexport function resolveLatestVersions(packages: string[]) {\n const versions: Record<string, string> = {}\n for (const pkgName of packages) {\n versions[pkgName] = pkgName in lockedDependencies ? lockedDependencies[pkgName] : 'latest'\n }\n\n return pProps(\n versions,\n async (range, pkgName) => {\n const version = await getLatestVersion(pkgName, {range})\n if (!version) {\n throw new Error(`Found no version for ${pkgName}`)\n }\n return rangeify(version)\n },\n {concurrency: 8},\n )\n}\n\nfunction rangeify(version: string) {\n return `^${version}`\n}\n","export function errorToUndefined(err: any) {\n if (err instanceof TypeError) {\n throw err\n }\n\n return undefined\n}\n","export const buildExtensions = ['.js', '.jsx', '.es6', '.es', '.mjs', '.ts', '.tsx']\n","import fs from 'fs'\nimport path from 'path'\nimport util from 'util'\n\nimport pkg from '../../package.json'\nimport {buildExtensions} from '../configs/buildExtensions'\nimport {errorToUndefined} from '../util/errorToUndefined'\nimport {hasSourceFile, hasCompiledFile, readJsonFile, fileExists} from '../util/files'\n\nconst stat = util.promisify(fs.stat)\nconst readFile = util.promisify(fs.readFile)\n\nconst allowedPartProps = ['name', 'implements', 'path', 'description']\nconst disallowedPluginProps = ['api', 'project', 'plugins', 'env']\n\nexport interface SanityV2Manifest {\n root?: boolean\n name: string\n paths: ManifestPaths\n parts?: {\n path: string\n }[]\n}\n\nexport interface ManifestPaths {\n basePath: string\n compiled?: string\n source?: string\n}\n\nexport interface ManifestOptions {\n isPlugin?: boolean\n validate?: boolean\n pluginName?: string\n basePath: string\n verifySourceParts?: boolean\n verifyCompiledParts?: boolean\n paths?: ManifestPaths\n flags?: Record<string, any>\n}\n\nexport async function getPaths(options: ManifestOptions) {\n const {basePath} = options\n const manifest = await readManifest(options)\n if (!manifest.paths) {\n return null\n }\n\n return absolutifyPaths(manifest.paths, basePath)\n}\n\nfunction absolutifyPaths(paths: ManifestPaths | undefined, basePath: string) {\n const getPath = (relative?: string) =>\n relative ? path.resolve(path.join(basePath, relative)) : undefined\n return paths\n ? {\n basePath,\n compiled: getPath(paths.compiled),\n source: getPath(paths.source),\n }\n : {basePath}\n}\n\nasync function readManifest(options: ManifestOptions) {\n const {basePath, validate = true} = options\n const manifestPath = path.normalize(path.join(basePath, 'sanity.json'))\n\n let content\n try {\n content = await readFile(manifestPath, 'utf8')\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n throw new Error(\n `No sanity.json found. sanity.json is required for plugins to function. Use \\`${pkg.binname} init\\` for a new plugin, or create an empty \\`sanity.json\\` with an empty object (\\`{}\\`) for existing ones.`,\n )\n }\n\n throw new Error(`Failed to read \"${manifestPath}\": ${err.message}`)\n }\n\n let parsed\n try {\n parsed = JSON.parse(content)\n } catch (err: any) {\n throw new Error(`Error parsing \"${manifestPath}\": ${err.message}`)\n }\n\n if (validate) {\n await validateManifest(parsed, options)\n }\n\n return parsed\n}\n\nasync function validateManifest(manifest: SanityV2Manifest, opts: ManifestOptions) {\n const options = {isPlugin: true, ...opts}\n\n if (!isObject(manifest)) {\n throw new Error(`Invalid sanity.json: Root must be an object`)\n }\n\n if (options.isPlugin) {\n await validatePluginManifest(manifest, options)\n } else {\n validateProjectManifest(manifest)\n }\n\n if ('root' in manifest && typeof manifest.root !== 'boolean') {\n throw new Error(`Invalid sanity.json: \"root\" property must be a boolean if declared`)\n }\n\n await validateParts(manifest, {\n ...options,\n paths: absolutifyPaths(manifest.paths, options.basePath),\n })\n}\n\nfunction validateProjectManifest(manifest: SanityV2Manifest) {\n if ('paths' in manifest) {\n throw new Error(`Invalid sanity.json: \"paths\" property has no meaning in a project manifest`)\n }\n}\n\nasync function validatePluginManifest(manifest: SanityV2Manifest, options: {basePath: string}) {\n const disallowed = Object.keys(manifest)\n .filter((key) => disallowedPluginProps.includes(key))\n .map((key) => `\"${key}\"`)\n\n if (disallowed.length > 0) {\n const plural = disallowed.length > 1 ? 's' : ''\n const joined = disallowed.join(', ')\n throw new Error(\n `Invalid sanity.json: Key${plural} ${joined} ${\n plural ? 'are' : 'is'\n } not allowed in a plugin manifest`,\n )\n }\n\n if (manifest.root) {\n throw new Error(`Invalid sanity.json: \"root\" cannot be truthy in a plugin manifest`)\n }\n\n await validatePaths(manifest, options)\n}\n\nasync function validatePaths(manifest: SanityV2Manifest, options: {basePath: string}) {\n if (!('paths' in manifest)) {\n return\n }\n\n if (!isObject(manifest.paths)) {\n throw new Error(`Invalid sanity.json: \"paths\" must be an object if declared`)\n }\n\n if (typeof manifest.paths.compiled !== 'string') {\n throw new Error(\n `Invalid sanity.json: \"paths\" must have a (string) \"compiled\" property if declared`,\n )\n }\n\n if (typeof manifest.paths.source !== 'string') {\n throw new Error(\n `Invalid sanity.json: \"paths\" must have a (string) \"source\" property if declared`,\n )\n }\n\n const sourcePath = path.resolve(options.basePath, manifest.paths.source)\n let srcStats\n try {\n srcStats = await stat(sourcePath)\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n throw new Error(`sanity.json references \"source\" path which does not exist: \"${sourcePath}\"`)\n }\n }\n\n if (!srcStats?.isDirectory()) {\n throw new Error(\n `sanity.json references \"source\" path which is not a directory: \"${sourcePath}\"`,\n )\n }\n}\n\nasync function validateParts(manifest: SanityV2Manifest, options: ManifestOptions) {\n if (!('parts' in manifest)) {\n return\n }\n\n if (!Array.isArray(manifest.parts)) {\n throw new Error(`Invalid sanity.json: \"parts\" must be an array if declared`)\n }\n\n let i = 0\n for (const part of manifest.parts) {\n await validatePart(part, i, options)\n i++\n }\n}\n\nasync function validatePart(part: Record<string, any>, index: number, options: ManifestOptions) {\n if (!isObject(part)) {\n throw new Error(`Invalid sanity.json: \"parts[${index}]\" must be an object`)\n }\n\n validateAllowedPartKeys(part, index)\n validatePartStringValues(part, index)\n validatePartNames(part, index, options)\n await validatePartFiles(part, index, options)\n}\n\nasync function validatePartFiles(\n part: {path?: string} | undefined,\n index: number,\n options: ManifestOptions,\n) {\n const {verifyCompiledParts, verifySourceParts, paths} = options\n if (!part?.path) {\n return\n }\n\n const ext = path.extname(part.path)\n if (paths?.source && ext && ext !== '.js' && buildExtensions.includes(ext)) {\n throw new Error(\n `Invalid sanity.json: Part path has extension which is not applicable after compiling. ${ext} becomes .js after compiling. Specify filename without extension (${path.basename(\n part.path,\n )}) (parts[${index}])`,\n )\n }\n\n if (!verifySourceParts && !verifyCompiledParts) {\n return\n }\n\n const [srcExists, outDirExists] = await Promise.all([\n hasSourceFile(part.path, paths),\n verifyCompiledParts && hasCompiledFile(part.path, paths),\n ])\n\n if (!srcExists) {\n throw new Error(\n `Invalid sanity.json: Part path references file that does not exist in source directory (${\n paths?.source || paths?.basePath\n }) (parts[${index}])`,\n )\n }\n\n if (verifyCompiledParts && !outDirExists) {\n throw new Error(\n `Invalid sanity.json: Part path references file (\"${part.path}\") that does not exist in compiled directory (${paths?.compiled}) (parts[${index}])`,\n )\n }\n}\n\nfunction validatePartNames(\n part: {name?: string; implements?: string} | undefined,\n index: number,\n options: ManifestOptions,\n) {\n const pluginName = options.pluginName ? options.pluginName.replace(/^sanity-plugin-/, '') : ''\n if (!part?.name || !part?.name?.startsWith(`part:${pluginName}/`)) {\n throw new Error(\n `Invalid sanity.json: \"name\" must be prefixed with \"part:${pluginName}/\" - got \"${part?.name}\" (parts[${index}])`,\n )\n }\n\n if (!part?.implements?.startsWith('part:')) {\n throw new Error(\n `Invalid sanity.json: \"implements\" must be prefixed with \"part:\" - got \"${part?.implements}\" (parts[${index}])`,\n )\n }\n}\n\nfunction validateAllowedPartKeys(part: Record<string, any>, index: number) {\n const disallowed = Object.keys(part)\n .filter((key) => !allowedPartProps.includes(key))\n .map((key) => `\"${key}\"`)\n\n if (disallowed.length > 0) {\n const plural = disallowed.length > 1 ? 's' : ''\n const joined = disallowed.join(', ')\n throw new Error(\n `Invalid sanity.json: Key${plural} ${joined} ${\n plural ? 'are' : 'is'\n } not allowed in a part declaration (parts[${index}])`,\n )\n }\n}\n\nfunction validatePartStringValues(part: Record<string, any>, index: number) {\n const nonStrings = Object.keys(part)\n .filter((key) => typeof part[key] !== 'string')\n .map((key) => `\"${key}\"`)\n\n if (nonStrings.length > 0) {\n const plural = nonStrings.length > 1 ? 's' : ''\n const joined = nonStrings.join(', ')\n throw new Error(\n `Invalid sanity.json: Key${plural} ${joined} should be of type string (parts[${index}])`,\n )\n }\n}\n\nfunction isObject(obj: any) {\n return !Array.isArray(obj) && obj !== null && typeof obj === 'object'\n}\n\nexport async function hasSanityJson(basePath: string) {\n const file = await readJsonFile<{root?: boolean}>(path.join(basePath, 'sanity.json')).catch(\n errorToUndefined,\n )\n return {exists: Boolean(file), isRoot: Boolean(file && file.root)}\n}\n\nexport async function findStudioV3Config(basePath: string) {\n const jsFile = 'sanity.config.js'\n const jsExists = await fileExists(path.join(basePath, jsFile))\n if (jsExists) {\n return {v3ConfigFile: jsFile}\n }\n const tsFile = 'sanity.config.ts'\n const tsExists = await fileExists(path.join(basePath, tsFile))\n return {v3ConfigFile: tsExists ? tsFile : undefined}\n}\n","import path from 'path'\nimport {URL} from 'url'\n\n// @ts-expect-error missing types\nimport githubUrlToObject from 'github-url-to-object'\nimport inquirer from 'inquirer'\n// @ts-expect-error missing types\nimport validNpmName from 'validate-npm-package-name'\n\nimport {InjectOptions} from '../actions/inject'\n\nexport async function prompt(\n message: string,\n options: {\n choices?: any\n type?: string\n default?: any\n filter?: (val: any) => any\n validate?: (val: any) => boolean | string\n },\n) {\n const type = options.choices ? 'list' : options.type\n const result = await inquirer.prompt([{...options, type, message, name: 'single'}])\n return result && result.single\n}\n\nprompt.separator = () => new inquirer.Separator()\n\nexport function promptForPackageName({basePath}: InjectOptions, defaultVal?: string) {\n return prompt('Plugin name (sanity-plugin-...)', {\n default: defaultVal || path.basename(basePath),\n filter: (name) => {\n const prefixless = name.trim().replace(/^sanity-plugin-/, '')\n return name[0] === '@' ? name : `sanity-plugin-${prefixless}`\n },\n validate: (name) => {\n const valid: {errors?: string[]} = validNpmName(name)\n if (valid.errors) {\n return valid.errors[0]\n }\n\n if (name[0] !== '@' && name.endsWith('plugin')) {\n return `Name shouldn't include \"plugin\" multiple times (${name})`\n }\n\n return true\n },\n })\n}\n\nexport function promptForRepoOrigin(_options: InjectOptions, defaultVal?: string) {\n return prompt('Git repository URL', {\n default: defaultVal,\n filter: (raw) => {\n const url = (raw || '').trim()\n const gh: {user: string; repo: string} | undefined = githubUrlToObject(url)\n return gh ? `git+ssh://git@github.com/${gh.user}/${gh.repo}.git` : url\n },\n validate: (url) => {\n if (!url) {\n return true\n }\n\n try {\n const parsed = new URL(url)\n return parsed ? true : 'Invalid URL'\n } catch {\n return 'Invalid URL'\n }\n },\n })\n}\n","import crypto from 'crypto'\nimport fs from 'fs'\nimport path from 'path'\nimport util from 'util'\n\nimport json5 from 'json5'\nimport pAny from 'p-any'\n\nimport {InitFlags} from '../actions/init'\nimport {buildExtensions} from '../configs/buildExtensions'\nimport {ManifestPaths} from '../sanity/manifest'\nimport log from './log'\nimport {prompt} from './prompt'\n\nconst stat = util.promisify(fs.stat)\nexport const mkdir = util.promisify(fs.mkdir)\nconst readdir = util.promisify(fs.readdir)\nconst copyFile = util.promisify(fs.copyFile)\nexport const readFile = util.promisify(fs.readFile)\nexport const writeFile = util.promisify(fs.writeFile)\n\nexport function hasSourceEquivalent(compiledFile: string, paths: ManifestPaths) {\n if (!paths.source) {\n return fileExists(\n path.isAbsolute(compiledFile) ? compiledFile : path.resolve(paths.basePath, compiledFile),\n )\n }\n\n // /plugin/dist/MyComponent.js => /plugin/src\n const baseDir = path.dirname(compiledFile.replace(paths.compiled as string, paths.source))\n\n // /plugin/dist/MyComponent.js => MyComponent\n const baseName = path.basename(compiledFile, path.extname(compiledFile))\n\n // MyComponent => /plugin/src/MyComponent\n const pathStub = path.join(baseDir, baseName)\n\n /*\n * /plugin/src/MyComponent => [\n * /plugin/src/MyComponent.jsx,\n * /plugin/src/MyComponent.mjs,\n * ...\n * ]\n */\n return buildCandidateExists(pathStub)\n}\n\n// Generally used for parts resolving\nexport async function hasSourceFile(filePath: string, paths?: ManifestPaths) {\n if (!paths?.source) {\n return fileExists(\n path.isAbsolute(filePath) ? filePath : path.resolve(paths?.basePath ?? '', filePath),\n )\n }\n\n // filePath: components/SomeInput\n // paths: {source: '/plugin/src'}\n // MyComponent => /plugin/src/MyComponent\n const pathStub = path.isAbsolute(filePath) ? filePath : path.resolve(paths.source, filePath)\n\n if (await fileExists(pathStub)) {\n return true\n }\n\n return buildCandidateExists(pathStub)\n}\n\n// Generally used for parts resolving\nexport function hasCompiledFile(filePath: string, paths?: ManifestPaths) {\n if (!paths?.compiled) {\n return fileExists(\n path.isAbsolute(filePath) ? filePath : path.resolve(paths?.basePath ?? '', filePath),\n )\n }\n\n // filePath: components/SomeInput\n // paths: {compiled: '/plugin/dist'}\n\n // components/SomeInput => /plugin/dist/components/SomeInput\n const absPath = path.isAbsolute(filePath) ? filePath : path.resolve(paths.compiled, filePath)\n\n // /plugin/dist/components/SomeInput => /plugin/dist/components/SomeInput.js\n // /plugin/dist/components/SomeInput.js => /plugin/dist/components/SomeInput.js\n // /plugin/dist/components/SomeInput.css => /plugin/dist/components/SomeInput.css\n const fileExt = path.extname(absPath)\n const withExt = fileExt === '' ? `${absPath}.js` : absPath\n\n return fileExists(withExt)\n}\n\nfunction buildCandidateExists(pathStub: string) {\n const candidates = buildExtensions.map((extCandidate) => `${pathStub}${extCandidate}`)\n\n return pAny(candidates.map((candidate) => stat(candidate)))\n .then(() => true)\n .catch(() => false)\n}\n\nexport function fileExists(filePath: string) {\n return stat(filePath)\n .then(() => true)\n .catch(() => false)\n}\n\nexport async function readJsonFile<T>(filePath: string) {\n const content = await readFile(filePath, 'utf8')\n return JSON.parse(content) as T\n}\n\nexport function writeJsonFile(filePath: string, content: Record<string, unknown>) {\n const data = JSON.stringify(content, null, 2) + '\\n'\n return writeFile(filePath, data, {encoding: 'utf8'})\n}\n\nexport async function writeFileWithOverwritePrompt(\n filePath: string,\n content: string,\n options: {default?: any; force?: boolean} & fs.ObjectEncodingOptions,\n) {\n const {default: defaultVal, force = false, ...writeOptions} = options\n const withinCwd = filePath.startsWith(process.cwd())\n const printablePath = withinCwd ? path.relative(process.cwd(), filePath) : filePath\n\n if (await fileEqualsData(filePath, content)) {\n return false\n }\n\n if (\n !force &&\n (await fileExists(filePath)) &&\n !(await prompt(`File \"${printablePath}\" already exists. Overwrite?`, {\n type: 'confirm',\n default: defaultVal,\n }))\n ) {\n return false\n }\n\n await writeFile(filePath, content, writeOptions)\n return true\n}\n\nexport async function copyFileWithOverwritePrompt(from: string, to: string, flags: InitFlags) {\n const withinCwd = to.startsWith(process.cwd())\n const printablePath = withinCwd ? path.relative(process.cwd(), to) : to\n\n if (await filesAreEqual(from, to)) {\n return false\n }\n\n await ensureDirectoryExists(to)\n\n if (\n !flags.force &&\n (await fileExists(to)) &&\n !(await prompt(`File \"${printablePath}\" already exists. Overwrite?`, {\n type: 'confirm',\n default: false,\n }))\n ) {\n return false\n }\n\n await copyFile(from, to)\n return true\n}\n\nasync function ensureDirectoryExists(filePath: string): Promise<void> {\n const dirname = path.dirname(filePath)\n if (await fileExists(dirname)) {\n return\n }\n await ensureDirectoryExists(dirname)\n await mkdir(dirname)\n}\n\nasync function fileEqualsData(filePath: string, content: string) {\n const contentHash = crypto.createHash('sha1').update(content).digest('hex')\n const remoteHash = await getFileHash(filePath)\n return contentHash === remoteHash\n}\n\nasync function filesAreEqual(file1: string, file2: string) {\n const [hash1, hash2] = await Promise.all([getFileHash(file1, false), getFileHash(file2)])\n return hash1 === hash2\n}\n\nfunction getFileHash(filePath: string, allowMissing = true) {\n return new Promise((resolve, reject) => {\n const hash = crypto.createHash('sha1')\n const stream = fs.createReadStream(filePath)\n stream.on('error', (err) => {\n if ((err as {code?: string}).code === 'ENOENT' && allowMissing) {\n resolve(null)\n } else {\n reject(err)\n }\n })\n\n stream.on('end', () => resolve(hash.digest('hex')))\n stream.on('data', (chunk) => hash.update(chunk))\n })\n}\n\nexport async function ensureDir(dirPath: string) {\n try {\n await mkdir(dirPath)\n } catch (err) {\n if ((err as {code?: string}).code !== 'EEXIST') {\n throw err\n }\n }\n}\n\nexport async function isEmptyish(dirPath: string) {\n const ignoredFiles = ['.git', '.gitignore', 'license', 'readme.md']\n const allFiles = await readdir(dirPath).catch(() => [])\n const files = allFiles.filter((file) => !ignoredFiles.includes(file.toLowerCase()))\n return files.length === 0\n}\n\nasync function readFileContent({\n filename,\n basePath,\n}: {\n filename: string\n basePath: string\n}): Promise<string | undefined> {\n const filepath = path.normalize(path.join(basePath, filename))\n try {\n return await readFile(filepath, 'utf8')\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n log.debug(`No ${filename} file found.`)\n return undefined\n }\n throw new Error(`Failed to read \"${filepath}\": ${err.message}`)\n }\n}\n\nexport async function readJson5File<T>({\n filename,\n basePath,\n}: {\n filename: string\n basePath: string\n}): Promise<T | undefined> {\n const content = await readFileContent({filename, basePath})\n if (!content) {\n return undefined\n }\n\n return parseJson5<T>(content, filename)\n}\n\nfunction parseJson5<T>(content: string, errorKey: string): T {\n try {\n return json5.parse<T>(content)\n } catch (err: any) {\n throw new Error(`Error parsing \"${errorKey}\": ${err.message}`)\n }\n}\n","import {getIt} from 'get-it'\nimport {jsonRequest, jsonResponse, httpErrors, headers, promise} from 'get-it/middleware'\n\nimport pkg from '../../package.json'\n\nexport const request = getIt([\n promise({onlyBody: true}),\n jsonRequest(),\n jsonResponse(),\n httpErrors(),\n headers({'User-Agent': `${pkg.name}@${pkg.version}`}),\n])\n","import {execSync} from 'child_process'\nimport path from 'path'\n\nimport {validate as isValidEmail} from 'email-validator'\nimport xdgBasedir from 'xdg-basedir'\n\nimport {InjectOptions} from '../actions/inject'\nimport {PackageJson} from '../actions/verify/types'\nimport {readJsonFile} from './files'\nimport {prompt} from './prompt'\nimport {request} from './request'\n\nexport interface User {\n name: string\n email?: string\n}\n\nexport async function getUserInfo(\n {requireUserConfirmation, flags}: InjectOptions,\n pkg?: PackageJson,\n): Promise<User | undefined> {\n const userInfo =\n getPackageUserInfo({author: flags.author ?? pkg?.author}) ||\n (await getSanityUserInfo()) ||\n (await getGitUserInfo())\n if (requireUserConfirmation) {\n return promptForInfo(userInfo)\n }\n\n return userInfo\n}\n\nfunction getPackageUserInfo(pkg?: {\n author?:\n | string\n | {\n name: string\n email?: string\n }\n}): User | undefined {\n let author = pkg?.author\n if (!author) {\n return undefined\n }\n\n if (author && typeof author !== 'string') {\n return author\n } else if (!author.includes('@')) {\n return {name: author}\n }\n\n const [pre, ...post] = author.replace(/[<>[\\]]/g, '').split(/@/)\n const nameParts = pre.split(/\\s+/)\n const email = [nameParts[nameParts.length - 1], ...post].join('@')\n const name = nameParts.slice(0, -1).join(' ')\n return {name, email}\n}\n\nasync function promptForInfo(defValue?: User) {\n const name = await prompt('Author name', {\n filter: filterString,\n default: defValue && defValue.name,\n validate: requiredString,\n })\n\n const email = await prompt('Author email', {\n filter: filterString,\n default: defValue && defValue.email,\n validate: validOrEmptyEmail,\n })\n\n return {name, email}\n}\n\nasync function getSanityUserInfo(): Promise<User | undefined> {\n try {\n const data = await readJsonFile<{authToken?: string}>(\n path.join(xdgBasedir.config ?? '', 'sanity', 'config.json'),\n )\n const token = data?.authToken\n\n if (!token) {\n return undefined\n }\n\n const user = await request({\n url: 'https://api.sanity.io/v1/users/me',\n headers: {Authorization: `Bearer ${token}`},\n })\n\n if (!user) {\n return undefined\n }\n\n const {name, email} = user\n return {name, email}\n } catch {\n return undefined\n }\n}\n\nasync function getGitUserInfo(): Promise<User | undefined> {\n try {\n const name = execSync('git config user.name', {encoding: 'utf8'}).trim()\n const email = execSync('git config user.email', {encoding: 'utf8'}).trim()\n\n if (!name) {\n return undefined\n }\n\n return {name, email: email || undefined}\n } catch {\n return undefined\n }\n}\n\nfunction filterString(val: string) {\n return (val || '').trim()\n}\n\nfunction requiredString(value: string) {\n return value.length > 1 ? true : 'Required'\n}\n\nfunction validOrEmptyEmail(value: string): true | string {\n if (!value) {\n return true\n }\n\n return isValidEmail(value) ? true : 'Must either be a valid email or empty'\n}\n","// @ts-expect-error missing types\nimport licenses from '@rexxars/choosealicense-list'\nimport outdent from 'outdent'\n\nimport {PackageData} from '../actions/inject'\nimport {User} from './user'\n\nexport function generateReadme(data: PackageData) {\n const {user, pluginName, license} = data\n\n return (\n outdent`\n # ${pluginName}\n\n\n ${installationSnippet(pluginName ?? 'unknown')}\n\n ## Usage\n\n Add it as a plugin in \\`sanity.config.ts\\` (or .js):\n\n \\`\\`\\`ts\n import {defineConfig} from 'sanity'\n import {myPlugin} from '${pluginName}'\n\n export default defineConfig({\n //...\n plugins: [myPlugin({})],\n })\n \\`\\`\\`\n\n ${getLicenseText(license?.id, user?.name ? (user as User) : undefined)}\n ${developTestSnippet()}\n ` + '\\n'\n )\n}\n\nexport function installationSnippet(packageName: string) {\n return outdent`\n ## Installation\n\n \\`\\`\\`sh\n npm install ${packageName}\n \\`\\`\\`\n `\n}\n\nexport function developTestSnippet() {\n return outdent`\n ## Develop & test\n\n This plugin uses [@sanity/plugin-kit](https://github.com/sanity-io/plugin-kit)\n with default configuration for build & watch scripts.\n\n See [Testing a plugin in Sanity Studio](https://github.com/sanity-io/plugin-kit#testing-a-plugin-in-sanity-studio)\n on how to run this plugin with hotreload in the studio.\n `\n}\n\nexport function getLicenseText(licenseId?: string, user?: User) {\n if (!licenseId) {\n return ''\n }\n\n let licenseName: string | undefined = licenses.find(licenseId).title\n licenseName = licenseName?.replace(/\\s+license$/i, '')\n\n let licenseText = '## License\\n'\n if (licenseName && user?.name) {\n licenseText = `${licenseText}\\n[${licenseName}](LICENSE) © ${user?.name}\\n`\n } else if (licenseName) {\n licenseText = `${licenseText}\\n[${licenseName}](LICENSE)\\n`\n } else {\n licenseText = `${licenseText}\\nSee [LICENSE](LICENSE)`\n }\n\n return licenseText\n}\n\nexport function isDefaultGitHubReadme(readme: string) {\n if (!readme) {\n return false\n }\n\n const lines = readme.split('\\n', 20).filter(Boolean)\n\n // title + _optional_ description\n return lines.length <= 2 && lines[0].startsWith('#')\n}\n","import path from 'path'\n\nimport chalk from 'chalk'\nimport outdent from 'outdent'\n\nimport {Injectable, InjectOptions, writeAssets} from '../actions/inject'\nimport {PackageJson} from '../actions/verify/types'\nimport {\n addPackageJsonScripts,\n addScript,\n getPackage,\n sortKeys,\n writePackageJsonDirect,\n} from '../npm/package'\nimport {resolveLatestVersions} from '../npm/resolveLatestVersions'\nimport {errorToUndefined} from '../util/errorToUndefined'\nimport {readFile, writeFile} from '../util/files'\nimport log from '../util/log'\nimport {developTestSnippet, getLicenseText, installationSnippet} from '../util/readme'\nimport {getUserInfo} from '../util/user'\nimport {Preset} from './presets'\n\nexport const semverWorkflowPreset: Preset = {\n name: 'semver-workflow',\n description:\n 'Files and dependencies for conventional-commits, github workflow and semantic-release.',\n apply: applyPreset,\n}\n\nconst info = (write: boolean, msg: string, ...args: string[]) => write && log.info(msg, ...args)\n\nasync function applyPreset(options: InjectOptions) {\n await writeAssets(semverWorkflowFiles(), options)\n await addPrepareScript(options)\n await addDevDependencies(options)\n await updateReadme(options)\n}\n\nasync function addPrepareScript(options: InjectOptions) {\n const pkg = await getPackage(options)\n const didWrite = await addPackageJsonScripts(pkg, options, (scripts) => {\n scripts.prepare = addScript(`husky`, scripts.prepare)\n return scripts\n })\n info(didWrite, 'Added prepare script to package.json')\n}\n\nasync function addDevDependencies(options: InjectOptions) {\n const pkg = await getPackage(options)\n const devDeps = sortKeys({\n ...pkg.devDependencies,\n ...(await semverWorkflowDependencies()),\n })\n const newPkg = {...pkg}\n newPkg.devDependencies = devDeps\n await writePackageJsonDirect(newPkg, options)\n log.info('Updated devDependencies.')\n\n log.info(\n chalk.green(\n outdent`\n semantic-release preset injected.\n\n Please confer\n https://github.com/sanity-io/plugin-kit/blob/main/docs/semver-workflow.md#manual-steps-after-inject\n to finalize configuration for this preset.\n `.trim(),\n ),\n )\n}\n\nasync function updateReadme(options: InjectOptions) {\n const {basePath} = options\n\n const readmePath = path.join(basePath, 'README.md')\n const readme = (await readFile(readmePath, 'utf8').catch(errorToUndefined)) ?? ''\n\n const {install, usage, developTest, license, releaseSnippet} = await readmeSnippets(options)\n\n const prependSections = missingSections(readme, [install, usage])\n const appendSections = missingSections(readme, [license, developTest, releaseSnippet])\n\n if (prependSections.length || appendSections.length) {\n const updatedReadme = [...prependSections, readme, ...appendSections]\n .filter(Boolean)\n .join('\\n\\n')\n await writeFile(readmePath, updatedReadme, {encoding: 'utf8'})\n log.info('Updated README. Please review the changes.')\n }\n}\n\nasync function readmeSnippets(options: InjectOptions) {\n const pkg = await getPackage(options)\n const user = await getUserInfo(options, pkg)\n\n const bestEffortUrl = readmeBaseurl(pkg)\n\n const install = installationSnippet(pkg.name ?? 'unknown')\n\n const usage = outdent`\n ## Usage\n `\n\n const license = getLicenseText(typeof pkg.license === 'string' ? pkg.license : undefined, user)\n\n const releaseSnippet = outdent`\n ### Release new version\n\n Run [\"CI & Release\" workflow](${bestEffortUrl}/actions/workflows/main.yml).\n Make sure to select the main branch and check \"Release new version\".\n\n Semantic release will only release on configured branches, so it is safe to run release on any branch.\n `\n\n return {\n install,\n usage,\n license,\n developTest: developTestSnippet(),\n releaseSnippet,\n }\n}\n\n/**\n * Returns sections that does not exists \"close enough\" in readme\n */\nexport function missingSections(readme: string, sections: string[]) {\n return sections.filter((section) => !closeEnough(section, readme))\n}\n\n/**\n * a and b are considered \"close enough\" if > 50% of a lines exist in b lines\n * @param a\n * @param b\n */\nfunction closeEnough(a: string, b: string) {\n const aLines = a.split('\\n')\n const bLines = b.split('\\n')\n\n const matchingLines = aLines.filter((line) => bLines.find((bLine) => bLine === line)).length\n const isCloseEnough = matchingLines >= aLines.length * 0.5\n return isCloseEnough\n}\n\nfunction semverWorkflowFiles(): Injectable[] {\n const base: Injectable[] = [\n {\n type: 'copy',\n from: ['.github', 'workflows', 'main.yml'],\n to: ['.github', 'workflows', 'main.yml'],\n },\n {type: 'copy', from: ['.husky', 'commit-msg'], to: ['.husky', 'commit-msg']},\n {type: 'copy', from: ['.husky', 'pre-commit'], to: ['.husky', 'pre-commit']},\n {type: 'copy', from: ['.releaserc.json'], to: '.releaserc.json'},\n {type: 'copy', from: ['commitlint.template.js'], to: 'commitlint.config.js'},\n {type: 'copy', from: ['lint-staged.template.js'], to: 'lint-staged.config.js'},\n ]\n\n return base.map((fromTo) => {\n if (fromTo.type === 'copy') {\n return {\n ...fromTo,\n from: ['semver-workflow', ...fromTo.from],\n }\n }\n\n return fromTo\n })\n}\n\nasync function semverWorkflowDependencies(): Promise<Record<string, string>> {\n return resolveLatestVersions([\n '@commitlint/cli',\n '@commitlint/config-conventional',\n '@sanity/semantic-release-preset',\n 'husky',\n 'lint-staged',\n ])\n}\n\nexport function readmeBaseurl(pkg: PackageJson) {\n return ((pkg.repository?.url ?? pkg.homepage ?? 'TODO') as string)\n .replace(/.+:\\/\\//g, 'https://')\n .replace(/\\.git/g, '')\n .replace(/git@github.com\\//g, 'github.com/')\n .replace(/git@github.com:/g, 'https://github.com/')\n .replace(/#.+/g, '')\n}\n","export const forcedPackageVersions = {}\n\nexport const forcedDevPackageVersions = {}\n\nexport const forcedPeerPackageVersions = {\n 'react': '^18',\n 'react-dom': '^18',\n '@types/react': '^18',\n '@types/react-dom': '^18',\n 'sanity': '^3',\n 'styled-components': '^5.2',\n}\n","import chalk from 'chalk'\n\nimport {InjectOptions} from '../actions/inject'\nimport {forcedDevPackageVersions, forcedPackageVersions} from '../configs/forced-package-versions'\nimport {forceDependencyVersions, getPackage, sortKeys, writePackageJsonDirect} from '../npm/package'\nimport {resolveLatestVersions} from '../npm/resolveLatestVersions'\nimport log from '../util/log'\nimport {Preset} from './presets'\n\nexport const ui: Preset = {\n name: 'ui',\n description: '`@sanity/ui` and dependencies',\n apply: applyPreset,\n}\n\nasync function applyPreset(options: InjectOptions) {\n await addDependencies(options)\n await addDevDependencies(options)\n\n log.info(chalk.green('ui preset injected'))\n}\n\nasync function addDependencies(options: InjectOptions) {\n const pkg = await getPackage(options)\n const newDeps = sortKeys(\n forceDependencyVersions(\n {\n ...pkg.dependencies,\n ...(await resolveDependencyList()),\n },\n forcedPackageVersions,\n ),\n )\n const newPkg = {...pkg}\n newPkg.dependencies = newDeps\n await writePackageJsonDirect(newPkg, options)\n log.info('Updated dependencies.')\n}\n\nasync function addDevDependencies(options: InjectOptions) {\n const pkg = await getPackage(options)\n const newDeps = sortKeys(\n forceDependencyVersions(\n {\n ...pkg.devDependencies,\n ...(await resolveDevDependencyList()),\n },\n forcedDevPackageVersions,\n ),\n )\n const newPkg = {...pkg}\n newPkg.devDependencies = newDeps\n await writePackageJsonDirect(newPkg, options)\n log.info('Updated devDependencies.')\n}\n\nasync function resolveDependencyList(): Promise<Record<string, string>> {\n return resolveLatestVersions(['@sanity/icons', '@sanity/ui'])\n}\n\nasync function resolveDevDependencyList(): Promise<Record<string, string>> {\n return resolveLatestVersions([\n // install the peer dependencies of `@sanity/ui` as dev dependencies\n 'react',\n 'react-dom',\n 'styled-components',\n ])\n}\n","import path from 'path'\n\nimport chalk from 'chalk'\nimport outdent from 'outdent'\n\nimport {Injectable, InjectOptions, writeAssets} from '../actions/inject'\nimport {getPackage, sortKeys, writePackageJsonDirect} from '../npm/package'\nimport {resolveLatestVersions} from '../npm/resolveLatestVersions'\nimport {errorToUndefined} from '../util/errorToUndefined'\nimport {readFile, writeFile} from '../util/files'\nimport log from '../util/log'\nimport {Preset} from './presets'\n\nexport const uiWorkshop: Preset = {\n name: 'ui-workshop',\n description: 'Files for testing custom components with @sanity/ui-workshop',\n apply: applyPreset,\n}\n\nasync function applyPreset(options: InjectOptions) {\n await writeAssets(files(), options)\n await addDevDependencies(options)\n await updateGitIgnore(options)\n log.info(\n chalk.green(\n outdent`\n ui-workshop preset injected.\n\n Please confer\n https://github.com/sanity-io/plugin-kit/blob/main/docs/ui-workshop.md#manual-steps-after-inject\n to finalize configuration for this preset.\n `.trim(),\n ),\n )\n}\n\nfunction files(): Injectable[] {\n const base: Injectable[] = [\n {type: 'copy', from: ['workshop.config.ts'], to: ['workshop.config.ts']},\n {type: 'copy', from: ['src', 'CustomField.tsx'], to: ['src', 'CustomField.tsx']},\n {\n type: 'copy',\n from: ['src', '__workshop__', 'index.tsx'],\n to: ['src', '__workshop__', 'index.tsx'],\n },\n {\n type: 'copy',\n from: ['src', '__workshop__', 'props.tsx'],\n to: ['src', '__workshop__', 'props.tsx'],\n },\n ]\n\n return base.map((fromTo) => {\n if (fromTo.type === 'copy') {\n return {\n ...fromTo,\n from: ['ui-workshop', ...fromTo.from],\n }\n }\n\n return fromTo\n })\n}\n\nasync function updateGitIgnore(options: InjectOptions) {\n const {basePath} = options\n const gitignorePath = path.join(basePath, '.gitignore')\n let gitignore = (await readFile(gitignorePath, 'utf8').catch(errorToUndefined)) ?? ''\n const value = '.workshop'\n if (gitignore.includes(value)) {\n return\n }\n\n gitignore += `\\n\\n${value}`\n await writeFile(gitignorePath, gitignore, {encoding: 'utf8'})\n}\n\nasync function addDevDependencies(options: InjectOptions) {\n const pkg = await getPackage(options)\n const devDeps = sortKeys({\n ...pkg.devDependencies,\n ...(await devDependencies()),\n })\n const newPkg = {...pkg}\n newPkg.devDependencies = devDeps\n await writePackageJsonDirect(newPkg, options)\n log.info('Updated devDependencies.')\n}\n\nasync function devDependencies(): Promise<Record<string, string>> {\n return resolveLatestVersions([\n '@sanity/ui-workshop',\n '@sanity/icons',\n '@sanity/ui',\n 'react',\n 'react-dom',\n 'styled-components',\n ])\n}\n","import {InjectOptions} from '../actions/inject'\nimport {renovatePreset} from './renovatebot'\nimport {semverWorkflowPreset} from './semver-workflow'\nimport {ui} from './ui'\nimport {uiWorkshop} from './ui-workshop'\n\nexport interface Preset {\n name: string\n description: string\n apply: (options: InjectOptions) => Promise<void>\n}\n\nconst presets: Preset[] = [semverWorkflowPreset, renovatePreset, ui, uiWorkshop]\nconst presetNames = presets.map((p) => p?.name)\n\nexport function presetHelpList(padStart: number) {\n return presets\n .map((p) => `${''.padStart(padStart)}${p.name.padEnd(20)}${p.description}`)\n .join('\\n')\n}\n\nexport async function injectPresets(options: InjectOptions) {\n if (options.flags.presetOnly && !options.flags.preset?.length) {\n throw new Error('--preset-only, but no --preset [preset-name] was provided.')\n }\n\n const applyPresets = presetsFromInput(options.flags.preset)\n for (const preset of applyPresets) {\n await preset.apply(options)\n }\n}\n\nfunction presetsFromInput(inputPresets: string[] | undefined): Preset[] {\n if (!inputPresets) {\n return []\n }\n const unknownPresets = inputPresets.filter((p) => !presetNames.includes(p))\n if (unknownPresets.length) {\n throw new Error(\n `Unknown --preset(s): [${unknownPresets.join(', ')}]. Must be one of: [${presetNames.join(\n ', ',\n )}]`,\n )\n }\n\n return inputPresets\n .filter(onlyUnique)\n .map((presetName) => presets.find((p) => p.name === presetName))\n .filter((p): p is Preset => !!p)\n}\n\nfunction onlyUnique(value: string, index: number, arr: string[]) {\n return arr.indexOf(value) === index\n}\n","import path from 'path'\nimport {fileURLToPath} from 'url'\n\n// @ts-expect-error missing types\nimport licenses from '@rexxars/choosealicense-list'\nimport gitRemoteOriginUrl from 'git-remote-origin-url'\n\nimport {eslintignoreTemplate, eslintrcTemplate} from '../configs/eslint'\nimport {gitignoreTemplate} from '../configs/git'\nimport {pkgConfigTemplate} from '../configs/pkg-config'\nimport {prettierignoreTemplate} from '../configs/prettier'\nimport {tsconfigTemplateDist, tsconfigTemplate, tsconfigTemplateSettings} from '../configs/tsconfig'\nimport {addBuildScripts, getPackage, writePackageJson} from '../npm/package'\nimport {injectPresets} from '../presets/presets'\nimport {errorToUndefined} from '../util/errorToUndefined'\nimport {\n copyFileWithOverwritePrompt,\n fileExists,\n readFile,\n writeFile,\n writeFileWithOverwritePrompt,\n} from '../util/files'\nimport log from '../util/log'\nimport {prompt, promptForPackageName, promptForRepoOrigin} from '../util/prompt'\nimport {generateReadme, isDefaultGitHubReadme} from '../util/readme'\nimport {getUserInfo} from '../util/user'\nimport {InitFlags} from './init'\nimport {PackageJson} from './verify/types'\n\nconst bannedFields = ['login', 'description', 'projecturl', 'email']\nconst preferredLicenses = ['MIT', 'ISC', 'BSD-3-Clause']\nconst otherLicenses = Object.keys(licenses.list).filter((id) => {\n const license = licenses.list[id]\n return (\n !preferredLicenses.includes(id) &&\n !bannedFields.some((field) => license.body.includes(`[${field}]`))\n )\n})\n\nexport interface InjectCopyFromTo {\n type: 'copy'\n from: string | string[]\n to: string | string[]\n}\n\nexport interface InjectTemplate {\n type: 'template'\n to: string | string[]\n value: string\n force?: boolean\n}\n\nexport type Injectable = InjectCopyFromTo | InjectTemplate\n\nexport interface InjectOptions {\n basePath: string\n requireUserConfirmation?: boolean\n flags: InitFlags\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n validate?: boolean\n outDir: string\n}\n\nexport interface PackageData {\n user?: {name?: string; email?: string}\n pluginName?: string\n license?: {id: string; text: string}\n description?: string\n pkg?: PackageJson\n gitOrigin?: string\n}\n\nexport async function inject(options: InjectOptions) {\n if (options.flags.presetOnly) {\n log.info('Only apply presets, skipping default inject.')\n } else {\n await injectBase(options)\n }\n await injectPresets(options)\n}\n\nasync function injectBase(options: InjectOptions) {\n const {basePath, flags, requireUserConfirmation} = options\n const info = (write: boolean, msg: string, ...args: string[]) => write && log.info(msg, ...args)\n // Gather data\n const pkg = await getPackage(options).catch(errorToUndefined)\n log.debug('Plugin has package.json: %s', pkg ? 'yes' : 'no')\n\n const user = await getUserInfo(options, pkg)\n log.debug('User information: %o', user)\n\n const pkgName = flags.name ?? pkg?.name\n const pluginName =\n requireUserConfirmation || !pkgName ? await promptForPackageName(options, pkgName) : pkgName\n\n log.debug('Plugin name: %s', pluginName)\n\n const license = await getLicense(flags, {user, pluginName, pkg, requireUserConfirmation})\n const licenseChanged = (pkg && pkg.license) !== (license && license.id)\n log.debug('License: %s', license ? license.id : '<none>')\n\n const description = await getProjectDescription(basePath, pkg, requireUserConfirmation)\n log.debug('Description: %s', description || '<none>')\n\n const repoUrl =\n flags.repo ??\n ((await gitRemoteOriginUrl(basePath).catch(errorToUndefined)) || pkg?.repository?.url)\n\n const gitOrigin = requireUserConfirmation ? await promptForRepoOrigin(options, repoUrl) : repoUrl\n\n log.debug('Remote origin: %s', gitOrigin || '<none>')\n\n // Output\n const data: PackageData = {user, pluginName, license, description, pkg, gitOrigin}\n let didWrite\n\n // Write package.json, if returns the original (data.pkg) if it was unchanged,\n // otherwise it returns the new object\n const newPkg = await writePackageJson(data, options)\n info(newPkg !== pkg, 'Wrote package.json')\n data.pkg = newPkg\n\n didWrite = await writeLicense(data, options, licenseChanged)\n info(didWrite, 'Wrote license file (LICENSE)')\n\n didWrite = await writeReadme(data, options)\n info(didWrite, 'Wrote readme file (README.md)')\n\n didWrite = await writeStaticAssets(options)\n info(didWrite.length > 0, 'Wrote static asset files: %s', didWrite.join(', '))\n\n didWrite = await addBuildScripts(newPkg, options)\n info(didWrite, 'Added build scripts to package.json')\n\n didWrite = await addCompileDirToGitIgnore(options)\n info(didWrite, 'Added compilation output directory to .gitignore')\n}\n\nasync function writeReadme(data: PackageData, options: InjectOptions) {\n const {basePath} = options\n\n const readmePath = path.join(basePath, 'README.md')\n const readme = await readFile(readmePath, 'utf8').catch(errorToUndefined)\n\n if (readme && !isDefaultGitHubReadme(readme)) {\n return false\n }\n\n await writeFileWithOverwritePrompt(readmePath, generateReadme(data), {\n encoding: 'utf8',\n force: options.flags.force,\n })\n return true\n}\n\nasync function writeLicense(\n {license}: PackageData,\n options: InjectOptions,\n licenseChanged: boolean,\n) {\n const {basePath, flags} = options\n\n if ((flags.license as unknown as boolean) === false || !license) {\n return false\n }\n\n // Prefer whatever path the user is currenly using (LICENSE.md or LICENSE)\n const hasLicenseMdFile = await fileExists(path.join(basePath, 'LICENSE.md'))\n const licensePath = path.join(basePath, hasLicenseMdFile ? 'LICENSE.md' : 'LICENSE')\n\n await writeFileWithOverwritePrompt(licensePath, license.text, {\n encoding: 'utf8',\n default: licenseChanged,\n force: flags.force,\n })\n\n return true\n}\n\nasync function getLicense(\n flags: InitFlags,\n {\n user,\n pluginName,\n pkg,\n requireUserConfirmation,\n }: PackageData & {requireUserConfirmation?: boolean},\n) {\n const license = await getLicenseIdentifier(flags, pkg, requireUserConfirmation)\n if (!license) {\n return undefined\n }\n\n const text = license.body\n .replace(/\\[fullname\\]/g, user?.name)\n .replace(/\\[project\\]/g, pluginName)\n .replace(/\\[year\\]/g, new Date().getFullYear())\n\n return {id: license.id, text}\n}\n\nasync function getLicenseIdentifier(\n flags: InitFlags,\n pkg: PackageJson | undefined,\n requireUserConfirmation = false,\n) {\n // --no-license\n if ((flags.license as unknown) === false) {\n return null\n }\n\n // --license becomes \"\", --license mit beocomes \"mit\"\n if (typeof flags.license === 'string') {\n const license = licenses.find(`${flags.license}`)\n if (!license) {\n throw new Error(`License \"${flags.license}\" not found`)\n }\n return license\n }\n\n // no --license flag provided, do we have one in package already?\n if (pkg && pkg.license && !requireUserConfirmation) {\n const license = licenses.find(`${pkg.license}`)\n if (license) {\n return license\n }\n\n // Warn, then prompt the user\n log.warn(`package.json contains license \"${pkg.license}\", which is not recognized`)\n }\n\n const licenseId = await prompt('Which license do you want to use?', {\n default: pkg && pkg.license && licenses.find(pkg.license) ? pkg.license : preferredLicenses[0],\n choices: [\n prompt.separator(),\n ...preferredLicenses.map((value) => ({value, name: licenses.list[value].title})),\n prompt.separator(),\n ...otherLicenses.map((value) => ({value, name: licenses.list[value].title})),\n ],\n })\n\n return licenses.find(licenseId)\n}\n\nasync function getProjectDescription(\n basePath: string,\n pkg: PackageJson | undefined,\n requireUserConfirmation = false,\n) {\n let description = await resolveProjectDescription(basePath, pkg)\n if (requireUserConfirmation) {\n description = await prompt('Plugin description', {default: description || ''})\n }\n return description ?? ''\n}\n\nasync function resolveProjectDescription(basePath: string, pkg: PackageJson | undefined) {\n // Try to grab from package.json\n if (pkg && typeof pkg.description === 'string' && pkg.description.length > 5) {\n return pkg.description\n }\n\n // Try to grab a project description from a standard GitHub-generated readme\n try {\n const readmePath = path.join(basePath, 'README.md')\n const readme = await readFile(readmePath, 'utf8')\n const [title, description] = readme.split('\\n').filter(Boolean)\n if (!title || !description || !title.match(/^#\\s+\\w+/)) {\n return null\n }\n\n // Naive, but this isn't too important\n const unlinked = description.replace(/\\[(.*?)\\]\\(.*?\\)/g, '$1')\n if (/^[^#]/.test(unlinked)) {\n return unlinked\n }\n\n return null\n } catch (err) {\n return errorToUndefined(err)\n }\n}\n\nexport async function writeAssets(injectables: Injectable[], {basePath, flags}: InjectOptions) {\n const assetsDir = await findAssetsDir()\n\n const from = (...segments: string[]) => path.join(assetsDir, 'inject', ...segments)\n const to = (...segments: string[]) => path.join(basePath, ...segments)\n\n const writes: string[] = []\n for (const injectable of injectables) {\n if (injectable.type === 'copy') {\n const fromPath = asArray(injectable.from)\n const toPath = asArray(injectable.to)\n if (await copyFileWithOverwritePrompt(from(...fromPath), to(...toPath), flags)) {\n writes.push(path.join(...toPath))\n }\n continue\n }\n\n if (injectable.type === 'template') {\n const toPath = asArray(injectable.to)\n\n await writeFileWithOverwritePrompt(to(...toPath), `${injectable.value.trim()}\\n`, {\n default: 'n',\n force: injectable.force || flags.force,\n })\n\n writes.push(path.join(...toPath))\n continue\n }\n\n throw new Error(`Unknown operation type \"${(injectable as any).type}\"`)\n }\n\n return writes\n}\n\nasync function writeStaticAssets(options: InjectOptions) {\n const {outDir, flags} = options\n\n const files: Injectable[] = [\n flags.eslint && eslintrcTemplate({flags: options.flags}),\n flags.eslint && eslintignoreTemplate({outDir, flags: options.flags}),\n {type: 'copy', from: 'editorconfig', to: '.editorconfig'},\n {type: 'copy', from: 'sanity.json', to: 'sanity.json'},\n {type: 'copy', from: 'v2-incompatible.js.template', to: 'v2-incompatible.js'},\n pkgConfigTemplate({outDir, flags: options.flags}),\n flags.gitignore && gitignoreTemplate(),\n flags.typescript && tsconfigTemplate({flags: options.flags}),\n flags.typescript && tsconfigTemplateDist({outDir, flags: options.flags}),\n flags.typescript && tsconfigTemplateSettings({outDir, flags: options.flags}),\n flags.prettier && prettierignoreTemplate({outDir}),\n flags.prettier && {type: 'copy', from: 'prettierrc.json', to: '.prettierrc'},\n ]\n .map((f) => (f ? (f as Injectable) : undefined))\n .filter((f): f is Injectable => !!f)\n\n const result = writeAssets(files, options)\n\n return result\n}\n\nfunction asArray(input: string | string[]): string[] {\n return typeof input === 'string' ? [input] : input\n}\n\n/**\n * assets dir might be in higher or lower in the dir hierarchy depending on\n * if we run from `dist` or `src`\n */\nasync function findAssetsDir(): Promise<string> {\n let maxBackpaddle = 3\n let currDir = path.dirname(fileURLToPath(import.meta.url))\n let assetsDir: string = ''\n while (!assetsDir && maxBackpaddle) {\n currDir = path.join(currDir, '..')\n const assets = path.join(currDir, 'assets')\n if (await fileExists(assets)) {\n assetsDir = assets\n } else {\n maxBackpaddle--\n }\n }\n\n if (!assetsDir) {\n throw new Error('Could not find assets directory!')\n }\n return assetsDir\n}\n\nasync function addCompileDirToGitIgnore(options: InjectOptions) {\n const gitIgnorePath = path.join(options.basePath, '.gitignore')\n const gitignore = await readFile(gitIgnorePath, 'utf8').catch(errorToUndefined)\n if (!gitignore) {\n return false\n }\n\n const ignore = options.outDir.replace(/^[./]+/, '').split('/')[0]\n if (!ignore) {\n return false\n }\n\n const lines = gitignore.trim().split('\\n')\n if (lines.includes(ignore)) {\n return false\n }\n\n lines.push('', '# Compiled plugin', ignore)\n\n await writeFile(gitIgnorePath, lines.join('\\n') + '\\n', {encoding: 'utf8'})\n return true\n}\n","export const mergedPackages = [\n '@sanity/base',\n '@sanity/core',\n '@sanity/types',\n '@sanity/data-aspects',\n '@sanity/default-layout',\n '@sanity/default-login',\n '@sanity/desk-tool',\n '@sanity/field',\n '@sanity/form-builder',\n '@sanity/initial-value-templates',\n '@sanity/language-filter',\n '@sanity/production-preview',\n '@sanity/react-hooks',\n '@sanity/resolver',\n '@sanity/state-router',\n '@sanity/structure',\n '@sanity/studio-hints',\n].sort()\n\nexport const deprecatedDevDeps = [\n 'tsdx',\n 'sanipack',\n 'parcel',\n '@parcel/packager-ts',\n '@parcel/transformer-typescript-types',\n]\n","import {createRequire} from 'node:module'\nimport path from 'path'\n\nimport chalk from 'chalk'\nimport outdent from 'outdent'\nimport {ParsedCommandLine} from 'typescript'\n// @ts-expect-error missing types\nimport validateNpmPackageName from 'validate-npm-package-name'\n\nimport {deprecatedDevDeps, mergedPackages} from '../../configs/banned-packages'\nimport {\n incompatiblePluginPackage,\n minPkgUtilsMajor,\n requiredNodeEngine,\n urls,\n} from '../../constants'\nimport {fileExists, readJson5File} from '../../util/files'\nimport {PackageJson, SanityStudioJson, SanityV2Json} from './types'\n\nexport const expectedScripts = {\n 'build': 'plugin-kit verify-package --silent && pkg-utils build --strict --check --clean',\n 'watch': 'pkg-utils watch --strict',\n 'link-watch': 'plugin-kit link-watch',\n 'prepublishOnly': 'npm run build',\n}\n\nfunction filesWithSuffixes(fileBases: string[], suffixes: string[]): string[] {\n return fileBases.flatMap((file) => suffixes.map((suffix) => `${file}.${suffix}`))\n}\n\nexport function validateNodeEngine(packageJson: PackageJson) {\n if (packageJson.engines?.node !== requiredNodeEngine) {\n return [\n outdent`\n Expected package.json to contain engines.node: \"${requiredNodeEngine}\" to match @sanity/pkg-utils,\n but it was: ${packageJson.engines?.node}\n\n Please add the following to package.json:\n\n \"engines\": {\n \"node\": \"${requiredNodeEngine}\"\n }`.trimStart(),\n ]\n }\n return []\n}\n\nexport function validateScripts(packageJson: PackageJson): string[] {\n const errors: string[] = []\n\n const divergentScripts = Object.entries(expectedScripts).filter(([key, expectedCommand]) => {\n const command = packageJson.scripts?.[key]\n // check for includes instead of equals to give some leniency in command params and such\n return !command || !command.includes(expectedCommand)\n })\n\n if (divergentScripts.length) {\n errors.push(\n outdent`\n The following script commands did not contain expected defaults: ${divergentScripts\n .map(([key]) => key)\n .join(', ')}\n\n This checks for that the commands-strings includes these terms.\n\n Please add the following to your package.json \"scripts\":\n\n ${divergentScripts.map(([key, value]) => `\"${key}\": \"${value}\"`).join(',\\n')}\n `.trimStart(),\n )\n }\n return errors\n}\n\nexport async function validateTsConfig(\n ts: ParsedCommandLine,\n options: {basePath: string; outDir: string; tsconfig: string},\n) {\n const {basePath, outDir, tsconfig} = options\n\n const errors: string[] = []\n\n const expectedCompilerOptions = {\n target: 'esnext',\n jsx: 'preserve',\n module: 'preserve',\n rootDir: '.',\n outDir,\n noEmit: true,\n }\n\n const wrongEntries = Object.entries(expectedCompilerOptions).filter(([key, value]) => {\n let option: any = ts.options[key]\n\n if (key === 'rootDir' && typeof option === 'string') {\n option = path.relative(basePath, option) || '.'\n }\n\n if (key === 'outDir' && typeof option === 'string') {\n option = path.relative(basePath, option) || '.'\n }\n\n if (key === 'target' && option === 99) {\n option = 'esnext'\n }\n\n if (key === 'module' && option === 200) {\n option = 'preserve'\n }\n\n if (key === 'jsx' && option === 1) {\n option = 'preserve'\n }\n\n return typeof value === 'string' && typeof option === 'string'\n ? value.toLowerCase() !== option?.toLowerCase()\n : value !== option\n })\n\n if (wrongEntries.length) {\n const expectedOutput = wrongEntries\n .map(([key, value]) => `\"${key}\": ${typeof value === 'string' ? `\"${value}\"` : value},`)\n .join('\\n')\n\n errors.push(\n outdent`\n Recommended ${tsconfig} compilerOptions missing:\n\n The following fields had unexpected values: [${wrongEntries.map(([key]) => key).join(', ')}]\n Expected to find these values:\n ${expectedOutput}\n\n Please update your ${tsconfig} accordingly.\n `.trimStart(),\n )\n }\n\n return errors\n}\n\n/**\n * Hard requirement: plugins must be ESM (`\"type\": \"module\"`).\n *\n * plugin-kit loads `package.config.ts` through `@sanity/pkg-utils`, which can only load ESM\n * TypeScript configs reliably when the plugin itself is ESM. CommonJS (or an omitted `type`)\n * is not supported and cannot be opted out of.\n */\nexport function validatePackageType({type}: PackageJson): string[] {\n if (type === 'module') {\n return []\n }\n\n return [\n outdent`\n package.json must set \"type\": \"module\" — plugins built with @sanity/plugin-kit are ESM-only.\n Found: ${type ? `\"type\": \"${type}\"` : 'no \"type\" field (defaults to \"commonjs\")'}\n\n Please add the following to package.json:\n\n \"type\": \"module\"\n `.trimStart(),\n ]\n}\n\nexport function validatePkgUtilsDependency({devDependencies}: PackageJson): string[] {\n if (!devDependencies?.['@sanity/pkg-utils']) {\n return [\n outdent`\n package.json does not list @sanity/pkg-utils as a devDependency.\n @sanity/pkg-utils replaced parcel as the recommended build tool in @sanity/plugin-kit 2.0.0\n\n Please add it by running 'npm install --save-dev @sanity/pkg-utils'.\n `.trimStart(),\n ]\n }\n return []\n}\n\n/**\n * Verifies that the installed `@sanity/pkg-utils` (the peer dependency plugin-kit loads\n * `package.config.ts` with) is recent enough to expose the `loadConfig({cwd, pkgPath})` API.\n */\nexport function validatePkgUtilsVersion({basePath}: {basePath: string}): string[] {\n const require = createRequire(path.join(basePath, 'package.json'))\n\n let installedVersion: string | undefined\n try {\n const pkgUtilsManifest = require('@sanity/pkg-utils/package.json') as {version?: string}\n installedVersion = pkgUtilsManifest.version\n } catch {\n return [\n outdent`\n @sanity/pkg-utils is not installed.\n plugin-kit loads package.config.ts through @sanity/pkg-utils (a peer dependency).\n\n Please install it by running 'npm install --save-dev @sanity/pkg-utils'.\n `.trimStart(),\n ]\n }\n\n const major = Number.parseInt(installedVersion?.split('.')[0] ?? '', 10)\n if (!Number.isFinite(major) || major < minPkgUtilsMajor) {\n return [\n outdent`\n @sanity/pkg-utils ${installedVersion} is too old.\n plugin-kit requires @sanity/pkg-utils >=${minPkgUtilsMajor} to load package.config.ts.\n\n Please upgrade it by running 'npm install --save-dev @sanity/pkg-utils@latest'.\n `.trimStart(),\n ]\n }\n\n return []\n}\n\nexport function validateSanityDependencies(packageJson: PackageJson): string[] {\n const {dependencies, devDependencies, peerDependencies} = packageJson\n const allDependencies = {...dependencies, ...devDependencies, ...peerDependencies}\n\n const illegalDeps = Object.keys(allDependencies).filter((dep) => mergedPackages.includes(dep))\n const deps = new Set<string>(illegalDeps)\n const unique = [...deps.values()]\n if (unique.length) {\n return [\n outdent`\n package.json depends on \"@sanity/*\" packages that have moved into \"sanity\" package.\n\n The following dependencies should be replaced with \"sanity\":\n - ${unique.join('\\n- ')}\n\n Refer to the reference docs to find replacement imports:\n ${urls.refDocs}\n `.trimStart(),\n ]\n }\n return []\n}\n\nexport function validateDeprecatedDependencies(packageJson: PackageJson): string[] {\n const {dependencies, devDependencies, peerDependencies} = packageJson\n const allDependencies = {...dependencies, ...devDependencies, ...peerDependencies}\n\n const illegalDeps = Object.keys(allDependencies).filter((dep) => deprecatedDevDeps.includes(dep))\n const deps = new Set<string>(illegalDeps)\n const unique = [...deps.values()]\n if (unique.length) {\n return [\n outdent`\n package.json contains deprecated dependencies that should be removed:\n - ${unique.join('\\n- ')}\n `.trimStart(),\n ]\n }\n\n return []\n}\n\nexport async function validateBabelConfig({basePath}: {basePath: string}) {\n const suffixes = ['json', 'js', 'cjs', 'mjs']\n const babelFileNames = ['.babelrc', 'babel.config']\n const filenames = ['.babelrc', ...filesWithSuffixes(babelFileNames, suffixes)]\n\n const babelFiles: string[] = []\n for (const filename of filenames) {\n const filepath = path.normalize(path.join(basePath, filename))\n if (await fileExists(filepath)) {\n babelFiles.push(filename)\n }\n }\n\n if (babelFiles.length) {\n return [\n outdent`\n Found babel-config file: [${babelFiles.join(\n ', ',\n )}]. When using default @sanity/plugin-kit build command,\n this is probably not needed.\n\n Delete the file, or disable this check.\n `.trimStart(),\n ]\n }\n return []\n}\n\nexport async function validateStudioConfig({basePath}: {basePath: string}): Promise<string[]> {\n const suffixes = ['ts', 'js', 'tsx', 'jsx']\n\n const filenames = filesWithSuffixes(['sanity.config', 'sanity.cli'], suffixes)\n\n const files: Record<string, boolean | undefined> = {}\n\n for (const filename of filenames) {\n const filepath = path.normalize(path.join(basePath, filename))\n files[filename] = await fileExists(filepath)\n }\n\n const sanityJson = await readJson5File<SanityStudioJson>({basePath, filename: 'sanity.json'})\n\n const hasConfigFile = (fileBase: string) =>\n filesWithSuffixes([fileBase], suffixes).some((filename) => files[filename])\n const hasCliConfig = hasConfigFile('sanity.cli')\n const hasStudioConfig = hasConfigFile('sanity.config')\n\n const errors: string[] = []\n\n if (sanityJson) {\n const info = [\n outdent`\n Found sanity.json. This file is not used by Sanity Studio V3.\n\n Please consult the Studio V3 migration guide:\n ${urls.migrationGuideStudio}\n It will detail how to convert sanity.json to sanity.config.ts (or .js) and sanity.cli.ts (or .js) equivalents.\n `.trimStart(),\n sanityJson.plugins?.length &&\n outdent`\n For V3 versions and alternatives to V2 plugins, please refer to the Sanity Exchange:\n ${urls.sanityExchange}\n `.trimStart(),\n ].filter((s): s is string => !!s)\n\n errors.push(info.join('\\n\\n'))\n }\n\n if (!hasCliConfig) {\n errors.push(\n outdent`\n sanity.cli.(${suffixes.join(\n ' | ',\n )}) missing. Please create a file named sanity.cli.ts with the following content:\n\n ${chalk.green(\n outdent`\n import {createCliConfig} from 'sanity/cli'\n\n export default createCliConfig({\n api: {\n projectId: '${sanityJson?.api?.projectId ?? 'project-id'}',\n dataset: '${sanityJson?.api?.dataset ?? 'dataset'}',\n }\n })`,\n )}\n\n Make sure to replace the projectId and dataset fields with your own.\n\n For more, see ${urls.migrationGuideStudio}\n `.trimStart(),\n )\n }\n\n if (!hasStudioConfig) {\n errors.push(\n outdent`\n sanity.config.(${suffixes.join(\n ' | ',\n )}) missing. At a minimum sanity.config.ts should contain:\n\n ${chalk\n .green(\n outdent`\n import { defineConfig } from \"sanity\"\n import { deskTool } from \"sanity/desk\"\n\n export default defineConfig({\n name: \"default\",\n\n projectId: '${sanityJson?.api?.projectId ?? 'project-id'}',\n dataset: '${sanityJson?.api?.dataset ?? 'dataset'}',\n\n plugins: [\n deskTool(),\n ],\n\n schema: {\n types: [\n /* put your v2 schema-types here */\n ],\n },\n })`,\n )\n .trimStart()}\n\n Make sure to replace the projectId and dataset fields with your own.\n\n For more, see ${urls.migrationGuideStudio}\n `.trimStart(),\n )\n }\n\n return errors.length ? [errors.join(`\\n\\n---\\n\\n`)] : []\n}\n\nexport async function validatePluginSanityJson({\n basePath,\n packageJson,\n}: {\n basePath: string\n packageJson: PackageJson\n}) {\n const sanityJson = await readJson5File<SanityV2Json>({basePath, filename: 'sanity.json'})\n\n const expectedDefaults = {\n parts: [\n {\n implements: 'part:@sanity/base/sanity-root',\n path: './v2-incompatible.js',\n },\n ],\n }\n\n const hasSinglePart =\n sanityJson &&\n Object.keys(sanityJson).length === 1 &&\n sanityJson?.parts &&\n sanityJson.parts.length === 1\n\n const firstPart = hasSinglePart ? sanityJson?.parts?.[0] : undefined\n const correctImplements = firstPart?.implements === expectedDefaults.parts[0].implements\n const pathExists =\n firstPart?.path && (await fileExists(path.normalize(path.join(basePath, firstPart.path))))\n const hasDependency = !!packageJson.dependencies?.[incompatiblePluginPackage]\n const isValid = sanityJson && hasSinglePart && correctImplements && pathExists && hasDependency\n\n if (!isValid) {\n const errors = [\n !sanityJson ? 'sanity.json does not exist' : null,\n !hasSinglePart ? 'sanity.json should have exactly one entry in \"parts\", but did not.' : null,\n !correctImplements\n ? `The part should implement ${expectedDefaults.parts[0].implements}, but did not.`\n : null,\n firstPart?.path && !pathExists\n ? `The file in \"path\", ${firstPart?.path}, does not exist.`\n : null,\n\n !hasDependency\n ? outdent`\n package.json should have ${incompatiblePluginPackage} as a dependency, but did not.\n Install it with: npm install --save ${incompatiblePluginPackage}\n `.trimStart()\n : null,\n ].filter((e): e is string => !!e)\n\n return [\n outdent`\n Invalid sanity.json. It is used for compatibility checking in V2 studios:\n\n - ${errors.join('\\n- ')}\n\n sanity.json will only be used when incorrectly installing a v3 plugin in a v2 Studio.\n\n This check ensures that sanity.json conforms with the usage section of\n ${urls.incompatiblePlugin}\n `.trimStart(),\n ]\n }\n return []\n}\n\nexport function validatePackageName(packageJson: PackageJson) {\n const valid: {validForNewPackages?: boolean; errors: string[]} = validateNpmPackageName(\n packageJson.name,\n )\n if (!valid.validForNewPackages) {\n return [`Invalid package.json: \"name\" is invalid: ${valid.errors.join(', ')}`]\n }\n\n const isScoped = packageJson.name?.startsWith('@')\n if (!isScoped && !packageJson.name?.startsWith('sanity-plugin-')) {\n return [\n `Invalid package.json: \"name\" should be prefixed with \"sanity-plugin-\" (or scoped - @your-company/plugin-name)`,\n ]\n }\n return []\n}\n\nexport async function validateSrcIndexFile(basePath: string) {\n const paths = ['index.js', 'index.ts'].map((p) => path.join('src', p))\n const allowedIndexFiles = paths.map((file) => path.join(basePath, file))\n\n let hasIndex = false\n for (const indexFile of allowedIndexFiles) {\n hasIndex = hasIndex || (await fileExists(indexFile))\n }\n if (!hasIndex) {\n return [\n outdent`\n Expected one of [${paths.join(', ')}] to exist.\n\n @sanity/pkg-utils expects a non-jsx file to be the source entry-point for the plugin.\n If you currently have JSX in your index file, extract it into a separate file and import it.\n `,\n ]\n }\n\n return []\n}\n\nasync function disallowDuplicateConfig({\n basePath,\n pkgJson,\n configKey,\n files,\n}: {\n basePath: string\n pkgJson: PackageJson\n configKey: string\n files: string[]\n}) {\n const found: string[] = []\n for (const file of files) {\n const filePath = path.join(basePath, file)\n const exits = await fileExists(filePath)\n if (exits) {\n found.push(file)\n }\n }\n if (found.length > 1) {\n return [\n outdent`\n Found multiple config files that serve the same purpose: [${found.join(', ')}].\n\n There should be at most one of these files. Delete the rest.\n `,\n ]\n }\n if (found.length && pkgJson[configKey]) {\n return [\n outdent`\n package.json contains ${configKey}, but there also exists a config file that serves the same purpose.\n Config file: ${found.join('')}]\n\n Either delete the file or remove ${configKey} entry from package.json.\n `,\n ]\n }\n\n return []\n}\n\nexport async function disallowDuplicateEslintConfig(basePath: string, pkgJson: PackageJson) {\n return disallowDuplicateConfig({\n basePath,\n pkgJson,\n configKey: 'eslint',\n files: [\n '.eslintrc',\n '.eslintrc.js',\n '.eslintrc.cjs',\n '.eslintrc.yaml',\n '.eslintrc.yml',\n '.eslintrc.json',\n ],\n })\n}\n\nexport async function disallowDuplicatePrettierConfig(basePath: string, pkgJson: PackageJson) {\n return disallowDuplicateConfig({\n basePath,\n pkgJson,\n configKey: 'prettier',\n files: [\n '.prettierrc',\n '.prettierrc.json5',\n '.prettierrc.json',\n '.prettierrc.yaml',\n '.prettierrc.yml',\n '.prettierrc.js',\n '.prettierrc.cjs',\n '.prettier.config,js',\n '.prettier.config.cjs',\n '.prettierrc.toml',\n ],\n })\n}\n","import fs from 'fs'\nimport path from 'path'\nimport util from 'util'\n\n// @ts-expect-error missing types\nimport githubUrl from 'github-url-to-object'\n// @ts-expect-error missing types\nimport validateNpmPackageName from 'validate-npm-package-name'\n\nimport {InjectOptions, PackageData} from '../actions/inject'\nimport {PackageJson} from '../actions/verify/types'\nimport {expectedScripts} from '../actions/verify/validations'\nimport {\n forcedDevPackageVersions,\n forcedPackageVersions,\n forcedPeerPackageVersions,\n} from '../configs/forced-package-versions'\nimport {cliName, incompatiblePluginPackage, requiredNodeEngine} from '../constants'\nimport {getPaths, ManifestOptions} from '../sanity/manifest'\nimport {hasSourceEquivalent, writeJsonFile} from '../util/files'\nimport log from '../util/log'\nimport {resolveLatestVersions} from './resolveLatestVersions'\nconst defaultDependencies = [incompatiblePluginPackage]\n\nconst defaultDevDependencies = [\n 'sanity',\n\n // peer dependencies of `sanity`\n 'react',\n 'react-dom',\n 'styled-components',\n]\n\nconst defaultPeerDependencies = ['react', 'sanity']\n\nconst readFile = util.promisify(fs.readFile)\n\nconst pathKeys: (keyof PackageJson)[] = ['main', 'module', 'browser', 'types']\n\nexport async function getPackage(opts: ManifestOptions): Promise<PackageJson> {\n const options = {flags: {}, ...opts}\n\n validateOptions(options)\n\n const {basePath, validate = true} = options\n const manifestPath = path.normalize(path.join(basePath, 'package.json'))\n\n let content\n try {\n content = await readFile(manifestPath, 'utf8')\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n throw new Error(\n `No package.json found. package.json is required to publish to npm. Use \\`${cliName} init\\` for a new plugin, or \\`npm init\\` for an existing one`,\n )\n }\n\n throw new Error(`Failed to read \"${manifestPath}\": ${err.message}`)\n }\n\n let parsed\n try {\n parsed = JSON.parse(content)\n } catch (err: any) {\n throw new Error(`Error parsing \"${manifestPath}\": ${err.message}`)\n }\n\n if (!isObject(parsed)) {\n throw new Error(`Invalid package.json: Root must be an object`)\n }\n\n if (validate) {\n await validatePackage(parsed, options)\n }\n\n return parsed\n}\n\nasync function validatePackage(manifest: PackageJson, opts: ManifestOptions) {\n validateOptions(opts)\n\n const options = {isPlugin: true, ...opts}\n\n if (options.isPlugin) {\n await validatePluginPackage(manifest, options)\n }\n\n validateLockFiles(options)\n}\n\nfunction validateOptions(opts: {basePath: string}) {\n const options = opts || {}\n if (!isObject(options)) {\n throw new Error(`Options must be an object`)\n }\n\n if (typeof options.basePath !== 'string') {\n throw new Error(`\"options.basePath\" must be a string (path to plugin base path)`)\n }\n}\n\nasync function validatePluginPackage(manifest: PackageJson, options: ManifestOptions) {\n validatePackageName(manifest)\n await validatePaths(manifest, options)\n}\n\nfunction validatePackageName(manifest: PackageJson) {\n if (typeof manifest.name !== 'string') {\n throw new Error(`Invalid package.json: \"name\" must be a string`)\n }\n\n const valid: {validForNewPackages?: boolean; errors: string[]} = validateNpmPackageName(\n manifest.name,\n )\n if (!valid.validForNewPackages) {\n throw new Error(`Invalid package.json: \"name\" is invalid: ${valid.errors.join(', ')}`)\n }\n\n const isScoped = manifest.name[0] === '@'\n if (!isScoped && !manifest.name.startsWith('sanity-plugin-')) {\n throw new Error(\n `Invalid package.json: \"name\" should be prefixed with \"sanity-plugin-\" (or scoped - @your-company/plugin-name)`,\n )\n }\n}\n\nasync function validatePaths(manifest: PackageJson, options: ManifestOptions) {\n const paths = await getPaths({\n ...options,\n pluginName: manifest.name ?? 'unknown',\n verifySourceParts: false,\n verifyCompiledParts: false,\n })\n\n const abs = (file: string) =>\n path.isAbsolute(file) ? file : path.resolve(path.join(options.basePath, file))\n\n const exists = (file: string) => fs.existsSync(abs(file))\n const willExist = (file: string) => paths && hasSourceEquivalent(abs(file), paths)\n const withinSourceDir = (file: string) => paths?.source && abs(file).startsWith(paths.source)\n const withinTargetDir = (file: string) => paths?.compiled && abs(file).startsWith(paths.compiled)\n\n for (const key of pathKeys) {\n if (!(key in manifest)) {\n continue\n }\n\n const manifestValue = manifest[key]\n if (typeof manifestValue !== 'string') {\n throw new Error(`Invalid package.json: \"${key}\" must be a string if defined`)\n }\n\n // We don't want to reference `./src/MyComponent.js` containing a bunch of JSX and whatnot,\n // instead we want to target `./dist/MyComponent.js` which is the location it'll be compiled to\n if (!options?.flags?.allowSourceTarget && paths && withinSourceDir(manifestValue)) {\n throw new Error(\n `Invalid package.json: \"${key}\" points to file within source (uncompiled) directory. Use --allow-source-target if you really want to do this.`,\n )\n }\n\n // Does it exist only because it was there prior to compilation?\n // We're clearing the folder on compilation, so we shouldn't allow it\n const fileExists = exists(manifestValue)\n if (\n fileExists &&\n paths &&\n withinTargetDir(manifestValue) &&\n !(await willExist(manifestValue))\n ) {\n throw new Error(\n `Invalid package.json: \"${key}\" points to file that will not exist after compiling`,\n )\n }\n\n // If it _doesn't_ exist and it _won't_ exist, then there isn't much point in continuing, is there?\n if (!exists(manifestValue) && !(await willExist(manifestValue))) {\n if (!paths) {\n throw new Error(`Invalid package.json: \"${key}\" points to file that does not exist`)\n }\n\n const inOutDir = paths.compiled && !abs(manifestValue).startsWith(paths.compiled)\n throw new Error(\n inOutDir\n ? `Invalid package.json: \"${key}\" points to file that does not exist, and \"paths\" is not configured to compile to this location`\n : `Invalid package.json: \"${key}\" points to file that does not exist, and no equivalent is found in source directory`,\n )\n }\n }\n}\n\nfunction isObject(obj: unknown): obj is Record<string, unknown> {\n return !Array.isArray(obj) && obj !== null && typeof obj === 'object'\n}\n\nfunction validateLockFiles(options: {basePath: string}) {\n const npm = fs.existsSync(path.join(options.basePath, 'package-lock.json'))\n const yarn = fs.existsSync(path.join(options.basePath, 'yarn.lock'))\n if (npm && yarn) {\n throw new Error(`Invalid plugin: contains both package-lock.json and yarn.lock`)\n }\n}\n\nexport async function writePackageJson(data: PackageData, options: InjectOptions) {\n const {user, pluginName, license, description, pkg: prevPkg, gitOrigin} = data\n const {\n outDir,\n peerDependencies: addPeers,\n dependencies: addDeps,\n devDependencies: addDevDeps,\n } = options\n const {flags} = options\n const prev = prevPkg || {}\n\n const usePrettier = flags.prettier !== false\n const useEslint = flags.eslint !== false\n const useTypescript = flags.eslint !== false\n\n const newDevDependencies = [cliName, '@sanity/pkg-utils']\n\n if (useTypescript) {\n log.debug('Using TypeScript. Adding to dev dependencies.')\n newDevDependencies.push('@types/react', 'typescript')\n }\n\n if (usePrettier) {\n log.debug('Using prettier. Adding to dev dependencies.')\n newDevDependencies.push('prettier', 'prettier-plugin-packagejson')\n }\n\n if (useEslint) {\n log.debug('Using eslint. Adding to dev dependencies.')\n\n newDevDependencies.push(\n 'eslint',\n 'eslint-config-sanity',\n 'eslint-plugin-react',\n 'eslint-plugin-react-hooks',\n )\n\n if (usePrettier) {\n newDevDependencies.push('eslint-config-prettier', 'eslint-plugin-prettier')\n }\n\n if (useTypescript) {\n newDevDependencies.push('@typescript-eslint/eslint-plugin', '@typescript-eslint/parser')\n }\n }\n\n log.debug('Resolving latest versions for %s', newDevDependencies.join(', '))\n const dependencies = forceDependencyVersions(\n {\n ...(prev.dependencies || {}),\n ...(addDeps || {}),\n ...(await resolveLatestVersions(defaultDependencies)),\n },\n forcedPackageVersions,\n )\n const devDependencies = forceDependencyVersions(\n {\n ...(addDevDeps || {}),\n ...(prev.devDependencies || {}),\n ...(await resolveLatestVersions([...newDevDependencies, ...defaultDevDependencies])),\n },\n forcedDevPackageVersions,\n )\n const peerDependencies = forceDependencyVersions(\n {\n ...(prev.peerDependencies || {}),\n ...(addPeers || {}),\n ...(await resolveLatestVersions(defaultPeerDependencies)),\n },\n forcedPeerPackageVersions,\n )\n\n const source = flags.typescript ? './src/index.ts' : './src/index.js'\n\n const files = [outDir, 'sanity.json', 'src', 'v2-incompatible.js']\n\n // sort alphabetically for scanability\n files.sort()\n\n // order should be compatible with prettier-plugin-packagejson\n const forcedOrder = {\n name: pluginName,\n version: prev.version ?? '1.0.0',\n description: description || '',\n keywords: prev.keywords ?? ['sanity', 'sanity-plugin'],\n ...urlsFromOrigin(gitOrigin),\n ...repoFromOrigin(gitOrigin),\n license: license ? license.id : 'UNLICENSED',\n author: user?.email ? `${user.name} <${user.email}>` : user?.name,\n sideEffects: false,\n type: 'module',\n exports: {\n '.': {\n source,\n default: `./${outDir}/index.js`,\n },\n './package.json': './package.json',\n },\n ...(flags.typescript ? {types: `./${outDir}/index.d.ts`} : {}),\n files,\n scripts: {...prev.scripts},\n dependencies: sortKeys(dependencies),\n devDependencies: sortKeys(devDependencies),\n peerDependencies: sortKeys(peerDependencies),\n engines: {\n node: requiredNodeEngine,\n },\n }\n\n const manifest: PackageJson = {\n ...forcedOrder,\n // Use already configured values by default (if not otherwise specified)\n ...(prev || {}),\n // We're de-declaring properties because of key order in package.json\n ...forcedOrder,\n }\n\n const differs = JSON.stringify(prev) !== JSON.stringify(manifest)\n log.debug('Does manifest differ? %s', differs ? 'yes' : 'no')\n if (differs) {\n await writePackageJsonDirect(manifest, options)\n }\n\n return differs ? manifest : prev\n}\n\nfunction urlsFromOrigin(gitOrigin?: string): {bugs?: {url: string}; homepage?: string} {\n const details: {user: string; repo: string} | undefined = githubUrl(gitOrigin)\n if (!details) {\n return {}\n }\n\n return {\n homepage: `https://github.com/${details.user}/${details.repo}#readme`,\n bugs: {\n url: `https://github.com/${details.user}/${details.repo}/issues`,\n },\n }\n}\n\nfunction repoFromOrigin(gitOrigin?: string) {\n if (!gitOrigin) {\n return {}\n }\n\n return {\n repository: {\n type: 'git',\n url: gitOrigin,\n },\n }\n}\n\nexport function addScript(cmd: string, existing: string) {\n if (existing && existing.includes(cmd)) {\n return existing\n }\n\n return cmd\n}\n\nexport async function addPackageJsonScripts(\n manifest: PackageJson,\n options: InjectOptions,\n updateScripts: (currentScripts: Record<string, string>) => Record<string, string>,\n) {\n const originalScripts = manifest.scripts || {}\n const scripts = updateScripts({...originalScripts})\n\n const differs = Object.keys(scripts).some((key) => scripts[key] !== originalScripts[key])\n\n if (differs) {\n await writePackageJsonDirect({...manifest, scripts}, options)\n }\n\n return differs\n}\n\nexport async function writePackageJsonDirect(manifest: PackageJson, {basePath}: InjectOptions) {\n await writeJsonFile(path.join(basePath, 'package.json'), manifest)\n}\n\nexport async function addBuildScripts(manifest: PackageJson, options: InjectOptions) {\n if (!options.flags.scripts) {\n return false\n }\n return addPackageJsonScripts(manifest, options, (scripts) => {\n scripts.build = addScript(expectedScripts.build, scripts.build)\n scripts.format = addScript(`prettier --write --cache --ignore-unknown .`, scripts.format)\n scripts['link-watch'] = addScript(expectedScripts['link-watch'], scripts['link-watch'])\n scripts.lint = addScript(`eslint .`, scripts.lint)\n scripts.prepublishOnly = addScript(expectedScripts.prepublishOnly, scripts.prepublishOnly)\n scripts.watch = addScript(expectedScripts.watch, scripts.watch)\n return scripts\n })\n}\n\nexport function sortKeys<T extends Record<string, unknown>>(unordered: T): T {\n return Object.keys(unordered)\n .sort()\n .reduce((obj, key) => {\n // @ts-expect-error this WILL work\n obj[key] = unordered[key]\n return obj\n }, {} as T)\n}\n\n/** @internal */\nexport function forceDependencyVersions(\n deps: Record<string, string>,\n versions = forcedPackageVersions,\n): Record<string, string> {\n const entries = Object.entries(deps).map((entry) => {\n const [pkg] = entry\n const forceVersion = versions[pkg as keyof typeof versions]\n if (forceVersion) {\n return [pkg, forceVersion]\n }\n return entry\n })\n return Object.fromEntries(entries)\n}\n"],"names":["applyPreset","stat","readFile","validate","isObject","validatePaths","validNpmName","pkg","isValidEmail","outdent","addDevDependencies","info","files","devDependencies","require","validatePackageName","githubUrl"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"package.js","sources":["../../src/configs/eslint.ts","../../src/configs/git.ts","../../src/configs/pkg-config.ts","../../src/configs/prettier.ts","../../src/configs/tsconfig.ts","../../src/presets/renovatebot.ts","../../src/npm/resolveLatestVersions.ts","../../src/util/errorToUndefined.ts","../../src/configs/buildExtensions.ts","../../src/sanity/manifest.ts","../../src/util/prompt.ts","../../src/util/files.ts","../../src/util/request.ts","../../src/util/user.ts","../../src/util/readme.ts","../../src/presets/semver-workflow.ts","../../src/configs/forced-package-versions.ts","../../src/presets/ui.ts","../../src/presets/ui-workshop.ts","../../src/presets/presets.ts","../../src/actions/inject.ts","../../src/configs/banned-packages.ts","../../src/actions/verify/validations.ts","../../src/npm/package.ts"],"sourcesContent":["import {InitFlags} from '../actions/init'\nimport {InjectTemplate} from '../actions/inject'\n\nexport function eslintrcTemplate(options: {flags: InitFlags}): InjectTemplate {\n const {flags} = options\n\n const eslintConfig = {\n root: true,\n env: {\n node: true,\n browser: true,\n },\n extends: [\n 'sanity',\n flags.typescript && 'sanity/typescript',\n 'sanity/react',\n 'plugin:react-hooks/recommended',\n flags.prettier && 'plugin:prettier/recommended',\n 'plugin:react/jsx-runtime',\n ].filter(Boolean),\n }\n\n return {\n type: 'template',\n force: flags.force,\n to: '.eslintrc',\n value: JSON.stringify(eslintConfig, null, 2),\n }\n}\n\nexport function eslintignoreTemplate(options: {flags: InitFlags; outDir: string}): InjectTemplate {\n const {flags, outDir} = options\n\n const patterns = [\n '.eslintrc.js',\n 'commitlint.config.js',\n outDir,\n 'lint-staged.config.js',\n 'package.config.ts',\n flags.typescript ? '*.js' : '',\n ].filter(Boolean)\n\n patterns.sort()\n\n return {\n type: 'template',\n force: flags.force,\n to: '.eslintignore',\n value: patterns.join('\\n'),\n }\n}\n","import {outdent} from 'outdent'\n\nimport {InjectTemplate} from '../actions/inject'\n\nexport function gitignoreTemplate(): InjectTemplate {\n return {\n type: 'template',\n to: '.gitignore',\n value: outdent`\n # Logs\n logs\n *.log\n npm-debug.log*\n\n # Runtime data\n pids\n *.pid\n *.seed\n\n # Directory for instrumented libs generated by jscoverage/JSCover\n lib-cov\n\n # Coverage directory used by tools like istanbul\n coverage\n\n # nyc test coverage\n .nyc_output\n\n # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n .grunt\n\n # node-waf configuration\n .lock-wscript\n\n # Compiled binary addons (http://nodejs.org/api/addons.html)\n build/Release\n\n # Dependency directories\n node_modules\n jspm_packages\n\n # Optional npm cache directory\n .npm\n\n # Optional REPL history\n .node_repl_history\n\n # macOS finder cache file\n .DS_Store\n\n # VS Code settings\n .vscode\n\n # IntelliJ\n .idea\n *.iml\n\n # Cache\n .cache\n\n # Yalc\n .yalc\n yalc.lock\n\n # npm package zips\n *.tgz\n `,\n }\n}\n","import {outdent} from 'outdent'\n\nimport {InitFlags} from '../actions/init'\nimport {InjectTemplate} from '../actions/inject'\n\nexport function pkgConfigTemplate(options: {outDir: string; flags: InitFlags}): InjectTemplate {\n const {flags, outDir} = options\n\n return {\n type: 'template',\n force: flags.force,\n // Always a `.ts` config: plugins are ESM (`\"type\": \"module\"`), so `@sanity/pkg-utils`\n // loads it without needing a `.mts`/`.mjs` extension to force ESM interpretation.\n to: 'package.config.ts',\n value: outdent`\n import {defineConfig} from '@sanity/pkg-utils'\n\n export default defineConfig({\n dist: '${outDir}',\n tsconfig: 'tsconfig.${outDir}.json',\n\n // Remove this block to enable strict export validation\n extract: {\n rules: {\n 'ae-incompatible-release-tags': 'off',\n 'ae-internal-missing-underscore': 'off',\n 'ae-missing-release-tag': 'off',\n },\n },\n })\n `,\n }\n}\n","import {InjectTemplate} from '../actions/inject'\n\nexport function prettierignoreTemplate(options: {outDir: string}): InjectTemplate {\n const {outDir} = options\n\n return {\n type: 'template',\n to: '.prettierignore',\n value: [outDir, 'pnpm-lock.yaml', 'yarn.lock', 'package-lock.json'].join('\\n'),\n }\n}\n","import {outdent} from 'outdent'\n\nimport {InitFlags} from '../actions/init'\nimport {InjectTemplate} from '../actions/inject'\n\nexport function tsconfigTemplate(options: {flags: InitFlags}): InjectTemplate {\n const {flags} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: 'tsconfig.json',\n value: outdent`\n {\n \"extends\": \"./tsconfig.settings\",\n \"include\": [\"./src\", \"./package.config.ts\"]\n }\n `,\n }\n}\n\nexport function tsconfigTemplateDist(options: {outDir: string; flags: InitFlags}): InjectTemplate {\n const {flags, outDir} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: `tsconfig.${outDir}.json`,\n value: outdent`\n {\n \"extends\": \"./tsconfig.settings\",\n \"include\": [\"./src\"],\n \"exclude\": [\n \"./src/**/__fixtures__\",\n \"./src/**/__mocks__\",\n \"./src/**/*.test.ts\",\n \"./src/**/*.test.tsx\"\n ]\n }\n `,\n }\n}\n\nexport function tsconfigTemplateSettings(options: {\n outDir: string\n flags: InitFlags\n}): InjectTemplate {\n const {flags, outDir} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: `tsconfig.settings.json`,\n value: outdent`\n {\n \"compilerOptions\": {\n \"rootDir\": \".\",\n \"outDir\": \"./${outDir}\",\n\n \"target\": \"esnext\",\n \"jsx\": \"preserve\",\n \"module\": \"preserve\",\n \"moduleResolution\": \"bundler\",\n \"esModuleInterop\": true,\n \"resolveJsonModule\": true,\n \"moduleDetection\": \"force\",\n \"strict\": true,\n \"allowSyntheticDefaultImports\": true,\n \"skipLibCheck\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"isolatedModules\": true,\n\n // Don't emit by default, pkg-utils will ignore this when generating .d.ts files\n \"noEmit\": true\n }\n }\n `,\n }\n}\n","import {InjectOptions, writeAssets} from '../actions/inject'\nimport {Preset} from './presets'\n\nexport const renovatePreset: Preset = {\n name: 'renovatebot',\n description: 'Files to enable renovatebot.',\n apply: applyPreset,\n}\n\nasync function applyPreset(options: InjectOptions) {\n await writeAssets(\n [\n {\n type: 'copy',\n from: ['renovatebot', 'renovate.json'],\n to: 'renovate.json',\n },\n ],\n options,\n )\n}\n","import getLatestVersion from 'get-latest-version'\nimport pProps from 'p-props'\n\n// We may want to lock certain dependencies to specific versions\nconst lockedDependencies: Record<string, string> = {\n 'styled-components': '^6.1',\n 'eslint': '^8.57.0',\n}\n\nexport function resolveLatestVersions(packages: string[]) {\n const versions: Record<string, string> = {}\n for (const pkgName of packages) {\n versions[pkgName] = pkgName in lockedDependencies ? lockedDependencies[pkgName] : 'latest'\n }\n\n return pProps(\n versions,\n async (range, pkgName) => {\n const version = await getLatestVersion(pkgName, {range})\n if (!version) {\n throw new Error(`Found no version for ${pkgName}`)\n }\n return rangeify(version)\n },\n {concurrency: 8},\n )\n}\n\nfunction rangeify(version: string) {\n return `^${version}`\n}\n","export function errorToUndefined(err: any) {\n if (err instanceof TypeError) {\n throw err\n }\n\n return undefined\n}\n","export const buildExtensions = ['.js', '.jsx', '.es6', '.es', '.mjs', '.ts', '.tsx']\n","import fs from 'fs'\nimport path from 'path'\nimport util from 'util'\n\nimport pkg from '../../package.json'\nimport {buildExtensions} from '../configs/buildExtensions'\nimport {errorToUndefined} from '../util/errorToUndefined'\nimport {hasSourceFile, hasCompiledFile, readJsonFile, fileExists} from '../util/files'\n\nconst stat = util.promisify(fs.stat)\nconst readFile = util.promisify(fs.readFile)\n\nconst allowedPartProps = ['name', 'implements', 'path', 'description']\nconst disallowedPluginProps = ['api', 'project', 'plugins', 'env']\n\nexport interface SanityV2Manifest {\n root?: boolean\n name: string\n paths: ManifestPaths\n parts?: {\n path: string\n }[]\n}\n\nexport interface ManifestPaths {\n basePath: string\n compiled?: string\n source?: string\n}\n\nexport interface ManifestOptions {\n isPlugin?: boolean\n validate?: boolean\n pluginName?: string\n basePath: string\n verifySourceParts?: boolean\n verifyCompiledParts?: boolean\n paths?: ManifestPaths\n flags?: Record<string, any>\n}\n\nexport async function getPaths(options: ManifestOptions) {\n const {basePath} = options\n const manifest = await readManifest(options)\n if (!manifest.paths) {\n return null\n }\n\n return absolutifyPaths(manifest.paths, basePath)\n}\n\nfunction absolutifyPaths(paths: ManifestPaths | undefined, basePath: string) {\n const getPath = (relative?: string) =>\n relative ? path.resolve(path.join(basePath, relative)) : undefined\n return paths\n ? {\n basePath,\n compiled: getPath(paths.compiled),\n source: getPath(paths.source),\n }\n : {basePath}\n}\n\nasync function readManifest(options: ManifestOptions) {\n const {basePath, validate = true} = options\n const manifestPath = path.normalize(path.join(basePath, 'sanity.json'))\n\n let content\n try {\n content = await readFile(manifestPath, 'utf8')\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n throw new Error(\n `No sanity.json found. sanity.json is required for plugins to function. Use \\`${pkg.binname} init\\` for a new plugin, or create an empty \\`sanity.json\\` with an empty object (\\`{}\\`) for existing ones.`,\n )\n }\n\n throw new Error(`Failed to read \"${manifestPath}\": ${err.message}`)\n }\n\n let parsed\n try {\n parsed = JSON.parse(content)\n } catch (err: any) {\n throw new Error(`Error parsing \"${manifestPath}\": ${err.message}`)\n }\n\n if (validate) {\n await validateManifest(parsed, options)\n }\n\n return parsed\n}\n\nasync function validateManifest(manifest: SanityV2Manifest, opts: ManifestOptions) {\n const options = {isPlugin: true, ...opts}\n\n if (!isObject(manifest)) {\n throw new Error(`Invalid sanity.json: Root must be an object`)\n }\n\n if (options.isPlugin) {\n await validatePluginManifest(manifest, options)\n } else {\n validateProjectManifest(manifest)\n }\n\n if ('root' in manifest && typeof manifest.root !== 'boolean') {\n throw new Error(`Invalid sanity.json: \"root\" property must be a boolean if declared`)\n }\n\n await validateParts(manifest, {\n ...options,\n paths: absolutifyPaths(manifest.paths, options.basePath),\n })\n}\n\nfunction validateProjectManifest(manifest: SanityV2Manifest) {\n if ('paths' in manifest) {\n throw new Error(`Invalid sanity.json: \"paths\" property has no meaning in a project manifest`)\n }\n}\n\nasync function validatePluginManifest(manifest: SanityV2Manifest, options: {basePath: string}) {\n const disallowed = Object.keys(manifest)\n .filter((key) => disallowedPluginProps.includes(key))\n .map((key) => `\"${key}\"`)\n\n if (disallowed.length > 0) {\n const plural = disallowed.length > 1 ? 's' : ''\n const joined = disallowed.join(', ')\n throw new Error(\n `Invalid sanity.json: Key${plural} ${joined} ${\n plural ? 'are' : 'is'\n } not allowed in a plugin manifest`,\n )\n }\n\n if (manifest.root) {\n throw new Error(`Invalid sanity.json: \"root\" cannot be truthy in a plugin manifest`)\n }\n\n await validatePaths(manifest, options)\n}\n\nasync function validatePaths(manifest: SanityV2Manifest, options: {basePath: string}) {\n if (!('paths' in manifest)) {\n return\n }\n\n if (!isObject(manifest.paths)) {\n throw new Error(`Invalid sanity.json: \"paths\" must be an object if declared`)\n }\n\n if (typeof manifest.paths.compiled !== 'string') {\n throw new Error(\n `Invalid sanity.json: \"paths\" must have a (string) \"compiled\" property if declared`,\n )\n }\n\n if (typeof manifest.paths.source !== 'string') {\n throw new Error(\n `Invalid sanity.json: \"paths\" must have a (string) \"source\" property if declared`,\n )\n }\n\n const sourcePath = path.resolve(options.basePath, manifest.paths.source)\n let srcStats\n try {\n srcStats = await stat(sourcePath)\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n throw new Error(`sanity.json references \"source\" path which does not exist: \"${sourcePath}\"`)\n }\n }\n\n if (!srcStats?.isDirectory()) {\n throw new Error(\n `sanity.json references \"source\" path which is not a directory: \"${sourcePath}\"`,\n )\n }\n}\n\nasync function validateParts(manifest: SanityV2Manifest, options: ManifestOptions) {\n if (!('parts' in manifest)) {\n return\n }\n\n if (!Array.isArray(manifest.parts)) {\n throw new Error(`Invalid sanity.json: \"parts\" must be an array if declared`)\n }\n\n let i = 0\n for (const part of manifest.parts) {\n await validatePart(part, i, options)\n i++\n }\n}\n\nasync function validatePart(part: Record<string, any>, index: number, options: ManifestOptions) {\n if (!isObject(part)) {\n throw new Error(`Invalid sanity.json: \"parts[${index}]\" must be an object`)\n }\n\n validateAllowedPartKeys(part, index)\n validatePartStringValues(part, index)\n validatePartNames(part, index, options)\n await validatePartFiles(part, index, options)\n}\n\nasync function validatePartFiles(\n part: {path?: string} | undefined,\n index: number,\n options: ManifestOptions,\n) {\n const {verifyCompiledParts, verifySourceParts, paths} = options\n if (!part?.path) {\n return\n }\n\n const ext = path.extname(part.path)\n if (paths?.source && ext && ext !== '.js' && buildExtensions.includes(ext)) {\n throw new Error(\n `Invalid sanity.json: Part path has extension which is not applicable after compiling. ${ext} becomes .js after compiling. Specify filename without extension (${path.basename(\n part.path,\n )}) (parts[${index}])`,\n )\n }\n\n if (!verifySourceParts && !verifyCompiledParts) {\n return\n }\n\n const [srcExists, outDirExists] = await Promise.all([\n hasSourceFile(part.path, paths),\n verifyCompiledParts && hasCompiledFile(part.path, paths),\n ])\n\n if (!srcExists) {\n throw new Error(\n `Invalid sanity.json: Part path references file that does not exist in source directory (${\n paths?.source || paths?.basePath\n }) (parts[${index}])`,\n )\n }\n\n if (verifyCompiledParts && !outDirExists) {\n throw new Error(\n `Invalid sanity.json: Part path references file (\"${part.path}\") that does not exist in compiled directory (${paths?.compiled}) (parts[${index}])`,\n )\n }\n}\n\nfunction validatePartNames(\n part: {name?: string; implements?: string} | undefined,\n index: number,\n options: ManifestOptions,\n) {\n const pluginName = options.pluginName ? options.pluginName.replace(/^sanity-plugin-/, '') : ''\n if (!part?.name || !part?.name?.startsWith(`part:${pluginName}/`)) {\n throw new Error(\n `Invalid sanity.json: \"name\" must be prefixed with \"part:${pluginName}/\" - got \"${part?.name}\" (parts[${index}])`,\n )\n }\n\n if (!part?.implements?.startsWith('part:')) {\n throw new Error(\n `Invalid sanity.json: \"implements\" must be prefixed with \"part:\" - got \"${part?.implements}\" (parts[${index}])`,\n )\n }\n}\n\nfunction validateAllowedPartKeys(part: Record<string, any>, index: number) {\n const disallowed = Object.keys(part)\n .filter((key) => !allowedPartProps.includes(key))\n .map((key) => `\"${key}\"`)\n\n if (disallowed.length > 0) {\n const plural = disallowed.length > 1 ? 's' : ''\n const joined = disallowed.join(', ')\n throw new Error(\n `Invalid sanity.json: Key${plural} ${joined} ${\n plural ? 'are' : 'is'\n } not allowed in a part declaration (parts[${index}])`,\n )\n }\n}\n\nfunction validatePartStringValues(part: Record<string, any>, index: number) {\n const nonStrings = Object.keys(part)\n .filter((key) => typeof part[key] !== 'string')\n .map((key) => `\"${key}\"`)\n\n if (nonStrings.length > 0) {\n const plural = nonStrings.length > 1 ? 's' : ''\n const joined = nonStrings.join(', ')\n throw new Error(\n `Invalid sanity.json: Key${plural} ${joined} should be of type string (parts[${index}])`,\n )\n }\n}\n\nfunction isObject(obj: any) {\n return !Array.isArray(obj) && obj !== null && typeof obj === 'object'\n}\n\nexport async function hasSanityJson(basePath: string) {\n const file = await readJsonFile<{root?: boolean}>(path.join(basePath, 'sanity.json')).catch(\n errorToUndefined,\n )\n return {exists: Boolean(file), isRoot: Boolean(file && file.root)}\n}\n\nexport async function findStudioV3Config(basePath: string) {\n const jsFile = 'sanity.config.js'\n const jsExists = await fileExists(path.join(basePath, jsFile))\n if (jsExists) {\n return {v3ConfigFile: jsFile}\n }\n const tsFile = 'sanity.config.ts'\n const tsExists = await fileExists(path.join(basePath, tsFile))\n return {v3ConfigFile: tsExists ? tsFile : undefined}\n}\n","import path from 'path'\nimport {URL} from 'url'\n\n// @ts-expect-error missing types\nimport githubUrlToObject from 'github-url-to-object'\nimport inquirer from 'inquirer'\n// @ts-expect-error missing types\nimport validNpmName from 'validate-npm-package-name'\n\nimport {InjectOptions} from '../actions/inject'\n\nexport async function prompt(\n message: string,\n options: {\n choices?: any\n type?: string\n default?: any\n filter?: (val: any) => any\n validate?: (val: any) => boolean | string\n },\n) {\n const type = options.choices ? 'list' : options.type\n const result = await inquirer.prompt([{...options, type, message, name: 'single'}])\n return result && result.single\n}\n\nprompt.separator = () => new inquirer.Separator()\n\nexport function promptForPackageName({basePath}: InjectOptions, defaultVal?: string) {\n return prompt('Plugin name (sanity-plugin-...)', {\n default: defaultVal || path.basename(basePath),\n filter: (name) => {\n const prefixless = name.trim().replace(/^sanity-plugin-/, '')\n return name[0] === '@' ? name : `sanity-plugin-${prefixless}`\n },\n validate: (name) => {\n const valid: {errors?: string[]} = validNpmName(name)\n if (valid.errors) {\n return valid.errors[0]\n }\n\n if (name[0] !== '@' && name.endsWith('plugin')) {\n return `Name shouldn't include \"plugin\" multiple times (${name})`\n }\n\n return true\n },\n })\n}\n\nexport function promptForRepoOrigin(_options: InjectOptions, defaultVal?: string) {\n return prompt('Git repository URL', {\n default: defaultVal,\n filter: (raw) => {\n const url = (raw || '').trim()\n const gh: {user: string; repo: string} | undefined = githubUrlToObject(url)\n return gh ? `git+ssh://git@github.com/${gh.user}/${gh.repo}.git` : url\n },\n validate: (url) => {\n if (!url) {\n return true\n }\n\n try {\n const parsed = new URL(url)\n return parsed ? true : 'Invalid URL'\n } catch {\n return 'Invalid URL'\n }\n },\n })\n}\n","import crypto from 'crypto'\nimport fs from 'fs'\nimport path from 'path'\nimport util from 'util'\n\nimport json5 from 'json5'\nimport pAny from 'p-any'\n\nimport {InitFlags} from '../actions/init'\nimport {buildExtensions} from '../configs/buildExtensions'\nimport {ManifestPaths} from '../sanity/manifest'\nimport log from './log'\nimport {prompt} from './prompt'\n\nconst stat = util.promisify(fs.stat)\nexport const mkdir = util.promisify(fs.mkdir)\nconst readdir = util.promisify(fs.readdir)\nconst copyFile = util.promisify(fs.copyFile)\nexport const readFile = util.promisify(fs.readFile)\nexport const writeFile = util.promisify(fs.writeFile)\n\nexport function hasSourceEquivalent(compiledFile: string, paths: ManifestPaths) {\n if (!paths.source) {\n return fileExists(\n path.isAbsolute(compiledFile) ? compiledFile : path.resolve(paths.basePath, compiledFile),\n )\n }\n\n // /plugin/dist/MyComponent.js => /plugin/src\n const baseDir = path.dirname(compiledFile.replace(paths.compiled as string, paths.source))\n\n // /plugin/dist/MyComponent.js => MyComponent\n const baseName = path.basename(compiledFile, path.extname(compiledFile))\n\n // MyComponent => /plugin/src/MyComponent\n const pathStub = path.join(baseDir, baseName)\n\n /*\n * /plugin/src/MyComponent => [\n * /plugin/src/MyComponent.jsx,\n * /plugin/src/MyComponent.mjs,\n * ...\n * ]\n */\n return buildCandidateExists(pathStub)\n}\n\n// Generally used for parts resolving\nexport async function hasSourceFile(filePath: string, paths?: ManifestPaths) {\n if (!paths?.source) {\n return fileExists(\n path.isAbsolute(filePath) ? filePath : path.resolve(paths?.basePath ?? '', filePath),\n )\n }\n\n // filePath: components/SomeInput\n // paths: {source: '/plugin/src'}\n // MyComponent => /plugin/src/MyComponent\n const pathStub = path.isAbsolute(filePath) ? filePath : path.resolve(paths.source, filePath)\n\n if (await fileExists(pathStub)) {\n return true\n }\n\n return buildCandidateExists(pathStub)\n}\n\n// Generally used for parts resolving\nexport function hasCompiledFile(filePath: string, paths?: ManifestPaths) {\n if (!paths?.compiled) {\n return fileExists(\n path.isAbsolute(filePath) ? filePath : path.resolve(paths?.basePath ?? '', filePath),\n )\n }\n\n // filePath: components/SomeInput\n // paths: {compiled: '/plugin/dist'}\n\n // components/SomeInput => /plugin/dist/components/SomeInput\n const absPath = path.isAbsolute(filePath) ? filePath : path.resolve(paths.compiled, filePath)\n\n // /plugin/dist/components/SomeInput => /plugin/dist/components/SomeInput.js\n // /plugin/dist/components/SomeInput.js => /plugin/dist/components/SomeInput.js\n // /plugin/dist/components/SomeInput.css => /plugin/dist/components/SomeInput.css\n const fileExt = path.extname(absPath)\n const withExt = fileExt === '' ? `${absPath}.js` : absPath\n\n return fileExists(withExt)\n}\n\nfunction buildCandidateExists(pathStub: string) {\n const candidates = buildExtensions.map((extCandidate) => `${pathStub}${extCandidate}`)\n\n return pAny(candidates.map((candidate) => stat(candidate)))\n .then(() => true)\n .catch(() => false)\n}\n\nexport function fileExists(filePath: string) {\n return stat(filePath)\n .then(() => true)\n .catch(() => false)\n}\n\nexport async function readJsonFile<T>(filePath: string) {\n const content = await readFile(filePath, 'utf8')\n return JSON.parse(content) as T\n}\n\nexport function writeJsonFile(filePath: string, content: Record<string, unknown>) {\n const data = JSON.stringify(content, null, 2) + '\\n'\n return writeFile(filePath, data, {encoding: 'utf8'})\n}\n\nexport async function writeFileWithOverwritePrompt(\n filePath: string,\n content: string,\n options: {default?: any; force?: boolean} & fs.ObjectEncodingOptions,\n) {\n const {default: defaultVal, force = false, ...writeOptions} = options\n const withinCwd = filePath.startsWith(process.cwd())\n const printablePath = withinCwd ? path.relative(process.cwd(), filePath) : filePath\n\n if (await fileEqualsData(filePath, content)) {\n return false\n }\n\n if (\n !force &&\n (await fileExists(filePath)) &&\n !(await prompt(`File \"${printablePath}\" already exists. Overwrite?`, {\n type: 'confirm',\n default: defaultVal,\n }))\n ) {\n return false\n }\n\n await writeFile(filePath, content, writeOptions)\n return true\n}\n\nexport async function copyFileWithOverwritePrompt(from: string, to: string, flags: InitFlags) {\n const withinCwd = to.startsWith(process.cwd())\n const printablePath = withinCwd ? path.relative(process.cwd(), to) : to\n\n if (await filesAreEqual(from, to)) {\n return false\n }\n\n await ensureDirectoryExists(to)\n\n if (\n !flags.force &&\n (await fileExists(to)) &&\n !(await prompt(`File \"${printablePath}\" already exists. Overwrite?`, {\n type: 'confirm',\n default: false,\n }))\n ) {\n return false\n }\n\n await copyFile(from, to)\n return true\n}\n\nasync function ensureDirectoryExists(filePath: string): Promise<void> {\n const dirname = path.dirname(filePath)\n if (await fileExists(dirname)) {\n return\n }\n await ensureDirectoryExists(dirname)\n await mkdir(dirname)\n}\n\nasync function fileEqualsData(filePath: string, content: string) {\n const contentHash = crypto.createHash('sha1').update(content).digest('hex')\n const remoteHash = await getFileHash(filePath)\n return contentHash === remoteHash\n}\n\nasync function filesAreEqual(file1: string, file2: string) {\n const [hash1, hash2] = await Promise.all([getFileHash(file1, false), getFileHash(file2)])\n return hash1 === hash2\n}\n\nfunction getFileHash(filePath: string, allowMissing = true) {\n return new Promise((resolve, reject) => {\n const hash = crypto.createHash('sha1')\n const stream = fs.createReadStream(filePath)\n stream.on('error', (err) => {\n if ((err as {code?: string}).code === 'ENOENT' && allowMissing) {\n resolve(null)\n } else {\n reject(err)\n }\n })\n\n stream.on('end', () => resolve(hash.digest('hex')))\n stream.on('data', (chunk) => hash.update(chunk))\n })\n}\n\nexport async function ensureDir(dirPath: string) {\n try {\n await mkdir(dirPath)\n } catch (err) {\n if ((err as {code?: string}).code !== 'EEXIST') {\n throw err\n }\n }\n}\n\nexport async function isEmptyish(dirPath: string) {\n const ignoredFiles = ['.git', '.gitignore', 'license', 'readme.md']\n const allFiles = await readdir(dirPath).catch(() => [])\n const files = allFiles.filter((file) => !ignoredFiles.includes(file.toLowerCase()))\n return files.length === 0\n}\n\nasync function readFileContent({\n filename,\n basePath,\n}: {\n filename: string\n basePath: string\n}): Promise<string | undefined> {\n const filepath = path.normalize(path.join(basePath, filename))\n try {\n return await readFile(filepath, 'utf8')\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n log.debug(`No ${filename} file found.`)\n return undefined\n }\n throw new Error(`Failed to read \"${filepath}\": ${err.message}`)\n }\n}\n\nexport async function readJson5File<T>({\n filename,\n basePath,\n}: {\n filename: string\n basePath: string\n}): Promise<T | undefined> {\n const content = await readFileContent({filename, basePath})\n if (!content) {\n return undefined\n }\n\n return parseJson5<T>(content, filename)\n}\n\nfunction parseJson5<T>(content: string, errorKey: string): T {\n try {\n return json5.parse<T>(content)\n } catch (err: any) {\n throw new Error(`Error parsing \"${errorKey}\": ${err.message}`)\n }\n}\n","import {getIt} from 'get-it'\nimport {jsonRequest, jsonResponse, httpErrors, headers, promise} from 'get-it/middleware'\n\nimport pkg from '../../package.json'\n\nexport const request = getIt([\n promise({onlyBody: true}),\n jsonRequest(),\n jsonResponse(),\n httpErrors(),\n headers({'User-Agent': `${pkg.name}@${pkg.version}`}),\n])\n","import {execSync} from 'child_process'\nimport path from 'path'\n\nimport {validate as isValidEmail} from 'email-validator'\nimport xdgBasedir from 'xdg-basedir'\n\nimport {InjectOptions} from '../actions/inject'\nimport {PackageJson} from '../actions/verify/types'\nimport {readJsonFile} from './files'\nimport {prompt} from './prompt'\nimport {request} from './request'\n\nexport interface User {\n name: string\n email?: string\n}\n\nexport async function getUserInfo(\n {requireUserConfirmation, flags}: InjectOptions,\n pkg?: PackageJson,\n): Promise<User | undefined> {\n const userInfo =\n getPackageUserInfo({author: flags.author ?? pkg?.author}) ||\n (await getSanityUserInfo()) ||\n (await getGitUserInfo())\n if (requireUserConfirmation) {\n return promptForInfo(userInfo)\n }\n\n return userInfo\n}\n\nfunction getPackageUserInfo(pkg?: {\n author?:\n | string\n | {\n name: string\n email?: string\n }\n}): User | undefined {\n let author = pkg?.author\n if (!author) {\n return undefined\n }\n\n if (author && typeof author !== 'string') {\n return author\n } else if (!author.includes('@')) {\n return {name: author}\n }\n\n const [pre, ...post] = author.replace(/[<>[\\]]/g, '').split(/@/)\n const nameParts = pre.split(/\\s+/)\n const email = [nameParts[nameParts.length - 1], ...post].join('@')\n const name = nameParts.slice(0, -1).join(' ')\n return {name, email}\n}\n\nasync function promptForInfo(defValue?: User) {\n const name = await prompt('Author name', {\n filter: filterString,\n default: defValue && defValue.name,\n validate: requiredString,\n })\n\n const email = await prompt('Author email', {\n filter: filterString,\n default: defValue && defValue.email,\n validate: validOrEmptyEmail,\n })\n\n return {name, email}\n}\n\nasync function getSanityUserInfo(): Promise<User | undefined> {\n try {\n const data = await readJsonFile<{authToken?: string}>(\n path.join(xdgBasedir.config ?? '', 'sanity', 'config.json'),\n )\n const token = data?.authToken\n\n if (!token) {\n return undefined\n }\n\n const user = await request({\n url: 'https://api.sanity.io/v1/users/me',\n headers: {Authorization: `Bearer ${token}`},\n })\n\n if (!user) {\n return undefined\n }\n\n const {name, email} = user\n return {name, email}\n } catch {\n return undefined\n }\n}\n\nasync function getGitUserInfo(): Promise<User | undefined> {\n try {\n const name = execSync('git config user.name', {encoding: 'utf8'}).trim()\n const email = execSync('git config user.email', {encoding: 'utf8'}).trim()\n\n if (!name) {\n return undefined\n }\n\n return {name, email: email || undefined}\n } catch {\n return undefined\n }\n}\n\nfunction filterString(val: string) {\n return (val || '').trim()\n}\n\nfunction requiredString(value: string) {\n return value.length > 1 ? true : 'Required'\n}\n\nfunction validOrEmptyEmail(value: string): true | string {\n if (!value) {\n return true\n }\n\n return isValidEmail(value) ? true : 'Must either be a valid email or empty'\n}\n","// @ts-expect-error missing types\nimport licenses from '@rexxars/choosealicense-list'\nimport outdent from 'outdent'\n\nimport {PackageData} from '../actions/inject'\nimport {User} from './user'\n\nexport function generateReadme(data: PackageData) {\n const {user, pluginName, license} = data\n\n return (\n outdent`\n # ${pluginName}\n\n\n ${installationSnippet(pluginName ?? 'unknown')}\n\n ## Usage\n\n Add it as a plugin in \\`sanity.config.ts\\` (or .js):\n\n \\`\\`\\`ts\n import {defineConfig} from 'sanity'\n import {myPlugin} from '${pluginName}'\n\n export default defineConfig({\n //...\n plugins: [myPlugin({})],\n })\n \\`\\`\\`\n\n ${getLicenseText(license?.id, user?.name ? (user as User) : undefined)}\n ${developTestSnippet()}\n ` + '\\n'\n )\n}\n\nexport function installationSnippet(packageName: string) {\n return outdent`\n ## Installation\n\n \\`\\`\\`sh\n npm install ${packageName}\n \\`\\`\\`\n `\n}\n\nexport function developTestSnippet() {\n return outdent`\n ## Develop & test\n\n This plugin uses [@sanity/plugin-kit](https://github.com/sanity-io/plugin-kit)\n with default configuration for build & watch scripts.\n\n See [Testing a plugin in Sanity Studio](https://github.com/sanity-io/plugin-kit#testing-a-plugin-in-sanity-studio)\n on how to run this plugin with hotreload in the studio.\n `\n}\n\nexport function getLicenseText(licenseId?: string, user?: User) {\n if (!licenseId) {\n return ''\n }\n\n let licenseName: string | undefined = licenses.find(licenseId).title\n licenseName = licenseName?.replace(/\\s+license$/i, '')\n\n let licenseText = '## License\\n'\n if (licenseName && user?.name) {\n licenseText = `${licenseText}\\n[${licenseName}](LICENSE) © ${user?.name}\\n`\n } else if (licenseName) {\n licenseText = `${licenseText}\\n[${licenseName}](LICENSE)\\n`\n } else {\n licenseText = `${licenseText}\\nSee [LICENSE](LICENSE)`\n }\n\n return licenseText\n}\n\nexport function isDefaultGitHubReadme(readme: string) {\n if (!readme) {\n return false\n }\n\n const lines = readme.split('\\n', 20).filter(Boolean)\n\n // title + _optional_ description\n return lines.length <= 2 && lines[0].startsWith('#')\n}\n","import path from 'path'\n\nimport chalk from 'chalk'\nimport outdent from 'outdent'\n\nimport {Injectable, InjectOptions, writeAssets} from '../actions/inject'\nimport {PackageJson} from '../actions/verify/types'\nimport {\n addPackageJsonScripts,\n addScript,\n getPackage,\n sortKeys,\n writePackageJsonDirect,\n} from '../npm/package'\nimport {resolveLatestVersions} from '../npm/resolveLatestVersions'\nimport {errorToUndefined} from '../util/errorToUndefined'\nimport {readFile, writeFile} from '../util/files'\nimport log from '../util/log'\nimport {developTestSnippet, getLicenseText, installationSnippet} from '../util/readme'\nimport {getUserInfo} from '../util/user'\nimport {Preset} from './presets'\n\nexport const semverWorkflowPreset: Preset = {\n name: 'semver-workflow',\n description:\n 'Files and dependencies for conventional-commits, github workflow and semantic-release.',\n apply: applyPreset,\n}\n\nconst info = (write: boolean, msg: string, ...args: string[]) => write && log.info(msg, ...args)\n\nasync function applyPreset(options: InjectOptions) {\n await writeAssets(semverWorkflowFiles(), options)\n await addPrepareScript(options)\n await addDevDependencies(options)\n await updateReadme(options)\n}\n\nasync function addPrepareScript(options: InjectOptions) {\n const pkg = await getPackage(options)\n const didWrite = await addPackageJsonScripts(pkg, options, (scripts) => {\n scripts.prepare = addScript(`husky`, scripts.prepare)\n return scripts\n })\n info(didWrite, 'Added prepare script to package.json')\n}\n\nasync function addDevDependencies(options: InjectOptions) {\n const pkg = await getPackage(options)\n const devDeps = sortKeys({\n ...pkg.devDependencies,\n ...(await semverWorkflowDependencies()),\n })\n const newPkg = {...pkg}\n newPkg.devDependencies = devDeps\n await writePackageJsonDirect(newPkg, options)\n log.info('Updated devDependencies.')\n\n log.info(\n chalk.green(\n outdent`\n semantic-release preset injected.\n\n Please confer\n https://github.com/sanity-io/plugin-kit/blob/main/docs/semver-workflow.md#manual-steps-after-inject\n to finalize configuration for this preset.\n `.trim(),\n ),\n )\n}\n\nasync function updateReadme(options: InjectOptions) {\n const {basePath} = options\n\n const readmePath = path.join(basePath, 'README.md')\n const readme = (await readFile(readmePath, 'utf8').catch(errorToUndefined)) ?? ''\n\n const {install, usage, developTest, license, releaseSnippet} = await readmeSnippets(options)\n\n const prependSections = missingSections(readme, [install, usage])\n const appendSections = missingSections(readme, [license, developTest, releaseSnippet])\n\n if (prependSections.length || appendSections.length) {\n const updatedReadme = [...prependSections, readme, ...appendSections]\n .filter(Boolean)\n .join('\\n\\n')\n await writeFile(readmePath, updatedReadme, {encoding: 'utf8'})\n log.info('Updated README. Please review the changes.')\n }\n}\n\nasync function readmeSnippets(options: InjectOptions) {\n const pkg = await getPackage(options)\n const user = await getUserInfo(options, pkg)\n\n const bestEffortUrl = readmeBaseurl(pkg)\n\n const install = installationSnippet(pkg.name ?? 'unknown')\n\n const usage = outdent`\n ## Usage\n `\n\n const license = getLicenseText(typeof pkg.license === 'string' ? pkg.license : undefined, user)\n\n const releaseSnippet = outdent`\n ### Release new version\n\n Run [\"CI & Release\" workflow](${bestEffortUrl}/actions/workflows/main.yml).\n Make sure to select the main branch and check \"Release new version\".\n\n Semantic release will only release on configured branches, so it is safe to run release on any branch.\n `\n\n return {\n install,\n usage,\n license,\n developTest: developTestSnippet(),\n releaseSnippet,\n }\n}\n\n/**\n * Returns sections that do not exist \"close enough\" in readme\n */\nexport function missingSections(readme: string, sections: string[]) {\n return sections.filter((section) => !closeEnough(section, readme))\n}\n\n/**\n * a and b are considered \"close enough\" if > 50% of a lines exist in b lines\n * @param a\n * @param b\n */\nfunction closeEnough(a: string, b: string) {\n const aLines = a.split('\\n')\n const bLines = b.split('\\n')\n\n const matchingLines = aLines.filter((line) => bLines.find((bLine) => bLine === line)).length\n const isCloseEnough = matchingLines >= aLines.length * 0.5\n return isCloseEnough\n}\n\nfunction semverWorkflowFiles(): Injectable[] {\n const base: Injectable[] = [\n {\n type: 'copy',\n from: ['.github', 'workflows', 'main.yml'],\n to: ['.github', 'workflows', 'main.yml'],\n },\n {type: 'copy', from: ['.husky', 'commit-msg'], to: ['.husky', 'commit-msg']},\n {type: 'copy', from: ['.husky', 'pre-commit'], to: ['.husky', 'pre-commit']},\n {type: 'copy', from: ['.releaserc.json'], to: '.releaserc.json'},\n {type: 'copy', from: ['commitlint.template.js'], to: 'commitlint.config.js'},\n {type: 'copy', from: ['lint-staged.template.js'], to: 'lint-staged.config.js'},\n ]\n\n return base.map((fromTo) => {\n if (fromTo.type === 'copy') {\n return {\n ...fromTo,\n from: ['semver-workflow', ...fromTo.from],\n }\n }\n\n return fromTo\n })\n}\n\nasync function semverWorkflowDependencies(): Promise<Record<string, string>> {\n return resolveLatestVersions([\n '@commitlint/cli',\n '@commitlint/config-conventional',\n '@sanity/semantic-release-preset',\n 'husky',\n 'lint-staged',\n ])\n}\n\nexport function readmeBaseurl(pkg: PackageJson) {\n return ((pkg.repository?.url ?? pkg.homepage ?? 'TODO') as string)\n .replace(/.+:\\/\\//g, 'https://')\n .replace(/\\.git/g, '')\n .replace(/git@github.com\\//g, 'github.com/')\n .replace(/git@github.com:/g, 'https://github.com/')\n .replace(/#.+/g, '')\n}\n","export const forcedPackageVersions = {}\n\nexport const forcedDevPackageVersions = {}\n\nexport const forcedPeerPackageVersions = {\n 'react': '^18',\n 'react-dom': '^18',\n '@types/react': '^18',\n '@types/react-dom': '^18',\n 'sanity': '^3',\n 'styled-components': '^5.2',\n}\n","import chalk from 'chalk'\n\nimport {InjectOptions} from '../actions/inject'\nimport {forcedDevPackageVersions, forcedPackageVersions} from '../configs/forced-package-versions'\nimport {forceDependencyVersions, getPackage, sortKeys, writePackageJsonDirect} from '../npm/package'\nimport {resolveLatestVersions} from '../npm/resolveLatestVersions'\nimport log from '../util/log'\nimport {Preset} from './presets'\n\nexport const ui: Preset = {\n name: 'ui',\n description: '`@sanity/ui` and dependencies',\n apply: applyPreset,\n}\n\nasync function applyPreset(options: InjectOptions) {\n await addDependencies(options)\n await addDevDependencies(options)\n\n log.info(chalk.green('ui preset injected'))\n}\n\nasync function addDependencies(options: InjectOptions) {\n const pkg = await getPackage(options)\n const newDeps = sortKeys(\n forceDependencyVersions(\n {\n ...pkg.dependencies,\n ...(await resolveDependencyList()),\n },\n forcedPackageVersions,\n ),\n )\n const newPkg = {...pkg}\n newPkg.dependencies = newDeps\n await writePackageJsonDirect(newPkg, options)\n log.info('Updated dependencies.')\n}\n\nasync function addDevDependencies(options: InjectOptions) {\n const pkg = await getPackage(options)\n const newDeps = sortKeys(\n forceDependencyVersions(\n {\n ...pkg.devDependencies,\n ...(await resolveDevDependencyList()),\n },\n forcedDevPackageVersions,\n ),\n )\n const newPkg = {...pkg}\n newPkg.devDependencies = newDeps\n await writePackageJsonDirect(newPkg, options)\n log.info('Updated devDependencies.')\n}\n\nasync function resolveDependencyList(): Promise<Record<string, string>> {\n return resolveLatestVersions(['@sanity/icons', '@sanity/ui'])\n}\n\nasync function resolveDevDependencyList(): Promise<Record<string, string>> {\n return resolveLatestVersions([\n // install the peer dependencies of `@sanity/ui` as dev dependencies\n 'react',\n 'react-dom',\n 'styled-components',\n ])\n}\n","import path from 'path'\n\nimport chalk from 'chalk'\nimport outdent from 'outdent'\n\nimport {Injectable, InjectOptions, writeAssets} from '../actions/inject'\nimport {getPackage, sortKeys, writePackageJsonDirect} from '../npm/package'\nimport {resolveLatestVersions} from '../npm/resolveLatestVersions'\nimport {errorToUndefined} from '../util/errorToUndefined'\nimport {readFile, writeFile} from '../util/files'\nimport log from '../util/log'\nimport {Preset} from './presets'\n\nexport const uiWorkshop: Preset = {\n name: 'ui-workshop',\n description: 'Files for testing custom components with @sanity/ui-workshop',\n apply: applyPreset,\n}\n\nasync function applyPreset(options: InjectOptions) {\n await writeAssets(files(), options)\n await addDevDependencies(options)\n await updateGitIgnore(options)\n log.info(\n chalk.green(\n outdent`\n ui-workshop preset injected.\n\n Please confer\n https://github.com/sanity-io/plugin-kit/blob/main/docs/ui-workshop.md#manual-steps-after-inject\n to finalize configuration for this preset.\n `.trim(),\n ),\n )\n}\n\nfunction files(): Injectable[] {\n const base: Injectable[] = [\n {type: 'copy', from: ['workshop.config.ts'], to: ['workshop.config.ts']},\n {type: 'copy', from: ['src', 'CustomField.tsx'], to: ['src', 'CustomField.tsx']},\n {\n type: 'copy',\n from: ['src', '__workshop__', 'index.tsx'],\n to: ['src', '__workshop__', 'index.tsx'],\n },\n {\n type: 'copy',\n from: ['src', '__workshop__', 'props.tsx'],\n to: ['src', '__workshop__', 'props.tsx'],\n },\n ]\n\n return base.map((fromTo) => {\n if (fromTo.type === 'copy') {\n return {\n ...fromTo,\n from: ['ui-workshop', ...fromTo.from],\n }\n }\n\n return fromTo\n })\n}\n\nasync function updateGitIgnore(options: InjectOptions) {\n const {basePath} = options\n const gitignorePath = path.join(basePath, '.gitignore')\n let gitignore = (await readFile(gitignorePath, 'utf8').catch(errorToUndefined)) ?? ''\n const value = '.workshop'\n if (gitignore.includes(value)) {\n return\n }\n\n gitignore += `\\n\\n${value}`\n await writeFile(gitignorePath, gitignore, {encoding: 'utf8'})\n}\n\nasync function addDevDependencies(options: InjectOptions) {\n const pkg = await getPackage(options)\n const devDeps = sortKeys({\n ...pkg.devDependencies,\n ...(await devDependencies()),\n })\n const newPkg = {...pkg}\n newPkg.devDependencies = devDeps\n await writePackageJsonDirect(newPkg, options)\n log.info('Updated devDependencies.')\n}\n\nasync function devDependencies(): Promise<Record<string, string>> {\n return resolveLatestVersions([\n '@sanity/ui-workshop',\n '@sanity/icons',\n '@sanity/ui',\n 'react',\n 'react-dom',\n 'styled-components',\n ])\n}\n","import {InjectOptions} from '../actions/inject'\nimport {renovatePreset} from './renovatebot'\nimport {semverWorkflowPreset} from './semver-workflow'\nimport {ui} from './ui'\nimport {uiWorkshop} from './ui-workshop'\n\nexport interface Preset {\n name: string\n description: string\n apply: (options: InjectOptions) => Promise<void>\n}\n\nconst presets: Preset[] = [semverWorkflowPreset, renovatePreset, ui, uiWorkshop]\nconst presetNames = presets.map((p) => p?.name)\n\nexport function presetHelpList(padStart: number) {\n return presets\n .map((p) => `${''.padStart(padStart)}${p.name.padEnd(20)}${p.description}`)\n .join('\\n')\n}\n\nexport async function injectPresets(options: InjectOptions) {\n if (options.flags.presetOnly && !options.flags.preset?.length) {\n throw new Error('--preset-only, but no --preset [preset-name] was provided.')\n }\n\n const applyPresets = presetsFromInput(options.flags.preset)\n for (const preset of applyPresets) {\n await preset.apply(options)\n }\n}\n\nfunction presetsFromInput(inputPresets: string[] | undefined): Preset[] {\n if (!inputPresets) {\n return []\n }\n const unknownPresets = inputPresets.filter((p) => !presetNames.includes(p))\n if (unknownPresets.length) {\n throw new Error(\n `Unknown --preset(s): [${unknownPresets.join(', ')}]. Must be one of: [${presetNames.join(\n ', ',\n )}]`,\n )\n }\n\n return inputPresets\n .filter(onlyUnique)\n .map((presetName) => presets.find((p) => p.name === presetName))\n .filter((p): p is Preset => !!p)\n}\n\nfunction onlyUnique(value: string, index: number, arr: string[]) {\n return arr.indexOf(value) === index\n}\n","import path from 'path'\nimport {fileURLToPath} from 'url'\n\n// @ts-expect-error missing types\nimport licenses from '@rexxars/choosealicense-list'\nimport gitRemoteOriginUrl from 'git-remote-origin-url'\n\nimport {eslintignoreTemplate, eslintrcTemplate} from '../configs/eslint'\nimport {gitignoreTemplate} from '../configs/git'\nimport {pkgConfigTemplate} from '../configs/pkg-config'\nimport {prettierignoreTemplate} from '../configs/prettier'\nimport {tsconfigTemplateDist, tsconfigTemplate, tsconfigTemplateSettings} from '../configs/tsconfig'\nimport {addBuildScripts, getPackage, writePackageJson} from '../npm/package'\nimport {injectPresets} from '../presets/presets'\nimport {errorToUndefined} from '../util/errorToUndefined'\nimport {\n copyFileWithOverwritePrompt,\n fileExists,\n readFile,\n writeFile,\n writeFileWithOverwritePrompt,\n} from '../util/files'\nimport log from '../util/log'\nimport {prompt, promptForPackageName, promptForRepoOrigin} from '../util/prompt'\nimport {generateReadme, isDefaultGitHubReadme} from '../util/readme'\nimport {getUserInfo} from '../util/user'\nimport {InitFlags} from './init'\nimport {PackageJson} from './verify/types'\n\nconst bannedFields = ['login', 'description', 'projecturl', 'email']\nconst preferredLicenses = ['MIT', 'ISC', 'BSD-3-Clause']\nconst otherLicenses = Object.keys(licenses.list).filter((id) => {\n const license = licenses.list[id]\n return (\n !preferredLicenses.includes(id) &&\n !bannedFields.some((field) => license.body.includes(`[${field}]`))\n )\n})\n\nexport interface InjectCopyFromTo {\n type: 'copy'\n from: string | string[]\n to: string | string[]\n}\n\nexport interface InjectTemplate {\n type: 'template'\n to: string | string[]\n value: string\n force?: boolean\n}\n\nexport type Injectable = InjectCopyFromTo | InjectTemplate\n\nexport interface InjectOptions {\n basePath: string\n requireUserConfirmation?: boolean\n flags: InitFlags\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n validate?: boolean\n outDir: string\n}\n\nexport interface PackageData {\n user?: {name?: string; email?: string}\n pluginName?: string\n license?: {id: string; text: string}\n description?: string\n pkg?: PackageJson\n gitOrigin?: string\n}\n\nexport async function inject(options: InjectOptions) {\n if (options.flags.presetOnly) {\n log.info('Only apply presets, skipping default inject.')\n } else {\n await injectBase(options)\n }\n await injectPresets(options)\n}\n\nasync function injectBase(options: InjectOptions) {\n const {basePath, flags, requireUserConfirmation} = options\n const info = (write: boolean, msg: string, ...args: string[]) => write && log.info(msg, ...args)\n // Gather data\n const pkg = await getPackage(options).catch(errorToUndefined)\n log.debug('Plugin has package.json: %s', pkg ? 'yes' : 'no')\n\n const user = await getUserInfo(options, pkg)\n log.debug('User information: %o', user)\n\n const pkgName = flags.name ?? pkg?.name\n const pluginName =\n requireUserConfirmation || !pkgName ? await promptForPackageName(options, pkgName) : pkgName\n\n log.debug('Plugin name: %s', pluginName)\n\n const license = await getLicense(flags, {user, pluginName, pkg, requireUserConfirmation})\n const licenseChanged = (pkg && pkg.license) !== (license && license.id)\n log.debug('License: %s', license ? license.id : '<none>')\n\n const description = await getProjectDescription(basePath, pkg, requireUserConfirmation)\n log.debug('Description: %s', description || '<none>')\n\n const repoUrl =\n flags.repo ??\n ((await gitRemoteOriginUrl(basePath).catch(errorToUndefined)) || pkg?.repository?.url)\n\n const gitOrigin = requireUserConfirmation ? await promptForRepoOrigin(options, repoUrl) : repoUrl\n\n log.debug('Remote origin: %s', gitOrigin || '<none>')\n\n // Output\n const data: PackageData = {user, pluginName, license, description, pkg, gitOrigin}\n let didWrite\n\n // Write package.json, if returns the original (data.pkg) if it was unchanged,\n // otherwise it returns the new object\n const newPkg = await writePackageJson(data, options)\n info(newPkg !== pkg, 'Wrote package.json')\n data.pkg = newPkg\n\n didWrite = await writeLicense(data, options, licenseChanged)\n info(didWrite, 'Wrote license file (LICENSE)')\n\n didWrite = await writeReadme(data, options)\n info(didWrite, 'Wrote readme file (README.md)')\n\n didWrite = await writeStaticAssets(options)\n info(didWrite.length > 0, 'Wrote static asset files: %s', didWrite.join(', '))\n\n didWrite = await addBuildScripts(newPkg, options)\n info(didWrite, 'Added build scripts to package.json')\n\n didWrite = await addCompileDirToGitIgnore(options)\n info(didWrite, 'Added compilation output directory to .gitignore')\n}\n\nasync function writeReadme(data: PackageData, options: InjectOptions) {\n const {basePath} = options\n\n const readmePath = path.join(basePath, 'README.md')\n const readme = await readFile(readmePath, 'utf8').catch(errorToUndefined)\n\n if (readme && !isDefaultGitHubReadme(readme)) {\n return false\n }\n\n await writeFileWithOverwritePrompt(readmePath, generateReadme(data), {\n encoding: 'utf8',\n force: options.flags.force,\n })\n return true\n}\n\nasync function writeLicense(\n {license}: PackageData,\n options: InjectOptions,\n licenseChanged: boolean,\n) {\n const {basePath, flags} = options\n\n if ((flags.license as unknown as boolean) === false || !license) {\n return false\n }\n\n // Prefer whatever path the user is currently using (LICENSE.md or LICENSE)\n const hasLicenseMdFile = await fileExists(path.join(basePath, 'LICENSE.md'))\n const licensePath = path.join(basePath, hasLicenseMdFile ? 'LICENSE.md' : 'LICENSE')\n\n await writeFileWithOverwritePrompt(licensePath, license.text, {\n encoding: 'utf8',\n default: licenseChanged,\n force: flags.force,\n })\n\n return true\n}\n\nasync function getLicense(\n flags: InitFlags,\n {\n user,\n pluginName,\n pkg,\n requireUserConfirmation,\n }: PackageData & {requireUserConfirmation?: boolean},\n) {\n const license = await getLicenseIdentifier(flags, pkg, requireUserConfirmation)\n if (!license) {\n return undefined\n }\n\n const text = license.body\n .replace(/\\[fullname\\]/g, user?.name)\n .replace(/\\[project\\]/g, pluginName)\n .replace(/\\[year\\]/g, new Date().getFullYear())\n\n return {id: license.id, text}\n}\n\nasync function getLicenseIdentifier(\n flags: InitFlags,\n pkg: PackageJson | undefined,\n requireUserConfirmation = false,\n) {\n // --no-license\n if ((flags.license as unknown) === false) {\n return null\n }\n\n // --license becomes \"\", --license mit becomes \"mit\"\n if (typeof flags.license === 'string') {\n const license = licenses.find(`${flags.license}`)\n if (!license) {\n throw new Error(`License \"${flags.license}\" not found`)\n }\n return license\n }\n\n // no --license flag provided, do we have one in package already?\n if (pkg && pkg.license && !requireUserConfirmation) {\n const license = licenses.find(`${pkg.license}`)\n if (license) {\n return license\n }\n\n // Warn, then prompt the user\n log.warn(`package.json contains license \"${pkg.license}\", which is not recognized`)\n }\n\n const licenseId = await prompt('Which license do you want to use?', {\n default: pkg && pkg.license && licenses.find(pkg.license) ? pkg.license : preferredLicenses[0],\n choices: [\n prompt.separator(),\n ...preferredLicenses.map((value) => ({value, name: licenses.list[value].title})),\n prompt.separator(),\n ...otherLicenses.map((value) => ({value, name: licenses.list[value].title})),\n ],\n })\n\n return licenses.find(licenseId)\n}\n\nasync function getProjectDescription(\n basePath: string,\n pkg: PackageJson | undefined,\n requireUserConfirmation = false,\n) {\n let description = await resolveProjectDescription(basePath, pkg)\n if (requireUserConfirmation) {\n description = await prompt('Plugin description', {default: description || ''})\n }\n return description ?? ''\n}\n\nasync function resolveProjectDescription(basePath: string, pkg: PackageJson | undefined) {\n // Try to grab from package.json\n if (pkg && typeof pkg.description === 'string' && pkg.description.length > 5) {\n return pkg.description\n }\n\n // Try to grab a project description from a standard GitHub-generated readme\n try {\n const readmePath = path.join(basePath, 'README.md')\n const readme = await readFile(readmePath, 'utf8')\n const [title, description] = readme.split('\\n').filter(Boolean)\n if (!title || !description || !title.match(/^#\\s+\\w+/)) {\n return null\n }\n\n // Naive, but this isn't too important\n const unlinked = description.replace(/\\[(.*?)\\]\\(.*?\\)/g, '$1')\n if (/^[^#]/.test(unlinked)) {\n return unlinked\n }\n\n return null\n } catch (err) {\n return errorToUndefined(err)\n }\n}\n\nexport async function writeAssets(injectables: Injectable[], {basePath, flags}: InjectOptions) {\n const assetsDir = await findAssetsDir()\n\n const from = (...segments: string[]) => path.join(assetsDir, 'inject', ...segments)\n const to = (...segments: string[]) => path.join(basePath, ...segments)\n\n const writes: string[] = []\n for (const injectable of injectables) {\n if (injectable.type === 'copy') {\n const fromPath = asArray(injectable.from)\n const toPath = asArray(injectable.to)\n if (await copyFileWithOverwritePrompt(from(...fromPath), to(...toPath), flags)) {\n writes.push(path.join(...toPath))\n }\n continue\n }\n\n if (injectable.type === 'template') {\n const toPath = asArray(injectable.to)\n\n await writeFileWithOverwritePrompt(to(...toPath), `${injectable.value.trim()}\\n`, {\n default: 'n',\n force: injectable.force || flags.force,\n })\n\n writes.push(path.join(...toPath))\n continue\n }\n\n throw new Error(`Unknown operation type \"${(injectable as any).type}\"`)\n }\n\n return writes\n}\n\nasync function writeStaticAssets(options: InjectOptions) {\n const {outDir, flags} = options\n\n const files: Injectable[] = [\n flags.eslint && eslintrcTemplate({flags: options.flags}),\n flags.eslint && eslintignoreTemplate({outDir, flags: options.flags}),\n {type: 'copy', from: 'editorconfig', to: '.editorconfig'},\n {type: 'copy', from: 'sanity.json', to: 'sanity.json'},\n {type: 'copy', from: 'v2-incompatible.js.template', to: 'v2-incompatible.js'},\n pkgConfigTemplate({outDir, flags: options.flags}),\n flags.gitignore && gitignoreTemplate(),\n flags.typescript && tsconfigTemplate({flags: options.flags}),\n flags.typescript && tsconfigTemplateDist({outDir, flags: options.flags}),\n flags.typescript && tsconfigTemplateSettings({outDir, flags: options.flags}),\n flags.prettier && prettierignoreTemplate({outDir}),\n flags.prettier && {type: 'copy', from: 'prettierrc.json', to: '.prettierrc'},\n ]\n .map((f) => (f ? (f as Injectable) : undefined))\n .filter((f): f is Injectable => !!f)\n\n const result = writeAssets(files, options)\n\n return result\n}\n\nfunction asArray(input: string | string[]): string[] {\n return typeof input === 'string' ? [input] : input\n}\n\n/**\n * assets dir might be in higher or lower in the dir hierarchy depending on\n * if we run from `dist` or `src`\n */\nasync function findAssetsDir(): Promise<string> {\n let maxBackpaddle = 3\n let currDir = path.dirname(fileURLToPath(import.meta.url))\n let assetsDir: string = ''\n while (!assetsDir && maxBackpaddle) {\n currDir = path.join(currDir, '..')\n const assets = path.join(currDir, 'assets')\n if (await fileExists(assets)) {\n assetsDir = assets\n } else {\n maxBackpaddle--\n }\n }\n\n if (!assetsDir) {\n throw new Error('Could not find assets directory!')\n }\n return assetsDir\n}\n\nasync function addCompileDirToGitIgnore(options: InjectOptions) {\n const gitIgnorePath = path.join(options.basePath, '.gitignore')\n const gitignore = await readFile(gitIgnorePath, 'utf8').catch(errorToUndefined)\n if (!gitignore) {\n return false\n }\n\n const ignore = options.outDir.replace(/^[./]+/, '').split('/')[0]\n if (!ignore) {\n return false\n }\n\n const lines = gitignore.trim().split('\\n')\n if (lines.includes(ignore)) {\n return false\n }\n\n lines.push('', '# Compiled plugin', ignore)\n\n await writeFile(gitIgnorePath, lines.join('\\n') + '\\n', {encoding: 'utf8'})\n return true\n}\n","export const mergedPackages = [\n '@sanity/base',\n '@sanity/core',\n '@sanity/types',\n '@sanity/data-aspects',\n '@sanity/default-layout',\n '@sanity/default-login',\n '@sanity/desk-tool',\n '@sanity/field',\n '@sanity/form-builder',\n '@sanity/initial-value-templates',\n '@sanity/language-filter',\n '@sanity/production-preview',\n '@sanity/react-hooks',\n '@sanity/resolver',\n '@sanity/state-router',\n '@sanity/structure',\n '@sanity/studio-hints',\n].sort()\n\nexport const deprecatedDevDeps = [\n 'tsdx',\n 'sanipack',\n 'parcel',\n '@parcel/packager-ts',\n '@parcel/transformer-typescript-types',\n]\n","import {createRequire} from 'node:module'\nimport path from 'path'\n\nimport chalk from 'chalk'\nimport outdent from 'outdent'\nimport {ParsedCommandLine} from 'typescript'\n// @ts-expect-error missing types\nimport validateNpmPackageName from 'validate-npm-package-name'\n\nimport {deprecatedDevDeps, mergedPackages} from '../../configs/banned-packages'\nimport {\n incompatiblePluginPackage,\n minPkgUtilsMajor,\n requiredNodeEngine,\n urls,\n} from '../../constants'\nimport {fileExists, readJson5File} from '../../util/files'\nimport {PackageJson, SanityStudioJson, SanityV2Json} from './types'\n\nexport const expectedScripts = {\n 'build': 'plugin-kit verify-package --silent && pkg-utils build --strict --check --clean',\n 'watch': 'pkg-utils watch --strict',\n 'link-watch': 'plugin-kit link-watch',\n 'prepublishOnly': 'npm run build',\n}\n\nfunction filesWithSuffixes(fileBases: string[], suffixes: string[]): string[] {\n return fileBases.flatMap((file) => suffixes.map((suffix) => `${file}.${suffix}`))\n}\n\nexport function validateNodeEngine(packageJson: PackageJson) {\n if (packageJson.engines?.node !== requiredNodeEngine) {\n return [\n outdent`\n Expected package.json to contain engines.node: \"${requiredNodeEngine}\" to match @sanity/pkg-utils,\n but it was: ${packageJson.engines?.node}\n\n Please add the following to package.json:\n\n \"engines\": {\n \"node\": \"${requiredNodeEngine}\"\n }`.trimStart(),\n ]\n }\n return []\n}\n\nexport function validateScripts(packageJson: PackageJson): string[] {\n const errors: string[] = []\n\n const divergentScripts = Object.entries(expectedScripts).filter(([key, expectedCommand]) => {\n const command = packageJson.scripts?.[key]\n // check for includes instead of equals to give some leniency in command params and such\n return !command || !command.includes(expectedCommand)\n })\n\n if (divergentScripts.length) {\n errors.push(\n outdent`\n The following script commands did not contain expected defaults: ${divergentScripts\n .map(([key]) => key)\n .join(', ')}\n\n This checks for that the commands-strings includes these terms.\n\n Please add the following to your package.json \"scripts\":\n\n ${divergentScripts.map(([key, value]) => `\"${key}\": \"${value}\"`).join(',\\n')}\n `.trimStart(),\n )\n }\n return errors\n}\n\nexport async function validateTsConfig(\n ts: ParsedCommandLine,\n options: {basePath: string; outDir: string; tsconfig: string},\n) {\n const {basePath, outDir, tsconfig} = options\n\n const errors: string[] = []\n\n const expectedCompilerOptions = {\n target: 'esnext',\n jsx: 'preserve',\n module: 'preserve',\n rootDir: '.',\n outDir,\n noEmit: true,\n }\n\n const wrongEntries = Object.entries(expectedCompilerOptions).filter(([key, value]) => {\n let option: any = ts.options[key]\n\n if (key === 'rootDir' && typeof option === 'string') {\n option = path.relative(basePath, option) || '.'\n }\n\n if (key === 'outDir' && typeof option === 'string') {\n option = path.relative(basePath, option) || '.'\n }\n\n if (key === 'target' && option === 99) {\n option = 'esnext'\n }\n\n if (key === 'module' && option === 200) {\n option = 'preserve'\n }\n\n if (key === 'jsx' && option === 1) {\n option = 'preserve'\n }\n\n return typeof value === 'string' && typeof option === 'string'\n ? value.toLowerCase() !== option?.toLowerCase()\n : value !== option\n })\n\n if (wrongEntries.length) {\n const expectedOutput = wrongEntries\n .map(([key, value]) => `\"${key}\": ${typeof value === 'string' ? `\"${value}\"` : value},`)\n .join('\\n')\n\n errors.push(\n outdent`\n Recommended ${tsconfig} compilerOptions missing:\n\n The following fields had unexpected values: [${wrongEntries.map(([key]) => key).join(', ')}]\n Expected to find these values:\n ${expectedOutput}\n\n Please update your ${tsconfig} accordingly.\n `.trimStart(),\n )\n }\n\n return errors\n}\n\n/**\n * Hard requirement: plugins must be ESM (`\"type\": \"module\"`).\n *\n * plugin-kit loads `package.config.ts` through `@sanity/pkg-utils`, which can only load ESM\n * TypeScript configs reliably when the plugin itself is ESM. CommonJS (or an omitted `type`)\n * is not supported and cannot be opted out of.\n */\nexport function validatePackageType({type}: PackageJson): string[] {\n if (type === 'module') {\n return []\n }\n\n return [\n outdent`\n package.json must set \"type\": \"module\" — plugins built with @sanity/plugin-kit are ESM-only.\n Found: ${type ? `\"type\": \"${type}\"` : 'no \"type\" field (defaults to \"commonjs\")'}\n\n Please add the following to package.json:\n\n \"type\": \"module\"\n `.trimStart(),\n ]\n}\n\nexport function validatePkgUtilsDependency({devDependencies}: PackageJson): string[] {\n if (!devDependencies?.['@sanity/pkg-utils']) {\n return [\n outdent`\n package.json does not list @sanity/pkg-utils as a devDependency.\n @sanity/pkg-utils replaced parcel as the recommended build tool in @sanity/plugin-kit 2.0.0\n\n Please add it by running 'npm install --save-dev @sanity/pkg-utils'.\n `.trimStart(),\n ]\n }\n return []\n}\n\n/**\n * Verifies that the installed `@sanity/pkg-utils` (the peer dependency plugin-kit loads\n * `package.config.ts` with) is recent enough to expose the `loadConfig({cwd, pkgPath})` API.\n */\nexport function validatePkgUtilsVersion({basePath}: {basePath: string}): string[] {\n const require = createRequire(path.join(basePath, 'package.json'))\n\n let installedVersion: string | undefined\n try {\n const pkgUtilsManifest = require('@sanity/pkg-utils/package.json') as {version?: string}\n installedVersion = pkgUtilsManifest.version\n } catch {\n return [\n outdent`\n @sanity/pkg-utils is not installed.\n plugin-kit loads package.config.ts through @sanity/pkg-utils (a peer dependency).\n\n Please install it by running 'npm install --save-dev @sanity/pkg-utils'.\n `.trimStart(),\n ]\n }\n\n const major = Number.parseInt(installedVersion?.split('.')[0] ?? '', 10)\n if (!Number.isFinite(major) || major < minPkgUtilsMajor) {\n return [\n outdent`\n @sanity/pkg-utils ${installedVersion} is too old.\n plugin-kit requires @sanity/pkg-utils >=${minPkgUtilsMajor} to load package.config.ts.\n\n Please upgrade it by running 'npm install --save-dev @sanity/pkg-utils@latest'.\n `.trimStart(),\n ]\n }\n\n return []\n}\n\nexport function validateSanityDependencies(packageJson: PackageJson): string[] {\n const {dependencies, devDependencies, peerDependencies} = packageJson\n const allDependencies = {...dependencies, ...devDependencies, ...peerDependencies}\n\n const illegalDeps = Object.keys(allDependencies).filter((dep) => mergedPackages.includes(dep))\n const deps = new Set<string>(illegalDeps)\n const unique = [...deps.values()]\n if (unique.length) {\n return [\n outdent`\n package.json depends on \"@sanity/*\" packages that have moved into \"sanity\" package.\n\n The following dependencies should be replaced with \"sanity\":\n - ${unique.join('\\n- ')}\n\n Refer to the reference docs to find replacement imports:\n ${urls.refDocs}\n `.trimStart(),\n ]\n }\n return []\n}\n\nexport function validateDeprecatedDependencies(packageJson: PackageJson): string[] {\n const {dependencies, devDependencies, peerDependencies} = packageJson\n const allDependencies = {...dependencies, ...devDependencies, ...peerDependencies}\n\n const illegalDeps = Object.keys(allDependencies).filter((dep) => deprecatedDevDeps.includes(dep))\n const deps = new Set<string>(illegalDeps)\n const unique = [...deps.values()]\n if (unique.length) {\n return [\n outdent`\n package.json contains deprecated dependencies that should be removed:\n - ${unique.join('\\n- ')}\n `.trimStart(),\n ]\n }\n\n return []\n}\n\nexport async function validateBabelConfig({basePath}: {basePath: string}) {\n const suffixes = ['json', 'js', 'cjs', 'mjs']\n const babelFileNames = ['.babelrc', 'babel.config']\n const filenames = ['.babelrc', ...filesWithSuffixes(babelFileNames, suffixes)]\n\n const babelFiles: string[] = []\n for (const filename of filenames) {\n const filepath = path.normalize(path.join(basePath, filename))\n if (await fileExists(filepath)) {\n babelFiles.push(filename)\n }\n }\n\n if (babelFiles.length) {\n return [\n outdent`\n Found babel-config file: [${babelFiles.join(\n ', ',\n )}]. When using default @sanity/plugin-kit build command,\n this is probably not needed.\n\n Delete the file, or disable this check.\n `.trimStart(),\n ]\n }\n return []\n}\n\nexport async function validateStudioConfig({basePath}: {basePath: string}): Promise<string[]> {\n const suffixes = ['ts', 'js', 'tsx', 'jsx']\n\n const filenames = filesWithSuffixes(['sanity.config', 'sanity.cli'], suffixes)\n\n const files: Record<string, boolean | undefined> = {}\n\n for (const filename of filenames) {\n const filepath = path.normalize(path.join(basePath, filename))\n files[filename] = await fileExists(filepath)\n }\n\n const sanityJson = await readJson5File<SanityStudioJson>({basePath, filename: 'sanity.json'})\n\n const hasConfigFile = (fileBase: string) =>\n filesWithSuffixes([fileBase], suffixes).some((filename) => files[filename])\n const hasCliConfig = hasConfigFile('sanity.cli')\n const hasStudioConfig = hasConfigFile('sanity.config')\n\n const errors: string[] = []\n\n if (sanityJson) {\n const info = [\n outdent`\n Found sanity.json. This file is not used by Sanity Studio V3.\n\n Please consult the Studio V3 migration guide:\n ${urls.migrationGuideStudio}\n It will detail how to convert sanity.json to sanity.config.ts (or .js) and sanity.cli.ts (or .js) equivalents.\n `.trimStart(),\n sanityJson.plugins?.length &&\n outdent`\n For V3 versions and alternatives to V2 plugins, please refer to the Sanity Exchange:\n ${urls.sanityExchange}\n `.trimStart(),\n ].filter((s): s is string => !!s)\n\n errors.push(info.join('\\n\\n'))\n }\n\n if (!hasCliConfig) {\n errors.push(\n outdent`\n sanity.cli.(${suffixes.join(\n ' | ',\n )}) missing. Please create a file named sanity.cli.ts with the following content:\n\n ${chalk.green(\n outdent`\n import {createCliConfig} from 'sanity/cli'\n\n export default createCliConfig({\n api: {\n projectId: '${sanityJson?.api?.projectId ?? 'project-id'}',\n dataset: '${sanityJson?.api?.dataset ?? 'dataset'}',\n }\n })`,\n )}\n\n Make sure to replace the projectId and dataset fields with your own.\n\n For more, see ${urls.migrationGuideStudio}\n `.trimStart(),\n )\n }\n\n if (!hasStudioConfig) {\n errors.push(\n outdent`\n sanity.config.(${suffixes.join(\n ' | ',\n )}) missing. At a minimum sanity.config.ts should contain:\n\n ${chalk\n .green(\n outdent`\n import { defineConfig } from \"sanity\"\n import { deskTool } from \"sanity/desk\"\n\n export default defineConfig({\n name: \"default\",\n\n projectId: '${sanityJson?.api?.projectId ?? 'project-id'}',\n dataset: '${sanityJson?.api?.dataset ?? 'dataset'}',\n\n plugins: [\n deskTool(),\n ],\n\n schema: {\n types: [\n /* put your v2 schema-types here */\n ],\n },\n })`,\n )\n .trimStart()}\n\n Make sure to replace the projectId and dataset fields with your own.\n\n For more, see ${urls.migrationGuideStudio}\n `.trimStart(),\n )\n }\n\n return errors.length ? [errors.join(`\\n\\n---\\n\\n`)] : []\n}\n\nexport async function validatePluginSanityJson({\n basePath,\n packageJson,\n}: {\n basePath: string\n packageJson: PackageJson\n}) {\n const sanityJson = await readJson5File<SanityV2Json>({basePath, filename: 'sanity.json'})\n\n const expectedDefaults = {\n parts: [\n {\n implements: 'part:@sanity/base/sanity-root',\n path: './v2-incompatible.js',\n },\n ],\n }\n\n const hasSinglePart =\n sanityJson &&\n Object.keys(sanityJson).length === 1 &&\n sanityJson?.parts &&\n sanityJson.parts.length === 1\n\n const firstPart = hasSinglePart ? sanityJson?.parts?.[0] : undefined\n const correctImplements = firstPart?.implements === expectedDefaults.parts[0].implements\n const pathExists =\n firstPart?.path && (await fileExists(path.normalize(path.join(basePath, firstPart.path))))\n const hasDependency = !!packageJson.dependencies?.[incompatiblePluginPackage]\n const isValid = sanityJson && hasSinglePart && correctImplements && pathExists && hasDependency\n\n if (!isValid) {\n const errors = [\n !sanityJson ? 'sanity.json does not exist' : null,\n !hasSinglePart ? 'sanity.json should have exactly one entry in \"parts\", but did not.' : null,\n !correctImplements\n ? `The part should implement ${expectedDefaults.parts[0].implements}, but did not.`\n : null,\n firstPart?.path && !pathExists\n ? `The file in \"path\", ${firstPart?.path}, does not exist.`\n : null,\n\n !hasDependency\n ? outdent`\n package.json should have ${incompatiblePluginPackage} as a dependency, but did not.\n Install it with: npm install --save ${incompatiblePluginPackage}\n `.trimStart()\n : null,\n ].filter((e): e is string => !!e)\n\n return [\n outdent`\n Invalid sanity.json. It is used for compatibility checking in V2 studios:\n\n - ${errors.join('\\n- ')}\n\n sanity.json will only be used when incorrectly installing a v3 plugin in a v2 Studio.\n\n This check ensures that sanity.json conforms with the usage section of\n ${urls.incompatiblePlugin}\n `.trimStart(),\n ]\n }\n return []\n}\n\nexport function validatePackageName(packageJson: PackageJson) {\n const valid: {validForNewPackages?: boolean; errors: string[]} = validateNpmPackageName(\n packageJson.name,\n )\n if (!valid.validForNewPackages) {\n return [`Invalid package.json: \"name\" is invalid: ${valid.errors.join(', ')}`]\n }\n\n const isScoped = packageJson.name?.startsWith('@')\n if (!isScoped && !packageJson.name?.startsWith('sanity-plugin-')) {\n return [\n `Invalid package.json: \"name\" should be prefixed with \"sanity-plugin-\" (or scoped - @your-company/plugin-name)`,\n ]\n }\n return []\n}\n\nexport async function validateSrcIndexFile(basePath: string) {\n const paths = ['index.js', 'index.ts'].map((p) => path.join('src', p))\n const allowedIndexFiles = paths.map((file) => path.join(basePath, file))\n\n let hasIndex = false\n for (const indexFile of allowedIndexFiles) {\n hasIndex = hasIndex || (await fileExists(indexFile))\n }\n if (!hasIndex) {\n return [\n outdent`\n Expected one of [${paths.join(', ')}] to exist.\n\n @sanity/pkg-utils expects a non-jsx file to be the source entry-point for the plugin.\n If you currently have JSX in your index file, extract it into a separate file and import it.\n `,\n ]\n }\n\n return []\n}\n\nasync function disallowDuplicateConfig({\n basePath,\n pkgJson,\n configKey,\n files,\n}: {\n basePath: string\n pkgJson: PackageJson\n configKey: string\n files: string[]\n}) {\n const found: string[] = []\n for (const file of files) {\n const filePath = path.join(basePath, file)\n const exits = await fileExists(filePath)\n if (exits) {\n found.push(file)\n }\n }\n if (found.length > 1) {\n return [\n outdent`\n Found multiple config files that serve the same purpose: [${found.join(', ')}].\n\n There should be at most one of these files. Delete the rest.\n `,\n ]\n }\n if (found.length && pkgJson[configKey]) {\n return [\n outdent`\n package.json contains ${configKey}, but there also exists a config file that serves the same purpose.\n Config file: ${found.join('')}]\n\n Either delete the file or remove ${configKey} entry from package.json.\n `,\n ]\n }\n\n return []\n}\n\nexport async function disallowDuplicateEslintConfig(basePath: string, pkgJson: PackageJson) {\n return disallowDuplicateConfig({\n basePath,\n pkgJson,\n configKey: 'eslint',\n files: [\n '.eslintrc',\n '.eslintrc.js',\n '.eslintrc.cjs',\n '.eslintrc.yaml',\n '.eslintrc.yml',\n '.eslintrc.json',\n ],\n })\n}\n\nexport async function disallowDuplicatePrettierConfig(basePath: string, pkgJson: PackageJson) {\n return disallowDuplicateConfig({\n basePath,\n pkgJson,\n configKey: 'prettier',\n files: [\n '.prettierrc',\n '.prettierrc.json5',\n '.prettierrc.json',\n '.prettierrc.yaml',\n '.prettierrc.yml',\n '.prettierrc.js',\n '.prettierrc.cjs',\n '.prettier.config,js',\n '.prettier.config.cjs',\n '.prettierrc.toml',\n ],\n })\n}\n","import fs from 'fs'\nimport path from 'path'\nimport util from 'util'\n\n// @ts-expect-error missing types\nimport githubUrl from 'github-url-to-object'\n// @ts-expect-error missing types\nimport validateNpmPackageName from 'validate-npm-package-name'\n\nimport {InjectOptions, PackageData} from '../actions/inject'\nimport {PackageJson} from '../actions/verify/types'\nimport {expectedScripts} from '../actions/verify/validations'\nimport {\n forcedDevPackageVersions,\n forcedPackageVersions,\n forcedPeerPackageVersions,\n} from '../configs/forced-package-versions'\nimport {cliName, incompatiblePluginPackage, requiredNodeEngine} from '../constants'\nimport {getPaths, ManifestOptions} from '../sanity/manifest'\nimport {hasSourceEquivalent, writeJsonFile} from '../util/files'\nimport log from '../util/log'\nimport {resolveLatestVersions} from './resolveLatestVersions'\nconst defaultDependencies = [incompatiblePluginPackage]\n\nconst defaultDevDependencies = [\n 'sanity',\n\n // peer dependencies of `sanity`\n 'react',\n 'react-dom',\n 'styled-components',\n]\n\nconst defaultPeerDependencies = ['react', 'sanity']\n\nconst readFile = util.promisify(fs.readFile)\n\nconst pathKeys: (keyof PackageJson)[] = ['main', 'module', 'browser', 'types']\n\nexport async function getPackage(opts: ManifestOptions): Promise<PackageJson> {\n const options = {flags: {}, ...opts}\n\n validateOptions(options)\n\n const {basePath, validate = true} = options\n const manifestPath = path.normalize(path.join(basePath, 'package.json'))\n\n let content\n try {\n content = await readFile(manifestPath, 'utf8')\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n throw new Error(\n `No package.json found. package.json is required to publish to npm. Use \\`${cliName} init\\` for a new plugin, or \\`npm init\\` for an existing one`,\n )\n }\n\n throw new Error(`Failed to read \"${manifestPath}\": ${err.message}`)\n }\n\n let parsed\n try {\n parsed = JSON.parse(content)\n } catch (err: any) {\n throw new Error(`Error parsing \"${manifestPath}\": ${err.message}`)\n }\n\n if (!isObject(parsed)) {\n throw new Error(`Invalid package.json: Root must be an object`)\n }\n\n if (validate) {\n await validatePackage(parsed, options)\n }\n\n return parsed\n}\n\nasync function validatePackage(manifest: PackageJson, opts: ManifestOptions) {\n validateOptions(opts)\n\n const options = {isPlugin: true, ...opts}\n\n if (options.isPlugin) {\n await validatePluginPackage(manifest, options)\n }\n\n validateLockFiles(options)\n}\n\nfunction validateOptions(opts: {basePath: string}) {\n const options = opts || {}\n if (!isObject(options)) {\n throw new Error(`Options must be an object`)\n }\n\n if (typeof options.basePath !== 'string') {\n throw new Error(`\"options.basePath\" must be a string (path to plugin base path)`)\n }\n}\n\nasync function validatePluginPackage(manifest: PackageJson, options: ManifestOptions) {\n validatePackageName(manifest)\n await validatePaths(manifest, options)\n}\n\nfunction validatePackageName(manifest: PackageJson) {\n if (typeof manifest.name !== 'string') {\n throw new Error(`Invalid package.json: \"name\" must be a string`)\n }\n\n const valid: {validForNewPackages?: boolean; errors: string[]} = validateNpmPackageName(\n manifest.name,\n )\n if (!valid.validForNewPackages) {\n throw new Error(`Invalid package.json: \"name\" is invalid: ${valid.errors.join(', ')}`)\n }\n\n const isScoped = manifest.name[0] === '@'\n if (!isScoped && !manifest.name.startsWith('sanity-plugin-')) {\n throw new Error(\n `Invalid package.json: \"name\" should be prefixed with \"sanity-plugin-\" (or scoped - @your-company/plugin-name)`,\n )\n }\n}\n\nasync function validatePaths(manifest: PackageJson, options: ManifestOptions) {\n const paths = await getPaths({\n ...options,\n pluginName: manifest.name ?? 'unknown',\n verifySourceParts: false,\n verifyCompiledParts: false,\n })\n\n const abs = (file: string) =>\n path.isAbsolute(file) ? file : path.resolve(path.join(options.basePath, file))\n\n const exists = (file: string) => fs.existsSync(abs(file))\n const willExist = (file: string) => paths && hasSourceEquivalent(abs(file), paths)\n const withinSourceDir = (file: string) => paths?.source && abs(file).startsWith(paths.source)\n const withinTargetDir = (file: string) => paths?.compiled && abs(file).startsWith(paths.compiled)\n\n for (const key of pathKeys) {\n if (!(key in manifest)) {\n continue\n }\n\n const manifestValue = manifest[key]\n if (typeof manifestValue !== 'string') {\n throw new Error(`Invalid package.json: \"${key}\" must be a string if defined`)\n }\n\n // We don't want to reference `./src/MyComponent.js` containing a bunch of JSX and whatnot,\n // instead we want to target `./dist/MyComponent.js` which is the location it'll be compiled to\n if (!options?.flags?.allowSourceTarget && paths && withinSourceDir(manifestValue)) {\n throw new Error(\n `Invalid package.json: \"${key}\" points to file within source (uncompiled) directory. Use --allow-source-target if you really want to do this.`,\n )\n }\n\n // Does it exist only because it was there prior to compilation?\n // We're clearing the folder on compilation, so we shouldn't allow it\n const fileExists = exists(manifestValue)\n if (\n fileExists &&\n paths &&\n withinTargetDir(manifestValue) &&\n !(await willExist(manifestValue))\n ) {\n throw new Error(\n `Invalid package.json: \"${key}\" points to file that will not exist after compiling`,\n )\n }\n\n // If it _doesn't_ exist and it _won't_ exist, then there isn't much point in continuing, is there?\n if (!exists(manifestValue) && !(await willExist(manifestValue))) {\n if (!paths) {\n throw new Error(`Invalid package.json: \"${key}\" points to file that does not exist`)\n }\n\n const inOutDir = paths.compiled && !abs(manifestValue).startsWith(paths.compiled)\n throw new Error(\n inOutDir\n ? `Invalid package.json: \"${key}\" points to file that does not exist, and \"paths\" is not configured to compile to this location`\n : `Invalid package.json: \"${key}\" points to file that does not exist, and no equivalent is found in source directory`,\n )\n }\n }\n}\n\nfunction isObject(obj: unknown): obj is Record<string, unknown> {\n return !Array.isArray(obj) && obj !== null && typeof obj === 'object'\n}\n\nfunction validateLockFiles(options: {basePath: string}) {\n const npm = fs.existsSync(path.join(options.basePath, 'package-lock.json'))\n const yarn = fs.existsSync(path.join(options.basePath, 'yarn.lock'))\n if (npm && yarn) {\n throw new Error(`Invalid plugin: contains both package-lock.json and yarn.lock`)\n }\n}\n\nexport async function writePackageJson(data: PackageData, options: InjectOptions) {\n const {user, pluginName, license, description, pkg: prevPkg, gitOrigin} = data\n const {\n outDir,\n peerDependencies: addPeers,\n dependencies: addDeps,\n devDependencies: addDevDeps,\n } = options\n const {flags} = options\n const prev = prevPkg || {}\n\n const usePrettier = flags.prettier !== false\n const useEslint = flags.eslint !== false\n const useTypescript = flags.eslint !== false\n\n const newDevDependencies = [cliName, '@sanity/pkg-utils']\n\n if (useTypescript) {\n log.debug('Using TypeScript. Adding to dev dependencies.')\n newDevDependencies.push('@types/react', 'typescript')\n }\n\n if (usePrettier) {\n log.debug('Using prettier. Adding to dev dependencies.')\n newDevDependencies.push('prettier', 'prettier-plugin-packagejson')\n }\n\n if (useEslint) {\n log.debug('Using eslint. Adding to dev dependencies.')\n\n newDevDependencies.push(\n 'eslint',\n 'eslint-config-sanity',\n 'eslint-plugin-react',\n 'eslint-plugin-react-hooks',\n )\n\n if (usePrettier) {\n newDevDependencies.push('eslint-config-prettier', 'eslint-plugin-prettier')\n }\n\n if (useTypescript) {\n newDevDependencies.push('@typescript-eslint/eslint-plugin', '@typescript-eslint/parser')\n }\n }\n\n log.debug('Resolving latest versions for %s', newDevDependencies.join(', '))\n const dependencies = forceDependencyVersions(\n {\n ...(prev.dependencies || {}),\n ...(addDeps || {}),\n ...(await resolveLatestVersions(defaultDependencies)),\n },\n forcedPackageVersions,\n )\n const devDependencies = forceDependencyVersions(\n {\n ...(addDevDeps || {}),\n ...(prev.devDependencies || {}),\n ...(await resolveLatestVersions([...newDevDependencies, ...defaultDevDependencies])),\n },\n forcedDevPackageVersions,\n )\n const peerDependencies = forceDependencyVersions(\n {\n ...(prev.peerDependencies || {}),\n ...(addPeers || {}),\n ...(await resolveLatestVersions(defaultPeerDependencies)),\n },\n forcedPeerPackageVersions,\n )\n\n const source = flags.typescript ? './src/index.ts' : './src/index.js'\n\n const files = [outDir, 'sanity.json', 'src', 'v2-incompatible.js']\n\n // sort alphabetically for scanability\n files.sort()\n\n // order should be compatible with prettier-plugin-packagejson\n const forcedOrder = {\n name: pluginName,\n version: prev.version ?? '1.0.0',\n description: description || '',\n keywords: prev.keywords ?? ['sanity', 'sanity-plugin'],\n ...urlsFromOrigin(gitOrigin),\n ...repoFromOrigin(gitOrigin),\n license: license ? license.id : 'UNLICENSED',\n author: user?.email ? `${user.name} <${user.email}>` : user?.name,\n sideEffects: false,\n type: 'module',\n exports: {\n '.': {\n source,\n default: `./${outDir}/index.js`,\n },\n './package.json': './package.json',\n },\n ...(flags.typescript ? {types: `./${outDir}/index.d.ts`} : {}),\n files,\n scripts: {...prev.scripts},\n dependencies: sortKeys(dependencies),\n devDependencies: sortKeys(devDependencies),\n peerDependencies: sortKeys(peerDependencies),\n engines: {\n node: requiredNodeEngine,\n },\n }\n\n const manifest: PackageJson = {\n ...forcedOrder,\n // Use already configured values by default (if not otherwise specified)\n ...(prev || {}),\n // We're de-declaring properties because of key order in package.json\n ...forcedOrder,\n }\n\n const differs = JSON.stringify(prev) !== JSON.stringify(manifest)\n log.debug('Does manifest differ? %s', differs ? 'yes' : 'no')\n if (differs) {\n await writePackageJsonDirect(manifest, options)\n }\n\n return differs ? manifest : prev\n}\n\nfunction urlsFromOrigin(gitOrigin?: string): {bugs?: {url: string}; homepage?: string} {\n const details: {user: string; repo: string} | undefined = githubUrl(gitOrigin)\n if (!details) {\n return {}\n }\n\n return {\n homepage: `https://github.com/${details.user}/${details.repo}#readme`,\n bugs: {\n url: `https://github.com/${details.user}/${details.repo}/issues`,\n },\n }\n}\n\nfunction repoFromOrigin(gitOrigin?: string) {\n if (!gitOrigin) {\n return {}\n }\n\n return {\n repository: {\n type: 'git',\n url: gitOrigin,\n },\n }\n}\n\nexport function addScript(cmd: string, existing: string) {\n if (existing && existing.includes(cmd)) {\n return existing\n }\n\n return cmd\n}\n\nexport async function addPackageJsonScripts(\n manifest: PackageJson,\n options: InjectOptions,\n updateScripts: (currentScripts: Record<string, string>) => Record<string, string>,\n) {\n const originalScripts = manifest.scripts || {}\n const scripts = updateScripts({...originalScripts})\n\n const differs = Object.keys(scripts).some((key) => scripts[key] !== originalScripts[key])\n\n if (differs) {\n await writePackageJsonDirect({...manifest, scripts}, options)\n }\n\n return differs\n}\n\nexport async function writePackageJsonDirect(manifest: PackageJson, {basePath}: InjectOptions) {\n await writeJsonFile(path.join(basePath, 'package.json'), manifest)\n}\n\nexport async function addBuildScripts(manifest: PackageJson, options: InjectOptions) {\n if (!options.flags.scripts) {\n return false\n }\n return addPackageJsonScripts(manifest, options, (scripts) => {\n scripts.build = addScript(expectedScripts.build, scripts.build)\n scripts.format = addScript(`prettier --write --cache --ignore-unknown .`, scripts.format)\n scripts['link-watch'] = addScript(expectedScripts['link-watch'], scripts['link-watch'])\n scripts.lint = addScript(`eslint .`, scripts.lint)\n scripts.prepublishOnly = addScript(expectedScripts.prepublishOnly, scripts.prepublishOnly)\n scripts.watch = addScript(expectedScripts.watch, scripts.watch)\n return scripts\n })\n}\n\nexport function sortKeys<T extends Record<string, unknown>>(unordered: T): T {\n return Object.keys(unordered)\n .sort()\n .reduce((obj, key) => {\n // @ts-expect-error this WILL work\n obj[key] = unordered[key]\n return obj\n }, {} as T)\n}\n\n/** @internal */\nexport function forceDependencyVersions(\n deps: Record<string, string>,\n versions = forcedPackageVersions,\n): Record<string, string> {\n const entries = Object.entries(deps).map((entry) => {\n const [pkg] = entry\n const forceVersion = versions[pkg as keyof typeof versions]\n if (forceVersion) {\n return [pkg, forceVersion]\n }\n return entry\n })\n return Object.fromEntries(entries)\n}\n"],"names":["applyPreset","stat","readFile","validate","isObject","validatePaths","validNpmName","pkg","isValidEmail","outdent","addDevDependencies","info","files","devDependencies","require","validatePackageName","githubUrl"],"mappings":"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"}
|
package/dist/_chunks-es/ts.js
CHANGED
|
@@ -68,7 +68,7 @@ function createValidator(verifyConfig, flags, errors) {
|
|
|
68
68
|
}
|
|
69
69
|
async function runTscMaybe(verifyConfig, ts2) {
|
|
70
70
|
if (ts2 && verifyConfig.tsc !== !1) {
|
|
71
|
-
log.info("All checks ok, running
|
|
71
|
+
log.info("All checks ok, running TypeScript compiler.");
|
|
72
72
|
const { code } = await runCommand("tsc --build");
|
|
73
73
|
if (code !== 0)
|
|
74
74
|
throw new Error(`Compilation failed. See output above.
|
|
@@ -124,7 +124,7 @@ async function validateImports({ basePath }) {
|
|
|
124
124
|
};
|
|
125
125
|
}).filter((r) => r.errorCount);
|
|
126
126
|
if (onlyImportErrors.length) {
|
|
127
|
-
const resultText = await (await eslint.loadFormatter("stylish")).format(onlyImportErrors),
|
|
127
|
+
const resultText = await (await eslint.loadFormatter("stylish")).format(onlyImportErrors), additionalInfo = outdent`
|
|
128
128
|
ESLint detected Studio V2 imports that are no longer available.
|
|
129
129
|
It is recommended configure @sanity/eslint-config-no-v2-imports for ESLint.
|
|
130
130
|
|
|
@@ -139,7 +139,7 @@ async function validateImports({ basePath }) {
|
|
|
139
139
|
|
|
140
140
|
If the plugin package does not use eslint, disable this check.
|
|
141
141
|
`;
|
|
142
|
-
return [resultText +
|
|
142
|
+
return [resultText + additionalInfo];
|
|
143
143
|
}
|
|
144
144
|
} catch (e) {
|
|
145
145
|
return log.error("Failed to run eslint check", e), [
|
|
@@ -154,12 +154,10 @@ async function validateImports({ basePath }) {
|
|
|
154
154
|
}
|
|
155
155
|
async function readTSConfig(options) {
|
|
156
156
|
const { basePath, filename } = options, filePath = path.resolve(basePath, filename);
|
|
157
|
-
if (await fileExists(filePath))
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
basePath
|
|
162
|
-
) : void 0;
|
|
157
|
+
if (!await fileExists(filePath)) return;
|
|
158
|
+
const { config } = ts.readConfigFile(filePath, ts.sys.readFile);
|
|
159
|
+
if (config)
|
|
160
|
+
return ts.parseJsonConfigFileContent(config, ts.sys, basePath);
|
|
163
161
|
}
|
|
164
162
|
export {
|
|
165
163
|
createValidator,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ts.js","sources":["../../src/util/command-parser.ts","../../src/actions/verify/verify-common.ts","../../src/dependencies/import-linter.ts","../../src/util/ts.ts"],"sourcesContent":["import childProcess from 'child_process'\n\nimport npmRunPath from 'npm-run-path'\n\nimport log from './log'\n\ninterface Command {\n command: string\n args: string[]\n}\n\nfunction parseCommand(commandString: string): Command {\n const normalized = commandString.replace(/ +/g, ' ')\n const commandAndArg = normalized.split(' ')\n return {\n command: commandAndArg[0],\n args: commandAndArg.length > 1 ? commandAndArg.slice(1) : [],\n }\n}\n\nexport async function runCommand(commandString: string): Promise<{code: number}> {\n log.info(`Running command: ${commandString}`)\n const {command, args} = parseCommand(commandString)\n\n let options: any = {stdio: 'inherit', env: npmRunPath.env()}\n\n // ref: https://stackoverflow.com/questions/37459717/error-spawn-enoent-on-windows/37487465\n options = process.platform === 'win32' ? {...options, shell: true} : options\n\n return new Promise((resolve, reject) => {\n childProcess\n .spawn(command, args, options)\n .on('error', reject)\n .on('close', (exitCode) => {\n resolve({code: exitCode ?? 0})\n })\n })\n}\n","import chalk from 'chalk'\nimport {TypedFlags} from 'meow'\nimport outdent from 'outdent'\nimport {ParsedCommandLine} from 'typescript'\n\nimport sharedFlags from '../../sharedFlags'\nimport {runCommand} from '../../util/command-parser'\nimport log from '../../util/log'\n\nconst splitLine = `\\n----------------------------------------------------------`\n\nexport const verifyPackageConfigDefaults = {\n 'packageName': true,\n 'tsconfig': true,\n 'tsc': true,\n 'dependencies': true,\n 'deprecatedDependencies': true,\n 'babelConfig': true,\n 'sanityV2Json': true,\n 'eslintImports': true,\n 'scripts': true,\n 'pkg-utils': true,\n 'nodeEngine': true,\n 'studioConfig': true,\n 'srcIndex': true,\n 'duplicateConfig': true,\n} as const\n\nexport type VerifyPackageConfig = Partial<Record<keyof typeof verifyPackageConfigDefaults, boolean>>\n\nexport const verifyFlags = {\n ...sharedFlags,\n single: {\n default: false,\n type: 'boolean',\n },\n} as const\n\nexport type VerifyFlags = TypedFlags<typeof verifyFlags>\n\nfunction disableCheckText(checkKey: string) {\n return chalk.grey(\n outdent`\n To skip this validation add the following to your package.json:\n \"sanityPlugin\": {\n \"verifyPackage\": {\n \"${checkKey}\": false\n }\n }\n `.trimStart(),\n )\n}\n\nexport function createValidator(\n verifyConfig: VerifyPackageConfig,\n flags: VerifyFlags,\n errors: string[],\n) {\n return async function validation(\n checkKey: keyof VerifyPackageConfig,\n task: () => Promise<string[] | undefined>,\n ) {\n if (verifyConfig[checkKey] !== false) {\n const result = await task()\n if (result?.length) {\n result.push(disableCheckText(checkKey))\n const errorMessage = result.join('\\n\\n')\n errors.push(errorMessage)\n log.error(`\\n` + errorMessage + splitLine)\n }\n }\n\n if (flags.single && errors.length) {\n throw new Error(\n outdent`Detected outstanding upgrade issues.\n\n Fail-fast (--single) mode enabled, stopping validation here.\n `,\n )\n }\n }\n}\n\nexport async function runTscMaybe(verifyConfig: VerifyPackageConfig, ts?: ParsedCommandLine) {\n if (ts && verifyConfig.tsc !== false) {\n log.info('All checks ok, running Typescript compiler.')\n const {code} = await runCommand('tsc --build')\n if (code !== 0) {\n throw new Error('Compilation failed. See output above.\\n\\n' + disableCheckText('tsc'))\n }\n }\n}\n","import path from 'path'\n\nimport {ESLint} from 'eslint'\nimport outdent from 'outdent'\n\nimport {mergedPackages} from '../configs/banned-packages'\nimport {urls} from '../constants'\nimport log from '../util/log'\n\nconst removedImportSuffix = `imports where removed in Sanity v3. Please refer to the migration guide: ${urls.migrationGuideStudio}, or new API-reference docs: ${urls.refDocs}`\n\nexport async function validateImports({basePath}: {basePath: string}): Promise<string[]> {\n log.debug('Running ESLint with Sanity Studio import hints...')\n const eslint = new ESLint({\n cwd: basePath,\n overrideConfig: {\n ignorePatterns: ['node_modules'],\n rules: {\n 'no-restricted-imports': [\n 'error',\n {\n patterns: [\n ...mergedPackages.map((packageName) => ({\n group: [`${packageName}*`],\n message: `Use sanity instead of ${packageName}.`,\n })),\n {\n group: ['config:*'],\n message: `config: imports are no longer supported. Please see the new plugin API for alternatives: ${urls.migrationGuideStudio}`,\n },\n {\n group: ['part:*'],\n message: `part: ${removedImportSuffix}`,\n },\n {\n group: ['all:part:*'],\n message: `all:part: ${removedImportSuffix}`,\n },\n {\n group: ['sanity:*'],\n message: `sanity: ${removedImportSuffix}`,\n },\n ],\n },\n ],\n },\n },\n })\n\n try {\n const results = await eslint.lintFiles([path.join(basePath, '**/*.{js,jsx,ts,tsx}')])\n\n const onlyImportErrors = results\n .map((r) => {\n const limitErrors = r.messages.filter((m) => m.ruleId === 'no-restricted-imports')\n return {\n ...r,\n messages: limitErrors,\n errorCount: limitErrors.length,\n }\n })\n .filter((r) => r.errorCount)\n\n if (onlyImportErrors.length) {\n const formatter = await eslint.loadFormatter('stylish')\n const resultText = await formatter.format(onlyImportErrors)\n\n const addtionalInfo = outdent`\n ESLint detected Studio V2 imports that are no longer available.\n It is recommended configure @sanity/eslint-config-no-v2-imports for ESLint.\n\n Run:\n npm install --save-dev @sanity/eslint-config-no-v2-imports\n\n In .eslintrc add:\n \"extends\": [\"@sanity/no-v2-imports\"]\n\n This way, V2-imports can be identified directly in the IDE, or using eslint CLI.\n For more, see ${urls.linterPackage}\n\n If the plugin package does not use eslint, disable this check.\n `\n return [resultText + addtionalInfo]\n }\n } catch (e) {\n log.error('Failed to run eslint check', e)\n return [\n outdent`\n Failed to run ESLint. Is ESLint configured?\n\n If the package does not use eslint, disable this check.\n `,\n ]\n }\n\n return []\n}\n","import path from 'path'\n\nimport * as ts from 'typescript'\n\nimport {fileExists} from './files'\n\nexport async function readTSConfig(options: {basePath: string; filename: string}) {\n const {basePath, filename} = options\n const filePath = path.resolve(basePath, filename)\n const exists = await fileExists(filePath)\n\n if (!exists) return undefined\n\n return ts.readConfigFile(filePath, ts.sys.readFile).config\n ? ts.parseJsonConfigFileContent(\n ts.readConfigFile(filePath, ts.sys.readFile).config,\n ts.sys,\n basePath,\n )\n : undefined\n}\n"],"names":["ts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ts.js","sources":["../../src/util/command-parser.ts","../../src/actions/verify/verify-common.ts","../../src/dependencies/import-linter.ts","../../src/util/ts.ts"],"sourcesContent":["import childProcess from 'child_process'\n\nimport npmRunPath from 'npm-run-path'\n\nimport log from './log'\n\ninterface Command {\n command: string\n args: string[]\n}\n\nfunction parseCommand(commandString: string): Command {\n const normalized = commandString.replace(/ +/g, ' ')\n const commandAndArg = normalized.split(' ')\n return {\n command: commandAndArg[0],\n args: commandAndArg.length > 1 ? commandAndArg.slice(1) : [],\n }\n}\n\nexport async function runCommand(commandString: string): Promise<{code: number}> {\n log.info(`Running command: ${commandString}`)\n const {command, args} = parseCommand(commandString)\n\n let options: any = {stdio: 'inherit', env: npmRunPath.env()}\n\n // ref: https://stackoverflow.com/questions/37459717/error-spawn-enoent-on-windows/37487465\n options = process.platform === 'win32' ? {...options, shell: true} : options\n\n return new Promise((resolve, reject) => {\n childProcess\n .spawn(command, args, options)\n .on('error', reject)\n .on('close', (exitCode) => {\n resolve({code: exitCode ?? 0})\n })\n })\n}\n","import chalk from 'chalk'\nimport {TypedFlags} from 'meow'\nimport outdent from 'outdent'\nimport {ParsedCommandLine} from 'typescript'\n\nimport sharedFlags from '../../sharedFlags'\nimport {runCommand} from '../../util/command-parser'\nimport log from '../../util/log'\n\nconst splitLine = `\\n----------------------------------------------------------`\n\nexport const verifyPackageConfigDefaults = {\n 'packageName': true,\n 'tsconfig': true,\n 'tsc': true,\n 'dependencies': true,\n 'deprecatedDependencies': true,\n 'babelConfig': true,\n 'sanityV2Json': true,\n 'eslintImports': true,\n 'scripts': true,\n 'pkg-utils': true,\n 'nodeEngine': true,\n 'studioConfig': true,\n 'srcIndex': true,\n 'duplicateConfig': true,\n} as const\n\nexport type VerifyPackageConfig = Partial<Record<keyof typeof verifyPackageConfigDefaults, boolean>>\n\nexport const verifyFlags = {\n ...sharedFlags,\n single: {\n default: false,\n type: 'boolean',\n },\n} as const\n\nexport type VerifyFlags = TypedFlags<typeof verifyFlags>\n\nfunction disableCheckText(checkKey: string) {\n return chalk.grey(\n outdent`\n To skip this validation add the following to your package.json:\n \"sanityPlugin\": {\n \"verifyPackage\": {\n \"${checkKey}\": false\n }\n }\n `.trimStart(),\n )\n}\n\nexport function createValidator(\n verifyConfig: VerifyPackageConfig,\n flags: VerifyFlags,\n errors: string[],\n) {\n return async function validation(\n checkKey: keyof VerifyPackageConfig,\n task: () => Promise<string[] | undefined>,\n ) {\n if (verifyConfig[checkKey] !== false) {\n const result = await task()\n if (result?.length) {\n result.push(disableCheckText(checkKey))\n const errorMessage = result.join('\\n\\n')\n errors.push(errorMessage)\n log.error(`\\n` + errorMessage + splitLine)\n }\n }\n\n if (flags.single && errors.length) {\n throw new Error(\n outdent`Detected outstanding upgrade issues.\n\n Fail-fast (--single) mode enabled, stopping validation here.\n `,\n )\n }\n }\n}\n\nexport async function runTscMaybe(verifyConfig: VerifyPackageConfig, ts?: ParsedCommandLine) {\n if (ts && verifyConfig.tsc !== false) {\n log.info('All checks ok, running TypeScript compiler.')\n const {code} = await runCommand('tsc --build')\n if (code !== 0) {\n throw new Error('Compilation failed. See output above.\\n\\n' + disableCheckText('tsc'))\n }\n }\n}\n","import path from 'path'\n\nimport {ESLint} from 'eslint'\nimport outdent from 'outdent'\n\nimport {mergedPackages} from '../configs/banned-packages'\nimport {urls} from '../constants'\nimport log from '../util/log'\n\nconst removedImportSuffix = `imports where removed in Sanity v3. Please refer to the migration guide: ${urls.migrationGuideStudio}, or new API-reference docs: ${urls.refDocs}`\n\nexport async function validateImports({basePath}: {basePath: string}): Promise<string[]> {\n log.debug('Running ESLint with Sanity Studio import hints...')\n const eslint = new ESLint({\n cwd: basePath,\n overrideConfig: {\n ignorePatterns: ['node_modules'],\n rules: {\n 'no-restricted-imports': [\n 'error',\n {\n patterns: [\n ...mergedPackages.map((packageName) => ({\n group: [`${packageName}*`],\n message: `Use sanity instead of ${packageName}.`,\n })),\n {\n group: ['config:*'],\n message: `config: imports are no longer supported. Please see the new plugin API for alternatives: ${urls.migrationGuideStudio}`,\n },\n {\n group: ['part:*'],\n message: `part: ${removedImportSuffix}`,\n },\n {\n group: ['all:part:*'],\n message: `all:part: ${removedImportSuffix}`,\n },\n {\n group: ['sanity:*'],\n message: `sanity: ${removedImportSuffix}`,\n },\n ],\n },\n ],\n },\n },\n })\n\n try {\n const results = await eslint.lintFiles([path.join(basePath, '**/*.{js,jsx,ts,tsx}')])\n\n const onlyImportErrors = results\n .map((r) => {\n const limitErrors = r.messages.filter((m) => m.ruleId === 'no-restricted-imports')\n return {\n ...r,\n messages: limitErrors,\n errorCount: limitErrors.length,\n }\n })\n .filter((r) => r.errorCount)\n\n if (onlyImportErrors.length) {\n const formatter = await eslint.loadFormatter('stylish')\n const resultText = await formatter.format(onlyImportErrors)\n\n const additionalInfo = outdent`\n ESLint detected Studio V2 imports that are no longer available.\n It is recommended configure @sanity/eslint-config-no-v2-imports for ESLint.\n\n Run:\n npm install --save-dev @sanity/eslint-config-no-v2-imports\n\n In .eslintrc add:\n \"extends\": [\"@sanity/no-v2-imports\"]\n\n This way, V2-imports can be identified directly in the IDE, or using eslint CLI.\n For more, see ${urls.linterPackage}\n\n If the plugin package does not use eslint, disable this check.\n `\n return [resultText + additionalInfo]\n }\n } catch (e) {\n log.error('Failed to run eslint check', e)\n return [\n outdent`\n Failed to run ESLint. Is ESLint configured?\n\n If the package does not use eslint, disable this check.\n `,\n ]\n }\n\n return []\n}\n","import path from 'path'\n\nimport * as ts from 'typescript'\n\nimport {fileExists} from './files'\n\nexport async function readTSConfig(options: {basePath: string; filename: string}) {\n const {basePath, filename} = options\n const filePath = path.resolve(basePath, filename)\n const exists = await fileExists(filePath)\n\n if (!exists) return undefined\n\n const {config} = ts.readConfigFile(filePath, ts.sys.readFile)\n\n if (!config) return undefined\n\n return ts.parseJsonConfigFileContent(config, ts.sys, basePath)\n}\n"],"names":["ts"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-package.js","sources":["../../src/actions/verify-package.ts","../../src/cmds/verify-package.ts"],"sourcesContent":["import chalk from 'chalk'\nimport outdent from 'outdent'\n\nimport {cliName, defaultOutDir, urls} from '../constants'\nimport {validateImports} from '../dependencies/import-linter'\nimport {getPackage} from '../npm/package'\nimport {loadPackageConfig} from '../util/load-package-config'\nimport log from '../util/log'\nimport {readTSConfig} from '../util/ts'\nimport {PackageJson} from './verify/types'\nimport {\n validateBabelConfig,\n validateNodeEngine,\n validatePackageName,\n validatePackageType,\n validatePkgUtilsDependency,\n validatePkgUtilsVersion,\n validatePluginSanityJson,\n validateDeprecatedDependencies,\n validateScripts,\n validateTsConfig,\n validateSanityDependencies,\n validateSrcIndexFile,\n disallowDuplicateEslintConfig,\n disallowDuplicatePrettierConfig,\n} from './verify/validations'\nimport {\n createValidator,\n runTscMaybe,\n VerifyFlags,\n VerifyPackageConfig,\n} from './verify/verify-common'\n\nexport async function verifyPackage({basePath, flags}: {basePath: string; flags: VerifyFlags}) {\n let errors: string[] = []\n\n const packageJson: PackageJson = await getPackage({basePath, validate: false})\n const verifyConfig: VerifyPackageConfig = packageJson.sanityPlugin?.verifyPackage || {}\n\n // Hard requirements (not configurable via sanityPlugin.verifyPackage): plugins must be ESM and\n // ship a compatible @sanity/pkg-utils, since plugin-kit loads package.config.ts through it.\n for (const hardError of [\n ...validatePackageType(packageJson),\n ...validatePkgUtilsVersion({basePath}),\n ]) {\n errors.push(hardError)\n log.error(`\\n${hardError}`)\n }\n\n // Load defensively: if the config can't be loaded (e.g. incompatible/missing pkg-utils), fall\n // back to defaults so the remaining checks still surface actionable issues.\n let packageConfig\n try {\n packageConfig = await loadPackageConfig({basePath})\n } catch (err) {\n log.debug('Failed to load package.config: %s', err)\n }\n const outDir = packageConfig?.dist ?? defaultOutDir\n const tsconfig = packageConfig?.tsconfig ?? 'tsconfig.json'\n\n const validation = createValidator(verifyConfig, flags, errors)\n\n const ts = await readTSConfig({basePath, filename: tsconfig})\n\n await validation('packageName', async () => validatePackageName(packageJson))\n await validation('pkg-utils', async () => validatePkgUtilsDependency(packageJson))\n await validation('srcIndex', async () => validateSrcIndexFile(basePath))\n await validation('scripts', async () => validateScripts(packageJson))\n await validation('nodeEngine', async () => validateNodeEngine(packageJson))\n await validation('duplicateConfig', async () =>\n disallowDuplicateEslintConfig(basePath, packageJson),\n )\n await validation('duplicateConfig', async () =>\n disallowDuplicatePrettierConfig(basePath, packageJson),\n )\n\n if (ts) {\n await validation('tsconfig', async () => validateTsConfig(ts, {basePath, outDir, tsconfig}))\n }\n\n await validation('sanityV2Json', async () => validatePluginSanityJson({basePath, packageJson}))\n\n await validation('babelConfig', async () => validateBabelConfig({basePath}))\n\n await validation('dependencies', async () => validateSanityDependencies(packageJson))\n await validation('deprecatedDependencies', async () =>\n validateDeprecatedDependencies(packageJson),\n )\n await validation('eslintImports', async () => validateImports({basePath}))\n\n if (errors.length) {\n throw new Error(\n outdent`\n Detected validation issues!\n To make this package Sanity v3 compatible, fix the issues starting from the top, or disable any checks you deem unnecessary.\n\n These issues assume the package uses @sanity/plugin-kit defaults for development and building.\n Refer to ${urls.pluginReadme} for configuration options.\n\n More information is available here:\n - Studio migration guide: ${urls.migrationGuideStudio}\n - Plugin migration guide: ${urls.migrationGuidePlugin}\n - Reference documentation: ${urls.refDocs}\n\n ${chalk.grey(\n `To fail-fast on first detected issue run:\\nnpx ${cliName} verify-package
|
|
1
|
+
{"version":3,"file":"verify-package.js","sources":["../../src/actions/verify-package.ts","../../src/cmds/verify-package.ts"],"sourcesContent":["import chalk from 'chalk'\nimport outdent from 'outdent'\n\nimport {cliName, defaultOutDir, urls} from '../constants'\nimport {validateImports} from '../dependencies/import-linter'\nimport {getPackage} from '../npm/package'\nimport {loadPackageConfig} from '../util/load-package-config'\nimport log from '../util/log'\nimport {readTSConfig} from '../util/ts'\nimport {PackageJson} from './verify/types'\nimport {\n validateBabelConfig,\n validateNodeEngine,\n validatePackageName,\n validatePackageType,\n validatePkgUtilsDependency,\n validatePkgUtilsVersion,\n validatePluginSanityJson,\n validateDeprecatedDependencies,\n validateScripts,\n validateTsConfig,\n validateSanityDependencies,\n validateSrcIndexFile,\n disallowDuplicateEslintConfig,\n disallowDuplicatePrettierConfig,\n} from './verify/validations'\nimport {\n createValidator,\n runTscMaybe,\n VerifyFlags,\n VerifyPackageConfig,\n} from './verify/verify-common'\n\nexport async function verifyPackage({basePath, flags}: {basePath: string; flags: VerifyFlags}) {\n let errors: string[] = []\n\n const packageJson: PackageJson = await getPackage({basePath, validate: false})\n const verifyConfig: VerifyPackageConfig = packageJson.sanityPlugin?.verifyPackage || {}\n\n // Hard requirements (not configurable via sanityPlugin.verifyPackage): plugins must be ESM and\n // ship a compatible @sanity/pkg-utils, since plugin-kit loads package.config.ts through it.\n for (const hardError of [\n ...validatePackageType(packageJson),\n ...validatePkgUtilsVersion({basePath}),\n ]) {\n errors.push(hardError)\n log.error(`\\n${hardError}`)\n }\n\n // Load defensively: if the config can't be loaded (e.g. incompatible/missing pkg-utils), fall\n // back to defaults so the remaining checks still surface actionable issues.\n let packageConfig\n try {\n packageConfig = await loadPackageConfig({basePath})\n } catch (err) {\n log.debug('Failed to load package.config: %s', err)\n }\n const outDir = packageConfig?.dist ?? defaultOutDir\n const tsconfig = packageConfig?.tsconfig ?? 'tsconfig.json'\n\n const validation = createValidator(verifyConfig, flags, errors)\n\n const ts = await readTSConfig({basePath, filename: tsconfig})\n\n await validation('packageName', async () => validatePackageName(packageJson))\n await validation('pkg-utils', async () => validatePkgUtilsDependency(packageJson))\n await validation('srcIndex', async () => validateSrcIndexFile(basePath))\n await validation('scripts', async () => validateScripts(packageJson))\n await validation('nodeEngine', async () => validateNodeEngine(packageJson))\n await validation('duplicateConfig', async () =>\n disallowDuplicateEslintConfig(basePath, packageJson),\n )\n await validation('duplicateConfig', async () =>\n disallowDuplicatePrettierConfig(basePath, packageJson),\n )\n\n if (ts) {\n await validation('tsconfig', async () => validateTsConfig(ts, {basePath, outDir, tsconfig}))\n }\n\n await validation('sanityV2Json', async () => validatePluginSanityJson({basePath, packageJson}))\n\n await validation('babelConfig', async () => validateBabelConfig({basePath}))\n\n await validation('dependencies', async () => validateSanityDependencies(packageJson))\n await validation('deprecatedDependencies', async () =>\n validateDeprecatedDependencies(packageJson),\n )\n await validation('eslintImports', async () => validateImports({basePath}))\n\n if (errors.length) {\n throw new Error(\n outdent`\n Detected validation issues!\n To make this package Sanity v3 compatible, fix the issues starting from the top, or disable any checks you deem unnecessary.\n\n These issues assume the package uses @sanity/plugin-kit defaults for development and building.\n Refer to ${urls.pluginReadme} for configuration options.\n\n More information is available here:\n - Studio migration guide: ${urls.migrationGuideStudio}\n - Plugin migration guide: ${urls.migrationGuidePlugin}\n - Reference documentation: ${urls.refDocs}\n\n ${chalk.grey(\n `To fail-fast on first detected issue run:\\nnpx ${cliName} verify-package --single`,\n )}\n `.trimStart(),\n )\n }\n\n await runTscMaybe(verifyConfig, ts)\n\n log.success(\n outdent`\n No outstanding upgrade issues detected.\n\n Suggested next steps:\n - Use plugin-kit to build and develop the plugin according to ${urls.pluginReadme}.\n - Build the plugin and fix any compilation errors\n - Test the plugin using the link-watch command\n `.trim(),\n )\n}\n","import path from 'path'\n\nimport meow from 'meow'\n\nimport {verifyPackage} from '../actions/verify-package'\nimport {verifyFlags} from '../actions/verify/verify-common'\nimport {cliName} from '../constants'\n\nconst description = `Verify that a Sanity plugin package is v3 compatible, and print upgrade steps if not.`\n\nconst help = `\nUsage\n $ ${cliName} verify-package [dir] [<args>]\n\nOptions\n --single Enables fail-fast mode: Will only output the first validation that fails.\n --silent Do not print info and warning messages\n --verbose Log everything. This option conflicts with --silent\n --version Output the version number\n --help Output usage information\n\nEach check will describe how they can be individually disabled.\n\nExamples\n # Verify Sanity plugin package in current directory\n $ ${cliName} verify-package\n\n # Verify Sanity plugin package in my-plugin directory in silent mode\n $ ${cliName} verify-package my-plugin-directory --silent\n`\n\nfunction run({argv}: {argv: string[]}) {\n const cli = meow(help, {flags: verifyFlags, argv, description})\n const basePath = path.resolve(cli.input[0] || process.cwd())\n return verifyPackage({basePath, flags: cli.flags})\n}\n\nexport default run\n"],"names":[],"mappings":";;;;;;;;AAiCA,eAAsB,cAAc,EAAC,UAAU,SAAgD;AAC7F,MAAI,SAAmB,CAAA;AAEvB,QAAM,cAA2B,MAAM,WAAW,EAAC,UAAU,UAAU,GAAA,CAAM,GACvE,eAAoC,YAAY,cAAc,iBAAiB,CAAA;AAIrF,aAAW,aAAa;AAAA,IACtB,GAAG,oBAAoB,WAAW;AAAA,IAClC,GAAG,wBAAwB,EAAC,SAAA,CAAS;AAAA,EAAA;AAErC,WAAO,KAAK,SAAS,GACrB,IAAI,MAAM;AAAA,EAAK,SAAS,EAAE;AAK5B,MAAI;AACJ,MAAI;AACF,oBAAgB,MAAM,kBAAkB,EAAC,UAAS;AAAA,EACpD,SAAS,KAAK;AACZ,QAAI,MAAM,qCAAqC,GAAG;AAAA,EACpD;AACA,QAAM,SAAS,eAAe,QAAQ,eAChC,WAAW,eAAe,YAAY,iBAEtC,aAAa,gBAAgB,cAAc,OAAO,MAAM,GAExD,KAAK,MAAM,aAAa,EAAC,UAAU,UAAU,UAAS;AA4B5D,MA1BA,MAAM,WAAW,eAAe,YAAY,oBAAoB,WAAW,CAAC,GAC5E,MAAM,WAAW,aAAa,YAAY,2BAA2B,WAAW,CAAC,GACjF,MAAM,WAAW,YAAY,YAAY,qBAAqB,QAAQ,CAAC,GACvE,MAAM,WAAW,WAAW,YAAY,gBAAgB,WAAW,CAAC,GACpE,MAAM,WAAW,cAAc,YAAY,mBAAmB,WAAW,CAAC,GAC1E,MAAM;AAAA,IAAW;AAAA,IAAmB,YAClC,8BAA8B,UAAU,WAAW;AAAA,EAAA,GAErD,MAAM;AAAA,IAAW;AAAA,IAAmB,YAClC,gCAAgC,UAAU,WAAW;AAAA,EAAA,GAGnD,MACF,MAAM,WAAW,YAAY,YAAY,iBAAiB,IAAI,EAAC,UAAU,QAAQ,SAAA,CAAS,CAAC,GAG7F,MAAM,WAAW,gBAAgB,YAAY,yBAAyB,EAAC,UAAU,aAAY,CAAC,GAE9F,MAAM,WAAW,eAAe,YAAY,oBAAoB,EAAC,SAAA,CAAS,CAAC,GAE3E,MAAM,WAAW,gBAAgB,YAAY,2BAA2B,WAAW,CAAC,GACpF,MAAM;AAAA,IAAW;AAAA,IAA0B,YACzC,+BAA+B,WAAW;AAAA,EAAA,GAE5C,MAAM,WAAW,iBAAiB,YAAY,gBAAgB,EAAC,SAAA,CAAS,CAAC,GAErE,OAAO;AACT,UAAM,IAAI;AAAA,MACR;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKa,KAAK,YAAY;AAAA;AAAA;AAAA,oCAGA,KAAK,oBAAoB;AAAA,oCACzB,KAAK,oBAAoB;AAAA,qCACxB,KAAK,OAAO;AAAA;AAAA,UAEvC,MAAM;AAAA,QACN;AAAA,MAAkD,OAAO;AAAA,MAAA,CAC1D;AAAA,QACD,UAAA;AAAA,IAAU;AAIhB,QAAM,YAAY,cAAc,EAAE,GAElC,IAAI;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,sEAIkE,KAAK,YAAY;AAAA;AAAA;AAAA,IAGnF,KAAA;AAAA,EAAK;AAET;ACnHA,MAAM,cAAc,yFAEd,OAAO;AAAA;AAAA,MAEP,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaP,OAAO;AAAA;AAAA;AAAA,MAGP,OAAO;AAAA;AAGb,SAAS,IAAI,EAAC,QAAyB;AACrC,QAAM,MAAM,KAAK,MAAM,EAAC,OAAO,aAAa,MAAM,YAAA,CAAY,GACxD,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,QAAQ,KAAK;AAC3D,SAAO,cAAc,EAAC,UAAU,OAAO,IAAI,OAAM;AACnD;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanity/plugin-kit",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.2",
|
|
4
4
|
"description": "Enhanced Sanity.io plugin development experience",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bootstrap",
|
|
@@ -36,33 +36,33 @@
|
|
|
36
36
|
"./package.json": "./package.json"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@rexxars/choosealicense-list": "1.1.2",
|
|
40
|
-
"chalk": "4.1.2",
|
|
41
|
-
"concurrently": "8.2.2",
|
|
42
|
-
"email-validator": "2.0.4",
|
|
43
|
-
"execa": "5.1.1",
|
|
44
|
-
"get-it": "8.
|
|
45
|
-
"get-latest-version": "5.1.0",
|
|
46
|
-
"git-remote-origin-url": "3.1.0",
|
|
47
|
-
"github-url-to-object": "4.0.6",
|
|
48
|
-
"inquirer": "8.2.
|
|
49
|
-
"json5": "2.2.3",
|
|
50
|
-
"meow": "9.0.0",
|
|
39
|
+
"@rexxars/choosealicense-list": "^1.1.2",
|
|
40
|
+
"chalk": "^4.1.2",
|
|
41
|
+
"concurrently": "^8.2.2",
|
|
42
|
+
"email-validator": "^2.0.4",
|
|
43
|
+
"execa": "^5.1.1",
|
|
44
|
+
"get-it": "^8.8.0",
|
|
45
|
+
"get-latest-version": "^5.1.0",
|
|
46
|
+
"git-remote-origin-url": "^3.1.0",
|
|
47
|
+
"github-url-to-object": "^4.0.6",
|
|
48
|
+
"inquirer": "^8.2.7",
|
|
49
|
+
"json5": "^2.2.3",
|
|
50
|
+
"meow": "^9.0.0",
|
|
51
51
|
"nodemon": "3.1.0",
|
|
52
|
-
"npm-run-path": "4.0.1",
|
|
53
|
-
"outdent": "0.8.0",
|
|
54
|
-
"p-any": "3.0.0",
|
|
55
|
-
"p-props": "4.0.0",
|
|
56
|
-
"validate-npm-package-name": "
|
|
57
|
-
"xdg-basedir": "4.0.0",
|
|
52
|
+
"npm-run-path": "^4.0.1",
|
|
53
|
+
"outdent": "^0.8.0",
|
|
54
|
+
"p-any": "^3.0.0",
|
|
55
|
+
"p-props": "^4.0.0",
|
|
56
|
+
"validate-npm-package-name": "^8.0.0",
|
|
57
|
+
"xdg-basedir": "^4.0.0",
|
|
58
58
|
"yalc": "1.0.0-pre.53"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
|
-
"@sanity/pkg-utils": "^10.5.
|
|
61
|
+
"@sanity/pkg-utils": "^10.5.7",
|
|
62
62
|
"@types/eslint": "^8.56.11",
|
|
63
63
|
"@types/inquirer": "^9.0.3",
|
|
64
64
|
"@types/node": "^24.13.2",
|
|
65
|
-
"@types/nodemon": "
|
|
65
|
+
"@types/nodemon": "1.19.6",
|
|
66
66
|
"@types/react": "^19.2.17",
|
|
67
67
|
"@typescript-eslint/eslint-plugin": "^8.26.0",
|
|
68
68
|
"@typescript-eslint/parser": "^8.26.0",
|
|
@@ -71,18 +71,18 @@
|
|
|
71
71
|
"eslint-config-sanity": "^7.1.2",
|
|
72
72
|
"eslint-plugin-prettier": "^5.2.1",
|
|
73
73
|
"eslint-plugin-react": "^7.37.0",
|
|
74
|
-
"eslint-plugin-react-hooks": "^
|
|
74
|
+
"eslint-plugin-react-hooks": "^7.1.1",
|
|
75
75
|
"prettier": "^3.3.3",
|
|
76
76
|
"react": "^19.2.7",
|
|
77
77
|
"react-dom": "^19.2.7",
|
|
78
78
|
"sanity": "^6.1.0",
|
|
79
79
|
"styled-components": "^6.4.2",
|
|
80
80
|
"typescript": "5.9.3",
|
|
81
|
-
"@repo/
|
|
82
|
-
"@repo/
|
|
81
|
+
"@repo/package.config": "0.0.0",
|
|
82
|
+
"@repo/tsconfig": "0.0.0"
|
|
83
83
|
},
|
|
84
84
|
"peerDependencies": {
|
|
85
|
-
"@sanity/pkg-utils": "^10.5.
|
|
85
|
+
"@sanity/pkg-utils": "^10.5.7",
|
|
86
86
|
"eslint": ">=8.0.0",
|
|
87
87
|
"typescript": "5.8.x || 5.9.x || 6.0.x"
|
|
88
88
|
},
|