版博士V2.0程序
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

196 linhas
5.5 KiB

  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. let cumulativePrefix = "";
  121. let didCollapse = false;
  122. for (const parentFolder of [...collapsed].reverse()) {
  123. cumulativePrefix = `${capitalize(parentFolder)}${cumulativePrefix}`;
  124. if (pascalCase(fileOrFolderName).startsWith(pascalCase(cumulativePrefix))) {
  125. const collapseSamePrefix = fileOrFolderName.slice(cumulativePrefix.length);
  126. collapsed.push(collapseSamePrefix);
  127. didCollapse = true;
  128. break;
  129. }
  130. }
  131. if (!didCollapse)
  132. collapsed.push(fileOrFolderName);
  133. }
  134. namespaced = collapsed;
  135. }
  136. filename = namespaced.filter(Boolean).join("-");
  137. }
  138. return filename;
  139. }
  140. return filename;
  141. }
  142. function resolveAlias(filepath, alias) {
  143. const result = filepath;
  144. if (Array.isArray(alias)) {
  145. for (const { find, replacement } of alias)
  146. result.replace(find, replacement);
  147. }
  148. return result;
  149. }
  150. async function getPkgVersion(pkgName, defaultVersion) {
  151. var _a;
  152. try {
  153. const isExist = isPackageExists(pkgName);
  154. if (isExist) {
  155. const pkg = await getPackageInfo(pkgName);
  156. return (_a = pkg == null ? void 0 : pkg.version) != null ? _a : defaultVersion;
  157. } else {
  158. return defaultVersion;
  159. }
  160. } catch (err) {
  161. console.error(err);
  162. return defaultVersion;
  163. }
  164. }
  165. function shouldTransform(code) {
  166. if (code.includes(DISABLE_COMMENT))
  167. return false;
  168. return true;
  169. }
  170. function resolveImportPath(importName) {
  171. return resolve.sync(importName, {
  172. preserveSymlinks: false
  173. });
  174. }
  175. export {
  176. DISABLE_COMMENT,
  177. DIRECTIVE_IMPORT_PREFIX,
  178. isSSR,
  179. pascalCase,
  180. camelCase,
  181. kebabCase,
  182. parseId,
  183. matchGlobs,
  184. getTransformedPath,
  185. normalizeComponetInfo,
  186. stringifyComponentImport,
  187. getNameFromFilePath,
  188. resolveAlias,
  189. getPkgVersion,
  190. shouldTransform,
  191. resolveImportPath
  192. };