index.cjs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. const pluginutils = require('@rollup/pluginutils');
  4. const changeCase = require('change-case');
  5. const esModuleLexer = require('es-module-lexer');
  6. const MagicString = require('magic-string');
  7. const path = require('pathe');
  8. const consola = require('consola');
  9. const vite = require('vite');
  10. const fs = require('fs-extra');
  11. const module$1 = require('module');
  12. function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e["default"] : e; }
  13. function _interopNamespace(e) {
  14. if (e && e.__esModule) return e;
  15. const n = Object.create(null);
  16. if (e) {
  17. for (const k in e) {
  18. n[k] = e[k];
  19. }
  20. }
  21. n["default"] = e;
  22. return n;
  23. }
  24. const changeCase__namespace = /*#__PURE__*/_interopNamespace(changeCase);
  25. const MagicString__default = /*#__PURE__*/_interopDefaultLegacy(MagicString);
  26. const path__default = /*#__PURE__*/_interopDefaultLegacy(path);
  27. const consola__default = /*#__PURE__*/_interopDefaultLegacy(consola);
  28. const fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
  29. function resolveNodeModules(libName, ...dir) {
  30. const esRequire = module$1.createRequire((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('index.cjs', document.baseURI).href)));
  31. let modulePath = "";
  32. try {
  33. modulePath = vite.normalizePath(esRequire.resolve(libName));
  34. } catch (error) {
  35. modulePath = vite.normalizePath(require.resolve(libName));
  36. }
  37. const lastIndex = modulePath.lastIndexOf(libName);
  38. return vite.normalizePath(path__default.resolve(modulePath.substring(0, lastIndex), ...dir));
  39. }
  40. function resolvePnp(module) {
  41. try {
  42. return vite.normalizePath(require.resolve(module));
  43. } catch (error) {
  44. return "";
  45. }
  46. }
  47. const isPnp = !!process.versions.pnp;
  48. function isRegExp(value) {
  49. return Object.prototype.toString.call(value) === "[object RegExp]";
  50. }
  51. function fileExists(f) {
  52. try {
  53. fs__default.accessSync(f, fs__default.constants.W_OK);
  54. return true;
  55. } catch (error) {
  56. return false;
  57. }
  58. }
  59. function isFunction(value) {
  60. return value != null && Object.prototype.toString.call(value) === "[object Function]";
  61. }
  62. function AntdResolve() {
  63. return {
  64. libraryName: "antd",
  65. esModule: true,
  66. resolveStyle: (name) => {
  67. return `antd/es/${name}/style/index`;
  68. }
  69. };
  70. }
  71. function AndDesignVueResolve() {
  72. return {
  73. ensureStyleFile: true,
  74. libraryName: "ant-design-vue",
  75. esModule: true,
  76. resolveStyle: (name) => {
  77. return `ant-design-vue/es/${name}/style/index`;
  78. }
  79. };
  80. }
  81. function ElementPlusResolve() {
  82. return {
  83. libraryName: "element-plus",
  84. ensureStyleFile: true,
  85. esModule: true,
  86. resolveStyle: (name) => {
  87. return `element-plus/theme-chalk/${name}.css`;
  88. },
  89. base: "element-plus/theme-chalk/base.css"
  90. };
  91. }
  92. function VantResolve() {
  93. return {
  94. libraryName: "vant",
  95. esModule: true,
  96. resolveStyle: (name) => {
  97. return `vant/es/${name}/style`;
  98. }
  99. };
  100. }
  101. function NutuiResolve() {
  102. return {
  103. libraryName: "@nutui/nutui",
  104. libraryNameChangeCase: "pascalCase",
  105. resolveStyle: (name) => {
  106. return `@nutui/nutui/dist/packages/${name}/index.scss`;
  107. }
  108. };
  109. }
  110. function VxeTableResolve() {
  111. return {
  112. ensureStyleFile: true,
  113. libraryName: "vxe-table",
  114. esModule: true,
  115. resolveStyle: (name) => {
  116. return `vxe-table/es/${name}/style.css`;
  117. }
  118. };
  119. }
  120. const ensureFileExts = [".css", ".js", ".scss", ".less", ".styl"];
  121. const asRE = /\s+as\s+\w+,?/g;
  122. consola__default.wrapConsole();
  123. function createStyleImportPlugin(options) {
  124. const {
  125. include = ["**/*.vue", "**/*.ts", "**/*.js", "**/*.tsx", "**/*.jsx"],
  126. exclude = "node_modules/**",
  127. resolves = []
  128. } = options;
  129. let { libs = [] } = options;
  130. libs = [...libs, ...resolves];
  131. const filter = pluginutils.createFilter(include, exclude);
  132. let needSourcemap = false;
  133. let external;
  134. return {
  135. name: "vite:style-import",
  136. enforce: "post",
  137. configResolved(resolvedConfig) {
  138. needSourcemap = !!resolvedConfig.build.sourcemap;
  139. external = resolvedConfig?.build?.rollupOptions?.external ?? void 0;
  140. },
  141. async transform(code, id) {
  142. if (!code || !filter(id) || !needTransform(code, libs)) {
  143. return null;
  144. }
  145. await esModuleLexer.init;
  146. let imports = [];
  147. try {
  148. imports = esModuleLexer.parse(code)[0];
  149. } catch (e) {
  150. consola__default.error(e);
  151. }
  152. if (!imports.length) {
  153. return null;
  154. }
  155. let s;
  156. const str = () => s || (s = new MagicString__default(code));
  157. for (let index = 0; index < imports.length; index++) {
  158. const { n, se, ss } = imports[index];
  159. if (!n)
  160. continue;
  161. const lib = getLib(n, libs, external);
  162. if (!lib)
  163. continue;
  164. const importStr = code.slice(ss, se);
  165. let importVariables = transformImportVar(importStr);
  166. importVariables = filterImportVariables(importVariables, lib.importTest);
  167. const importCssStrList = await transformComponentCss(lib, importVariables);
  168. const compStrList = [];
  169. const { base = "" } = lib;
  170. let baseImporter = base ? `
  171. import '${base}'` : "";
  172. if (str().toString().includes(base)) {
  173. baseImporter = "";
  174. }
  175. const endIndex = se + 1;
  176. str().prependRight(endIndex, `${baseImporter}
  177. ${compStrList.join("")}${importCssStrList.join("")}`);
  178. }
  179. return {
  180. map: needSourcemap ? str().generateMap({ hires: true }) : null,
  181. code: str().toString()
  182. };
  183. }
  184. };
  185. }
  186. function filterImportVariables(importVars, reg) {
  187. if (!reg) {
  188. return importVars;
  189. }
  190. return importVars.filter((item) => reg.test(item));
  191. }
  192. async function transformComponentCss(lib, importVariables) {
  193. const {
  194. libraryName,
  195. resolveStyle,
  196. esModule,
  197. libraryNameChangeCase = "paramCase",
  198. ensureStyleFile = false
  199. } = lib;
  200. if (!isFunction(resolveStyle) || !libraryName) {
  201. return [];
  202. }
  203. const set = /* @__PURE__ */ new Set();
  204. for (let index = 0; index < importVariables.length; index++) {
  205. const name = getChangeCaseFileName(importVariables[index], libraryNameChangeCase);
  206. let importStr = resolveStyle(name);
  207. if (!importStr) {
  208. continue;
  209. }
  210. let isAdd = true;
  211. if (isPnp) {
  212. importStr = resolvePnp(importStr);
  213. isAdd = !!importStr;
  214. } else {
  215. if (esModule) {
  216. importStr = resolveNodeModules(libraryName, importStr);
  217. }
  218. if (ensureStyleFile) {
  219. isAdd = ensureFileExists(libraryName, importStr, esModule);
  220. }
  221. }
  222. isAdd && set.add(`import '${importStr}';
  223. `);
  224. }
  225. return Array.from(set);
  226. }
  227. function transformImportVar(importStr) {
  228. if (!importStr) {
  229. return [];
  230. }
  231. const exportStr = importStr.replace("import", "export").replace(asRE, ",");
  232. let importVariables = [];
  233. try {
  234. importVariables = esModuleLexer.parse(exportStr)[1];
  235. } catch (error) {
  236. consola__default.error(error);
  237. }
  238. return importVariables;
  239. }
  240. function ensureFileExists(libraryName, importStr, esModule = false) {
  241. const extName = path__default.extname(importStr);
  242. if (!extName) {
  243. return tryEnsureFile(libraryName, importStr, esModule);
  244. }
  245. if (esModule) {
  246. return fileExists(importStr);
  247. }
  248. return true;
  249. }
  250. function tryEnsureFile(libraryName, filePath, esModule = false) {
  251. const filePathList = ensureFileExts.map((item) => {
  252. const p = `${filePath}${item}`;
  253. return esModule ? p : resolveNodeModules(libraryName, p);
  254. });
  255. return filePathList.some((item) => fileExists(item));
  256. }
  257. function getLib(libraryName, libs, external) {
  258. let libList = libs;
  259. if (external) {
  260. const isString = typeof external === "string";
  261. const isRE = isRegExp(external);
  262. if (isString) {
  263. libList = libList.filter((item) => item.libraryName !== external);
  264. } else if (isRE) {
  265. libList = libList.filter((item) => !external.test(item.libraryName));
  266. } else if (Array.isArray(external)) {
  267. libList = libList.filter((item) => {
  268. return !external.some((val) => {
  269. if (typeof val === "string") {
  270. return val === item.libraryName;
  271. }
  272. return val.test(item.libraryName);
  273. });
  274. });
  275. }
  276. }
  277. return libList.find((item) => item.libraryName === libraryName);
  278. }
  279. function getChangeCaseFileName(importedName, libraryNameChangeCase) {
  280. try {
  281. return changeCase__namespace[libraryNameChangeCase](importedName);
  282. } catch (error) {
  283. return importedName;
  284. }
  285. }
  286. function needTransform(code, libs) {
  287. return !libs.every(({ libraryName }) => {
  288. return !new RegExp(`('${libraryName}')|("${libraryName}")`).test(code);
  289. });
  290. }
  291. exports.AndDesignVueResolve = AndDesignVueResolve;
  292. exports.AntdResolve = AntdResolve;
  293. exports.ElementPlusResolve = ElementPlusResolve;
  294. exports.NutuiResolve = NutuiResolve;
  295. exports.VantResolve = VantResolve;
  296. exports.VxeTableResolve = VxeTableResolve;
  297. exports.createStyleImportPlugin = createStyleImportPlugin;
  298. exports.getChangeCaseFileName = getChangeCaseFileName;
  299. exports.transformImportVar = transformImportVar;