unimport.D6_N7ILk.cjs 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473
  1. 'use strict';
  2. const vueDirectives = require('./unimport.MMUMmZ45.cjs');
  3. const mlly = require('mlly');
  4. const node_fs = require('node:fs');
  5. const promises = require('node:fs/promises');
  6. const process = require('node:process');
  7. const node_url = require('node:url');
  8. const fg = require('fast-glob');
  9. const pathe = require('pathe');
  10. const pm = require('picomatch');
  11. const scule = require('scule');
  12. const os = require('node:os');
  13. const pkgTypes = require('pkg-types');
  14. const localPkg = require('local-pkg');
  15. function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
  16. const process__default = /*#__PURE__*/_interopDefaultCompat(process);
  17. const fg__default = /*#__PURE__*/_interopDefaultCompat(fg);
  18. const pm__default = /*#__PURE__*/_interopDefaultCompat(pm);
  19. const os__default = /*#__PURE__*/_interopDefaultCompat(os);
  20. const version = "3.14.6";
  21. function configureAddons(opts) {
  22. const addons = [];
  23. if (Array.isArray(opts.addons)) {
  24. addons.push(...opts.addons);
  25. } else {
  26. const addonsMap = /* @__PURE__ */ new Map();
  27. if (opts.addons?.addons?.length) {
  28. let i = 0;
  29. for (const addon of opts.addons.addons) {
  30. addonsMap.set(addon.name || `external:custom-${i++}`, addon);
  31. }
  32. }
  33. if (opts.addons?.vueTemplate) {
  34. if (!addonsMap.has(vueDirectives.VUE_TEMPLATE_NAME)) {
  35. addonsMap.set(vueDirectives.VUE_TEMPLATE_NAME, vueDirectives.vueTemplateAddon());
  36. }
  37. }
  38. if (opts.addons?.vueDirectives) {
  39. if (!addonsMap.has(vueDirectives.VUE_DIRECTIVES_NAME)) {
  40. addonsMap.set(vueDirectives.VUE_DIRECTIVES_NAME, vueDirectives.vueDirectivesAddon(
  41. typeof opts.addons.vueDirectives === "object" ? opts.addons.vueDirectives : undefined
  42. ));
  43. }
  44. }
  45. addons.push(...addonsMap.values());
  46. }
  47. return addons;
  48. }
  49. async function detectImportsRegex(code, ctx, options) {
  50. const s = vueDirectives.getMagicString(code);
  51. const original = s.original;
  52. const strippedCode = vueDirectives.stripCommentsAndStrings(
  53. original,
  54. // Do not strip comments if they are virtual import names
  55. options?.transformVirtualImports !== false && ctx.options.virtualImports?.length ? {
  56. filter: (i) => !ctx.options.virtualImports.includes(i),
  57. fillChar: "-"
  58. } : undefined
  59. );
  60. const syntax = mlly.detectSyntax(strippedCode);
  61. const isCJSContext = syntax.hasCJS && !syntax.hasESM;
  62. let matchedImports = [];
  63. const occurrenceMap = /* @__PURE__ */ new Map();
  64. const map = await ctx.getImportMap();
  65. if (options?.autoImport !== false) {
  66. Array.from(strippedCode.matchAll(vueDirectives.matchRE)).forEach((i) => {
  67. if (i[1] === ".")
  68. return null;
  69. const end = strippedCode[i.index + i[0].length];
  70. const before = strippedCode[i.index - 1];
  71. if (end === ":" && !["?", "case"].includes(i[1].trim()) && before !== ":")
  72. return null;
  73. const name = i[2];
  74. const occurrence = i.index + i[1].length;
  75. if (occurrenceMap.get(name) || Number.POSITIVE_INFINITY > occurrence)
  76. occurrenceMap.set(name, occurrence);
  77. });
  78. for (const regex of vueDirectives.excludeRE) {
  79. for (const match of strippedCode.matchAll(regex)) {
  80. const segments = [...match[1]?.split(vueDirectives.separatorRE) || [], ...match[2]?.split(vueDirectives.separatorRE) || []];
  81. for (const segment of segments) {
  82. const identifier = segment.replace(vueDirectives.importAsRE, "").trim();
  83. occurrenceMap.delete(identifier);
  84. }
  85. }
  86. }
  87. const identifiers = new Set(occurrenceMap.keys());
  88. matchedImports = Array.from(identifiers).map((name) => {
  89. const item = map.get(name);
  90. if (item && !item.disabled)
  91. return item;
  92. occurrenceMap.delete(name);
  93. return null;
  94. }).filter(Boolean);
  95. for (const addon of ctx.addons)
  96. matchedImports = await addon.matchImports?.call(ctx, identifiers, matchedImports) || matchedImports;
  97. }
  98. if (options?.transformVirtualImports !== false && ctx.options.virtualImports?.length) {
  99. const virtualImports = parseVirtualImportsRegex(strippedCode, map, ctx.options.virtualImports);
  100. virtualImports.ranges.forEach(([start, end]) => {
  101. s.remove(start, end);
  102. });
  103. matchedImports.push(...virtualImports.imports);
  104. }
  105. const firstOccurrence = Math.min(...Array.from(occurrenceMap.entries()).map((i) => i[1]));
  106. return {
  107. s,
  108. strippedCode,
  109. isCJSContext,
  110. matchedImports,
  111. firstOccurrence
  112. };
  113. }
  114. function parseVirtualImportsRegex(strippedCode, importMap, virtualImports) {
  115. const imports = [];
  116. const ranges = [];
  117. if (virtualImports?.length) {
  118. mlly.findStaticImports(strippedCode).filter((i) => virtualImports.includes(i.specifier)).map((i) => mlly.parseStaticImport(i)).forEach((i) => {
  119. ranges.push([i.start, i.end]);
  120. Object.entries(i.namedImports || {}).forEach(([name, as]) => {
  121. const original = importMap.get(name);
  122. if (!original)
  123. throw new Error(`[unimport] failed to find "${name}" imported from "${i.specifier}"`);
  124. imports.push({
  125. from: original.from,
  126. name: original.name,
  127. as
  128. });
  129. });
  130. });
  131. }
  132. return {
  133. imports,
  134. ranges
  135. };
  136. }
  137. async function detectImports(code, ctx, options) {
  138. if (options?.parser === "acorn")
  139. return import('../chunks/detect-acorn.cjs').then((r) => r.detectImportsAcorn(code, ctx, options));
  140. return detectImportsRegex(code, ctx, options);
  141. }
  142. const FileExtensionLookup = [
  143. "mts",
  144. "cts",
  145. "ts",
  146. "tsx",
  147. "mjs",
  148. "cjs",
  149. "js",
  150. "jsx"
  151. ];
  152. const FileLookupPatterns = `*.{${FileExtensionLookup.join(",")}}`;
  153. function resolveGlobsExclude(glob, cwd) {
  154. return `${glob.startsWith("!") ? "!" : ""}${pathe.resolve(cwd, glob.replace(/^!/, ""))}`;
  155. }
  156. function joinGlobFilePattern(glob, filePattern) {
  157. return pathe.join(pathe.basename(glob) === "*" ? pathe.dirname(glob) : glob, filePattern);
  158. }
  159. function normalizeScanDirs(dirs, options) {
  160. const topLevelTypes = options?.types ?? true;
  161. const cwd = options?.cwd ?? process__default.cwd();
  162. const filePatterns = options?.filePatterns || [FileLookupPatterns];
  163. return dirs.map((dir) => {
  164. const isString = typeof dir === "string";
  165. const glob = resolveGlobsExclude(isString ? dir : dir.glob, cwd);
  166. const types = isString ? topLevelTypes : dir.types ?? topLevelTypes;
  167. if (glob.match(/\.\w+$/))
  168. return { glob, types };
  169. const withFilePatterns = filePatterns.map((filePattern) => ({ glob: joinGlobFilePattern(glob, filePattern), types }));
  170. return [{ glob, types }, ...withFilePatterns];
  171. }).flat();
  172. }
  173. async function scanFilesFromDir(dir, options) {
  174. const dirGlobs = (Array.isArray(dir) ? dir : [dir]).map((i) => i.glob);
  175. const files = (await fg__default(
  176. dirGlobs,
  177. {
  178. absolute: true,
  179. cwd: options?.cwd || process__default.cwd(),
  180. onlyFiles: true,
  181. followSymbolicLinks: true,
  182. unique: true
  183. }
  184. )).map((i) => pathe.normalize(i));
  185. const fileFilter = options?.fileFilter || (() => true);
  186. const indexOfDirs = (file) => dirGlobs.findIndex((glob) => pm__default.isMatch(file, glob));
  187. const fileSortByDirs = files.reduce((acc, file) => {
  188. const index = indexOfDirs(file);
  189. if (acc[index])
  190. acc[index].push(pathe.normalize(file));
  191. else
  192. acc[index] = [pathe.normalize(file)];
  193. return acc;
  194. }, []).map((files2) => files2.sort()).flat();
  195. return fileSortByDirs.filter(fileFilter);
  196. }
  197. async function scanDirExports(dirs, options) {
  198. const normalizedDirs = normalizeScanDirs(dirs, options);
  199. const files = await scanFilesFromDir(normalizedDirs, options);
  200. const includeTypesDirs = normalizedDirs.filter((dir) => !dir.glob.startsWith("!") && dir.types);
  201. const isIncludeTypes = (file) => includeTypesDirs.some((dir) => pm__default.isMatch(file, dir.glob));
  202. const imports = (await Promise.all(files.map((file) => scanExports(file, isIncludeTypes(file))))).flat();
  203. const deduped = dedupeDtsExports(imports);
  204. return deduped;
  205. }
  206. function dedupeDtsExports(exports) {
  207. return exports.filter((i) => {
  208. if (!i.type)
  209. return true;
  210. if (i.declarationType === "enum" || i.declarationType === "class")
  211. return true;
  212. return !exports.find((e) => e.as === i.as && e.name === i.name && !e.type);
  213. });
  214. }
  215. async function scanExports(filepath, includeTypes, seen = /* @__PURE__ */ new Set()) {
  216. if (seen.has(filepath)) {
  217. console.warn(`[unimport] "${filepath}" is already scanned, skipping`);
  218. return [];
  219. }
  220. seen.add(filepath);
  221. const imports = [];
  222. const code = await promises.readFile(filepath, "utf-8");
  223. const exports = mlly.findExports(code);
  224. const defaultExport = exports.find((i) => i.type === "default");
  225. if (defaultExport) {
  226. let name = pathe.parse(filepath).name;
  227. if (name === "index")
  228. name = pathe.parse(filepath.split("/").slice(0, -1).join("/")).name;
  229. const as = /[-_.]/.test(name) ? scule.camelCase(name) : name;
  230. imports.push({ name: "default", as, from: filepath });
  231. }
  232. async function toImport(exports2, additional) {
  233. for (const exp of exports2) {
  234. if (exp.type === "named") {
  235. for (const name of exp.names)
  236. imports.push({ name, as: name, from: filepath, ...additional });
  237. } else if (exp.type === "declaration") {
  238. if (exp.name) {
  239. imports.push({ name: exp.name, as: exp.name, from: filepath, ...additional });
  240. if (exp.declarationType === "enum" || exp.declarationType === "class") {
  241. imports.push({ name: exp.name, as: exp.name, from: filepath, type: true, declarationType: exp.declarationType, ...additional });
  242. }
  243. }
  244. } else if (exp.type === "star" && exp.specifier) {
  245. if (exp.name) {
  246. imports.push({ name: exp.name, as: exp.name, from: filepath, ...additional });
  247. } else {
  248. const subfile = exp.specifier;
  249. let subfilepath = pathe.resolve(pathe.dirname(filepath), subfile);
  250. let subfilepathResolved = false;
  251. for (const ext of FileExtensionLookup) {
  252. if (node_fs.existsSync(`${subfilepath}.${ext}`)) {
  253. subfilepath = `${subfilepath}.${ext}`;
  254. break;
  255. } else if (node_fs.existsSync(`${subfilepath}/index.${ext}`)) {
  256. subfilepath = `${subfilepath}/index.${ext}`;
  257. break;
  258. }
  259. }
  260. if (node_fs.existsSync(subfilepath)) {
  261. subfilepathResolved = true;
  262. } else {
  263. try {
  264. subfilepath = await mlly.resolve(exp.specifier);
  265. subfilepath = pathe.normalize(node_url.fileURLToPath(subfilepath));
  266. if (node_fs.existsSync(subfilepath)) {
  267. subfilepathResolved = true;
  268. }
  269. } catch {
  270. }
  271. }
  272. if (!subfilepathResolved) {
  273. console.warn(`[unimport] failed to resolve "${subfilepath}", skip scanning`);
  274. continue;
  275. }
  276. const nested = await scanExports(subfilepath, includeTypes, seen);
  277. imports.push(...additional ? nested.map((i) => ({ ...i, ...additional })) : nested);
  278. }
  279. }
  280. }
  281. }
  282. const isDts = filepath.match(/\.d\.[mc]?ts$/);
  283. if (isDts) {
  284. if (includeTypes) {
  285. await toImport(exports, { type: true });
  286. await toImport(mlly.findTypeExports(code), { type: true });
  287. }
  288. } else {
  289. await toImport(exports);
  290. if (includeTypes)
  291. await toImport(mlly.findTypeExports(code), { type: true });
  292. }
  293. return imports;
  294. }
  295. const CACHE_PATH = /* @__PURE__ */ pathe.join(os__default.tmpdir(), "unimport");
  296. let CACHE_WRITEABLE;
  297. async function resolvePackagePreset(preset) {
  298. const scanned = await extractExports(preset.package, preset.url, preset.cache);
  299. const filtered = scanned.filter((name) => {
  300. for (const item of preset.ignore || []) {
  301. if (typeof item === "string" && item === name)
  302. return false;
  303. if (item instanceof RegExp && item.test(name))
  304. return false;
  305. if (typeof item === "function" && item(name) === false)
  306. return false;
  307. }
  308. return true;
  309. });
  310. return filtered.map((name) => ({
  311. from: preset.package,
  312. name
  313. }));
  314. }
  315. async function extractExports(name, url, cache = true) {
  316. const packageJsonPath = await pkgTypes.resolvePackageJSON(name, { url });
  317. const packageJson = await pkgTypes.readPackageJSON(packageJsonPath);
  318. const version = packageJson.version;
  319. const cachePath = pathe.join(CACHE_PATH, `${name}@${version}`, "exports.json");
  320. if (cache && CACHE_WRITEABLE === undefined) {
  321. try {
  322. CACHE_WRITEABLE = isWritable(CACHE_PATH);
  323. } catch {
  324. CACHE_WRITEABLE = false;
  325. }
  326. }
  327. const useCache = cache && version && CACHE_WRITEABLE;
  328. if (useCache && node_fs.existsSync(cachePath))
  329. return JSON.parse(await node_fs.promises.readFile(cachePath, "utf-8"));
  330. const scanned = await mlly.resolveModuleExportNames(name, { url });
  331. if (useCache) {
  332. await node_fs.promises.mkdir(pathe.dirname(cachePath), { recursive: true });
  333. await node_fs.promises.writeFile(cachePath, JSON.stringify(scanned), "utf-8");
  334. }
  335. return scanned;
  336. }
  337. function isWritable(filename) {
  338. try {
  339. node_fs.accessSync(filename, node_fs.constants.W_OK);
  340. return true;
  341. } catch {
  342. return false;
  343. }
  344. }
  345. const dateFns = vueDirectives.defineUnimportPreset({
  346. from: "date-fns",
  347. imports: [
  348. "add",
  349. "addBusinessDays",
  350. "addDays",
  351. "addHours",
  352. "addISOWeekYears",
  353. "addMilliseconds",
  354. "addMinutes",
  355. "addMonths",
  356. "addQuarters",
  357. "addSeconds",
  358. "addWeeks",
  359. "addYears",
  360. "areIntervalsOverlapping",
  361. "clamp",
  362. "closestIndexTo",
  363. "closestTo",
  364. "compareAsc",
  365. "compareDesc",
  366. "constants",
  367. "daysToWeeks",
  368. "differenceInBusinessDays",
  369. "differenceInCalendarDays",
  370. "differenceInCalendarISOWeekYears",
  371. "differenceInCalendarISOWeeks",
  372. "differenceInCalendarMonths",
  373. "differenceInCalendarQuarters",
  374. "differenceInCalendarWeeks",
  375. "differenceInCalendarYears",
  376. "differenceInDays",
  377. "differenceInHours",
  378. "differenceInISOWeekYears",
  379. "differenceInMilliseconds",
  380. "differenceInMinutes",
  381. "differenceInMonths",
  382. "differenceInQuarters",
  383. "differenceInSeconds",
  384. "differenceInWeeks",
  385. "differenceInYears",
  386. "eachDayOfInterval",
  387. "eachHourOfInterval",
  388. "eachMinuteOfInterval",
  389. "eachMonthOfInterval",
  390. "eachQuarterOfInterval",
  391. "eachWeekOfInterval",
  392. "eachWeekendOfInterval",
  393. "eachWeekendOfMonth",
  394. "eachWeekendOfYear",
  395. "eachYearOfInterval",
  396. "endOfDay",
  397. "endOfDecade",
  398. "endOfHour",
  399. "endOfISOWeek",
  400. "endOfISOWeekYear",
  401. "endOfMinute",
  402. "endOfMonth",
  403. "endOfQuarter",
  404. "endOfSecond",
  405. "endOfToday",
  406. "endOfTomorrow",
  407. "endOfWeek",
  408. "endOfYear",
  409. "endOfYesterday",
  410. "format",
  411. "formatDistance",
  412. "formatDistanceStrict",
  413. "formatDistanceToNow",
  414. "formatDistanceToNowStrict",
  415. "formatDuration",
  416. "formatISO",
  417. "formatISO9075",
  418. "formatISODuration",
  419. "formatRFC3339",
  420. "formatRFC7231",
  421. "formatRelative",
  422. "fromUnixTime",
  423. "getDate",
  424. "getDay",
  425. "getDayOfYear",
  426. "getDaysInMonth",
  427. "getDaysInYear",
  428. "getDecade",
  429. "getDefaultOptions",
  430. "getHours",
  431. "getISODay",
  432. "getISOWeek",
  433. "getISOWeekYear",
  434. "getISOWeeksInYear",
  435. "getMilliseconds",
  436. "getMinutes",
  437. "getMonth",
  438. "getOverlappingDaysInIntervals",
  439. "getQuarter",
  440. "getSeconds",
  441. "getTime",
  442. "getUnixTime",
  443. "getWeek",
  444. "getWeekOfMonth",
  445. "getWeekYear",
  446. "getWeeksInMonth",
  447. "getYear",
  448. "hoursToMilliseconds",
  449. "hoursToMinutes",
  450. "hoursToSeconds",
  451. "intervalToDuration",
  452. "intlFormat",
  453. "intlFormatDistance",
  454. "isAfter",
  455. "isBefore",
  456. "isDate",
  457. "isEqual",
  458. "isExists",
  459. "isFirstDayOfMonth",
  460. "isFriday",
  461. "isFuture",
  462. "isLastDayOfMonth",
  463. "isLeapYear",
  464. "isMatch",
  465. "isMonday",
  466. "isPast",
  467. "isSameDay",
  468. "isSameHour",
  469. "isSameISOWeek",
  470. "isSameISOWeekYear",
  471. "isSameMinute",
  472. "isSameMonth",
  473. "isSameQuarter",
  474. "isSameSecond",
  475. "isSameWeek",
  476. "isSameYear",
  477. "isSaturday",
  478. "isSunday",
  479. "isThisHour",
  480. "isThisISOWeek",
  481. "isThisMinute",
  482. "isThisMonth",
  483. "isThisQuarter",
  484. "isThisSecond",
  485. "isThisWeek",
  486. "isThisYear",
  487. "isThursday",
  488. "isToday",
  489. "isTomorrow",
  490. "isTuesday",
  491. "isValid",
  492. "isWednesday",
  493. "isWeekend",
  494. "isWithinInterval",
  495. "isYesterday",
  496. "lastDayOfDecade",
  497. "lastDayOfISOWeek",
  498. "lastDayOfISOWeekYear",
  499. "lastDayOfMonth",
  500. "lastDayOfQuarter",
  501. "lastDayOfWeek",
  502. "lastDayOfYear",
  503. "lightFormat",
  504. "max",
  505. "milliseconds",
  506. "millisecondsToHours",
  507. "millisecondsToMinutes",
  508. "millisecondsToSeconds",
  509. "min",
  510. "minutesToHours",
  511. "minutesToMilliseconds",
  512. "minutesToSeconds",
  513. "monthsToQuarters",
  514. "monthsToYears",
  515. "nextDay",
  516. "nextFriday",
  517. "nextMonday",
  518. "nextSaturday",
  519. "nextSunday",
  520. "nextThursday",
  521. "nextTuesday",
  522. "nextWednesday",
  523. "parse",
  524. "parseISO",
  525. "parseJSON",
  526. "previousDay",
  527. "previousFriday",
  528. "previousMonday",
  529. "previousSaturday",
  530. "previousSunday",
  531. "previousThursday",
  532. "previousTuesday",
  533. "previousWednesday",
  534. "quartersToMonths",
  535. "quartersToYears",
  536. "roundToNearestMinutes",
  537. "secondsToHours",
  538. "secondsToMilliseconds",
  539. "secondsToMinutes",
  540. "set",
  541. "setDate",
  542. "setDay",
  543. "setDayOfYear",
  544. "setDefaultOptions",
  545. "setHours",
  546. "setISODay",
  547. "setISOWeek",
  548. "setISOWeekYear",
  549. "setMilliseconds",
  550. "setMinutes",
  551. "setMonth",
  552. "setQuarter",
  553. "setSeconds",
  554. "setWeek",
  555. "setWeekYear",
  556. "setYear",
  557. "startOfDay",
  558. "startOfDecade",
  559. "startOfHour",
  560. "startOfISOWeek",
  561. "startOfISOWeekYear",
  562. "startOfMinute",
  563. "startOfMonth",
  564. "startOfQuarter",
  565. "startOfSecond",
  566. "startOfToday",
  567. "startOfTomorrow",
  568. "startOfWeek",
  569. "startOfWeekYear",
  570. "startOfYear",
  571. "startOfYesterday",
  572. "sub",
  573. "subBusinessDays",
  574. "subDays",
  575. "subHours",
  576. "subISOWeekYears",
  577. "subMilliseconds",
  578. "subMinutes",
  579. "subMonths",
  580. "subQuarters",
  581. "subSeconds",
  582. "subWeeks",
  583. "subYears",
  584. "toDate",
  585. "weeksToDays",
  586. "yearsToMonths",
  587. "yearsToQuarters"
  588. ]
  589. });
  590. const pinia = vueDirectives.defineUnimportPreset({
  591. from: "pinia",
  592. imports: [
  593. // https://pinia.esm.dev/api/modules/pinia.html#functions
  594. "acceptHMRUpdate",
  595. "createPinia",
  596. "defineStore",
  597. "getActivePinia",
  598. "mapActions",
  599. "mapGetters",
  600. "mapState",
  601. "mapStores",
  602. "mapWritableState",
  603. "setActivePinia",
  604. "setMapStoreSuffix",
  605. "storeToRefs"
  606. ]
  607. });
  608. const preact = vueDirectives.defineUnimportPreset({
  609. from: "preact",
  610. imports: [
  611. "useState",
  612. "useCallback",
  613. "useMemo",
  614. "useEffect",
  615. "useRef",
  616. "useContext",
  617. "useReducer"
  618. ]
  619. });
  620. const quasar = vueDirectives.defineUnimportPreset({
  621. from: "quasar",
  622. imports: [
  623. // https://quasar.dev/vue-composables
  624. "useQuasar",
  625. "useDialogPluginComponent",
  626. "useFormChild",
  627. "useMeta"
  628. ]
  629. });
  630. const react = vueDirectives.defineUnimportPreset({
  631. from: "react",
  632. imports: [
  633. "useState",
  634. "useCallback",
  635. "useMemo",
  636. "useEffect",
  637. "useRef",
  638. "useContext",
  639. "useReducer"
  640. ]
  641. });
  642. const ReactRouterHooks = [
  643. "useOutletContext",
  644. "useHref",
  645. "useInRouterContext",
  646. "useLocation",
  647. "useNavigationType",
  648. "useNavigate",
  649. "useOutlet",
  650. "useParams",
  651. "useResolvedPath",
  652. "useRoutes"
  653. ];
  654. const reactRouter = vueDirectives.defineUnimportPreset({
  655. from: "react-router",
  656. imports: [
  657. ...ReactRouterHooks
  658. ]
  659. });
  660. const reactRouterDom = vueDirectives.defineUnimportPreset({
  661. from: "react-router-dom",
  662. imports: [
  663. ...ReactRouterHooks,
  664. // react-router-dom only hooks
  665. "useLinkClickHandler",
  666. "useSearchParams",
  667. // react-router-dom Component
  668. // call once in general
  669. // 'BrowserRouter',
  670. // 'HashRouter',
  671. // 'MemoryRouter',
  672. "Link",
  673. "NavLink",
  674. "Navigate",
  675. "Outlet",
  676. "Route",
  677. "Routes"
  678. ]
  679. });
  680. const rxjs = vueDirectives.defineUnimportPreset({
  681. from: "rxjs",
  682. imports: [
  683. "of",
  684. "from",
  685. "map",
  686. "tap",
  687. "filter",
  688. "forkJoin",
  689. "throwError",
  690. "catchError",
  691. "Observable",
  692. "mergeMap",
  693. "switchMap",
  694. "merge",
  695. "zip",
  696. "take",
  697. "takeUntil",
  698. "first",
  699. "lastValueFrom",
  700. "skip",
  701. "skipUntil",
  702. "distinct",
  703. "distinctUntilChanged",
  704. "throttle",
  705. "throttleTime",
  706. "retry",
  707. "retryWhen",
  708. "timeout",
  709. "delay",
  710. "debounce",
  711. "debounceTime",
  712. "find",
  713. "every"
  714. ]
  715. });
  716. const solidCore = vueDirectives.defineUnimportPreset({
  717. from: "solid-js",
  718. imports: [
  719. "createSignal",
  720. "createEffect",
  721. "createMemo",
  722. "createResource",
  723. "onMount",
  724. "onCleanup",
  725. "onError",
  726. "untrack",
  727. "batch",
  728. "on",
  729. "createRoot",
  730. "mergeProps",
  731. "splitProps",
  732. "useTransition",
  733. "observable",
  734. "mapArray",
  735. "indexArray",
  736. "createContext",
  737. "useContext",
  738. "children",
  739. "lazy",
  740. "createDeferred",
  741. "createRenderEffect",
  742. "createSelector",
  743. "For",
  744. "Show",
  745. "Switch",
  746. "Match",
  747. "Index",
  748. "ErrorBoundary",
  749. "Suspense",
  750. "SuspenseList"
  751. ]
  752. });
  753. const solidStore = vueDirectives.defineUnimportPreset({
  754. from: "solid-js/store",
  755. imports: [
  756. "createStore",
  757. "produce",
  758. "reconcile",
  759. "createMutable"
  760. ]
  761. });
  762. const solidWeb = vueDirectives.defineUnimportPreset({
  763. from: "solid-js/web",
  764. imports: [
  765. "Dynamic",
  766. "hydrate",
  767. "render",
  768. "renderToString",
  769. "renderToStringAsync",
  770. "renderToStream",
  771. "isServer",
  772. "Portal"
  773. ]
  774. });
  775. const solid = vueDirectives.defineUnimportPreset({
  776. from: "solid-js",
  777. imports: [
  778. solidCore,
  779. solidStore,
  780. solidWeb
  781. ]
  782. });
  783. const solidAppRouter = vueDirectives.defineUnimportPreset({
  784. from: "solid-app-router",
  785. imports: [
  786. "Link",
  787. "NavLink",
  788. "Navigate",
  789. "Outlet",
  790. "Route",
  791. "Router",
  792. "Routes",
  793. "_mergeSearchString",
  794. "createIntegration",
  795. "hashIntegration",
  796. "normalizeIntegration",
  797. "pathIntegration",
  798. "staticIntegration",
  799. "useHref",
  800. "useIsRouting",
  801. "useLocation",
  802. "useMatch",
  803. "useNavigate",
  804. "useParams",
  805. "useResolvedPath",
  806. "useRouteData",
  807. "useRoutes",
  808. "useSearchParams"
  809. ]
  810. });
  811. const svelteAnimate = vueDirectives.defineUnimportPreset({
  812. from: "svelte/animate",
  813. imports: [
  814. "flip"
  815. ]
  816. });
  817. const svelteEasing = vueDirectives.defineUnimportPreset({
  818. from: "svelte/easing",
  819. imports: [
  820. "back",
  821. "bounce",
  822. "circ",
  823. "cubic",
  824. "elastic",
  825. "expo",
  826. "quad",
  827. "quart",
  828. "quint",
  829. "sine"
  830. ].reduce((acc, e) => {
  831. acc.push(`${e}In`, `${e}Out`, `${e}InOut`);
  832. return acc;
  833. }, ["linear"])
  834. });
  835. const svelteStore = vueDirectives.defineUnimportPreset({
  836. from: "svelte/store",
  837. imports: [
  838. "writable",
  839. "readable",
  840. "derived",
  841. "get"
  842. ]
  843. });
  844. const svelteMotion = vueDirectives.defineUnimportPreset({
  845. from: "svelte/motion",
  846. imports: [
  847. "tweened",
  848. "spring"
  849. ]
  850. });
  851. const svelteTransition = vueDirectives.defineUnimportPreset({
  852. from: "svelte/transition",
  853. imports: [
  854. "fade",
  855. "blur",
  856. "fly",
  857. "slide",
  858. "scale",
  859. "draw",
  860. "crossfade"
  861. ]
  862. });
  863. const svelte = vueDirectives.defineUnimportPreset({
  864. from: "svelte",
  865. imports: [
  866. // lifecycle
  867. "onMount",
  868. "beforeUpdate",
  869. "afterUpdate",
  870. "onDestroy",
  871. // tick
  872. "tick",
  873. // context
  874. "setContext",
  875. "getContext",
  876. "hasContext",
  877. "getAllContexts",
  878. // event dispatcher
  879. "createEventDispatcher"
  880. ]
  881. });
  882. const uniApp = vueDirectives.defineUnimportPreset({
  883. from: "@dcloudio/uni-app",
  884. imports: [
  885. "onAddToFavorites",
  886. "onBackPress",
  887. "onError",
  888. "onHide",
  889. "onLaunch",
  890. "onLoad",
  891. "onNavigationBarButtonTap",
  892. "onNavigationBarSearchInputChanged",
  893. "onNavigationBarSearchInputClicked",
  894. "onNavigationBarSearchInputConfirmed",
  895. "onNavigationBarSearchInputFocusChanged",
  896. "onPageNotFound",
  897. "onPageScroll",
  898. "onPullDownRefresh",
  899. "onReachBottom",
  900. "onReady",
  901. "onResize",
  902. "onShareAppMessage",
  903. "onShareTimeline",
  904. "onShow",
  905. "onTabItemTap",
  906. "onThemeChange",
  907. "onUnhandledRejection",
  908. "onUnload"
  909. ]
  910. });
  911. const veeValidate = vueDirectives.defineUnimportPreset({
  912. from: "vee-validate",
  913. imports: [
  914. // https://vee-validate.logaretm.com/v4/guide/composition-api/api-review
  915. // https://github.com/logaretm/vee-validate/blob/main/packages/vee-validate/src/index.ts
  916. "validate",
  917. "defineRule",
  918. "configure",
  919. "useField",
  920. "useForm",
  921. "useFieldArray",
  922. "useResetForm",
  923. "useIsFieldDirty",
  924. "useIsFieldTouched",
  925. "useIsFieldValid",
  926. "useIsSubmitting",
  927. "useValidateField",
  928. "useIsFormDirty",
  929. "useIsFormTouched",
  930. "useIsFormValid",
  931. "useValidateForm",
  932. "useSubmitCount",
  933. "useFieldValue",
  934. "useFormValues",
  935. "useFormErrors",
  936. "useFieldError",
  937. "useSubmitForm",
  938. "FormContextKey",
  939. "FieldContextKey"
  940. ]
  941. });
  942. const vitepress = vueDirectives.defineUnimportPreset({
  943. from: "vitepress",
  944. imports: [
  945. // helper methods
  946. "useData",
  947. "useRoute",
  948. "useRouter",
  949. "withBase"
  950. ]
  951. });
  952. const vitest = vueDirectives.defineUnimportPreset({
  953. from: "vitest",
  954. imports: [
  955. // suite
  956. "suite",
  957. "test",
  958. "describe",
  959. "it",
  960. // chai
  961. "chai",
  962. "expect",
  963. "assert",
  964. // utils
  965. "vitest",
  966. "vi",
  967. // hooks
  968. "beforeAll",
  969. "afterAll",
  970. "beforeEach",
  971. "afterEach"
  972. ]
  973. });
  974. const CommonCompositionAPI = [
  975. // lifecycle
  976. "onActivated",
  977. "onBeforeMount",
  978. "onBeforeUnmount",
  979. "onBeforeUpdate",
  980. "onErrorCaptured",
  981. "onDeactivated",
  982. "onMounted",
  983. "onServerPrefetch",
  984. "onUnmounted",
  985. "onUpdated",
  986. // setup helpers
  987. "useAttrs",
  988. "useSlots",
  989. // reactivity,
  990. "computed",
  991. "customRef",
  992. "isReadonly",
  993. "isRef",
  994. "isProxy",
  995. "isReactive",
  996. "markRaw",
  997. "reactive",
  998. "readonly",
  999. "ref",
  1000. "shallowReactive",
  1001. "shallowReadonly",
  1002. "shallowRef",
  1003. "triggerRef",
  1004. "toRaw",
  1005. "toRef",
  1006. "toRefs",
  1007. "toValue",
  1008. "unref",
  1009. "watch",
  1010. "watchEffect",
  1011. "watchPostEffect",
  1012. "watchSyncEffect",
  1013. // component
  1014. "defineComponent",
  1015. "defineAsyncComponent",
  1016. "getCurrentInstance",
  1017. "h",
  1018. "inject",
  1019. "nextTick",
  1020. "provide",
  1021. "useCssModule",
  1022. "createApp",
  1023. // effect scope
  1024. "effectScope",
  1025. "EffectScope",
  1026. "getCurrentScope",
  1027. "onScopeDispose",
  1028. // types
  1029. ...[
  1030. "Component",
  1031. "ComponentPublicInstance",
  1032. "ComputedRef",
  1033. "DirectiveBinding",
  1034. "ExtractDefaultPropTypes",
  1035. "ExtractPropTypes",
  1036. "ExtractPublicPropTypes",
  1037. "InjectionKey",
  1038. "PropType",
  1039. "Ref",
  1040. "MaybeRef",
  1041. "MaybeRefOrGetter",
  1042. "VNode",
  1043. "WritableComputedRef"
  1044. ].map((name) => ({ name, type: true }))
  1045. ];
  1046. const vue = vueDirectives.defineUnimportPreset({
  1047. from: "vue",
  1048. imports: [
  1049. ...CommonCompositionAPI,
  1050. // vue3 only
  1051. "onRenderTracked",
  1052. "onRenderTriggered",
  1053. "resolveComponent",
  1054. "useCssVars",
  1055. // vue3.4+
  1056. "useModel",
  1057. // vue3.5+
  1058. "onWatcherCleanup",
  1059. "useId",
  1060. "useTemplateRef"
  1061. ]
  1062. });
  1063. const vueCompositionApi = vueDirectives.defineUnimportPreset({
  1064. from: "@vue/composition-api",
  1065. imports: CommonCompositionAPI
  1066. });
  1067. const vueDemi = vueDirectives.defineUnimportPreset({
  1068. from: "vue-demi",
  1069. imports: CommonCompositionAPI
  1070. });
  1071. const vueI18n = vueDirectives.defineUnimportPreset({
  1072. from: "vue-i18n",
  1073. imports: [
  1074. "useI18n"
  1075. ]
  1076. });
  1077. const vueMacros = vueDirectives.defineUnimportPreset({
  1078. from: "vue/macros",
  1079. imports: [
  1080. // https://vuejs.org/guide/extras/reactivity-transform.html#refs-vs-reactive-variables
  1081. "$",
  1082. "$$",
  1083. "$ref",
  1084. "$shallowRef",
  1085. "$toRef",
  1086. "$customRef",
  1087. "$computed"
  1088. ]
  1089. });
  1090. const vueRouter = vueDirectives.defineUnimportPreset({
  1091. from: "vue-router",
  1092. imports: [
  1093. "useRouter",
  1094. "useRoute",
  1095. "useLink",
  1096. "onBeforeRouteLeave",
  1097. "onBeforeRouteUpdate"
  1098. ]
  1099. });
  1100. const vueRouterComposables = vueDirectives.defineUnimportPreset({
  1101. from: "vue-router/composables",
  1102. imports: [
  1103. "useRouter",
  1104. "useRoute",
  1105. "useLink",
  1106. "onBeforeRouteLeave",
  1107. "onBeforeRouteUpdate"
  1108. ]
  1109. });
  1110. let _cache;
  1111. const vueuseCore = () => {
  1112. const excluded = ["toRefs", "utils"];
  1113. if (!_cache) {
  1114. try {
  1115. const corePath = localPkg.resolveModule("@vueuse/core") || process__default.cwd();
  1116. const path = localPkg.resolveModule("@vueuse/core/indexes.json") || localPkg.resolveModule("@vueuse/metadata/index.json") || localPkg.resolveModule("@vueuse/metadata/index.json", { paths: [corePath] });
  1117. const indexesJson = JSON.parse(node_fs.readFileSync(path, "utf-8"));
  1118. _cache = vueDirectives.defineUnimportPreset({
  1119. from: "@vueuse/core",
  1120. imports: indexesJson.functions.filter((i) => ["core", "shared"].includes(i.package)).map((i) => i.name).filter((i) => i && i.length >= 4 && !excluded.includes(i))
  1121. });
  1122. } catch (error) {
  1123. console.error(error);
  1124. throw new Error("[auto-import] failed to load @vueuse/core, have you installed it?");
  1125. }
  1126. }
  1127. return _cache;
  1128. };
  1129. const vueuseHead = vueDirectives.defineUnimportPreset({
  1130. from: "@vueuse/head",
  1131. imports: [
  1132. "useHead"
  1133. ]
  1134. });
  1135. const vuex = vueDirectives.defineUnimportPreset({
  1136. from: "vuex",
  1137. imports: [
  1138. // https://next.vuex.vuejs.org/api/#createstore
  1139. "createStore",
  1140. // https://github.com/vuejs/vuex/blob/4.0/types/logger.d.ts#L20
  1141. "createLogger",
  1142. // https://next.vuex.vuejs.org/api/#component-binding-helpers
  1143. "mapState",
  1144. "mapGetters",
  1145. "mapActions",
  1146. "mapMutations",
  1147. "createNamespacedHelpers",
  1148. // https://next.vuex.vuejs.org/api/#composable-functions
  1149. "useStore"
  1150. ]
  1151. });
  1152. const builtinPresets = {
  1153. "@vue/composition-api": vueCompositionApi,
  1154. "@vueuse/core": vueuseCore,
  1155. "@vueuse/head": vueuseHead,
  1156. "pinia": pinia,
  1157. "preact": preact,
  1158. "quasar": quasar,
  1159. "react": react,
  1160. "react-router": reactRouter,
  1161. "react-router-dom": reactRouterDom,
  1162. "svelte": svelte,
  1163. "svelte/animate": svelteAnimate,
  1164. "svelte/easing": svelteEasing,
  1165. "svelte/motion": svelteMotion,
  1166. "svelte/store": svelteStore,
  1167. "svelte/transition": svelteTransition,
  1168. "vee-validate": veeValidate,
  1169. "vitepress": vitepress,
  1170. "vue-demi": vueDemi,
  1171. "vue-i18n": vueI18n,
  1172. "vue-router": vueRouter,
  1173. "vue-router-composables": vueRouterComposables,
  1174. "vue": vue,
  1175. "vue/macros": vueMacros,
  1176. "vuex": vuex,
  1177. "vitest": vitest,
  1178. "uni-app": uniApp,
  1179. "solid-js": solid,
  1180. "solid-app-router": solidAppRouter,
  1181. "rxjs": rxjs,
  1182. "date-fns": dateFns
  1183. };
  1184. const commonProps = [
  1185. "from",
  1186. "priority",
  1187. "disabled",
  1188. "dtsDisabled",
  1189. "meta",
  1190. "type"
  1191. ];
  1192. async function resolvePreset(preset) {
  1193. const imports = [];
  1194. if ("package" in preset)
  1195. return await resolvePackagePreset(preset);
  1196. const common = {};
  1197. commonProps.forEach((i) => {
  1198. if (i in preset) {
  1199. common[i] = preset[i];
  1200. }
  1201. });
  1202. for (const _import of preset.imports) {
  1203. if (typeof _import === "string")
  1204. imports.push({ ...common, name: _import, as: _import });
  1205. else if (Array.isArray(_import))
  1206. imports.push({ ...common, name: _import[0], as: _import[1] || _import[0], from: _import[2] || preset.from });
  1207. else if (_import.imports)
  1208. imports.push(...await resolvePreset(_import));
  1209. else
  1210. imports.push({ ...common, ..._import });
  1211. }
  1212. return imports;
  1213. }
  1214. async function resolveBuiltinPresets(presets) {
  1215. const resolved = await Promise.all(presets.map(async (p) => {
  1216. let preset = typeof p === "string" ? builtinPresets[p] : p;
  1217. if (typeof preset === "function")
  1218. preset = preset();
  1219. return await resolvePreset(preset);
  1220. }));
  1221. return resolved.flat();
  1222. }
  1223. function createUnimport(opts) {
  1224. const ctx = createInternalContext(opts);
  1225. async function generateTypeDeclarations(options) {
  1226. const opts2 = {
  1227. resolvePath: (i) => vueDirectives.stripFileExtension(i.typeFrom || i.from),
  1228. ...options
  1229. };
  1230. const {
  1231. typeReExports = true
  1232. } = opts2;
  1233. const imports = await ctx.getImports();
  1234. let dts = vueDirectives.toTypeDeclarationFile(imports.filter((i) => !i.type && !i.dtsDisabled), opts2);
  1235. const typeOnly = imports.filter((i) => i.type);
  1236. if (typeReExports && typeOnly.length)
  1237. dts += `
  1238. ${vueDirectives.toTypeReExports(typeOnly, opts2)}`;
  1239. for (const addon of ctx.addons)
  1240. dts = await addon.declaration?.call(ctx, dts, opts2) ?? dts;
  1241. return dts;
  1242. }
  1243. async function scanImportsFromFile(filepath, includeTypes = true) {
  1244. const additions = await scanExports(filepath, includeTypes);
  1245. await ctx.modifyDynamicImports((imports) => imports.filter((i) => i.from !== filepath).concat(additions));
  1246. return additions;
  1247. }
  1248. async function scanImportsFromDir(dirs = ctx.options.dirs || [], options = ctx.options.dirsScanOptions) {
  1249. const imports = await scanDirExports(dirs, options);
  1250. const files = new Set(imports.map((f) => f.from));
  1251. await ctx.modifyDynamicImports((i) => i.filter((i2) => !files.has(i2.from)).concat(imports));
  1252. return imports;
  1253. }
  1254. async function injectImportsWithContext(code, id, options) {
  1255. const result = await injectImports(code, id, ctx, {
  1256. ...opts,
  1257. ...options
  1258. });
  1259. const metadata = ctx.getMetadata();
  1260. if (metadata) {
  1261. result.imports.forEach((i) => {
  1262. metadata.injectionUsage[i.name] = metadata.injectionUsage[i.name] || { import: i, count: 0, moduleIds: [] };
  1263. metadata.injectionUsage[i.name].count++;
  1264. if (id && !metadata.injectionUsage[i.name].moduleIds.includes(id))
  1265. metadata.injectionUsage[i.name].moduleIds.push(id);
  1266. });
  1267. }
  1268. return result;
  1269. }
  1270. async function init() {
  1271. if (ctx.options.dirs?.length)
  1272. await scanImportsFromDir();
  1273. }
  1274. return {
  1275. version,
  1276. init,
  1277. clearDynamicImports: () => ctx.clearDynamicImports(),
  1278. modifyDynamicImports: (fn) => ctx.modifyDynamicImports(fn),
  1279. scanImportsFromDir,
  1280. scanImportsFromFile,
  1281. getImports: () => ctx.getImports(),
  1282. getImportMap: () => ctx.getImportMap(),
  1283. detectImports: (code) => detectImports(code, ctx),
  1284. injectImports: injectImportsWithContext,
  1285. generateTypeDeclarations: (options) => generateTypeDeclarations(options),
  1286. getMetadata: () => ctx.getMetadata(),
  1287. getInternalContext: () => ctx,
  1288. // Deprecated
  1289. toExports: async (filepath, includeTypes = false) => vueDirectives.toExports(await ctx.getImports(), filepath, includeTypes)
  1290. };
  1291. }
  1292. function createInternalContext(opts) {
  1293. let _combinedImports;
  1294. const _map = /* @__PURE__ */ new Map();
  1295. const addons = configureAddons(opts);
  1296. opts.addons = addons;
  1297. opts.commentsDisable = opts.commentsDisable ?? ["@unimport-disable", "@imports-disable"];
  1298. opts.commentsDebug = opts.commentsDebug ?? ["@unimport-debug", "@imports-debug"];
  1299. let metadata;
  1300. if (opts.collectMeta) {
  1301. metadata = {
  1302. injectionUsage: {}
  1303. };
  1304. }
  1305. let resolvePromise;
  1306. const ctx = {
  1307. version,
  1308. options: opts,
  1309. addons,
  1310. staticImports: [...opts.imports || []].filter(Boolean),
  1311. dynamicImports: [],
  1312. modifyDynamicImports,
  1313. clearDynamicImports,
  1314. async getImports() {
  1315. await resolvePromise;
  1316. return updateImports();
  1317. },
  1318. async replaceImports(imports) {
  1319. ctx.staticImports = [...imports || []].filter(Boolean);
  1320. ctx.invalidate();
  1321. await resolvePromise;
  1322. return updateImports();
  1323. },
  1324. async getImportMap() {
  1325. await ctx.getImports();
  1326. return _map;
  1327. },
  1328. getMetadata() {
  1329. return metadata;
  1330. },
  1331. invalidate() {
  1332. _combinedImports = undefined;
  1333. },
  1334. resolveId: (id, parentId) => opts.resolveId?.(id, parentId)
  1335. };
  1336. resolvePromise = resolveBuiltinPresets(opts.presets || []).then((r) => {
  1337. ctx.staticImports.unshift(...r);
  1338. _combinedImports = undefined;
  1339. updateImports();
  1340. });
  1341. function updateImports() {
  1342. if (!_combinedImports) {
  1343. let imports = vueDirectives.normalizeImports(vueDirectives.dedupeImports([...ctx.staticImports, ...ctx.dynamicImports], opts.warn || console.warn));
  1344. for (const addon of ctx.addons) {
  1345. if (addon.extendImports)
  1346. imports = addon.extendImports.call(ctx, imports) ?? imports;
  1347. }
  1348. imports = imports.filter((i) => !i.disabled);
  1349. _map.clear();
  1350. for (const _import of imports) {
  1351. if (!_import.type)
  1352. _map.set(_import.as ?? _import.name, _import);
  1353. }
  1354. _combinedImports = imports;
  1355. }
  1356. return _combinedImports;
  1357. }
  1358. async function modifyDynamicImports(fn) {
  1359. const result = await fn(ctx.dynamicImports);
  1360. if (Array.isArray(result))
  1361. ctx.dynamicImports = result;
  1362. ctx.invalidate();
  1363. }
  1364. function clearDynamicImports() {
  1365. ctx.dynamicImports.length = 0;
  1366. ctx.invalidate();
  1367. }
  1368. return ctx;
  1369. }
  1370. async function injectImports(code, id, ctx, options) {
  1371. const s = vueDirectives.getMagicString(code);
  1372. if (ctx.options.commentsDisable?.some((c) => s.original.includes(c))) {
  1373. return {
  1374. s,
  1375. get code() {
  1376. return s.toString();
  1377. },
  1378. imports: []
  1379. };
  1380. }
  1381. for (const addon of ctx.addons)
  1382. await addon.transform?.call(ctx, s, id);
  1383. const { isCJSContext, matchedImports, firstOccurrence } = await detectImports(s, ctx, options);
  1384. const imports = await resolveImports(ctx, matchedImports, id);
  1385. if (ctx.options.commentsDebug?.some((c) => s.original.includes(c))) {
  1386. const log = ctx.options.debugLog || console.log;
  1387. log(`[unimport] ${imports.length} imports detected in "${id}"${imports.length ? `: ${imports.map((i) => i.name).join(", ")}` : ""}`);
  1388. }
  1389. return {
  1390. ...vueDirectives.addImportToCode(
  1391. s,
  1392. imports,
  1393. isCJSContext,
  1394. options?.mergeExisting,
  1395. options?.injectAtEnd,
  1396. firstOccurrence,
  1397. (imports2) => {
  1398. for (const addon of ctx.addons)
  1399. imports2 = addon.injectImportsResolved?.call(ctx, imports2, s, id) ?? imports2;
  1400. return imports2;
  1401. },
  1402. (str, imports2) => {
  1403. for (const addon of ctx.addons)
  1404. str = addon.injectImportsStringified?.call(ctx, str, imports2, s, id) ?? str;
  1405. return str;
  1406. }
  1407. ),
  1408. imports
  1409. };
  1410. }
  1411. async function resolveImports(ctx, imports, id) {
  1412. const resolveCache = /* @__PURE__ */ new Map();
  1413. const _imports = await Promise.all(imports.map(async (i) => {
  1414. if (!resolveCache.has(i.from))
  1415. resolveCache.set(i.from, await ctx.resolveId(i.from, id) || i.from);
  1416. const from = resolveCache.get(i.from);
  1417. if (i.from === id || !from || from === "." || from === id)
  1418. return;
  1419. return {
  1420. ...i,
  1421. from
  1422. };
  1423. }));
  1424. return _imports.filter(Boolean);
  1425. }
  1426. exports.builtinPresets = builtinPresets;
  1427. exports.createUnimport = createUnimport;
  1428. exports.dedupeDtsExports = dedupeDtsExports;
  1429. exports.normalizeScanDirs = normalizeScanDirs;
  1430. exports.resolveBuiltinPresets = resolveBuiltinPresets;
  1431. exports.resolvePreset = resolvePreset;
  1432. exports.scanDirExports = scanDirExports;
  1433. exports.scanExports = scanExports;
  1434. exports.scanFilesFromDir = scanFilesFromDir;
  1435. exports.version = version;