@sanity/plugin-kit 3.1.12 → 4.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 (61) hide show
  1. package/assets/inject/semver-workflow/.github/workflows/main.yml +6 -6
  2. package/dist/_chunks-cjs/cli.js +135 -0
  3. package/dist/_chunks-cjs/cli.js.map +1 -0
  4. package/dist/_chunks-cjs/init.js +894 -0
  5. package/dist/_chunks-cjs/init.js.map +1 -0
  6. package/dist/_chunks-cjs/init2.js +83 -0
  7. package/dist/_chunks-cjs/init2.js.map +1 -0
  8. package/dist/_chunks-cjs/inject.js +54 -0
  9. package/dist/_chunks-cjs/inject.js.map +1 -0
  10. package/dist/_chunks-cjs/link-watch.js +84 -0
  11. package/dist/_chunks-cjs/link-watch.js.map +1 -0
  12. package/dist/_chunks-cjs/package.js +1808 -0
  13. package/dist/_chunks-cjs/package.js.map +1 -0
  14. package/dist/_chunks-cjs/package2.js +143 -0
  15. package/dist/_chunks-cjs/package2.js.map +1 -0
  16. package/dist/_chunks-cjs/ts.js +162 -0
  17. package/dist/_chunks-cjs/ts.js.map +1 -0
  18. package/dist/_chunks-cjs/verify-package.js +75 -0
  19. package/dist/_chunks-cjs/verify-package.js.map +1 -0
  20. package/dist/_chunks-cjs/verify-studio.js +57 -0
  21. package/dist/_chunks-cjs/verify-studio.js.map +1 -0
  22. package/dist/_chunks-cjs/version.js +51 -0
  23. package/dist/_chunks-cjs/version.js.map +1 -0
  24. package/dist/cli.d.ts +4 -0
  25. package/dist/cli.js +4 -7
  26. package/dist/cli.js.map +1 -1
  27. package/dist/index.js +1 -1
  28. package/package.json +57 -59
  29. package/src/actions/inject.ts +1 -1
  30. package/src/actions/verify/types.ts +0 -1
  31. package/src/actions/verify/validations.ts +13 -69
  32. package/src/actions/verify/verify-common.ts +0 -1
  33. package/src/actions/verify-package.ts +0 -2
  34. package/src/cli.ts +1 -0
  35. package/src/configs/forced-package-versions.ts +0 -1
  36. package/src/configs/pkg-config.ts +0 -1
  37. package/src/configs/tsconfig.ts +20 -21
  38. package/src/npm/package.ts +6 -17
  39. package/src/presets/ui.ts +0 -1
  40. package/dist/_chunks/cli-cFLCCBOO.js +0 -168
  41. package/dist/_chunks/cli-cFLCCBOO.js.map +0 -1
  42. package/dist/_chunks/init-RizSz7N7.js +0 -104
  43. package/dist/_chunks/init-RizSz7N7.js.map +0 -1
  44. package/dist/_chunks/init-iwJScjA2.js +0 -966
  45. package/dist/_chunks/init-iwJScjA2.js.map +0 -1
  46. package/dist/_chunks/inject-p1N6jT0L.js +0 -49
  47. package/dist/_chunks/inject-p1N6jT0L.js.map +0 -1
  48. package/dist/_chunks/link-watch-hESx--O4.js +0 -91
  49. package/dist/_chunks/link-watch-hESx--O4.js.map +0 -1
  50. package/dist/_chunks/package-LD2bWiQM.js +0 -2358
  51. package/dist/_chunks/package-LD2bWiQM.js.map +0 -1
  52. package/dist/_chunks/package-hEMm6olE.js +0 -155
  53. package/dist/_chunks/package-hEMm6olE.js.map +0 -1
  54. package/dist/_chunks/ts--PkJtFoh.js +0 -165
  55. package/dist/_chunks/ts--PkJtFoh.js.map +0 -1
  56. package/dist/_chunks/verify-package-88yI8VXr.js +0 -97
  57. package/dist/_chunks/verify-package-88yI8VXr.js.map +0 -1
  58. package/dist/_chunks/verify-studio-t8s7BSdb.js +0 -74
  59. package/dist/_chunks/verify-studio-t8s7BSdb.js.map +0 -1
  60. package/dist/_chunks/version-UQqnNiud.js +0 -54
  61. package/dist/_chunks/version-UQqnNiud.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sources":["../../src/util/request.ts","../../src/util/user.ts","../../src/util/readme.ts","../../src/presets/semver-workflow.ts","../../src/presets/renovatebot.ts","../../src/presets/ui.ts","../../src/presets/ui-workshop.ts","../../src/presets/presets.ts","../../src/configs/tsconfig.ts","../../src/configs/pkg-config.ts","../../src/configs/git.ts","../../src/configs/eslint.ts","../../src/configs/prettier.ts","../../src/actions/inject.ts","../../src/configs/default-source.ts","../../src/actions/init.ts"],"sourcesContent":["import {getIt} from 'get-it'\nimport {jsonRequest, jsonResponse, httpErrors, headers, promise} from 'get-it/middleware'\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 path from 'path'\nimport xdgBasedir from 'xdg-basedir'\nimport {getGitUserInfo as _getGitUserInfo} from 'git-user-info'\nimport {validate as isValidEmail} from 'email-validator'\nimport {readJsonFile} from './files'\nimport {request} from './request'\nimport {prompt} from './prompt'\nimport {InjectOptions} from '../actions/inject'\nimport {PackageJson} from '../actions/verify/types'\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()) as User | undefined)\n if (requireUserConfirmation) {\n return promptForInfo(userInfo)\n }\n\n return userInfo\n}\n\nexport function 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 (err) {\n return undefined\n }\n}\n\nasync function getGitUserInfo(): Promise<User | undefined> {\n const user = await _getGitUserInfo()\n return user ? {name: user.name, email: user.email} : undefined\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 outdent from 'outdent'\n// @ts-expect-error missing types\nimport licenses from '@rexxars/choosealicense-list'\nimport {PackageData} from '../actions/inject'\nimport {User} from './user'\n\nexport function generateReadme(data: PackageData) {\n const {user, pluginName, license, description} = data\n\n return (\n outdent`\n # ${pluginName}\n\n ${v3BannerNotice()}\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 v3BannerNotice() {\n return `> This is a **Sanity Studio v3** plugin.`\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 {Injectable, InjectOptions, writeAssets} from '../actions/inject'\nimport {resolveLatestVersions} from '../npm/resolveLatestVersions'\nimport {Preset} from './presets'\nimport {\n addPackageJsonScripts,\n addScript,\n getPackage,\n sortKeys,\n writePackageJsonDirect,\n} from '../npm/package'\nimport log from '../util/log'\nimport outdent from 'outdent'\nimport chalk from 'chalk'\nimport path from 'path'\nimport {readFile, writeFile} from '../util/files'\nimport {errorToUndefined} from '../util/errorToUndefined'\nimport {PackageJson} from '../actions/verify/types'\nimport {\n developTestSnippet,\n getLicenseText,\n installationSnippet,\n v3BannerNotice,\n} from '../util/readme'\nimport {getUserInfo} from '../util/user'\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 install`, 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 {v3Banner, install, usage, developTest, license, releaseSnippet} =\n await readmeSnippets(options)\n\n const prependSections = missingSections(readme, [v3Banner, 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 v3Banner: v3BannerNotice(),\n install,\n usage,\n license,\n developTest: developTestSnippet(),\n releaseSnippet,\n }\n}\n\n/**\n * Returns sections that does not exists \"close enough\" in readme\n */\nexport function missingSections(readme: string, sections: string[]) {\n return sections.filter((section) => !closeEnough(section, readme))\n}\n\n/**\n * a and b are considered \"close enough\" if > 50% of a lines exist in b lines\n * @param a\n * @param b\n */\nfunction closeEnough(a: string, b: string) {\n const aLines = a.split('\\n')\n const bLines = b.split('\\n')\n\n const matchingLines = aLines.filter((line) => bLines.find((bLine) => bLine === line)).length\n const isCloseEnough = matchingLines >= aLines.length * 0.5\n return isCloseEnough\n}\n\nfunction semverWorkflowFiles(): Injectable[] {\n const base: Injectable[] = [\n {\n type: 'copy',\n from: ['.github', 'workflows', 'main.yml'],\n to: ['.github', 'workflows', 'main.yml'],\n },\n {type: 'copy', from: ['.husky', 'commit-msg'], to: ['.husky', 'commit-msg']},\n {type: 'copy', from: ['.husky', 'pre-commit'], to: ['.husky', 'pre-commit']},\n {type: 'copy', from: ['.releaserc.json'], to: '.releaserc.json'},\n {type: 'copy', from: ['commitlint.template.js'], to: 'commitlint.config.js'},\n {type: 'copy', from: ['lint-staged.template.js'], to: 'lint-staged.config.js'},\n ]\n\n return base.map((fromTo) => {\n if (fromTo.type === 'copy') {\n return {\n ...fromTo,\n from: ['semver-workflow', ...fromTo.from],\n }\n }\n\n return fromTo\n })\n}\n\nasync function semverWorkflowDependencies(): Promise<Record<string, string>> {\n return resolveLatestVersions([\n '@commitlint/cli',\n '@commitlint/config-conventional',\n '@sanity/semantic-release-preset',\n 'husky',\n 'lint-staged',\n ])\n}\n\nexport function readmeBaseurl(pkg: PackageJson) {\n return ((pkg.repository?.url ?? pkg.homepage ?? 'TODO') as string)\n .replace(/.+:\\/\\//g, 'https://')\n .replace(/\\.git/g, '')\n .replace(/git@github.com\\//g, 'github.com/')\n .replace(/git@github.com:/g, 'https://github.com/')\n .replace(/#.+/g, '')\n}\n","import {Preset} from './presets'\nimport {InjectOptions, writeAssets} from '../actions/inject'\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 {Preset} from './presets'\nimport {InjectOptions} from '../actions/inject'\nimport {forceDependencyVersions, getPackage, sortKeys, writePackageJsonDirect} from '../npm/package'\nimport log from '../util/log'\nimport chalk from 'chalk'\nimport {resolveLatestVersions} from '../npm/resolveLatestVersions'\nimport {forcedDevPackageVersions, forcedPackageVersions} from '../configs/forced-package-versions'\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 {Preset} from './presets'\nimport {Injectable, InjectOptions, writeAssets} from '../actions/inject'\nimport {getPackage, sortKeys, writePackageJsonDirect} from '../npm/package'\nimport log from '../util/log'\nimport chalk from 'chalk'\nimport outdent from 'outdent'\nimport {resolveLatestVersions} from '../npm/resolveLatestVersions'\nimport path from 'path'\nimport {readFile, writeFile} from '../util/files'\nimport {errorToUndefined} from '../util/errorToUndefined'\n\nexport const uiWorkshop: Preset = {\n name: 'ui-workshop',\n description: 'Files for testing custom components with @sanity/ui-workshop',\n apply: applyPreset,\n}\n\nasync function applyPreset(options: InjectOptions) {\n await writeAssets(files(), options)\n await addDevDependencies(options)\n await updateGitIgnore(options)\n log.info(\n chalk.green(\n outdent`\n ui-workshop preset injected.\n\n Please confer\n https://github.com/sanity-io/plugin-kit/blob/main/docs/ui-workshop.md#manual-steps-after-inject\n to finalize configuration for this preset.\n `.trim(),\n ),\n )\n}\n\nfunction files(): Injectable[] {\n const base: Injectable[] = [\n {type: 'copy', from: ['workshop.config.ts'], to: ['workshop.config.ts']},\n {type: 'copy', from: ['src', 'CustomField.tsx'], to: ['src', 'CustomField.tsx']},\n {\n type: 'copy',\n from: ['src', '__workshop__', 'index.tsx'],\n to: ['src', '__workshop__', 'index.tsx'],\n },\n {\n type: 'copy',\n from: ['src', '__workshop__', 'props.tsx'],\n to: ['src', '__workshop__', 'props.tsx'],\n },\n ]\n\n return base.map((fromTo) => {\n if (fromTo.type === 'copy') {\n return {\n ...fromTo,\n from: ['ui-workshop', ...fromTo.from],\n }\n }\n\n return fromTo\n })\n}\n\nasync function updateGitIgnore(options: InjectOptions) {\n const {basePath} = options\n const gitignorePath = path.join(basePath, '.gitignore')\n let gitignore = (await readFile(gitignorePath, 'utf8').catch(errorToUndefined)) ?? ''\n const value = '.workshop'\n if (gitignore.includes(value)) {\n return\n }\n\n gitignore += `\\n\\n${value}`\n await writeFile(gitignorePath, gitignore, {encoding: 'utf8'})\n}\n\nasync function addDevDependencies(options: InjectOptions) {\n const pkg = await getPackage(options)\n const devDeps = sortKeys({\n ...pkg.devDependencies,\n ...(await devDependencies()),\n })\n const newPkg = {...pkg}\n newPkg.devDependencies = devDeps\n await writePackageJsonDirect(newPkg, options)\n log.info('Updated devDependencies.')\n}\n\nasync function devDependencies(): Promise<Record<string, string>> {\n return resolveLatestVersions([\n '@sanity/ui-workshop',\n '@sanity/icons',\n '@sanity/ui',\n 'react',\n 'react-dom',\n 'styled-components',\n ])\n}\n","import {InjectOptions} from '../actions/inject'\nimport {semverWorkflowPreset} from './semver-workflow'\nimport {renovatePreset} from './renovatebot'\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 {outdent} from 'outdent'\nimport {InjectTemplate} from '../actions/inject'\nimport {InitFlags} from '../actions/init'\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 {outdent} from 'outdent'\nimport {InjectTemplate} from '../actions/inject'\nimport {InitFlags} from '../actions/init'\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 to: flags.typescript ? 'package.config.ts' : 'package.config.js',\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-forgotten-export': 'off',\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 {outdent} from 'outdent'\nimport {InjectTemplate} from '../actions/inject'\n\nexport function gitignoreTemplate(): InjectTemplate {\n return {\n type: 'template',\n to: '.gitignore',\n value: outdent`\n # Logs\n logs\n *.log\n npm-debug.log*\n\n # Runtime data\n pids\n *.pid\n *.seed\n\n # Directory for instrumented libs generated by jscoverage/JSCover\n lib-cov\n\n # Coverage directory used by tools like istanbul\n coverage\n\n # nyc test coverage\n .nyc_output\n\n # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n .grunt\n\n # node-waf configuration\n .lock-wscript\n\n # Compiled binary addons (http://nodejs.org/api/addons.html)\n build/Release\n\n # Dependency directories\n node_modules\n jspm_packages\n\n # Optional npm cache directory\n .npm\n\n # Optional REPL history\n .node_repl_history\n\n # macOS finder cache file\n .DS_Store\n\n # VS Code settings\n .vscode\n\n # IntelliJ\n .idea\n *.iml\n\n # Cache\n .cache\n\n # Yalc\n .yalc\n yalc.lock\n\n # npm package zips\n *.tgz\n `,\n }\n}\n","import {InjectTemplate} from '../actions/inject'\nimport {InitFlags} from '../actions/init'\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 flags.typescript ? 'package.config.ts' : 'package.config.js',\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 {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 path from 'path'\n// @ts-expect-error missing types\nimport licenses from '@rexxars/choosealicense-list'\nimport gitRemoteOriginUrl from 'git-remote-origin-url'\nimport log from '../util/log'\nimport {getUserInfo} from '../util/user'\nimport {errorToUndefined} from '../util/errorToUndefined'\nimport {addBuildScripts, getPackage, writePackageJson} from '../npm/package'\nimport {prompt, promptForPackageName, promptForRepoOrigin} from '../util/prompt'\nimport {generateReadme, isDefaultGitHubReadme} from '../util/readme'\n\nimport {\n copyFileWithOverwritePrompt,\n fileExists,\n readFile,\n writeFile,\n writeFileWithOverwritePrompt,\n} from '../util/files'\nimport {InitFlags} from './init'\nimport {PackageJson} from './verify/types'\nimport {injectPresets} from '../presets/presets'\nimport {tsconfigTemplateDist, tsconfigTemplate, tsconfigTemplateSettings} from '../configs/tsconfig'\nimport {pkgConfigTemplate} from '../configs/pkg-config'\nimport {gitignoreTemplate} from '../configs/git'\nimport {eslintignoreTemplate, eslintrcTemplate} from '../configs/eslint'\nimport {prettierignoreTemplate} from '../configs/prettier'\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(data, options)\n info(didWrite, 'Added compilation output directory to .gitignore')\n}\n\nasync function writeReadme(data: PackageData, options: InjectOptions) {\n const {basePath} = options\n\n const readmePath = path.join(basePath, 'README.md')\n const readme = await readFile(readmePath, 'utf8').catch(errorToUndefined)\n\n if (readme && !isDefaultGitHubReadme(readme)) {\n return false\n }\n\n await writeFileWithOverwritePrompt(readmePath, generateReadme(data), {\n encoding: 'utf8',\n force: options.flags.force,\n })\n return true\n}\n\nasync function writeLicense(\n {license}: PackageData,\n options: InjectOptions,\n licenseChanged: boolean,\n) {\n const {basePath, flags} = options\n\n if ((flags.license as unknown as boolean) === false || !license) {\n return false\n }\n\n // Prefer whatever path the user is currenly using (LICENSE.md or LICENSE)\n const hasLicenseMdFile = await fileExists(path.join(basePath, 'LICENSE.md'))\n const licensePath = path.join(basePath, hasLicenseMdFile ? 'LICENSE.md' : 'LICENSE')\n\n await writeFileWithOverwritePrompt(licensePath, license.text, {\n encoding: 'utf8',\n default: licenseChanged,\n force: flags.force,\n })\n\n return true\n}\n\nasync function getLicense(\n flags: InitFlags,\n {\n user,\n pluginName,\n pkg,\n requireUserConfirmation,\n }: PackageData & {requireUserConfirmation?: boolean},\n) {\n const license = await getLicenseIdentifier(flags, pkg, requireUserConfirmation)\n if (!license) {\n return undefined\n }\n\n const text = license.body\n .replace(/\\[fullname\\]/g, user?.name)\n .replace(/\\[project\\]/g, pluginName)\n .replace(/\\[year\\]/g, new Date().getFullYear())\n\n return {id: license.id, text}\n}\n\nasync function getLicenseIdentifier(\n flags: InitFlags,\n pkg: PackageJson | undefined,\n requireUserConfirmation = false,\n) {\n // --no-license\n if ((flags.license as unknown) === false) {\n return null\n }\n\n // --license becomes \"\", --license mit beocomes \"mit\"\n if (typeof flags.license === 'string') {\n const license = licenses.find(`${flags.license}`)\n if (!license) {\n throw new Error(`License \"${flags.license}\" not found`)\n }\n return license\n }\n\n // no --license flag provided, do we have one in package already?\n if (pkg && pkg.license && !requireUserConfirmation) {\n const license = licenses.find(`${pkg.license}`)\n if (license) {\n return license\n }\n\n // Warn, then prompt the user\n log.warn(`package.json contains license \"${pkg.license}\", which is not recognized`)\n }\n\n const licenseId = await prompt('Which license do you want to use?', {\n default: pkg && pkg.license && licenses.find(pkg.license) ? pkg.license : preferredLicenses[0],\n choices: [\n prompt.separator(),\n ...preferredLicenses.map((value) => ({value, name: licenses.list[value].title})),\n prompt.separator(),\n ...otherLicenses.map((value) => ({value, name: licenses.list[value].title})),\n ],\n })\n\n return licenses.find(licenseId)\n}\n\nasync function getProjectDescription(\n basePath: string,\n pkg: PackageJson | undefined,\n requireUserConfirmation = false,\n) {\n let description = await resolveProjectDescription(basePath, pkg)\n if (requireUserConfirmation) {\n description = await prompt('Plugin description', {default: description || ''})\n }\n return description ?? ''\n}\n\nasync function resolveProjectDescription(basePath: string, pkg: PackageJson | undefined) {\n // Try to grab from package.json\n if (pkg && typeof pkg.description === 'string' && pkg.description.length > 5) {\n return pkg.description\n }\n\n // Try to grab a project description from a standard GitHub-generated readme\n try {\n const readmePath = path.join(basePath, 'README.md')\n const readme = await readFile(readmePath, 'utf8')\n const [title, description] = readme.split('\\n').filter(Boolean)\n if (!title || !description || !title.match(/^#\\s+\\w+/)) {\n return null\n }\n\n // Naive, but this isn't too important\n const unlinked = description.replace(/\\[(.*?)\\]\\(.*?\\)/g, '$1')\n if (/^[^#]/.test(unlinked)) {\n return unlinked\n }\n\n return null\n } catch (err) {\n return errorToUndefined(err)\n }\n}\n\nexport async function writeAssets(injectables: Injectable[], {basePath, flags}: InjectOptions) {\n const assetsDir = await findAssetsDir()\n\n const from = (...segments: string[]) => path.join(assetsDir, 'inject', ...segments)\n const to = (...segments: string[]) => path.join(basePath, ...segments)\n\n const writes: string[] = []\n for (const injectable of injectables) {\n if (injectable.type === 'copy') {\n const fromPath = asArray(injectable.from)\n const toPath = asArray(injectable.to)\n if (await copyFileWithOverwritePrompt(from(...fromPath), to(...toPath), flags)) {\n writes.push(path.join(...toPath))\n }\n continue\n }\n\n if (injectable.type === 'template') {\n const toPath = asArray(injectable.to)\n\n await writeFileWithOverwritePrompt(to(...toPath), `${injectable.value.trim()}\\n`, {\n default: 'n',\n force: injectable.force || flags.force,\n })\n\n writes.push(path.join(...toPath))\n continue\n }\n\n throw new Error(`Unknown operation type \"${(injectable as any).type}\"`)\n }\n\n return writes\n}\n\nasync function writeStaticAssets(options: InjectOptions) {\n const {outDir, flags} = options\n\n const files: Injectable[] = [\n flags.eslint && eslintrcTemplate({flags: options.flags}),\n flags.eslint && eslintignoreTemplate({outDir, flags: options.flags}),\n {type: 'copy', from: 'editorconfig', to: '.editorconfig'},\n {type: 'copy', from: 'sanity.json', to: 'sanity.json'},\n {type: 'copy', from: 'v2-incompatible.js.template', to: 'v2-incompatible.js'},\n pkgConfigTemplate({outDir, flags: options.flags}),\n flags.gitignore && gitignoreTemplate(),\n flags.typescript && tsconfigTemplate({flags: options.flags}),\n flags.typescript && tsconfigTemplateDist({outDir, flags: options.flags}),\n flags.typescript && tsconfigTemplateSettings({outDir, flags: options.flags}),\n flags.prettier && prettierignoreTemplate({outDir}),\n flags.prettier && {type: 'copy', from: 'prettierrc.json', to: '.prettierrc'},\n ]\n .map((f) => (f ? (f as Injectable) : undefined))\n .filter((f): f is Injectable => !!f)\n\n const result = writeAssets(files, options)\n\n return result\n}\n\nfunction asArray(input: string | string[]): string[] {\n return typeof input === 'string' ? [input] : input\n}\n\n/**\n * assets dir might be in higher or lower in the dir hierarchy depending on\n * if we run from `dist` or `src`\n */\nasync function findAssetsDir(): Promise<string> {\n let maxBackpaddle = 3\n let currDir = __dirname\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(data: PackageData, 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 output = data.pkg?.main ?? data.pkg?.module\n if (!output) {\n return false\n }\n\n const ignorePath = output.replace(/^[./]+/, '')\n const ignore = ignorePath.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 outdent from 'outdent'\nimport {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 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 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 path from 'path'\nimport {inject} from './inject'\nimport {ensureDir, writeFile} from '../util/files'\nimport sharedFlags from '../sharedFlags'\nimport {TypedFlags} from 'meow'\nimport {getPackage} from '../npm/package'\nimport {defaultSourceJs, defaultSourceTs} from '../configs/default-source'\nimport {defaultOutDir} from '../constants'\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":["getIt","promise","jsonRequest","jsonResponse","httpErrors","headers","pkg","prompt","readJsonFile","path","xdgBasedir","_getGitUserInfo","isValidEmail","outdent","licenses","applyPreset","log","addDevDependencies","getPackage","addPackageJsonScripts","addScript","sortKeys","writePackageJsonDirect","chalk","readFile","errorToUndefined","writeFile","resolveLatestVersions","forceDependencyVersions","forcedPackageVersions","forcedDevPackageVersions","info","promptForPackageName","gitRemoteOriginUrl","promptForRepoOrigin","writePackageJson","addBuildScripts","writeFileWithOverwritePrompt","fileExists","copyFileWithOverwritePrompt","files","sharedFlags","devDependencies","defaultOutDir","ensureDir"],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var path = require("path"), meow = require("meow"), cli = require("./cli.js"), init = require("./init.js"), _package = require("./package.js"), execa = require("execa");
3
+ function _interopDefaultCompat(e) {
4
+ return e && typeof e == "object" && "default" in e ? e : { default: e };
5
+ }
6
+ var path__default = /* @__PURE__ */ _interopDefaultCompat(path), meow__default = /* @__PURE__ */ _interopDefaultCompat(meow), execa__default = /* @__PURE__ */ _interopDefaultCompat(execa);
7
+ function npmIsAvailable() {
8
+ return execa__default.default("npm", ["-v"]).then(() => !0).catch(() => !1);
9
+ }
10
+ function yarnIsAvailable() {
11
+ return execa__default.default("yarn", ["-v"]).then(() => !0).catch(() => !1);
12
+ }
13
+ function pnpmAvailable() {
14
+ return execa__default.default("pnpm", ["-v"]).then(() => !0).catch(() => !1);
15
+ }
16
+ async function promptForPackageManager() {
17
+ const [npm, yarn, pnpm] = await Promise.all([
18
+ npmIsAvailable(),
19
+ yarnIsAvailable(),
20
+ pnpmAvailable()
21
+ ]), choices = [npm && "npm", yarn && "yarn", pnpm && "pnpm"].filter(Boolean);
22
+ return choices.length < 2 ? choices[0] || "npm" : _package.prompt("Which package manager do you prefer?", {
23
+ choices: choices.map((value) => ({ value, name: value })),
24
+ default: choices[0]
25
+ });
26
+ }
27
+ async function installDependencies(pm, { cwd }) {
28
+ const proc = execa__default.default(pm, ["install"], { cwd, stdio: "inherit" }), { exitCode } = await proc;
29
+ return exitCode <= 0;
30
+ }
31
+ const description = "Initialize a new Sanity plugin", help = `
32
+ Usage
33
+ $ ${cli.cliName} init [dir] [<args>]
34
+
35
+ Options
36
+ --no-eslint Disables ESLint config and dependencies from being added
37
+ --no-prettier Disables prettier config and dependencies from being added
38
+ --no-typescript Disables typescript config and dependencies from being added
39
+ --no-license Disables LICENSE + package.json license field from being added
40
+ --no-editorconfig Disables .editorconfig from being added
41
+ --no-gitignore Disables .gitignore from being added
42
+ --no-scripts Disables scripts from being added to package.json
43
+ --no-install Disables automatically running package manager install
44
+
45
+ --name [package-name] Use the provided package-name
46
+ --author [name] Use the provided author
47
+ --repo [url] Use the provided repo url
48
+ --license [spdx] Use the license with the given SPDX identifier
49
+ --force No promt when overwriting files
50
+
51
+ --preset [preset-name] Adds config and files from a named preset. --preset can be supplied multiple times.
52
+ The following presets are available:
53
+ ${init.presetHelpList(30)}
54
+
55
+ Examples
56
+ # Initialize a new plugin in the current directory
57
+ $ ${cli.cliName} init
58
+
59
+ # Initialize a plugin in the directory ~/my-plugin
60
+ $ ${cli.cliName} init ~/my-plugin
61
+
62
+ # Don't add eslint or prettier
63
+ $ ${cli.cliName} init --no-eslint --no-prettier
64
+ `;
65
+ async function run({ argv }) {
66
+ const cli$1 = meow__default.default(help, { flags: init.initFlags, argv, description }), basePath = path__default.default.resolve(cli$1.input[0] || process.cwd()), { exists, isRoot } = await _package.hasSanityJson(basePath);
67
+ if (exists && isRoot)
68
+ throw new Error(
69
+ 'sanity.json has a "root" property set to true - are you trying to init into a studio instead of a plugin?'
70
+ );
71
+ const { v3ConfigFile } = await _package.findStudioV3Config(basePath);
72
+ if (v3ConfigFile)
73
+ throw new Error(
74
+ `${v3ConfigFile} exsists - are you trying to init into a studio instead of a plugin?`
75
+ );
76
+ if (cli.log.info('Initializing new plugin in "%s"', basePath), !cli$1.flags.force && !await _package.isEmptyish(basePath) && !await _package.prompt("Directory is not empty, proceed?", { type: "confirm", default: !1 })) {
77
+ cli.log.error("Directory is not empty. Cancelled.");
78
+ return;
79
+ }
80
+ await _package.ensureDir(basePath), await init.init({ basePath, flags: cli$1.flags }), cli$1.flags.install ? await installDependencies(await promptForPackageManager(), { cwd: basePath }) ? cli.log.info("Done!") : cli.log.error("Failed to install dependencies, try manually running `npm install`") : cli.log.info("Dependency installation skipped.");
81
+ }
82
+ exports.default = run;
83
+ //# sourceMappingURL=init2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init2.js","sources":["../../src/npm/manager.ts","../../src/cmds/init.ts"],"sourcesContent":["import execa from 'execa'\nimport {prompt} from '../util/prompt'\n\nexport function npmIsAvailable() {\n return execa('npm', ['-v'])\n .then(() => true)\n .catch(() => false)\n}\n\nexport function yarnIsAvailable() {\n return execa('yarn', ['-v'])\n .then(() => true)\n .catch(() => false)\n}\n\nexport function 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'\nimport meow from 'meow'\nimport log from '../util/log'\nimport {init, initFlags} from '../actions/init'\nimport {isEmptyish, ensureDir} from '../util/files'\nimport {installDependencies, promptForPackageManager} from '../npm/manager'\nimport {findStudioV3Config, hasSanityJson} from '../sanity/manifest'\nimport {prompt} from '../util/prompt'\nimport {cliName} from '../constants'\nimport {presetHelpList} from '../presets/presets'\n\nconst description = `Initialize a new Sanity plugin`\n\nconst help = `\nUsage\n $ ${cliName} init [dir] [<args>]\n\nOptions\n --no-eslint Disables ESLint config and dependencies from being added\n --no-prettier Disables prettier config and dependencies from being added\n --no-typescript Disables typescript config and dependencies from being added\n --no-license Disables LICENSE + package.json license field from being added\n --no-editorconfig Disables .editorconfig from being added\n --no-gitignore Disables .gitignore from being added\n --no-scripts Disables scripts from being added to package.json\n --no-install Disables automatically running package manager install\n\n --name [package-name] Use the provided package-name\n --author [name] Use the provided author\n --repo [url] Use the provided repo url\n --license [spdx] Use the license with the given SPDX identifier\n --force No promt when overwriting files\n\n --preset [preset-name] Adds config and files from a named preset. --preset can be supplied multiple times.\n The following presets are available:\n${presetHelpList(30)}\n\nExamples\n # Initialize a new plugin in the current directory\n $ ${cliName} init\n\n # Initialize a plugin in the directory ~/my-plugin\n $ ${cliName} init ~/my-plugin\n\n # Don't add eslint or prettier\n $ ${cliName} init --no-eslint --no-prettier\n`\n\nasync function run({argv}: {argv: string[]}) {\n const cli = meow(help, {flags: initFlags, argv, description})\n const basePath = path.resolve(cli.input[0] || process.cwd())\n\n const {exists, isRoot} = await hasSanityJson(basePath)\n if (exists && isRoot) {\n throw new Error(\n `sanity.json has a \"root\" property set to true - are you trying to init into a studio instead of a plugin?`,\n )\n }\n\n const {v3ConfigFile} = await findStudioV3Config(basePath)\n if (v3ConfigFile) {\n throw new Error(\n `${v3ConfigFile} exsists - are you trying to init into a studio instead of a plugin?`,\n )\n }\n\n log.info('Initializing new plugin in \"%s\"', basePath)\n if (\n !cli.flags.force &&\n !(await isEmptyish(basePath)) &&\n !(await prompt('Directory is not empty, proceed?', {type: 'confirm', default: false}))\n ) {\n log.error('Directory is not empty. Cancelled.')\n return\n }\n\n await ensureDir(basePath)\n await init({basePath, flags: cli.flags})\n if (cli.flags.install) {\n if (await installDependencies(await promptForPackageManager(), {cwd: basePath})) {\n log.info('Done!')\n } else {\n log.error('Failed to install dependencies, try manually running `npm install`')\n }\n } else {\n log.info('Dependency installation skipped.')\n }\n}\n\nexport default run\n"],"names":["execa","prompt","cliName","presetHelpList","cli","meow","initFlags","path","hasSanityJson","findStudioV3Config","log","isEmptyish","ensureDir","init"],"mappings":";;;;;;AAGO,SAAS,iBAAiB;AAC/B,SAAOA,uBAAM,OAAO,CAAC,IAAI,CAAC,EACvB,KAAK,MAAM,EAAI,EACf,MAAM,MAAM,EAAK;AACtB;AAEO,SAAS,kBAAkB;AAChC,SAAOA,uBAAM,QAAQ,CAAC,IAAI,CAAC,EACxB,KAAK,MAAM,EAAI,EACf,MAAM,MAAM,EAAK;AACtB;AAEO,SAAS,gBAAgB;AAC9B,SAAOA,uBAAM,QAAQ,CAAC,IAAI,CAAC,EACxB,KAAK,MAAM,EAAI,EACf,MAAM,MAAM,EAAK;AACtB;AAEA,eAAsB,0BAA0B;AAC9C,QAAM,CAAC,KAAK,MAAM,IAAI,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC1C,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,cAAc;AAAA,EACf,CAAA,GAEK,UAAU,CAAC,OAAO,OAAO,QAAQ,QAAQ,QAAQ,MAAM,EAAE,OAAO,OAAO;AACzE,SAAA,QAAQ,SAAS,IACZ,QAAQ,CAAC,KAAK,QAGhBC,gBAAO,wCAAwC;AAAA,IACpD,SAAS,QAAQ,IAAI,CAAC,WAAW,EAAC,OAAO,MAAM,MAAA,EAAO;AAAA,IACtD,SAAS,QAAQ,CAAC;AAAA,EAAA,CACnB;AACH;AAEA,eAAsB,oBAAoB,IAAY,EAAC,OAAsB;AAC3E,QAAM,OAAOD,eAAA,QAAM,IAAI,CAAC,SAAS,GAAG,EAAC,KAAK,OAAO,WAAU,GACrD,EAAC,aAAY,MAAM;AACzB,SAAO,YAAY;AACrB;AChCA,MAAM,cAAc,kCAEd,OAAO;AAAA;AAAA,MAEPE,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBXC,KAAA,eAAe,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,MAIdD,WAAO;AAAA;AAAA;AAAA,MAGPA,WAAO;AAAA;AAAA;AAAA,MAGPA,WAAO;AAAA;AAGb,eAAe,IAAI,EAAC,QAAyB;AACrC,QAAAE,QAAMC,cAAAA,QAAK,MAAM,EAAC,OAAOC,KAAAA,WAAW,MAAM,YAAY,CAAA,GACtD,WAAWC,cAAK,QAAA,QAAQH,MAAI,MAAM,CAAC,KAAK,QAAQ,IAAA,CAAK,GAErD,EAAC,QAAQ,OAAM,IAAI,MAAMI,SAAA,cAAc,QAAQ;AACrD,MAAI,UAAU;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAIJ,QAAM,EAAC,aAAgB,IAAA,MAAMC,4BAAmB,QAAQ;AACpD,MAAA;AACF,UAAM,IAAI;AAAA,MACR,GAAG,YAAY;AAAA,IAAA;AAInB,MAAAC,IAAA,IAAI,KAAK,mCAAmC,QAAQ,GAElD,CAACN,MAAI,MAAM,SACX,CAAE,MAAMO,SAAAA,WAAW,QAAQ,KAC3B,CAAE,MAAMV,SAAA,OAAO,oCAAoC,EAAC,MAAM,WAAW,SAAS,GAAK,CAAC,GACpF;AACAS,YAAI,MAAM,oCAAoC;AAC9C;AAAA,EACF;AAEA,QAAME,SAAAA,UAAU,QAAQ,GACxB,MAAMC,KAAAA,KAAK,EAAC,UAAU,OAAOT,MAAI,OAAM,GACnCA,MAAI,MAAM,UACR,MAAM,oBAAoB,MAAM,wBAAA,GAA2B,EAAC,KAAK,SAAQ,CAAC,IAC5EM,IAAI,IAAA,KAAK,OAAO,IAEhBA,IAAAA,IAAI,MAAM,oEAAoE,IAGhFA,IAAA,IAAI,KAAK,kCAAkC;AAE/C;;"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var pkgUtils = require("@sanity/pkg-utils"), path = require("path"), meow = require("meow"), cli = require("./cli.js"), init = require("./init.js"), _package = require("./package.js");
3
+ function _interopDefaultCompat(e) {
4
+ return e && typeof e == "object" && "default" in e ? e : { default: e };
5
+ }
6
+ var path__default = /* @__PURE__ */ _interopDefaultCompat(path), meow__default = /* @__PURE__ */ _interopDefaultCompat(meow);
7
+ const description = "Inject configuration into a Sanity plugin", help = `
8
+ Usage
9
+ $ ${cli.cliName} inject [dir] [<args>]
10
+
11
+ Options
12
+ --no-eslint Disables ESLint config and dependencies from being added
13
+ --no-prettier Disables prettier config and dependencies from being added
14
+ --no-typescript Disables typescript config and dependencies from being added
15
+ --no-license Disables LICENSE + package.json license field from being added
16
+ --no-editorconfig Disables .editorconfig from being added
17
+ --no-gitignore Disables .gitignore from being added
18
+ --no-scripts Disables scripts from being added to package.json
19
+
20
+ --license [spdx] Use the license with the given SPDX identifier
21
+ --force No promt when overwriting files
22
+
23
+ --preset [preset-name] Adds config and files from a named preset. --preset can be supplied multiple times.
24
+ The following presets are available:
25
+ ${init.presetHelpList(30)}
26
+ --preset-only Skips the default inject steps. Use this to apply a preset to an otherwise complete plugin.
27
+
28
+ Examples
29
+ # Inject configuration into the plugin in the current directory
30
+ $ ${cli.cliName} inject
31
+
32
+ # Inject configuration into the plugin in ~/my-plugin
33
+ $ ${cli.cliName} inject ~/my-plugin
34
+
35
+ # Don't inject eslint or prettier
36
+ $ ${cli.cliName} inject --no-eslint --no-prettier
37
+
38
+ # Inject plugin configuration and semver-workflow into the plugin in the current directory
39
+ $ @sanity/plugin-kit inject --preset semver-workflow
40
+
41
+ # Only inject semver-workflow and renovatebot config from presets
42
+ $ ${cli.cliName} inject --preset-only --preset semver-workflow --preset renovatebot
43
+
44
+ `;
45
+ async function run({ argv }) {
46
+ const cli$1 = meow__default.default(help, { flags: init.initFlags, argv, description }), basePath = path__default.default.resolve(cli$1.input[0] || process.cwd()), outDir = (await pkgUtils.loadConfig({ cwd: basePath }))?.dist ?? cli.defaultOutDir, { v3ConfigFile } = await _package.findStudioV3Config(basePath);
47
+ if (v3ConfigFile)
48
+ throw new Error(
49
+ `${v3ConfigFile} exists - are you trying to INJECT into a studio instead of a plugin?`
50
+ );
51
+ cli.log.info('Inject config into plugin in "%s"', basePath), await init.inject({ basePath, outDir, flags: cli$1.flags, validate: !1 }), cli.log.info("Done!");
52
+ }
53
+ exports.default = run;
54
+ //# sourceMappingURL=inject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject.js","sources":["../../src/cmds/inject.ts"],"sourcesContent":["import {loadConfig as loadPackageConfig} from '@sanity/pkg-utils'\nimport path from 'path'\nimport meow from 'meow'\nimport log from '../util/log'\nimport {inject} from '../actions/inject'\nimport {findStudioV3Config} from '../sanity/manifest'\nimport {initFlags} from '../actions/init'\nimport {cliName, defaultOutDir} from '../constants'\nimport {presetHelpList} from '../presets/presets'\n\nconst description = `Inject configuration into a Sanity plugin`\n\nconst help = `\nUsage\n $ ${cliName} inject [dir] [<args>]\n\nOptions\n --no-eslint Disables ESLint config and dependencies from being added\n --no-prettier Disables prettier config and dependencies from being added\n --no-typescript Disables typescript config and dependencies from being added\n --no-license Disables LICENSE + package.json license field from being added\n --no-editorconfig Disables .editorconfig from being added\n --no-gitignore Disables .gitignore from being added\n --no-scripts Disables scripts from being added to package.json\n\n --license [spdx] Use the license with the given SPDX identifier\n --force No promt when overwriting files\n\n --preset [preset-name] Adds config and files from a named preset. --preset can be supplied multiple times.\n The following presets are available:\n${presetHelpList(30)}\n --preset-only Skips the default inject steps. Use this to apply a preset to an otherwise complete plugin.\n\nExamples\n # Inject configuration into the plugin in the current directory\n $ ${cliName} inject\n\n # Inject configuration into the plugin in ~/my-plugin\n $ ${cliName} inject ~/my-plugin\n\n # Don't inject eslint or prettier\n $ ${cliName} inject --no-eslint --no-prettier\n\n # Inject plugin configuration and semver-workflow into the plugin in the current directory\n $ @sanity/plugin-kit inject --preset semver-workflow\n\n # Only inject semver-workflow and renovatebot config from presets\n $ ${cliName} inject --preset-only --preset semver-workflow --preset renovatebot\n\n`\n\nasync function run({argv}: {argv: string[]}) {\n const cli = meow(help, {flags: initFlags, argv, description})\n const basePath = path.resolve(cli.input[0] || process.cwd())\n const packageConfig = await loadPackageConfig({cwd: basePath})\n const outDir = packageConfig?.dist ?? defaultOutDir\n\n const {v3ConfigFile} = await findStudioV3Config(basePath)\n if (v3ConfigFile) {\n throw new Error(\n `${v3ConfigFile} exists - are you trying to INJECT into a studio instead of a plugin?`,\n )\n }\n log.info('Inject config into plugin in \"%s\"', basePath)\n\n await inject({basePath, outDir, flags: cli.flags, validate: false})\n log.info('Done!')\n}\n\nexport default run\n"],"names":["cliName","presetHelpList","cli","meow","initFlags","path","loadPackageConfig","defaultOutDir","findStudioV3Config","log","inject"],"mappings":";;;;;;AAUA,MAAM,cAAc,6CAEd,OAAO;AAAA;AAAA,MAEPA,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBXC,KAAA,eAAe,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAKdD,WAAO;AAAA;AAAA;AAAA,MAGPA,WAAO;AAAA;AAAA;AAAA,MAGPA,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMPA,WAAO;AAAA;AAAA;AAIb,eAAe,IAAI,EAAC,QAAyB;AAC3C,QAAME,QAAMC,cAAAA,QAAK,MAAM,EAAC,OAAOC,gBAAW,MAAM,YAAA,CAAY,GACtD,WAAWC,cAAK,QAAA,QAAQH,MAAI,MAAM,CAAC,KAAK,QAAQ,IAAI,CAAC,GAErD,UADgB,MAAMI,SAAkB,WAAA,EAAC,KAAK,SAAQ,CAAC,IAC/B,QAAQC,mBAEhC,EAAC,aAAgB,IAAA,MAAMC,SAAAA,mBAAmB,QAAQ;AACpD,MAAA;AACF,UAAM,IAAI;AAAA,MACR,GAAG,YAAY;AAAA,IAAA;AAGnBC,UAAI,KAAK,qCAAqC,QAAQ,GAEtD,MAAMC,YAAO,EAAC,UAAU,QAAQ,OAAOR,MAAI,OAAO,UAAU,GAAA,CAAM,GAClEO,QAAI,KAAK,OAAO;AAClB;;"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var path = require("path"), meow = require("meow"), _package$1 = require("./package2.js"), cli = require("./cli.js"), nodemon = require("nodemon"), concurrently = require("concurrently"), chalk = require("chalk"), fs = require("fs"), _package = require("./package.js"), outdent = require("outdent"), pkgUtils = require("@sanity/pkg-utils");
3
+ function _interopDefaultCompat(e) {
4
+ return e && typeof e == "object" && "default" in e ? e : { default: e };
5
+ }
6
+ var path__default = /* @__PURE__ */ _interopDefaultCompat(path), meow__default = /* @__PURE__ */ _interopDefaultCompat(meow), nodemon__default = /* @__PURE__ */ _interopDefaultCompat(nodemon), concurrently__default = /* @__PURE__ */ _interopDefaultCompat(concurrently), chalk__default = /* @__PURE__ */ _interopDefaultCompat(chalk), fs__default = /* @__PURE__ */ _interopDefaultCompat(fs), outdent__default = /* @__PURE__ */ _interopDefaultCompat(outdent);
7
+ async function linkWatch({ basePath }) {
8
+ const packageJson = JSON.parse(
9
+ fs__default.default.readFileSync(path__default.default.join(basePath, "package.json"), "utf8")
10
+ ), outDir = (await pkgUtils.loadConfig({ cwd: basePath }))?.dist ?? cli.defaultOutDir, watch = {
11
+ command: "npm run watch",
12
+ extensions: "ts,js,png,svg,gif,jpeg,css",
13
+ ...packageJson.sanityPlugin?.linkWatch
14
+ };
15
+ nodemon__default.default({
16
+ watch: [outDir],
17
+ ext: watch.extensions,
18
+ exec: "yalc push --changed"
19
+ //delay: 1000
20
+ });
21
+ const folder = path__default.default.join(basePath, outDir);
22
+ await _package.fileExists(folder) || await _package.mkdir(folder);
23
+ const pkg = await _package.getPackage({ basePath, validate: !1 });
24
+ concurrently__default.default([watch.command]), nodemon__default.default.on("start", function() {
25
+ cli.log.info(
26
+ outdent__default.default`
27
+ Watching ${outDir} for changes to files with extensions: ${watch.extensions}
28
+
29
+ To test this package in Sanity Studio or another package, in a separate shell run:
30
+ cd /path/to/sanity/studio-or-package
31
+
32
+ Then, run one of the below commands, based on the package manager used in studio-or-package:
33
+
34
+ ## yarn
35
+ ${chalk__default.default.greenBright(`yalc add --link ${pkg.name} && yarn install`)}
36
+
37
+ ## npm
38
+ ${chalk__default.default.greenBright(`npx yalc add ${pkg.name} && npx yalc link ${pkg.name} && npm install`)}
39
+ `.trimStart()
40
+ );
41
+ }).on("quit", function() {
42
+ process.exit();
43
+ }).on("restart", function(files) {
44
+ cli.log.info("Found changes in files:", chalk__default.default.magentaBright(files)), cli.log.info("Pushing new yalc package...");
45
+ });
46
+ }
47
+ const description = "Run the watch command and pushes any changes to yalc", help = `
48
+ Usage
49
+ $ ${_package$1.pkg.binname} link-watch [<args>]
50
+
51
+ Options
52
+ --silent Do not print info and warning messages
53
+ --verbose Log everything. This option conflicts with --silent
54
+ --version Output the version number
55
+ --help Output usage information
56
+
57
+ Configuration
58
+ To override the default watch command configuration, provide an override in package.json under sanityPlugin:
59
+ {
60
+ "sanityPlugin": {
61
+ "watchCommand": "microbundle watch --format modern,esm,cjs --jsx React.createElement --jsxImportSource react --css inline",
62
+ "linkWatch": {
63
+ "command": "npm run watch",
64
+ "extensions": "js,png,svg,gif,jpeg,css"
65
+ }
66
+ }
67
+ }
68
+
69
+ Examples
70
+ # Run the watch command and pushes any changes to yalc
71
+ $ ${_package$1.pkg.binname} link-watch
72
+ `, flags = {
73
+ ...cli.sharedFlags,
74
+ watch: {
75
+ type: "boolean",
76
+ default: !1
77
+ }
78
+ };
79
+ function run({ argv }) {
80
+ const cli2 = meow__default.default(help, { flags, argv, description }), basePath = path__default.default.resolve(cli2.input[0] || process.cwd());
81
+ return linkWatch({ basePath });
82
+ }
83
+ exports.default = run;
84
+ //# sourceMappingURL=link-watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-watch.js","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 nodemon from 'nodemon'\nimport concurrently from 'concurrently'\nimport chalk from 'chalk'\nimport fs from 'fs'\nimport path from 'path'\nimport log from '../util/log'\nimport {getPackage} from '../npm/package'\nimport outdent from 'outdent'\nimport {fileExists, mkdir} from '../util/files'\nimport {loadConfig as loadPackageConfig} from '@sanity/pkg-utils'\nimport {defaultOutDir} from '../constants'\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({cwd: 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({\n watch: [outDir],\n ext: watch.extensions,\n exec: 'yalc push --changed',\n //delay: 1000\n })\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'\nimport meow from 'meow'\nimport pkg from '../../package.json'\nimport sharedFlags from '../sharedFlags'\nimport {linkWatch} from '../actions/link-watch'\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, {flags, argv, description})\n const basePath = path.resolve(cli.input[0] || process.cwd())\n return linkWatch({basePath})\n}\n\nexport default run\n"],"names":["fs","path","loadPackageConfig","defaultOutDir","nodemon","fileExists","mkdir","getPackage","concurrently","log","outdent","chalk","pkg","sharedFlags","cli","meow"],"mappings":";;;;;;AAwCsB,eAAA,UAAU,EAAC,YAA+B;AAC9D,QAAM,cAA2B,KAAK;AAAA,IACpCA,oBAAG,aAAaC,sBAAK,KAAK,UAAU,cAAc,GAAG,MAAM;AAAA,EAAA,GAIvD,UADgB,MAAMC,SAAAA,WAAkB,EAAC,KAAK,SAAA,CAAS,IAC/B,QAAQC,IAAA,eAEhC,QAAmC;AAAA,IACvC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,GAAG,YAAY,cAAc;AAAA,EAAA;AAGvBC,2BAAA;AAAA,IACN,OAAO,CAAC,MAAM;AAAA,IACd,KAAK,MAAM;AAAA,IACX,MAAM;AAAA;AAAA,EAAA,CAEP;AAGD,QAAM,SAASH,cAAA,QAAK,KAAK,UAAU,MAAM;AACnC,QAAMI,SAAW,WAAA,MAAM,KAC3B,MAAMC,eAAM,MAAM;AAGpB,QAAM,MAAM,MAAMC,oBAAW,EAAC,UAAU,UAAU,IAAM;AAE3CC,wBAAA,QAAA,CAAC,MAAM,OAAO,CAAC,GAE5BJ,yBACG,GAAG,SAAS,WAAY;AACnBK,QAAAA,IAAA;AAAA,MACFC;mBACW,MAAM,0CAA0C,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAQzEC,eAAAA,QAAM,YAAY,mBAAmB,IAAI,IAAI,kBAAkB,CAAC;AAAA;AAAA;AAAA,UAGhEA,uBAAM,YAAY,gBAAgB,IAAI,IAAI,qBAAqB,IAAI,IAAI,iBAAiB,CAAC;AAAA,QAC3F,UAAU;AAAA,IAAA;AAAA,EACZ,CACD,EACA,GAAG,QAAQ,WAAY;AACtB,YAAQ,KAAK;AAAA,EACd,CAAA,EACA,GAAG,WAAW,SAAU,OAAY;AAC/BF,QAAAA,IAAA,KAAK,2BAA2BE,eAAAA,QAAM,cAAc,KAAK,CAAC,GAC9DF,IAAI,IAAA,KAAK,6BAA6B;AAAA,EAAA,CACvC;AACL;AC3FA,MAAM,cAAc,wDAEd,OAAO;AAAA;AAAA,MAEPG,WAAAA,IAAI,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAsBXA,WAAAA,IAAI,OAAO;AAAA,GAGX,QAAQ;AAAA,EACZ,GAAGC,IAAA;AAAA,EACH,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEA,SAAS,IAAI,EAAC,QAAyB;AACrC,QAAMC,OAAMC,cAAAA,QAAK,MAAM,EAAC,OAAO,MAAM,aAAY,GAC3C,WAAWd,cAAAA,QAAK,QAAQa,KAAI,MAAM,CAAC,KAAK,QAAQ,KAAK;AACpD,SAAA,UAAU,EAAC,SAAA,CAAS;AAC7B;;"}