chunk-IN2W2XFC.mjs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. // src/core/utils.ts
  2. import { parse } from "path";
  3. import minimatch from "minimatch";
  4. import resolve from "resolve";
  5. import { slash, toArray } from "@antfu/utils";
  6. import {
  7. getPackageInfo,
  8. isPackageExists
  9. } from "local-pkg";
  10. // src/core/constants.ts
  11. var DISABLE_COMMENT = "/* unplugin-vue-components disabled */";
  12. var DIRECTIVE_IMPORT_PREFIX = "v";
  13. // src/core/utils.ts
  14. var isSSR = Boolean(process.env.SSR || process.env.SSG || process.env.VITE_SSR || process.env.VITE_SSG);
  15. function pascalCase(str) {
  16. return capitalize(camelCase(str));
  17. }
  18. function camelCase(str) {
  19. return str.replace(/-(\w)/g, (_, c) => c ? c.toUpperCase() : "");
  20. }
  21. function kebabCase(key) {
  22. const result = key.replace(/([A-Z])/g, " $1").trim();
  23. return result.split(" ").join("-").toLowerCase();
  24. }
  25. function capitalize(str) {
  26. return str.charAt(0).toUpperCase() + str.slice(1);
  27. }
  28. function parseId(id) {
  29. const index = id.indexOf("?");
  30. if (index < 0) {
  31. return { path: id, query: {} };
  32. } else {
  33. const query = Object.fromEntries(new URLSearchParams(id.slice(index)));
  34. return {
  35. path: id.slice(0, index),
  36. query
  37. };
  38. }
  39. }
  40. function isEmpty(value) {
  41. if (!value || value === null || value === void 0 || Array.isArray(value) && Object.keys(value).length <= 0)
  42. return true;
  43. else
  44. return false;
  45. }
  46. function matchGlobs(filepath, globs) {
  47. for (const glob of globs) {
  48. if (minimatch(slash(filepath), glob))
  49. return true;
  50. }
  51. return false;
  52. }
  53. function getTransformedPath(path, importPathTransform) {
  54. if (importPathTransform) {
  55. const result = importPathTransform(path);
  56. if (result != null)
  57. path = result;
  58. }
  59. return path;
  60. }
  61. function stringifyImport(info) {
  62. if (typeof info === "string")
  63. return `import '${info}'`;
  64. if (!info.as)
  65. return `import '${info.from}'`;
  66. else if (info.name)
  67. return `import { ${info.name} as ${info.as} } from '${info.from}'`;
  68. else
  69. return `import ${info.as} from '${info.from}'`;
  70. }
  71. function normalizeComponetInfo(info) {
  72. if ("path" in info) {
  73. return {
  74. from: info.path,
  75. as: info.name,
  76. name: info.importName,
  77. sideEffects: info.sideEffects
  78. };
  79. }
  80. return info;
  81. }
  82. function stringifyComponentImport({ as: name, from: path, name: importName, sideEffects }, ctx) {
  83. path = getTransformedPath(path, ctx.options.importPathTransform);
  84. const imports = [
  85. stringifyImport({ as: name, from: path, name: importName })
  86. ];
  87. if (sideEffects)
  88. toArray(sideEffects).forEach((i) => imports.push(stringifyImport(i)));
  89. return imports.join(";");
  90. }
  91. function getNameFromFilePath(filePath, options) {
  92. const { resolvedDirs, directoryAsNamespace, globalNamespaces, collapseSamePrefixes, root } = options;
  93. const parsedFilePath = parse(slash(filePath));
  94. let strippedPath = "";
  95. for (const dir of resolvedDirs) {
  96. if (parsedFilePath.dir.startsWith(dir)) {
  97. strippedPath = parsedFilePath.dir.slice(dir.length);
  98. break;
  99. }
  100. }
  101. let folders = strippedPath.slice(1).split("/").filter(Boolean);
  102. let filename = parsedFilePath.name;
  103. if (filename === "index" && !directoryAsNamespace) {
  104. if (isEmpty(folders))
  105. folders = parsedFilePath.dir.slice(root.length + 1).split("/").filter(Boolean);
  106. filename = `${folders.slice(-1)[0]}`;
  107. return filename;
  108. }
  109. if (directoryAsNamespace) {
  110. if (globalNamespaces.some((name) => folders.includes(name)))
  111. folders = folders.filter((f) => !globalNamespaces.includes(f));
  112. folders = folders.map((f) => f.replace(/[^a-zA-Z0-9\-]/g, ""));
  113. if (filename.toLowerCase() === "index")
  114. filename = "";
  115. if (!isEmpty(folders)) {
  116. let namespaced = [...folders, filename];
  117. if (collapseSamePrefixes) {
  118. const collapsed = [];
  119. for (const fileOrFolderName of namespaced) {
  120. const collapsedFilename = collapsed.join("");
  121. if (collapsedFilename && fileOrFolderName.toLowerCase().startsWith(collapsedFilename.toLowerCase())) {
  122. const collapseSamePrefix = fileOrFolderName.slice(collapsedFilename.length);
  123. collapsed.push(collapseSamePrefix);
  124. continue;
  125. }
  126. collapsed.push(fileOrFolderName);
  127. }
  128. namespaced = collapsed;
  129. }
  130. filename = namespaced.filter(Boolean).join("-");
  131. }
  132. return filename;
  133. }
  134. return filename;
  135. }
  136. function resolveAlias(filepath, alias) {
  137. const result = filepath;
  138. if (Array.isArray(alias)) {
  139. for (const { find, replacement } of alias)
  140. result.replace(find, replacement);
  141. }
  142. return result;
  143. }
  144. async function getPkgVersion(pkgName, defaultVersion) {
  145. var _a;
  146. try {
  147. const isExist = isPackageExists(pkgName);
  148. if (isExist) {
  149. const pkg = await getPackageInfo(pkgName);
  150. return (_a = pkg == null ? void 0 : pkg.version) != null ? _a : defaultVersion;
  151. } else {
  152. return defaultVersion;
  153. }
  154. } catch (err) {
  155. console.error(err);
  156. return defaultVersion;
  157. }
  158. }
  159. function shouldTransform(code) {
  160. if (code.includes(DISABLE_COMMENT))
  161. return false;
  162. return true;
  163. }
  164. function resolveImportPath(importName) {
  165. return resolve.sync(importName, {
  166. preserveSymlinks: false
  167. });
  168. }
  169. export {
  170. DISABLE_COMMENT,
  171. DIRECTIVE_IMPORT_PREFIX,
  172. isSSR,
  173. pascalCase,
  174. camelCase,
  175. kebabCase,
  176. parseId,
  177. matchGlobs,
  178. getTransformedPath,
  179. normalizeComponetInfo,
  180. stringifyComponentImport,
  181. getNameFromFilePath,
  182. resolveAlias,
  183. getPkgVersion,
  184. shouldTransform,
  185. resolveImportPath
  186. };