index.mjs 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. export { default as VuetifyLoader } from './scriptLoader.mjs';
  2. import { URLSearchParams } from 'url';
  3. import { writeFile } from 'fs/promises';
  4. import path from 'upath';
  5. import mkdirp from 'mkdirp';
  6. import { transformAssetUrls, resolveVuetifyBase, isObject, normalizePath } from '@vuetify/loader-shared';
  7. export { transformAssetUrls } from '@vuetify/loader-shared';
  8. var __defProp = Object.defineProperty;
  9. var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  10. var __publicField = (obj, key, value) => {
  11. __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  12. return value;
  13. };
  14. function isSubdir(root, test) {
  15. const relative = path.relative(root, test);
  16. return relative && !relative.startsWith("..") && !path.isAbsolute(relative);
  17. }
  18. class VuetifyPlugin {
  19. constructor(options) {
  20. __publicField(this, "options");
  21. this.options = {
  22. autoImport: true,
  23. styles: true,
  24. ...options
  25. };
  26. }
  27. async apply(compiler) {
  28. if (this.options.autoImport) {
  29. compiler.options.module.rules.unshift({
  30. resourceQuery: (query) => {
  31. if (!query)
  32. return false;
  33. const qs = new URLSearchParams(query);
  34. return qs.has("vue") && (qs.get("type") === "template" || qs.get("type") === "script" && qs.has("setup"));
  35. },
  36. use: {
  37. loader: "webpack-plugin-vuetify/scriptLoader",
  38. options: this.options
  39. }
  40. });
  41. }
  42. const vueLoader = compiler.options.module.rules.find((rule) => {
  43. return rule && typeof rule !== "string" && rule.loader && path.toUnix(rule.loader).endsWith("vue-loader/dist/templateLoader.js");
  44. });
  45. const vueOptions = typeof vueLoader === "object" && vueLoader?.options;
  46. if (vueOptions && typeof vueOptions === "object") {
  47. vueOptions.transformAssetUrls ?? (vueOptions.transformAssetUrls = transformAssetUrls);
  48. }
  49. const vuetifyBase = resolveVuetifyBase();
  50. function hookResolve(transform) {
  51. compiler.resolverFactory.hooks.resolver.for("normal").tap("vuetify-loader", (resolver) => {
  52. resolver.getHook("beforeResult").tapAsync("vuetify-loader", async (request, context, callback) => {
  53. if (request.path && request.path.endsWith(".css") && isSubdir(vuetifyBase, request.path)) {
  54. request.path = await transform(request.path);
  55. }
  56. callback(null, request);
  57. });
  58. });
  59. }
  60. if (this.options.styles === "none") {
  61. compiler.options.module.rules.push({
  62. enforce: "pre",
  63. test: /\.css$/,
  64. include: /node_modules[/\\]vuetify[/\\]/,
  65. issuer: /node_modules[/\\]vuetify[/\\]/,
  66. loader: "null-loader"
  67. });
  68. } else if (this.options.styles === "sass") {
  69. hookResolve((file) => file.replace(/\.css$/, ".sass"));
  70. } else if (isObject(this.options.styles)) {
  71. const findCacheDir = (await import('find-cache-dir')).default;
  72. const cacheDir = findCacheDir({
  73. name: "vuetify",
  74. create: true
  75. });
  76. const configFile = path.isAbsolute(this.options.styles.configFile) ? this.options.styles.configFile : path.join(
  77. compiler.options.context || process.cwd(),
  78. this.options.styles.configFile
  79. );
  80. hookResolve(async (request) => {
  81. const target = request.replace(/\.css$/, ".sass");
  82. const file = path.relative(vuetifyBase, target);
  83. const cacheFile = path.join(cacheDir, file);
  84. await mkdirp(path.dirname(cacheFile));
  85. await writeFile(cacheFile, `@use "${normalizePath(configFile)}"
  86. @use "${normalizePath(target)}"`);
  87. return cacheFile;
  88. });
  89. }
  90. }
  91. }
  92. __publicField(VuetifyPlugin, "transformAssetUrls", transformAssetUrls);
  93. export { VuetifyPlugin };