unplugin-tailwindcss-mangle 0.0.4 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,6 +15,7 @@ mangle tailwindcss utilities plugin
15
15
  - [webpack](#webpack)
16
16
  - [Options](#options)
17
17
  - [classGenerator](#classgenerator)
18
+ - [include / exclude](#include--exclude)
18
19
  - [Notice](#notice)
19
20
 
20
21
  ## Features
@@ -76,15 +77,23 @@ You will see all class was renamed to `tw-*`
76
77
 
77
78
  #### webpack
78
79
 
79
- > Experiment, not work right now
80
-
81
80
  ```js
82
81
  // esm
83
82
  import { webpackPlugin as utwm } from 'unplugin-tailwindcss-mangle'
84
83
  // or cjs
85
84
  const { webpackPlugin: utwm } = require('unplugin-tailwindcss-mangle')
86
85
  // use this webpack plugin
87
- utwm()
86
+ // for example next.config.js
87
+ /** @type {import('next').NextConfig} */
88
+ const nextConfig = {
89
+ reactStrictMode: true,
90
+ webpack: (config) => {
91
+ config.plugins.push(utwm())
92
+ return config
93
+ }
94
+ }
95
+
96
+ module.exports = nextConfig
88
97
  ```
89
98
 
90
99
  ## Options
@@ -105,6 +114,12 @@ export interface IClassGeneratorOptions {
105
114
  }
106
115
  ```
107
116
 
117
+ ### include / exclude
118
+
119
+ type: glob string
120
+
121
+ allow you to control the mangle range of bundles.
122
+
108
123
  ## Notice
109
124
 
110
125
  This plugin only transform those classes which name contain `-` or `:`, like `w-32`, `before:h-[300px]`,`after:dark:via-[#0141ff]/40`. some classes like `flex`,`relative` will not be mangled.
@@ -1 +1,2 @@
1
1
  export declare const pluginName = "unplugin-tailwindcss-mangle";
2
+ export declare const webpackCacheKey: string;
package/dist/esbuild.js CHANGED
@@ -2,13 +2,16 @@
2
2
 
3
3
  var index = require('./index.js');
4
4
  require('unplugin');
5
- require('tailwindcss-patch');
5
+ require('micromatch');
6
6
  require('parse5');
7
7
  require('@babel/generator');
8
8
  require('@babel/parser');
9
9
  require('@babel/traverse');
10
10
  require('postcss');
11
11
  require('postcss-selector-parser');
12
+ require('path');
13
+ require('fs');
14
+ require('tailwindcss-patch');
12
15
 
13
16
  var esbuild = index.unplugin.esbuild;
14
17
 
package/dist/esbuild.mjs CHANGED
@@ -1,12 +1,15 @@
1
1
  import { unplugin } from './index.mjs';
2
2
  import 'unplugin';
3
- import 'tailwindcss-patch';
3
+ import 'micromatch';
4
4
  import 'parse5';
5
5
  import '@babel/generator';
6
6
  import '@babel/parser';
7
7
  import '@babel/traverse';
8
8
  import 'postcss';
9
9
  import 'postcss-selector-parser';
10
+ import 'path';
11
+ import 'fs';
12
+ import 'tailwindcss-patch';
10
13
 
11
14
  var esbuild = unplugin.esbuild;
12
15
 
package/dist/index.js CHANGED
@@ -3,13 +3,16 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var unplugin$1 = require('unplugin');
6
- var tailwindcssPatch = require('tailwindcss-patch');
6
+ var micromatch = require('micromatch');
7
7
  var parse5 = require('parse5');
8
8
  var _generate = require('@babel/generator');
9
9
  var parser = require('@babel/parser');
10
10
  var _traverse = require('@babel/traverse');
11
11
  var postcss = require('postcss');
12
12
  var parser$1 = require('postcss-selector-parser');
13
+ var path = require('path');
14
+ var fs = require('fs');
15
+ var tailwindcssPatch = require('tailwindcss-patch');
13
16
 
14
17
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
15
18
 
@@ -17,6 +20,8 @@ var _generate__default = /*#__PURE__*/_interopDefault(_generate);
17
20
  var _traverse__default = /*#__PURE__*/_interopDefault(_traverse);
18
21
  var postcss__default = /*#__PURE__*/_interopDefault(postcss);
19
22
  var parser__default = /*#__PURE__*/_interopDefault(parser$1);
23
+ var path__default = /*#__PURE__*/_interopDefault(path);
24
+ var fs__default = /*#__PURE__*/_interopDefault(fs);
20
25
 
21
26
  const pluginName = 'unplugin-tailwindcss-mangle';
22
27
 
@@ -67,6 +72,18 @@ function getGroupedEntries(entries, options = {
67
72
  return 'other';
68
73
  }
69
74
  });
75
+ if (!groupedEntries.css) {
76
+ groupedEntries.css = [];
77
+ }
78
+ if (!groupedEntries.html) {
79
+ groupedEntries.html = [];
80
+ }
81
+ if (!groupedEntries.js) {
82
+ groupedEntries.js = [];
83
+ }
84
+ if (!groupedEntries.other) {
85
+ groupedEntries.other = [];
86
+ }
70
87
  return groupedEntries;
71
88
  }
72
89
  const acceptChars = 'abcdefghijklmnopqrstuvwxyz'.split('');
@@ -102,98 +119,15 @@ function escapeStringRegexp(str) {
102
119
  }
103
120
  return str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d');
104
121
  }
105
-
106
- class ClassGenerator {
107
- constructor(opts = {}) {
108
- var _a;
109
- this.newClassMap = {};
110
- this.newClassSize = 0;
111
- this.context = {};
112
- this.opts = opts;
113
- this.classPrefix = (_a = opts.classPrefix) !== null && _a !== void 0 ? _a : 'tw-';
114
- }
115
- defaultClassGenerate() {
116
- const chars = [];
117
- let rest = (this.newClassSize - (this.newClassSize % acceptChars.length)) / acceptChars.length;
118
- if (rest > 0) {
119
- while (true) {
120
- rest -= 1;
121
- const m = rest % acceptChars.length;
122
- const c = acceptChars[m];
123
- chars.push(c);
124
- rest -= m;
125
- if (rest === 0) {
126
- break;
127
- }
128
- rest /= acceptChars.length;
129
- }
130
- }
131
- const prefixIndex = this.newClassSize % acceptChars.length;
132
- const newClassName = `${this.classPrefix}${acceptChars[prefixIndex]}${chars.join('')}`;
133
- return newClassName;
134
- }
135
- ignoreClassName(className) {
136
- return regExpTest(this.opts.ignoreClass, className);
137
- }
138
- includeFilePath(filePath) {
139
- const { include } = this.opts;
140
- if (Array.isArray(include)) {
141
- return regExpTest(include, filePath);
142
- }
143
- else {
144
- return true;
145
- }
146
- }
147
- excludeFilePath(filePath) {
148
- const { exclude } = this.opts;
149
- if (Array.isArray(exclude)) {
150
- return regExpTest(exclude, filePath);
151
- }
152
- else {
153
- return false;
154
- }
155
- }
156
- isFileIncluded(filePath) {
157
- return this.includeFilePath(filePath) && !this.excludeFilePath(filePath);
158
- }
159
- transformCssClass(className) {
160
- const key = stripEscapeSequence(className);
161
- const cn = this.newClassMap[key];
162
- if (cn)
163
- return cn.name;
164
- return className;
165
- }
166
- generateClassName(original) {
167
- const opts = this.opts;
168
- original = stripEscapeSequence(original);
169
- const cn = this.newClassMap[original];
170
- if (cn)
171
- return cn;
172
- let newClassName;
173
- if (opts.customGenerate && typeof opts.customGenerate === 'function') {
174
- newClassName = opts.customGenerate(original, opts, this.context);
175
- }
176
- if (!newClassName) {
177
- newClassName = this.defaultClassGenerate();
178
- }
179
- if (opts.reserveClassName && regExpTest(opts.reserveClassName, newClassName)) {
180
- if (opts.log) {
181
- console.log(`The class name has been reserved. ${newClassName}`);
182
- }
183
- this.newClassSize++;
184
- return this.generateClassName(original);
185
- }
186
- if (opts.log) {
187
- console.log(`Minify class name from ${original} to ${newClassName}`);
188
- }
189
- const newClass = {
190
- name: newClassName,
191
- usedBy: []
122
+ function createGlobMatcher(pattern, fallbackValue = false) {
123
+ if (typeof pattern === 'undefined') {
124
+ return function (file) {
125
+ return fallbackValue;
192
126
  };
193
- this.newClassMap[original] = newClass;
194
- this.newClassSize++;
195
- return newClass;
196
127
  }
128
+ return function (file) {
129
+ return micromatch.isMatch(file, pattern);
130
+ };
197
131
  }
198
132
 
199
133
  ({
@@ -322,6 +256,9 @@ function getDefaultExportFromNamespaceIfPresent(n) {
322
256
  }
323
257
  const generate = getDefaultExportFromNamespaceIfPresent(_generate__default["default"]);
324
258
  const traverse = getDefaultExportFromNamespaceIfPresent(_traverse__default["default"]);
259
+ function makeRegex(str) {
260
+ return new RegExp('(?<=^|[\\s"])' + escapeStringRegexp(str), 'g');
261
+ }
325
262
  function handleValue(str, node, options) {
326
263
  const set = options.runtimeSet;
327
264
  const clsGen = options.classGenerator;
@@ -335,7 +272,7 @@ function handleValue(str, node, options) {
335
272
  ignoreFlag = node.leadingComments.findIndex((x) => x.value.includes('tw-mangle') && x.value.includes('ignore')) > -1;
336
273
  }
337
274
  if (!ignoreFlag) {
338
- rawStr = rawStr.replace(new RegExp('(?<="|\\s)' + escapeStringRegexp(v), 'g'), clsGen.generateClassName(v).name);
275
+ rawStr = rawStr.replace(makeRegex(v), clsGen.generateClassName(v).name);
339
276
  }
340
277
  }
341
278
  }
@@ -396,7 +333,105 @@ function cssHandler(rawSource, options) {
396
333
  ]).process(rawSource).css;
397
334
  }
398
335
 
399
- const unplugin = unplugin$1.createUnplugin((options = {}, meta) => {
336
+ class ClassGenerator {
337
+ constructor(opts = {}) {
338
+ var _a;
339
+ this.newClassMap = {};
340
+ this.newClassSize = 0;
341
+ this.context = {};
342
+ this.opts = opts;
343
+ this.classPrefix = (_a = opts.classPrefix) !== null && _a !== void 0 ? _a : 'tw-';
344
+ }
345
+ defaultClassGenerate() {
346
+ const chars = [];
347
+ let rest = (this.newClassSize - (this.newClassSize % acceptChars.length)) / acceptChars.length;
348
+ if (rest > 0) {
349
+ while (true) {
350
+ rest -= 1;
351
+ const m = rest % acceptChars.length;
352
+ const c = acceptChars[m];
353
+ chars.push(c);
354
+ rest -= m;
355
+ if (rest === 0) {
356
+ break;
357
+ }
358
+ rest /= acceptChars.length;
359
+ }
360
+ }
361
+ const prefixIndex = this.newClassSize % acceptChars.length;
362
+ const newClassName = `${this.classPrefix}${acceptChars[prefixIndex]}${chars.join('')}`;
363
+ return newClassName;
364
+ }
365
+ ignoreClassName(className) {
366
+ return regExpTest(this.opts.ignoreClass, className);
367
+ }
368
+ includeFilePath(filePath) {
369
+ const { include } = this.opts;
370
+ if (Array.isArray(include)) {
371
+ return regExpTest(include, filePath);
372
+ }
373
+ else {
374
+ return true;
375
+ }
376
+ }
377
+ excludeFilePath(filePath) {
378
+ const { exclude } = this.opts;
379
+ if (Array.isArray(exclude)) {
380
+ return regExpTest(exclude, filePath);
381
+ }
382
+ else {
383
+ return false;
384
+ }
385
+ }
386
+ isFileIncluded(filePath) {
387
+ return this.includeFilePath(filePath) && !this.excludeFilePath(filePath);
388
+ }
389
+ transformCssClass(className) {
390
+ const key = stripEscapeSequence(className);
391
+ const cn = this.newClassMap[key];
392
+ if (cn)
393
+ return cn.name;
394
+ return className;
395
+ }
396
+ generateClassName(original) {
397
+ const opts = this.opts;
398
+ original = stripEscapeSequence(original);
399
+ const cn = this.newClassMap[original];
400
+ if (cn)
401
+ return cn;
402
+ let newClassName;
403
+ if (opts.customGenerate && typeof opts.customGenerate === 'function') {
404
+ newClassName = opts.customGenerate(original, opts, this.context);
405
+ }
406
+ if (!newClassName) {
407
+ newClassName = this.defaultClassGenerate();
408
+ }
409
+ if (opts.reserveClassName && regExpTest(opts.reserveClassName, newClassName)) {
410
+ if (opts.log) {
411
+ console.log(`The class name has been reserved. ${newClassName}`);
412
+ }
413
+ this.newClassSize++;
414
+ return this.generateClassName(original);
415
+ }
416
+ if (opts.log) {
417
+ console.log(`Minify class name from ${original} to ${newClassName}`);
418
+ }
419
+ const newClass = {
420
+ name: newClassName,
421
+ usedBy: []
422
+ };
423
+ this.newClassMap[original] = newClass;
424
+ this.newClassSize++;
425
+ return newClass;
426
+ }
427
+ }
428
+
429
+ function getOptions(options = {}) {
430
+ const includeMatcher = createGlobMatcher(options.include, true);
431
+ const excludeMatcher = createGlobMatcher(options.exclude, false);
432
+ function isInclude(file) {
433
+ return includeMatcher(file) && !excludeMatcher(file);
434
+ }
400
435
  const isMangleClass = (className) => {
401
436
  return /[-:]/.test(className);
402
437
  };
@@ -412,6 +447,18 @@ const unplugin = unplugin$1.createUnplugin((options = {}, meta) => {
412
447
  classSet = set;
413
448
  return classSet;
414
449
  }
450
+ return {
451
+ getCachedClassSet,
452
+ classGenerator,
453
+ includeMatcher,
454
+ excludeMatcher,
455
+ isInclude
456
+ };
457
+ }
458
+
459
+ const outputCachedMap = new Map();
460
+ const unplugin = unplugin$1.createUnplugin((options = {}, meta) => {
461
+ const { classGenerator, getCachedClassSet, isInclude } = getOptions(options);
415
462
  return {
416
463
  name: pluginName,
417
464
  enforce: 'post',
@@ -425,29 +472,35 @@ const unplugin = unplugin$1.createUnplugin((options = {}, meta) => {
425
472
  const groupedEntries = getGroupedEntries(Object.entries(bundle));
426
473
  if (Array.isArray(groupedEntries.html) && groupedEntries.html.length) {
427
474
  for (let i = 0; i < groupedEntries.html.length; i++) {
428
- const [, asset] = groupedEntries.html[i];
429
- asset.source = htmlHandler(asset.source.toString(), {
430
- classGenerator,
431
- runtimeSet
432
- });
475
+ const [file, asset] = groupedEntries.html[i];
476
+ if (isInclude(file)) {
477
+ asset.source = htmlHandler(asset.source.toString(), {
478
+ classGenerator,
479
+ runtimeSet
480
+ });
481
+ }
433
482
  }
434
483
  }
435
484
  if (Array.isArray(groupedEntries.js) && groupedEntries.js.length) {
436
485
  for (let i = 0; i < groupedEntries.js.length; i++) {
437
- const [, chunk] = groupedEntries.js[i];
438
- chunk.code = jsHandler(chunk.code, {
439
- runtimeSet,
440
- classGenerator
441
- }).code;
486
+ const [file, chunk] = groupedEntries.js[i];
487
+ if (isInclude(file)) {
488
+ chunk.code = jsHandler(chunk.code, {
489
+ runtimeSet,
490
+ classGenerator
491
+ }).code;
492
+ }
442
493
  }
443
494
  }
444
495
  if (Array.isArray(groupedEntries.css) && groupedEntries.css.length) {
445
496
  for (let i = 0; i < groupedEntries.css.length; i++) {
446
- const [, css] = groupedEntries.css[i];
447
- css.source = cssHandler(css.source.toString(), {
448
- classGenerator,
449
- runtimeSet
450
- });
497
+ const [file, css] = groupedEntries.css[i];
498
+ if (isInclude(file)) {
499
+ css.source = cssHandler(css.source.toString(), {
500
+ classGenerator,
501
+ runtimeSet
502
+ });
503
+ }
451
504
  }
452
505
  }
453
506
  }
@@ -456,49 +509,129 @@ const unplugin = unplugin$1.createUnplugin((options = {}, meta) => {
456
509
  webpack(compiler) {
457
510
  const Compilation = compiler.webpack.Compilation;
458
511
  const { ConcatSource } = compiler.webpack.sources;
512
+ function getAssetPath(outputPath, file, abs = true) {
513
+ const fn = abs ? path__default["default"].resolve : path__default["default"].relative;
514
+ return fn(compiler.context, path__default["default"].resolve(outputPath, file));
515
+ }
516
+ function overwriteServerSideAsset(outputPath, file, data) {
517
+ const abs = getAssetPath(outputPath, file);
518
+ const rel = getAssetPath(outputPath, file, false);
519
+ try {
520
+ fs__default["default"].writeFileSync(abs, data, 'utf-8');
521
+ console.log('[tailwindcss-mangle]: ' + rel + ' overwrited successfully');
522
+ }
523
+ catch (error) {
524
+ console.log('[tailwindcss-mangle]: ' + rel + ' overwrited fail!');
525
+ console.log(error);
526
+ }
527
+ }
459
528
  compiler.hooks.compilation.tap(pluginName, (compilation) => {
460
529
  compilation.hooks.processAssets.tap({
461
530
  name: pluginName,
462
531
  stage: Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE
463
532
  }, (assets) => {
464
533
  const runtimeSet = getCachedClassSet();
534
+ const groupedEntries = getGroupedEntries(Object.entries(assets));
465
535
  if (!runtimeSet.size) {
536
+ const css = new Map();
537
+ const html = new Map();
538
+ const js = new Map();
539
+ groupedEntries.css.forEach(([file, source]) => {
540
+ css.set(file, source);
541
+ });
542
+ groupedEntries.html.forEach(([file, source]) => {
543
+ html.set(file, source);
544
+ });
545
+ groupedEntries.js.forEach(([file, source]) => {
546
+ js.set(file, source);
547
+ });
548
+ if (js.size || css.size || html.size) {
549
+ outputCachedMap.set(compiler.outputPath, {
550
+ css,
551
+ html,
552
+ js
553
+ });
554
+ }
466
555
  return;
467
556
  }
468
- const groupedEntries = getGroupedEntries(Object.entries(assets));
469
- if (Array.isArray(groupedEntries.html) && groupedEntries.html.length) {
557
+ if (groupedEntries.html.length) {
470
558
  for (let i = 0; i < groupedEntries.html.length; i++) {
471
559
  const [file, asset] = groupedEntries.html[i];
472
- const html = htmlHandler(asset.source().toString(), {
473
- classGenerator,
474
- runtimeSet
475
- });
476
- const source = new ConcatSource(html);
477
- compilation.updateAsset(file, source);
560
+ if (isInclude(file)) {
561
+ const html = htmlHandler(asset.source().toString(), {
562
+ classGenerator,
563
+ runtimeSet
564
+ });
565
+ const source = new ConcatSource(html);
566
+ compilation.updateAsset(file, source);
567
+ }
478
568
  }
479
569
  }
480
- if (Array.isArray(groupedEntries.js) && groupedEntries.js.length) {
570
+ if (groupedEntries.js.length) {
481
571
  for (let i = 0; i < groupedEntries.js.length; i++) {
482
572
  const [file, chunk] = groupedEntries.js[i];
483
- const code = jsHandler(chunk.source().toString(), {
484
- runtimeSet,
485
- classGenerator
486
- }).code;
487
- const source = new ConcatSource(code);
488
- compilation.updateAsset(file, source);
573
+ if (isInclude(file)) {
574
+ const code = jsHandler(chunk.source().toString(), {
575
+ runtimeSet,
576
+ classGenerator
577
+ }).code;
578
+ const source = new ConcatSource(code);
579
+ compilation.updateAsset(file, source);
580
+ }
489
581
  }
490
582
  }
491
- if (Array.isArray(groupedEntries.css) && groupedEntries.css.length) {
583
+ if (groupedEntries.css.length) {
492
584
  for (let i = 0; i < groupedEntries.css.length; i++) {
493
585
  const [file, css] = groupedEntries.css[i];
494
- const newCss = cssHandler(css.source().toString(), {
495
- classGenerator,
496
- runtimeSet
497
- });
498
- const source = new ConcatSource(newCss);
499
- compilation.updateAsset(file, source);
586
+ if (isInclude(file)) {
587
+ const newCss = cssHandler(css.source().toString(), {
588
+ classGenerator,
589
+ runtimeSet
590
+ });
591
+ const source = new ConcatSource(newCss);
592
+ compilation.updateAsset(file, source);
593
+ }
500
594
  }
501
595
  }
596
+ outputCachedMap.forEach(({ js, html, css }, key) => {
597
+ if (html.size) {
598
+ html.forEach((asset, file) => {
599
+ if (isInclude(file)) {
600
+ const html = htmlHandler(asset.source().toString(), {
601
+ classGenerator,
602
+ runtimeSet
603
+ });
604
+ overwriteServerSideAsset(key, file, html);
605
+ }
606
+ });
607
+ html.clear();
608
+ }
609
+ if (js.size) {
610
+ js.forEach((chunk, file) => {
611
+ if (isInclude(file)) {
612
+ const rawCode = chunk.source().toString();
613
+ const code = jsHandler(rawCode, {
614
+ runtimeSet,
615
+ classGenerator
616
+ }).code;
617
+ overwriteServerSideAsset(key, file, code);
618
+ }
619
+ });
620
+ js.clear();
621
+ }
622
+ if (css.size) {
623
+ css.forEach((style, file) => {
624
+ if (isInclude(file)) {
625
+ const newCss = cssHandler(style.source().toString(), {
626
+ classGenerator,
627
+ runtimeSet
628
+ });
629
+ overwriteServerSideAsset(key, file, newCss);
630
+ }
631
+ });
632
+ css.clear();
633
+ }
634
+ });
502
635
  });
503
636
  });
504
637
  }
package/dist/index.mjs CHANGED
@@ -1,11 +1,14 @@
1
1
  import { createUnplugin } from 'unplugin';
2
- import { getClassCacheSet } from 'tailwindcss-patch';
2
+ import { isMatch } from 'micromatch';
3
3
  import { html, defaultTreeAdapter, parse, serialize } from 'parse5';
4
4
  import _generate from '@babel/generator';
5
5
  import { parse as parse$1 } from '@babel/parser';
6
6
  import _traverse from '@babel/traverse';
7
7
  import postcss from 'postcss';
8
8
  import parser from 'postcss-selector-parser';
9
+ import path from 'path';
10
+ import fs from 'fs';
11
+ import { getClassCacheSet } from 'tailwindcss-patch';
9
12
 
10
13
  const pluginName = 'unplugin-tailwindcss-mangle';
11
14
 
@@ -56,6 +59,18 @@ function getGroupedEntries(entries, options = {
56
59
  return 'other';
57
60
  }
58
61
  });
62
+ if (!groupedEntries.css) {
63
+ groupedEntries.css = [];
64
+ }
65
+ if (!groupedEntries.html) {
66
+ groupedEntries.html = [];
67
+ }
68
+ if (!groupedEntries.js) {
69
+ groupedEntries.js = [];
70
+ }
71
+ if (!groupedEntries.other) {
72
+ groupedEntries.other = [];
73
+ }
59
74
  return groupedEntries;
60
75
  }
61
76
  const acceptChars = 'abcdefghijklmnopqrstuvwxyz'.split('');
@@ -91,98 +106,15 @@ function escapeStringRegexp(str) {
91
106
  }
92
107
  return str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d');
93
108
  }
94
-
95
- class ClassGenerator {
96
- constructor(opts = {}) {
97
- var _a;
98
- this.newClassMap = {};
99
- this.newClassSize = 0;
100
- this.context = {};
101
- this.opts = opts;
102
- this.classPrefix = (_a = opts.classPrefix) !== null && _a !== void 0 ? _a : 'tw-';
103
- }
104
- defaultClassGenerate() {
105
- const chars = [];
106
- let rest = (this.newClassSize - (this.newClassSize % acceptChars.length)) / acceptChars.length;
107
- if (rest > 0) {
108
- while (true) {
109
- rest -= 1;
110
- const m = rest % acceptChars.length;
111
- const c = acceptChars[m];
112
- chars.push(c);
113
- rest -= m;
114
- if (rest === 0) {
115
- break;
116
- }
117
- rest /= acceptChars.length;
118
- }
119
- }
120
- const prefixIndex = this.newClassSize % acceptChars.length;
121
- const newClassName = `${this.classPrefix}${acceptChars[prefixIndex]}${chars.join('')}`;
122
- return newClassName;
123
- }
124
- ignoreClassName(className) {
125
- return regExpTest(this.opts.ignoreClass, className);
126
- }
127
- includeFilePath(filePath) {
128
- const { include } = this.opts;
129
- if (Array.isArray(include)) {
130
- return regExpTest(include, filePath);
131
- }
132
- else {
133
- return true;
134
- }
135
- }
136
- excludeFilePath(filePath) {
137
- const { exclude } = this.opts;
138
- if (Array.isArray(exclude)) {
139
- return regExpTest(exclude, filePath);
140
- }
141
- else {
142
- return false;
143
- }
144
- }
145
- isFileIncluded(filePath) {
146
- return this.includeFilePath(filePath) && !this.excludeFilePath(filePath);
147
- }
148
- transformCssClass(className) {
149
- const key = stripEscapeSequence(className);
150
- const cn = this.newClassMap[key];
151
- if (cn)
152
- return cn.name;
153
- return className;
154
- }
155
- generateClassName(original) {
156
- const opts = this.opts;
157
- original = stripEscapeSequence(original);
158
- const cn = this.newClassMap[original];
159
- if (cn)
160
- return cn;
161
- let newClassName;
162
- if (opts.customGenerate && typeof opts.customGenerate === 'function') {
163
- newClassName = opts.customGenerate(original, opts, this.context);
164
- }
165
- if (!newClassName) {
166
- newClassName = this.defaultClassGenerate();
167
- }
168
- if (opts.reserveClassName && regExpTest(opts.reserveClassName, newClassName)) {
169
- if (opts.log) {
170
- console.log(`The class name has been reserved. ${newClassName}`);
171
- }
172
- this.newClassSize++;
173
- return this.generateClassName(original);
174
- }
175
- if (opts.log) {
176
- console.log(`Minify class name from ${original} to ${newClassName}`);
177
- }
178
- const newClass = {
179
- name: newClassName,
180
- usedBy: []
109
+ function createGlobMatcher(pattern, fallbackValue = false) {
110
+ if (typeof pattern === 'undefined') {
111
+ return function (file) {
112
+ return fallbackValue;
181
113
  };
182
- this.newClassMap[original] = newClass;
183
- this.newClassSize++;
184
- return newClass;
185
114
  }
115
+ return function (file) {
116
+ return isMatch(file, pattern);
117
+ };
186
118
  }
187
119
 
188
120
  ({
@@ -311,6 +243,9 @@ function getDefaultExportFromNamespaceIfPresent(n) {
311
243
  }
312
244
  const generate = getDefaultExportFromNamespaceIfPresent(_generate);
313
245
  const traverse = getDefaultExportFromNamespaceIfPresent(_traverse);
246
+ function makeRegex(str) {
247
+ return new RegExp('(?<=^|[\\s"])' + escapeStringRegexp(str), 'g');
248
+ }
314
249
  function handleValue(str, node, options) {
315
250
  const set = options.runtimeSet;
316
251
  const clsGen = options.classGenerator;
@@ -324,7 +259,7 @@ function handleValue(str, node, options) {
324
259
  ignoreFlag = node.leadingComments.findIndex((x) => x.value.includes('tw-mangle') && x.value.includes('ignore')) > -1;
325
260
  }
326
261
  if (!ignoreFlag) {
327
- rawStr = rawStr.replace(new RegExp('(?<="|\\s)' + escapeStringRegexp(v), 'g'), clsGen.generateClassName(v).name);
262
+ rawStr = rawStr.replace(makeRegex(v), clsGen.generateClassName(v).name);
328
263
  }
329
264
  }
330
265
  }
@@ -385,7 +320,105 @@ function cssHandler(rawSource, options) {
385
320
  ]).process(rawSource).css;
386
321
  }
387
322
 
388
- const unplugin = createUnplugin((options = {}, meta) => {
323
+ class ClassGenerator {
324
+ constructor(opts = {}) {
325
+ var _a;
326
+ this.newClassMap = {};
327
+ this.newClassSize = 0;
328
+ this.context = {};
329
+ this.opts = opts;
330
+ this.classPrefix = (_a = opts.classPrefix) !== null && _a !== void 0 ? _a : 'tw-';
331
+ }
332
+ defaultClassGenerate() {
333
+ const chars = [];
334
+ let rest = (this.newClassSize - (this.newClassSize % acceptChars.length)) / acceptChars.length;
335
+ if (rest > 0) {
336
+ while (true) {
337
+ rest -= 1;
338
+ const m = rest % acceptChars.length;
339
+ const c = acceptChars[m];
340
+ chars.push(c);
341
+ rest -= m;
342
+ if (rest === 0) {
343
+ break;
344
+ }
345
+ rest /= acceptChars.length;
346
+ }
347
+ }
348
+ const prefixIndex = this.newClassSize % acceptChars.length;
349
+ const newClassName = `${this.classPrefix}${acceptChars[prefixIndex]}${chars.join('')}`;
350
+ return newClassName;
351
+ }
352
+ ignoreClassName(className) {
353
+ return regExpTest(this.opts.ignoreClass, className);
354
+ }
355
+ includeFilePath(filePath) {
356
+ const { include } = this.opts;
357
+ if (Array.isArray(include)) {
358
+ return regExpTest(include, filePath);
359
+ }
360
+ else {
361
+ return true;
362
+ }
363
+ }
364
+ excludeFilePath(filePath) {
365
+ const { exclude } = this.opts;
366
+ if (Array.isArray(exclude)) {
367
+ return regExpTest(exclude, filePath);
368
+ }
369
+ else {
370
+ return false;
371
+ }
372
+ }
373
+ isFileIncluded(filePath) {
374
+ return this.includeFilePath(filePath) && !this.excludeFilePath(filePath);
375
+ }
376
+ transformCssClass(className) {
377
+ const key = stripEscapeSequence(className);
378
+ const cn = this.newClassMap[key];
379
+ if (cn)
380
+ return cn.name;
381
+ return className;
382
+ }
383
+ generateClassName(original) {
384
+ const opts = this.opts;
385
+ original = stripEscapeSequence(original);
386
+ const cn = this.newClassMap[original];
387
+ if (cn)
388
+ return cn;
389
+ let newClassName;
390
+ if (opts.customGenerate && typeof opts.customGenerate === 'function') {
391
+ newClassName = opts.customGenerate(original, opts, this.context);
392
+ }
393
+ if (!newClassName) {
394
+ newClassName = this.defaultClassGenerate();
395
+ }
396
+ if (opts.reserveClassName && regExpTest(opts.reserveClassName, newClassName)) {
397
+ if (opts.log) {
398
+ console.log(`The class name has been reserved. ${newClassName}`);
399
+ }
400
+ this.newClassSize++;
401
+ return this.generateClassName(original);
402
+ }
403
+ if (opts.log) {
404
+ console.log(`Minify class name from ${original} to ${newClassName}`);
405
+ }
406
+ const newClass = {
407
+ name: newClassName,
408
+ usedBy: []
409
+ };
410
+ this.newClassMap[original] = newClass;
411
+ this.newClassSize++;
412
+ return newClass;
413
+ }
414
+ }
415
+
416
+ function getOptions(options = {}) {
417
+ const includeMatcher = createGlobMatcher(options.include, true);
418
+ const excludeMatcher = createGlobMatcher(options.exclude, false);
419
+ function isInclude(file) {
420
+ return includeMatcher(file) && !excludeMatcher(file);
421
+ }
389
422
  const isMangleClass = (className) => {
390
423
  return /[-:]/.test(className);
391
424
  };
@@ -401,6 +434,18 @@ const unplugin = createUnplugin((options = {}, meta) => {
401
434
  classSet = set;
402
435
  return classSet;
403
436
  }
437
+ return {
438
+ getCachedClassSet,
439
+ classGenerator,
440
+ includeMatcher,
441
+ excludeMatcher,
442
+ isInclude
443
+ };
444
+ }
445
+
446
+ const outputCachedMap = new Map();
447
+ const unplugin = createUnplugin((options = {}, meta) => {
448
+ const { classGenerator, getCachedClassSet, isInclude } = getOptions(options);
404
449
  return {
405
450
  name: pluginName,
406
451
  enforce: 'post',
@@ -414,29 +459,35 @@ const unplugin = createUnplugin((options = {}, meta) => {
414
459
  const groupedEntries = getGroupedEntries(Object.entries(bundle));
415
460
  if (Array.isArray(groupedEntries.html) && groupedEntries.html.length) {
416
461
  for (let i = 0; i < groupedEntries.html.length; i++) {
417
- const [, asset] = groupedEntries.html[i];
418
- asset.source = htmlHandler(asset.source.toString(), {
419
- classGenerator,
420
- runtimeSet
421
- });
462
+ const [file, asset] = groupedEntries.html[i];
463
+ if (isInclude(file)) {
464
+ asset.source = htmlHandler(asset.source.toString(), {
465
+ classGenerator,
466
+ runtimeSet
467
+ });
468
+ }
422
469
  }
423
470
  }
424
471
  if (Array.isArray(groupedEntries.js) && groupedEntries.js.length) {
425
472
  for (let i = 0; i < groupedEntries.js.length; i++) {
426
- const [, chunk] = groupedEntries.js[i];
427
- chunk.code = jsHandler(chunk.code, {
428
- runtimeSet,
429
- classGenerator
430
- }).code;
473
+ const [file, chunk] = groupedEntries.js[i];
474
+ if (isInclude(file)) {
475
+ chunk.code = jsHandler(chunk.code, {
476
+ runtimeSet,
477
+ classGenerator
478
+ }).code;
479
+ }
431
480
  }
432
481
  }
433
482
  if (Array.isArray(groupedEntries.css) && groupedEntries.css.length) {
434
483
  for (let i = 0; i < groupedEntries.css.length; i++) {
435
- const [, css] = groupedEntries.css[i];
436
- css.source = cssHandler(css.source.toString(), {
437
- classGenerator,
438
- runtimeSet
439
- });
484
+ const [file, css] = groupedEntries.css[i];
485
+ if (isInclude(file)) {
486
+ css.source = cssHandler(css.source.toString(), {
487
+ classGenerator,
488
+ runtimeSet
489
+ });
490
+ }
440
491
  }
441
492
  }
442
493
  }
@@ -445,49 +496,129 @@ const unplugin = createUnplugin((options = {}, meta) => {
445
496
  webpack(compiler) {
446
497
  const Compilation = compiler.webpack.Compilation;
447
498
  const { ConcatSource } = compiler.webpack.sources;
499
+ function getAssetPath(outputPath, file, abs = true) {
500
+ const fn = abs ? path.resolve : path.relative;
501
+ return fn(compiler.context, path.resolve(outputPath, file));
502
+ }
503
+ function overwriteServerSideAsset(outputPath, file, data) {
504
+ const abs = getAssetPath(outputPath, file);
505
+ const rel = getAssetPath(outputPath, file, false);
506
+ try {
507
+ fs.writeFileSync(abs, data, 'utf-8');
508
+ console.log('[tailwindcss-mangle]: ' + rel + ' overwrited successfully');
509
+ }
510
+ catch (error) {
511
+ console.log('[tailwindcss-mangle]: ' + rel + ' overwrited fail!');
512
+ console.log(error);
513
+ }
514
+ }
448
515
  compiler.hooks.compilation.tap(pluginName, (compilation) => {
449
516
  compilation.hooks.processAssets.tap({
450
517
  name: pluginName,
451
518
  stage: Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE
452
519
  }, (assets) => {
453
520
  const runtimeSet = getCachedClassSet();
521
+ const groupedEntries = getGroupedEntries(Object.entries(assets));
454
522
  if (!runtimeSet.size) {
523
+ const css = new Map();
524
+ const html = new Map();
525
+ const js = new Map();
526
+ groupedEntries.css.forEach(([file, source]) => {
527
+ css.set(file, source);
528
+ });
529
+ groupedEntries.html.forEach(([file, source]) => {
530
+ html.set(file, source);
531
+ });
532
+ groupedEntries.js.forEach(([file, source]) => {
533
+ js.set(file, source);
534
+ });
535
+ if (js.size || css.size || html.size) {
536
+ outputCachedMap.set(compiler.outputPath, {
537
+ css,
538
+ html,
539
+ js
540
+ });
541
+ }
455
542
  return;
456
543
  }
457
- const groupedEntries = getGroupedEntries(Object.entries(assets));
458
- if (Array.isArray(groupedEntries.html) && groupedEntries.html.length) {
544
+ if (groupedEntries.html.length) {
459
545
  for (let i = 0; i < groupedEntries.html.length; i++) {
460
546
  const [file, asset] = groupedEntries.html[i];
461
- const html = htmlHandler(asset.source().toString(), {
462
- classGenerator,
463
- runtimeSet
464
- });
465
- const source = new ConcatSource(html);
466
- compilation.updateAsset(file, source);
547
+ if (isInclude(file)) {
548
+ const html = htmlHandler(asset.source().toString(), {
549
+ classGenerator,
550
+ runtimeSet
551
+ });
552
+ const source = new ConcatSource(html);
553
+ compilation.updateAsset(file, source);
554
+ }
467
555
  }
468
556
  }
469
- if (Array.isArray(groupedEntries.js) && groupedEntries.js.length) {
557
+ if (groupedEntries.js.length) {
470
558
  for (let i = 0; i < groupedEntries.js.length; i++) {
471
559
  const [file, chunk] = groupedEntries.js[i];
472
- const code = jsHandler(chunk.source().toString(), {
473
- runtimeSet,
474
- classGenerator
475
- }).code;
476
- const source = new ConcatSource(code);
477
- compilation.updateAsset(file, source);
560
+ if (isInclude(file)) {
561
+ const code = jsHandler(chunk.source().toString(), {
562
+ runtimeSet,
563
+ classGenerator
564
+ }).code;
565
+ const source = new ConcatSource(code);
566
+ compilation.updateAsset(file, source);
567
+ }
478
568
  }
479
569
  }
480
- if (Array.isArray(groupedEntries.css) && groupedEntries.css.length) {
570
+ if (groupedEntries.css.length) {
481
571
  for (let i = 0; i < groupedEntries.css.length; i++) {
482
572
  const [file, css] = groupedEntries.css[i];
483
- const newCss = cssHandler(css.source().toString(), {
484
- classGenerator,
485
- runtimeSet
486
- });
487
- const source = new ConcatSource(newCss);
488
- compilation.updateAsset(file, source);
573
+ if (isInclude(file)) {
574
+ const newCss = cssHandler(css.source().toString(), {
575
+ classGenerator,
576
+ runtimeSet
577
+ });
578
+ const source = new ConcatSource(newCss);
579
+ compilation.updateAsset(file, source);
580
+ }
489
581
  }
490
582
  }
583
+ outputCachedMap.forEach(({ js, html, css }, key) => {
584
+ if (html.size) {
585
+ html.forEach((asset, file) => {
586
+ if (isInclude(file)) {
587
+ const html = htmlHandler(asset.source().toString(), {
588
+ classGenerator,
589
+ runtimeSet
590
+ });
591
+ overwriteServerSideAsset(key, file, html);
592
+ }
593
+ });
594
+ html.clear();
595
+ }
596
+ if (js.size) {
597
+ js.forEach((chunk, file) => {
598
+ if (isInclude(file)) {
599
+ const rawCode = chunk.source().toString();
600
+ const code = jsHandler(rawCode, {
601
+ runtimeSet,
602
+ classGenerator
603
+ }).code;
604
+ overwriteServerSideAsset(key, file, code);
605
+ }
606
+ });
607
+ js.clear();
608
+ }
609
+ if (css.size) {
610
+ css.forEach((style, file) => {
611
+ if (isInclude(file)) {
612
+ const newCss = cssHandler(style.source().toString(), {
613
+ classGenerator,
614
+ runtimeSet
615
+ });
616
+ overwriteServerSideAsset(key, file, newCss);
617
+ }
618
+ });
619
+ css.clear();
620
+ }
621
+ });
491
622
  });
492
623
  });
493
624
  }
@@ -1,4 +1,5 @@
1
1
  import type { StringLiteral, TemplateElement } from '@babel/types';
2
2
  import type { IHandlerOptions } from '../types';
3
+ export declare function makeRegex(str: string): RegExp;
3
4
  export declare function handleValue(str: string, node: StringLiteral | TemplateElement, options: IHandlerOptions): string;
4
5
  export declare function jsHandler(rawSource: string, options: IHandlerOptions): import("@babel/generator").GeneratorResult;
package/dist/nuxt.js CHANGED
@@ -2,13 +2,16 @@
2
2
 
3
3
  var index = require('./index.js');
4
4
  require('unplugin');
5
- require('tailwindcss-patch');
5
+ require('micromatch');
6
6
  require('parse5');
7
7
  require('@babel/generator');
8
8
  require('@babel/parser');
9
9
  require('@babel/traverse');
10
10
  require('postcss');
11
11
  require('postcss-selector-parser');
12
+ require('path');
13
+ require('fs');
14
+ require('tailwindcss-patch');
12
15
 
13
16
  /******************************************************************************
14
17
  Copyright (c) Microsoft Corporation.
package/dist/nuxt.mjs CHANGED
@@ -1,12 +1,15 @@
1
1
  import { unplugin } from './index.mjs';
2
2
  import 'unplugin';
3
- import 'tailwindcss-patch';
3
+ import 'micromatch';
4
4
  import 'parse5';
5
5
  import '@babel/generator';
6
6
  import '@babel/parser';
7
7
  import '@babel/traverse';
8
8
  import 'postcss';
9
9
  import 'postcss-selector-parser';
10
+ import 'path';
11
+ import 'fs';
12
+ import 'tailwindcss-patch';
10
13
 
11
14
  /******************************************************************************
12
15
  Copyright (c) Microsoft Corporation.
@@ -0,0 +1,9 @@
1
+ import type { Options } from './types';
2
+ import ClassGenerator from './classGenerator';
3
+ export declare function getOptions(options?: Options | undefined): {
4
+ getCachedClassSet: () => Set<string>;
5
+ classGenerator: ClassGenerator;
6
+ includeMatcher: (file: string) => boolean;
7
+ excludeMatcher: (file: string) => boolean;
8
+ isInclude: (file: string) => boolean;
9
+ };
package/dist/rollup.js CHANGED
@@ -2,13 +2,16 @@
2
2
 
3
3
  var index = require('./index.js');
4
4
  require('unplugin');
5
- require('tailwindcss-patch');
5
+ require('micromatch');
6
6
  require('parse5');
7
7
  require('@babel/generator');
8
8
  require('@babel/parser');
9
9
  require('@babel/traverse');
10
10
  require('postcss');
11
11
  require('postcss-selector-parser');
12
+ require('path');
13
+ require('fs');
14
+ require('tailwindcss-patch');
12
15
 
13
16
  var rollup = index.unplugin.rollup;
14
17
 
package/dist/rollup.mjs CHANGED
@@ -1,12 +1,15 @@
1
1
  import { unplugin } from './index.mjs';
2
2
  import 'unplugin';
3
- import 'tailwindcss-patch';
3
+ import 'micromatch';
4
4
  import 'parse5';
5
5
  import '@babel/generator';
6
6
  import '@babel/parser';
7
7
  import '@babel/traverse';
8
8
  import 'postcss';
9
9
  import 'postcss-selector-parser';
10
+ import 'path';
11
+ import 'fs';
12
+ import 'tailwindcss-patch';
10
13
 
11
14
  var rollup = unplugin.rollup;
12
15
 
package/dist/types.d.ts CHANGED
@@ -24,4 +24,6 @@ export interface IHandlerOptions {
24
24
  }
25
25
  export interface Options {
26
26
  classGenerator?: IClassGeneratorOptions;
27
+ exclude?: string[];
28
+ include?: string[];
27
29
  }
package/dist/utils.d.ts CHANGED
@@ -12,3 +12,4 @@ export declare function isRegexp(value: unknown): boolean;
12
12
  export declare function isMap(value: unknown): boolean;
13
13
  export declare function regExpTest(arr: (string | RegExp)[] | undefined, str: string): boolean;
14
14
  export declare function escapeStringRegexp(str: string): string;
15
+ export declare function createGlobMatcher(pattern: string | string[] | undefined, fallbackValue?: boolean): (file: string) => boolean;
package/dist/vite.js CHANGED
@@ -2,13 +2,16 @@
2
2
 
3
3
  var index = require('./index.js');
4
4
  require('unplugin');
5
- require('tailwindcss-patch');
5
+ require('micromatch');
6
6
  require('parse5');
7
7
  require('@babel/generator');
8
8
  require('@babel/parser');
9
9
  require('@babel/traverse');
10
10
  require('postcss');
11
11
  require('postcss-selector-parser');
12
+ require('path');
13
+ require('fs');
14
+ require('tailwindcss-patch');
12
15
 
13
16
  var vite = index.unplugin.vite;
14
17
 
package/dist/vite.mjs CHANGED
@@ -1,12 +1,15 @@
1
1
  import { unplugin } from './index.mjs';
2
2
  import 'unplugin';
3
- import 'tailwindcss-patch';
3
+ import 'micromatch';
4
4
  import 'parse5';
5
5
  import '@babel/generator';
6
6
  import '@babel/parser';
7
7
  import '@babel/traverse';
8
8
  import 'postcss';
9
9
  import 'postcss-selector-parser';
10
+ import 'path';
11
+ import 'fs';
12
+ import 'tailwindcss-patch';
10
13
 
11
14
  var vite = unplugin.vite;
12
15
 
package/dist/webpack.js CHANGED
@@ -2,13 +2,16 @@
2
2
 
3
3
  var index = require('./index.js');
4
4
  require('unplugin');
5
- require('tailwindcss-patch');
5
+ require('micromatch');
6
6
  require('parse5');
7
7
  require('@babel/generator');
8
8
  require('@babel/parser');
9
9
  require('@babel/traverse');
10
10
  require('postcss');
11
11
  require('postcss-selector-parser');
12
+ require('path');
13
+ require('fs');
14
+ require('tailwindcss-patch');
12
15
 
13
16
  var webpack = index.unplugin.webpack;
14
17
 
package/dist/webpack.mjs CHANGED
@@ -1,12 +1,15 @@
1
1
  import { unplugin } from './index.mjs';
2
2
  import 'unplugin';
3
- import 'tailwindcss-patch';
3
+ import 'micromatch';
4
4
  import 'parse5';
5
5
  import '@babel/generator';
6
6
  import '@babel/parser';
7
7
  import '@babel/traverse';
8
8
  import 'postcss';
9
9
  import 'postcss-selector-parser';
10
+ import 'path';
11
+ import 'fs';
12
+ import 'tailwindcss-patch';
10
13
 
11
14
  var webpack = unplugin.webpack;
12
15
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "unplugin-tailwindcss-mangle",
3
- "version": "0.0.4",
4
- "description": "mangle tailwindcss utilities class",
3
+ "version": "0.1.0",
4
+ "description": "mangle tailwindcss utilities class plugin. support vite and webpack!",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
@@ -31,6 +31,11 @@
31
31
  "require": "./dist/esbuild.js",
32
32
  "import": "./dist/esbuild.mjs"
33
33
  },
34
+ "./nuxt": {
35
+ "types": "./dist/nuxt.d.ts",
36
+ "require": "./dist/nuxt.js",
37
+ "import": "./dist/nuxt.mjs"
38
+ },
34
39
  "./*": "./*"
35
40
  },
36
41
  "typesVersions": {
@@ -48,7 +53,9 @@
48
53
  "tailwindcss",
49
54
  "utilities",
50
55
  "mangle",
51
- "class"
56
+ "class",
57
+ "obfuscator",
58
+ "obfuscation"
52
59
  ],
53
60
  "author": "SonOfMagic <qq1324318532@gmail.com>",
54
61
  "license": "MIT",
@@ -57,14 +64,13 @@
57
64
  "@babel/parser": "^7.21.4",
58
65
  "@babel/traverse": "^7.21.4",
59
66
  "@babel/types": "^7.21.4",
60
- "acorn-walk": "^8.2.0",
61
- "escodegen": "^2.0.0",
67
+ "micromatch": "^4.0.5",
62
68
  "parse5": "^7.1.2",
63
- "postcss": "^8.4.22",
69
+ "postcss": "^8.4.23",
64
70
  "postcss-selector-parser": "^6.0.11",
65
71
  "semver": "^7.5.0",
66
72
  "unplugin": "^1.3.1",
67
- "tailwindcss-patch": "1.0.2"
73
+ "tailwindcss-patch": "1.0.3"
68
74
  },
69
75
  "publishConfig": {
70
76
  "access": "public",
@@ -73,14 +79,15 @@
73
79
  "devDependencies": {
74
80
  "@parse5/tools": "^0.1.0",
75
81
  "@types/babel__generator": "^7.6.4",
76
- "@types/babel__traverse": "^7.18.3",
82
+ "@types/babel__traverse": "^7.18.4",
77
83
  "@types/escodegen": "^0.0.7",
84
+ "@types/micromatch": "^4.0.2",
78
85
  "@types/semver": "^7.3.13",
79
86
  "pkg-types": "^1.0.2",
80
- "tailwindcss": "^3.3.1",
87
+ "tailwindcss": "^3.3.2",
81
88
  "tslib": "^2.5.0",
82
- "vite": "^4.2.2",
83
- "webpack": "^5.79.0"
89
+ "vite": "^4.3.2",
90
+ "webpack": "^5.80.0"
84
91
  },
85
92
  "homepage": "https://github.com/sonofmagic/tailwindcss-mangle",
86
93
  "repository": {