context-D49cMElb.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { resolve } from "node:path";
  2. import picomatch from "picomatch";
  3. import { Parser } from "acorn";
  4. //#region src/utils/general.ts
  5. function toArray(array) {
  6. array = array || [];
  7. if (Array.isArray(array)) return array;
  8. return [array];
  9. }
  10. //#endregion
  11. //#region src/utils/filter.ts
  12. const BACKSLASH_REGEX = /\\/g;
  13. function normalize$1(path$1) {
  14. return path$1.replace(BACKSLASH_REGEX, "/");
  15. }
  16. const ABSOLUTE_PATH_REGEX = /^(?:\/|(?:[A-Z]:)?[/\\|])/i;
  17. function isAbsolute$1(path$1) {
  18. return ABSOLUTE_PATH_REGEX.test(path$1);
  19. }
  20. function getMatcherString(glob, cwd) {
  21. if (glob.startsWith("**") || isAbsolute$1(glob)) return normalize$1(glob);
  22. const resolved = resolve(cwd, glob);
  23. return normalize$1(resolved);
  24. }
  25. function patternToIdFilter(pattern) {
  26. if (pattern instanceof RegExp) return (id) => {
  27. const normalizedId = normalize$1(id);
  28. const result = pattern.test(normalizedId);
  29. pattern.lastIndex = 0;
  30. return result;
  31. };
  32. const cwd = process.cwd();
  33. const glob = getMatcherString(pattern, cwd);
  34. const matcher = picomatch(glob, { dot: true });
  35. return (id) => {
  36. const normalizedId = normalize$1(id);
  37. return matcher(normalizedId);
  38. };
  39. }
  40. function patternToCodeFilter(pattern) {
  41. if (pattern instanceof RegExp) return (code) => {
  42. const result = pattern.test(code);
  43. pattern.lastIndex = 0;
  44. return result;
  45. };
  46. return (code) => code.includes(pattern);
  47. }
  48. function createFilter(exclude, include) {
  49. if (!exclude && !include) return;
  50. return (input) => {
  51. if (exclude?.some((filter) => filter(input))) return false;
  52. if (include?.some((filter) => filter(input))) return true;
  53. return !(include && include.length > 0);
  54. };
  55. }
  56. function normalizeFilter(filter) {
  57. if (typeof filter === "string" || filter instanceof RegExp) return { include: [filter] };
  58. if (Array.isArray(filter)) return { include: filter };
  59. return {
  60. exclude: filter.exclude ? toArray(filter.exclude) : void 0,
  61. include: filter.include ? toArray(filter.include) : void 0
  62. };
  63. }
  64. function createIdFilter(filter) {
  65. if (!filter) return;
  66. const { exclude, include } = normalizeFilter(filter);
  67. const excludeFilter = exclude?.map(patternToIdFilter);
  68. const includeFilter = include?.map(patternToIdFilter);
  69. return createFilter(excludeFilter, includeFilter);
  70. }
  71. function createCodeFilter(filter) {
  72. if (!filter) return;
  73. const { exclude, include } = normalizeFilter(filter);
  74. const excludeFilter = exclude?.map(patternToCodeFilter);
  75. const includeFilter = include?.map(patternToCodeFilter);
  76. return createFilter(excludeFilter, includeFilter);
  77. }
  78. function createFilterForId(filter) {
  79. const filterFunction = createIdFilter(filter);
  80. return filterFunction ? (id) => !!filterFunction(id) : void 0;
  81. }
  82. function createFilterForTransform(idFilter, codeFilter) {
  83. if (!idFilter && !codeFilter) return;
  84. const idFilterFunction = createIdFilter(idFilter);
  85. const codeFilterFunction = createCodeFilter(codeFilter);
  86. return (id, code) => {
  87. let fallback = true;
  88. if (idFilterFunction) fallback &&= idFilterFunction(id);
  89. if (!fallback) return false;
  90. if (codeFilterFunction) fallback &&= codeFilterFunction(code);
  91. return fallback;
  92. };
  93. }
  94. function normalizeObjectHook(name, hook) {
  95. let handler;
  96. let filter;
  97. if (typeof hook === "function") handler = hook;
  98. else {
  99. handler = hook.handler;
  100. const hookFilter = hook.filter;
  101. if (name === "resolveId" || name === "load") filter = createFilterForId(hookFilter?.id);
  102. else filter = createFilterForTransform(hookFilter?.id, hookFilter?.code);
  103. }
  104. return {
  105. handler,
  106. filter: filter || (() => true)
  107. };
  108. }
  109. //#endregion
  110. //#region src/utils/context.ts
  111. function parse(code, opts = {}) {
  112. return Parser.parse(code, {
  113. sourceType: "module",
  114. ecmaVersion: "latest",
  115. locations: true,
  116. ...opts
  117. });
  118. }
  119. //#endregion
  120. export { normalizeObjectHook, parse, toArray };