@sanity/plugin-kit 9.0.3 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +3 -0
  2. package/dist/index.js +6 -6
  3. package/dist/{init-CybgPPvQ.js → init-DZhE4xaT.js} +14 -9
  4. package/dist/init-DZhE4xaT.js.map +1 -0
  5. package/dist/{inject-Clu1LMo4.js → inject-5mgcxtOo.js} +4 -4
  6. package/dist/{inject-Clu1LMo4.js.map → inject-5mgcxtOo.js.map} +1 -1
  7. package/dist/{link-watch-Dia6Auug.js → link-watch-Bij304R4.js} +9 -10
  8. package/dist/link-watch-Bij304R4.js.map +1 -0
  9. package/dist/{load-package-config-CNQRvdGW.js → load-package-config-CHynlKXx.js} +2 -2
  10. package/dist/{load-package-config-CNQRvdGW.js.map → load-package-config-CHynlKXx.js.map} +1 -1
  11. package/dist/log-2MbSIFbq.js +31 -0
  12. package/dist/log-2MbSIFbq.js.map +1 -0
  13. package/dist/{package-CzPTz0SQ.js → package-8cUY5BVf.js} +47 -13
  14. package/dist/package-8cUY5BVf.js.map +1 -0
  15. package/dist/package-DJ8SZ7x3.js +4 -0
  16. package/dist/package-DJ8SZ7x3.js.map +1 -0
  17. package/dist/{studio-detect-DZyFckSm.js → studio-detect-B2HVj8wT.js} +48 -23
  18. package/dist/studio-detect-B2HVj8wT.js.map +1 -0
  19. package/dist/{verify-package-DUyXZahn.js → verify-package-C75wyAo4.js} +7 -8
  20. package/dist/verify-package-C75wyAo4.js.map +1 -0
  21. package/dist/{version-D7J8Kc0u.js → version-DRt7fwK7.js} +3 -3
  22. package/dist/{version-D7J8Kc0u.js.map → version-DRt7fwK7.js.map} +1 -1
  23. package/package.json +10 -19
  24. package/dist/init-CybgPPvQ.js.map +0 -1
  25. package/dist/link-watch-Dia6Auug.js.map +0 -1
  26. package/dist/log-DgQL-Rv9.js +0 -31
  27. package/dist/log-DgQL-Rv9.js.map +0 -1
  28. package/dist/package-CAhVfclg.js +0 -4
  29. package/dist/package-CAhVfclg.js.map +0 -1
  30. package/dist/package-CzPTz0SQ.js.map +0 -1
  31. package/dist/studio-detect-DZyFckSm.js.map +0 -1
  32. package/dist/verify-package-DUyXZahn.js.map +0 -1
@@ -1,17 +1,15 @@
1
1
  import { n as defaultOutDir } from "./constants-BIVJp2Jy.js";
2
- import { n as sharedFlags_default, t as log_default } from "./log-DgQL-Rv9.js";
3
- import { D as ensureDir, E as copyFileWithOverwritePrompt, F as prompt, I as promptForPackageName, L as promptForRepoOrigin, M as readJsonFile, N as writeFile, O as fileExists, P as writeFileWithOverwritePrompt, a as getPackage, c as writePackageJsonDirect, d as forcedPackageVersions, i as forceDependencyVersions, j as readFile, l as resolveLatestVersions, n as addPackageJsonScripts, o as sortKeys, r as addScript, s as writePackageJson, t as addBuildScripts, u as forcedDevPackageVersions } from "./package-CzPTz0SQ.js";
4
- import { n as name, r as version } from "./package-CAhVfclg.js";
5
- import chalk from "chalk";
2
+ import { n as sharedFlags_default, t as log_default } from "./log-2MbSIFbq.js";
3
+ import { D as ensureDir, E as copyFileWithOverwritePrompt, F as prompt, I as promptForPackageName, L as promptForRepoOrigin, M as readJsonFile, N as writeFile, O as fileExists, P as writeFileWithOverwritePrompt, R as outdent, a as getPackage, c as writePackageJsonDirect, d as forcedPackageVersions, i as forceDependencyVersions, j as readFile, l as resolveLatestVersions, n as addPackageJsonScripts, o as sortKeys, r as addScript, s as writePackageJson, t as addBuildScripts, u as forcedDevPackageVersions } from "./package-8cUY5BVf.js";
4
+ import { n as name, r as version } from "./package-DJ8SZ7x3.js";
5
+ import { styleText } from "node:util";
6
6
  import path from "path";
7
- import outdent, { outdent as outdent$1 } from "outdent";
8
7
  import { fileURLToPath } from "url";
9
8
  import licenses from "@rexxars/choosealicense-list";
10
- import gitRemoteOriginUrl from "git-remote-origin-url";
9
+ import { execa } from "execa";
11
10
  import { execSync } from "child_process";
