next-auto-import 0.0.0 → 0.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.
package/dist/index.cjs CHANGED
@@ -341,7 +341,7 @@ function createAutoImport(options = {}) {
341
341
  ...nextConfig,
342
342
  experimental: {
343
343
  ...nextConfig.experimental,
344
- swcPlugins: [["swc-plugin-auto-import", { presets: ["react"] }], ...nextConfig.experimental?.swcPlugins ?? []]
344
+ swcPlugins: [["swc-plugin-auto-import", { imports: options.imports }], ...nextConfig.experimental?.swcPlugins ?? []]
345
345
  }
346
346
  };
347
347
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["react","reactDom","eslintConfigs: any","dynamic: ImportExtended[]","sideEffects: ImportExtended[]","process","eslintrc: ESLintrc","biomelintrc: BiomeLintrc","unimport","dts","i","fs","lastDTS: string | undefined","lastESLint: string | undefined","lastBiomeLint: string | undefined","lastUnimportItems: string | undefined","promises: any[]","resolved: Import[]"],"sources":["../src/presets/react.ts","../src/presets/react-dom.ts","../src/presets/index.ts","../src/core/biomelintrc.ts","../src/core/eslintrc.ts","../src/core/resolvers.ts","../src/core/ctx.ts","../src/index.ts"],"sourcesContent":["import type { ImportsMap } from '../types'\n\nexport const CommonReactAPI = [\n 'useState',\n 'useCallback',\n 'useMemo',\n 'useEffect',\n 'useRef',\n 'useContext',\n 'useReducer',\n 'useImperativeHandle',\n 'useDebugValue',\n 'useDeferredValue',\n 'useLayoutEffect',\n 'useTransition',\n 'startTransition',\n 'useSyncExternalStore',\n 'useInsertionEffect',\n 'useId',\n 'lazy',\n 'memo',\n 'createRef',\n 'forwardRef',\n] as const\n\nexport default {\n react: [\n ...CommonReactAPI,\n 'cache',\n 'cacheSignal',\n 'createContext',\n 'use',\n 'useOptimistic',\n 'useEffectEvent',\n 'useActionState',\n 'Fragment',\n 'Suspense',\n 'Activity',\n ],\n} as const satisfies ImportsMap\n","import type { ImportsMap } from '../types'\n\nexport default {\n 'react-dom': [\n 'useFormStatus',\n 'createPortal',\n 'flushSync',\n 'preconnect',\n 'prefetchDNS',\n 'preinit',\n 'preinitModule',\n 'preload',\n 'preloadModule',\n ],\n} as const satisfies ImportsMap\n","import react from './react'\nimport reactDom from './react-dom'\n\nexport const presets = {\n 'react': react,\n 'react-dom': reactDom,\n}\n\nexport type PresetName = keyof typeof presets\n","import type { Import } from 'unimport'\n\nexport function generateBiomeLintConfigs(imports: Import[]) {\n const names = imports\n .map((i) => i.as ?? i.name)\n .filter(Boolean)\n .sort()\n\n const config = { javascript: { globals: names } }\n const jsonBody = JSON.stringify(config, null, 2)\n\n return jsonBody\n}\n","import type { Import } from 'unimport'\nimport type { ESLintrc } from '../types'\n\nexport function generateESLintConfigs(imports: Import[], eslintrc: ESLintrc) {\n const eslintConfigs: any = { globals: {} }\n\n imports\n .map((i) => i.as ?? i.name)\n .filter(Boolean)\n .sort()\n .forEach((name) => {\n eslintConfigs.globals[name] = eslintrc.globalsPropValue\n })\n const jsonBody = JSON.stringify(eslintConfigs, null, 2)\n return jsonBody\n}\n","import { toArray } from '@antfu/utils'\nimport type { Addon, Import } from 'unimport'\nimport type {\n ImportExtended,\n ImportLegacy,\n Resolver,\n ResolverResult,\n} from '../types'\n\nexport function normalizeImport(\n info: Import | ResolverResult | ImportExtended | ImportLegacy | string,\n name: string,\n): ImportExtended {\n if (typeof info === 'string') {\n return {\n name: 'default',\n as: name,\n from: info,\n }\n }\n if ('path' in info) {\n return {\n from: info.path,\n as: info.name,\n name: info.importName!,\n sideEffects: info.sideEffects,\n }\n }\n return {\n name,\n as: name,\n ...info,\n }\n}\n\nexport async function firstMatchedResolver(\n resolvers: Resolver[],\n fullname: string,\n) {\n let name = fullname\n for (const resolver of resolvers) {\n if (typeof resolver === 'object' && resolver.type === 'directive') {\n if (name.startsWith('v')) name = name.slice(1)\n else continue\n }\n const resolved = await (typeof resolver === 'function'\n ? resolver(name)\n : resolver.resolve(name))\n if (resolved) return normalizeImport(resolved, fullname)\n }\n}\n\nexport function resolversAddon(resolvers: Resolver[]): Addon {\n return {\n name: 'unplugin-auto-import:resolvers',\n async matchImports(names, matched) {\n if (!resolvers.length) return\n const dynamic: ImportExtended[] = []\n const sideEffects: ImportExtended[] = []\n await Promise.all(\n [...names].map(async (name) => {\n const matchedImport = matched.find((i) => i.as === name)\n if (matchedImport) {\n if ('sideEffects' in matchedImport)\n sideEffects.push(\n ...toArray((matchedImport as ImportExtended).sideEffects).map(\n (i) => normalizeImport(i, ''),\n ),\n )\n\n return\n }\n const resolved = await firstMatchedResolver(resolvers, name)\n if (resolved) dynamic.push(resolved)\n\n if (resolved?.sideEffects)\n sideEffects.push(\n ...toArray(resolved?.sideEffects).map((i) =>\n normalizeImport(i, ''),\n ),\n )\n }),\n )\n\n if (dynamic.length) {\n this.dynamicImports.push(...dynamic)\n this.invalidate()\n }\n\n if (dynamic.length || sideEffects.length)\n return [...matched, ...dynamic, ...sideEffects]\n },\n }\n}\n","import { existsSync, promises as fs } from 'node:fs'\nimport { dirname, isAbsolute, relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport { slash, toArray } from '@antfu/utils'\nimport { isPackageExists } from 'local-pkg'\nimport { createUnimport, resolvePreset } from 'unimport'\nimport { presets } from '../presets'\nimport { generateBiomeLintConfigs } from './biomelintrc'\nimport { generateESLintConfigs } from './eslintrc'\nimport { resolversAddon } from './resolvers'\nimport type { Import, InlinePreset } from 'unimport'\nimport type { BiomeLintrc, ESLintrc, Options } from '../types'\n\nexport const INCLUDE_RE_LIST = [/\\.[jt]sx?$/]\nexport const EXCLUDE_RE_LIST = [/[\\\\/]node_modules[\\\\/]/, /[\\\\/]\\.git[\\\\/]/]\n\nexport function createContext(options: Options = {}, root = process.cwd()) {\n root = slash(root)\n\n const {\n dts: preferDTS = isPackageExists('typescript'),\n dtsMode = 'append',\n dtsPreserveExts = false,\n dirsScanOptions,\n dirs,\n } = options\n\n const eslintrc: ESLintrc = options.eslintrc || {}\n eslintrc.enabled = eslintrc.enabled === undefined ? false : eslintrc.enabled\n eslintrc.filepath = eslintrc.filepath || './.eslintrc-auto-import.json'\n eslintrc.globalsPropValue =\n eslintrc.globalsPropValue === undefined ? true : eslintrc.globalsPropValue\n\n const biomelintrc: BiomeLintrc = options.biomelintrc || {}\n biomelintrc.enabled = biomelintrc.enabled !== undefined\n biomelintrc.filepath =\n biomelintrc.filepath || './.biomelintrc-auto-import.json'\n\n const dumpUnimportItems =\n options.dumpUnimportItems === true\n ? './.unimport-items.json'\n : (options.dumpUnimportItems ?? false)\n\n const resolvers = options.resolvers ? [options.resolvers].flat(2) : []\n\n // When \"options.injectAtEnd\" is undefined or true, it's true.\n const injectAtEnd = options.injectAtEnd !== false\n\n const unimport = createUnimport({\n imports: [],\n presets:\n options.packagePresets?.map((p) =>\n typeof p === 'string' ? { package: p } : p,\n ) ?? [],\n dirsScanOptions: {\n ...dirsScanOptions,\n cwd: root,\n },\n dirs,\n injectAtEnd,\n parser: options.parser,\n addons: {\n addons: [\n resolversAddon(resolvers),\n {\n name: 'unplugin-auto-import:dts',\n declaration(dts) {\n return `${`\n/* eslint-disable */\n/* prettier-ignore */\n// @ts-nocheck\n// noinspection JSUnusedGlobalSymbols\n// Generated by unplugin-auto-import\n// biome-ignore lint: disable\n${dts}`.trim()}\\n`\n },\n },\n ],\n },\n })\n\n const importsPromise = flattenImports(options.imports).then((imports) => {\n if (!imports.length && !resolvers.length && !dirs?.length)\n console.warn(\n '[auto-import] plugin installed but no imports has defined, see https://github.com/antfu/unplugin-auto-import#configurations for configurations',\n )\n\n const compare = (\n left: string | undefined,\n right: NonNullable<Options['ignore'] | Options['ignoreDts']>[number],\n ) => {\n return right instanceof RegExp ? right.test(left!) : right === left\n }\n\n options.ignore?.forEach((name) => {\n const i = imports.find((i) => compare(i.as, name))\n if (i) i.disabled = true\n })\n\n options.ignoreDts?.forEach((name) => {\n const i = imports.find((i) => compare(i.as, name))\n if (i) i.dtsDisabled = true\n })\n\n return unimport.getInternalContext().replaceImports(imports)\n })\n\n const dts =\n preferDTS === false\n ? false\n : preferDTS === true\n ? resolve(root, 'auto-imports.d.ts')\n : resolve(root, preferDTS)\n\n const multilineCommentsRE = /\\/\\*.*?\\*\\//gs\n const singlelineCommentsRE = /\\/\\/.*$/gm\n const dtsReg = /declare\\s+global\\s*\\{(.*?)[\\n\\r]\\}/s\n function parseDTS(dts: string) {\n dts = dts.replace(multilineCommentsRE, '').replace(singlelineCommentsRE, '')\n\n const code = dts.match(dtsReg)?.[0]\n if (!code) return\n\n return Object.fromEntries(\n Array.from(\n code.matchAll(/['\"]?(const\\s*[^\\s'\"]+)['\"]?\\s*:\\s*(.+?)[,;\\r\\n]/g),\n ).map((i) => [i[1], i[2]]),\n )\n }\n\n async function generateDTS(file: string) {\n await importsPromise\n const dir = dirname(file)\n const originalContent = existsSync(file)\n ? await fs.readFile(file, 'utf-8')\n : ''\n const originalDTS = parseDTS(originalContent)\n const currentContent = await unimport.generateTypeDeclarations({\n resolvePath: (i) => {\n if (i.from.startsWith('.') || isAbsolute(i.from)) {\n const related = slash(\n dtsPreserveExts\n ? relative(dir, i.from)\n : relative(dir, i.from).replace(/\\.ts(x)?$/, ''),\n )\n return !related.startsWith('.') ? `./${related}` : related\n }\n return i.from\n },\n })\n\n if (dtsMode === 'append') {\n const currentDTS = parseDTS(currentContent)!\n if (originalDTS) {\n Object.assign(originalDTS, currentDTS)\n\n const dtsList = Object.keys(originalDTS)\n .sort()\n .map((k) => ` ${k}: ${originalDTS[k]}`)\n return currentContent.replace(\n dtsReg,\n () => `declare global {\\n${dtsList.join('\\n')}\\n}`,\n )\n }\n }\n\n return currentContent\n }\n\n async function generateESLint() {\n return generateESLintConfigs(await unimport.getImports(), eslintrc)\n }\n\n async function generateBiomeLint() {\n return generateBiomeLintConfigs(await unimport.getImports())\n }\n\n // eslint-disable-next-line unicorn/consistent-function-scoping\n async function writeFile(filePath: string, content = '') {\n await fs.mkdir(dirname(filePath), { recursive: true })\n return await fs.writeFile(filePath, content, 'utf-8')\n }\n\n let lastDTS: string | undefined\n let lastESLint: string | undefined\n let lastBiomeLint: string | undefined\n let lastUnimportItems: string | undefined\n\n async function writeConfigFiles() {\n const promises: any[] = []\n if (dts) {\n promises.push(\n generateDTS(dts).then((content) => {\n if (content !== lastDTS) {\n lastDTS = content\n return writeFile(dts, content)\n }\n }),\n )\n }\n if (eslintrc.enabled && eslintrc.filepath) {\n const filepath = eslintrc.filepath\n promises.push(\n generateESLint().then(async (content) => {\n if (filepath.endsWith('.cjs')) content = `module.exports = ${content}`\n else if (filepath.endsWith('.mjs') || filepath.endsWith('.js'))\n content = `export default ${content}`\n\n content = `${content}\\n`\n if (content.trim() !== lastESLint?.trim()) {\n lastESLint = content\n return writeFile(eslintrc.filepath!, content)\n }\n }),\n )\n }\n\n if (biomelintrc.enabled) {\n promises.push(\n generateBiomeLint().then((content) => {\n if (content !== lastBiomeLint) {\n lastBiomeLint = content\n return writeFile(biomelintrc.filepath!, content)\n }\n }),\n )\n }\n\n if (dumpUnimportItems) {\n promises.push(\n unimport.getImports().then((items) => {\n if (!dumpUnimportItems) return\n const content = JSON.stringify(items, null, 2)\n if (content !== lastUnimportItems) {\n lastUnimportItems = content\n return writeFile(dumpUnimportItems, content)\n }\n }),\n )\n }\n\n return Promise.all(promises)\n }\n\n return {\n writeConfigFiles,\n }\n}\n\nexport async function flattenImports(\n map: Options['imports'],\n): Promise<Import[]> {\n const promises = await Promise.all(\n toArray(map).map(async (definition) => {\n if (typeof definition === 'string') {\n if (!presets[definition])\n throw new Error(`[auto-import] preset ${definition} not found`)\n const preset = presets[definition]\n definition = preset\n }\n\n if ('from' in definition && 'imports' in definition) {\n return await resolvePreset(definition as InlinePreset)\n } else {\n const resolved: Import[] = []\n for (const mod of Object.keys(definition)) {\n for (const id of definition[mod]) {\n const meta = {\n from: mod,\n } as Import\n if (Array.isArray(id)) {\n meta.name = id[0]\n meta.as = id[1]\n } else {\n meta.name = id\n meta.as = id\n }\n resolved.push(meta)\n }\n }\n return resolved\n }\n }),\n )\n\n return promises.flat()\n}\n","import { createContext } from './core/ctx'\nimport type { NextConfig } from 'next'\nimport type { Options } from './types'\n\n/**\n * Creates a Next.js auto-import context\n */\nexport function createAutoImport(options: Options = {}) {\n const ctx = createContext(options)\n\n ctx.writeConfigFiles()\n\n return (nextConfig: NextConfig = {}): NextConfig => {\n return {\n ...nextConfig,\n experimental: {\n ...nextConfig.experimental,\n swcPlugins: [\n [\n 'swc-plugin-auto-import',\n {\n presets: ['react'],\n },\n ],\n ...(nextConfig.experimental?.swcPlugins ?? []),\n ],\n },\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["react","reactDom","eslintConfigs: any","dynamic: ImportExtended[]","sideEffects: ImportExtended[]","process","eslintrc: ESLintrc","biomelintrc: BiomeLintrc","unimport","dts","i","fs","lastDTS: string | undefined","lastESLint: string | undefined","lastBiomeLint: string | undefined","lastUnimportItems: string | undefined","promises: any[]","resolved: Import[]"],"sources":["../src/presets/react.ts","../src/presets/react-dom.ts","../src/presets/index.ts","../src/core/biomelintrc.ts","../src/core/eslintrc.ts","../src/core/resolvers.ts","../src/core/ctx.ts","../src/index.ts"],"sourcesContent":["import type { ImportsMap } from '../types'\n\nexport const CommonReactAPI = [\n 'useState',\n 'useCallback',\n 'useMemo',\n 'useEffect',\n 'useRef',\n 'useContext',\n 'useReducer',\n 'useImperativeHandle',\n 'useDebugValue',\n 'useDeferredValue',\n 'useLayoutEffect',\n 'useTransition',\n 'startTransition',\n 'useSyncExternalStore',\n 'useInsertionEffect',\n 'useId',\n 'lazy',\n 'memo',\n 'createRef',\n 'forwardRef',\n] as const\n\nexport default {\n react: [\n ...CommonReactAPI,\n 'cache',\n 'cacheSignal',\n 'createContext',\n 'use',\n 'useOptimistic',\n 'useEffectEvent',\n 'useActionState',\n 'Fragment',\n 'Suspense',\n 'Activity',\n ],\n} as const satisfies ImportsMap\n","import type { ImportsMap } from '../types'\n\nexport default {\n 'react-dom': [\n 'useFormStatus',\n 'createPortal',\n 'flushSync',\n 'preconnect',\n 'prefetchDNS',\n 'preinit',\n 'preinitModule',\n 'preload',\n 'preloadModule',\n ],\n} as const satisfies ImportsMap\n","import react from './react'\nimport reactDom from './react-dom'\n\nexport const presets = {\n 'react': react,\n 'react-dom': reactDom,\n}\n\nexport type PresetName = keyof typeof presets\n","import type { Import } from 'unimport'\n\nexport function generateBiomeLintConfigs(imports: Import[]) {\n const names = imports\n .map((i) => i.as ?? i.name)\n .filter(Boolean)\n .sort()\n\n const config = { javascript: { globals: names } }\n const jsonBody = JSON.stringify(config, null, 2)\n\n return jsonBody\n}\n","import type { Import } from 'unimport'\nimport type { ESLintrc } from '../types'\n\nexport function generateESLintConfigs(imports: Import[], eslintrc: ESLintrc) {\n const eslintConfigs: any = { globals: {} }\n\n imports\n .map((i) => i.as ?? i.name)\n .filter(Boolean)\n .sort()\n .forEach((name) => {\n eslintConfigs.globals[name] = eslintrc.globalsPropValue\n })\n const jsonBody = JSON.stringify(eslintConfigs, null, 2)\n return jsonBody\n}\n","import { toArray } from '@antfu/utils'\nimport type { Addon, Import } from 'unimport'\nimport type {\n ImportExtended,\n ImportLegacy,\n Resolver,\n ResolverResult,\n} from '../types'\n\nexport function normalizeImport(\n info: Import | ResolverResult | ImportExtended | ImportLegacy | string,\n name: string,\n): ImportExtended {\n if (typeof info === 'string') {\n return {\n name: 'default',\n as: name,\n from: info,\n }\n }\n if ('path' in info) {\n return {\n from: info.path,\n as: info.name,\n name: info.importName!,\n sideEffects: info.sideEffects,\n }\n }\n return {\n name,\n as: name,\n ...info,\n }\n}\n\nexport async function firstMatchedResolver(\n resolvers: Resolver[],\n fullname: string,\n) {\n let name = fullname\n for (const resolver of resolvers) {\n if (typeof resolver === 'object' && resolver.type === 'directive') {\n if (name.startsWith('v')) name = name.slice(1)\n else continue\n }\n const resolved = await (typeof resolver === 'function'\n ? resolver(name)\n : resolver.resolve(name))\n if (resolved) return normalizeImport(resolved, fullname)\n }\n}\n\nexport function resolversAddon(resolvers: Resolver[]): Addon {\n return {\n name: 'unplugin-auto-import:resolvers',\n async matchImports(names, matched) {\n if (!resolvers.length) return\n const dynamic: ImportExtended[] = []\n const sideEffects: ImportExtended[] = []\n await Promise.all(\n [...names].map(async (name) => {\n const matchedImport = matched.find((i) => i.as === name)\n if (matchedImport) {\n if ('sideEffects' in matchedImport)\n sideEffects.push(\n ...toArray((matchedImport as ImportExtended).sideEffects).map(\n (i) => normalizeImport(i, ''),\n ),\n )\n\n return\n }\n const resolved = await firstMatchedResolver(resolvers, name)\n if (resolved) dynamic.push(resolved)\n\n if (resolved?.sideEffects)\n sideEffects.push(\n ...toArray(resolved?.sideEffects).map((i) =>\n normalizeImport(i, ''),\n ),\n )\n }),\n )\n\n if (dynamic.length) {\n this.dynamicImports.push(...dynamic)\n this.invalidate()\n }\n\n if (dynamic.length || sideEffects.length)\n return [...matched, ...dynamic, ...sideEffects]\n },\n }\n}\n","import { existsSync, promises as fs } from 'node:fs'\nimport { dirname, isAbsolute, relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport { slash, toArray } from '@antfu/utils'\nimport { isPackageExists } from 'local-pkg'\nimport { createUnimport, resolvePreset } from 'unimport'\nimport { presets } from '../presets'\nimport { generateBiomeLintConfigs } from './biomelintrc'\nimport { generateESLintConfigs } from './eslintrc'\nimport { resolversAddon } from './resolvers'\nimport type { Import, InlinePreset } from 'unimport'\nimport type { BiomeLintrc, ESLintrc, Options } from '../types'\n\nexport const INCLUDE_RE_LIST = [/\\.[jt]sx?$/]\nexport const EXCLUDE_RE_LIST = [/[\\\\/]node_modules[\\\\/]/, /[\\\\/]\\.git[\\\\/]/]\n\nexport function createContext(options: Options = {}, root = process.cwd()) {\n root = slash(root)\n\n const {\n dts: preferDTS = isPackageExists('typescript'),\n dtsMode = 'append',\n dtsPreserveExts = false,\n dirsScanOptions,\n dirs,\n } = options\n\n const eslintrc: ESLintrc = options.eslintrc || {}\n eslintrc.enabled = eslintrc.enabled === undefined ? false : eslintrc.enabled\n eslintrc.filepath = eslintrc.filepath || './.eslintrc-auto-import.json'\n eslintrc.globalsPropValue =\n eslintrc.globalsPropValue === undefined ? true : eslintrc.globalsPropValue\n\n const biomelintrc: BiomeLintrc = options.biomelintrc || {}\n biomelintrc.enabled = biomelintrc.enabled !== undefined\n biomelintrc.filepath =\n biomelintrc.filepath || './.biomelintrc-auto-import.json'\n\n const dumpUnimportItems =\n options.dumpUnimportItems === true\n ? './.unimport-items.json'\n : (options.dumpUnimportItems ?? false)\n\n const resolvers = options.resolvers ? [options.resolvers].flat(2) : []\n\n // When \"options.injectAtEnd\" is undefined or true, it's true.\n const injectAtEnd = options.injectAtEnd !== false\n\n const unimport = createUnimport({\n imports: [],\n presets:\n options.packagePresets?.map((p) =>\n typeof p === 'string' ? { package: p } : p,\n ) ?? [],\n dirsScanOptions: {\n ...dirsScanOptions,\n cwd: root,\n },\n dirs,\n injectAtEnd,\n parser: options.parser,\n addons: {\n addons: [\n resolversAddon(resolvers),\n {\n name: 'unplugin-auto-import:dts',\n declaration(dts) {\n return `${`\n/* eslint-disable */\n/* prettier-ignore */\n// @ts-nocheck\n// noinspection JSUnusedGlobalSymbols\n// Generated by unplugin-auto-import\n// biome-ignore lint: disable\n${dts}`.trim()}\\n`\n },\n },\n ],\n },\n })\n\n const importsPromise = flattenImports(options.imports).then((imports) => {\n if (!imports.length && !resolvers.length && !dirs?.length)\n console.warn(\n '[auto-import] plugin installed but no imports has defined, see https://github.com/antfu/unplugin-auto-import#configurations for configurations',\n )\n\n const compare = (\n left: string | undefined,\n right: NonNullable<Options['ignore'] | Options['ignoreDts']>[number],\n ) => {\n return right instanceof RegExp ? right.test(left!) : right === left\n }\n\n options.ignore?.forEach((name) => {\n const i = imports.find((i) => compare(i.as, name))\n if (i) i.disabled = true\n })\n\n options.ignoreDts?.forEach((name) => {\n const i = imports.find((i) => compare(i.as, name))\n if (i) i.dtsDisabled = true\n })\n\n return unimport.getInternalContext().replaceImports(imports)\n })\n\n const dts =\n preferDTS === false\n ? false\n : preferDTS === true\n ? resolve(root, 'auto-imports.d.ts')\n : resolve(root, preferDTS)\n\n const multilineCommentsRE = /\\/\\*.*?\\*\\//gs\n const singlelineCommentsRE = /\\/\\/.*$/gm\n const dtsReg = /declare\\s+global\\s*\\{(.*?)[\\n\\r]\\}/s\n function parseDTS(dts: string) {\n dts = dts.replace(multilineCommentsRE, '').replace(singlelineCommentsRE, '')\n\n const code = dts.match(dtsReg)?.[0]\n if (!code) return\n\n return Object.fromEntries(\n Array.from(\n code.matchAll(/['\"]?(const\\s*[^\\s'\"]+)['\"]?\\s*:\\s*(.+?)[,;\\r\\n]/g),\n ).map((i) => [i[1], i[2]]),\n )\n }\n\n async function generateDTS(file: string) {\n await importsPromise\n const dir = dirname(file)\n const originalContent = existsSync(file)\n ? await fs.readFile(file, 'utf-8')\n : ''\n const originalDTS = parseDTS(originalContent)\n const currentContent = await unimport.generateTypeDeclarations({\n resolvePath: (i) => {\n if (i.from.startsWith('.') || isAbsolute(i.from)) {\n const related = slash(\n dtsPreserveExts\n ? relative(dir, i.from)\n : relative(dir, i.from).replace(/\\.ts(x)?$/, ''),\n )\n return !related.startsWith('.') ? `./${related}` : related\n }\n return i.from\n },\n })\n\n if (dtsMode === 'append') {\n const currentDTS = parseDTS(currentContent)!\n if (originalDTS) {\n Object.assign(originalDTS, currentDTS)\n\n const dtsList = Object.keys(originalDTS)\n .sort()\n .map((k) => ` ${k}: ${originalDTS[k]}`)\n return currentContent.replace(\n dtsReg,\n () => `declare global {\\n${dtsList.join('\\n')}\\n}`,\n )\n }\n }\n\n return currentContent\n }\n\n async function generateESLint() {\n return generateESLintConfigs(await unimport.getImports(), eslintrc)\n }\n\n async function generateBiomeLint() {\n return generateBiomeLintConfigs(await unimport.getImports())\n }\n\n // eslint-disable-next-line unicorn/consistent-function-scoping\n async function writeFile(filePath: string, content = '') {\n await fs.mkdir(dirname(filePath), { recursive: true })\n return await fs.writeFile(filePath, content, 'utf-8')\n }\n\n let lastDTS: string | undefined\n let lastESLint: string | undefined\n let lastBiomeLint: string | undefined\n let lastUnimportItems: string | undefined\n\n async function writeConfigFiles() {\n const promises: any[] = []\n if (dts) {\n promises.push(\n generateDTS(dts).then((content) => {\n if (content !== lastDTS) {\n lastDTS = content\n return writeFile(dts, content)\n }\n }),\n )\n }\n if (eslintrc.enabled && eslintrc.filepath) {\n const filepath = eslintrc.filepath\n promises.push(\n generateESLint().then(async (content) => {\n if (filepath.endsWith('.cjs')) content = `module.exports = ${content}`\n else if (filepath.endsWith('.mjs') || filepath.endsWith('.js'))\n content = `export default ${content}`\n\n content = `${content}\\n`\n if (content.trim() !== lastESLint?.trim()) {\n lastESLint = content\n return writeFile(eslintrc.filepath!, content)\n }\n }),\n )\n }\n\n if (biomelintrc.enabled) {\n promises.push(\n generateBiomeLint().then((content) => {\n if (content !== lastBiomeLint) {\n lastBiomeLint = content\n return writeFile(biomelintrc.filepath!, content)\n }\n }),\n )\n }\n\n if (dumpUnimportItems) {\n promises.push(\n unimport.getImports().then((items) => {\n if (!dumpUnimportItems) return\n const content = JSON.stringify(items, null, 2)\n if (content !== lastUnimportItems) {\n lastUnimportItems = content\n return writeFile(dumpUnimportItems, content)\n }\n }),\n )\n }\n\n return Promise.all(promises)\n }\n\n return {\n writeConfigFiles,\n }\n}\n\nexport async function flattenImports(\n map: Options['imports'],\n): Promise<Import[]> {\n const promises = await Promise.all(\n toArray(map).map(async (definition) => {\n if (typeof definition === 'string') {\n if (!presets[definition])\n throw new Error(`[auto-import] preset ${definition} not found`)\n const preset = presets[definition]\n definition = preset\n }\n\n if ('from' in definition && 'imports' in definition) {\n return await resolvePreset(definition as InlinePreset)\n } else {\n const resolved: Import[] = []\n for (const mod of Object.keys(definition)) {\n for (const id of definition[mod]) {\n const meta = {\n from: mod,\n } as Import\n if (Array.isArray(id)) {\n meta.name = id[0]\n meta.as = id[1]\n } else {\n meta.name = id\n meta.as = id\n }\n resolved.push(meta)\n }\n }\n return resolved\n }\n }),\n )\n\n return promises.flat()\n}\n","import { createContext } from './core/ctx'\nimport type { NextConfig } from 'next'\nimport type { Options } from './types'\n\n/**\n * Creates a Next.js auto-import context\n */\nexport function createAutoImport(options: Options = {}) {\n const ctx = createContext(options)\n\n ctx.writeConfigFiles()\n\n return (nextConfig: NextConfig = {}): NextConfig => {\n return {\n ...nextConfig,\n experimental: {\n ...nextConfig.experimental,\n swcPlugins: [\n [\n 'swc-plugin-auto-import',\n {\n imports: options.imports,\n },\n ],\n ...(nextConfig.experimental?.swcPlugins ?? []),\n ],\n },\n }\n }\n}\n"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -313,7 +313,7 @@ function createAutoImport(options = {}) {
313
313
  ...nextConfig,
314
314
  experimental: {
315
315
  ...nextConfig.experimental,
316
- swcPlugins: [["swc-plugin-auto-import", { presets: ["react"] }], ...nextConfig.experimental?.swcPlugins ?? []]
316
+ swcPlugins: [["swc-plugin-auto-import", { imports: options.imports }], ...nextConfig.experimental?.swcPlugins ?? []]
317
317
  }
318
318
  };
319
319
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["react","reactDom","eslintConfigs: any","dynamic: ImportExtended[]","sideEffects: ImportExtended[]","eslintrc: ESLintrc","biomelintrc: BiomeLintrc","dts","i","fs","lastDTS: string | undefined","lastESLint: string | undefined","lastBiomeLint: string | undefined","lastUnimportItems: string | undefined","promises: any[]","promises","resolved: Import[]"],"sources":["../src/presets/react.ts","../src/presets/react-dom.ts","../src/presets/index.ts","../src/core/biomelintrc.ts","../src/core/eslintrc.ts","../src/core/resolvers.ts","../src/core/ctx.ts","../src/index.ts"],"sourcesContent":["import type { ImportsMap } from '../types'\n\nexport const CommonReactAPI = [\n 'useState',\n 'useCallback',\n 'useMemo',\n 'useEffect',\n 'useRef',\n 'useContext',\n 'useReducer',\n 'useImperativeHandle',\n 'useDebugValue',\n 'useDeferredValue',\n 'useLayoutEffect',\n 'useTransition',\n 'startTransition',\n 'useSyncExternalStore',\n 'useInsertionEffect',\n 'useId',\n 'lazy',\n 'memo',\n 'createRef',\n 'forwardRef',\n] as const\n\nexport default {\n react: [\n ...CommonReactAPI,\n 'cache',\n 'cacheSignal',\n 'createContext',\n 'use',\n 'useOptimistic',\n 'useEffectEvent',\n 'useActionState',\n 'Fragment',\n 'Suspense',\n 'Activity',\n ],\n} as const satisfies ImportsMap\n","import type { ImportsMap } from '../types'\n\nexport default {\n 'react-dom': [\n 'useFormStatus',\n 'createPortal',\n 'flushSync',\n 'preconnect',\n 'prefetchDNS',\n 'preinit',\n 'preinitModule',\n 'preload',\n 'preloadModule',\n ],\n} as const satisfies ImportsMap\n","import react from './react'\nimport reactDom from './react-dom'\n\nexport const presets = {\n 'react': react,\n 'react-dom': reactDom,\n}\n\nexport type PresetName = keyof typeof presets\n","import type { Import } from 'unimport'\n\nexport function generateBiomeLintConfigs(imports: Import[]) {\n const names = imports\n .map((i) => i.as ?? i.name)\n .filter(Boolean)\n .sort()\n\n const config = { javascript: { globals: names } }\n const jsonBody = JSON.stringify(config, null, 2)\n\n return jsonBody\n}\n","import type { Import } from 'unimport'\nimport type { ESLintrc } from '../types'\n\nexport function generateESLintConfigs(imports: Import[], eslintrc: ESLintrc) {\n const eslintConfigs: any = { globals: {} }\n\n imports\n .map((i) => i.as ?? i.name)\n .filter(Boolean)\n .sort()\n .forEach((name) => {\n eslintConfigs.globals[name] = eslintrc.globalsPropValue\n })\n const jsonBody = JSON.stringify(eslintConfigs, null, 2)\n return jsonBody\n}\n","import { toArray } from '@antfu/utils'\nimport type { Addon, Import } from 'unimport'\nimport type {\n ImportExtended,\n ImportLegacy,\n Resolver,\n ResolverResult,\n} from '../types'\n\nexport function normalizeImport(\n info: Import | ResolverResult | ImportExtended | ImportLegacy | string,\n name: string,\n): ImportExtended {\n if (typeof info === 'string') {\n return {\n name: 'default',\n as: name,\n from: info,\n }\n }\n if ('path' in info) {\n return {\n from: info.path,\n as: info.name,\n name: info.importName!,\n sideEffects: info.sideEffects,\n }\n }\n return {\n name,\n as: name,\n ...info,\n }\n}\n\nexport async function firstMatchedResolver(\n resolvers: Resolver[],\n fullname: string,\n) {\n let name = fullname\n for (const resolver of resolvers) {\n if (typeof resolver === 'object' && resolver.type === 'directive') {\n if (name.startsWith('v')) name = name.slice(1)\n else continue\n }\n const resolved = await (typeof resolver === 'function'\n ? resolver(name)\n : resolver.resolve(name))\n if (resolved) return normalizeImport(resolved, fullname)\n }\n}\n\nexport function resolversAddon(resolvers: Resolver[]): Addon {\n return {\n name: 'unplugin-auto-import:resolvers',\n async matchImports(names, matched) {\n if (!resolvers.length) return\n const dynamic: ImportExtended[] = []\n const sideEffects: ImportExtended[] = []\n await Promise.all(\n [...names].map(async (name) => {\n const matchedImport = matched.find((i) => i.as === name)\n if (matchedImport) {\n if ('sideEffects' in matchedImport)\n sideEffects.push(\n ...toArray((matchedImport as ImportExtended).sideEffects).map(\n (i) => normalizeImport(i, ''),\n ),\n )\n\n return\n }\n const resolved = await firstMatchedResolver(resolvers, name)\n if (resolved) dynamic.push(resolved)\n\n if (resolved?.sideEffects)\n sideEffects.push(\n ...toArray(resolved?.sideEffects).map((i) =>\n normalizeImport(i, ''),\n ),\n )\n }),\n )\n\n if (dynamic.length) {\n this.dynamicImports.push(...dynamic)\n this.invalidate()\n }\n\n if (dynamic.length || sideEffects.length)\n return [...matched, ...dynamic, ...sideEffects]\n },\n }\n}\n","import { existsSync, promises as fs } from 'node:fs'\nimport { dirname, isAbsolute, relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport { slash, toArray } from '@antfu/utils'\nimport { isPackageExists } from 'local-pkg'\nimport { createUnimport, resolvePreset } from 'unimport'\nimport { presets } from '../presets'\nimport { generateBiomeLintConfigs } from './biomelintrc'\nimport { generateESLintConfigs } from './eslintrc'\nimport { resolversAddon } from './resolvers'\nimport type { Import, InlinePreset } from 'unimport'\nimport type { BiomeLintrc, ESLintrc, Options } from '../types'\n\nexport const INCLUDE_RE_LIST = [/\\.[jt]sx?$/]\nexport const EXCLUDE_RE_LIST = [/[\\\\/]node_modules[\\\\/]/, /[\\\\/]\\.git[\\\\/]/]\n\nexport function createContext(options: Options = {}, root = process.cwd()) {\n root = slash(root)\n\n const {\n dts: preferDTS = isPackageExists('typescript'),\n dtsMode = 'append',\n dtsPreserveExts = false,\n dirsScanOptions,\n dirs,\n } = options\n\n const eslintrc: ESLintrc = options.eslintrc || {}\n eslintrc.enabled = eslintrc.enabled === undefined ? false : eslintrc.enabled\n eslintrc.filepath = eslintrc.filepath || './.eslintrc-auto-import.json'\n eslintrc.globalsPropValue =\n eslintrc.globalsPropValue === undefined ? true : eslintrc.globalsPropValue\n\n const biomelintrc: BiomeLintrc = options.biomelintrc || {}\n biomelintrc.enabled = biomelintrc.enabled !== undefined\n biomelintrc.filepath =\n biomelintrc.filepath || './.biomelintrc-auto-import.json'\n\n const dumpUnimportItems =\n options.dumpUnimportItems === true\n ? './.unimport-items.json'\n : (options.dumpUnimportItems ?? false)\n\n const resolvers = options.resolvers ? [options.resolvers].flat(2) : []\n\n // When \"options.injectAtEnd\" is undefined or true, it's true.\n const injectAtEnd = options.injectAtEnd !== false\n\n const unimport = createUnimport({\n imports: [],\n presets:\n options.packagePresets?.map((p) =>\n typeof p === 'string' ? { package: p } : p,\n ) ?? [],\n dirsScanOptions: {\n ...dirsScanOptions,\n cwd: root,\n },\n dirs,\n injectAtEnd,\n parser: options.parser,\n addons: {\n addons: [\n resolversAddon(resolvers),\n {\n name: 'unplugin-auto-import:dts',\n declaration(dts) {\n return `${`\n/* eslint-disable */\n/* prettier-ignore */\n// @ts-nocheck\n// noinspection JSUnusedGlobalSymbols\n// Generated by unplugin-auto-import\n// biome-ignore lint: disable\n${dts}`.trim()}\\n`\n },\n },\n ],\n },\n })\n\n const importsPromise = flattenImports(options.imports).then((imports) => {\n if (!imports.length && !resolvers.length && !dirs?.length)\n console.warn(\n '[auto-import] plugin installed but no imports has defined, see https://github.com/antfu/unplugin-auto-import#configurations for configurations',\n )\n\n const compare = (\n left: string | undefined,\n right: NonNullable<Options['ignore'] | Options['ignoreDts']>[number],\n ) => {\n return right instanceof RegExp ? right.test(left!) : right === left\n }\n\n options.ignore?.forEach((name) => {\n const i = imports.find((i) => compare(i.as, name))\n if (i) i.disabled = true\n })\n\n options.ignoreDts?.forEach((name) => {\n const i = imports.find((i) => compare(i.as, name))\n if (i) i.dtsDisabled = true\n })\n\n return unimport.getInternalContext().replaceImports(imports)\n })\n\n const dts =\n preferDTS === false\n ? false\n : preferDTS === true\n ? resolve(root, 'auto-imports.d.ts')\n : resolve(root, preferDTS)\n\n const multilineCommentsRE = /\\/\\*.*?\\*\\//gs\n const singlelineCommentsRE = /\\/\\/.*$/gm\n const dtsReg = /declare\\s+global\\s*\\{(.*?)[\\n\\r]\\}/s\n function parseDTS(dts: string) {\n dts = dts.replace(multilineCommentsRE, '').replace(singlelineCommentsRE, '')\n\n const code = dts.match(dtsReg)?.[0]\n if (!code) return\n\n return Object.fromEntries(\n Array.from(\n code.matchAll(/['\"]?(const\\s*[^\\s'\"]+)['\"]?\\s*:\\s*(.+?)[,;\\r\\n]/g),\n ).map((i) => [i[1], i[2]]),\n )\n }\n\n async function generateDTS(file: string) {\n await importsPromise\n const dir = dirname(file)\n const originalContent = existsSync(file)\n ? await fs.readFile(file, 'utf-8')\n : ''\n const originalDTS = parseDTS(originalContent)\n const currentContent = await unimport.generateTypeDeclarations({\n resolvePath: (i) => {\n if (i.from.startsWith('.') || isAbsolute(i.from)) {\n const related = slash(\n dtsPreserveExts\n ? relative(dir, i.from)\n : relative(dir, i.from).replace(/\\.ts(x)?$/, ''),\n )\n return !related.startsWith('.') ? `./${related}` : related\n }\n return i.from\n },\n })\n\n if (dtsMode === 'append') {\n const currentDTS = parseDTS(currentContent)!\n if (originalDTS) {\n Object.assign(originalDTS, currentDTS)\n\n const dtsList = Object.keys(originalDTS)\n .sort()\n .map((k) => ` ${k}: ${originalDTS[k]}`)\n return currentContent.replace(\n dtsReg,\n () => `declare global {\\n${dtsList.join('\\n')}\\n}`,\n )\n }\n }\n\n return currentContent\n }\n\n async function generateESLint() {\n return generateESLintConfigs(await unimport.getImports(), eslintrc)\n }\n\n async function generateBiomeLint() {\n return generateBiomeLintConfigs(await unimport.getImports())\n }\n\n // eslint-disable-next-line unicorn/consistent-function-scoping\n async function writeFile(filePath: string, content = '') {\n await fs.mkdir(dirname(filePath), { recursive: true })\n return await fs.writeFile(filePath, content, 'utf-8')\n }\n\n let lastDTS: string | undefined\n let lastESLint: string | undefined\n let lastBiomeLint: string | undefined\n let lastUnimportItems: string | undefined\n\n async function writeConfigFiles() {\n const promises: any[] = []\n if (dts) {\n promises.push(\n generateDTS(dts).then((content) => {\n if (content !== lastDTS) {\n lastDTS = content\n return writeFile(dts, content)\n }\n }),\n )\n }\n if (eslintrc.enabled && eslintrc.filepath) {\n const filepath = eslintrc.filepath\n promises.push(\n generateESLint().then(async (content) => {\n if (filepath.endsWith('.cjs')) content = `module.exports = ${content}`\n else if (filepath.endsWith('.mjs') || filepath.endsWith('.js'))\n content = `export default ${content}`\n\n content = `${content}\\n`\n if (content.trim() !== lastESLint?.trim()) {\n lastESLint = content\n return writeFile(eslintrc.filepath!, content)\n }\n }),\n )\n }\n\n if (biomelintrc.enabled) {\n promises.push(\n generateBiomeLint().then((content) => {\n if (content !== lastBiomeLint) {\n lastBiomeLint = content\n return writeFile(biomelintrc.filepath!, content)\n }\n }),\n )\n }\n\n if (dumpUnimportItems) {\n promises.push(\n unimport.getImports().then((items) => {\n if (!dumpUnimportItems) return\n const content = JSON.stringify(items, null, 2)\n if (content !== lastUnimportItems) {\n lastUnimportItems = content\n return writeFile(dumpUnimportItems, content)\n }\n }),\n )\n }\n\n return Promise.all(promises)\n }\n\n return {\n writeConfigFiles,\n }\n}\n\nexport async function flattenImports(\n map: Options['imports'],\n): Promise<Import[]> {\n const promises = await Promise.all(\n toArray(map).map(async (definition) => {\n if (typeof definition === 'string') {\n if (!presets[definition])\n throw new Error(`[auto-import] preset ${definition} not found`)\n const preset = presets[definition]\n definition = preset\n }\n\n if ('from' in definition && 'imports' in definition) {\n return await resolvePreset(definition as InlinePreset)\n } else {\n const resolved: Import[] = []\n for (const mod of Object.keys(definition)) {\n for (const id of definition[mod]) {\n const meta = {\n from: mod,\n } as Import\n if (Array.isArray(id)) {\n meta.name = id[0]\n meta.as = id[1]\n } else {\n meta.name = id\n meta.as = id\n }\n resolved.push(meta)\n }\n }\n return resolved\n }\n }),\n )\n\n return promises.flat()\n}\n","import { createContext } from './core/ctx'\nimport type { NextConfig } from 'next'\nimport type { Options } from './types'\n\n/**\n * Creates a Next.js auto-import context\n */\nexport function createAutoImport(options: Options = {}) {\n const ctx = createContext(options)\n\n ctx.writeConfigFiles()\n\n return (nextConfig: NextConfig = {}): NextConfig => {\n return {\n ...nextConfig,\n experimental: {\n ...nextConfig.experimental,\n swcPlugins: [\n [\n 'swc-plugin-auto-import',\n {\n presets: ['react'],\n },\n ],\n ...(nextConfig.experimental?.swcPlugins ?? []),\n ],\n },\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["react","reactDom","eslintConfigs: any","dynamic: ImportExtended[]","sideEffects: ImportExtended[]","eslintrc: ESLintrc","biomelintrc: BiomeLintrc","dts","i","fs","lastDTS: string | undefined","lastESLint: string | undefined","lastBiomeLint: string | undefined","lastUnimportItems: string | undefined","promises: any[]","promises","resolved: Import[]"],"sources":["../src/presets/react.ts","../src/presets/react-dom.ts","../src/presets/index.ts","../src/core/biomelintrc.ts","../src/core/eslintrc.ts","../src/core/resolvers.ts","../src/core/ctx.ts","../src/index.ts"],"sourcesContent":["import type { ImportsMap } from '../types'\n\nexport const CommonReactAPI = [\n 'useState',\n 'useCallback',\n 'useMemo',\n 'useEffect',\n 'useRef',\n 'useContext',\n 'useReducer',\n 'useImperativeHandle',\n 'useDebugValue',\n 'useDeferredValue',\n 'useLayoutEffect',\n 'useTransition',\n 'startTransition',\n 'useSyncExternalStore',\n 'useInsertionEffect',\n 'useId',\n 'lazy',\n 'memo',\n 'createRef',\n 'forwardRef',\n] as const\n\nexport default {\n react: [\n ...CommonReactAPI,\n 'cache',\n 'cacheSignal',\n 'createContext',\n 'use',\n 'useOptimistic',\n 'useEffectEvent',\n 'useActionState',\n 'Fragment',\n 'Suspense',\n 'Activity',\n ],\n} as const satisfies ImportsMap\n","import type { ImportsMap } from '../types'\n\nexport default {\n 'react-dom': [\n 'useFormStatus',\n 'createPortal',\n 'flushSync',\n 'preconnect',\n 'prefetchDNS',\n 'preinit',\n 'preinitModule',\n 'preload',\n 'preloadModule',\n ],\n} as const satisfies ImportsMap\n","import react from './react'\nimport reactDom from './react-dom'\n\nexport const presets = {\n 'react': react,\n 'react-dom': reactDom,\n}\n\nexport type PresetName = keyof typeof presets\n","import type { Import } from 'unimport'\n\nexport function generateBiomeLintConfigs(imports: Import[]) {\n const names = imports\n .map((i) => i.as ?? i.name)\n .filter(Boolean)\n .sort()\n\n const config = { javascript: { globals: names } }\n const jsonBody = JSON.stringify(config, null, 2)\n\n return jsonBody\n}\n","import type { Import } from 'unimport'\nimport type { ESLintrc } from '../types'\n\nexport function generateESLintConfigs(imports: Import[], eslintrc: ESLintrc) {\n const eslintConfigs: any = { globals: {} }\n\n imports\n .map((i) => i.as ?? i.name)\n .filter(Boolean)\n .sort()\n .forEach((name) => {\n eslintConfigs.globals[name] = eslintrc.globalsPropValue\n })\n const jsonBody = JSON.stringify(eslintConfigs, null, 2)\n return jsonBody\n}\n","import { toArray } from '@antfu/utils'\nimport type { Addon, Import } from 'unimport'\nimport type {\n ImportExtended,\n ImportLegacy,\n Resolver,\n ResolverResult,\n} from '../types'\n\nexport function normalizeImport(\n info: Import | ResolverResult | ImportExtended | ImportLegacy | string,\n name: string,\n): ImportExtended {\n if (typeof info === 'string') {\n return {\n name: 'default',\n as: name,\n from: info,\n }\n }\n if ('path' in info) {\n return {\n from: info.path,\n as: info.name,\n name: info.importName!,\n sideEffects: info.sideEffects,\n }\n }\n return {\n name,\n as: name,\n ...info,\n }\n}\n\nexport async function firstMatchedResolver(\n resolvers: Resolver[],\n fullname: string,\n) {\n let name = fullname\n for (const resolver of resolvers) {\n if (typeof resolver === 'object' && resolver.type === 'directive') {\n if (name.startsWith('v')) name = name.slice(1)\n else continue\n }\n const resolved = await (typeof resolver === 'function'\n ? resolver(name)\n : resolver.resolve(name))\n if (resolved) return normalizeImport(resolved, fullname)\n }\n}\n\nexport function resolversAddon(resolvers: Resolver[]): Addon {\n return {\n name: 'unplugin-auto-import:resolvers',\n async matchImports(names, matched) {\n if (!resolvers.length) return\n const dynamic: ImportExtended[] = []\n const sideEffects: ImportExtended[] = []\n await Promise.all(\n [...names].map(async (name) => {\n const matchedImport = matched.find((i) => i.as === name)\n if (matchedImport) {\n if ('sideEffects' in matchedImport)\n sideEffects.push(\n ...toArray((matchedImport as ImportExtended).sideEffects).map(\n (i) => normalizeImport(i, ''),\n ),\n )\n\n return\n }\n const resolved = await firstMatchedResolver(resolvers, name)\n if (resolved) dynamic.push(resolved)\n\n if (resolved?.sideEffects)\n sideEffects.push(\n ...toArray(resolved?.sideEffects).map((i) =>\n normalizeImport(i, ''),\n ),\n )\n }),\n )\n\n if (dynamic.length) {\n this.dynamicImports.push(...dynamic)\n this.invalidate()\n }\n\n if (dynamic.length || sideEffects.length)\n return [...matched, ...dynamic, ...sideEffects]\n },\n }\n}\n","import { existsSync, promises as fs } from 'node:fs'\nimport { dirname, isAbsolute, relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport { slash, toArray } from '@antfu/utils'\nimport { isPackageExists } from 'local-pkg'\nimport { createUnimport, resolvePreset } from 'unimport'\nimport { presets } from '../presets'\nimport { generateBiomeLintConfigs } from './biomelintrc'\nimport { generateESLintConfigs } from './eslintrc'\nimport { resolversAddon } from './resolvers'\nimport type { Import, InlinePreset } from 'unimport'\nimport type { BiomeLintrc, ESLintrc, Options } from '../types'\n\nexport const INCLUDE_RE_LIST = [/\\.[jt]sx?$/]\nexport const EXCLUDE_RE_LIST = [/[\\\\/]node_modules[\\\\/]/, /[\\\\/]\\.git[\\\\/]/]\n\nexport function createContext(options: Options = {}, root = process.cwd()) {\n root = slash(root)\n\n const {\n dts: preferDTS = isPackageExists('typescript'),\n dtsMode = 'append',\n dtsPreserveExts = false,\n dirsScanOptions,\n dirs,\n } = options\n\n const eslintrc: ESLintrc = options.eslintrc || {}\n eslintrc.enabled = eslintrc.enabled === undefined ? false : eslintrc.enabled\n eslintrc.filepath = eslintrc.filepath || './.eslintrc-auto-import.json'\n eslintrc.globalsPropValue =\n eslintrc.globalsPropValue === undefined ? true : eslintrc.globalsPropValue\n\n const biomelintrc: BiomeLintrc = options.biomelintrc || {}\n biomelintrc.enabled = biomelintrc.enabled !== undefined\n biomelintrc.filepath =\n biomelintrc.filepath || './.biomelintrc-auto-import.json'\n\n const dumpUnimportItems =\n options.dumpUnimportItems === true\n ? './.unimport-items.json'\n : (options.dumpUnimportItems ?? false)\n\n const resolvers = options.resolvers ? [options.resolvers].flat(2) : []\n\n // When \"options.injectAtEnd\" is undefined or true, it's true.\n const injectAtEnd = options.injectAtEnd !== false\n\n const unimport = createUnimport({\n imports: [],\n presets:\n options.packagePresets?.map((p) =>\n typeof p === 'string' ? { package: p } : p,\n ) ?? [],\n dirsScanOptions: {\n ...dirsScanOptions,\n cwd: root,\n },\n dirs,\n injectAtEnd,\n parser: options.parser,\n addons: {\n addons: [\n resolversAddon(resolvers),\n {\n name: 'unplugin-auto-import:dts',\n declaration(dts) {\n return `${`\n/* eslint-disable */\n/* prettier-ignore */\n// @ts-nocheck\n// noinspection JSUnusedGlobalSymbols\n// Generated by unplugin-auto-import\n// biome-ignore lint: disable\n${dts}`.trim()}\\n`\n },\n },\n ],\n },\n })\n\n const importsPromise = flattenImports(options.imports).then((imports) => {\n if (!imports.length && !resolvers.length && !dirs?.length)\n console.warn(\n '[auto-import] plugin installed but no imports has defined, see https://github.com/antfu/unplugin-auto-import#configurations for configurations',\n )\n\n const compare = (\n left: string | undefined,\n right: NonNullable<Options['ignore'] | Options['ignoreDts']>[number],\n ) => {\n return right instanceof RegExp ? right.test(left!) : right === left\n }\n\n options.ignore?.forEach((name) => {\n const i = imports.find((i) => compare(i.as, name))\n if (i) i.disabled = true\n })\n\n options.ignoreDts?.forEach((name) => {\n const i = imports.find((i) => compare(i.as, name))\n if (i) i.dtsDisabled = true\n })\n\n return unimport.getInternalContext().replaceImports(imports)\n })\n\n const dts =\n preferDTS === false\n ? false\n : preferDTS === true\n ? resolve(root, 'auto-imports.d.ts')\n : resolve(root, preferDTS)\n\n const multilineCommentsRE = /\\/\\*.*?\\*\\//gs\n const singlelineCommentsRE = /\\/\\/.*$/gm\n const dtsReg = /declare\\s+global\\s*\\{(.*?)[\\n\\r]\\}/s\n function parseDTS(dts: string) {\n dts = dts.replace(multilineCommentsRE, '').replace(singlelineCommentsRE, '')\n\n const code = dts.match(dtsReg)?.[0]\n if (!code) return\n\n return Object.fromEntries(\n Array.from(\n code.matchAll(/['\"]?(const\\s*[^\\s'\"]+)['\"]?\\s*:\\s*(.+?)[,;\\r\\n]/g),\n ).map((i) => [i[1], i[2]]),\n )\n }\n\n async function generateDTS(file: string) {\n await importsPromise\n const dir = dirname(file)\n const originalContent = existsSync(file)\n ? await fs.readFile(file, 'utf-8')\n : ''\n const originalDTS = parseDTS(originalContent)\n const currentContent = await unimport.generateTypeDeclarations({\n resolvePath: (i) => {\n if (i.from.startsWith('.') || isAbsolute(i.from)) {\n const related = slash(\n dtsPreserveExts\n ? relative(dir, i.from)\n : relative(dir, i.from).replace(/\\.ts(x)?$/, ''),\n )\n return !related.startsWith('.') ? `./${related}` : related\n }\n return i.from\n },\n })\n\n if (dtsMode === 'append') {\n const currentDTS = parseDTS(currentContent)!\n if (originalDTS) {\n Object.assign(originalDTS, currentDTS)\n\n const dtsList = Object.keys(originalDTS)\n .sort()\n .map((k) => ` ${k}: ${originalDTS[k]}`)\n return currentContent.replace(\n dtsReg,\n () => `declare global {\\n${dtsList.join('\\n')}\\n}`,\n )\n }\n }\n\n return currentContent\n }\n\n async function generateESLint() {\n return generateESLintConfigs(await unimport.getImports(), eslintrc)\n }\n\n async function generateBiomeLint() {\n return generateBiomeLintConfigs(await unimport.getImports())\n }\n\n // eslint-disable-next-line unicorn/consistent-function-scoping\n async function writeFile(filePath: string, content = '') {\n await fs.mkdir(dirname(filePath), { recursive: true })\n return await fs.writeFile(filePath, content, 'utf-8')\n }\n\n let lastDTS: string | undefined\n let lastESLint: string | undefined\n let lastBiomeLint: string | undefined\n let lastUnimportItems: string | undefined\n\n async function writeConfigFiles() {\n const promises: any[] = []\n if (dts) {\n promises.push(\n generateDTS(dts).then((content) => {\n if (content !== lastDTS) {\n lastDTS = content\n return writeFile(dts, content)\n }\n }),\n )\n }\n if (eslintrc.enabled && eslintrc.filepath) {\n const filepath = eslintrc.filepath\n promises.push(\n generateESLint().then(async (content) => {\n if (filepath.endsWith('.cjs')) content = `module.exports = ${content}`\n else if (filepath.endsWith('.mjs') || filepath.endsWith('.js'))\n content = `export default ${content}`\n\n content = `${content}\\n`\n if (content.trim() !== lastESLint?.trim()) {\n lastESLint = content\n return writeFile(eslintrc.filepath!, content)\n }\n }),\n )\n }\n\n if (biomelintrc.enabled) {\n promises.push(\n generateBiomeLint().then((content) => {\n if (content !== lastBiomeLint) {\n lastBiomeLint = content\n return writeFile(biomelintrc.filepath!, content)\n }\n }),\n )\n }\n\n if (dumpUnimportItems) {\n promises.push(\n unimport.getImports().then((items) => {\n if (!dumpUnimportItems) return\n const content = JSON.stringify(items, null, 2)\n if (content !== lastUnimportItems) {\n lastUnimportItems = content\n return writeFile(dumpUnimportItems, content)\n }\n }),\n )\n }\n\n return Promise.all(promises)\n }\n\n return {\n writeConfigFiles,\n }\n}\n\nexport async function flattenImports(\n map: Options['imports'],\n): Promise<Import[]> {\n const promises = await Promise.all(\n toArray(map).map(async (definition) => {\n if (typeof definition === 'string') {\n if (!presets[definition])\n throw new Error(`[auto-import] preset ${definition} not found`)\n const preset = presets[definition]\n definition = preset\n }\n\n if ('from' in definition && 'imports' in definition) {\n return await resolvePreset(definition as InlinePreset)\n } else {\n const resolved: Import[] = []\n for (const mod of Object.keys(definition)) {\n for (const id of definition[mod]) {\n const meta = {\n from: mod,\n } as Import\n if (Array.isArray(id)) {\n meta.name = id[0]\n meta.as = id[1]\n } else {\n meta.name = id\n meta.as = id\n }\n resolved.push(meta)\n }\n }\n return resolved\n }\n }),\n )\n\n return promises.flat()\n}\n","import { createContext } from './core/ctx'\nimport type { NextConfig } from 'next'\nimport type { Options } from './types'\n\n/**\n * Creates a Next.js auto-import context\n */\nexport function createAutoImport(options: Options = {}) {\n const ctx = createContext(options)\n\n ctx.writeConfigFiles()\n\n return (nextConfig: NextConfig = {}): NextConfig => {\n return {\n ...nextConfig,\n experimental: {\n ...nextConfig.experimental,\n swcPlugins: [\n [\n 'swc-plugin-auto-import',\n {\n imports: options.imports,\n },\n ],\n ...(nextConfig.experimental?.swcPlugins ?? []),\n ],\n },\n }\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "next-auto-import",
3
3
  "type": "module",
4
- "version": "0.0.0",
4
+ "version": "0.0.1",
5
5
  "description": "Auto-import generator for Next.js projects",
6
6
  "author": "Brendan Dash <me@aiwan.run> (https://aiwan.run)",
7
7
  "license": "MIT",
@@ -33,13 +33,13 @@
33
33
  "src"
34
34
  ],
35
35
  "peerDependencies": {
36
- "next": "^16.1.1"
36
+ "next": "^16.1.1",
37
+ "swc-plugin-auto-import": "0.0.2"
37
38
  },
38
39
  "dependencies": {
39
40
  "@antfu/utils": "^9.3.0",
40
41
  "local-pkg": "^1.1.2",
41
42
  "magic-string": "^0.30.21",
42
- "swc-plugin-auto-import": "^0.0.1",
43
43
  "unimport": "^5.6.0",
44
44
  "unplugin-utils": "^0.3.1"
45
45
  },
package/src/index.ts CHANGED
@@ -19,7 +19,7 @@ export function createAutoImport(options: Options = {}) {
19
19
  [
20
20
  'swc-plugin-auto-import',
21
21
  {
22
- presets: ['react'],
22
+ imports: options.imports,
23
23
  },
24
24
  ],
25
25
  ...(nextConfig.experimental?.swcPlugins ?? []),
@@ -1,80 +0,0 @@
1
- import { slash } from '@antfu/utils'
2
- import { isPackageExists } from 'local-pkg'
3
- import pm from 'picomatch'
4
- import { createUnplugin } from 'unplugin'
5
- import { createContext, EXCLUDE_RE_LIST, INCLUDE_RE_LIST } from './ctx'
6
- import type { FilterPattern } from 'unplugin'
7
- import type { Options } from '../types'
8
-
9
- export default createUnplugin<Options>((options) => {
10
- let ctx = createContext(options)
11
- return {
12
- name: 'unplugin-auto-import',
13
- enforce: 'post',
14
- transformInclude(id) {
15
- return ctx.filter(id)
16
- },
17
- transform: {
18
- filter: {
19
- id: {
20
- include: (options.include as FilterPattern) || INCLUDE_RE_LIST,
21
- exclude: (options.exclude as FilterPattern) || EXCLUDE_RE_LIST,
22
- },
23
- },
24
- async handler(code, id) {
25
- return ctx.transform(code, id)
26
- },
27
- },
28
- async buildStart() {
29
- await ctx.scanDirs()
30
- },
31
- async buildEnd() {
32
- await ctx.writeConfigFiles()
33
- },
34
- vite: {
35
- async config(config) {
36
- if (options.viteOptimizeDeps === false) return
37
-
38
- const exclude = config.optimizeDeps?.exclude || []
39
-
40
- const imports = new Set(
41
- (await ctx.unimport.getImports())
42
- .map((i) => i.from)
43
- .filter(
44
- (i) =>
45
- i.match(/^[a-z@]/) &&
46
- !exclude.includes(i) &&
47
- isPackageExists(i),
48
- ),
49
- )
50
-
51
- if (!imports.size) return
52
-
53
- return {
54
- optimizeDeps: {
55
- include: [...imports],
56
- },
57
- }
58
- },
59
- async handleHotUpdate({ file }) {
60
- if (!ctx.dirs?.length) return
61
-
62
- if (ctx.configFilePaths.includes(file)) return
63
-
64
- const normalizedFilePath = slash(file)
65
-
66
- const shouldRescan = ctx.normalizedDirPaths.some((dirPath) =>
67
- pm.isMatch(normalizedFilePath, dirPath.glob),
68
- )
69
-
70
- if (shouldRescan) await ctx.scanDirs()
71
- },
72
- async configResolved(config) {
73
- if (ctx.root !== config.root) {
74
- ctx = createContext(options, config.root)
75
- await ctx.scanDirs()
76
- }
77
- },
78
- },
79
- }
80
- })