@sanity/plugin-kit
7.0.28.0.0
dist/init-BDY7XRmJ.js.map+
dist/init-BDY7XRmJ.js.mapNew file+1
Index: package/dist/init-BDY7XRmJ.js.map
===================================================================
--- package/dist/init-BDY7XRmJ.js.map
+++ package/dist/init-BDY7XRmJ.js.map
@@ -0,0 +1,1 @@
+{"version":3,"file":"init-BDY7XRmJ.js","names":["applyPreset","pkg.name","pkg.version","isValidEmail","applyPreset","log","addDevDependencies","log","sharedFlags"],"sources":["../src/configs/default-source.ts","../src/configs/git.ts","../src/configs/oxfmt.ts","../src/configs/oxlint.ts","../src/configs/pkg-config.ts","../src/configs/tsconfig.ts","../src/presets/renovatebot.ts","../src/util/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 // oxlint-disable-next-line no-console\n console.log(\\`hello from ${pkg.name}\\`)\n return {\n name: '${pkg.name}',\n }\n })\n`.trimStart() + '\\n'\n )\n}\n\nexport function defaultSourceTs(pkg: PackageJson) {\n return (\n outdent`\n import {definePlugin} from 'sanity'\n\n interface MyPluginConfig {\n /* nothing here yet */\n }\n\n /**\n * Usage in \\`sanity.config.ts\\` (or .js)\n *\n * \\`\\`\\`ts\n * import {defineConfig} from 'sanity'\n * import {myPlugin} from '${pkg.name}'\n *\n * export default defineConfig({\n * // ...\n * plugins: [myPlugin()],\n * })\n * \\`\\`\\`\n *\n * @public\n */\n export const myPlugin = definePlugin<MyPluginConfig | void>((_config = {}) => {\n // oxlint-disable-next-line no-console\n console.log('hello from ${pkg.name}')\n return {\n name: '${pkg.name}',\n }\n })\n`.trimStart() + '\\n'\n )\n}\n","import {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 type {InitFlags} from '../actions/init'\nimport type {InjectTemplate} from '../actions/inject'\n\nexport function oxfmtConfigTemplate(options: {flags: InitFlags}): InjectTemplate {\n const {flags} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: 'oxfmt.config.ts',\n value: `export {default} from '@sanity/plugin-kit/oxfmt'`,\n }\n}\n","import type {InitFlags} from '../actions/init'\nimport type {InjectTemplate} from '../actions/inject'\n\nexport function oxlintConfigTemplate(options: {flags: InitFlags}): InjectTemplate {\n const {flags} = options\n\n return {\n type: 'template',\n force: flags.force,\n to: 'oxlint.config.ts',\n value: `export {default} from '@sanity/plugin-kit/oxlint'`,\n }\n}\n","import {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 {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(/[email protected]\\//g, 'github.com/')\n .replace(/[email protected]:/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 {gitignoreTemplate} from '../configs/git'\nimport {oxfmtConfigTemplate} from '../configs/oxfmt'\nimport {oxlintConfigTemplate} from '../configs/oxlint'\nimport {pkgConfigTemplate} from '../configs/pkg-config'\nimport {tsconfigTemplateDist, tsconfigTemplate, tsconfigTemplateSettings} from '../configs/tsconfig'\nimport {addBuildScripts, getPackage, writePackageJson} from '../npm/package'\nimport {injectPresets} from '../presets/presets'\nimport {errorToUndefined} from '../util/errorToUndefined'\nimport {\n copyFileWithOverwritePrompt,\n fileExists,\n readFile,\n writeFile,\n writeFileWithOverwritePrompt,\n} from '../util/files'\nimport log from '../util/log'\nimport {prompt, promptForPackageName, promptForRepoOrigin} from '../util/prompt'\nimport {generateReadme, isDefaultGitHubReadme} from '../util/readme'\nimport {getUserInfo} from '../util/user'\nimport type {InitFlags} from './init'\nimport type {PackageJson} from './verify/types'\n\nconst bannedFields = ['login', 'description', 'projecturl', 'email']\nconst preferredLicenses = ['MIT', 'ISC', 'BSD-3-Clause']\nconst otherLicenses = Object.keys(licenses.list).filter((id) => {\n const license = licenses.list[id]\n return (\n !preferredLicenses.includes(id) &&\n !bannedFields.some((field) => license.body.includes(`[${field}]`))\n )\n})\n\nexport interface InjectCopyFromTo {\n type: 'copy'\n from: string | string[]\n to: string | string[]\n}\n\nexport interface InjectTemplate {\n type: 'template'\n to: string | string[]\n value: string\n force?: boolean\n}\n\nexport type Injectable = InjectCopyFromTo | InjectTemplate\n\nexport interface InjectOptions {\n basePath: string\n requireUserConfirmation?: boolean\n flags: InitFlags\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n validate?: boolean\n outDir: string\n}\n\nexport interface PackageData {\n user?: {name?: string; email?: string}\n pluginName?: string\n license?: {id: string; text: string}\n description?: string\n pkg?: PackageJson\n gitOrigin?: string\n}\n\nexport async function inject(options: InjectOptions) {\n if (options.flags.presetOnly) {\n log.info('Only apply presets, skipping default inject.')\n } else {\n await injectBase(options)\n }\n await injectPresets(options)\n}\n\nasync function injectBase(options: InjectOptions) {\n const {basePath, flags, requireUserConfirmation} = options\n const info = (write: boolean, msg: string, ...args: string[]) => write && log.info(msg, ...args)\n // Gather data\n const pkg = await getPackage(options).catch(errorToUndefined)\n log.debug('Plugin has package.json: %s', pkg ? 'yes' : 'no')\n\n const user = await getUserInfo(options, pkg)\n log.debug('User information: %o', user)\n\n const pkgName = flags.name ?? pkg?.name\n const pluginName =\n requireUserConfirmation || !pkgName ? await promptForPackageName(options, pkgName) : pkgName\n\n log.debug('Plugin name: %s', pluginName)\n\n const license = await getLicense(flags, {user, pluginName, pkg, requireUserConfirmation})\n const licenseChanged = (pkg && pkg.license) !== (license && license.id)\n log.debug('License: %s', license ? license.id : '<none>')\n\n const description = await getProjectDescription(basePath, pkg, requireUserConfirmation)\n log.debug('Description: %s', description || '<none>')\n\n const repoUrl =\n flags.repo ??\n ((await 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.oxlint && oxlintConfigTemplate({flags: options.flags}),\n {type: 'copy', from: 'editorconfig', to: '.editorconfig'},\n pkgConfigTemplate({outDir, flags: options.flags}),\n flags.gitignore && gitignoreTemplate(),\n flags.typescript && tsconfigTemplate({flags: options.flags}),\n flags.typescript && tsconfigTemplateDist({outDir, flags: options.flags}),\n flags.typescript && tsconfigTemplateSettings({outDir, flags: options.flags}),\n flags.oxfmt && oxfmtConfigTemplate({flags: options.flags}),\n ]\n .map((f) => (f ? (f as Injectable) : undefined))\n .filter((f): f is Injectable => !!f)\n\n const result = writeAssets(files, options)\n\n return result\n}\n\nfunction asArray(input: string | string[]): string[] {\n return typeof input === 'string' ? [input] : input\n}\n\n/**\n * assets dir might be in higher or lower in the dir hierarchy depending on\n * if we run from `dist` or `src`\n */\nasync function findAssetsDir(): Promise<string> {\n let maxBackpaddle = 3\n let currDir = path.dirname(fileURLToPath(import.meta.url))\n let assetsDir: string = ''\n while (!assetsDir && maxBackpaddle) {\n currDir = path.join(currDir, '..')\n const assets = path.join(currDir, 'assets')\n if (await fileExists(assets)) {\n assetsDir = assets\n } else {\n maxBackpaddle--\n }\n }\n\n if (!assetsDir) {\n throw new Error('Could not find assets directory!')\n }\n return assetsDir\n}\n\nasync function addCompileDirToGitIgnore(options: InjectOptions) {\n const gitIgnorePath = path.join(options.basePath, '.gitignore')\n const gitignore = await readFile(gitIgnorePath, 'utf8').catch(errorToUndefined)\n if (!gitignore) {\n return false\n }\n\n const ignore = options.outDir.replace(/^[./]+/, '').split('/')[0]\n if (!ignore) {\n return false\n }\n\n const lines = gitignore.trim().split('\\n')\n if (lines.includes(ignore)) {\n return false\n }\n\n lines.push('', '# Compiled plugin', ignore)\n\n await writeFile(gitIgnorePath, lines.join('\\n') + '\\n', {encoding: 'utf8'})\n return true\n}\n","import path from 'path'\n\nimport type {TypedFlags} from 'meow'\n\nimport {defaultSourceJs, defaultSourceTs} from '../configs/default-source'\nimport {defaultOutDir} from '../constants'\nimport {getPackage} from '../npm/package'\nimport sharedFlags from '../sharedFlags'\nimport {ensureDir, writeFile} from '../util/files'\nimport {inject} from './inject'\n\nexport const initFlags = {\n ...sharedFlags,\n scripts: {\n type: 'boolean',\n default: true,\n },\n oxlint: {\n type: 'boolean',\n default: true,\n },\n typescript: {\n type: 'boolean',\n default: true,\n },\n oxfmt: {\n type: 'boolean',\n default: true,\n },\n license: {\n type: 'string',\n },\n editorconfig: {\n type: 'boolean',\n default: true,\n },\n gitignore: {\n type: 'boolean',\n default: true,\n },\n force: {\n type: 'boolean',\n default: false,\n },\n install: {\n type: 'boolean',\n default: true,\n },\n name: {\n type: 'string',\n },\n author: {\n type: 'string',\n },\n repo: {\n type: 'string',\n },\n presetOnly: {\n type: 'boolean',\n default: false,\n },\n preset: {\n type: 'string',\n isMultiple: true,\n },\n} as const\n\nexport type InitFlags = TypedFlags<typeof initFlags>\n\nexport interface InitOptions {\n basePath: string\n flags: InitFlags\n}\n\nexport async function init(options: InitOptions) {\n let dependencies = {}\n let devDependencies = {}\n let peerDependencies = {}\n\n await inject({\n ...options,\n outDir: defaultOutDir,\n requireUserConfirmation: !options.flags.force,\n dependencies,\n devDependencies,\n peerDependencies,\n validate: false,\n })\n\n const packageJson = await getPackage({basePath: options.basePath, validate: false})\n const typescript = options.flags.typescript\n const source = typescript ? defaultSourceTs(packageJson) : defaultSourceJs(packageJson)\n const filename = typescript ? 'index.ts' : 'index.js'\n const srcDir = path.resolve(options.basePath, 'src')\n await ensureDir(srcDir)\n await writeFile(path.join(srcDir, filename), source, {encoding: 'utf8'})\n}\n"],"mappings":"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"}
\ No newline at end of file