12
- import { validate } from "email-validator";
13
- import { xdgConfig } from "xdg-basedir";
14
- import { createRequester } from "get-it";
11
+ import { homedir } from "node:os";
12
+ import path$1 from "node:path";
15
13
  function defaultSourceJs(pkg) {
16
14
  return outdent`
17
15
  import {definePlugin} from 'sanity'
@@ -76,7 +74,7 @@ function gitignoreTemplate() {
76
74
  return {
77
75
  type: "template",
78
76
  to: ".gitignore",
79
- value: outdent$1`
77
+ value: outdent`
80
78
  # Logs
81
79
  logs
82
80
  *.log
@@ -161,7 +159,7 @@ function pkgConfigTemplate(options) {
161
159
  type: "template",
162
160
  force: flags.force,
163
161
  to: "package.config.ts",
164
- value: outdent$1`
162
+ value: outdent`
165
163
  import {defineConfig} from '@sanity/pkg-utils'
166
164
 
167
165
  export default defineConfig({
@@ -186,7 +184,7 @@ function tsconfigTemplate(options) {
186
184
  type: "template",
187
185
  force: flags.force,
188
186
  to: "tsconfig.json",
189
- value: outdent$1`
187
+ value: outdent`
190
188
  {
191
189
  "extends": "./tsconfig.settings",
192
190
  "include": ["./src", "./package.config.ts"]
@@ -200,7 +198,7 @@ function tsconfigTemplateDist(options) {
200
198
  type: "template",
201
199
  force: flags.force,
202
200
  to: `tsconfig.${outDir}.json`,
203
- value: outdent$1`
201
+ value: outdent`
204
202
  {
205
203
  "extends": "./tsconfig.settings",
206
204
  "include": ["./src"],
@@ -220,7 +218,7 @@ function tsconfigTemplateSettings(options) {
220
218
  type: "template",
221
219
  force: flags.force,
222
220
  to: "tsconfig.settings.json",
223
- value: outdent$1`
221
+ value: outdent`
224
222
  {
225
223
  "compilerOptions": {
226
224
  "rootDir": ".",
@@ -319,10 +317,30 @@ function isDefaultGitHubReadme(readme) {
319
317
  let lines = readme.split("\n", 20).filter(Boolean);
320
318
  return lines.length <= 2 && lines[0].startsWith("#");
321
319
  }
322
- const requester = createRequester({
323
- headers: { "User-Agent": `${name}@${version}` },
324
- as: "json"
325
- });
320
+ /**
321
+ * Lightweight email check for interactive prompts.
322
+ * Replaces the `email-validator` package.
323
+ */
324
+ function isValidEmail(value) {
325
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
326
+ }
327
+ /**
328
+ * Tiny fetch wrapper matching the previous get-it requester shape used by
329
+ * `getSanityUserInfo`.
330
+ */
331
+ async function requester({ url, headers = {} }) {
332
+ let response = await fetch(url, { headers: {
333
+ "User-Agent": `${name}@${version}`,
334
+ ...headers
335
+ } });
336
+ if (!response.ok) throw Error(`Request to ${url} failed with status ${response.status}`);
337
+ return { body: await response.json() };
338
+ }
339
+ /**
340
+ * XDG config home directory (`$XDG_CONFIG_HOME` or `~/.config`).
341
+ * Replaces the `xdg-basedir` package.
342
+ */
343
+ const xdgConfig = process.env.XDG_CONFIG_HOME?.trim() || path$1.join(homedir(), ".config");
326
344
  async function getUserInfo({ requireUserConfirmation, flags }, pkg) {
327
345
  let userInfo = getPackageUserInfo({ author: flags.author ?? pkg?.author }) || await getSanityUserInfo() || await getGitUserInfo();
328
346
  return requireUserConfirmation ? promptForInfo(userInfo) : userInfo;
@@ -389,7 +407,7 @@ function requiredString(value) {
389
407
  return value.length > 1 || "Required";
390
408
  }
391
409
  function validOrEmptyEmail(value) {
392
- return value ? validate(value) ? !0 : "Must either be a valid email or empty" : !0;
410
+ return value ? isValidEmail(value) ? !0 : "Must either be a valid email or empty" : !0;
393
411
  }
394
412
  const semverWorkflowPreset = {
395
413
  name: "semver-workflow",
@@ -408,7 +426,7 @@ async function addDevDependencies$1(options) {
408
426
  ...pkg.devDependencies,
409
427
  ...await semverWorkflowDependencies()
410
428
  }), newPkg = { ...pkg };
411
- newPkg.devDependencies = devDeps, await writePackageJsonDirect(newPkg, options), log_default.info("Updated devDependencies."), log_default.info(chalk.green(outdent`
429
+ newPkg.devDependencies = devDeps, await writePackageJsonDirect(newPkg, options), log_default.info("Updated devDependencies."), log_default.info(styleText("green", outdent`
412
430
  semantic-release preset injected.
413
431
 
414
432
  Please confer
@@ -525,7 +543,7 @@ const ui = {
525
543
  apply: applyPreset
526
544
  };
527
545
  async function applyPreset(options) {
528
- await addDependencies(options), await addDevDependencies(options), log_default.info(chalk.green("ui preset injected"));
546
+ await addDependencies(options), await addDevDependencies(options), log_default.info(styleText("green", "ui preset injected"));
529
547
  }
530
548
  async function addDependencies(options) {
531
549
  let pkg = await getPackage(options), newDeps = sortKeys(forceDependencyVersions({
@@ -605,7 +623,14 @@ async function injectBase(options) {
605
623
  log_default.debug("License: %s", license ? license.id : "<none>");
606
624
  let description = await getProjectDescription(basePath, pkg, requireUserConfirmation);
607
625
  log_default.debug("Description: %s", description || "<none>");
608
- let repoUrl = flags.repo ?? (await gitRemoteOriginUrl({ cwd: basePath }).catch(errorToUndefined) || pkg?.repository?.url), gitOrigin = requireUserConfirmation ? await promptForRepoOrigin(options, repoUrl) : repoUrl;
626
+ let repoUrl = flags.repo ?? (await execa("git", [
627
+ "config",
628
+ "--get",
629
+ "remote.origin.url"
630
+ ], {
631
+ cwd: basePath,
632
+ reject: !1
633
+ }).then((result) => result.exitCode === 0 ? result.stdout.trim() : void 0).catch(() => void 0) || pkg?.repository?.url), gitOrigin = requireUserConfirmation ? await promptForRepoOrigin(options, repoUrl) : repoUrl;
609
634
  log_default.debug("Remote origin: %s", gitOrigin || "<none>");
610
635
  let data = {
611
636
  user,
@@ -838,4 +863,4 @@ async function findStudioConfig(basePath) {
838
863
  }
839
864
  export { presetHelpList as a, inject as i, init as n, initFlags as r, findStudioConfig as t };
840
865
 
841
- //# sourceMappingURL=studio-detect-DZyFckSm.js.map
866
+ //# sourceMappingURL=studio-detect-B2HVj8wT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-detect-B2HVj8wT.js","names":["applyPreset","pkg.name","pkg.version","path","applyPreset","log","addDevDependencies","log","sharedFlags"],"sources":["../src/configs/default-source.ts","../src/configs/git.ts","../src/configs/oxfmt.ts","../src/configs/oxlint.ts","../src/configs/pkg-config.ts","../src/configs/tsconfig.ts","../src/presets/renovatebot.ts","../src/util/errorToUndefined.ts","../src/util/readme.ts","../src/util/email.ts","../src/util/request.ts","../src/util/xdg.ts","../src/util/user.ts","../src/presets/semver-workflow.ts","../src/presets/ui.ts","../src/presets/presets.ts","../src/actions/inject.ts","../src/actions/init.ts","../src/sanity/studio-detect.ts"],"sourcesContent":["import type {PackageJson} from '../actions/verify/types'\nimport {outdent} from '../util/outdent'\n\nexport function defaultSourceJs(pkg: PackageJson) {\n return (\n outdent`\n import {definePlugin} from 'sanity'\n\n /**\n * Usage in sanity.config.js (or .ts)\n *\n * \\`\\`\\`js\n * import {defineConfig} from 'sanity'\n * import {myPlugin} from '${pkg.name}'\n *\n * export default defineConfig({\n * // ...\n * plugins: [myPlugin({})],\n * })\n * \\`\\`\\`\n *\n * @public\n */\n export const myPlugin = definePlugin((_config = {}) => {\n // oxlint-disable-next-line no-console\n console.log(\\`hello from ${pkg.name}\\`)\n return {\n name: '${pkg.name}',\n }\n })\n`.trimStart() + '\\n'\n )\n}\n\nexport function defaultSourceTs(pkg: PackageJson) {\n return (\n outdent`\n import {definePlugin} from 'sanity'\n\n interface MyPluginConfig {\n /* nothing here yet */\n }\n\n /**\n * Usage in \\`sanity.config.ts\\` (or .js)\n *\n * \\`\\`\\`ts\n * import {defineConfig} from 'sanity'\n * import {myPlugin} from '${pkg.name}'\n *\n * export default defineConfig({\n * // ...\n * plugins: [myPlugin()],\n * })\n * \\`\\`\\`\n *\n * @public\n */\n export const myPlugin = definePlugin<MyPluginConfig | void>((_config = {}) => {\n // oxlint-disable-next-line no-console\n console.log('hello from ${pkg.name}')\n return {\n name: '${pkg.name}',\n }\n })\n`.trimStart() + '\\n'\n )\n}\n","import type {InjectTemplate} from '../actions/inject'\nimport {outdent} from '../util/outdent'\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 type {InitFlags} from '../actions/init'\nimport type {InjectTemplate} from '../actions/inject'\n\nexport function oxfmtConfigTemplate(options: {flags: InitFlags}): InjectTemplate {\n const {flags} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: 'oxfmt.config.ts',\n value: `export {default} from '@sanity/plugin-kit/oxfmt'`,\n }\n}\n","import type {InitFlags} from '../actions/init'\nimport type {InjectTemplate} from '../actions/inject'\n\nexport function oxlintConfigTemplate(options: {flags: InitFlags}): InjectTemplate {\n const {flags} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: 'oxlint.config.ts',\n value: `export {default} from '@sanity/plugin-kit/oxlint'`,\n }\n}\n","import type {InitFlags} from '../actions/init'\nimport type {InjectTemplate} from '../actions/inject'\nimport {outdent} from '../util/outdent'\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 type {InitFlags} from '../actions/init'\nimport type {InjectTemplate} from '../actions/inject'\nimport {outdent} from '../util/outdent'\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 {type InjectOptions, writeAssets} from '../actions/inject'\nimport type {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","export function errorToUndefined(err: any) {\n if (err instanceof TypeError) {\n throw err\n }\n\n return undefined\n}\n","import licenses from '@rexxars/choosealicense-list'\n\nimport type {PackageData} from '../actions/inject'\nimport {outdent} from './outdent'\nimport type {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/plugins/tree/main/packages/@sanity/plugin-kit)\n with default configuration for build & watch scripts.\n\n See [Testing a plugin in Sanity Studio](https://github.com/sanity-io/plugins/tree/main/packages/@sanity/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 const license = licenses.find(licenseId)\n let licenseName: string | undefined = license ? license.title : undefined\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","/**\n * Lightweight email check for interactive prompts.\n * Replaces the `email-validator` package.\n */\nexport function isValidEmail(value: string): boolean {\n // Practical check: local@domain with a dot in the domain. Prompt UX only —\n // not an RFC 5322 validator.\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)\n}\n","import pkg from '../../package.json'\n\ninterface RequestOptions {\n url: string\n as?: 'json'\n headers?: Record<string, string>\n}\n\ninterface RequestResult<T> {\n body: T\n}\n\n/**\n * Tiny fetch wrapper matching the previous get-it requester shape used by\n * `getSanityUserInfo`.\n */\nexport async function requester<T>({url, headers = {}}: RequestOptions): Promise<RequestResult<T>> {\n const response = await fetch(url, {\n headers: {\n 'User-Agent': `${pkg.name}@${pkg.version}`,\n ...headers,\n },\n })\n\n if (!response.ok) {\n throw new Error(`Request to ${url} failed with status ${response.status}`)\n }\n\n return {body: (await response.json()) as T}\n}\n","import {homedir} from 'node:os'\nimport path from 'node:path'\n\n/**\n * XDG config home directory (`$XDG_CONFIG_HOME` or `~/.config`).\n * Replaces the `xdg-basedir` package.\n */\nexport const xdgConfig = process.env.XDG_CONFIG_HOME?.trim() || path.join(homedir(), '.config')\n","import {execSync} from 'child_process'\nimport path from 'path'\n\nimport type {InjectOptions} from '../actions/inject'\nimport type {PackageJson} from '../actions/verify/types'\nimport {isValidEmail} from './email'\nimport {readJsonFile} from './files'\nimport {prompt} from './prompt'\nimport {requester} from './request'\nimport {xdgConfig} from './xdg'\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(xdgConfig ?? '', 'sanity', 'config.json'),\n )\n const token = data?.authToken\n\n if (!token) {\n return undefined\n }\n\n const {body: user} = await requester<User>({\n url: 'https://api.sanity.io/v1/users/me',\n as: 'json',\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","import {styleText} from 'node:util'\nimport path from 'path'\n\nimport {type Injectable, type InjectOptions, writeAssets} from '../actions/inject'\nimport type {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 {outdent} from '../util/outdent'\nimport {developTestSnippet, getLicenseText, installationSnippet} from '../util/readme'\nimport {getUserInfo} from '../util/user'\nimport type {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 styleText(\n '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","import {styleText} from 'node:util'\n\nimport type {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 type {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(styleText('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 type {InjectOptions} from '../actions/inject'\nimport {renovatePreset} from './renovatebot'\nimport {semverWorkflowPreset} from './semver-workflow'\nimport {ui} from './ui'\n\nexport interface Preset {\n name: string\n description: string\n apply: (options: InjectOptions) => Promise<void>\n}\n\nconst presets: Preset[] = [semverWorkflowPreset, renovatePreset, ui]\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\nimport licenses from '@rexxars/choosealicense-list'\nimport {execa} from 'execa'\n\nimport {gitignoreTemplate} from '../configs/git'\nimport {oxfmtConfigTemplate} from '../configs/oxfmt'\nimport {oxlintConfigTemplate} from '../configs/oxlint'\nimport {pkgConfigTemplate} from '../configs/pkg-config'\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 type {InitFlags} from './init'\nimport type {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 execa('git', ['config', '--get', 'remote.origin.url'], {\n cwd: basePath,\n reject: false,\n })\n .then((result) => (result.exitCode === 0 ? result.stdout.trim() : undefined))\n // Spawn errors (e.g. git missing) fall through to package.json repository.url\n .catch(() => undefined)) ||\n 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, String(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.oxlint && oxlintConfigTemplate({flags: options.flags}),\n {type: 'copy', from: 'editorconfig', to: '.editorconfig'},\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.oxfmt && oxfmtConfigTemplate({flags: options.flags}),\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","import path from 'path'\n\nimport type {TypedFlags} from 'meow'\n\nimport {defaultSourceJs, defaultSourceTs} from '../configs/default-source'\nimport {defaultOutDir} from '../constants'\nimport {getPackage} from '../npm/package'\nimport sharedFlags from '../sharedFlags'\nimport {ensureDir, writeFile} from '../util/files'\nimport {inject} from './inject'\n\nexport const initFlags = {\n ...sharedFlags,\n scripts: {\n type: 'boolean',\n default: true,\n },\n oxlint: {\n type: 'boolean',\n default: true,\n },\n typescript: {\n type: 'boolean',\n default: true,\n },\n oxfmt: {\n type: 'boolean',\n default: true,\n },\n license: {\n type: 'string',\n },\n editorconfig: {\n type: 'boolean',\n default: true,\n },\n gitignore: {\n type: 'boolean',\n default: true,\n },\n force: {\n type: 'boolean',\n default: false,\n },\n install: {\n type: 'boolean',\n default: true,\n },\n name: {\n type: 'string',\n },\n author: {\n type: 'string',\n },\n repo: {\n type: 'string',\n },\n presetOnly: {\n type: 'boolean',\n default: false,\n },\n preset: {\n type: 'string',\n isMultiple: true,\n },\n} as const\n\nexport type InitFlags = TypedFlags<typeof initFlags>\n\nexport interface InitOptions {\n basePath: string\n flags: InitFlags\n}\n\nexport async function init(options: InitOptions) {\n let dependencies = {}\n let devDependencies = {}\n let peerDependencies = {}\n\n await inject({\n ...options,\n outDir: defaultOutDir,\n requireUserConfirmation: !options.flags.force,\n dependencies,\n devDependencies,\n peerDependencies,\n validate: false,\n })\n\n const packageJson = await getPackage({basePath: options.basePath, validate: false})\n const typescript = options.flags.typescript\n const source = typescript ? defaultSourceTs(packageJson) : defaultSourceJs(packageJson)\n const filename = typescript ? 'index.ts' : 'index.js'\n const srcDir = path.resolve(options.basePath, 'src')\n await ensureDir(srcDir)\n await writeFile(path.join(srcDir, filename), source, {encoding: 'utf8'})\n}\n","import path from 'path'\n\nimport {fileExists} from '../util/files'\n\nconst studioConfigFiles = ['sanity.config.js', 'sanity.config.ts', 'sanity.cli.js', 'sanity.cli.ts']\n\n/**\n * Detects a Sanity Studio config file (`sanity.config.*` or `sanity.cli.*`) in `basePath`.\n * Used by init/inject to refuse operating inside a Studio instead of a plugin package.\n */\nexport async function findStudioConfig(basePath: string) {\n for (const configFile of studioConfigFiles) {\n if (await fileExists(path.join(basePath, configFile))) {\n return {configFile}\n }\n }\n return {configFile: undefined}\n}\n"],"mappings":"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"}
@@ -1,11 +1,10 @@
1
1
  import { i as urls, t as cliName } from "./constants-BIVJp2Jy.js";
2
- import { n as sharedFlags_default, t as log_default } from "./log-DgQL-Rv9.js";
3
- import { C as validateScripts, O as fileExists, S as validatePkgUtilsVersion, T as validateTsConfig, _ as validateOxfmtConfig, a as getPackage, b as validatePackageType, f as validateBabelConfig, g as validateNodeEngine, h as validateEsmOnly, m as validateDeprecatedDependencies, p as validateBannedFiles, v as validateOxlintConfig, w as validateSrcIndexFile, x as validatePkgUtilsDependency, y as validatePackageName } from "./package-CzPTz0SQ.js";
4
- import { t as loadPackageConfig } from "./load-package-config-CNQRvdGW.js";
2
+ import { n as sharedFlags_default, t as log_default } from "./log-2MbSIFbq.js";
3
+ import { C as validateScripts, O as fileExists, R as outdent, S as validatePkgUtilsVersion, T as validateTsConfig, _ as validateOxfmtConfig, a as getPackage, b as validatePackageType, f as validateBabelConfig, g as validateNodeEngine, h as validateEsmOnly, m as validateDeprecatedDependencies, p as validateBannedFiles, v as validateOxlintConfig, w as validateSrcIndexFile, x as validatePkgUtilsDependency, y as validatePackageName } from "./package-8cUY5BVf.js";
4
+ import { t as loadPackageConfig } from "./load-package-config-CHynlKXx.js";
5
5
  import meow from "meow";
6
- import chalk from "chalk";
6
+ import { styleText } from "node:util";
7
7
  import path from "path";
8
- import outdent from "outdent";
9
8
  import * as ts from "@typescript/typescript6";
10
9
  async function readTSConfig(options) {
11
10
  let { basePath, filename } = options, filePath = path.resolve(basePath, filename);
@@ -21,7 +20,7 @@ const verifyFlags = {
21
20
  }
22
21
  };
23
22
  function disableCheckText(checkKey) {
24
- return chalk.grey(outdent`
23
+ return styleText("grey", outdent`
25
24
  To skip this validation add the following to your package.json:
26
25
  "sanityPlugin": {
27
26
  "verifyPackage": {
@@ -76,7 +75,7 @@ async function verifyPackage({ basePath, flags }) {
76
75
  More information is available here:
77
76
  - Reference documentation: ${urls.refDocs}
78
77
 
79
- ${chalk.grey(`To fail-fast on first detected issue run:\nnpx ${cliName} verify-package --single`)}
78
+ ${styleText("grey", `To fail-fast on first detected issue run:\nnpx ${cliName} verify-package --single`)}
80
79
  `.trimStart());
81
80
  log_default.success(outdent`
82
81
  No outstanding package validation issues detected.
@@ -121,4 +120,4 @@ function run({ argv }) {
121
120
  }
122
121
  export { run as default };
123
122
 
124
- //# sourceMappingURL=verify-package-DUyXZahn.js.map
123
+ //# sourceMappingURL=verify-package-C75wyAo4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-package-C75wyAo4.js","names":["sharedFlags"],"sources":["../src/util/ts.ts","../src/actions/verify/verify-common.ts","../src/actions/verify-package.ts","../src/cmds/verify-package.ts"],"sourcesContent":["import path from 'path'\n\n// The JS compiler API is loaded from the official `@typescript/typescript6` compat package\n// instead of the `typescript` peer dependency, as TypeScript 7 (the Go-native compiler) no longer\n// ships it\nimport * as ts from '@typescript/typescript6'\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","import {styleText} from 'node:util'\n\nimport type {TypedFlags} from 'meow'\n\nimport sharedFlags from '../../sharedFlags'\nimport log from '../../util/log'\nimport {outdent} from '../../util/outdent'\n\nconst splitLine = `\\n----------------------------------------------------------`\n\nexport const verifyPackageConfigDefaults = {\n 'packageName': true,\n 'esmOnly': true,\n 'tsconfig': true,\n 'deprecatedDependencies': true,\n 'babelConfig': true,\n 'scripts': true,\n 'pkg-utils': true,\n 'nodeEngine': true,\n 'srcIndex': true,\n 'bannedFiles': true,\n 'oxfmt': true,\n 'oxlint': 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 styleText(\n '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 package validation issues.\n\n Fail-fast (--single) mode enabled, stopping validation here.\n `,\n )\n }\n }\n}\n","import {styleText} from 'node:util'\n\nimport {cliName, defaultOutDir, urls} from '../constants'\nimport {getPackage} from '../npm/package'\nimport {loadPackageConfig} from '../util/load-package-config'\nimport log from '../util/log'\nimport {outdent} from '../util/outdent'\nimport {readTSConfig} from '../util/ts'\nimport type {PackageJson} from './verify/types'\nimport {\n validateBabelConfig,\n validateEsmOnly,\n validateNodeEngine,\n validatePackageName,\n validatePackageType,\n validatePkgUtilsDependency,\n validatePkgUtilsVersion,\n validateDeprecatedDependencies,\n validateScripts,\n validateTsConfig,\n validateSrcIndexFile,\n validateBannedFiles,\n validateOxfmtConfig,\n validateOxlintConfig,\n} from './verify/validations'\nimport {createValidator, type VerifyFlags, type VerifyPackageConfig} 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('esmOnly', async () => validateEsmOnly(packageJson))\n await validation('pkg-utils', async () => validatePkgUtilsDependency(packageJson))\n await validation('srcIndex', async () => validateSrcIndexFile(basePath))\n await validation('bannedFiles', async () => validateBannedFiles(packageJson))\n await validation('scripts', async () => validateScripts(packageJson))\n await validation('nodeEngine', async () => validateNodeEngine(packageJson))\n await validation('oxfmt', async () => validateOxfmtConfig(basePath, packageJson))\n await validation('oxlint', async () => validateOxlintConfig(basePath, packageJson))\n\n if (ts) {\n await validation('tsconfig', async () => validateTsConfig(ts, {basePath, outDir, tsconfig}))\n }\n\n await validation('babelConfig', async () => validateBabelConfig({basePath}))\n\n await validation('deprecatedDependencies', async () =>\n validateDeprecatedDependencies(packageJson),\n )\n\n if (errors.length) {\n throw new Error(\n outdent`\n Detected validation issues!\n 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 - Reference documentation: ${urls.refDocs}\n\n ${styleText(\n 'grey',\n `To fail-fast on first detected issue run:\\nnpx ${cliName} verify-package --single`,\n )}\n `.trimStart(),\n )\n }\n\n log.success(\n outdent`\n No outstanding package validation 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 follows plugin-kit conventions.`\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, {importMeta: import.meta, 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"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { n as sharedFlags_default, t as log_default } from "./log-DgQL-Rv9.js";
2
- import { n as name, r as version, t as binname } from "./package-CAhVfclg.js";
1
+ import { n as sharedFlags_default, t as log_default } from "./log-2MbSIFbq.js";
2
+ import { n as name, r as version, t as binname } from "./package-DJ8SZ7x3.js";
3
3
  import meow from "meow";
4
4
  const description = `Show the installed version of ${name}`, help = `
5
5
  Usage
@@ -52,4 +52,4 @@ function run({ argv }) {
52
52
  }
53
53
  export { run as default };
54
54
 
55
- //# sourceMappingURL=version-D7J8Kc0u.js.map
55
+ //# sourceMappingURL=version-DRt7fwK7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version-D7J8Kc0u.js","names":["pkg.name","pkg.binname","pkg.version","sharedFlags"],"sources":["../src/cmds/version.ts"],"sourcesContent":["import meow from 'meow'\n\nimport pkg from '../../package.json'\nimport sharedFlags from '../sharedFlags'\nimport log from '../util/log'\n\nconst description = `Show the installed version of ${pkg.name}`\n\nconst help = `\nUsage\n $ ${pkg.binname} version\n\nOptions\n --major Show only the major version\n --minor Show only the minor version\n --patch Show only the patch version\n\nExamples\n $ ${pkg.binname} version\n ${pkg.name} version ${pkg.version}\n\n $ ${pkg.binname} version --major\n ${pkg.version.split('.')[0]}\n`\n\nconst flags = {\n ...sharedFlags,\n\n major: {\n type: 'boolean',\n default: false,\n },\n\n minor: {\n type: 'boolean',\n default: false,\n },\n\n patch: {\n type: 'boolean',\n default: false,\n },\n} as const\n\nfunction run({argv}: {argv: string[]}) {\n const cli = meow(help, {importMeta: import.meta, flags, argv, description})\n const versionParts = pkg.version.split('.')\n const versionNames = ['major', 'minor', 'patch']\n const versionFlags = versionNames.filter((flagName) => cli.flags[flagName])\n const versionFlag = versionFlags[0]\n const numVersionFlags = versionFlags.length\n\n if (numVersionFlags === 0) {\n log.msg(`${pkg.name} version ${pkg.version}`)\n return\n }\n\n if (numVersionFlags > 1) {\n throw new Error(\n `--major, --minor and --patch are mutually exclusive - only one can be used at a time`,\n )\n }\n\n const partIndex = versionNames.indexOf(versionFlag)\n log.msg(versionParts[partIndex])\n}\n\nexport default run\n"],"mappings":";;;AAMA,MAAM,cAAc,iCAAiCA,QAE/C,OAAO;;MAEPC,QAAY;;;;;;;;MAQZA,QAAY;IACdD,KAAS,WAAWE,QAAY;;MAE9BD,QAAY;IACF,QAAA,MAAM,GAAG,CAAC,CAAC,GAAG;GAGxB,QAAQ;CACZ,GAAGE;CAEH,OAAO;EACL,MAAM;EACN,SAAS;CACX;CAEA,OAAO;EACL,MAAM;EACN,SAAS;CACX;CAEA,OAAO;EACL,MAAM;EACN,SAAS;CACX;AACF;AAEA,SAAS,IAAI,EAAC,QAAyB;CACrC,IAAM,MAAM,KAAK,MAAM;EAAC,YAAY,OAAO;EAAM;EAAO;EAAM;CAAW,CAAC,GACpE,eAAA,QAA2B,MAAM,GAAG,GACpC,eAAe;EAAC;EAAS;EAAS;CAAO,GACzC,eAAe,aAAa,QAAQ,aAAa,IAAI,MAAM,SAAS,GACpE,cAAc,aAAa,IAC3B,kBAAkB,aAAa;CAErC,IAAI,oBAAoB,GAAG;EACzB,YAAI,IAAI,GAAGH,KAAS,WAAWE,SAAa;EAC5C;CACF;CAEA,IAAI,kBAAkB,GACpB,MAAU,MACR,sFACF;CAGF,IAAM,YAAY,aAAa,QAAQ,WAAW;CAClD,YAAI,IAAI,aAAa,UAAU;AACjC"}
1
+ {"version":3,"file":"version-DRt7fwK7.js","names":["pkg.name","pkg.binname","pkg.version","sharedFlags"],"sources":["../src/cmds/version.ts"],"sourcesContent":["import meow from 'meow'\n\nimport pkg from '../../package.json'\nimport sharedFlags from '../sharedFlags'\nimport log from '../util/log'\n\nconst description = `Show the installed version of ${pkg.name}`\n\nconst help = `\nUsage\n $ ${pkg.binname} version\n\nOptions\n --major Show only the major version\n --minor Show only the minor version\n --patch Show only the patch version\n\nExamples\n $ ${pkg.binname} version\n ${pkg.name} version ${pkg.version}\n\n $ ${pkg.binname} version --major\n ${pkg.version.split('.')[0]}\n`\n\nconst flags = {\n ...sharedFlags,\n\n major: {\n type: 'boolean',\n default: false,\n },\n\n minor: {\n type: 'boolean',\n default: false,\n },\n\n patch: {\n type: 'boolean',\n default: false,\n },\n} as const\n\nfunction run({argv}: {argv: string[]}) {\n const cli = meow(help, {importMeta: import.meta, flags, argv, description})\n const versionParts = pkg.version.split('.')\n const versionNames = ['major', 'minor', 'patch']\n const versionFlags = versionNames.filter((flagName) => cli.flags[flagName])\n const versionFlag = versionFlags[0]\n const numVersionFlags = versionFlags.length\n\n if (numVersionFlags === 0) {\n log.msg(`${pkg.name} version ${pkg.version}`)\n return\n }\n\n if (numVersionFlags > 1) {\n throw new Error(\n `--major, --minor and --patch are mutually exclusive - only one can be used at a time`,\n )\n }\n\n const partIndex = versionNames.indexOf(versionFlag)\n log.msg(versionParts[partIndex])\n}\n\nexport default run\n"],"mappings":";;;AAMA,MAAM,cAAc,iCAAiCA,QAE/C,OAAO;;MAEPC,QAAY;;;;;;;;MAQZA,QAAY;IACdD,KAAS,WAAWE,QAAY;;MAE9BD,QAAY;IACF,QAAA,MAAM,GAAG,CAAC,CAAC,GAAG;GAGxB,QAAQ;CACZ,GAAGE;CAEH,OAAO;EACL,MAAM;EACN,SAAS;CACX;CAEA,OAAO;EACL,MAAM;EACN,SAAS;CACX;CAEA,OAAO;EACL,MAAM;EACN,SAAS;CACX;AACF;AAEA,SAAS,IAAI,EAAC,QAAyB;CACrC,IAAM,MAAM,KAAK,MAAM;EAAC,YAAY,OAAO;EAAM;EAAO;EAAM;CAAW,CAAC,GACpE,eAAA,QAA2B,MAAM,GAAG,GACpC,eAAe;EAAC;EAAS;EAAS;CAAO,GACzC,eAAe,aAAa,QAAQ,aAAa,IAAI,MAAM,SAAS,GACpE,cAAc,aAAa,IAC3B,kBAAkB,aAAa;CAErC,IAAI,oBAAoB,GAAG;EACzB,YAAI,IAAI,GAAGH,KAAS,WAAWE,SAAa;EAC5C;CACF;CAEA,IAAI,kBAAkB,GACpB,MAAU,MACR,sFACF;CAGF,IAAM,YAAY,aAAa,QAAQ,WAAW;CAClD,YAAI,IAAI,aAAa,UAAU;AACjC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/plugin-kit",
3
- "version": "9.0.3",
3
+ "version": "10.0.0",
4
4
  "description": "Enhanced Sanity.io plugin development experience",
5
5
  "keywords": [
6
6
  "bootstrap",
@@ -40,44 +40,35 @@
40
40
  "dependencies": {
41
41
  "@rexxars/choosealicense-list": "^1.1.2",
42
42
  "@typescript/typescript6": "^6.0.2",
43
- "chalk": "^5.6.2",
44
- "concurrently": "^9.2.1",
45
- "email-validator": "^2.0.4",
46
- "execa": "^9.6.1",
47
- "get-it": "^9.2.0",
43
+ "concurrently": "^10.0.3",
44
+ "execa": "^10.0.0",
48
45
  "get-latest-version": "^6.0.1",
49
- "git-remote-origin-url": "^4.0.0",
50
- "github-url-to-object": "^4.0.6",
51
- "inquirer": "^12.9.6",
46
+ "inquirer": "^14.0.2",
52
47
  "meow": "^14.1.0",
53
48
  "nodemon": "3.1.14",
54
- "outdent": "^0.8.0",
55
- "p-props": "^6.1.0",
56
49
  "validate-npm-package-name": "^8.0.0",
57
- "xdg-basedir": "^5.1.0",
58
50
  "yalc": "1.0.0-pre.53"
59
51
  },
60
52
  "devDependencies": {
61
53
  "@sanity/pkg-utils": "^11.0.13",
62
54
  "@sanity/tsconfig": "^2.2.1",
63
55
  "@sanity/tsdown-config": "^0.19.6",
64
- "@types/github-url-to-object": "^4.0.4",
65
56
  "@types/node": "^24.13.3",
66
57
  "@types/react": "^19.2.17",
67
58
  "@types/validate-npm-package-name": "^4.0.2",
68
- "oxfmt": "^0.59.0",
59
+ "oxfmt": "^0.60.0",
69
60
  "oxlint": "^1.75.0",
70
61
  "oxlint-tsgolint": "^7.0.2001",
71
- "react": "^19.2.7",
72
- "react-dom": "^19.2.7",
73
- "sanity": "^6.5.0",
62
+ "react": "^19.2.8",
63
+ "react-dom": "^19.2.8",
64
+ "sanity": "^6.6.0",
74
65
  "styled-components": "^6.4.4",
75
66
  "tsdown": "^0.22.13",
76
67
  "typescript": "7.0.2"
77
68
  },
78
69
  "peerDependencies": {
79
70
  "@sanity/pkg-utils": "^11.0.13",
80
- "oxfmt": "^0.59.0",
71
+ "oxfmt": "^0.60.0",
81
72
  "oxlint": "^1.75.0"
82
73
  },
83
74
  "peerDependenciesMeta": {
@@ -89,7 +80,7 @@
89
80
  }
90
81
  },
91
82
  "engines": {
92
- "node": ">=20.19 <22 || >=22.12"
83
+ "node": ">=24"
93
84
  },
94
85
  "binname": "plugin-kit",
95
86
  "scripts": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"init-CybgPPvQ.js","names":[],"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 {findStudioConfig} from '../sanity/studio-detect'\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-oxlint Disables oxlint config and dependencies from being added\n --no-oxfmt Disables oxfmt 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 oxlint or oxfmt\n $ ${cliName} init --no-oxlint --no-oxfmt\n`\n\nasync function run({argv}: {argv: string[]}) {\n const cli = meow(help, {importMeta: import.meta, flags: initFlags, argv, description})\n const basePath = path.resolve(cli.input[0] || process.cwd())\n\n const {configFile} = await findStudioConfig(basePath)\n if (configFile) {\n throw new Error(\n `${configFile} 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"],"mappings":";;;;;;;AAIA,SAAS,iBAAiB;CACxB,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CACxB,WAAW,EAAI,CAAC,CAChB,YAAY,EAAK;AACtB;AAEA,SAAS,kBAAkB;CACzB,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CACzB,WAAW,EAAI,CAAC,CAChB,YAAY,EAAK;AACtB;AAEA,SAAS,gBAAgB;CACvB,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CACzB,WAAW,EAAI,CAAC,CAChB,YAAY,EAAK;AACtB;AAEA,eAAsB,0BAA0B;CAC9C,IAAM,CAAC,KAAK,MAAM,QAAQ,MAAM,QAAQ,IAAI;EAC1C,eAAe;EACf,gBAAgB;EAChB,cAAc;CAChB,CAAC,GAEK,UAAU;EAAC,OAAO;EAAO,QAAQ;EAAQ,QAAQ;CAAM,CAAC,CAAC,OAAO,OAAO;CAK7E,OAJI,QAAQ,SAAS,IACZ,QAAQ,MAAM,QAGhB,OAAO,wCAAwC;EACpD,SAAS,QAAQ,KAAK,WAAW;GAAC;GAAO,MAAM;EAAK,EAAE;EACtD,SAAS,QAAQ;CACnB,CAAC;AACH;AAEA,eAAsB,oBAAoB,IAAY,EAAC,OAAsB;CAE3E,IAAM,EAAC,aAAY,MADN,MAAM,IAAI,CAAC,SAAS,GAAG;EAAC;EAAK,OAAO;CAAS,CAC9B;CAC5B,OAAO,aAAa;AACtB;AC/BA,MAEM,OAAO;;MAEP,QAAQ;;;;;;;;;;;;;;;;;;;;EAoBZ,eAAe,EAAE,EAAE;;;;MAIf,QAAQ;;;MAGR,QAAQ;;;MAGR,QAAQ;;AAGd,eAAe,IAAI,EAAC,QAAyB;CAC3C,IAAM,MAAM,KAAK,MAAM;EAAC,YAAY,OAAO;EAAM,OAAO;EAAW;EAAM;CAAW,CAAC,GAC/E,WAAW,KAAK,QAAQ,IAAI,MAAM,MAAM,QAAQ,IAAI,CAAC,GAErD,EAAC,eAAc,MAAM,iBAAiB,QAAQ;CACpD,IAAI,YACF,MAAU,MACR,GAAG,WAAW,oEAChB;CAIF,IADA,YAAI,KAAK,qCAAmC,QAAQ,GAElD,CAAC,IAAI,MAAM,SACX,CAAE,MAAM,WAAW,QAAQ,KAC3B,CAAE,MAAM,OAAO,oCAAoC;EAAC,MAAM;EAAW,SAAS;CAAK,CAAC,GACpF;EACA,YAAI,MAAM,oCAAoC;EAC9C;CACF;CAIA,AAFA,MAAM,UAAU,QAAQ,GACxB,MAAM,KAAK;EAAC;EAAU,OAAO,IAAI;CAAK,CAAC,GACnC,IAAI,MAAM,UACR,MAAM,oBAAoB,MAAM,wBAAwB,GAAG,EAAC,KAAK,SAAQ,CAAC,IAC5E,YAAI,KAAK,OAAO,IAEhB,YAAI,MAAM,oEAAoE,IAGhF,YAAI,KAAK,kCAAkC;AAE/C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"link-watch-Dia6Auug.js","names":["pkg.binname","sharedFlags"],"sources":["../src/actions/link-watch.ts","../src/cmds/link-watch.ts"],"sourcesContent":["/*\nISC License (ISC)\nCopyright 2019 Johan Otterud\n\nPermission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted,\nprovided that the above copyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\nWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH\nTHE USE OR PERFORMANCE OF THIS SOFTWARE.\n*/\n\n/*\nThis code is a modified version of https://github.com/johot/yalc-watch,\nand the ISC License has been added for this file only, in accordance with the package.json license field in that package\n*/\n\nimport fs from 'fs'\nimport path from 'path'\n\nimport chalk from 'chalk'\nimport concurrently from 'concurrently'\nimport nodemon from 'nodemon'\nimport outdent from 'outdent'\n\nimport {defaultOutDir} from '../constants'\nimport {getPackage} from '../npm/package'\nimport {fileExists, mkdir} from '../util/files'\nimport {loadPackageConfig} from '../util/load-package-config'\nimport log from '../util/log'\n\ninterface YalcWatchConfig {\n command?: string\n extensions?: string\n}\n\ninterface PackageJson {\n sanityPlugin?: {linkWatch?: YalcWatchConfig}\n}\n\nexport async function linkWatch({basePath}: {basePath: string}) {\n const packageJson: PackageJson = JSON.parse(\n fs.readFileSync(path.join(basePath, 'package.json'), 'utf8'),\n )\n\n const packageConfig = await loadPackageConfig({basePath})\n const outDir = packageConfig?.dist ?? defaultOutDir\n\n const watch: Required<YalcWatchConfig> = {\n command: 'npm run watch',\n extensions: 'ts,js,png,svg,gif,jpeg,css',\n ...packageJson.sanityPlugin?.linkWatch,\n }\n\n // nodemon's bundled types require `script`, but exec-only settings are valid at runtime\n const nodemonSettings: Partial<Parameters<typeof nodemon>[0]> = {\n watch: [outDir],\n ext: watch.extensions,\n exec: 'yalc push --changed',\n //delay: 1000\n }\n nodemon(nodemonSettings as Parameters<typeof nodemon>[0])\n\n // ensure the folder exits so it can be watched\n const folder = path.join(basePath, outDir)\n if (!(await fileExists(folder))) {\n await mkdir(folder)\n }\n\n const pkg = await getPackage({basePath, validate: false})\n\n concurrently([watch.command])\n\n nodemon\n .on('start', function () {\n log.info(\n outdent`\n Watching ${outDir} for changes to files with extensions: ${watch.extensions}\n\n To test this package in Sanity Studio or another package, in a separate shell run:\n cd /path/to/sanity/studio-or-package\n\n Then, run one of the below commands, based on the package manager used in studio-or-package:\n\n ## yarn\n ${chalk.greenBright(`yalc add --link ${pkg.name} && yarn install`)}\n\n ## npm\n ${chalk.greenBright(`npx yalc add ${pkg.name} && npx yalc link ${pkg.name} && npm install`)}\n `.trimStart(),\n )\n })\n .on('quit', function () {\n process.exit()\n })\n .on('restart', function (files: any) {\n log.info('Found changes in files:', chalk.magentaBright(files))\n log.info('Pushing new yalc package...')\n })\n}\n","import path from 'path'\n\nimport meow from 'meow'\n\nimport pkg from '../../package.json'\nimport {linkWatch} from '../actions/link-watch'\nimport sharedFlags from '../sharedFlags'\n\nconst description = `Run the watch command and pushes any changes to yalc`\n\nconst help = `\nUsage\n $ ${pkg.binname} link-watch [<args>]\n\nOptions\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\nConfiguration\nTo override the default watch command configuration, provide an override in package.json under sanityPlugin:\n{\n \"sanityPlugin\": {\n \"watchCommand\": \"microbundle watch --format modern,esm,cjs --jsx React.createElement --jsxImportSource react --css inline\",\n \"linkWatch\": {\n \"command\": \"npm run watch\",\n \"extensions\": \"js,png,svg,gif,jpeg,css\"\n }\n }\n}\n\nExamples\n # Run the watch command and pushes any changes to yalc\n $ ${pkg.binname} link-watch\n`\n\nconst flags = {\n ...sharedFlags,\n watch: {\n type: 'boolean',\n default: false,\n },\n} as const\n\nfunction run({argv}: {argv: string[]}) {\n const cli = meow(help, {importMeta: import.meta, flags, argv, description})\n const basePath = path.resolve(cli.input[0] || process.cwd())\n return linkWatch({basePath})\n}\n\nexport default run\n"],"mappings":";;;;;;;;;;;;AA0CA,eAAsB,UAAU,EAAC,YAA+B;CAC9D,IAAM,cAA2B,KAAK,MACpC,GAAG,aAAa,KAAK,KAAK,UAAU,cAAc,GAAG,MAAM,CAC7D,GAGM,UAAS,MADa,kBAAkB,EAAC,SAAQ,CAAC,EAAA,EAC1B,QAAA,QAExB,QAAmC;EACvC,SAAS;EACT,YAAY;EACZ,GAAG,YAAY,cAAc;CAC/B;CASA,QAAQ;EALN,OAAO,CAAC,MAAM;EACd,KAAK,MAAM;EACX,MAAM;CAGc,CAAkC;CAGxD,IAAM,SAAS,KAAK,KAAK,UAAU,MAAM;CACzC,AAAM,MAAM,WAAW,MAAM,KAC3B,MAAM,MAAM,MAAM;CAGpB,IAAM,MAAM,MAAM,WAAW;EAAC;EAAU,UAAU;CAAK,CAAC;CAIxD,AAFA,aAAa,CAAC,MAAM,OAAO,CAAC,GAE5B,QACG,GAAG,SAAS,WAAY;EACvB,YAAI,KACF,OAAO;mBACI,OAAO,yCAAyC,MAAM,WAAW;;;;;;;;UAQ1E,MAAM,YAAY,mBAAmB,IAAI,KAAK,iBAAiB,EAAE;;;UAGjE,MAAM,YAAY,gBAAgB,IAAI,KAAK,oBAAoB,IAAI,KAAK,gBAAgB,EAAE;QAC5F,UAAU,CACZ;CACF,CAAC,CAAC,CACD,GAAG,QAAQ,WAAY;EACtB,QAAQ,KAAK;CACf,CAAC,CAAC,CACD,GAAG,WAAW,SAAU,OAAY;EAEnC,AADA,YAAI,KAAK,2BAA2B,MAAM,cAAc,KAAK,CAAC,GAC9D,YAAI,KAAK,6BAA6B;CACxC,CAAC;AACL;AC7FA,MAEM,OAAO;;MAEPA,QAAY;;;;;;;;;;;;;;;;;;;;;;MAsBZA,QAAY;GAGZ,QAAQ;CACZ,GAAGC;CACH,OAAO;EACL,MAAM;EACN,SAAS;CACX;AACF;AAEA,SAAS,IAAI,EAAC,QAAyB;CACrC,IAAM,MAAM,KAAK,MAAM;EAAC,YAAY,OAAO;EAAM;EAAO;EAAM;CAAW,CAAC;CAE1E,OAAO,UAAU,EAAC,UADD,KAAK,QAAQ,IAAI,MAAM,MAAM,QAAQ,IAAI,CACjC,EAAC,CAAC;AAC7B"}
@@ -1,31 +0,0 @@
1
- import chalk from "chalk";
2
- var sharedFlags_default = {
3
- debug: {
4
- default: !1,
5
- type: "boolean"
6
- },
7
- silent: {
8
- type: "boolean",
9
- default: !1
10
- },
11
- verbose: {
12
- type: "boolean",
13
- default: !1
14
- }
15
- };
16
- let beQuiet = !1, beVerbose = !1;
17
- function setVerbosity({ verbose, silent }) {
18
- silent ? (beVerbose = !1, beQuiet = !0) : verbose && (beVerbose = !0, beQuiet = !1);
19
- }
20
- var log_default = {
21
- setVerbosity,
22
- msg: (msg, ...args) => !beQuiet && console.log(msg, ...args),
23
- debug: (msg, ...args) => !beQuiet && beVerbose && console.debug(`${chalk.bgBlack.white("[debug]")} ${msg}`, ...args),
24
- success: (msg, ...args) => !beQuiet && console.info(`${chalk.bgBlack.greenBright("[success]")} ${msg}`, ...args),
25
- info: (msg, ...args) => !beQuiet && console.info(`${chalk.bgBlack.cyanBright("[info]")} ${msg}`, ...args),
26
- warn: (msg, ...args) => !beQuiet && console.warn(`${chalk.bgBlack.yellowBright("[warn]")} ${msg}`, ...args),
27
- error: (msg, ...args) => console.error(`${chalk.bgBlack.redBright("[error]")} ${msg}`, ...args)
28
- };
29
- export { sharedFlags_default as n, log_default as t };
30
-
31
- //# sourceMappingURL=log-DgQL-Rv9.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"log-DgQL-Rv9.js","names":[],"sources":["../src/sharedFlags.ts","../src/util/log.ts"],"sourcesContent":["export default {\n debug: {\n default: false,\n type: 'boolean',\n },\n silent: {\n type: 'boolean',\n default: false,\n },\n verbose: {\n type: 'boolean',\n default: false,\n },\n} as const\n","// Note: This is _specifically_ meant for CLI usage,\n// I realize that \"singletons\" are bad.\n\nimport chalk from 'chalk'\n\nlet beQuiet = false\nlet beVerbose = false\n\nfunction setVerbosity({verbose, silent}: {verbose: boolean; silent: boolean}) {\n if (silent) {\n beVerbose = false\n beQuiet = true\n } else if (verbose) {\n beVerbose = true\n beQuiet = false\n }\n}\n\nexport default {\n setVerbosity: setVerbosity,\n\n // Bypasses any checks, prints regardless (only use for things like `cli --version`)\n msg: (msg: any, ...args: any[]) => !beQuiet && console.log(msg, ...args),\n\n // Debug only printed on --verbose\n debug: (msg: any, ...args: any[]) =>\n !beQuiet && beVerbose && console.debug(`${chalk.bgBlack.white('[debug]')} ${msg}`, ...args),\n\n // Success messages only printed if not --silent\n success: (msg: any, ...args: any[]) =>\n !beQuiet && console.info(`${chalk.bgBlack.greenBright('[success]')} ${msg}`, ...args),\n\n // Info only printed if not --silent (\"standard\" level)\n info: (msg: any, ...args: any[]) =>\n !beQuiet && console.info(`${chalk.bgBlack.cyanBright('[info]')} ${msg}`, ...args),\n\n // Warning only printed if not --silent\n warn: (msg: any, ...args: any[]) =>\n !beQuiet && console.warn(`${chalk.bgBlack.yellowBright('[warn]')} ${msg}`, ...args),\n\n // Errors are always printed\n error: (msg: any, ...args: any[]) =>\n console.error(`${chalk.bgBlack.redBright('[error]')} ${msg}`, ...args),\n}\n"],"mappings":";AAAA,IAAA,sBAAe;CACb,OAAO;EACL,SAAS;EACT,MAAM;CACR;CACA,QAAQ;EACN,MAAM;EACN,SAAS;CACX;CACA,SAAS;EACP,MAAM;EACN,SAAS;CACX;AACF;ACRA,IAAI,UAAU,IACV,YAAY;AAEhB,SAAS,aAAa,EAAC,SAAS,UAA8C;CAC5E,AAAI,UACF,YAAY,IACZ,UAAU,MACD,YACT,YAAY,IACZ,UAAU;AAEd;AAEA,IAAA,cAAe;CACC;CAGd,MAAM,KAAU,GAAG,SAAgB,CAAC,WAAW,QAAQ,IAAI,KAAK,GAAG,IAAI;CAGvE,QAAQ,KAAU,GAAG,SACnB,CAAC,WAAW,aAAa,QAAQ,MAAM,GAAG,MAAM,QAAQ,MAAM,SAAS,EAAE,GAAG,OAAO,GAAG,IAAI;CAG5F,UAAU,KAAU,GAAG,SACrB,CAAC,WAAW,QAAQ,KAAK,GAAG,MAAM,QAAQ,YAAY,WAAW,EAAE,GAAG,OAAO,GAAG,IAAI;CAGtF,OAAO,KAAU,GAAG,SAClB,CAAC,WAAW,QAAQ,KAAK,GAAG,MAAM,QAAQ,WAAW,QAAQ,EAAE,GAAG,OAAO,GAAG,IAAI;CAGlF,OAAO,KAAU,GAAG,SAClB,CAAC,WAAW,QAAQ,KAAK,GAAG,MAAM,QAAQ,aAAa,QAAQ,EAAE,GAAG,OAAO,GAAG,IAAI;CAGpF,QAAQ,KAAU,GAAG,SACnB,QAAQ,MAAM,GAAG,MAAM,QAAQ,UAAU,SAAS,EAAE,GAAG,OAAO,GAAG,IAAI;AACzE"}
@@ -1,4 +0,0 @@
1
- var name = "@sanity/plugin-kit", version = "9.0.3", binname = "plugin-kit";
2
- export { name as n, version as r, binname as t };
3
-
4
- //# sourceMappingURL=package-CAhVfclg.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-CAhVfclg.js","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}