index.cjs 4.2 KB

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