@sanity/pkg-utils 12.3.4 → 13.0.1

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 (27) hide show
  1. package/MIGRATE.md +1 -1
  2. package/README.md +2 -2
  3. package/dist/{buildAction-BPF82HZg.js → buildAction-BbznO37s.js} +5 -5
  4. package/dist/buildAction-BbznO37s.js.map +1 -0
  5. package/dist/{checkAction-DWSqzrZd.js → checkAction-hzCSdRlj.js} +4 -4
  6. package/dist/{checkAction-DWSqzrZd.js.map → checkAction-hzCSdRlj.js.map} +1 -1
  7. package/dist/cli.js +5 -5
  8. package/dist/index.d.ts +13 -10
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +3 -3
  11. package/dist/index.js.map +1 -1
  12. package/dist/initAction-CmOO8eod.js.map +1 -1
  13. package/dist/{resolveBuildContext-vVTRkIDl.js → resolveBuildContext-Cp6bOuom.js} +16 -9
  14. package/dist/resolveBuildContext-Cp6bOuom.js.map +1 -0
  15. package/dist/{resolveTsdownConfig-C6jUZqvp.js → resolveTsdownConfig-QaIhKS-s.js} +14 -22
  16. package/dist/{resolveTsdownConfig-C6jUZqvp.js.map → resolveTsdownConfig-QaIhKS-s.js.map} +1 -1
  17. package/dist/{watchAction-IMdjLKl4.js → watchAction-fgVjJMTR.js} +23 -18
  18. package/dist/watchAction-fgVjJMTR.js.map +1 -0
  19. package/dist/{watchConfigFiles-AGBDblwf.js → watchConfigFiles-Bt03CSXT.js} +5 -11
  20. package/dist/watchConfigFiles-Bt03CSXT.js.map +1 -0
  21. package/dist/{writeBundleCssExports-BO8zfc4U.js → writeBundleCssExports-DXkUB_7e.js} +2 -2
  22. package/dist/{writeBundleCssExports-BO8zfc4U.js.map → writeBundleCssExports-DXkUB_7e.js.map} +1 -1
  23. package/package.json +15 -14
  24. package/dist/buildAction-BPF82HZg.js.map +0 -1
  25. package/dist/resolveBuildContext-vVTRkIDl.js.map +0 -1
  26. package/dist/watchAction-IMdjLKl4.js.map +0 -1
  27. package/dist/watchConfigFiles-AGBDblwf.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"buildAction-BPF82HZg.js","names":["build","findPkgPath","tsdownBuild","build"],"sources":["../src/node/build.ts","../src/cli/buildAction.ts"],"sourcesContent":["import {existsSync, readFileSync, rmSync, writeFileSync} from 'node:fs'\nimport path from 'node:path'\nimport {up as findPkgPath} from 'empathic/package'\nimport {build as tsdownBuild, type TsdownBundle} from 'tsdown'\nimport {loadConfig} from './core/config/loadConfig.ts'\nimport {isRecord} from './core/isRecord.ts'\nimport {loadPkgWithReporting} from './core/pkg/loadPkgWithReporting.ts'\nimport {createLogger, type Logger} from './logger.ts'\nimport {resolveBuildContext} from './resolveBuildContext.ts'\nimport {createSpinner} from './spinner.ts'\nimport {\n resolveTsdownBuilds,\n type TsdownBuild as TsdownBuildDef,\n} from './tasks/tsdown/resolveTsdownBuilds.ts'\nimport {resolveTsdownConfig} from './tasks/tsdown/resolveTsdownConfig.ts'\n\nconst RE_TS_SOURCE = /\\.[cm]?tsx?$/\n\n/**\n * Build the distribution files of a npm package.\n *\n * @example\n * ```ts\n * import {build} from '@sanity/pkg-utils'\n *\n * build({\n * cwd: process.cwd(),\n * tsconfig: 'tsconfig.dist.json,\n * }).then(() => {\n * console.log('successfully built')\n * }).catch((err) => {\n * console.log(`build error: ${err.message}`)\n * })\n * ```\n *\n * @public\n */\nexport async function build(options: {\n cwd: string\n emitDeclarationOnly?: boolean\n strict?: boolean\n tsconfig?: string\n clean?: boolean\n quiet?: boolean\n}): Promise<void> {\n const {\n cwd,\n emitDeclarationOnly,\n strict = false,\n tsconfig: tsconfigOption,\n // `--no-clean` skips cleaning for this run; `true` (the CLI default — `--clean` still\n // parses as a no-op for v11 compatibility) defers to the `clean` config option\n clean = true,\n quiet = false,\n } = options\n const logger = createLogger(quiet)\n\n const pkgPath = findPkgPath({cwd})\n if (!pkgPath) {\n throw new Error('no package.json found', {cause: {cwd}})\n }\n const config = await loadConfig({cwd, pkgPath})\n\n const {parseStrictOptions} = await import('./strict.ts')\n const strictOptions = parseStrictOptions(config?.strictOptions ?? {})\n const pkg = await loadPkgWithReporting({pkgPath, logger, strict, strictOptions})\n\n const tsconfig = tsconfigOption || config?.tsconfig || 'tsconfig.json'\n\n const ctx = await resolveBuildContext({\n config,\n cwd,\n emitDeclarationOnly,\n logger,\n pkg,\n strict,\n tsconfig,\n })\n\n warnAboutTsdownConfigFiles(cwd, logger)\n\n const builds = resolveTsdownBuilds(ctx)\n\n let first = true\n for (const buildDef of builds) {\n // A types-only run skips builds without TypeScript sources entirely\n if (\n ctx.emitDeclarationOnly &&\n !buildDef.entries.some((entry) => RE_TS_SOURCE.test(entry.source))\n ) {\n continue\n }\n\n const taskName = buildTaskName(buildDef)\n const spinner = createSpinner(taskName, quiet)\n\n try {\n const inlineConfig = await resolveTsdownConfig(ctx, buildDef, {clean: first && clean})\n first = false\n\n const bundles = await tsdownBuild(inlineConfig)\n\n if (ctx.emitDeclarationOnly) {\n // `dts.emitDtsOnly` suppresses the JS chunks of the ES pass, but the CJS pass emits\n // its JS regardless (only its extra dts pass runs the dts plugin) — a types-only\n // build removes everything that is not a declaration file\n removeNonDeclarationOutputs(bundles)\n }\n\n if (buildDef.canonical) {\n restoreAuthoredTypes(ctx)\n }\n\n spinner.complete()\n ctx.logger.log()\n\n printBuildOutputs(ctx, bundles, buildDef)\n ctx.logger.log()\n } catch (err) {\n spinner.error()\n\n if (err instanceof Error) {\n const RE_CWD = new RegExp(escapeRegExp(cwd), 'g')\n\n ctx.logger.error((err.stack || err.message).replace(RE_CWD, '.'))\n ctx.logger.log()\n }\n\n process.exit(1)\n }\n }\n}\n\nfunction buildTaskName(buildDef: TsdownBuildDef): string {\n const formats = Array.from(new Set(buildDef.entries.flatMap((entry) => entry.formats)))\n return `build ${buildDef.key} (${formats.join(', ') || 'types'})`\n}\n\nconst RE_DTS_OUTPUT = /\\.d\\.[mc]?ts(\\.map)?$/\n\n/** Removes every emitted file that is not a declaration file (or its sourcemap). */\nfunction removeNonDeclarationOutputs(bundles: TsdownBundle[]): void {\n for (const bundle of bundles) {\n for (const chunk of bundle.chunks) {\n if (RE_DTS_OUTPUT.test(chunk.fileName)) continue\n rmSync(path.join(chunk.outDir, chunk.fileName), {force: true})\n rmSync(path.join(chunk.outDir, `${chunk.fileName}.map`), {force: true})\n }\n }\n}\n\n/**\n * Prints `<pkg>: <source> → <output>` for every entry chunk (JS and `.d.ts`) that tsdown\n * emitted, mirroring the per-file output of previous majors.\n */\nfunction printBuildOutputs(\n ctx: {\n cwd: string\n distPath: string\n emitDeclarationOnly: boolean\n logger: Logger\n pkg: {name: string}\n },\n bundles: TsdownBundle[],\n buildDef: TsdownBuildDef,\n): void {\n const {cwd, logger, pkg} = ctx\n const lines = new Set<string>()\n\n // Stylesheets are emitted as assets, which carry no `facadeModuleId` back to their source,\n // so the stylesheet build's lines come from its entry map instead.\n if (buildDef.css) {\n for (const entry of buildDef.entries) {\n const output = `./${path\n .relative(cwd, path.join(ctx.distPath, `${entry.alias}.css`))\n .replaceAll('\\\\', '/')}`\n lines.add(\n `${pkg.name}: ./${path.relative(cwd, path.resolve(cwd, entry.source)).replaceAll('\\\\', '/')} \\u2192 ${output}`,\n )\n }\n }\n\n for (const bundle of bundles) {\n for (const chunk of bundle.chunks) {\n if (chunk.type !== 'chunk' || !chunk.isEntry || !chunk.facadeModuleId) continue\n if (ctx.emitDeclarationOnly && !RE_DTS_OUTPUT.test(chunk.fileName)) continue\n const source = `./${path\n .relative(cwd, chunk.facadeModuleId)\n .replaceAll('\\\\', '/')\n // the dts chunks facade the fake `.d.ts` module ids of rolldown-plugin-dts; print the\n // actual `.ts` source instead\n .replace(/\\.d\\.([mc]?)ts$/, '.$1ts')}`\n const output = `./${path\n .relative(cwd, path.join(chunk.outDir, chunk.fileName))\n .replaceAll('\\\\', '/')}`\n lines.add(`${pkg.name}: ${source} \\u2192 ${output}`)\n }\n }\n\n for (const line of Array.from(lines).toSorted()) {\n logger.log(line)\n }\n}\n\n/**\n * tsdown's exports generation rewrites the top-level `types` field alongside `main`/`module`\n * when the `legacy` fields are maintained, preferring the CJS declarations (`.d.cts`) for\n * dual-format packages. The hand-written value is authoritative here (the Sanity convention\n * points `types` at the ESM `.d.ts`), so it is restored after the canonical build.\n */\nfunction restoreAuthoredTypes(ctx: {cwd: string; pkg: {types?: string | undefined}}): void {\n const authoredTypes = ctx.pkg.types\n if (!authoredTypes) return\n\n const pkgPath = path.resolve(ctx.cwd, 'package.json')\n let text: string\n try {\n text = readFileSync(pkgPath, 'utf8')\n } catch {\n return\n }\n const json: unknown = JSON.parse(text)\n if (!isRecord(json) || json['types'] === authoredTypes) return\n json['types'] = authoredTypes\n\n const indent = /^([ \\t]+)\\S/m.exec(text)?.[1] ?? 2\n let output = JSON.stringify(json, null, indent)\n if (text.endsWith('\\n')) output += '\\n'\n writeFileSync(pkgPath, output, 'utf8')\n}\n\n/**\n * pkg-utils owns its own experience: `tsdown.config.*` files are never loaded in pkg-utils\n * mode (`package.config.ts` is the sole config source), so their presence is worth a warning.\n */\nfunction warnAboutTsdownConfigFiles(cwd: string, logger: Logger): void {\n const candidates = [\n 'tsdown.config.ts',\n 'tsdown.config.mts',\n 'tsdown.config.cts',\n 'tsdown.config.js',\n 'tsdown.config.mjs',\n 'tsdown.config.cjs',\n 'tsdown.config.json',\n ]\n const found = candidates.find((candidate) => existsSync(path.resolve(cwd, candidate)))\n if (found) {\n logger.warn(\n `found \\`${found}\\`, which @sanity/pkg-utils does not load — \\`package.config.ts\\` is the only config source of \\`pkg build\\`. Either migrate the package fully to tsdown (and drop @sanity/pkg-utils), or move the configuration into \\`package.config.ts\\`.`,\n )\n }\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n","import {build} from '../node/build.ts'\nimport {handleError} from './handleError.ts'\n\nexport async function buildAction(options: {\n emitDeclarationOnly?: boolean\n strict?: boolean\n tsconfig?: string\n clean?: boolean\n quiet?: boolean\n}): Promise<void> {\n try {\n await build({\n cwd: process.cwd(),\n emitDeclarationOnly: options.emitDeclarationOnly,\n strict: options.strict,\n tsconfig: options.tsconfig,\n clean: options.clean,\n quiet: options.quiet,\n })\n } catch (err) {\n handleError(err)\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolveBuildContext-vVTRkIDl.js","names":["typoMap","extMap","isTruthy","resolvePath"],"sources":["../src/node/core/config/findConfigFile.ts","../src/node/core/config/legacyConfig.ts","../src/node/core/config/loadConfig.ts","../src/node/core/pkg/dependencyPlacement.ts","../src/node/core/pkg/helpers.ts","../src/node/core/pkg/validatePkg.ts","../src/node/core/pkg/loadPkg.ts","../src/node/core/pkg/loadPkgWithReporting.ts","../src/node/core/config/resolveConfigProperty.ts","../src/node/core/defaults.ts","../src/node/core/findCommonPath.ts","../src/node/core/pkg/pkgExt.ts","../src/node/core/pkg/validateExports.ts","../src/node/core/pkg/parseAndValidateExports.ts","../src/node/core/ts/loadTSConfig.ts","../src/node/resolveBrowserTarget.ts","../src/node/resolveNodeTarget.ts","../src/node/strict.ts","../src/node/resolveBuildContext.ts"],"sourcesContent":["import path from 'node:path'\nimport findConfig from 'find-config'\nimport {fileExists} from '../../fileExists.ts'\n\nconst CONFIG_FILE_NAMES = [\n 'package.config.ts',\n 'package.config.js',\n 'package.config.cjs',\n 'package.config.mts',\n 'package.config.mjs',\n]\n\n/** @internal */\nexport function findConfigFile(cwd: string): string | undefined {\n const pkgJsonPath = findConfig('package.json', {cwd})\n\n if (!pkgJsonPath) return undefined\n\n const pkgPath = path.dirname(pkgJsonPath)\n\n for (const fileName of CONFIG_FILE_NAMES) {\n const configPath = path.resolve(pkgPath, fileName)\n\n const exists = fileExists(configPath)\n\n if (exists) {\n return configPath\n }\n }\n\n return undefined\n}\n","/**\n * Migration checks for `package.config.ts` options that were removed or deprecated in v12,\n * when `@sanity/pkg-utils` moved from its rollup/rolldown stack onto `tsdown` +\n * `@sanity/tsdown-config`.\n *\n * Removed options are \"tombstoned\": they stay declared on `PkgConfigOptions` (typed `never`,\n * tagged `@deprecated`) so editors surface the migration path, and the checks below throw a\n * runtime error with copy-pasteable migration instructions when they are set anyway — JS\n * configs bypass the types, and the error text is written to be actionable for humans and\n * agents alike.\n *\n * The checks are gated by the `legacyChecks` option, defaulting to on outside production\n * builds (`process.env.NODE_ENV !== 'production'`) so they add no overhead where migration\n * mistakes can no longer surface.\n */\n\nconst MIGRATION_GUIDE_URL =\n 'https://github.com/sanity-io/pkg-utils/blob/main/packages/@sanity/pkg-utils/MIGRATE.md'\n\ninterface LegacyCheck {\n option: string\n migration: string[]\n}\n\nconst tombstones: LegacyCheck[] = [\n {\n option: 'tsgo',\n migration: [\n 'The `dts` option is now passed through to tsdown as-is. Move the flag into it:',\n '',\n ' // package.config.ts',\n ' export default defineConfig({',\n ' dts: {tsgo: true},',\n ' })',\n ],\n },\n {\n option: 'extract',\n migration: [\n 'TSDoc/release-tag checking is configured with the top-level `tsdoc` option:',\n '',\n ' // extract: {enabled: false} -> tsdoc: false',\n ' // extract: {rules: {...}} -> tsdoc: {rules: {...}}',\n ' // extract: {customTags: [...]} -> tsdoc: {customTags: [...]}',\n '',\n 'Type inlining (`extract.bundledPackages`) follows the bundling decisions now:',\n 'devDependencies that are imported are inlined automatically (types included), and',\n '`deps: {alwaysBundle: [...]}` forces inlining a dependency/peerDependency.',\n '',\n '`extract.checkTypes` has no successor: type generation no longer type-checks',\n '(run `tsc --noEmit` for type checking).',\n ],\n },\n {\n option: 'babel',\n migration: [\n 'The Babel options moved to the top level:',\n '',\n ' // babel: {reactCompiler: true} -> reactCompiler: true',\n ' // babel: {styledComponents: true} -> styledComponents: true',\n '',\n '`styledComponents` now uses oxc\\u2019s native port of `babel-plugin-styled-components`,',\n 'so `babel-plugin-styled-components` can be uninstalled.',\n '',\n 'Custom Babel plugins (`babel.plugins`) run through the `plugins` option instead,',\n 'with a self-installed `@rolldown/plugin-babel`:',\n '',\n ' import pluginBabel from \"@rolldown/plugin-babel\"',\n ' export default defineConfig({',\n ' plugins: [await pluginBabel({plugins: [\"babel-plugin-example\"]})],',\n ' })',\n ],\n },\n {\n option: 'rollup',\n migration: [\n 'The rollup stack was replaced with tsdown:',\n '',\n ' // rollup: {vanillaExtract: true} -> vanillaExtract: true',\n ' // rollup: {plugins: [...]} -> plugins: [...] (rolldown plugins; most',\n ' // Rollup plugins are compatible)',\n '',\n '`rollup.output`, `rollup.treeshake`, `rollup.experimentalLogSideEffects` and',\n '`rollup.hashChunkFileNames` have no successor (chunk filenames are content-hashed now).',\n '',\n '`rollup.optimizeLodash` has no successor either \\u2014 and neither does the implicit',\n 'lodash-import optimization that was applied whenever `lodash` was a dependency.',\n 'Preferably drop lodash altogether (see https://e18e.dev for module replacements like',\n '`es-toolkit`), or import from `lodash-es`, which tree-shakes in consumers without',\n 'build-time rewriting.',\n ],\n },\n {\n option: 'reactCompilerOptions',\n migration: [\n 'Pass the compiler options to `reactCompiler` instead:',\n '',\n ' // babel: {reactCompiler: true}, reactCompilerOptions: {target: \"18\"}',\n ' // becomes:',\n ' reactCompiler: {target: \"18\"}',\n ],\n },\n {\n option: 'jsx',\n migration: [\n 'Configure JSX through `tsconfig.json` \\u2014 the bundler reads it from there:',\n '',\n ' // tsconfig.json',\n ' {\"compilerOptions\": {\"jsx\": \"react-jsx\"}}',\n ],\n },\n {\n option: 'jsxFactory',\n migration: ['Configure JSX through `tsconfig.json` (`compilerOptions.jsxFactory`).'],\n },\n {\n option: 'jsxFragment',\n migration: ['Configure JSX through `tsconfig.json` (`compilerOptions.jsxFragmentFactory`).'],\n },\n {\n option: 'jsxImportSource',\n migration: ['Configure JSX through `tsconfig.json` (`compilerOptions.jsxImportSource`).'],\n },\n]\n\n/**\n * Throws for tombstoned options and warns for grandfathered ones. `config` is the raw loaded\n * config object (before it is narrowed to `PkgConfigOptions`), so removed options are still\n * observable.\n * @internal\n */\nexport function runLegacyConfigChecks(config: Record<string, unknown>): void {\n const legacyChecks =\n typeof config['legacyChecks'] === 'boolean'\n ? config['legacyChecks']\n : process.env['NODE_ENV'] !== 'production'\n\n if (!legacyChecks) return\n\n for (const {option, migration} of tombstones) {\n if (config[option] === undefined) continue\n\n throw new Error(\n [\n `package.config.ts: the \\`${option}\\` option was removed in @sanity/pkg-utils v12.`,\n '',\n ...migration,\n '',\n `Full migration guide: ${MIGRATION_GUIDE_URL}`,\n 'Set `legacyChecks: false` in package.config.ts to skip this validation (it is also',\n 'skipped when NODE_ENV=production).',\n ].join('\\n'),\n )\n }\n\n // `dts` survived, but as a tsdown passthrough object — the old mode strings are tombstoned\n // with value-specific migration instructions.\n const dts = config['dts']\n if (typeof dts === 'string') {\n throw new Error(\n [\n `package.config.ts: \\`dts: '${dts}'\\` was removed in @sanity/pkg-utils v12 — the \\`dts\\``,\n 'option is now passed through to tsdown as-is (an options object, or `false`).',\n '',\n ...(dts === 'rolldown'\n ? [\n \"`dts: 'rolldown'` is the default behavior now: delete the option. Options that\",\n 'accompanied it move into the object, e.g. `tsgo: true` becomes `dts: {tsgo: true}`.',\n ]\n : [\n \"`dts: 'api-extractor'` type generation was removed. Types are generated with\",\n 'tsdown (rolldown-plugin-dts); api-extractor remains as the TSDoc/release-tag',\n 'checking that runs during `pkg build`/`pkg check` — configure it with the',\n '`tsdoc` option.',\n ]),\n '',\n `Full migration guide: ${MIGRATION_GUIDE_URL}`,\n 'Set `legacyChecks: false` in package.config.ts to skip this validation (it is also',\n 'skipped when NODE_ENV=production).',\n ].join('\\n'),\n )\n }\n\n // Grandfathered: `inject: {nodeCompat: true}` still works (it means\n // `{inject: true, exports: {nodeCompat: true}}`), with a nudge toward its successor. The\n // option configures how the CSS file is published, not how the import is injected.\n for (const option of ['vanillaExtract', 'css'] as const) {\n const value = config[option]\n if (typeof value !== 'object' || value === null) continue\n // oxlint-disable-next-line no-unsafe-type-assertion\n const inject = (value as {inject?: unknown}).inject\n if (typeof inject !== 'object' || inject === null) continue\n // oxlint-disable-next-line no-unsafe-type-assertion\n if ((inject as {nodeCompat?: unknown}).nodeCompat === undefined) continue\n // eslint-disable-next-line no-console -- config-load-time deprecation warning\n console.warn(\n [\n `package.config.ts: \\`${option}.inject.nodeCompat\\` is deprecated. Use`,\n `\\`${option}: {inject: true, exports: {nodeCompat: true}}\\` instead — \\`nodeCompat\\``,\n 'configures the package exports, not the injected import.',\n ].join('\\n'),\n )\n }\n\n // Grandfathered: `external` still works (mapped onto tsdown's `deps`), with a nudge toward\n // its successor.\n if (config['external'] !== undefined) {\n // eslint-disable-next-line no-console -- config-load-time deprecation warning\n console.warn(\n [\n 'package.config.ts: `external` is deprecated. Use `deps: {neverBundle: [...]}` to mark',\n 'dependencies as external, and `deps: {alwaysBundle: [...]}` to bundle a dependency',\n '(the callback pattern that filtered entries out of the defaults).',\n ].join('\\n'),\n )\n }\n}\n","import path from 'node:path'\nimport {pathToFileURL} from 'node:url'\nimport {tsImport} from 'tsx/esm/api'\nimport {findConfigFile} from './findConfigFile.ts'\nimport {runLegacyConfigChecks} from './legacyConfig.ts'\nimport type {PkgConfigOptions} from './types.ts'\n\n/** @alpha */\nexport async function loadConfig(options: {\n cwd: string\n pkgPath: string\n}): Promise<PkgConfigOptions | undefined> {\n const {cwd, pkgPath} = options\n\n const root = path.dirname(pkgPath)\n\n const configFile = findConfigFile(root)\n\n if (!configFile) {\n return undefined\n }\n\n // Do not accept config files outside of the root\n if (!configFile.startsWith(cwd)) {\n return undefined\n }\n\n const mod = await tsImport(pathToFileURL(configFile).toString(), import.meta.url)\n\n const config = mod?.default || mod || undefined\n\n if (config && typeof config === 'object') {\n runLegacyConfigChecks(config)\n }\n\n return config\n}\n","import type {PackageJSON} from '@sanity/parse-package-json'\nimport type {Logger} from '../../logger.ts'\nimport type {StrictOptions} from '../../strict.ts'\n\n/**\n * The `package.json` fields a dependency placement rule can reference.\n */\ntype DependencyField = 'dependencies' | 'devDependencies' | 'peerDependencies'\n\n/**\n * Describes where a given package may, and may not, be declared in `package.json`.\n */\ninterface DependencyPlacementRule {\n /** The name of the package this rule applies to. */\n name: string\n /** The `strictOptions` toggle that controls whether this rule runs. */\n option: keyof StrictOptions\n /** Fields the package must _not_ be declared in. */\n disallowedIn: DependencyField[]\n /** Fields the package is allowed to be declared in (used for messaging). */\n allowedIn: DependencyField[]\n /**\n * When set and the package is declared in `peerDependencies`, the version range must be\n * exactly this value (e.g. `*` for `@types/*` packages).\n */\n requiredPeerVersion?: string\n}\n\n/**\n * The set of dependency placement rules enforced in `--strict` mode.\n */\nconst dependencyPlacementRules: DependencyPlacementRule[] = [\n {\n name: 'react-is',\n option: 'noReactIsPeerDependency',\n disallowedIn: ['peerDependencies'],\n allowedIn: ['dependencies', 'devDependencies'],\n },\n {\n name: '@sanity/ui',\n option: 'noSanityUiPeerDependency',\n disallowedIn: ['peerDependencies'],\n allowedIn: ['dependencies', 'devDependencies'],\n },\n {\n name: '@sanity/icons',\n option: 'noSanityIconsPeerDependency',\n disallowedIn: ['peerDependencies'],\n allowedIn: ['dependencies', 'devDependencies'],\n },\n {\n name: 'sanity',\n option: 'noSanityDependency',\n disallowedIn: ['dependencies'],\n allowedIn: ['devDependencies', 'peerDependencies'],\n },\n {\n name: 'styled-components',\n option: 'noStyledComponentsDependency',\n disallowedIn: ['dependencies'],\n allowedIn: ['devDependencies', 'peerDependencies'],\n },\n {\n name: 'react',\n option: 'noReactDependency',\n disallowedIn: ['dependencies'],\n allowedIn: ['devDependencies', 'peerDependencies'],\n },\n {\n name: 'react-dom',\n option: 'noReactDomDependency',\n disallowedIn: ['dependencies'],\n allowedIn: ['devDependencies', 'peerDependencies'],\n },\n {\n name: '@types/react',\n option: 'noReactTypesDependency',\n disallowedIn: ['dependencies'],\n allowedIn: ['devDependencies', 'peerDependencies'],\n requiredPeerVersion: '*',\n },\n {\n name: '@types/react-dom',\n option: 'noReactDomTypesDependency',\n disallowedIn: ['dependencies'],\n allowedIn: ['devDependencies', 'peerDependencies'],\n requiredPeerVersion: '*',\n },\n {\n name: '@types/node',\n option: 'noNodeTypesDependency',\n disallowedIn: ['dependencies'],\n allowedIn: ['devDependencies', 'peerDependencies'],\n requiredPeerVersion: '*',\n },\n {\n name: 'rxjs',\n option: 'noRxjsPeerDependency',\n disallowedIn: ['peerDependencies'],\n allowedIn: ['dependencies', 'devDependencies'],\n },\n {\n name: '@sanity/client',\n option: 'noSanityClientPeerDependency',\n disallowedIn: ['peerDependencies'],\n allowedIn: ['dependencies', 'devDependencies'],\n },\n]\n\nfunction formatFields(fields: DependencyField[]): string {\n const labels = fields.map((field) => `\\`${field}\\``)\n\n if (labels.length <= 1) {\n return labels.join('')\n }\n\n return `${labels.slice(0, -1).join(', ')} or ${labels[labels.length - 1]}`\n}\n\n/**\n * Validates that well-known packages are declared in the correct `package.json` dependency\n * fields. Returns `true` if any rule with severity `error` was violated.\n * @internal\n */\nexport function checkDependencyPlacement(options: {\n pkg: PackageJSON\n logger: Logger\n strictOptions: StrictOptions\n}): boolean {\n const {pkg, logger, strictOptions} = options\n let shouldError = false\n\n const report = (level: 'error' | 'warn', message: string) => {\n if (level === 'error') {\n shouldError = true\n logger.error(message)\n } else {\n logger.warn(message)\n }\n }\n\n for (const rule of dependencyPlacementRules) {\n const level = strictOptions[rule.option]\n\n if (level === 'off') {\n continue\n }\n\n for (const field of rule.disallowedIn) {\n if (Object.hasOwn(pkg[field] ?? {}, rule.name)) {\n report(\n level,\n `package.json: \\`${rule.name}\\` should not be in \\`${field}\\`. It should be in ${formatFields(\n rule.allowedIn,\n )} instead.`,\n )\n }\n }\n\n if (rule.requiredPeerVersion !== undefined) {\n const peerDependencies = pkg.peerDependencies ?? {}\n\n if (\n Object.hasOwn(peerDependencies, rule.name) &&\n peerDependencies[rule.name] !== rule.requiredPeerVersion\n ) {\n report(\n level,\n `package.json: \\`${rule.name}\\` in \\`peerDependencies\\` should be set to \"${rule.requiredPeerVersion}\" (got \"${peerDependencies[rule.name]}\").`,\n )\n }\n }\n }\n\n return shouldError\n}\n","/** @internal */\nexport function assertLast<T>(a: T, arr: T[]): boolean {\n const aIdx = arr.indexOf(a)\n\n // if not found, then we don't care\n if (aIdx === -1) {\n return true\n }\n\n return aIdx === arr.length - 1\n}\n\n/** @internal */\nexport function assertOrder<T>(a: T, b: T, arr: T[]): boolean {\n const aIdx = arr.indexOf(a)\n const bIdx = arr.indexOf(b)\n\n // if either is not found, then we don't care\n if (aIdx === -1 || bIdx === -1) {\n return true\n }\n\n return aIdx < bIdx\n}\n","import {parsePackage, _typoMap as typoMap, type PackageJSON} from '@sanity/parse-package-json'\n\nexport function validatePkg(input: unknown): PackageJSON {\n const pkg = parsePackage(input)\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Need to check raw input for typos\n const invalidKey = Object.keys(input as PackageJSON).find((key) => {\n const needle = key.toUpperCase()\n\n return typoMap.has(needle) ? typoMap.get(needle) !== key : false\n })\n\n if (invalidKey) {\n throw new TypeError(\n `\n- package.json: \"${invalidKey}\" is not a valid key. Did you mean \"${typoMap.get(invalidKey.toUpperCase())}\"?`,\n )\n }\n\n return pkg\n}\n","import fs from 'node:fs/promises'\nimport type {PackageJSON} from '@sanity/parse-package-json'\nimport {validatePkg} from './validatePkg.ts'\n\n/** @internal */\nexport async function loadPkg(options: {pkgPath: string}): Promise<PackageJSON> {\n const {pkgPath} = options\n\n const raw = JSON.parse(await fs.readFile(pkgPath, 'utf-8'))\n\n validatePkg(raw)\n\n return raw\n}\n","import {ZodError, type PackageJSON} from '@sanity/parse-package-json'\nimport chalk from 'chalk'\nimport type {Logger} from '../../logger.ts'\nimport type {StrictOptions} from '../../strict.ts'\nimport {checkDependencyPlacement} from './dependencyPlacement.ts'\nimport {assertLast, assertOrder} from './helpers.ts'\nimport {loadPkg} from './loadPkg.ts'\n\n/** The conditions that only resolve before publishing, and are stripped from the publish map. */\nconst devConditions = new Set(['source', 'development', 'monorepo'])\n\n/**\n * A nested runtime condition (`node`, `browser`) may be condensed to a plain string when `default`\n * is the only condition left once the dev-only ones are stripped: the resolver treats\n * `\"node\": \"./dist/index.node.js\"` and `\"node\": {\"default\": \"./dist/index.node.js\"}` identically.\n * This is the same condensation `publishConfig.exports[\"<subpath>\"]` itself allows at entry level.\n */\nfunction condenseExportValue(value: unknown): unknown {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return value\n\n const conditions = Object.entries(value).filter(([condition]) => !devConditions.has(condition))\n const [first] = conditions\n\n if (conditions.length === 1 && first?.[0] === 'default' && typeof first[1] === 'string') {\n return first[1]\n }\n\n return value\n}\n\n/**\n * Helper function to recursively compare export values, excluding source, development, and monorepo conditions\n */\nfunction areExportValuesEqual(input1: unknown, input2: unknown): boolean {\n const value1 = condenseExportValue(input1)\n const value2 = condenseExportValue(input2)\n\n // If both are strings, simple comparison\n if (typeof value1 === 'string' && typeof value2 === 'string') {\n return value1 === value2\n }\n\n // If types don't match, they're not equal\n if (typeof value1 !== typeof value2) {\n return false\n }\n\n // Both are objects, compare recursively\n if (\n typeof value1 === 'object' &&\n value1 !== null &&\n typeof value2 === 'object' &&\n value2 !== null &&\n !Array.isArray(value1) &&\n !Array.isArray(value2)\n ) {\n const obj1 = value1 as Record<string, any>\n const obj2 = value2 as Record<string, any>\n\n const keys1 = Object.keys(obj1).filter((k) => !devConditions.has(k))\n const keys2 = Object.keys(obj2).filter((k) => !devConditions.has(k))\n\n // Check if they have the same keys\n if (keys1.length !== keys2.length) {\n return false\n }\n\n for (const key of keys1) {\n if (!keys2.includes(key)) {\n return false\n }\n\n const val1 = obj1[key]\n const val2 = obj2[key]\n\n // Skip if either value is undefined\n if (val1 === undefined || val2 === undefined) {\n return false\n }\n\n // Recursively compare nested values\n if (!areExportValuesEqual(val1, val2)) {\n return false\n }\n }\n\n return true\n }\n\n return false\n}\n\n/** @alpha */\nexport async function loadPkgWithReporting(options: {\n pkgPath: string\n logger: Logger\n strict: boolean\n strictOptions: StrictOptions\n}): Promise<PackageJSON> {\n const {pkgPath, logger, strict, strictOptions} = options\n\n try {\n const pkg = await loadPkg({pkgPath})\n let shouldError = false\n\n if (strict) {\n // Check for missing or commonjs type field\n if (strictOptions.preferModuleType !== 'off') {\n if (!pkg.type) {\n const msg =\n 'package.json: `type` field is missing. Future versions of pkg-utils will require `\"type\": \"module\"`. Consider adding `\"type\": \"module\"` to prepare for this change.'\n if (strictOptions.preferModuleType === 'error') {\n shouldError = true\n logger.error(msg)\n } else {\n logger.warn(msg)\n }\n } else if (pkg.type === 'commonjs') {\n const msg =\n 'package.json: `type` is set to \"commonjs\". Future versions of pkg-utils will require `\"type\": \"module\"`. Consider migrating to ES modules to prepare for this change.'\n if (strictOptions.preferModuleType === 'error') {\n shouldError = true\n logger.error(msg)\n } else {\n logger.warn(msg)\n }\n }\n }\n\n // Check for banned root-level fields\n if (strictOptions.noPackageJsonBrowser !== 'off' && pkg.browser) {\n const msg =\n 'package.json: the `browser` field is no longer needed. Use the `browser` condition in `exports` instead for better support across modern bundlers.'\n if (strictOptions.noPackageJsonBrowser === 'error') {\n shouldError = true\n logger.error(msg)\n } else {\n logger.warn(msg)\n }\n }\n\n if (strictOptions.noPackageJsonTypesVersions !== 'off' && pkg.typesVersions) {\n const msg =\n 'package.json: the `typesVersions` field is no longer needed. TypeScript has long supported conditional exports and the `types` condition. Remove the `typesVersions` field and use the `types` condition in `exports` instead.'\n if (strictOptions.noPackageJsonTypesVersions === 'error') {\n shouldError = true\n logger.error(msg)\n } else {\n logger.warn(msg)\n }\n }\n\n // Check that well-known packages are declared in the correct dependency fields\n if (checkDependencyPlacement({pkg, logger, strictOptions})) {\n shouldError = true\n }\n }\n\n // validate exports\n if (pkg.exports) {\n const _exports = Object.entries(pkg.exports)\n\n for (const [expPath, exp] of _exports) {\n // Skip plain string exports, svelte exports, and conditional CSS exports (a flat\n // condition -> path map at a `.css` subpath); none of these use standard export conditions.\n if (typeof exp === 'string' || expPath.endsWith('.css') || 'svelte' in exp) {\n continue\n }\n\n const keys = Object.keys(exp)\n\n if (exp.types) {\n shouldError = true\n logger.error(\n `exports[\"${expPath}\"]: the \\`types\\` condition shouldn't be used as dts files are generated in such a way that both CJS and ESM is supported`,\n )\n }\n\n if (exp.module) {\n shouldError = true\n logger.error(\n `exports[\"${expPath}\"]: the \\`module\\` condition shouldn't be used as it's not well supported in all bundlers.`,\n )\n }\n\n if (exp.development && exp.source && exp.development !== exp.source) {\n shouldError = true\n logger.error(\n `exports[\"${expPath}\"]: the \\`development\\` condition must have the same value as \\`source\\` when both are present. Expected \"${exp.source}\" but got \"${exp.development}\"`,\n )\n }\n\n if (exp.monorepo && exp.source && exp.monorepo !== exp.source) {\n shouldError = true\n logger.error(\n `exports[\"${expPath}\"]: the \\`monorepo\\` condition must have the same value as \\`source\\` when both are present. Expected \"${exp.source}\" but got \"${exp.monorepo}\"`,\n )\n }\n\n if (exp.node) {\n if (exp.import && exp.node.import && !assertOrder('node', 'import', keys)) {\n shouldError = true\n logger.error(\n `exports[\"${expPath}\"]: the \\`node\\` property should come before the \\`import\\` property`,\n )\n }\n\n if (exp.node.module) {\n shouldError = true\n logger.error(\n `exports[\"${expPath}\"]: the \\`node.module\\` condition shouldn't be used as it's not well supported in all bundlers. A better strategy is to refactor the codebase to no longer be vulnerable to the \"dual package hazard\"`,\n )\n }\n\n if (\n !exp.node.source &&\n exp.node.import &&\n (exp.node.require || exp.require) &&\n (exp.node.import.endsWith('.cjs.js') || exp.node.import.endsWith('.cjs.mjs'))\n ) {\n shouldError = true\n logger.error(\n `exports[\"${expPath}\"]: the \\`node.import\\` re-export pattern shouldn't be used as it's not well supported in all bundlers. A better strategy is to refactor the codebase to no longer be vulnerable to the \"dual package hazard\"`,\n )\n }\n\n if (exp.require && exp.node.require && exp.require === exp.node.require) {\n shouldError = true\n logger.error(\n `exports[\"${expPath}\"]: the \\`node.require\\` property isn't necessary as it's identical to \\`require\\``,\n )\n } else if (exp.require && exp.node.require && !assertOrder('node', 'require', keys)) {\n shouldError = true\n logger.error(\n `exports[\"${expPath}\"]: the \\`node\\` property should come before the \\`require\\` property`,\n )\n }\n } else {\n if (!assertOrder('import', 'require', keys)) {\n logger.warn(\n `exports[\"${expPath}\"]: the \\`import\\` property should come before the \\`require\\` property`,\n )\n }\n }\n\n if (!assertLast('default', keys)) {\n shouldError = true\n logger.error(\n `exports[\"${expPath}\"]: the \\`default\\` property should be the last property`,\n )\n }\n }\n }\n\n // validate publishConfig.exports\n if (strict && pkg.exports && Object.keys(pkg.exports).length > 0) {\n // Check if exports contains source, development, or monorepo conditions\n const hasSourceOrDevelopment = Object.entries(pkg.exports).some(([, exp]) => {\n if (typeof exp === 'string') return false\n if (typeof exp === 'object' && 'svelte' in exp) return false\n return Boolean(exp.source || exp.development || exp.monorepo)\n })\n\n if (hasSourceOrDevelopment) {\n if (!pkg.publishConfig?.exports) {\n const msg =\n 'package.json: `publishConfig.exports` is missing. Adding it helps avoid publishing to npm with the `source`, `development`, or `monorepo` condition that points to code that cannot be used by the resolver. ' +\n 'See https://tsdown.dev/options/package-exports#dev-exports for more information.'\n if (strictOptions.noPublishConfigExports === 'error') {\n shouldError = true\n logger.error(msg)\n } else if (strictOptions.noPublishConfigExports !== 'off') {\n logger.warn(msg)\n }\n } else {\n // Validate publishConfig.exports structure\n const publishExports = pkg.publishConfig.exports\n\n // A `.css` subpath with a `source` is a stylesheet built by the CSS pipeline, which\n // fills the subpath into both maps. Until the first build runs, `exports` holds\n // nothing but the `source` the author wrote and `publishConfig.exports` holds\n // nothing at all — the documented way to declare one — so it is exempt from the\n // cross-map checks below.\n const isBuiltCssExport = (exportPath: string): boolean => {\n if (!exportPath.endsWith('.css')) return false\n const exp = pkg.exports?.[exportPath]\n return typeof exp === 'object' && exp !== null && 'source' in exp\n }\n\n // Check that all keys in exports exist in publishConfig.exports\n for (const exportPath of Object.keys(pkg.exports)) {\n if (!(exportPath in publishExports) && !isBuiltCssExport(exportPath)) {\n shouldError = true\n logger.error(\n `publishConfig.exports: missing export path \"${exportPath}\" that exists in exports`,\n )\n }\n }\n\n // Check that all keys in publishConfig.exports exist in exports\n for (const exportPath of Object.keys(publishExports)) {\n if (!(exportPath in pkg.exports)) {\n shouldError = true\n logger.error(\n `publishConfig.exports: unexpected export path \"${exportPath}\" that does not exist in exports`,\n )\n }\n }\n\n // Validate each export path\n for (const [exportPath, exp] of Object.entries(pkg.exports)) {\n if (isBuiltCssExport(exportPath)) continue\n if (typeof exp === 'string' || 'svelte' in exp) {\n // For string or svelte exports, publishConfig should match\n const publishExp = publishExports[exportPath]\n if (\n typeof publishExp !== 'string' &&\n (typeof publishExp !== 'object' || !('svelte' in publishExp))\n ) {\n shouldError = true\n logger.error(\n `publishConfig.exports[\"${exportPath}\"]: should be a string matching exports[\"${exportPath}\"]`,\n )\n }\n continue\n }\n\n const publishExp = publishExports[exportPath]\n if (!publishExp) {\n continue\n }\n if (typeof publishExp === 'string') {\n // publishConfig has a string, validate it's correct\n // It should be a condensed form when only default remains after removing source/development/monorepo\n const conditions = Object.keys(exp).filter(\n (k) => k !== 'source' && k !== 'development' && k !== 'monorepo',\n )\n if (conditions.length !== 1 || conditions[0] !== 'default') {\n shouldError = true\n logger.error(\n `publishConfig.exports[\"${exportPath}\"]: is a string but exports[\"${exportPath}\"] has multiple conditions besides source/development/monorepo: ${conditions.join(', ')}`,\n )\n } else {\n // Validate that the string value matches the default condition value\n const expectedValue = exp.default\n if (publishExp !== expectedValue) {\n shouldError = true\n logger.error(\n `publishConfig.exports[\"${exportPath}\"]: should be \"${expectedValue}\" but got \"${publishExp}\"`,\n )\n }\n }\n continue\n }\n\n if ('svelte' in publishExp) {\n continue\n }\n\n // Validate conditions\n const exportConditions = Object.keys(exp).filter(\n (k) => k !== 'source' && k !== 'development' && k !== 'monorepo',\n )\n const publishConditions = Object.keys(publishExp)\n\n // Check for source, development, or monorepo in publishConfig\n if ('source' in publishExp) {\n shouldError = true\n logger.error(\n `publishConfig.exports[\"${exportPath}\"]: should not contain the \\`source\\` condition`,\n )\n }\n\n if ('development' in publishExp) {\n shouldError = true\n logger.error(\n `publishConfig.exports[\"${exportPath}\"]: should not contain the \\`development\\` condition`,\n )\n }\n\n if ('monorepo' in publishExp) {\n shouldError = true\n logger.error(\n `publishConfig.exports[\"${exportPath}\"]: should not contain the \\`monorepo\\` condition`,\n )\n }\n\n // Check that all conditions match (except source/development/monorepo)\n for (const condition of exportConditions) {\n if (!(condition in publishExp)) {\n shouldError = true\n logger.error(\n `publishConfig.exports[\"${exportPath}\"]: missing \\`${condition}\\` condition that exists in exports[\"${exportPath}\"]`,\n )\n }\n }\n\n for (const condition of publishConditions) {\n if (!exportConditions.includes(condition)) {\n shouldError = true\n logger.error(\n `publishConfig.exports[\"${exportPath}\"]: unexpected \\`${condition}\\` condition that does not exist in exports[\"${exportPath}\"]`,\n )\n }\n }\n\n // Validate that values match for all conditions\n for (const condition of exportConditions) {\n if (condition in publishExp) {\n const exportValue = (exp as Record<string, unknown>)[condition]\n const publishValue = (publishExp as Record<string, unknown>)[condition]\n\n // Compare values recursively for nested objects\n if (!areExportValuesEqual(exportValue, publishValue)) {\n const exportValueStr =\n typeof exportValue === 'string' ? exportValue : JSON.stringify(exportValue)\n const publishValueStr =\n typeof publishValue === 'string' ? publishValue : JSON.stringify(publishValue)\n shouldError = true\n logger.error(\n `publishConfig.exports[\"${exportPath}\"].${condition}: should be ${exportValueStr} but got ${publishValueStr}`,\n )\n }\n }\n }\n }\n }\n }\n }\n\n if (shouldError) {\n process.exit(1)\n }\n\n return pkg\n } catch (err) {\n if (err instanceof ZodError) {\n for (const issue of err.issues) {\n if (issue.code === 'invalid_type') {\n logger.error(\n [\n `\\`${formatPath(issue.path)}\\` `,\n `in \\`./package.json\\` must be of type ${chalk.magenta(issue.expected)} `,\n `(received ${chalk.magenta(issue.received)})`,\n ].join(''),\n )\n continue\n }\n\n // Every other issue carries its own message: report it against the path it was found at,\n // rather than dumping the raw issue object.\n logger.error(\n issue.path.length\n ? `\\`${formatPath(issue.path)}\\` in \\`./package.json\\` is invalid: ${issue.message}`\n : `\\`./package.json\\` is invalid: ${issue.message}`,\n )\n }\n } else {\n logger.error(err)\n }\n\n return process.exit(1)\n }\n}\n\nfunction formatPath(segments: Array<string | number>) {\n return segments\n .map((s, idx) => {\n if (idx === 0) return s\n\n if (typeof s === 'number') {\n return `[${s}]`\n }\n\n if (s.startsWith('.')) {\n return `[\"${s}\"]`\n }\n\n return `.${s}`\n })\n .join('')\n}\n","import type {PkgConfigProperty, PkgConfigPropertyResolver} from './types.ts'\n\nfunction isPkgConfigPropertyResolver<T>(\n prop: PkgConfigProperty<T>,\n): prop is PkgConfigPropertyResolver<T> {\n return typeof prop === 'function'\n}\n\n/** @internal */\nexport function resolveConfigProperty<T>(\n prop: PkgConfigProperty<T> | undefined,\n initialValue: T,\n): T {\n if (!prop) return initialValue\n\n if (isPkgConfigPropertyResolver(prop)) {\n return prop(initialValue)\n }\n\n return prop\n}\n","import config from '@sanity/browserslist-config'\n\n/** @public */\nexport const DEFAULT_BROWSERSLIST_QUERY: string[] = config\n","import path from 'node:path'\n\nexport function pathContains(containerPath: string, itemPath: string): boolean {\n return !path.relative(containerPath, itemPath).startsWith('..')\n}\n\nexport function findCommonDirPath(filePaths: string[]): string | undefined {\n let ret: string | undefined = undefined\n\n for (const filePath of filePaths) {\n let dirPath = path.dirname(filePath)\n\n if (!ret) {\n ret = dirPath\n continue\n }\n\n while (dirPath !== ret) {\n if (pathContains(dirPath, ret)) {\n ret = dirPath\n break\n }\n\n dirPath = path.dirname(dirPath)\n\n if (dirPath === ret) {\n break\n }\n\n if (dirPath === '.') return undefined\n }\n }\n\n return ret\n}\n","/** Matches the JS output file endings pkg-utils emits (`.js`, `.mjs`, `.cjs`). @internal */\nexport const fileEnding: RegExp = /\\.[mc]?js$/\n/** @internal */\nexport const defaultEnding = '.js'\nconst mjsEnding = '.mjs'\nconst cjsEnding = '.cjs'\n\n/** @internal */\nexport interface PkgExtMap {\n commonjs: {commonjs: string; esm: string}\n module: {commonjs: string; esm: string}\n}\n\n/** @internal */\nexport const pkgExtMap: PkgExtMap = {\n // pkg.type: \"commonjs\"\n commonjs: {\n commonjs: defaultEnding,\n esm: mjsEnding,\n },\n\n // pkg.type: \"module\"\n module: {\n commonjs: cjsEnding,\n esm: defaultEnding,\n },\n}\n","import type {PackageJSON} from '@sanity/parse-package-json'\nimport type {PkgExport} from '../config/types.ts'\nimport {pkgExtMap as extMap} from './pkgExt.ts'\n\nexport function validateExports(\n _exports: (PkgExport & {_path: string})[],\n options: {pkg: PackageJSON},\n): string[] {\n const {pkg} = options\n const type = pkg.type || 'commonjs'\n const ext = extMap[type]\n\n const errors: string[] = []\n\n for (const exp of _exports) {\n if (exp._path === '.') {\n if (exp.require && pkg.main && exp.require !== pkg.main) {\n errors.push(\n 'package.json: mismatch between \"main\" and \"exports.require\". These must be equal.',\n )\n }\n\n if (exp.import && pkg.module && exp.import !== pkg.module) {\n errors.push(\n 'package.json: mismatch between \"module\" and \"exports.import\". These must be equal.',\n )\n }\n }\n if (exp.require && !exp.require.endsWith(ext.commonjs)) {\n errors.push(\n `package.json with \\`type: \"${type}\"\\` - \\`exports[\"${exp._path}\"].require\\` must end with \"${ext.commonjs}\"`,\n )\n }\n\n if (exp.import && !exp.import.endsWith(ext.esm)) {\n errors.push(\n `package.json with \\`type: \"${type}\"\\` - \\`exports[\"${exp._path}\"].import\\` must end with \"${ext.esm}\"`,\n )\n }\n }\n\n return errors\n}\n","import {existsSync} from 'node:fs'\nimport {resolve as resolvePath} from 'node:path'\nimport {parseExports, type PackageJSON} from '@sanity/parse-package-json'\nimport type {Logger} from '../../logger.ts'\nimport type {StrictOptions} from '../../strict.ts'\nimport type {PkgExport} from '../config/types.ts'\nimport {isRecord} from '../isRecord.ts'\nimport {defaultEnding, fileEnding, pkgExtMap} from './pkgExt.ts'\nimport {validateExports} from './validateExports.ts'\n\n// Type guard to filter out falsy values\nfunction isTruthy<T>(value: T | false | null | undefined | 0 | ''): value is T {\n return Boolean(value)\n}\n\n/** @alpha */\nexport function parseAndValidateExports(options: {\n cwd: string\n pkg: PackageJSON\n strict: boolean\n strictOptions: StrictOptions\n logger: Logger\n}): (PkgExport & {_path: string})[] {\n const {cwd, pkg, strict, strictOptions, logger} = options\n const type = pkg.type || 'commonjs'\n const errors: string[] = []\n\n const report = (kind: 'warn' | 'error', message: string) => {\n if (kind === 'warn') {\n logger.warn(message)\n } else {\n errors.push(message)\n }\n }\n\n if (!Array.isArray(pkg.files) && strict && strictOptions.alwaysPackageJsonFiles !== 'off') {\n report(\n strictOptions.alwaysPackageJsonFiles,\n 'package.json: `files` should be used over `.npmignore`',\n )\n }\n\n if (pkg.source) {\n if (\n strict &&\n pkg.exports?.['.'] &&\n typeof pkg.exports['.'] === 'object' &&\n 'source' in pkg.exports['.'] &&\n pkg.exports['.'].source === pkg.source\n ) {\n errors.push(\n 'package.json: the \"source\" property can be removed, as it is equal to exports[\".\"].source.',\n )\n } else if (!pkg.exports && pkg.main) {\n const extMap = pkgExtMap[type]\n const importExport = pkg.main.replace(fileEnding, extMap.esm)\n const requireExport = pkg.main.replace(fileEnding, extMap.commonjs)\n const defaultExport = pkg.main.replace(fileEnding, defaultEnding)\n\n const maybeBrowserCondition = []\n\n if (pkg.browser) {\n const browserConditions = []\n\n if (pkg.module && pkg.browser?.[pkg.module]) {\n browserConditions.push(\n ` \"import\": ${JSON.stringify(pkg.browser[pkg.module]!.replace(fileEnding, extMap.esm))}`,\n )\n } else if (pkg.browser?.[pkg.main]) {\n browserConditions.push(\n ` \"import\": ${JSON.stringify(pkg.browser[pkg.main]!.replace(fileEnding, extMap.esm))}`,\n )\n }\n\n if (pkg.browser?.[pkg.main]) {\n browserConditions.push(\n ` \"require\": ${JSON.stringify(pkg.browser[pkg.main]!.replace(fileEnding, extMap.commonjs))}`,\n )\n }\n\n if (browserConditions.length) {\n maybeBrowserCondition.push(\n ` \"browser\": {`,\n ` \"source\": ${JSON.stringify(pkg.browser?.[pkg.source] || pkg.source)},`,\n ...browserConditions,\n ` }`,\n )\n }\n }\n\n errors.push(\n ...[\n 'package.json: `exports` are missing, it should be:',\n `\"exports\": {`,\n ` \".\": {`,\n ` \"source\": ${JSON.stringify(pkg.source)},`,\n // If browser conditions are detected then add them to the suggestion\n ...(maybeBrowserCondition.length > 0 ? maybeBrowserCondition : []),\n type === 'commonjs' && ` \"import\": ${JSON.stringify(importExport)},`,\n type === 'module' && ` \"require\": ${JSON.stringify(requireExport)},`,\n ` \"default\": ${JSON.stringify(defaultExport)}`,\n ` },`,\n ` \"./package.json\": \"./package.json\"`,\n `}`,\n ].filter(isTruthy),\n )\n }\n }\n\n if (errors.length) {\n throw new Error('\\n- ' + errors.join('\\n- '))\n }\n\n if (!pkg.exports) {\n throw new Error(\n '\\n- ' +\n [\n 'package.json: `exports` are missing, please set a minimal configuration, for example:',\n `\"exports\": {`,\n ` \".\": {`,\n ` \"source\": \"./src/index.js\",`,\n ` \"default\": \"./dist/index.js\"`,\n ` },`,\n ` \"./package.json\": \"./package.json\"`,\n `}`,\n ].join('\\n- '),\n )\n }\n\n const _exports = parseExports({pkg})\n\n if (strict && strictOptions.noPackageJsonTypings !== 'off' && 'typings' in pkg) {\n report(strictOptions.noPackageJsonTypings, 'package.json: `typings` should be `types`')\n }\n\n if (\n strict &&\n strictOptions.alwaysPackageJsonTypes !== 'off' &&\n !pkg.types &&\n typeof pkg.exports?.['.'] === 'object' &&\n 'source' in pkg.exports['.'] &&\n pkg.exports['.'].source?.endsWith('.ts')\n ) {\n report(\n strictOptions.alwaysPackageJsonTypes,\n 'package.json: `types` must be declared for the npm listing to show as a TypeScript module.',\n )\n }\n\n if (strict && !pkg.exports['./package.json']) {\n errors.push('package.json: `exports[\"./package.json\"] must be declared.')\n }\n\n for (const [exportPath, exportEntry] of Object.entries(pkg.exports)) {\n if (\n exportPath.endsWith('.json') ||\n (typeof exportEntry === 'string' && exportEntry.endsWith('.json'))\n ) {\n if (exportPath === './package.json') {\n if (exportEntry !== './package.json') {\n errors.push('package.json: `exports[\"./package.json\"]` must be \"./package.json\".')\n }\n }\n } else if (exportPath.endsWith('.css')) {\n if (typeof exportEntry === 'string') {\n if (!existsSync(resolvePath(cwd, exportEntry))) {\n errors.push(\n `package.json: \\`exports[${JSON.stringify(exportPath)}]\\`: file does not exist.`,\n )\n }\n } else if (isRecord(exportEntry)) {\n // Conditional CSS export, e.g.\n // \"./bundle.css\": { \"types\": \"./dist/bundle-css.d.ts\", \"browser\": \"./dist/bundle.css\", \"node\": \"./dist/bundle-css.js\", \"default\": \"./dist/bundle-css.js\" }\n // This lets a package re-add a `import \"<pkg>/bundle.css\"` that resolves to the real CSS in\n // bundler/browser environments and to a no-op JS shim in CSS-unaware runtimes (e.g. Node).\n // Only the shape is validated here: the targets usually point at generated `dist` files that\n // do not exist yet at validation time, so file existence is intentionally not checked.\n for (const [condition, target] of Object.entries(exportEntry)) {\n if (typeof target !== 'string') {\n errors.push(\n `package.json: \\`exports[${JSON.stringify(exportPath)}][${JSON.stringify(condition)}]\\`: must be a string path.`,\n )\n continue\n }\n // With a `source`, the subpath is a build entry: the stylesheet is compiled by the\n // CSS pipeline, so unlike the generated conditions the source has to exist now.\n if (condition === 'source' && !existsSync(resolvePath(cwd, target))) {\n errors.push(\n `package.json: \\`exports[${JSON.stringify(exportPath)}].source\\`: file does not exist.`,\n )\n }\n }\n } else {\n errors.push(\n `package.json: \\`exports[${JSON.stringify(exportPath)}]\\`: must be a string path or an object of export conditions.`,\n )\n }\n } else if (isRecord(exportEntry) && 'svelte' in exportEntry) {\n // @TODO should we report a warning or a debug message here about a detected svelte export that is ignored?\n } else if (isPkgExport(exportEntry)) {\n const exp = {\n _exported: true,\n _path: exportPath,\n ...exportEntry,\n } satisfies PkgExport & {_path: string}\n\n // Infer the `default` condition based on the `type` and other conditions\n if (!exp.default) {\n const fallback = type === 'module' ? exp.import : exp.require\n\n if (fallback) {\n exp.default = fallback\n }\n }\n\n // Infer the `require` condition based on the `type` and other conditions\n if (!exp.require && type === 'commonjs' && exp.default) {\n exp.require = exp.default\n }\n\n // Infer the `import` condition based on the `type` and other conditions\n if (!exp.import && type === 'module' && exp.default) {\n exp.import = exp.default\n }\n\n if (exportPath === '.') {\n if (exportEntry.require && pkg.main && exportEntry.require !== pkg.main) {\n errors.push(\n 'package.json: mismatch between \"main\" and \"exports.require\". These must be equal.',\n )\n }\n\n if (exportEntry.import && pkg.module && exportEntry.import !== pkg.module) {\n errors.push(\n 'package.json: mismatch between \"module\" and \"exports.import\" These must be equal.',\n )\n }\n }\n } else if (!isRecord(exportEntry)) {\n errors.push('package.json: exports must be an object')\n }\n }\n\n errors.push(...validateExports(_exports, {pkg}))\n\n if (errors.length) {\n throw new Error('\\n- ' + errors.join('\\n- '))\n }\n\n return _exports\n}\n\nfunction isPkgExport(value: unknown): value is PkgExport {\n return isRecord(value) && 'source' in value && typeof value['source'] === 'string'\n}\n","// The JS compiler API is loaded from the official `@typescript/typescript6` compat package\n// instead of the `typescript` peer dependency, as TypeScript 7 (the Go-native compiler) no longer\n// ships it\nimport ts from '@typescript/typescript6'\n\n/** @internal */\nexport async function loadTSConfig(options: {\n cwd: string\n tsconfigPath: string\n}): Promise<ReturnType<typeof ts.parseJsonConfigFileContent> | undefined> {\n const {cwd, tsconfigPath} = options\n\n // oxlint-disable-next-line unbound-method\n const configPath = ts.findConfigFile(cwd, ts.sys.fileExists, tsconfigPath)\n\n if (!configPath) {\n return undefined\n }\n\n // oxlint-disable-next-line unbound-method\n const configFile = ts.readConfigFile(configPath, ts.sys.readFile)\n\n return ts.parseJsonConfigFileContent(configFile.config, ts.sys, cwd)\n}\n","export function resolveBrowserTarget(versions: string[]): string[] | undefined {\n const target: string[] = versions.filter(\n (version) =>\n version.startsWith('chrome') ||\n version.startsWith('edge') ||\n version.startsWith('firefox') ||\n version.startsWith('ios') ||\n version.startsWith('safari') ||\n version.startsWith('opera'),\n )\n\n if (target.length === 0) {\n return undefined\n }\n\n return target\n}\n","export function resolveNodeTarget(versions: string[]): string[] | undefined {\n const target: string[] = versions.filter((version) => version.startsWith('node'))\n\n if (target.length === 0) {\n return undefined\n }\n\n return target\n}\n","import {errorMap} from 'zod-validation-error/v3'\nimport {z} from 'zod/v3'\n\nconst toggle = z.union([z.literal('error'), z.literal('warn'), z.literal('off')])\n\ntype ToggleType = 'error' | 'warn' | 'off'\n\nconst strictOptions = z\n .object({\n noPackageJsonTypings: toggle.default('error'),\n noImplicitSideEffects: toggle.default('warn'),\n noImplicitBrowsersList: toggle.default('warn'),\n alwaysPackageJsonTypes: toggle.default('error'),\n alwaysPackageJsonFiles: toggle.default('error'),\n noCheckTypes: toggle.default('warn'),\n noPackageJsonBrowser: toggle.default('warn'),\n noPackageJsonTypesVersions: toggle.default('warn'),\n preferModuleType: toggle.default('warn'),\n noPublishConfigExports: toggle.default('warn'),\n noReactIsPeerDependency: toggle.default('error'),\n noSanityUiPeerDependency: toggle.default('error'),\n noSanityIconsPeerDependency: toggle.default('error'),\n noSanityDependency: toggle.default('error'),\n noStyledComponentsDependency: toggle.default('error'),\n noReactDependency: toggle.default('error'),\n noReactDomDependency: toggle.default('error'),\n noReactTypesDependency: toggle.default('error'),\n noReactDomTypesDependency: toggle.default('error'),\n noNodeTypesDependency: toggle.default('error'),\n noRxjsPeerDependency: toggle.default('error'),\n noSanityClientPeerDependency: toggle.default('error'),\n })\n .strict()\n\n/**\n * To make error message paths line up with the paths in package.config.ts the schema is hoisted into a root schema\n * This way errors will say `Expected boolean, received string at \"strict.noPackageJsonTypings\"` instead of `Expected boolean, received string at \"noPackageJsonTypings\"`.\n */\nconst validationSchema = z.object({\n strictOptions: strictOptions.default({}),\n})\n\n/**\n * @public\n */\nexport interface StrictOptions {\n /**\n * Disallows a top level `typings` field in `package.json` if it is equal to `exports['.'].source`.\n * @defaultValue 'error'\n */\n noPackageJsonTypings: ToggleType\n /**\n * Requires specifying `sideEffects` in `package.json`.\n * @defaultValue 'warn'\n */\n noImplicitSideEffects: ToggleType\n /**\n * Requires specifying `browserslist` in `package.json`, instead of relying on it implicitly being:\n * @example\n * ```\n * \"browserslist\": \"extends @sanity/browserslist-config\"\n * ```\n * @defaultValue 'warn'\n */\n noImplicitBrowsersList: ToggleType\n /**\n * If typescript is used then `types` in `package.json` should be specified for npm listings to show the TS icon.\n * @defaultValue 'error'\n */\n alwaysPackageJsonTypes: ToggleType\n /**\n * Using `.npmignore` is error prone, it's best practice to always declare `files` instead\n * @defaultValue 'error'\n */\n alwaysPackageJsonFiles: ToggleType\n /**\n * It's slow to perform type checking while generating dts files, so it's best practice to disable it with a `\"noCheck\": true` in the tsconfig.json file used by `package.config.ts`\n * @defaultValue 'warn'\n */\n noCheckTypes: ToggleType\n /**\n * Disallows the `browser` field in `package.json` as the `browser` condition in `exports` is better supported.\n * @defaultValue 'warn'\n */\n noPackageJsonBrowser: ToggleType\n /**\n * Disallows the `typesVersions` field in `package.json` as TypeScript has long supported conditional exports and the `types` condition.\n * @defaultValue 'warn'\n */\n noPackageJsonTypesVersions: ToggleType\n /**\n * Warns if `type` field is missing or set to `commonjs`. Future versions will require `\"type\": \"module\"`.\n * @defaultValue 'warn'\n */\n preferModuleType: ToggleType\n /**\n * Warns if `publishConfig.exports` is missing when `source`, `development`, or `monorepo` conditions are used in exports.\n * @defaultValue 'warn'\n */\n noPublishConfigExports: ToggleType\n /**\n * Disallows `react-is` in `peerDependencies`. It should be in `dependencies` (or `devDependencies`) instead.\n * @defaultValue 'error'\n */\n noReactIsPeerDependency: ToggleType\n /**\n * Disallows `@sanity/ui` in `peerDependencies`. It should be in `dependencies` (or `devDependencies`) instead.\n * @defaultValue 'error'\n */\n noSanityUiPeerDependency: ToggleType\n /**\n * Disallows `@sanity/icons` in `peerDependencies`. It should be in `dependencies` (or `devDependencies`) instead.\n * @defaultValue 'error'\n */\n noSanityIconsPeerDependency: ToggleType\n /**\n * Disallows `sanity` in `dependencies`. It should only be in `devDependencies` and/or `peerDependencies`.\n * @defaultValue 'error'\n */\n noSanityDependency: ToggleType\n /**\n * Disallows `styled-components` in `dependencies`. It should only be in `devDependencies` and/or `peerDependencies`.\n * @defaultValue 'error'\n */\n noStyledComponentsDependency: ToggleType\n /**\n * Disallows `react` in `dependencies`. It should only be in `devDependencies` and/or `peerDependencies`.\n * @defaultValue 'error'\n */\n noReactDependency: ToggleType\n /**\n * Disallows `react-dom` in `dependencies`. It should only be in `devDependencies` and/or `peerDependencies`.\n * @defaultValue 'error'\n */\n noReactDomDependency: ToggleType\n /**\n * Disallows `@types/react` in `dependencies`. It should only be in `devDependencies` and/or `peerDependencies`, and when declared as a peer dependency the version range should be `*`.\n * @defaultValue 'error'\n */\n noReactTypesDependency: ToggleType\n /**\n * Disallows `@types/react-dom` in `dependencies`. It should only be in `devDependencies` and/or `peerDependencies`, and when declared as a peer dependency the version range should be `*`.\n * @defaultValue 'error'\n */\n noReactDomTypesDependency: ToggleType\n /**\n * Disallows `@types/node` in `dependencies`. It should only be in `devDependencies` and/or `peerDependencies`, and when declared as a peer dependency the version range should be `*`.\n * @defaultValue 'error'\n */\n noNodeTypesDependency: ToggleType\n /**\n * Disallows `rxjs` in `peerDependencies`. It should only be in `dependencies` and/or `devDependencies`.\n * @defaultValue 'error'\n */\n noRxjsPeerDependency: ToggleType\n /**\n * Disallows `@sanity/client` in `peerDependencies`. It should only be in `dependencies` and/or `devDependencies`.\n * @defaultValue 'error'\n */\n noSanityClientPeerDependency: ToggleType\n}\n\n/** @alpha */\nexport function parseStrictOptions(input: unknown): StrictOptions {\n return validationSchema.parse({strictOptions: input}, {errorMap}).strictOptions\n}\n","import path from 'node:path'\nimport {parseCssExports, type PackageJSON} from '@sanity/parse-package-json'\nimport browserslistToEsbuild from 'browserslist-to-esbuild'\nimport {resolveConfigProperty} from './core/config/resolveConfigProperty.ts'\nimport {type PkgConfigOptions, type PkgExports, type PkgRuntime} from './core/config/types.ts'\nimport type {BuildContext} from './core/contexts/buildContext.ts'\nimport {DEFAULT_BROWSERSLIST_QUERY} from './core/defaults.ts'\nimport {findCommonDirPath, pathContains} from './core/findCommonPath.ts'\nimport {parseAndValidateExports} from './core/pkg/parseAndValidateExports.ts'\nimport {loadTSConfig} from './core/ts/loadTSConfig.ts'\nimport type {Logger} from './logger.ts'\nimport {resolveBrowserTarget} from './resolveBrowserTarget.ts'\nimport {resolveNodeTarget} from './resolveNodeTarget.ts'\nimport {parseStrictOptions} from './strict.ts'\n\n// Type guard to filter out falsy values\nfunction isTruthy<T>(value: T | false | null | undefined | 0 | ''): value is T {\n return Boolean(value)\n}\n\nexport async function resolveBuildContext(options: {\n config?: PkgConfigOptions | undefined\n cwd: string\n emitDeclarationOnly?: boolean\n logger: Logger\n pkg: PackageJSON\n strict: boolean\n tsconfig: string\n}): Promise<BuildContext> {\n const {\n config,\n cwd,\n emitDeclarationOnly = false,\n logger,\n pkg,\n strict,\n tsconfig: tsconfigPath,\n } = options\n const tsconfig = await loadTSConfig({cwd, tsconfigPath})\n const strictOptions = parseStrictOptions(config?.strictOptions ?? {})\n\n let browserslist = pkg.browserslist\n if (!browserslist) {\n if (strict && strictOptions.noImplicitBrowsersList !== 'off') {\n if (strictOptions.noImplicitBrowsersList === 'error') {\n throw new Error(\n '\\n- ' +\n `package.json: \"browserslist\" is missing, set it to \\`\"browserslist\": \"extends @sanity/browserslist-config\"\\``,\n )\n } else {\n logger.warn(\n 'Could not detect a `browserslist` property in `package.json`, using default configuration. Add `\"browserslist\": \"extends @sanity/browserslist-config\"` to silence this warning.',\n )\n }\n }\n browserslist = DEFAULT_BROWSERSLIST_QUERY\n }\n const targetVersions = browserslistToEsbuild(browserslist)\n\n if (\n strict &&\n strictOptions.noImplicitSideEffects !== 'off' &&\n typeof pkg.sideEffects === 'undefined'\n ) {\n const msg =\n 'package.json: `sideEffects` is missing, see https://webpack.js.org/guides/tree-shaking/#clarifying-tree-shaking-and-sideeffects for how to define `sideEffects`'\n\n if (strictOptions.noImplicitSideEffects === 'error') {\n throw new Error(msg)\n } else {\n logger.warn(msg)\n }\n }\n\n const nodeTarget = resolveNodeTarget(targetVersions)\n const webTarget = resolveBrowserTarget(targetVersions)\n\n if (!nodeTarget) {\n throw new Error('no matching `node` target')\n }\n\n if (!webTarget) {\n throw new Error('no matching `web` target')\n }\n\n const target: Record<PkgRuntime, string[]> = {\n '*': webTarget.concat(nodeTarget),\n 'browser': webTarget,\n 'node': nodeTarget,\n }\n\n const parsedExports = parseAndValidateExports({\n cwd,\n pkg,\n strict,\n strictOptions,\n logger,\n }).reduce<PkgExports>(\n (acc, {_path: exportPath, ...exportEntry}) => Object.assign(acc, {[exportPath]: exportEntry}),\n {},\n )\n\n const exports = resolveConfigProperty(config?.exports, parsedExports)\n\n const cssExports = parseCssExports({pkg})\n\n const parsedExternal = [\n ...(pkg.dependencies ? Object.keys(pkg.dependencies) : []),\n ...(pkg.peerDependencies ? Object.keys(pkg.peerDependencies) : []),\n ]\n\n // The deprecated (grandfathered) `external` option: merge if an array, replace if a function\n const external =\n config && Array.isArray(config.external)\n ? [...parsedExternal, ...config.external]\n : resolveConfigProperty(config?.external, parsedExternal)\n\n // Map `external` onto tsdown's `deps`: additions over the default (dependencies + peers)\n // become `neverBundle`, defaults filtered out by the callback pattern become `alwaysBundle`\n // (tsdown auto-externalizes dependencies/peers, so only the diff needs expressing). The v11\n // `external` semantics were subpath-aware (`name` also matched `name/subpath`), so package\n // names map to `^name(/|$)` patterns. The package's own name always stays external, so\n // self-referencing imports (e.g. the injected `import \"<pkg>/bundle.css\"`) never resolve\n // into the bundle.\n const packagePattern = (name: string) => new RegExp(`^${escapeRegExp(name)}(/|$)`)\n const neverBundleAdditions: (string | RegExp)[] = external\n .filter((name) => !parsedExternal.includes(name))\n .map(packagePattern)\n neverBundleAdditions.push(packagePattern(pkg.name))\n const alwaysBundleNames = parsedExternal.filter((name) => !external.includes(name))\n const deps = mergeDeps(config?.deps, {\n neverBundle: neverBundleAdditions,\n alwaysBundle: alwaysBundleNames.map(packagePattern),\n })\n\n // Packages whose types are inlined into the emitted declarations, used by the TSDoc check\n // (`tsdoc.bundledPackages`): devDependencies that are not external (like v11), plus any\n // string entries of the `deps.alwaysBundle` passthrough (force-bundled deps inline types too).\n const externalWithTypes = new Set([pkg.name, ...external, ...external.map(transformPackageName)])\n const bundledDependencies = (pkg.devDependencies ? Object.keys(pkg.devDependencies) : []).filter(\n // Do not bundle anything that is marked as external\n (_) => !externalWithTypes.has(_),\n )\n const bundledPackages = [\n ...bundledDependencies,\n ...alwaysBundleNames,\n ...(Array.isArray(config?.deps?.alwaysBundle)\n ? config.deps.alwaysBundle.filter((entry): entry is string => typeof entry === 'string')\n : typeof config?.deps?.alwaysBundle === 'string'\n ? [config.deps.alwaysBundle]\n : []),\n ]\n\n const outputPaths = Object.values(exports)\n .flatMap((exportEntry) => {\n return [\n exportEntry.import,\n exportEntry.require,\n exportEntry.browser?.import,\n exportEntry.browser?.require,\n exportEntry.browser?.default,\n exportEntry.node?.source && exportEntry.node.import,\n exportEntry.node?.source && exportEntry.node.require,\n exportEntry.node?.default,\n ].filter(isTruthy)\n })\n .map((p) => path.resolve(cwd, p))\n\n const commonDistPath = findCommonDirPath(outputPaths)\n\n if (commonDistPath === cwd) {\n throw new Error(\n 'all output files must share a common parent directory which is not the root package directory',\n )\n }\n\n if (commonDistPath && !pathContains(cwd, commonDistPath)) {\n throw new Error('all output files must be located within the package')\n }\n\n const configDistPath = config?.dist ? path.resolve(cwd, config.dist) : undefined\n\n if (\n configDistPath &&\n commonDistPath &&\n configDistPath !== commonDistPath &&\n !pathContains(configDistPath, commonDistPath)\n ) {\n logger.log(`did you mean to configure \\`dist: './${path.relative(cwd, commonDistPath)}'\\`?`)\n\n throw new Error('all output files must be located with the configured `dist` path')\n }\n\n const distPath = configDistPath || commonDistPath\n\n if (!distPath) {\n throw new Error('could not detect `dist` path')\n }\n\n const ctx: BuildContext = {\n config,\n cwd,\n deps,\n distPath,\n emitDeclarationOnly,\n exports,\n cssExports,\n external,\n bundledPackages,\n logger,\n pkg,\n runtime: config?.runtime ?? '*',\n strict,\n target,\n ts: {\n config: tsconfig,\n configPath: tsconfigPath,\n },\n }\n\n return ctx\n}\n\ntype DepsConfig = NonNullable<import('tsdown').UserConfig['deps']>\n\n/**\n * Merges the `deps` additions derived from the deprecated `external` option (and the\n * self-reference external) into the userland `deps` passthrough. Array forms concatenate, a\n * userland function is composed with the derived additions (the additions carry pipeline\n * invariants like the self-reference external, which must survive customization — the same\n * composition `@sanity/tsdown-config` applies to its `/^node:/` default), and a blanket\n * `true` (externalize all of `node_modules`) wins as the broadest request.\n * @internal Exported for tests.\n */\nexport function mergeDeps(\n configDeps: DepsConfig | undefined,\n additions: {neverBundle: (string | RegExp)[]; alwaysBundle: (string | RegExp)[]},\n): DepsConfig | undefined {\n const userNeverBundle = configDeps?.neverBundle\n let neverBundle: DepsConfig['neverBundle']\n if (userNeverBundle === undefined) {\n neverBundle = additions.neverBundle\n } else if (userNeverBundle === true) {\n neverBundle = userNeverBundle\n } else if (typeof userNeverBundle === 'function') {\n const patterns = additions.neverBundle\n neverBundle = (id, importer, isResolved) =>\n patterns.some((pattern) =>\n typeof pattern === 'string' ? pattern === id : pattern.test(id),\n ) || userNeverBundle(id, importer, isResolved)\n } else if (Array.isArray(userNeverBundle)) {\n neverBundle = [...additions.neverBundle, ...userNeverBundle]\n } else {\n neverBundle = [...additions.neverBundle, userNeverBundle]\n }\n\n const userAlwaysBundle = configDeps?.alwaysBundle\n let alwaysBundle: DepsConfig['alwaysBundle']\n if (userAlwaysBundle === undefined) {\n alwaysBundle = additions.alwaysBundle.length ? additions.alwaysBundle : undefined\n } else if (typeof userAlwaysBundle === 'function') {\n // A userland function wins over the derived additions\n alwaysBundle = userAlwaysBundle\n } else if (Array.isArray(userAlwaysBundle)) {\n alwaysBundle = [...additions.alwaysBundle, ...userAlwaysBundle]\n } else {\n alwaysBundle = [...additions.alwaysBundle, userAlwaysBundle]\n }\n\n const deps: DepsConfig = {\n ...configDeps,\n neverBundle,\n ...(alwaysBundle === undefined ? {} : {alwaysBundle}),\n }\n\n return deps\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction transformPackageName(packageName: string): string {\n if (packageName.startsWith('@types/')) {\n // If it already starts with @types, return it as is\n return packageName\n } else if (packageName.startsWith('@')) {\n // Handle scoped packages\n const [scope, name] = packageName.split('/')\n\n return `@types/${scope?.slice(1)}__${name}`\n } else {\n // Handle regular packages\n return `@types/${packageName}`\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"watchAction-IMdjLKl4.js","names":["findPkgPath","tsdownBuild"],"sources":["../src/node/core/pkg/cssExportOptions.ts","../src/node/watch.ts","../src/cli/watchAction.ts"],"sourcesContent":["import {isRecord} from '../isRecord.ts'\n\n/**\n * Whether a CSS pipeline's options wire up the conditional CSS export pattern — the no-op JS\n * shim, its declaration file, and the `\"./<fileName>\"` export whose `node`/`default` conditions\n * point at the shim.\n *\n * `pkg watch` needs this to decide which exports to maintain itself, because watch mode turns\n * tsdown's `exports` feature off. Full builds never ask: the plugins own the answer there.\n *\n * Only `exports` decides. `@sanity/tsdown-config` composes the plugin options as\n * `{inject: true, exports: {nodeCompat: true}, ...userOptions}`, so `exports` is always set by\n * the time `resolveCssExportOptions` sees them — a user-supplied `inject` never clears the\n * default. That makes the plugin's compatibility fallback for the deprecated\n * `inject: {nodeCompat: true}` spelling unreachable from here, and reading `inject` would get\n * `{inject: {nodeCompat: false}}` wrong: it still leaves the `exports` default in place, so the\n * conditional export is written.\n *\n * Kept in sync with `resolveCssExportOptions` in `@sanity/vanilla-extract-rolldown-plugin` —\n * the same reason `cssShimFileName` has a copy here. Importing the canonical one would make\n * `@sanity/vanilla-extract-tsdown-plugin` a static dependency of this module graph, pulling the\n * whole vanilla-extract toolchain into every `pkg build`.\n *\n * @internal\n */\nexport function usesCssExportNodeCompat(options: {exports?: unknown}): boolean {\n if (options.exports === undefined) {\n // `@sanity/tsdown-config`'s `exports: {nodeCompat: true}` default applies\n return true\n }\n return isRecord(options.exports) && options.exports['nodeCompat'] === true\n}\n","import {up as findPkgPath} from 'empathic/package'\nimport type {Subscription} from 'rxjs'\nimport {switchMap} from 'rxjs'\nimport {build as tsdownBuild, type TsdownBundle} from 'tsdown'\nimport {loadConfig} from './core/config/loadConfig.ts'\nimport {usesCssExportNodeCompat} from './core/pkg/cssExportOptions.ts'\nimport {loadPkgWithReporting} from './core/pkg/loadPkgWithReporting.ts'\nimport {writeBundleCssExports} from './core/pkg/writeBundleCssExports.ts'\nimport {createLogger} from './logger.ts'\nimport {resolveBuildContext} from './resolveBuildContext.ts'\nimport {resolveTsdownBuilds} from './tasks/tsdown/resolveTsdownBuilds.ts'\nimport {resolveTsdownConfig} from './tasks/tsdown/resolveTsdownConfig.ts'\n\nconst asyncDispose: typeof Symbol.asyncDispose =\n Symbol.asyncDispose || Symbol.for('Symbol.asyncDispose')\n\n/** @public */\nexport async function watch(options: {\n cwd: string\n strict?: boolean\n tsconfig?: string\n signal?: AbortSignal\n}): Promise<void> {\n const {cwd, strict = false, tsconfig: tsconfigOption, signal} = options\n\n const logger = createLogger()\n\n const {watchConfigFiles} = await import('./watchConfigFiles.ts')\n const configFiles$ = await watchConfigFiles({cwd, logger})\n\n // Every rebuild of the waterfall holds tsdown watchers (one per platform build); they are\n // disposed when the config files change (the waterfall restarts) or the signal aborts.\n // RxJS does not await async subscriber callbacks, so a monotonically increasing run id\n // guards the rebuilds: only the latest run may publish into `bundles`, and a run that turns\n // stale mid-flight (a newer config-file event, or the abort signal) disposes the watchers\n // it created instead of leaking them.\n let bundles: TsdownBundle[] = []\n let runId = 0\n const disposeBundles = async () => {\n const disposing = bundles\n bundles = []\n for (const bundle of disposing) {\n await bundle[asyncDispose]()\n }\n }\n\n const ctx$ = configFiles$.pipe(\n switchMap(async () => {\n const pkgPath = findPkgPath({cwd})\n if (!pkgPath) {\n throw new Error('missing package.json', {cause: {cwd}})\n }\n\n const config = await loadConfig({cwd, pkgPath})\n const {parseStrictOptions} = await import('./strict.ts')\n const strictOptions = parseStrictOptions(config?.strictOptions ?? {})\n const pkg = await loadPkgWithReporting({pkgPath, logger, strict, strictOptions})\n const tsconfig = tsconfigOption || config?.tsconfig || 'tsconfig.json'\n\n return resolveBuildContext({config, cwd, logger, pkg, strict, tsconfig})\n }),\n )\n\n const ctxSubscription: Subscription = ctx$.subscribe(async (ctx) => {\n const id = ++runId\n const runBundles: TsdownBundle[] = []\n try {\n await disposeBundles()\n\n // Full builds write the conditional `./<css>` export through tsdown's\n // `exports.customExports` composition, but watch mode disables tsdown's `exports` feature\n // (a package.json write per rebuild would loop the watcher). Keep the export in sync here\n // instead, once per context, like v11 — the write is idempotent, so it won't loop.\n const cssNames: string[] = []\n const cssSources: Record<string, string> = {}\n\n const vanillaExtract = ctx.config?.vanillaExtract\n if (vanillaExtract) {\n const veOptions = vanillaExtract === true ? {} : vanillaExtract\n if (usesCssExportNodeCompat(veOptions)) {\n cssNames.push(veOptions.fileName || 'bundle.css')\n }\n }\n\n // The `@tsdown/css` pipeline's own exports: the `.css` export subpaths built by the\n // stylesheet build. Their file names follow their subpath and a declared entry always\n // emits, so they are known up front. The merged `style.css` of CSS imported from JS is\n // not — it only exists once something actually imports CSS — so `resolveTsdownConfig`\n // declares that one from a `build:done` hook instead, matching what\n // `cssNodeCompatPlugin` declares in a full build.\n const cssConfig = ctx.config?.css\n const cssNodeCompat =\n (Boolean(cssConfig) || ctx.cssExports.length > 0) &&\n usesCssExportNodeCompat(cssConfig ?? {})\n if (cssNodeCompat) {\n for (const cssExport of ctx.cssExports) {\n cssNames.push(cssExport._path.replace(/^\\.\\//, ''))\n cssSources[cssExport._path] = cssExport.source\n }\n }\n\n await writeBundleCssExports({\n cwd,\n distPath: ctx.distPath,\n cssNames,\n sources: cssSources,\n logger,\n })\n\n const builds = resolveTsdownBuilds(ctx)\n\n let first = true\n for (const buildDef of builds) {\n if (id !== runId) break\n\n const inlineConfig = await resolveTsdownConfig(ctx, buildDef, {\n clean: first,\n watch: true,\n })\n first = false\n\n runBundles.push(...(await tsdownBuild(inlineConfig)))\n }\n\n if (id !== runId) {\n // A newer run (or the abort signal) took over while this rebuild was in flight —\n // dispose everything this run created instead of publishing it\n for (const bundle of runBundles) {\n await bundle[asyncDispose]()\n }\n return\n }\n\n bundles = runBundles\n\n logger.success(`${ctx.pkg.name}: watching for file changes\\u2026`)\n logger.log()\n } catch (err) {\n ctx.logger.error(err)\n ctx.logger.log()\n\n process.exit(1)\n }\n })\n\n if (signal) {\n signal.addEventListener(\n 'abort',\n () => {\n runId++\n ctxSubscription.unsubscribe()\n void disposeBundles()\n },\n {once: true},\n )\n }\n}\n","import {watch} from '../node/watch.ts'\nimport {handleError} from './handleError.ts'\n\nexport async function watchAction(options: {strict?: boolean; tsconfig?: string}): Promise<void> {\n try {\n await watch({\n cwd: process.cwd(),\n strict: options.strict,\n tsconfig: options.tsconfig,\n })\n } catch (err) {\n handleError(err)\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"watchConfigFiles-AGBDblwf.js","names":[],"sources":["../src/node/globFiles.ts","../src/node/watchFiles.ts","../src/node/watchConfigFiles.ts"],"sourcesContent":["import path from 'node:path'\nimport {globby} from 'globby'\n\nexport function globFiles(patterns: string[]): Promise<string[]> {\n return globby(patterns.map((pattern) => pattern.split(path.sep).join(path.posix.sep)))\n}\n","import * as chokidar from 'chokidar'\nimport type {EventName} from 'chokidar/handler.js'\nimport {Observable} from 'rxjs'\n\nexport interface FileEvent {\n type: EventName\n file: string\n}\n\nexport function watchFiles(patterns: string[]): Observable<FileEvent> {\n return new Observable((observer) => {\n const watcher = chokidar.watch(patterns, {\n ignoreInitial: true,\n })\n\n function handleFileEvent(type: EventName, file: string | Error) {\n if (type === 'error' || file instanceof Error) {\n observer.error(file)\n } else {\n observer.next({type, file})\n }\n }\n\n watcher.on('all', handleFileEvent)\n\n return () => {\n watcher.off('all', handleFileEvent)\n void watcher.close()\n }\n })\n}\n","import path from 'node:path'\nimport type {Observable} from 'rxjs'\nimport {distinctUntilChanged, scan, startWith} from 'rxjs/operators'\nimport {globFiles} from './globFiles.ts'\nimport type {Logger} from './logger.ts'\nimport {watchFiles} from './watchFiles.ts'\n\nexport async function watchConfigFiles(options: {\n cwd: string\n logger: Logger\n}): Promise<Observable<string[]>> {\n const {cwd, logger} = options\n\n const initialFiles = await globFiles([\n path.resolve(cwd, 'package.json'),\n path.resolve(cwd, 'package.config.cjs'),\n path.resolve(cwd, 'package.config.js'),\n path.resolve(cwd, 'package.config.ts'),\n path.resolve(cwd, 'package.config.mjs'),\n path.resolve(cwd, 'package.config.mts'),\n ])\n\n const fileEvent$ = watchFiles([\n path.resolve(cwd, 'package.json'),\n path.resolve(cwd, 'package.config.cjs'),\n path.resolve(cwd, 'package.config.js'),\n path.resolve(cwd, 'package.config.ts'),\n path.resolve(cwd, 'package.config.mjs'),\n path.resolve(cwd, 'package.config.mts'),\n ])\n\n return fileEvent$.pipe(\n scan((files, fileEvent) => {\n if (fileEvent.type === 'add') {\n return files.concat(fileEvent.file)\n }\n\n if (fileEvent.type === 'unlink') {\n return files.filter((f) => f !== fileEvent.file)\n }\n\n if (fileEvent.type === 'change') {\n logger.log(\n '--------------------------------------------------------------------------------',\n )\n logger.info(path.relative(cwd, fileEvent.file), 'changed')\n logger.log('')\n\n return files.slice(0) // trigger update\n }\n\n return files\n }, initialFiles),\n startWith(initialFiles),\n distinctUntilChanged(),\n )\n}\n"],"mappings":";;;;;AAGA,SAAgB,UAAU,UAAuC;CAC/D,OAAO,OAAO,SAAS,KAAK,YAAY,QAAQ,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,CAAC,CAAC;AACvF;ACIA,SAAgB,WAAW,UAA2C;CACpE,OAAO,IAAI,YAAY,aAAa;EAClC,IAAM,UAAU,SAAS,MAAM,UAAU,EACvC,eAAe,GACjB,CAAC;EAED,SAAS,gBAAgB,MAAiB,MAAsB;GAC9D,AAAI,SAAS,WAAW,gBAAgB,QACtC,SAAS,MAAM,IAAI,IAEnB,SAAS,KAAK;IAAC;IAAM;GAAI,CAAC;EAE9B;EAIA,OAFA,QAAQ,GAAG,OAAO,eAAe,SAEpB;GAEX,AADA,QAAQ,IAAI,OAAO,eAAe,GAClC,QAAa,MAAM;EACrB;CACF,CAAC;AACH;ACvBA,eAAsB,iBAAiB,SAGL;CAChC,IAAM,EAAC,KAAK,WAAU,SAEhB,eAAe,MAAM,UAAU;EACnC,KAAK,QAAQ,KAAK,cAAc;EAChC,KAAK,QAAQ,KAAK,oBAAoB;EACtC,KAAK,QAAQ,KAAK,mBAAmB;EACrC,KAAK,QAAQ,KAAK,mBAAmB;EACrC,KAAK,QAAQ,KAAK,oBAAoB;EACtC,KAAK,QAAQ,KAAK,oBAAoB;CACxC,CAAC;CAWD,OATmB,WAAW;EAC5B,KAAK,QAAQ,KAAK,cAAc;EAChC,KAAK,QAAQ,KAAK,oBAAoB;EACtC,KAAK,QAAQ,KAAK,mBAAmB;EACrC,KAAK,QAAQ,KAAK,mBAAmB;EACrC,KAAK,QAAQ,KAAK,oBAAoB;EACtC,KAAK,QAAQ,KAAK,oBAAoB;CACxC,CAEgB,CAAC,CAAC,KAChB,MAAM,OAAO,cACP,UAAU,SAAS,QACd,MAAM,OAAO,UAAU,IAAI,IAGhC,UAAU,SAAS,WACd,MAAM,QAAQ,MAAM,MAAM,UAAU,IAAI,IAG7C,UAAU,SAAS,YACrB,OAAO,IACL,kFACF,GACA,OAAO,KAAK,KAAK,SAAS,KAAK,UAAU,IAAI,GAAG,SAAS,GACzD,OAAO,IAAI,EAAE,GAEN,MAAM,MAAM,CAAC,KAGf,OACN,YAAY,GACf,UAAU,YAAY,GACtB,qBAAqB,CACvB;AACF"}