版博士V2.0程序
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 

1040 lignes
30 KiB

  1. "use strict";
  2. var __create = Object.create;
  3. var __defProp = Object.defineProperty;
  4. var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  5. var __getOwnPropNames = Object.getOwnPropertyNames;
  6. var __getProtoOf = Object.getPrototypeOf;
  7. var __hasOwnProp = Object.prototype.hasOwnProperty;
  8. var __export = (target, all) => {
  9. for (var name in all)
  10. __defProp(target, name, { get: all[name], enumerable: true });
  11. };
  12. var __copyProps = (to, from, except, desc) => {
  13. if (from && typeof from === "object" || typeof from === "function") {
  14. for (let key of __getOwnPropNames(from))
  15. if (!__hasOwnProp.call(to, key) && key !== except)
  16. __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  17. }
  18. return to;
  19. };
  20. var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
  21. var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
  22. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
  23. mod
  24. ));
  25. var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
  26. // src/index.ts
  27. var src_exports = {};
  28. __export(src_exports, {
  29. DefaultExtractor: () => DefaultExtractor,
  30. PugExtractor: () => PugExtractor,
  31. SupportedLayers: () => SupportedLayers,
  32. SvelteExtractor: () => SvelteExtractor,
  33. applyExtractors: () => applyExtractors,
  34. buildAliasTransformer: () => buildAliasTransformer,
  35. createUtils: () => createUtils,
  36. defaultAlias: () => defaultAlias,
  37. defineConfig: () => defineConfig,
  38. escapeRegExp: () => escapeRegExp,
  39. exclude: () => exclude,
  40. flattenArray: () => flattenArray,
  41. getDefaultExtractors: () => getDefaultExtractors,
  42. htmlTags: () => htmlTags,
  43. include: () => include,
  44. isResolvedOptions: () => isResolvedOptions,
  45. kebabCase: () => kebabCase,
  46. mergeArrays: () => mergeArrays,
  47. mergeWindicssConfig: () => mergeWindicssConfig,
  48. partition: () => import_utils2.partition,
  49. preflightTags: () => preflightTags,
  50. resolveOptions: () => resolveOptions,
  51. slash: () => import_utils2.slash,
  52. toArray: () => import_utils2.toArray,
  53. transformGroups: () => transformGroups
  54. });
  55. module.exports = __toCommonJS(src_exports);
  56. // src/constants.ts
  57. var defaultAlias = {
  58. "router-link": "a"
  59. };
  60. var preflightTags = ["html", "body", "div"];
  61. var htmlTags = [
  62. "html",
  63. "body",
  64. "div",
  65. "a",
  66. "abbr",
  67. "address",
  68. "area",
  69. "article",
  70. "aside",
  71. "audio",
  72. "base",
  73. "basefont",
  74. "bdo",
  75. "blink",
  76. "blockquote",
  77. "br",
  78. "button",
  79. "canvas",
  80. "caption",
  81. "center",
  82. "col",
  83. "colgroup",
  84. "command",
  85. "comment",
  86. "datalist",
  87. "dd",
  88. "del",
  89. "details",
  90. "dir",
  91. "dl",
  92. "dt",
  93. "embed",
  94. "fieldset",
  95. "figure",
  96. "b",
  97. "big",
  98. "i",
  99. "small",
  100. "tt",
  101. "font",
  102. "footer",
  103. "form",
  104. "frame",
  105. "frameset",
  106. "head",
  107. "header",
  108. "hgroup",
  109. "h1",
  110. "h2",
  111. "h3",
  112. "h4",
  113. "h5",
  114. "h6",
  115. "hr",
  116. "isindex",
  117. "iframe",
  118. "ilayer",
  119. "img",
  120. "input",
  121. "ins",
  122. "keygen",
  123. "keygen",
  124. "label",
  125. "layer",
  126. "legend",
  127. "li",
  128. "link",
  129. "map",
  130. "mark",
  131. "marquee",
  132. "menu",
  133. "meta",
  134. "meter",
  135. "multicol",
  136. "nav",
  137. "nobr",
  138. "noembed",
  139. "noframes",
  140. "noscript",
  141. "object",
  142. "ol",
  143. "optgroup",
  144. "option",
  145. "output",
  146. "p",
  147. "param",
  148. "cite",
  149. "code",
  150. "dfn",
  151. "em",
  152. "kbd",
  153. "samp",
  154. "strong",
  155. "var",
  156. "plaintext",
  157. "pre",
  158. "progress",
  159. "q",
  160. "ruby",
  161. "script",
  162. "section",
  163. "select",
  164. "spacer",
  165. "span",
  166. "s",
  167. "strike",
  168. "style",
  169. "sub",
  170. "sup",
  171. "svg",
  172. "table",
  173. "tbody",
  174. "td",
  175. "textarea",
  176. "tfoot",
  177. "th",
  178. "thead",
  179. "time",
  180. "title",
  181. "tr",
  182. "u",
  183. "ul",
  184. "video",
  185. "wbr",
  186. "wbr",
  187. "xmp"
  188. ];
  189. // src/defineConfig.ts
  190. function defineConfig(config) {
  191. return config;
  192. }
  193. // src/createUtils.ts
  194. var import_fs = __toESM(require("fs"));
  195. var import_style = require("windicss/utils/style");
  196. var import_parser = require("windicss/utils/parser");
  197. var import_utils6 = require("windicss/utils");
  198. var import_utils7 = require("@antfu/utils");
  199. var import_fast_glob = __toESM(require("fast-glob"));
  200. var import_debug2 = __toESM(require("debug"));
  201. var import_micromatch = __toESM(require("micromatch"));
  202. var import_windicss = __toESM(require("windicss"));
  203. // src/resolveOptions.ts
  204. var resolveOptions_exports = {};
  205. __export(resolveOptions_exports, {
  206. isResolvedOptions: () => isResolvedOptions,
  207. resolveOptions: () => resolveOptions
  208. });
  209. var import_path2 = __toESM(require("path"));
  210. var import_debug = __toESM(require("debug"));
  211. var import_config = require("@windicss/config");
  212. // src/utils.ts
  213. var import_utils = require("@antfu/utils");
  214. var import_utils2 = require("@antfu/utils");
  215. function flattenArray(v) {
  216. return (0, import_utils.toArray)(v).flat();
  217. }
  218. function mergeArrays(...args) {
  219. return args.flatMap((i) => flattenArray(i || []));
  220. }
  221. function kebabCase(str) {
  222. return str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
  223. }
  224. function include(set, v) {
  225. for (const i of v)
  226. set.add(i);
  227. }
  228. function exclude(set, v) {
  229. for (const i of v)
  230. set.delete(i);
  231. }
  232. function escapeRegExp(str) {
  233. return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
  234. }
  235. // src/extractors/helper.ts
  236. var import_path = require("path");
  237. var import_utils3 = require("@antfu/utils");
  238. // src/regexes.ts
  239. var regexHtmlTag = /<(\w[\w-]*)([\S\s]*?)\/?>/mg;
  240. var regexClassSplitter = /[\s'"`{}]/g;
  241. var regexClassGroup = /([!\w+-<@][\w+:_/-]*?\w):\(((?:[!\w\s:/\\,%#.$-]|\[.*?\])*?)\)/gm;
  242. var regexAttributifyItem = /(?:\s|^)([\w+:_/-]+)\s*=\s*(['"{])((?:\\\2|\\\\|\n|\r|.)*?)(?:\2|\})/gm;
  243. var regexClassCheck1 = /^!?[a-z\d@<>.+-](?:\([\w,.%#\(\)+-]*\)|[\w:/\\,%#\[\].$-])*$/;
  244. var regexClassCheck2 = /[a-z].*[\w)\]]$/;
  245. var regexClassChecks = [
  246. regexClassCheck1,
  247. regexClassCheck2
  248. ];
  249. var regexSvelteClass = /class:([\w!:/\\,%#\[\].$-]+?)=["']?\{/g;
  250. function validClassName(i) {
  251. return regexClassChecks.every((r) => i.length > 2 && i.match(r));
  252. }
  253. // src/extractors/default.ts
  254. function DefaultExtractor(code, id) {
  255. if (id?.endsWith(".css") || id?.endsWith(".postcss")) {
  256. return {
  257. classes: [],
  258. tags: []
  259. };
  260. }
  261. const tags = Array.from(code.matchAll(regexHtmlTag));
  262. const tagNames = tags.map((i) => i[1]);
  263. return {
  264. tags: tagNames,
  265. get classes() {
  266. return code.split(regexClassSplitter).filter(validClassName);
  267. },
  268. get attributes() {
  269. const attrRanges = [];
  270. const attributes = {
  271. names: [],
  272. values: []
  273. };
  274. const attributesBlocklist = ["class", "className"];
  275. const tagsBlocklist = ["meta", "script", "style", "link"];
  276. tags.filter((i) => !tagsBlocklist.includes(i[1])).forEach((i) => {
  277. return Array.from(i[2].matchAll(regexAttributifyItem) || []).forEach((match) => {
  278. let name = match[1];
  279. const [full, , , value] = match;
  280. name = name.replace(/^(:|v-bind:)/, "");
  281. if (attributesBlocklist.includes(name))
  282. return;
  283. attributes.names.push(name);
  284. attributes.values.push(value);
  285. if (match.index != null)
  286. attrRanges.push([match.index, match.index + full.length]);
  287. });
  288. });
  289. return attributes;
  290. }
  291. };
  292. }
  293. // src/extractors/pug.ts
  294. var regexTemplate = /<template.*?lang=['"]pug['"][^>]*?>\n([\s\S]*?\n)<\/template>/gm;
  295. function PugExtractor(code, id) {
  296. const Pug = require("pug");
  297. const compile = (code2) => {
  298. try {
  299. return Pug.compile(code2, { filename: id })();
  300. } catch {
  301. }
  302. };
  303. let compiled;
  304. if (id && id.match(/\.vue$/)) {
  305. const matches = Array.from(code.matchAll(regexTemplate));
  306. let tail = "";
  307. for (const match of matches) {
  308. if (match && match[1])
  309. tail += `
  310. ${compile(match[1])}`;
  311. }
  312. if (tail)
  313. compiled = `${code}
  314. ${tail}`;
  315. } else {
  316. compiled = compile(code);
  317. }
  318. return DefaultExtractor(compiled || code);
  319. }
  320. // src/extractors/svelte.ts
  321. function SvelteExtractor(code, id) {
  322. const result = DefaultExtractor(code, id);
  323. return {
  324. tags: result.tags,
  325. get classes() {
  326. return [
  327. ...result.classes,
  328. ...Array.from(code.matchAll(regexSvelteClass)).map((i) => i[1]).filter(Boolean)
  329. ];
  330. },
  331. get attributes() {
  332. return result.attributes;
  333. }
  334. };
  335. }
  336. // src/extractors/helper.ts
  337. function getDefaultExtractors() {
  338. const extractors = [
  339. {
  340. extractor: SvelteExtractor,
  341. extensions: ["svelte"]
  342. }
  343. ];
  344. try {
  345. require.resolve("pug");
  346. extractors.push({
  347. extractor: PugExtractor,
  348. extensions: ["vue", "pug"]
  349. });
  350. } catch (e) {
  351. }
  352. return extractors;
  353. }
  354. async function applyExtractors(code, id, extractors = [], defaultExtract = DefaultExtractor) {
  355. let ext = id ? (0, import_path.extname)(id) : "*";
  356. if (ext[0] === ".")
  357. ext = ext.slice(1);
  358. const matchingExtractors = extractors.filter((extractor) => extractor.extensions.includes(ext)).map((extractor) => extractor.extractor);
  359. return Promise.all((matchingExtractors.length ? matchingExtractors : [defaultExtract]).map((extractor) => extractor(code, id))).then((results) => {
  360. const attributesNames = results.flatMap((v) => v.attributes?.names ?? []);
  361. const attributesValues = results.flatMap((v) => v.attributes?.values ?? []);
  362. return {
  363. tags: (0, import_utils3.uniq)(results.flatMap((v) => v.tags ?? [])),
  364. ids: (0, import_utils3.uniq)(results.flatMap((v) => v.ids ?? [])),
  365. classes: (0, import_utils3.uniq)(results.flatMap((v) => v.classes ?? [])),
  366. attributes: attributesNames.length || attributesValues.length ? {
  367. names: attributesNames,
  368. values: attributesValues
  369. } : void 0
  370. };
  371. });
  372. }
  373. // src/resolveOptions.ts
  374. __reExport(resolveOptions_exports, require("@windicss/config"));
  375. function isResolvedOptions(options) {
  376. return options.__windi_resolved;
  377. }
  378. function buildGlobs(dirs, fileExtensions) {
  379. dirs = (0, import_utils2.toArray)(dirs);
  380. const exts = (0, import_utils2.toArray)(fileExtensions);
  381. const globs = exts.length ? dirs.map(
  382. (i) => import_path2.default.posix.join(
  383. i,
  384. exts.length > 1 ? `**/*.{${exts.join(",")}}` : `**/*.${exts[0]}`
  385. )
  386. ) : [];
  387. globs.push("index.html");
  388. return globs;
  389. }
  390. async function resolveOptions(options = {}, utilsOptions = {}, loadConfigFile = false) {
  391. if (isResolvedOptions(options))
  392. return options;
  393. const {
  394. name = "windicss-plugin-utils"
  395. } = utilsOptions;
  396. const debugOptions = (0, import_debug.default)(`${name}:options`);
  397. const root = options.root || utilsOptions.root || process.cwd();
  398. let { config, filepath: configFilePath } = loadConfigFile ? (0, import_config.loadConfiguration)({
  399. onConfigurationError: (error) => console.error(error),
  400. ...utilsOptions,
  401. root,
  402. config: options.config,
  403. configFiles: options.configFiles
  404. }) : { config: {}, filepath: void 0 };
  405. const modifiedConfigs = await options.onConfigResolved?.(config, configFilePath);
  406. if (modifiedConfigs != null)
  407. config = modifiedConfigs;
  408. const {
  409. scan = true,
  410. preflight = true,
  411. transformCSS = true,
  412. transformGroups: transformGroups2 = true,
  413. sortUtilities = true
  414. } = options;
  415. const preflightOptions = Object.assign(
  416. {
  417. includeBase: true,
  418. includeGlobal: true,
  419. includePlugin: true,
  420. enableAll: false,
  421. includeAll: false,
  422. safelist: [],
  423. blocklist: [],
  424. alias: {}
  425. },
  426. typeof config.preflight === "boolean" ? {} : config.preflight,
  427. typeof preflight === "boolean" ? {} : preflight
  428. );
  429. preflightOptions.includeAll = preflightOptions.includeAll || preflightOptions.enableAll;
  430. const scanOptions = Object.assign(
  431. {
  432. fileExtensions: ["html", "vue", "md", "mdx", "pug", "jsx", "tsx", "svelte", "ts", "js", "css", "postcss", "pcss"],
  433. dirs: ["src"],
  434. exclude: [],
  435. include: [],
  436. runOnStartup: true,
  437. transformers: [],
  438. extractors: [],
  439. extraTransformTargets: {
  440. css: [],
  441. detect: []
  442. }
  443. },
  444. typeof scan === "boolean" ? {} : scan
  445. );
  446. function resolveGlob(glob) {
  447. if (glob.startsWith("!"))
  448. return `!${(0, import_utils2.slash)(import_path2.default.resolve(root, glob.slice(1)))}`;
  449. return (0, import_utils2.slash)(import_path2.default.resolve(root, glob));
  450. }
  451. scanOptions.exclude = mergeArrays(
  452. config.extract?.exclude,
  453. scanOptions.exclude,
  454. config.extract?.exclude ? [] : [
  455. "node_modules",
  456. ".git",
  457. "windi.config.{ts,js}",
  458. "tailwind.config.{ts,js}"
  459. ]
  460. ).map(resolveGlob);
  461. scanOptions.include = mergeArrays(
  462. config.extract?.include,
  463. scanOptions.include,
  464. config.extract?.include ? [] : buildGlobs(scanOptions.dirs, scanOptions.fileExtensions)
  465. ).map(resolveGlob);
  466. scanOptions.extractors = mergeArrays(getDefaultExtractors(), config.extract?.extractors);
  467. const safelist = new Set(mergeArrays(config.safelist, options.safelist).flatMap((i) => i.split(" ")));
  468. const blocklist = new Set(mergeArrays(config.blocklist, options.blocklist).flatMap((i) => i.split(" ")));
  469. const configPreflightOptions = typeof config.preflight === "boolean" ? {} : config.preflight || {};
  470. preflightOptions.safelist = new Set(
  471. mergeArrays(
  472. configPreflightOptions?.safelist,
  473. Array.from(preflightOptions.safelist)
  474. ).flatMap((i) => i.split(" ")).map((i) => {
  475. const match = i.match(/^\[(.*?)\]$/)?.[1];
  476. if (match)
  477. return `div ${match}`;
  478. return i;
  479. })
  480. );
  481. preflightOptions.blocklist = new Set(
  482. mergeArrays(
  483. configPreflightOptions?.blocklist,
  484. Array.from(preflightOptions.blocklist)
  485. ).flatMap((i) => i.split(" "))
  486. );
  487. preflightOptions.alias = Object.fromEntries(
  488. Object.entries({
  489. ...defaultAlias,
  490. ...configPreflightOptions.alias,
  491. ...preflightOptions.alias
  492. }).filter(([k, v]) => [kebabCase(k), v])
  493. );
  494. let resolvedOptions = {
  495. ...options,
  496. root,
  497. config,
  498. configFilePath,
  499. enableScan: Boolean(scan),
  500. scanOptions,
  501. enablePreflight: config.preflight !== false && Boolean(preflight),
  502. preflightOptions,
  503. transformCSS,
  504. transformGroups: transformGroups2,
  505. sortUtilities,
  506. safelist,
  507. blocklist,
  508. __windi_resolved: true
  509. };
  510. const modifiedOptions = await resolvedOptions.onOptionsResolved?.(resolvedOptions);
  511. if (modifiedOptions != null && modifiedOptions !== resolvedOptions)
  512. resolvedOptions = Object.assign(resolvedOptions, modifiedOptions);
  513. debugOptions(resolvedOptions);
  514. return resolvedOptions;
  515. }
  516. // src/transforms.ts
  517. var import_magic_string = __toESM(require("magic-string"));
  518. function transformGroups(code, sourcemap = true) {
  519. const s = new import_magic_string.default(code);
  520. let hasReplaced = false;
  521. let match;
  522. regexClassGroup.lastIndex = 0;
  523. while (match = regexClassGroup.exec(code)) {
  524. hasReplaced = true;
  525. const start = match.index;
  526. const end = start + match[0].length;
  527. const a = match[1];
  528. const b = match[2];
  529. const replacement = b.split(/\s+/g).filter(Boolean).map((i) => i.replace(/^(!?)(.*)/, `$1${a}:$2`)).join(" ");
  530. s.overwrite(start, end, replacement);
  531. }
  532. if (!hasReplaced)
  533. return null;
  534. return {
  535. code: s.toString(),
  536. map: sourcemap ? s.generateMap({ hires: true }) : void 0
  537. };
  538. }
  539. function buildAliasTransformer(alias) {
  540. if (!alias || !Object.keys(alias).length)
  541. return () => null;
  542. const keys = Object.keys(alias).sort((a, b) => b.length - a.length).map((i) => escapeRegExp(i)).join("|");
  543. const regexText = `\\*(?:${keys})(?<=[^w-])`;
  544. const regex = new RegExp(regexText, "g");
  545. return function transformAlias(code, sourcemap = true) {
  546. const s = new import_magic_string.default(code);
  547. let hasReplaced = false;
  548. let match;
  549. regex.lastIndex = 0;
  550. while (match = regex.exec(code)) {
  551. hasReplaced = true;
  552. const start = match.index;
  553. const end = start + match[0].length;
  554. const name = code.slice(start + 1, end);
  555. const replacement = alias[name];
  556. s.overwrite(start, end, replacement);
  557. }
  558. if (!hasReplaced)
  559. return null;
  560. return {
  561. code: s.toString(),
  562. map: sourcemap ? s.generateMap({ hires: true }) : void 0
  563. };
  564. };
  565. }
  566. // src/createUtils.ts
  567. var SupportedLayers = ["base", "utilities", "components"];
  568. function createUtils(userOptions = {}, utilsOptions = {
  569. name: "windicss-plugin-utils"
  570. }) {
  571. let options = {};
  572. const name = utilsOptions.name;
  573. const debug = {
  574. config: (0, import_debug2.default)(`${name}:config`),
  575. debug: (0, import_debug2.default)(`${name}:debug`),
  576. compile: (0, import_debug2.default)(`${name}:compile`),
  577. scan: (0, import_debug2.default)(`${name}:scan`),
  578. scanGlob: (0, import_debug2.default)(`${name}:scan:glob`),
  579. scanTransform: (0, import_debug2.default)(`${name}:scan:transform`),
  580. detectClass: (0, import_debug2.default)(`${name}:detect:class`),
  581. detectTag: (0, import_debug2.default)(`${name}:detect:tag`),
  582. detectAttrs: (0, import_debug2.default)(`${name}:detect:attrs`),
  583. compileLayer: (0, import_debug2.default)(`${name}:compile:layer`)
  584. };
  585. let processor;
  586. let completions;
  587. let files = [];
  588. const classesGenerated = /* @__PURE__ */ new Set();
  589. const classesPending = /* @__PURE__ */ new Set();
  590. const tagsGenerated = /* @__PURE__ */ new Set();
  591. const tagsPending = /* @__PURE__ */ new Set();
  592. const attrsGenerated = /* @__PURE__ */ new Set();
  593. const tagsAvailable = /* @__PURE__ */ new Set();
  594. const attributes = [];
  595. let _transformAlias = () => null;
  596. const _locks = [];
  597. function getCompletions() {
  598. if (!completions)
  599. completions = (0, import_utils6.generateCompletions)(processor);
  600. return completions;
  601. }
  602. async function getFiles() {
  603. await ensureInit();
  604. debug.scanGlob("include", options.scanOptions.include);
  605. debug.scanGlob("exclude", options.scanOptions.exclude);
  606. const files2 = await (0, import_fast_glob.default)(
  607. options.scanOptions.include,
  608. {
  609. cwd: options.root,
  610. ignore: options.scanOptions.exclude,
  611. onlyFiles: true,
  612. absolute: true
  613. }
  614. );
  615. files2.sort();
  616. debug.scanGlob("files", files2);
  617. return files2;
  618. }
  619. let scanned = false;
  620. const scan = (0, import_utils7.createSingletonPromise)(async () => {
  621. await ensureInit();
  622. debug.scan("started");
  623. files.push(...await getFiles());
  624. const contents = await Promise.all(
  625. files.filter((id) => isDetectTarget(id)).map(async (id) => [await import_fs.default.promises.readFile(id, "utf-8"), id])
  626. );
  627. await Promise.all(contents.map(
  628. async ([content, id]) => {
  629. if (isCssTransformTarget(id))
  630. return transformCSS(content, id);
  631. else
  632. return extractFile(content, id, true);
  633. }
  634. ));
  635. scanned = true;
  636. debug.scan("finished");
  637. });
  638. function isExcluded(id) {
  639. return import_micromatch.default.contains((0, import_utils2.slash)(id), options.scanOptions.exclude, { dot: true });
  640. }
  641. function isIncluded(id) {
  642. return import_micromatch.default.isMatch((0, import_utils2.slash)(id), options.scanOptions.include);
  643. }
  644. function isDetectTarget(id) {
  645. if (options.scanOptions.extraTransformTargets.detect.some((i) => typeof i === "string" ? i === id : i(id)))
  646. return true;
  647. if (files.includes(id) || files.includes(id.slice(0, id.indexOf("?"))))
  648. return true;
  649. return isIncluded(id) && !isExcluded(id);
  650. }
  651. function isScanTarget(id) {
  652. return options.enableScan ? files.some((file) => id.startsWith(file)) : isDetectTarget(id);
  653. }
  654. function isCssTransformTarget(id) {
  655. if (options.scanOptions.extraTransformTargets.css.some((i) => typeof i === "string" ? i === id : i(id)))
  656. return true;
  657. if (id.match(/\.(?:postcss|pcss|scss|sass|css|stylus|less)(?:$|\?)/i) && !isExcluded(id))
  658. return true;
  659. return false;
  660. }
  661. function addClasses(classes) {
  662. let changed = false;
  663. classes.forEach((i) => {
  664. if (!i || classesGenerated.has(i) || classesPending.has(i) || options.blocklist.has(i))
  665. return;
  666. classesPending.add(i);
  667. changed = true;
  668. });
  669. return changed;
  670. }
  671. function addTags(tags) {
  672. if (options.preflightOptions.includeAll)
  673. return false;
  674. let changed = false;
  675. tags.forEach((tag) => {
  676. if (!tagsAvailable.has(tag))
  677. tag = options.preflightOptions.alias[kebabCase(tag)];
  678. if (options.preflightOptions.blocklist.has(tag))
  679. return;
  680. if (tagsAvailable.has(tag) && !tagsPending.has(tag)) {
  681. tagsPending.add(tag);
  682. tagsAvailable.delete(tag);
  683. changed = true;
  684. }
  685. });
  686. return changed;
  687. }
  688. async function applyExtractors2(code, id) {
  689. return await applyExtractors(code, id, options.scanOptions.extractors);
  690. }
  691. async function extractFile(code, id, applyTransform = true) {
  692. if (applyTransform) {
  693. code = _transformAlias(code, false)?.code ?? code;
  694. if (options.transformGroups)
  695. code = transformGroups(code, false)?.code ?? code;
  696. }
  697. if (id) {
  698. debug.scanTransform(id);
  699. for (const trans of options.scanOptions.transformers) {
  700. const result = trans(code, id);
  701. if (result != null)
  702. code = result;
  703. }
  704. }
  705. const extractResult = await applyExtractors2(code, id);
  706. let changed = false;
  707. if (options.enablePreflight && !options.preflightOptions.includeAll) {
  708. changed = addTags(extractResult.tags || []) || changed;
  709. }
  710. if (options.config.attributify) {
  711. const extractedAttrs = extractResult.attributes;
  712. if (extractedAttrs?.names.length) {
  713. extractedAttrs.names.forEach((name2, i) => {
  714. attributes.push([name2, extractedAttrs.values[i]]);
  715. });
  716. changed = true;
  717. }
  718. changed = addClasses(extractedAttrs?.classes || extractResult.classes || []) || changed;
  719. } else {
  720. changed = addClasses(extractResult.classes || []) || changed;
  721. }
  722. if (changed) {
  723. debug.detectClass(classesPending);
  724. debug.detectTag(tagsPending);
  725. debug.detectAttrs(attributes);
  726. }
  727. return changed;
  728. }
  729. function transformCSS(css, id, transformOptions) {
  730. if (!options.transformCSS)
  731. return css;
  732. const style = new import_parser.CSSParser(css, processor).parse();
  733. if (transformOptions?.globaliseKeyframes) {
  734. const [nonKeyframeBlocks, keyframeBlocks] = (0, import_utils2.partition)(
  735. style.children,
  736. (i) => !i.atRules || !i.atRules[0].match(/keyframes (pulse|spin|ping|bounce)/)
  737. );
  738. updateLayers(keyframeBlocks, "__classes", false);
  739. style.children = nonKeyframeBlocks;
  740. }
  741. const [layerBlocks, blocks] = (0, import_utils2.partition)(style.children, (i) => i.meta.group === "layer-block" && SupportedLayers.includes(i.meta.type));
  742. if (layerBlocks.length) {
  743. updateLayers(layerBlocks, id);
  744. style.children = blocks;
  745. }
  746. const transformed = style.build();
  747. if (layerBlocks.length)
  748. transformOptions?.onLayerUpdated?.();
  749. return transformed;
  750. }
  751. const layers = {
  752. base: {},
  753. utilities: {},
  754. components: {}
  755. };
  756. const layerStylesMap = /* @__PURE__ */ new Map();
  757. function updateLayers(styles, filepath, replace = true) {
  758. const timestamp = +Date.now();
  759. debug.compileLayer("update", filepath);
  760. const changedLayers = /* @__PURE__ */ new Set();
  761. styles.forEach((i) => changedLayers.add(i.meta.type));
  762. if (replace) {
  763. layerStylesMap.get(filepath)?.forEach((i) => changedLayers.add(i.meta.type));
  764. layerStylesMap.set(filepath, styles);
  765. } else {
  766. const prevStyles = layerStylesMap.get(filepath) || [];
  767. layerStylesMap.set(filepath, prevStyles.concat(styles));
  768. }
  769. for (const name2 of changedLayers) {
  770. const layer = layers[name2];
  771. if (layer) {
  772. layer.timestamp = timestamp;
  773. layer.cssCache = void 0;
  774. }
  775. }
  776. }
  777. function buildLayerCss(name2) {
  778. const layer = layers[name2];
  779. if (layer.cssCache == null) {
  780. const style = new import_style.StyleSheet(Array.from(layerStylesMap.values()).flatMap((i) => i).filter((i) => i.meta.type === name2));
  781. style.prefixer = options.config.prefixer ?? true;
  782. debug.compileLayer(name2, style.children.length);
  783. if (options.sortUtilities)
  784. style.sort();
  785. layer.cssCache = `/* windicss layer ${name2} */
  786. ${style.build()}`;
  787. }
  788. return layer.cssCache;
  789. }
  790. function buildPendingStyles() {
  791. options.onBeforeGenerate?.({
  792. classesPending,
  793. tagsPending
  794. });
  795. if (classesPending.size) {
  796. const result = processor.interpret(Array.from(classesPending).join(" "));
  797. if (result.success.length) {
  798. debug.compile(`compiled ${result.success.length} classes out of ${classesPending.size}`);
  799. debug.compile(result.success);
  800. updateLayers(result.styleSheet.children, "__classes", false);
  801. include(classesGenerated, result.success);
  802. classesPending.clear();
  803. }
  804. }
  805. if (options.enablePreflight) {
  806. if (options.preflightOptions.includeAll) {
  807. if (!layerStylesMap.has("__preflights")) {
  808. const preflightStyle = processor.preflight(
  809. void 0,
  810. options.preflightOptions.includeBase,
  811. options.preflightOptions.includeGlobal,
  812. options.preflightOptions.includePlugin
  813. );
  814. updateLayers(preflightStyle.children, "__preflights", true);
  815. }
  816. } else if (tagsPending.size) {
  817. const preflightStyle = processor.preflight(
  818. Array.from(tagsPending).map((i) => `<${i}/>`).join(" "),
  819. options.preflightOptions.includeBase,
  820. options.preflightOptions.includeGlobal,
  821. options.preflightOptions.includePlugin
  822. );
  823. updateLayers(preflightStyle.children, "__preflights", false);
  824. include(tagsGenerated, tagsPending);
  825. tagsPending.clear();
  826. }
  827. }
  828. if (options.config.attributify) {
  829. if (attributes.length) {
  830. const attributesObject = {};
  831. attributes.filter((i) => i[0] && i[1]).forEach(([name2, value]) => {
  832. if (!attributesObject[name2])
  833. attributesObject[name2] = [];
  834. attributesObject[name2].push(
  835. ...String(value).split(regexClassSplitter).filter(Boolean)
  836. );
  837. });
  838. const attributifyStyle = processor.attributify(
  839. attributesObject
  840. );
  841. updateLayers(attributifyStyle.styleSheet.children, "__attributify", false);
  842. attributes.length = 0;
  843. }
  844. }
  845. options.onGenerated?.({
  846. classes: classesGenerated,
  847. tags: tagsGenerated
  848. });
  849. }
  850. async function generateCSS(layer) {
  851. await ensureInit();
  852. if (options.enableScan && options.scanOptions.runOnStartup)
  853. await scan();
  854. buildPendingStyles();
  855. return layer ? buildLayerCss(layer) : [
  856. buildLayerCss("base"),
  857. buildLayerCss("components"),
  858. buildLayerCss("utilities")
  859. ].join("\n").trim();
  860. }
  861. function clearCache(clearAll = false) {
  862. layers.base = {};
  863. layers.utilities = {};
  864. layers.components = {};
  865. layerStylesMap.clear();
  866. completions = void 0;
  867. if (clearAll) {
  868. classesPending.clear();
  869. tagsPending.clear();
  870. tagsAvailable.clear();
  871. } else {
  872. include(classesPending, classesGenerated);
  873. include(tagsPending, tagsGenerated);
  874. include(tagsPending, preflightTags);
  875. }
  876. include(tagsAvailable, htmlTags);
  877. include(classesPending, options.safelist);
  878. include(tagsPending, options.preflightOptions.safelist);
  879. exclude(tagsAvailable, preflightTags);
  880. exclude(tagsAvailable, options.preflightOptions.safelist);
  881. classesGenerated.clear();
  882. tagsGenerated.clear();
  883. attrsGenerated.clear();
  884. }
  885. async function lock(fn) {
  886. const p = fn();
  887. _locks.push(p);
  888. await p;
  889. const i = _locks.indexOf(p);
  890. if (i >= 0)
  891. _locks.splice(i, 1);
  892. }
  893. async function waitLocks() {
  894. await Promise.all(_locks);
  895. }
  896. const utils = {
  897. init,
  898. ensureInit,
  899. extractFile,
  900. applyExtractors: applyExtractors2,
  901. generateCSS,
  902. getFiles,
  903. clearCache,
  904. transformCSS,
  905. transformGroups,
  906. get transformAlias() {
  907. return _transformAlias;
  908. },
  909. buildPendingStyles,
  910. isDetectTarget,
  911. isScanTarget,
  912. isCssTransformTarget,
  913. isExcluded,
  914. scan,
  915. classesGenerated,
  916. classesPending,
  917. tagsGenerated,
  918. tagsPending,
  919. tagsAvailable,
  920. layersMeta: layers,
  921. addClasses,
  922. addTags,
  923. getCompletions,
  924. lock,
  925. waitLocks,
  926. get initialized() {
  927. return !!processor;
  928. },
  929. get options() {
  930. return options;
  931. },
  932. get files() {
  933. return files;
  934. },
  935. get globs() {
  936. return options.scanOptions.include;
  937. },
  938. get processor() {
  939. return processor;
  940. },
  941. get scanned() {
  942. return scanned;
  943. },
  944. get configFilePath() {
  945. return options.configFilePath;
  946. },
  947. get hasPending() {
  948. return Boolean(tagsPending.size || classesPending.size);
  949. }
  950. };
  951. async function _init() {
  952. options = await resolveOptions(userOptions, utilsOptions, true);
  953. files = [];
  954. processor = new import_windicss.default(options.config);
  955. clearCache(false);
  956. options.onInitialized?.(utils);
  957. _transformAlias = buildAliasTransformer(options.config.alias);
  958. return processor;
  959. }
  960. let _promise_init;
  961. async function init() {
  962. _promise_init = _init();
  963. return _promise_init;
  964. }
  965. async function ensureInit() {
  966. if (processor)
  967. return processor;
  968. if (!_promise_init)
  969. _promise_init = _init();
  970. return _promise_init;
  971. }
  972. return utils;
  973. }
  974. // src/index.ts
  975. __reExport(src_exports, resolveOptions_exports, module.exports);
  976. // src/merge.ts
  977. var isObject = (val) => toString.call(val) === "[object Object]";
  978. function deepMerge(a, b, rootPath) {
  979. a = { ...a };
  980. Object.keys(b).forEach((key) => {
  981. if (isObject(a[key]))
  982. a[key] = deepMerge(a[key], b[key], rootPath ? `${rootPath}.${key}` : key);
  983. else if (Array.isArray(a[key]))
  984. a[key] = [...a[key], ...b[key]];
  985. else
  986. a[key] = b[key];
  987. });
  988. return a;
  989. }
  990. function mergeWindicssConfig(a, b) {
  991. return deepMerge(a, b, "");
  992. }
  993. // Annotate the CommonJS export names for ESM import in node:
  994. 0 && (module.exports = {
  995. DefaultExtractor,
  996. PugExtractor,
  997. SupportedLayers,
  998. SvelteExtractor,
  999. applyExtractors,
  1000. buildAliasTransformer,
  1001. createUtils,
  1002. defaultAlias,
  1003. defineConfig,
  1004. escapeRegExp,
  1005. exclude,
  1006. flattenArray,
  1007. getDefaultExtractors,
  1008. htmlTags,
  1009. include,
  1010. isResolvedOptions,
  1011. kebabCase,
  1012. mergeArrays,
  1013. mergeWindicssConfig,
  1014. partition,
  1015. preflightTags,
  1016. resolveOptions,
  1017. slash,
  1018. toArray,
  1019. transformGroups
  1020. });