chunk-WRE7G5OD.js 5.6 KB

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