版博士V2.0程序
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

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