@sanity/plugin-kit 5.0.3 → 6.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.
package/README.md CHANGED
@@ -124,13 +124,13 @@ Verify that the plugin package is configured correctly by running:
124
124
 
125
125
  - Check package.json for:
126
126
  - recommended script commands
127
- - recommended cjs and esm configuration
127
+ - ESM-only configuration (bans CJS `main`/`module` fields and `require` export conditions)
128
128
  - sanity dependency compatibility
129
129
  - @sanity/pkg-utils devDependency
130
130
  - recommended usage of devDependencies/peerDependencies/dependencies for certain packages
131
131
  - Check for redundant v2 config:
132
132
  - babel
133
- - sanity.json
133
+ - the deprecated `@sanity/incompatible-plugin` v2 compatibility shim (`sanity.json` + `v2-incompatible.js`)
134
134
  - Check for sanity imports that has changed in v3, using eslint
135
135
  - Check tsconfig.json settings
136
136
  - Check for [SPDX](https://spdx.org/licenses/) compatible license definition
@@ -206,7 +206,6 @@ The inject command can do more work by adding presets. Consult the individual pr
206
206
  - [semver-workflow](./docs/semver-workflow.md) - Add an opinionated Github workflow to automate NPM releases
207
207
  - [renovatebot](./docs/renovatebot.md) - Add opinionated Renovatebot config to make dependency management a breeze
208
208
  - [ui](./docs/ui.md) - Add [@sanity/ui](https://github.com/sanity-io/ui) to build plugin UIs.
209
- - [ui-workshop](./docs/ui-workshop.md) - Add [@sanity/ui-workshop](https://github.com/sanity-io/ui-workshop) to make component testing a breeze
210
209
 
211
210
  ## Testing a plugin in Sanity Studio
212
211
 
@@ -422,25 +421,35 @@ Provide a sanityPlugin config in package.json (defaults shown):
422
421
  "linkWatch": {
423
422
  "command": "npm run watch",
424
423
  "extensions": "js,png,svg,gif,jpeg,css"
424
+ },
425
+ "verifyPackage": {
426
+ "packageName": true,
427
+ "esmOnly": true,
428
+ "tsconfig": true,
429
+ "tsc": true,
430
+ "dependencies": true,
431
+ "deprecatedDependencies": true,
432
+ "babelConfig": true,
433
+ "incompatiblePlugin": true,
434
+ "eslintImports": true,
435
+ "scripts": true,
436
+ "pkg-utils": true,
437
+ "nodeEngine": true,
438
+ "studioConfig": true,
439
+ "srcIndex": true,
440
+ "bannedFiles": true,
441
+ "duplicateConfig": true
425
442
  }
426
- },
427
- "verifyPackage": {
428
- "packageName": true,
429
- "module": true,
430
- "tsconfig": true,
431
- "tsc": true,
432
- "dependencies": true,
433
- "rollupConfig": true,
434
- "babelConfig": true,
435
- "sanityV2Json": true,
436
- "eslintImports": true,
437
- "scripts": true,
438
- "pkg-utils": true,
439
- "nodeEngine": true
440
443
  }
441
444
  }
442
445
  ```
443
446
 
447
+ Set `esmOnly` to `false` to allow CommonJS interop (a `require` export condition, or top-level
448
+ `main`/`module` fields). This is discouraged: plugins target Sanity Studio v5+, which is pure ESM, and
449
+ shipping a parallel CJS build can have unintended side-effects. The supported Node.js versions handle
450
+ `require(esm)`, so a single published format keeps two copies of the plugin's code out of the module
451
+ tree, avoiding bundle bloat and slower builds.
452
+
444
453
  ## License
445
454
 
446
455
  MIT © [Espen Hovlandsdal](https://espen.codes/) and [Sanity.io](https://www.sanity.io/)
@@ -9,8 +9,7 @@ import chalk from "chalk";
9
9
  import { execSync } from "child_process";
10
10
  import { validate } from "email-validator";
11
11
  import xdgBasedir from "xdg-basedir";
12
- import { getIt } from "get-it";
13
- import { promise, jsonRequest, jsonResponse, httpErrors, headers } from "get-it/middleware";
12
+ import { createRequester } from "get-it";
14
13
  import { pkg } from "./package2.js";
15
14
  function defaultSourceJs(pkg2) {
16
15
  return outdent`
@@ -284,9 +283,9 @@ function tsconfigTemplateSettings(options) {
284
283
  const renovatePreset = {
285
284
  name: "renovatebot",
286
285
  description: "Files to enable renovatebot.",
287
- apply: applyPreset$3
286
+ apply: applyPreset$2
288
287
  };
289
- async function applyPreset$3(options) {
288
+ async function applyPreset$2(options) {
290
289
  await writeAssets(
291
290
  [
292
291
  {
@@ -348,7 +347,8 @@ function developTestSnippet() {
348
347
  function getLicenseText(licenseId, user) {
349
348
  if (!licenseId)
350
349
  return "";
351
- let licenseName = licenses.find(licenseId).title;
350
+ const license = licenses.find(licenseId);
351
+ let licenseName = license ? license.title : void 0;
352
352
  licenseName = licenseName?.replace(/\s+license$/i, "");
353
353
  let licenseText = `## License
354
354
  `;
@@ -366,13 +366,10 @@ function isDefaultGitHubReadme(readme) {
366
366
  `, 20).filter(Boolean);
367
367
  return lines.length <= 2 && lines[0].startsWith("#");
368
368
  }
369
- const request = getIt([
370
- promise({ onlyBody: !0 }),
371
- jsonRequest(),
372
- jsonResponse(),
373
- httpErrors(),
374
- headers({ "User-Agent": `${pkg.name}@${pkg.version}` })
375
- ]);
369
+ const requester = createRequester({
370
+ headers: { "User-Agent": `${pkg.name}@${pkg.version}` },
371
+ as: "json"
372
+ });
376
373
  async function getUserInfo({ requireUserConfirmation, flags }, pkg2) {
377
374
  const userInfo = getPackageUserInfo({ author: flags.author ?? pkg2?.author }) || await getSanityUserInfo() || await getGitUserInfo();
378
375
  return requireUserConfirmation ? promptForInfo(userInfo) : userInfo;
@@ -407,8 +404,9 @@ async function getSanityUserInfo() {
407
404
  ))?.authToken;
408
405
  if (!token)
409
406
  return;
410
- const user = await request({
407
+ const { body: user } = await requester({
411
408
  url: "https://api.sanity.io/v1/users/me",
409
+ as: "json",
412
410
  headers: { Authorization: `Bearer ${token}` }
413
411
  });
414
412
  if (!user)
@@ -439,16 +437,16 @@ function validOrEmptyEmail(value) {
439
437
  const semverWorkflowPreset = {
440
438
  name: "semver-workflow",
441
439
  description: "Files and dependencies for conventional-commits, github workflow and semantic-release.",
442
- apply: applyPreset$2
440
+ apply: applyPreset$1
443
441
  }, info = (write, msg, ...args) => write && log.info(msg, ...args);
444
- async function applyPreset$2(options) {
445
- await writeAssets(semverWorkflowFiles(), options), await addPrepareScript(options), await addDevDependencies$2(options), await updateReadme(options);
442
+ async function applyPreset$1(options) {
443
+ await writeAssets(semverWorkflowFiles(), options), await addPrepareScript(options), await addDevDependencies$1(options), await updateReadme(options);
446
444
  }
447
445
  async function addPrepareScript(options) {
448
446
  const pkg2 = await getPackage(options), didWrite = await addPackageJsonScripts(pkg2, options, (scripts) => (scripts.prepare = addScript("husky", scripts.prepare), scripts));
449
447
  info(didWrite, "Added prepare script to package.json");
450
448
  }
451
- async function addDevDependencies$2(options) {
449
+ async function addDevDependencies$1(options) {
452
450
  const pkg2 = await getPackage(options), devDeps = sortKeys({
453
451
  ...pkg2.devDependencies,
454
452
  ...await semverWorkflowDependencies()
@@ -534,10 +532,10 @@ function readmeBaseurl(pkg2) {
534
532
  const ui = {
535
533
  name: "ui",
536
534
  description: "`@sanity/ui` and dependencies",
537
- apply: applyPreset$1
535
+ apply: applyPreset
538
536
  };
539
- async function applyPreset$1(options) {
540
- await addDependencies(options), await addDevDependencies$1(options), log.info(chalk.green("ui preset injected"));
537
+ async function applyPreset(options) {
538
+ await addDependencies(options), await addDevDependencies(options), log.info(chalk.green("ui preset injected"));
541
539
  }
542
540
  async function addDependencies(options) {
543
541
  const pkg2 = await getPackage(options), newDeps = sortKeys(
@@ -551,7 +549,7 @@ async function addDependencies(options) {
551
549
  ), newPkg = { ...pkg2 };
552
550
  newPkg.dependencies = newDeps, await writePackageJsonDirect(newPkg, options), log.info("Updated dependencies.");
553
551
  }
554
- async function addDevDependencies$1(options) {
552
+ async function addDevDependencies(options) {
555
553
  const pkg2 = await getPackage(options), newDeps = sortKeys(
556
554
  forceDependencyVersions(
557
555
  {
@@ -574,69 +572,7 @@ async function resolveDevDependencyList() {
574
572
  "styled-components"
575
573
  ]);
576
574
  }
577
- const uiWorkshop = {
578
- name: "ui-workshop",
579
- description: "Files for testing custom components with @sanity/ui-workshop",
580
- apply: applyPreset
581
- };
582
- async function applyPreset(options) {
583
- await writeAssets(files(), options), await addDevDependencies(options), await updateGitIgnore(options), log.info(
584
- chalk.green(
585
- outdent`
586
- ui-workshop preset injected.
587
-
588
- Please confer
589
- https://github.com/sanity-io/plugin-kit/blob/main/docs/ui-workshop.md#manual-steps-after-inject
590
- to finalize configuration for this preset.
591
- `.trim()
592
- )
593
- );
594
- }
595
- function files() {
596
- return [
597
- { type: "copy", from: ["workshop.config.ts"], to: ["workshop.config.ts"] },
598
- { type: "copy", from: ["src", "CustomField.tsx"], to: ["src", "CustomField.tsx"] },
599
- {
600
- type: "copy",
601
- from: ["src", "__workshop__", "index.tsx"],
602
- to: ["src", "__workshop__", "index.tsx"]
603
- },
604
- {
605
- type: "copy",
606
- from: ["src", "__workshop__", "props.tsx"],
607
- to: ["src", "__workshop__", "props.tsx"]
608
- }
609
- ].map((fromTo) => fromTo.type === "copy" ? {
610
- ...fromTo,
611
- from: ["ui-workshop", ...fromTo.from]
612
- } : fromTo);
613
- }
614
- async function updateGitIgnore(options) {
615
- const { basePath } = options, gitignorePath = path.join(basePath, ".gitignore");
616
- let gitignore = await readFile(gitignorePath, "utf8").catch(errorToUndefined) ?? "";
617
- const value = ".workshop";
618
- gitignore.includes(value) || (gitignore += `
619
-
620
- ${value}`, await writeFile(gitignorePath, gitignore, { encoding: "utf8" }));
621
- }
622
- async function addDevDependencies(options) {
623
- const pkg2 = await getPackage(options), devDeps = sortKeys({
624
- ...pkg2.devDependencies,
625
- ...await devDependencies()
626
- }), newPkg = { ...pkg2 };
627
- newPkg.devDependencies = devDeps, await writePackageJsonDirect(newPkg, options), log.info("Updated devDependencies.");
628
- }
629
- async function devDependencies() {
630
- return resolveLatestVersions([
631
- "@sanity/ui-workshop",
632
- "@sanity/icons",
633
- "@sanity/ui",
634
- "react",
635
- "react-dom",
636
- "styled-components"
637
- ]);
638
- }
639
- const presets = [semverWorkflowPreset, renovatePreset, ui, uiWorkshop], presetNames = presets.map((p) => p?.name);
575
+ const presets = [semverWorkflowPreset, renovatePreset, ui], presetNames = presets.map((p) => p?.name);
640
576
  function presetHelpList(padStart) {
641
577
  return presets.map((p) => `${"".padStart(padStart)}${p.name.padEnd(20)}${p.description}`).join(`
642
578
  `);
@@ -715,7 +651,7 @@ async function getLicense(flags, {
715
651
  const license = await getLicenseIdentifier(flags, pkg2, requireUserConfirmation);
716
652
  if (!license)
717
653
  return;
718
- const text = license.body.replace(/\[fullname\]/g, user?.name).replace(/\[project\]/g, pluginName).replace(/\[year\]/g, (/* @__PURE__ */ new Date()).getFullYear());
654
+ const text = license.body.replace(/\[fullname\]/g, user?.name ?? "").replace(/\[project\]/g, pluginName ?? "").replace(/\[year\]/g, String((/* @__PURE__ */ new Date()).getFullYear()));
719
655
  return { id: license.id, text };
720
656
  }
721
657
  async function getLicenseIdentifier(flags, pkg2, requireUserConfirmation = !1) {
@@ -784,12 +720,10 @@ async function writeAssets(injectables, { basePath, flags }) {
784
720
  return writes;
785
721
  }
786
722
  async function writeStaticAssets(options) {
787
- const { outDir, flags } = options, files2 = [
723
+ const { outDir, flags } = options, files = [
788
724
  flags.eslint && eslintrcTemplate({ flags: options.flags }),
789
725
  flags.eslint && eslintignoreTemplate({ outDir, flags: options.flags }),
790
726
  { type: "copy", from: "editorconfig", to: ".editorconfig" },
791
- { type: "copy", from: "sanity.json", to: "sanity.json" },
792
- { type: "copy", from: "v2-incompatible.js.template", to: "v2-incompatible.js" },
793
727
  pkgConfigTemplate({ outDir, flags: options.flags }),
794
728
  flags.gitignore && gitignoreTemplate(),
795
729
  flags.typescript && tsconfigTemplate({ flags: options.flags }),
@@ -798,7 +732,7 @@ async function writeStaticAssets(options) {
798
732
  flags.prettier && prettierignoreTemplate({ outDir }),
799
733
  flags.prettier && { type: "copy", from: "prettierrc.json", to: ".prettierrc" }
800
734
  ].map((f) => f || void 0).filter((f) => !!f);
801
- return writeAssets(files2, options);
735
+ return writeAssets(files, options);
802
736
  }
803
737
  function asArray(input) {
804
738
  return typeof input == "string" ? [input] : input;
@@ -883,13 +817,13 @@ const initFlags = {
883
817
  }
884
818
  };
885
819
  async function init(options) {
886
- let dependencies = {}, devDependencies2 = {}, peerDependencies = {};
820
+ let dependencies = {}, devDependencies = {}, peerDependencies = {};
887
821
  await inject({
888
822
  ...options,
889
823
  outDir: defaultOutDir,
890
824
  requireUserConfirmation: !options.flags.force,
891
825
  dependencies,
892
- devDependencies: devDependencies2,
826
+ devDependencies,
893
827
  peerDependencies,
894
828
  validate: !1
895
829
  });
@@ -1 +1 @@
1
- {"version":3,"file":"init2.js","sources":["../../src/configs/default-source.ts","../../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/util/readme.ts","../../src/util/request.ts","../../src/util/user.ts","../../src/presets/semver-workflow.ts","../../src/presets/ui.ts","../../src/presets/ui-workshop.ts","../../src/presets/presets.ts","../../src/actions/inject.ts","../../src/actions/init.ts"],"sourcesContent":["import outdent from 'outdent'\n\nimport type {PackageJson} from '../actions/verify/types'\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 // eslint-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 // eslint-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 {InitFlags} from '../actions/init'\nimport type {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 type {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 type {InitFlags} from '../actions/init'\nimport type {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 type {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 type {InitFlags} from '../actions/init'\nimport type {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 {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","// @ts-expect-error missing types\nimport licenses from '@rexxars/choosealicense-list'\nimport outdent from 'outdent'\n\nimport type {PackageData} from '../actions/inject'\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/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 {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 type {InjectOptions} from '../actions/inject'\nimport type {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","import path from 'path'\n\nimport chalk from 'chalk'\nimport outdent from 'outdent'\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 {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 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","import chalk from 'chalk'\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(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 {type Injectable, type 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 type {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 type {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 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 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","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 eslint: {\n type: 'boolean',\n default: true,\n },\n typescript: {\n type: 'boolean',\n default: true,\n },\n prettier: {\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"],"names":["pkg","outdent","applyPreset","isValidEmail","addDevDependencies","info","files","devDependencies"],"mappings":"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"}
1
+ {"version":3,"file":"init2.js","sources":["../../src/configs/default-source.ts","../../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/util/readme.ts","../../src/util/request.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"],"sourcesContent":["import outdent from 'outdent'\n\nimport type {PackageJson} from '../actions/verify/types'\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 // eslint-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 // eslint-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 {InitFlags} from '../actions/init'\nimport type {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 type {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 type {InitFlags} from '../actions/init'\nimport type {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 type {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 type {InitFlags} from '../actions/init'\nimport type {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 {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","import licenses from '@rexxars/choosealicense-list'\nimport outdent from 'outdent'\n\nimport type {PackageData} from '../actions/inject'\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/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 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","import {createRequester} from 'get-it'\n\nimport pkg from '../../package.json'\n\nexport const requester = createRequester({\n headers: {'User-Agent': `${pkg.name}@${pkg.version}`},\n as: 'json',\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 type {InjectOptions} from '../actions/inject'\nimport type {PackageJson} from '../actions/verify/types'\nimport {readJsonFile} from './files'\nimport {prompt} from './prompt'\nimport {requester} 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 {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 path from 'path'\n\nimport chalk from 'chalk'\nimport outdent from 'outdent'\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 {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 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","import chalk from 'chalk'\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(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 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 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 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 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, 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.eslint && eslintrcTemplate({flags: options.flags}),\n flags.eslint && eslintignoreTemplate({outDir, 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.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","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 eslint: {\n type: 'boolean',\n default: true,\n },\n typescript: {\n type: 'boolean',\n default: true,\n },\n prettier: {\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"],"names":["pkg","outdent","applyPreset","isValidEmail","addDevDependencies","info"],"mappings":"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"}