| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905 |
- 'use strict';
- const fs = require('fs');
- const fg = require('fast-glob');
- const pathe = require('pathe');
- const mlly = require('mlly');
- const scule = require('scule');
- const vueTemplate = require('./unimport.4f90cbbb.cjs');
- const localPkg = require('local-pkg');
- const os = require('os');
- const pkgTypes = require('pkg-types');
- const pinia = vueTemplate.defineUnimportPreset({
- from: "pinia",
- imports: [
- // https://pinia.esm.dev/api/modules/pinia.html#functions
- "acceptHMRUpdate",
- "createPinia",
- "defineStore",
- "getActivePinia",
- "mapActions",
- "mapGetters",
- "mapState",
- "mapStores",
- "mapWritableState",
- "setActivePinia",
- "setMapStoreSuffix",
- "storeToRefs"
- ]
- });
- const preact = vueTemplate.defineUnimportPreset({
- from: "preact",
- imports: [
- "useState",
- "useCallback",
- "useMemo",
- "useEffect",
- "useRef",
- "useContext",
- "useReducer"
- ]
- });
- const quasar = vueTemplate.defineUnimportPreset({
- from: "quasar",
- imports: [
- // https://quasar.dev/vue-composables
- "useQuasar",
- "useDialogPluginComponent",
- "useFormChild",
- "useMeta"
- ]
- });
- const react = vueTemplate.defineUnimportPreset({
- from: "react",
- imports: [
- "useState",
- "useCallback",
- "useMemo",
- "useEffect",
- "useRef",
- "useContext",
- "useReducer"
- ]
- });
- const ReactRouterHooks = [
- "useOutletContext",
- "useHref",
- "useInRouterContext",
- "useLocation",
- "useNavigationType",
- "useNavigate",
- "useOutlet",
- "useParams",
- "useResolvedPath",
- "useRoutes"
- ];
- const reactRouter = vueTemplate.defineUnimportPreset({
- from: "react-router",
- imports: [
- ...ReactRouterHooks
- ]
- });
- const reactRouterDom = vueTemplate.defineUnimportPreset({
- from: "react-router-dom",
- imports: [
- ...ReactRouterHooks,
- // react-router-dom only hooks
- "useLinkClickHandler",
- "useSearchParams",
- // react-router-dom Component
- // call once in general
- // 'BrowserRouter',
- // 'HashRouter',
- // 'MemoryRouter',
- "Link",
- "NavLink",
- "Navigate",
- "Outlet",
- "Route",
- "Routes"
- ]
- });
- const svelteAnimate = vueTemplate.defineUnimportPreset({
- from: "svelte/animate",
- imports: [
- "flip"
- ]
- });
- const svelteEasing = vueTemplate.defineUnimportPreset({
- from: "svelte/easing",
- imports: [
- "back",
- "bounce",
- "circ",
- "cubic",
- "elastic",
- "expo",
- "quad",
- "quart",
- "quint",
- "sine"
- ].reduce((acc, e) => {
- acc.push(`${e}In`, `${e}Out`, `${e}InOut`);
- return acc;
- }, ["linear"])
- });
- const svelteStore = vueTemplate.defineUnimportPreset({
- from: "svelte/store",
- imports: [
- "writable",
- "readable",
- "derived",
- "get"
- ]
- });
- const svelteMotion = vueTemplate.defineUnimportPreset({
- from: "svelte/motion",
- imports: [
- "tweened",
- "spring"
- ]
- });
- const svelteTransition = vueTemplate.defineUnimportPreset({
- from: "svelte/transition",
- imports: [
- "fade",
- "blur",
- "fly",
- "slide",
- "scale",
- "draw",
- "crossfade"
- ]
- });
- const svelte = vueTemplate.defineUnimportPreset({
- from: "svelte",
- imports: [
- // lifecycle
- "onMount",
- "beforeUpdate",
- "afterUpdate",
- "onDestroy",
- // tick
- "tick",
- // context
- "setContext",
- "getContext",
- "hasContext",
- "getAllContexts",
- // event dispatcher
- "createEventDispatcher"
- ]
- });
- const veeValidate = vueTemplate.defineUnimportPreset({
- from: "vee-validate",
- imports: [
- // https://vee-validate.logaretm.com/v4/guide/composition-api/api-review
- // https://github.com/logaretm/vee-validate/blob/main/packages/vee-validate/src/index.ts
- "validate",
- "defineRule",
- "configure",
- "useField",
- "useForm",
- "useFieldArray",
- "useResetForm",
- "useIsFieldDirty",
- "useIsFieldTouched",
- "useIsFieldValid",
- "useIsSubmitting",
- "useValidateField",
- "useIsFormDirty",
- "useIsFormTouched",
- "useIsFormValid",
- "useValidateForm",
- "useSubmitCount",
- "useFieldValue",
- "useFormValues",
- "useFormErrors",
- "useFieldError",
- "useSubmitForm",
- "FormContextKey",
- "FieldContextKey"
- ]
- });
- const vitepress = vueTemplate.defineUnimportPreset({
- from: "vitepress",
- imports: [
- // helper methods
- "useData",
- "useRoute",
- "useRouter",
- "withBase"
- ]
- });
- const CommonCompositionAPI = [
- // lifecycle
- "onActivated",
- "onBeforeMount",
- "onBeforeUnmount",
- "onBeforeUpdate",
- "onErrorCaptured",
- "onDeactivated",
- "onMounted",
- "onServerPrefetch",
- "onUnmounted",
- "onUpdated",
- // setup helpers
- "useAttrs",
- "useSlots",
- // reactivity,
- "computed",
- "customRef",
- "isReadonly",
- "isRef",
- "markRaw",
- "reactive",
- "readonly",
- "ref",
- "shallowReactive",
- "shallowReadonly",
- "shallowRef",
- "triggerRef",
- "toRaw",
- "toRef",
- "toRefs",
- "unref",
- "watch",
- "watchEffect",
- // component
- "defineComponent",
- "defineAsyncComponent",
- "getCurrentInstance",
- "h",
- "inject",
- "nextTick",
- "provide",
- "useCssModule",
- "createApp",
- // effect scope
- "effectScope",
- "EffectScope",
- "getCurrentScope",
- "onScopeDispose"
- ];
- const vue = vueTemplate.defineUnimportPreset({
- from: "vue",
- imports: [
- ...CommonCompositionAPI,
- // vue3 only
- "onRenderTracked",
- "onRenderTriggered",
- "resolveComponent",
- "useCssVars"
- ]
- });
- const vueMacros = vueTemplate.defineUnimportPreset({
- from: "vue/macros",
- imports: [
- // https://vuejs.org/guide/extras/reactivity-transform.html#refs-vs-reactive-variables
- "$",
- "$$",
- "$ref",
- "$shallowRef",
- "$toRef",
- "$customRef",
- "$computed"
- ]
- });
- const vueDemi = vueTemplate.defineUnimportPreset({
- from: "vue-demi",
- imports: CommonCompositionAPI
- });
- const vueI18n = vueTemplate.defineUnimportPreset({
- from: "vue-i18n",
- imports: [
- "useI18n"
- ]
- });
- const vueRouter = vueTemplate.defineUnimportPreset({
- from: "vue-router",
- imports: [
- "useRouter",
- "useRoute"
- ]
- });
- const vueCompositionApi = vueTemplate.defineUnimportPreset({
- from: "@vue/composition-api",
- imports: CommonCompositionAPI
- });
- let _cache;
- const vueuseCore = () => {
- const excluded = ["toRefs", "utils"];
- if (!_cache) {
- try {
- const corePath = localPkg.resolveModule("@vueuse/core") || process.cwd();
- const path = localPkg.resolveModule("@vueuse/core/indexes.json") || localPkg.resolveModule("@vueuse/metadata/index.json") || localPkg.resolveModule("@vueuse/metadata/index.json", { paths: [corePath] });
- const indexesJson = JSON.parse(fs.readFileSync(path, "utf-8"));
- _cache = vueTemplate.defineUnimportPreset({
- from: "@vueuse/core",
- imports: indexesJson.functions.filter((i) => ["core", "shared"].includes(i.package)).map((i) => i.name).filter((i) => i && i.length >= 4 && !excluded.includes(i))
- });
- } catch (error) {
- console.error(error);
- throw new Error("[auto-import] failed to load @vueuse/core, have you installed it?");
- }
- }
- return _cache;
- };
- const vueuseHead = vueTemplate.defineUnimportPreset({
- from: "@vueuse/head",
- imports: [
- "useHead"
- ]
- });
- const vuex = vueTemplate.defineUnimportPreset({
- from: "vuex",
- imports: [
- // https://next.vuex.vuejs.org/api/#createstore
- "createStore",
- // https://github.com/vuejs/vuex/blob/4.0/types/logger.d.ts#L20
- "createLogger",
- // https://next.vuex.vuejs.org/api/#component-binding-helpers
- "mapState",
- "mapGetters",
- "mapActions",
- "mapMutations",
- "createNamespacedHelpers",
- // https://next.vuex.vuejs.org/api/#composable-functions
- "useStore"
- ]
- });
- const vitest = vueTemplate.defineUnimportPreset({
- from: "vitest",
- imports: [
- // suite
- "suite",
- "test",
- "describe",
- "it",
- // chai
- "chai",
- "expect",
- "assert",
- // utils
- "vitest",
- "vi",
- // hooks
- "beforeAll",
- "afterAll",
- "beforeEach",
- "afterEach"
- ]
- });
- const uniApp = vueTemplate.defineUnimportPreset({
- from: "@dcloudio/uni-app",
- imports: [
- "onAddToFavorites",
- "onBackPress",
- "onError",
- "onHide",
- "onLaunch",
- "onLoad",
- "onNavigationBarButtonTap",
- "onNavigationBarSearchInputChanged",
- "onNavigationBarSearchInputClicked",
- "onNavigationBarSearchInputConfirmed",
- "onNavigationBarSearchInputFocusChanged",
- "onPageNotFound",
- "onPageScroll",
- "onPullDownRefresh",
- "onReachBottom",
- "onReady",
- "onResize",
- "onShareAppMessage",
- "onShareTimeline",
- "onShow",
- "onTabItemTap",
- "onThemeChange",
- "onUnhandledRejection",
- "onUnload"
- ]
- });
- const solidCore = vueTemplate.defineUnimportPreset({
- from: "solid-js",
- imports: [
- "createSignal",
- "createEffect",
- "createMemo",
- "createResource",
- "onMount",
- "onCleanup",
- "onError",
- "untrack",
- "batch",
- "on",
- "createRoot",
- "mergeProps",
- "splitProps",
- "useTransition",
- "observable",
- "mapArray",
- "indexArray",
- "createContext",
- "useContext",
- "children",
- "lazy",
- "createDeferred",
- "createRenderEffect",
- "createSelector",
- "For",
- "Show",
- "Switch",
- "Match",
- "Index",
- "ErrorBoundary",
- "Suspense",
- "SuspenseList"
- ]
- });
- const solidStore = vueTemplate.defineUnimportPreset({
- from: "solid-js/store",
- imports: [
- "createStore",
- "produce",
- "reconcile",
- "createMutable"
- ]
- });
- const solidWeb = vueTemplate.defineUnimportPreset({
- from: "solid-js/web",
- imports: [
- "Dynamic",
- "hydrate",
- "render",
- "renderToString",
- "renderToStringAsync",
- "renderToStream",
- "isServer",
- "Portal"
- ]
- });
- const solid = vueTemplate.defineUnimportPreset({
- from: "solid-js",
- imports: [
- solidCore,
- solidStore,
- solidWeb
- ]
- });
- const solidAppRouter = vueTemplate.defineUnimportPreset({
- from: "solid-app-router",
- imports: [
- "Link",
- "NavLink",
- "Navigate",
- "Outlet",
- "Route",
- "Router",
- "Routes",
- "_mergeSearchString",
- "createIntegration",
- "hashIntegration",
- "normalizeIntegration",
- "pathIntegration",
- "staticIntegration",
- "useHref",
- "useIsRouting",
- "useLocation",
- "useMatch",
- "useNavigate",
- "useParams",
- "useResolvedPath",
- "useRouteData",
- "useRoutes",
- "useSearchParams"
- ]
- });
- const builtinPresets = {
- "@vue/composition-api": vueCompositionApi,
- "@vueuse/core": vueuseCore,
- "@vueuse/head": vueuseHead,
- pinia,
- preact,
- quasar,
- react,
- "react-router": reactRouter,
- "react-router-dom": reactRouterDom,
- svelte,
- "svelte/animate": svelteAnimate,
- "svelte/easing": svelteEasing,
- "svelte/motion": svelteMotion,
- "svelte/store": svelteStore,
- "svelte/transition": svelteTransition,
- "vee-validate": veeValidate,
- vitepress,
- "vue-demi": vueDemi,
- "vue-i18n": vueI18n,
- "vue-router": vueRouter,
- vue,
- "vue/macros": vueMacros,
- vuex,
- vitest,
- "uni-app": uniApp,
- "solid-js": solid,
- "solid-app-router": solidAppRouter
- };
- const CACHE_PATH = /* @__PURE__ */ pathe.join(os.tmpdir(), "unimport");
- let CACHE_WRITEABLE;
- async function resolvePackagePreset(preset) {
- const scanned = await extractExports(preset.package, preset.url, preset.cache);
- const filtered = scanned.filter((name) => {
- for (const item of preset.ignore || []) {
- if (typeof item === "string" && item === name) {
- return false;
- }
- if (item instanceof RegExp && item.test(name)) {
- return false;
- }
- if (typeof item === "function" && item(name) === false) {
- return false;
- }
- }
- return true;
- });
- return filtered.map((name) => ({
- from: preset.package,
- name
- }));
- }
- async function extractExports(name, url, cache = true) {
- const packageJsonPath = await pkgTypes.resolvePackageJSON(name, { url });
- const packageJson = await pkgTypes.readPackageJSON(packageJsonPath);
- const version = packageJson.version;
- const cachePath = pathe.join(CACHE_PATH, name + "@" + version, "exports.json");
- if (cache && CACHE_WRITEABLE === void 0) {
- try {
- CACHE_WRITEABLE = isWritable(CACHE_PATH);
- } catch {
- CACHE_WRITEABLE = false;
- }
- }
- const useCache = cache && version && CACHE_WRITEABLE;
- if (useCache && fs.existsSync(cachePath)) {
- return JSON.parse(await fs.promises.readFile(cachePath, "utf-8"));
- }
- const scanned = await mlly.resolveModuleExportNames(name, { url });
- if (useCache) {
- await fs.promises.mkdir(pathe.dirname(cachePath), { recursive: true });
- await fs.promises.writeFile(cachePath, JSON.stringify(scanned), "utf-8");
- }
- return scanned;
- }
- function isWritable(filename) {
- try {
- fs.accessSync(filename, fs.constants.W_OK);
- return true;
- } catch (e) {
- return false;
- }
- }
- const commonProps = ["from", "priority", "disabled", "meta"];
- async function resolvePreset(preset) {
- const imports = [];
- if ("package" in preset) {
- return await resolvePackagePreset(preset);
- }
- const common = {};
- commonProps.forEach((i) => {
- if (i in preset) {
- common[i] = preset[i];
- }
- });
- for (const _import of preset.imports) {
- if (typeof _import === "string") {
- imports.push({ ...common, name: _import, as: _import });
- } else if (Array.isArray(_import)) {
- imports.push({ ...common, name: _import[0], as: _import[1] || _import[0], from: _import[2] || preset.from });
- } else if (_import.imports) {
- imports.push(...await resolvePreset(_import));
- } else {
- imports.push({ ...common, ..._import });
- }
- }
- return imports;
- }
- async function resolveBuiltinPresets(presets) {
- const resolved = await Promise.all(presets.map(async (p) => {
- let preset = typeof p === "string" ? builtinPresets[p] : p;
- if (typeof preset === "function") {
- preset = preset();
- }
- return await resolvePreset(preset);
- }));
- return resolved.flat();
- }
- async function scanDirExports(dir, options) {
- const dirs = (Array.isArray(dir) ? dir : [dir]).map((d) => pathe.normalize(d));
- const fileFilter = options?.fileFilter || (() => true);
- const filePatterns = options?.filePatterns || ["*.{ts,js,mjs,cjs,mts,cts}"];
- const result = await Promise.all(
- // Do multiple glob searches to persist the order of input dirs
- dirs.map(
- async (i) => await fg(
- [i, ...filePatterns.map((p) => pathe.join(i, p))],
- {
- absolute: true,
- cwd: options?.cwd || process.cwd(),
- onlyFiles: true,
- followSymbolicLinks: true
- }
- ).then(
- (r) => r.map((f) => pathe.normalize(f)).sort()
- )
- )
- );
- const files = Array.from(new Set(result.flat())).filter(fileFilter);
- const fileExports = await Promise.all(files.map(scanExports));
- return fileExports.flat();
- }
- async function scanExports(filepath) {
- const imports = [];
- const code = await fs.promises.readFile(filepath, "utf-8");
- const exports = mlly.findExports(code);
- const defaultExport = exports.find((i) => i.type === "default");
- if (defaultExport) {
- let name = pathe.parse(filepath).name;
- if (name === "index") {
- name = pathe.parse(filepath.split("/").slice(0, -1).join("/")).name;
- }
- imports.push({ name: "default", as: scule.camelCase(name), from: filepath });
- }
- for (const exp of exports) {
- if (exp.type === "named") {
- for (const name of exp.names) {
- imports.push({ name, as: name, from: filepath });
- }
- } else if (exp.type === "declaration") {
- if (exp.name) {
- imports.push({ name: exp.name, as: exp.name, from: filepath });
- }
- }
- }
- return imports;
- }
- function createUnimport(opts) {
- let _combinedImports;
- const _map = /* @__PURE__ */ new Map();
- const addons = [];
- if (Array.isArray(opts.addons)) {
- addons.push(...opts.addons);
- } else if (opts.addons?.vueTemplate) {
- addons.push(vueTemplate.vueTemplateAddon());
- }
- opts.addons = addons;
- opts.commentsDisable = opts.commentsDisable ?? ["@unimport-disable", "@imports-disable"];
- opts.commentsDebug = opts.commentsDebug ?? ["@unimport-debug", "@imports-debug"];
- let metadata;
- if (opts.collectMeta) {
- metadata = {
- injectionUsage: {}
- };
- }
- const ctx = {
- staticImports: [...opts.imports || []].filter(Boolean),
- dynamicImports: [],
- async getImports() {
- await resolvePromise;
- return updateImports();
- },
- async getImportMap() {
- await ctx.getImports();
- return _map;
- },
- invalidate() {
- _combinedImports = void 0;
- },
- getMetadata() {
- return metadata;
- },
- resolveId: (id, parentId) => opts.resolveId?.(id, parentId),
- addons,
- options: opts
- };
- const resolvePromise = resolveBuiltinPresets(opts.presets || []).then((r) => {
- ctx.staticImports.unshift(...r);
- _combinedImports = void 0;
- updateImports();
- });
- function updateImports() {
- if (!_combinedImports) {
- const imports = vueTemplate.normalizeImports(vueTemplate.dedupeImports([...ctx.staticImports, ...ctx.dynamicImports], opts.warn || console.warn)).filter((i) => !i.disabled);
- _map.clear();
- for (const _import of imports) {
- _map.set(_import.as ?? _import.name, _import);
- }
- _combinedImports = imports;
- }
- return _combinedImports;
- }
- async function modifyDynamicImports(fn) {
- const result = await fn(ctx.dynamicImports);
- if (Array.isArray(result)) {
- ctx.dynamicImports = result;
- }
- ctx.invalidate();
- }
- function clearDynamicImports() {
- ctx.dynamicImports.length = 0;
- ctx.invalidate();
- }
- async function generateTypeDeclarations(options) {
- const opts2 = {
- resolvePath: (i) => i.from.replace(/\.ts$/, ""),
- ...options
- };
- let dts = vueTemplate.toTypeDeclarationFile(await ctx.getImports(), opts2);
- for (const addon of ctx.addons) {
- dts = await addon.declaration?.call(ctx, dts, opts2) ?? dts;
- }
- return dts;
- }
- return {
- clearDynamicImports,
- modifyDynamicImports,
- getImports: () => ctx.getImports(),
- detectImports: (code) => detectImports(code, ctx),
- injectImports: async (code, id, options) => {
- const result = await injectImports(code, id, ctx, options);
- if (metadata) {
- result.imports.forEach((i) => {
- metadata.injectionUsage[i.name] = metadata.injectionUsage[i.name] || { import: i, count: 0, moduleIds: [] };
- metadata.injectionUsage[i.name].count++;
- if (id && !metadata.injectionUsage[i.name].moduleIds.includes(id)) {
- metadata.injectionUsage[i.name].moduleIds.push(id);
- }
- });
- }
- return result;
- },
- toExports: async (filepath) => vueTemplate.toExports(await ctx.getImports(), filepath),
- parseVirtualImports: (code) => parseVirtualImports(code, ctx),
- generateTypeDeclarations,
- getMetadata: () => ctx.getMetadata()
- };
- }
- function parseVirtualImports(code, ctx) {
- if (ctx.options.virtualImports?.length) {
- return mlly.findStaticImports(code).filter((i) => ctx.options.virtualImports.includes(i.specifier)).map((i) => mlly.parseStaticImport(i));
- }
- return [];
- }
- async function detectImports(code, ctx, options) {
- const s = vueTemplate.getMagicString(code);
- const original = s.original;
- const strippedCode = vueTemplate.stripCommentsAndStrings(original);
- const syntax = mlly.detectSyntax(strippedCode);
- const isCJSContext = syntax.hasCJS && !syntax.hasESM;
- let matchedImports = [];
- const map = await ctx.getImportMap();
- if (options?.autoImport !== false) {
- const identifiers = new Set(
- Array.from(strippedCode.matchAll(vueTemplate.matchRE)).map((i) => {
- if (i[1] === ".") {
- return "";
- }
- const end = strippedCode[i.index + i[0].length];
- if (end === ":" && !["?", "case"].includes(i[1].trim())) {
- return "";
- }
- return i[2];
- }).filter(Boolean)
- );
- for (const regex of vueTemplate.excludeRE) {
- for (const match of strippedCode.matchAll(regex)) {
- const segments = [...match[1]?.split(vueTemplate.separatorRE) || [], ...match[2]?.split(vueTemplate.separatorRE) || []];
- for (const segment of segments) {
- const identifier = segment.replace(vueTemplate.importAsRE, "").trim();
- identifiers.delete(identifier);
- }
- }
- }
- matchedImports = Array.from(identifiers).map((name) => map.get(name)).filter((i) => i && !i.disabled);
- for (const addon of ctx.addons) {
- matchedImports = await addon.matchImports?.call(ctx, identifiers, matchedImports) || matchedImports;
- }
- }
- if (options?.transformVirtualImports !== false && options?.transformVirtualImoports !== false && ctx.options.virtualImports?.length) {
- const virtualImports = parseVirtualImports(original, ctx);
- virtualImports.forEach((i) => {
- s.remove(i.start, i.end);
- Object.entries(i.namedImports || {}).forEach(([name, as]) => {
- const original2 = map.get(name);
- if (!original2) {
- throw new Error(`[unimport] failed to find "${name}" imported from "${i.specifier}"`);
- }
- matchedImports.push({
- from: original2.from,
- name: original2.name,
- as
- });
- });
- });
- }
- return {
- s,
- strippedCode,
- isCJSContext,
- matchedImports
- };
- }
- async function injectImports(code, id, ctx, options) {
- const s = vueTemplate.getMagicString(code);
- if (ctx.options.commentsDisable?.some((c) => s.original.includes(c))) {
- return {
- s,
- get code() {
- return s.toString();
- },
- imports: []
- };
- }
- for (const addon of ctx.addons) {
- await addon.transform?.call(ctx, s, id);
- }
- const { isCJSContext, matchedImports } = await detectImports(s, ctx, options);
- const imports = await resolveImports(ctx, matchedImports, id);
- if (ctx.options.commentsDebug?.some((c) => s.original.includes(c))) {
- const log = ctx.options.debugLog || console.log;
- log(`[unimport] ${imports.length} imports detected in "${id}"${imports.length ? ": " + imports.map((i) => i.name).join(", ") : ""}`);
- }
- return {
- ...vueTemplate.addImportToCode(s, imports, isCJSContext, options?.mergeExisting),
- imports
- };
- }
- async function resolveImports(ctx, imports, id) {
- const resolveCache = /* @__PURE__ */ new Map();
- const _imports = await Promise.all(imports.map(async (i) => {
- if (!resolveCache.has(i.from)) {
- resolveCache.set(i.from, await ctx.resolveId(i.from, id) || i.from);
- }
- const from = resolveCache.get(i.from);
- if (i.from === id || !from || from === "." || from === id) {
- return;
- }
- return {
- ...i,
- from
- };
- }));
- return _imports.filter(Boolean);
- }
- exports.builtinPresets = builtinPresets;
- exports.createUnimport = createUnimport;
- exports.resolveBuiltinPresets = resolveBuiltinPresets;
- exports.resolvePreset = resolvePreset;
- exports.scanDirExports = scanDirExports;
- exports.scanExports = scanExports;
|