|
- import {
- __spreadValues,
- presets
- } from "./chunk-7TX24XEC.js";
-
- // src/core/unplugin.ts
- import minimatch from "minimatch";
- import { slash as slash2 } from "@antfu/utils";
- import { createUnplugin } from "unplugin";
-
- // src/core/ctx.ts
- import { dirname, isAbsolute, posix, relative, resolve, sep } from "path";
- import { promises as fs } from "fs";
- import { slash, throttle, toArray as toArray2 } from "@antfu/utils";
- import { createFilter } from "@rollup/pluginutils";
- import { isPackageExists } from "local-pkg";
- import { createUnimport, resolvePreset, scanDirExports } from "unimport";
- import { vueTemplateAddon } from "unimport/addons";
- import MagicString from "magic-string";
-
- // src/core/eslintrc.ts
- function generateESLintConfigs(imports, eslintrc) {
- const eslintConfigs = { globals: {} };
- imports.map((i) => {
- var _a;
- return (_a = i.as) != null ? _a : i.name;
- }).filter(Boolean).sort().forEach((name) => {
- eslintConfigs.globals[name] = eslintrc.globalsPropValue || true;
- });
- const jsonBody = JSON.stringify(eslintConfigs, null, 2);
- return jsonBody;
- }
-
- // src/core/resolvers.ts
- import { toArray } from "@antfu/utils";
- function normalizeImport(info, name) {
- if (typeof info === "string") {
- return {
- name: "default",
- as: name,
- from: info
- };
- }
- if ("path" in info) {
- return {
- from: info.path,
- as: info.name,
- name: info.importName,
- sideEffects: info.sideEffects
- };
- }
- return __spreadValues({
- name,
- as: name
- }, info);
- }
- async function firstMatchedResolver(resolvers, fullname) {
- let name = fullname;
- for (const resolver of resolvers) {
- if (typeof resolver === "object" && resolver.type === "directive") {
- if (name.startsWith("v"))
- name = name.slice(1);
- else
- continue;
- }
- const resolved = await (typeof resolver === "function" ? resolver(name) : resolver.resolve(name));
- if (resolved)
- return normalizeImport(resolved, fullname);
- }
- }
- function resolversAddon(resolvers) {
- return {
- async matchImports(names, matched) {
- if (!resolvers.length)
- return;
- const dynamic = [];
- const sideEffects = [];
- await Promise.all([...names].map(async (name) => {
- const matchedImport = matched.find((i) => i.as === name);
- if (matchedImport) {
- if ("sideEffects" in matchedImport)
- sideEffects.push(...toArray(matchedImport.sideEffects).map((i) => normalizeImport(i, "")));
- return;
- }
- const resolved = await firstMatchedResolver(resolvers, name);
- if (resolved)
- dynamic.push(resolved);
- if (resolved == null ? void 0 : resolved.sideEffects)
- sideEffects.push(...toArray(resolved == null ? void 0 : resolved.sideEffects).map((i) => normalizeImport(i, "")));
- }));
- if (dynamic.length) {
- this.dynamicImports.push(...dynamic);
- this.invalidate();
- }
- if (dynamic.length || sideEffects.length)
- return [...matched, ...dynamic, ...sideEffects];
- }
- };
- }
-
- // src/core/ctx.ts
- function createContext(options = {}, root = process.cwd()) {
- var _a;
- const {
- dts: preferDTS = isPackageExists("typescript"),
- cache: isCache = false
- } = options;
- const dirs = (_a = options.dirs) == null ? void 0 : _a.map((dir) => resolve(root, dir));
- const eslintrc = options.eslintrc || {};
- eslintrc.enabled = eslintrc.enabled === void 0 ? false : eslintrc.enabled;
- eslintrc.filepath = eslintrc.filepath || "./.eslintrc-auto-import.json";
- eslintrc.globalsPropValue = eslintrc.globalsPropValue === void 0 ? true : eslintrc.globalsPropValue;
- const resolvers = options.resolvers ? [options.resolvers].flat(2) : [];
- const cachePath = isCache === false ? false : resolve(root, typeof isCache === "string" ? isCache : "node_modules/.cache/unplugin-auto-import.json");
- const injectAtEnd = options.injectAtEnd !== false;
- const unimport = createUnimport({
- imports: [],
- presets: [],
- injectAtEnd,
- addons: [
- ...options.vueTemplate ? [vueTemplateAddon()] : [],
- resolversAddon(resolvers),
- {
- declaration(dts2) {
- return `${`
- /* eslint-disable */
- /* prettier-ignore */
- // @ts-nocheck
- // Generated by unplugin-auto-import
- ${dts2}`.trim()}
- `;
- }
- }
- ]
- });
- const importsPromise = flattenImports(options.imports).then((imports) => {
- var _a2;
- if (!imports.length && !resolvers.length)
- console.warn("[auto-import] plugin installed but no imports has defined, see https://github.com/antfu/unplugin-auto-import#configurations for configurations");
- (_a2 = options.ignore) == null ? void 0 : _a2.forEach((name) => {
- const i = imports.find((i2) => i2.as === name);
- if (i)
- i.disabled = true;
- });
- return unimport.getInternalContext().replaceImports(imports);
- });
- const filter = createFilter(
- options.include || [/\.[jt]sx?$/, /\.vue$/, /\.vue\?vue/, /\.svelte$/],
- options.exclude || [/[\\/]node_modules[\\/]/, /[\\/]\.git[\\/]/]
- );
- const dts = preferDTS === false ? false : preferDTS === true ? resolve(root, "auto-imports.d.ts") : resolve(root, preferDTS);
- async function generateDTS(file) {
- await importsPromise;
- const dir = dirname(file);
- return unimport.generateTypeDeclarations({
- resolvePath: (i) => {
- if (i.from.startsWith(".") || isAbsolute(i.from)) {
- const related = slash(relative(dir, i.from).replace(/\.ts(x)?$/, ""));
- return !related.startsWith(".") ? `./${related}` : related;
- }
- return i.from;
- }
- });
- }
- async function generateESLint() {
- return generateESLintConfigs(await unimport.getImports(), eslintrc);
- }
- const writeConfigFilesThrottled = throttle(500, writeConfigFiles, { noLeading: false });
- const writeFileThrottled = throttle(500, writeFile, { noLeading: false });
- async function writeFile(filePath, content = "") {
- await fs.mkdir(dirname(filePath), { recursive: true });
- return await fs.writeFile(filePath, content, "utf-8");
- }
- let lastDTS;
- let lastESLint;
- async function writeConfigFiles() {
- const promises = [];
- if (dts) {
- promises.push(
- generateDTS(dts).then((content) => {
- if (content !== lastDTS) {
- lastDTS = content;
- return writeFile(dts, content);
- }
- })
- );
- }
- if (eslintrc.enabled && eslintrc.filepath) {
- promises.push(
- generateESLint().then((content) => {
- if (content !== lastESLint) {
- lastESLint = `${content}
- `;
- return writeFile(eslintrc.filepath, content);
- }
- })
- );
- }
- return Promise.all(promises);
- }
- async function scanDirs() {
- if (dirs == null ? void 0 : dirs.length) {
- await unimport.modifyDynamicImports(async (imports) => {
- const exports = await scanDirExports(dirs, {
- filePatterns: ["*.{tsx,jsx,ts,js,mjs,cjs,mts,cts}"]
- });
- exports.forEach((i) => i.__source = "dir");
- return modifyDefaultExportsAlias([
- ...imports.filter((i) => i.__source !== "dir"),
- ...exports
- ], options);
- });
- }
- writeConfigFilesThrottled();
- }
- async function getCacheData(cache) {
- const str = (await fs.readFile(cache, "utf-8")).trim();
- return JSON.parse(str || "{}");
- }
- async function generateCache() {
- if (!cachePath)
- return {};
- let cacheData = {};
- try {
- cacheData = await getCacheData(cachePath);
- await Promise.allSettled(Object.keys(cacheData).map(async (filePath) => {
- try {
- const normalizeRoot = root.replaceAll(sep, posix.sep);
- await fs.access(posix.join(normalizeRoot, filePath));
- } catch (e) {
- Reflect.deleteProperty(cacheData, filePath);
- }
- }));
- await writeFile(cachePath, JSON.stringify(cacheData, null, 2));
- } catch (e) {
- await writeFile(cachePath, "{}");
- }
- return cacheData;
- }
- let isInitialCache = false;
- const resolveCachePromise = generateCache();
- async function updateCacheImports(id, importList) {
- if (!cachePath || isInitialCache && !id)
- return;
- isInitialCache = true;
- const cacheData = await resolveCachePromise;
- await unimport.modifyDynamicImports(async (imports) => {
- if (id && importList) {
- const filePath = posix.normalize(posix.relative(root, id));
- importList = importList.filter((i) => {
- var _a2;
- return ((_a2 = i.name) != null ? _a2 : i.as) && i.name !== "default";
- });
- if (importList.length)
- cacheData[filePath] = importList;
- else
- delete cacheData[filePath];
- writeFileThrottled(cachePath, JSON.stringify(cacheData, null, 2));
- return imports.concat(importList);
- }
- return imports.concat(Object.values(cacheData).reduce((p, n) => p.concat(n), []));
- });
- }
- async function transform(code, id) {
- await importsPromise;
- const s = new MagicString(code);
- const res = await unimport.injectImports(s, id);
- await updateCacheImports(id, res.imports);
- if (!s.hasChanged())
- return;
- writeConfigFilesThrottled();
- return {
- code: s.toString(),
- map: s.generateMap({ source: id, includeContent: true })
- };
- }
- return {
- root,
- dirs,
- filter,
- scanDirs,
- updateCacheImports,
- writeConfigFiles,
- writeConfigFilesThrottled,
- transform,
- generateDTS,
- generateESLint
- };
- }
- async function flattenImports(map) {
- const promises = await Promise.all(toArray2(map).map(async (definition) => {
- if (typeof definition === "string") {
- if (!presets[definition])
- throw new Error(`[auto-import] preset ${definition} not found`);
- const preset = presets[definition];
- definition = typeof preset === "function" ? preset() : preset;
- }
- if ("from" in definition && "imports" in definition) {
- return await resolvePreset(definition);
- } else {
- const resolved = [];
- for (const mod of Object.keys(definition)) {
- for (const id of definition[mod]) {
- const meta = {
- from: mod
- };
- if (Array.isArray(id)) {
- meta.name = id[0];
- meta.as = id[1];
- } else {
- meta.name = id;
- meta.as = id;
- }
- resolved.push(meta);
- }
- }
- return resolved;
- }
- }));
- return promises.flat();
- }
- function modifyDefaultExportsAlias(imports, options) {
- if (options.defaultExportByFilename) {
- imports.forEach((i) => {
- var _a, _b, _c;
- if (i.name === "default")
- i.as = (_c = (_b = (_a = i.from.split("/").pop()) == null ? void 0 : _a.split(".")) == null ? void 0 : _b.shift()) != null ? _c : i.as;
- });
- }
- return imports;
- }
-
- // src/core/unplugin.ts
- var unplugin_default = createUnplugin((options) => {
- let ctx = createContext(options);
- return {
- name: "unplugin-auto-import",
- enforce: "post",
- transformInclude(id) {
- return ctx.filter(id);
- },
- async transform(code, id) {
- return ctx.transform(code, id);
- },
- async buildStart() {
- await Promise.all([
- ctx.scanDirs(),
- ctx.updateCacheImports()
- ]);
- await ctx.writeConfigFiles();
- },
- async buildEnd() {
- await ctx.writeConfigFiles();
- },
- vite: {
- async handleHotUpdate({ file }) {
- var _a;
- if ((_a = ctx.dirs) == null ? void 0 : _a.some((glob) => minimatch(slash2(file), glob)))
- await ctx.scanDirs();
- },
- async configResolved(config) {
- if (ctx.root !== config.root) {
- ctx = createContext(options, config.root);
- await ctx.scanDirs();
- }
- }
- }
- };
- });
-
- export {
- unplugin_default
- };
|