vite-plugin-lib
Version:
Vite plugin for build configuration, automatic aliases, and type declarations.
1 lines • 23.1 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","names":["dts"],"sources":["../src/logger.ts","../src/es-declarations.ts","../src/index.ts"],"sourcesContent":["// oxlint-disable no-console\nimport c from 'picocolors'\n\nexport function log(text: string): void {\n console.log(`${c.cyan('[vite:lib]')} ${text}`)\n}\n\nexport function logWarn(text: string): void {\n console.warn(`${c.yellow('[vite:lib]')} ${text}`)\n}\n\nexport function logError(text: string): void {\n console.error(`${c.red('[vite:lib]')} ${text}`)\n}\n","import { existsSync } from 'node:fs'\nimport { readFile, readdir, unlink, writeFile } from 'node:fs/promises'\nimport path from 'node:path'\n\nimport { normalizePath } from 'vite'\n\nimport { log } from './logger'\n\nexport async function generateMTSDeclarations(\n typesDir: string,\n deleteSourceFiles: boolean,\n verbose: boolean | undefined,\n): Promise<void> {\n const files = await collectFiles(typesDir)\n for (const file of files) {\n await createMTSImports(file, verbose)\n if (deleteSourceFiles) {\n await unlink(file)\n }\n }\n log(`Generated ${files.length} MTS declarations.`)\n}\n\nasync function collectFiles(dir: string): Promise<string[]> {\n const entries = await readdir(dir, {\n recursive: false, // does not provide full path to nested files\n withFileTypes: true,\n })\n const files = entries.filter((entry) => entry.isFile())\n const nestedFiles = await Promise.all(\n entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => collectFiles(normalizePath(path.join(dir, entry.name)))),\n )\n return files.map((file) => normalizePath(path.join(dir, file.name))).concat(...nestedFiles)\n}\n\nasync function createMTSImports(file: string, verbose: boolean | undefined) {\n const content = await readFile(file, 'utf-8')\n const lines = content.split('\\n')\n const modified = lines.map((line) => transformLine(file, line, verbose))\n const targetFile = file.replace('.d.ts', '.d.mts')\n await writeFile(targetFile, modified.join('\\n'))\n}\n\nfunction transformLine(file: string, line: string, verbose: boolean | undefined) {\n return (\n transformStaticImport(file, line, \"'\", verbose) ??\n transformStaticImport(file, line, '\"', verbose) ??\n transformExport(file, line, \"'\", verbose) ??\n transformExport(file, line, '\"', verbose) ??\n line\n )\n}\n\nfunction transformStaticImport(\n file: string,\n line: string,\n quote: string,\n verbose: boolean | undefined,\n) {\n const importPathMarker = `from ${quote}`\n const isStaticImport = line.includes('import ') && line.includes(`${importPathMarker}.`)\n if (!isStaticImport) {\n return undefined\n }\n\n const importStartIndex = line.lastIndexOf(importPathMarker)\n const importPath = line.substring(importStartIndex + importPathMarker.length, line.length - 2)\n const resolvedImport = path.resolve(path.dirname(file), importPath)\n if (existsSync(resolvedImport)) {\n if (verbose) {\n log(`got index import ${resolvedImport}`)\n }\n return `${line.substring(0, line.length - 2)}/index.mjs${quote};`\n }\n\n return `${line.substring(0, line.length - 2)}.mjs${quote};`\n}\n\nfunction transformExport(file: string, line: string, quote: string, verbose: boolean | undefined) {\n const exportPathMarker = ` from ${quote}`\n const isStaticExport = line.includes('export ') && line.includes(`${exportPathMarker}.`)\n if (!isStaticExport) {\n return undefined\n }\n\n const exportStartIndex = line.lastIndexOf(exportPathMarker)\n const exportPath = line.substring(exportStartIndex + exportPathMarker.length, line.length - 2)\n const resolvedExport = path.resolve(path.dirname(file), exportPath)\n if (existsSync(resolvedExport)) {\n if (verbose) {\n log(`got index export ${resolvedExport}`)\n }\n return `${line.substring(0, line.length - 2)}/index.mjs${quote};`\n }\n\n return `${line.substring(0, line.length - 2)}.mjs${quote};`\n}\n","import { existsSync, readFileSync, readdirSync, rmSync } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport { builtinModules } from 'node:module'\nimport path from 'node:path'\n\nimport c from 'picocolors'\nimport type { CompilerOptions } from 'typescript'\nimport ts from 'typescript'\nimport type { Alias, AliasOptions, LibraryFormats, Plugin, UserConfig } from 'vite'\nimport dts from 'vite-plugin-dts'\n\nimport { generateMTSDeclarations } from './es-declarations'\nimport { log, logError, logWarn } from './logger'\n\nexport * as dts from 'vite-plugin-dts'\n\nconst typesDir = 'dist/types'\n\nexport interface CommonOptions {\n verbose: boolean\n}\n\nconst COMMON_DEFAULTS = {\n verbose: false,\n} satisfies Partial<CommonOptions>\n\nexport interface TSConfigPathsOptions extends CommonOptions {\n /** Path to the tsconfig file (relative to the project root). Defaults to `./tsconfig.json` */\n tsconfig: string\n}\n\nconst TS_CONFIG_PATHS_OPTIONS = {\n ...COMMON_DEFAULTS,\n tsconfig: './tsconfig.json',\n} satisfies Partial<TSConfigPathsOptions>\n\nexport interface BundleOptions {\n /** If `false`, all builtin modules will be externalized. Defaults to `false`. */\n builtin: boolean\n /** If `false`, all dependencies will be externalized. Defaults to `false`. */\n dependencies: boolean\n /** If `false`, all devDependencies will be externalized. Defaults to `true`. */\n devDependencies: boolean\n /** If `false`, all dependencies will be externalized. Defaults to `false`. */\n peerDependencies: boolean\n /** List of packages or modules to externalize. Defaults to `[]`. */\n exclude: (string | RegExp)[]\n /** List of packages or modules to bundle. Acts as an override and defaults to `[]`. */\n include: (string | RegExp)[]\n /** If `false`, all direct imports from `node_modules` will be externalized. Defaults to `false`. */\n nodeModules: boolean\n}\n\nconst BUNDLE_DEFAULTS = {\n builtin: false,\n dependencies: false,\n devDependencies: true,\n peerDependencies: false,\n exclude: [],\n include: [],\n nodeModules: false,\n} satisfies BundleOptions\n\nexport interface LibraryOptions extends TSConfigPathsOptions {\n /** Defaults to `src/index.ts`. */\n entry: string\n /** Bundle configuration for packages and modules. See {@link BundleOptions} for defaults. */\n bundle: Partial<BundleOptions>\n /** Defaults to `['es']`. */\n formats: LibraryFormats[]\n /** Defaults to `package.json`. */\n manifest: string\n name?: string\n /** Remove any temporary build files. Defaults to `true`. */\n cleanup: boolean\n}\n\nconst LIBRARY_DEFAULTS = {\n ...TS_CONFIG_PATHS_OPTIONS,\n cleanup: true,\n entry: 'src/index.ts',\n bundle: {},\n formats: ['es'],\n manifest: 'package.json',\n} satisfies Partial<LibraryOptions>\n\nfunction mergeWithDefaults(options: Partial<LibraryOptions>): LibraryOptions {\n return {\n ...LIBRARY_DEFAULTS,\n ...options,\n }\n}\n\nexport function tsconfigPaths(options: Partial<TSConfigPathsOptions> = {}): Plugin {\n const tsconfig = options.tsconfig ?? TS_CONFIG_PATHS_OPTIONS.tsconfig\n const verbose = options.verbose ?? TS_CONFIG_PATHS_OPTIONS.verbose\n return {\n name: 'vite-plugin-lib:alias',\n enforce: 'pre',\n config: async (config) => {\n const tsconfigPath = path.resolve(config.root ?? '.', tsconfig)\n const { baseUrl, paths } = await readConfig(tsconfigPath)\n if (!baseUrl || !paths) {\n log(`No paths found in ${tsconfig}.`)\n return config\n }\n const pathToAlias = pathToAliasFactory(tsconfigPath, baseUrl, verbose)\n const aliasOptions = Object.entries(paths)\n .map(pathToAlias)\n .filter((alias) => alias !== undefined)\n if (aliasOptions.length > 0) {\n logInjectedAliases(aliasOptions, config, verbose)\n }\n const existingAlias = transformExistingAlias(config.resolve?.alias)\n return {\n ...config,\n resolve: {\n ...config.resolve,\n alias: [...existingAlias, ...aliasOptions],\n },\n }\n },\n }\n}\n\nfunction buildConfig({ entry, formats, manifest, name, bundle, verbose }: LibraryOptions): Plugin {\n const bundleWithDefaults = { ...BUNDLE_DEFAULTS, ...bundle }\n const packagesToExternalize = [\n ...getBuiltinModules(bundleWithDefaults),\n ...getDependencies(manifest, bundleWithDefaults, verbose),\n ...bundleWithDefaults.exclude,\n ]\n if (!bundleWithDefaults.nodeModules) {\n packagesToExternalize.push(/node_modules/)\n if (verbose) {\n log(`Externalized node_modules.`)\n }\n }\n return {\n name: 'vite-plugin-lib:build',\n enforce: 'pre',\n apply: 'build',\n config: (config) => {\n return {\n ...config,\n build: {\n ...config.build,\n lib: {\n ...config.build?.lib,\n entry: path.resolve(config.root ?? '.', entry),\n formats,\n name,\n fileName: (format: string) => formatToFileName(entry, format),\n },\n rollupOptions: {\n external: (source: string, _importer: string | undefined, _isResolved: boolean) => {\n const shouldBeExternalized = packagesToExternalize.some((rule) =>\n matchesRule(source, rule),\n )\n const shouldBeBundled = bundleWithDefaults.include.some((rule) =>\n matchesRule(source, rule),\n )\n return shouldBeExternalized && !shouldBeBundled\n },\n },\n },\n }\n },\n }\n}\n\nfunction matchesRule(source: string, rule: string | RegExp) {\n return typeof rule === 'string' ? rule === source : rule.test(source)\n}\n\nfunction getDependencies(manifest: string, bundle: BundleOptions, verbose: boolean): string[] {\n try {\n const content = readFileSync(manifest, { encoding: 'utf-8' })\n const { dependencies = {}, devDependencies = {}, peerDependencies = {} } = JSON.parse(content)\n const dependenciesToExternalize: string[] = []\n if (!bundle.dependencies) {\n const names = Object.keys(dependencies)\n dependenciesToExternalize.push(...names)\n if (verbose) {\n log(`Externalized ${names.length} dependencies.`)\n }\n }\n if (!bundle.devDependencies) {\n const names = Object.keys(devDependencies)\n dependenciesToExternalize.push(...names)\n if (verbose) {\n log(`Externalized ${names.length} devDependencies.`)\n }\n }\n if (!bundle.peerDependencies) {\n const names = Object.keys(peerDependencies)\n dependenciesToExternalize.push(...names)\n if (verbose) {\n log(`Externalized ${names.length} peerDependencies.`)\n }\n }\n return dependenciesToExternalize\n } catch (error) {\n const message = getErrorMessage(error)\n logError(`Could not read ${c.green(manifest)}: ${message}`)\n throw error\n }\n}\n\nfunction getBuiltinModules(bundle: BundleOptions) {\n if (bundle.builtin) {\n return []\n }\n log('Externalized builtin modules.')\n return [...builtinModules, /node:/, /bun:/, /deno:/]\n}\n\nfunction logInjectedAliases(aliasOptions: Alias[], config: UserConfig, verbose?: boolean) {\n log(`Injected ${c.green(aliasOptions.length)} aliases.`)\n if (!verbose) {\n return\n }\n const base = `${path.resolve(config.root ?? '.')}/`\n aliasOptions\n .map(\n ({ find, replacement }) =>\n ` ${c.gray('>')} ${c.green(find.toString())} ${c.gray(\n c.bold('->'),\n )} ${c.green(replacement.replace(base, ''))}`,\n )\n .forEach(log)\n}\n\nfunction pathToAliasFactory(\n tsconfigPath: string,\n baseUrl: string,\n verbose?: boolean,\n): (path: [string, string[]]) => Alias | undefined {\n return ([alias, replacements]) => {\n if (replacements.length === 0) {\n if (verbose) {\n logWarn(`No replacements for alias ${c.green(alias)}.`)\n }\n return undefined\n }\n if (verbose && replacements.length > 1) {\n logWarn(`Found more than one replacement for alias ${c.green(alias)}.`)\n logWarn('Using the first existing replacement.')\n }\n const find = alias.replace('/*', '')\n const replacement = getFirstExistingReplacement(tsconfigPath, baseUrl, replacements, find)\n if (!replacement) {\n if (verbose) {\n logWarn(`No replacement found for alias ${c.green(alias)}.`)\n }\n return undefined\n }\n return {\n find,\n replacement,\n }\n }\n}\n\nfunction getFirstExistingReplacement(\n tsconfigPath: string,\n baseUrl: string,\n replacements: string[],\n find: string,\n verbose?: boolean,\n): string | undefined {\n for (const replacement of replacements) {\n const resolvedReplacement = path.resolve(\n tsconfigPath,\n baseUrl,\n replacement.replace('/*', '') ?? find,\n )\n if (existsSync(resolvedReplacement)) {\n return resolvedReplacement\n } else if (verbose) {\n logWarn(`Path ${c.green(replacement)} does not exist.`)\n }\n }\n return undefined\n}\n\nfunction formatToFileName(entry: string, format: string): string {\n const entryFileName = entry.substring(entry.lastIndexOf('/') + 1, entry.lastIndexOf('.'))\n if (format === 'es') {\n return `${entryFileName}.mjs`\n }\n if (format === 'cjs') {\n return `${entryFileName}.cjs`\n }\n return `${entryFileName}.${format}.js`\n}\n\nexport function library(options: Partial<LibraryOptions> = {}): Plugin[] {\n const mergedOptions = mergeWithDefaults(options)\n const plugins = [\n tsconfigPaths(mergedOptions),\n buildConfig(mergedOptions),\n dts({\n cleanVueFileName: true,\n copyDtsFiles: true,\n include: `${path.resolve(mergedOptions.entry, '..')}/**`,\n outDir: typesDir,\n staticImport: true,\n tsconfigPath: mergedOptions.tsconfig,\n afterBuild: async () => {\n if (includesESFormat(mergedOptions.formats)) {\n await generateMTSDeclarations(\n typesDir,\n mergedOptions.formats?.length === 1,\n options.verbose,\n )\n }\n },\n }),\n ]\n\n if (mergedOptions.cleanup) {\n plugins.push(cleanup(mergedOptions))\n }\n\n return plugins\n}\n\nfunction transformExistingAlias(alias: AliasOptions | undefined): Alias[] {\n if (!alias) {\n return []\n }\n if (Array.isArray(alias)) {\n return alias\n }\n return Object.entries(alias).map(([find, replacement]) => ({\n find,\n replacement,\n }))\n}\n\nasync function readConfig(configPath: string): Promise<CompilerOptions> {\n try {\n const configFileText = await readFile(configPath, { encoding: 'utf-8' })\n\n const { config } = ts.parseConfigFileTextToJson(configPath, configFileText)\n\n const { options } = ts.parseJsonConfigFileContent(config, ts.sys, path.dirname(configPath))\n return options\n } catch (error: any) {\n const message = getErrorMessage(error)\n logError(`Could not read ${configPath}: ${message}`)\n throw error\n }\n}\n\nfunction includesESFormat(formats?: LibraryFormats[]) {\n return formats?.includes('es') ?? true\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (\n typeof error === 'object' &&\n error !== null &&\n 'message' in error &&\n typeof error.message === 'string'\n ) {\n return error.message\n }\n return String(error)\n}\n\n/**\n * Remove any temporary `vite.config.ts.timestamp-*` files.\n */\nexport function cleanup(options: Partial<CommonOptions> = {}): Plugin {\n const verbose = options.verbose ?? COMMON_DEFAULTS.verbose\n return {\n name: 'vite-plugin-lib:cleanup',\n enforce: 'post',\n closeBundle: () => {\n let deletedCount = 0\n readdirSync('.').forEach((file) => {\n if (!file.startsWith('vite.config.ts.timestamp-')) {\n return\n }\n rmSync(`./${file}`)\n deletedCount++\n })\n if (verbose) {\n log(`Removed ${deletedCount} temporary files.`)\n }\n },\n }\n}\n"],"mappings":"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"}