@unocss/webpack 0.47.6 → 0.48.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/dist/index.cjs CHANGED
@@ -7,13 +7,18 @@ const WebpackSources = require('webpack-sources');
7
7
  const pluginutils = require('@rollup/pluginutils');
8
8
  const config = require('@unocss/config');
9
9
  const core = require('@unocss/core');
10
- const crypto = require('crypto');
10
+ const fs = require('fs/promises');
11
+ const path = require('path');
12
+ const fg = require('fast-glob');
11
13
  const MagicString = require('magic-string');
12
14
  const remapping = require('@ampproject/remapping');
15
+ const crypto = require('crypto');
13
16
 
14
17
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e["default"] : e; }
15
18
 
16
19
  const WebpackSources__default = /*#__PURE__*/_interopDefaultLegacy(WebpackSources);
20
+ const fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
21
+ const fg__default = /*#__PURE__*/_interopDefaultLegacy(fg);
17
22
  const MagicString__default = /*#__PURE__*/_interopDefaultLegacy(MagicString);
18
23
  const remapping__default = /*#__PURE__*/_interopDefaultLegacy(remapping);
19
24
 
@@ -35,6 +40,7 @@ function createContext(configOrPath, defaults = {}, extraConfigSources = [], res
35
40
  const reloadListeners = [];
36
41
  const modules = new core.BetterMap();
37
42
  const tokens = /* @__PURE__ */ new Set();
43
+ const tasks = [];
38
44
  const affectedModules = /* @__PURE__ */ new Set();
39
45
  let ready = reloadConfig();
40
46
  async function reloadConfig() {
@@ -84,15 +90,20 @@ function createContext(configOrPath, defaults = {}, extraConfigSources = [], res
84
90
  if (tokens.size > len)
85
91
  invalidate();
86
92
  }
87
- const filter = (code, id) => {
93
+ function filter(code, id) {
88
94
  if (code.includes(IGNORE_COMMENT))
89
95
  return false;
90
96
  return code.includes(INCLUDE_COMMENT) || code.includes(CSS_PLACEHOLDER) || rollupFilter(id.replace(/\?v=\w+$/, ""));
91
- };
97
+ }
92
98
  async function getConfig() {
93
99
  await ready;
94
100
  return rawConfig;
95
101
  }
102
+ async function flushTasks() {
103
+ const _tasks = [...tasks];
104
+ await Promise.all(_tasks);
105
+ tasks.splice(0, _tasks.length);
106
+ }
96
107
  return {
97
108
  get ready() {
98
109
  return ready;
@@ -100,6 +111,8 @@ function createContext(configOrPath, defaults = {}, extraConfigSources = [], res
100
111
  tokens,
101
112
  modules,
102
113
  affectedModules,
114
+ tasks,
115
+ flushTasks,
103
116
  invalidate,
104
117
  onInvalidate(fn) {
105
118
  invalidations.push(fn);
@@ -118,6 +131,79 @@ function createContext(configOrPath, defaults = {}, extraConfigSources = [], res
118
131
  };
119
132
  }
120
133
 
134
+ async function applyTransformers(ctx, original, id, enforce = "default") {
135
+ if (original.includes(IGNORE_COMMENT))
136
+ return;
137
+ const transformers = (ctx.uno.config.transformers || []).filter((i) => (i.enforce || "default") === enforce);
138
+ if (!transformers.length)
139
+ return;
140
+ let code = original;
141
+ let s = new MagicString__default(code);
142
+ const maps = [];
143
+ for (const t of transformers) {
144
+ if (t.idFilter) {
145
+ if (!t.idFilter(id))
146
+ continue;
147
+ } else if (!ctx.filter(code, id)) {
148
+ continue;
149
+ }
150
+ await t.transform(s, id, ctx);
151
+ if (s.hasChanged()) {
152
+ code = s.toString();
153
+ maps.push(s.generateMap({ hires: true, source: id }));
154
+ s = new MagicString__default(code);
155
+ }
156
+ }
157
+ if (code !== original) {
158
+ ctx.affectedModules.add(id);
159
+ return {
160
+ code,
161
+ map: remapping__default(maps, () => null)
162
+ };
163
+ }
164
+ }
165
+
166
+ async function setupExtraContent(ctx, shouldWatch = false) {
167
+ const { extraContent } = await ctx.getConfig();
168
+ const { extract, tasks, root, filter } = ctx;
169
+ if (extraContent?.plain) {
170
+ await Promise.all(
171
+ extraContent.plain.map((code, idx) => {
172
+ return extract(code, `__extra_content_${idx}__`);
173
+ })
174
+ );
175
+ }
176
+ if (extraContent?.filesystem) {
177
+ const files = await fg__default(extraContent.filesystem, { cwd: root });
178
+ async function extractFile(file) {
179
+ const code = await fs__default.readFile(file, "utf-8");
180
+ if (!filter(code, file))
181
+ return;
182
+ const preTransform = await applyTransformers(ctx, code, file, "pre");
183
+ const defaultTransform = await applyTransformers(ctx, preTransform?.code || code, file);
184
+ await applyTransformers(ctx, defaultTransform?.code || preTransform?.code || code, file, "post");
185
+ return await extract(preTransform?.code || code, file);
186
+ }
187
+ if (shouldWatch) {
188
+ const { watch } = await import('chokidar');
189
+ const ignored = ["**/{.git,node_modules}/**"];
190
+ const watcher = watch(files, {
191
+ ignorePermissionErrors: true,
192
+ ignored,
193
+ cwd: root,
194
+ ignoreInitial: true
195
+ });
196
+ watcher.on("all", (type, file) => {
197
+ if (type === "add" || type === "change") {
198
+ const absolutePath = path.resolve(root, file);
199
+ tasks.push(extractFile(absolutePath));
200
+ }
201
+ });
202
+ }
203
+ await Promise.all(files.map(extractFile));
204
+ }
205
+ }
206
+
121
207
  function getHash(input, length = 8) {
122
208
  return crypto.createHash("sha256").update(input).digest("hex").slice(0, length);
123
209
  }
@@ -152,38 +238,6 @@ function getHashPlaceholder(hash) {
152
238
  return `#--unocss-hash--{content:"${hash}"}`;
153
239
  }
154
240
 
155
- async function applyTransformers(ctx, original, id, enforce = "default") {
156
- if (original.includes(IGNORE_COMMENT))
157
- return;
158
- const transformers = (ctx.uno.config.transformers || []).filter((i) => (i.enforce || "default") === enforce);
159
- if (!transformers.length)
160
- return;
161
- let code = original;
162
- let s = new MagicString__default(code);
163
- const maps = [];
164
- for (const t of transformers) {
165
- if (t.idFilter) {
166
- if (!t.idFilter(id))
167
- continue;
168
- } else if (!ctx.filter(code, id)) {
169
- continue;
170
- }
171
- await t.transform(s, id, ctx);
172
- if (s.hasChanged()) {
173
- code = s.toString();
174
- maps.push(s.generateMap({ hires: true, source: id }));
175
- s = new MagicString__default(code);
176
- }
177
- }
178
- if (code !== original) {
179
- ctx.affectedModules.add(id);
180
- return {
181
- code,
182
- map: remapping__default(maps, () => null)
183
- };
184
- }
185
- }
186
-
187
241
  function getPath(id) {
188
242
  return id.replace(/\?.*$/, "");
189
243
  }
@@ -199,7 +253,7 @@ function defineConfig(config) {
199
253
  function WebpackPlugin(configOrPath, defaults) {
200
254
  return unplugin.createUnplugin(() => {
201
255
  const ctx = createContext(configOrPath, defaults);
202
- const { uno, tokens, filter, extract, onInvalidate } = ctx;
256
+ const { uno, tokens, filter, extract, onInvalidate, tasks, flushTasks } = ctx;
203
257
  let timer;
204
258
  onInvalidate(() => {
205
259
  clearTimeout(timer);
@@ -211,7 +265,7 @@ function WebpackPlugin(configOrPath, defaults) {
211
265
  '[unocss] webpack integration only supports "pre" enforce transformers currently.the following transformers will be ignored\n' + nonPreTransformers.map((i) => ` - ${i.name}`).join("\n")
212
266
  );
213
267
  }
214
- const tasks = [];
268
+ tasks.push(setupExtraContent(ctx));
215
269
  const entries = /* @__PURE__ */ new Set();
216
270
  const hashes = /* @__PURE__ */ new Map();
217
271
  const plugin = {
@@ -257,7 +311,7 @@ function WebpackPlugin(configOrPath, defaults) {
257
311
  compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
258
312
  compilation.hooks.optimizeAssets.tapPromise(PLUGIN_NAME, async () => {
259
313
  const files = Object.keys(compilation.assets);
260
- await Promise.all(tasks);
314
+ await flushTasks();
261
315
  const result = await uno.generate(tokens, { minify: true });
262
316
  for (const file of files) {
263
317
  if (file === "*")
@@ -286,7 +340,7 @@ function WebpackPlugin(configOrPath, defaults) {
286
340
  async function updateModules() {
287
341
  if (!plugin.__vfsModules)
288
342
  return;
289
- await Promise.all(tasks);
343
+ await flushTasks();
290
344
  const result = await uno.generate(tokens);
291
345
  if (lastTokenSize === tokens.size)
292
346
  return;
package/dist/index.mjs CHANGED
@@ -3,9 +3,12 @@ import WebpackSources from 'webpack-sources';
3
3
  import { createFilter } from '@rollup/pluginutils';
4
4
  import { loadConfig } from '@unocss/config';
5
5
  import { cssIdRE, createGenerator, BetterMap } from '@unocss/core';
6
- import { createHash } from 'crypto';
6
+ import fs from 'fs/promises';
7
+ import { resolve } from 'path';
8
+ import fg from 'fast-glob';
7
9
  import MagicString from 'magic-string';
8
10
  import remapping from '@ampproject/remapping';
11
+ import { createHash } from 'crypto';
9
12
 
10
13
  const INCLUDE_COMMENT = "@unocss-include";
11
14
  const IGNORE_COMMENT = "@unocss-ignore";
@@ -25,6 +28,7 @@ function createContext(configOrPath, defaults = {}, extraConfigSources = [], res
25
28
  const reloadListeners = [];
26
29
  const modules = new BetterMap();
27
30
  const tokens = /* @__PURE__ */ new Set();
31
+ const tasks = [];
28
32
  const affectedModules = /* @__PURE__ */ new Set();
29
33
  let ready = reloadConfig();
30
34
  async function reloadConfig() {
@@ -74,15 +78,20 @@ function createContext(configOrPath, defaults = {}, extraConfigSources = [], res
74
78
  if (tokens.size > len)
75
79
  invalidate();
76
80
  }
77
- const filter = (code, id) => {
81
+ function filter(code, id) {
78
82
  if (code.includes(IGNORE_COMMENT))
79
83
  return false;
80
84
  return code.includes(INCLUDE_COMMENT) || code.includes(CSS_PLACEHOLDER) || rollupFilter(id.replace(/\?v=\w+$/, ""));
81
- };
85
+ }
82
86
  async function getConfig() {
83
87
  await ready;
84
88
  return rawConfig;
85
89
  }
90
+ async function flushTasks() {
91
+ const _tasks = [...tasks];
92
+ await Promise.all(_tasks);
93
+ tasks.splice(0, _tasks.length);
94
+ }
86
95
  return {
87
96
  get ready() {
88
97
  return ready;
@@ -90,6 +99,8 @@ function createContext(configOrPath, defaults = {}, extraConfigSources = [], res
90
99
  tokens,
91
100
  modules,
92
101
  affectedModules,
102
+ tasks,
103
+ flushTasks,
93
104
  invalidate,
94
105
  onInvalidate(fn) {
95
106
  invalidations.push(fn);
@@ -108,6 +119,79 @@ function createContext(configOrPath, defaults = {}, extraConfigSources = [], res
108
119
  };
109
120
  }
110
121
 
122
+ async function applyTransformers(ctx, original, id, enforce = "default") {
123
+ if (original.includes(IGNORE_COMMENT))
124
+ return;
125
+ const transformers = (ctx.uno.config.transformers || []).filter((i) => (i.enforce || "default") === enforce);
126
+ if (!transformers.length)
127
+ return;
128
+ let code = original;
129
+ let s = new MagicString(code);
130
+ const maps = [];
131
+ for (const t of transformers) {
132
+ if (t.idFilter) {
133
+ if (!t.idFilter(id))
134
+ continue;
135
+ } else if (!ctx.filter(code, id)) {
136
+ continue;
137
+ }
138
+ await t.transform(s, id, ctx);
139
+ if (s.hasChanged()) {
140
+ code = s.toString();
141
+ maps.push(s.generateMap({ hires: true, source: id }));
142
+ s = new MagicString(code);
143
+ }
144
+ }
145
+ if (code !== original) {
146
+ ctx.affectedModules.add(id);
147
+ return {
148
+ code,
149
+ map: remapping(maps, () => null)
150
+ };
151
+ }
152
+ }
153
+
154
+ async function setupExtraContent(ctx, shouldWatch = false) {
155
+ const { extraContent } = await ctx.getConfig();
156
+ const { extract, tasks, root, filter } = ctx;
157
+ if (extraContent?.plain) {
158
+ await Promise.all(
159
+ extraContent.plain.map((code, idx) => {
160
+ return extract(code, `__extra_content_${idx}__`);
161
+ })
162
+ );
163
+ }
164
+ if (extraContent?.filesystem) {
165
+ const files = await fg(extraContent.filesystem, { cwd: root });
166
+ async function extractFile(file) {
167
+ const code = await fs.readFile(file, "utf-8");
168
+ if (!filter(code, file))
169
+ return;
170
+ const preTransform = await applyTransformers(ctx, code, file, "pre");
171
+ const defaultTransform = await applyTransformers(ctx, preTransform?.code || code, file);
172
+ await applyTransformers(ctx, defaultTransform?.code || preTransform?.code || code, file, "post");
173
+ return await extract(preTransform?.code || code, file);
174
+ }
175
+ if (shouldWatch) {
176
+ const { watch } = await import('chokidar');
177
+ const ignored = ["**/{.git,node_modules}/**"];
178
+ const watcher = watch(files, {
179
+ ignorePermissionErrors: true,
180
+ ignored,
181
+ cwd: root,
182
+ ignoreInitial: true
183
+ });
184
+ watcher.on("all", (type, file) => {
185
+ if (type === "add" || type === "change") {
186
+ const absolutePath = resolve(root, file);
187
+ tasks.push(extractFile(absolutePath));
188
+ }
189
+ });
190
+ }
191
+ await Promise.all(files.map(extractFile));
192
+ }
193
+ }
194
+
111
195
  function getHash(input, length = 8) {
112
196
  return createHash("sha256").update(input).digest("hex").slice(0, length);
113
197
  }
@@ -142,38 +226,6 @@ function getHashPlaceholder(hash) {
142
226
  return `#--unocss-hash--{content:"${hash}"}`;
143
227
  }
144
228
 
145
- async function applyTransformers(ctx, original, id, enforce = "default") {
146
- if (original.includes(IGNORE_COMMENT))
147
- return;
148
- const transformers = (ctx.uno.config.transformers || []).filter((i) => (i.enforce || "default") === enforce);
149
- if (!transformers.length)
150
- return;
151
- let code = original;
152
- let s = new MagicString(code);
153
- const maps = [];
154
- for (const t of transformers) {
155
- if (t.idFilter) {
156
- if (!t.idFilter(id))
157
- continue;
158
- } else if (!ctx.filter(code, id)) {
159
- continue;
160
- }
161
- await t.transform(s, id, ctx);
162
- if (s.hasChanged()) {
163
- code = s.toString();
164
- maps.push(s.generateMap({ hires: true, source: id }));
165
- s = new MagicString(code);
166
- }
167
- }
168
- if (code !== original) {
169
- ctx.affectedModules.add(id);
170
- return {
171
- code,
172
- map: remapping(maps, () => null)
173
- };
174
- }
175
- }
176
-
177
229
  function getPath(id) {
178
230
  return id.replace(/\?.*$/, "");
179
231
  }
@@ -189,7 +241,7 @@ function defineConfig(config) {
189
241
  function WebpackPlugin(configOrPath, defaults) {
190
242
  return createUnplugin(() => {
191
243
  const ctx = createContext(configOrPath, defaults);
192
- const { uno, tokens, filter, extract, onInvalidate } = ctx;
244
+ const { uno, tokens, filter, extract, onInvalidate, tasks, flushTasks } = ctx;
193
245
  let timer;
194
246
  onInvalidate(() => {
195
247
  clearTimeout(timer);
@@ -201,7 +253,7 @@ function WebpackPlugin(configOrPath, defaults) {
201
253
  '[unocss] webpack integration only supports "pre" enforce transformers currently.the following transformers will be ignored\n' + nonPreTransformers.map((i) => ` - ${i.name}`).join("\n")
202
254
  );
203
255
  }
204
- const tasks = [];
256
+ tasks.push(setupExtraContent(ctx));
205
257
  const entries = /* @__PURE__ */ new Set();
206
258
  const hashes = /* @__PURE__ */ new Map();
207
259
  const plugin = {
@@ -247,7 +299,7 @@ function WebpackPlugin(configOrPath, defaults) {
247
299
  compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
248
300
  compilation.hooks.optimizeAssets.tapPromise(PLUGIN_NAME, async () => {
249
301
  const files = Object.keys(compilation.assets);
250
- await Promise.all(tasks);
302
+ await flushTasks();
251
303
  const result = await uno.generate(tokens, { minify: true });
252
304
  for (const file of files) {
253
305
  if (file === "*")
@@ -276,7 +328,7 @@ function WebpackPlugin(configOrPath, defaults) {
276
328
  async function updateModules() {
277
329
  if (!plugin.__vfsModules)
278
330
  return;
279
- await Promise.all(tasks);
331
+ await flushTasks();
280
332
  const result = await uno.generate(tokens);
281
333
  if (lastTokenSize === tokens.size)
282
334
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unocss/webpack",
3
- "version": "0.47.6",
3
+ "version": "0.48.0",
4
4
  "description": "The Webpack plugin for UnoCSS",
5
5
  "author": "Anthony Fu <anthonyfu117@hotmail.com>",
6
6
  "license": "MIT",
@@ -38,10 +38,12 @@
38
38
  "dependencies": {
39
39
  "@ampproject/remapping": "^2.2.0",
40
40
  "@rollup/pluginutils": "^5.0.2",
41
- "@unocss/config": "0.47.6",
42
- "@unocss/core": "0.47.6",
43
- "magic-string": "^0.26.7",
44
- "unplugin": "^1.0.0",
41
+ "@unocss/config": "0.48.0",
42
+ "@unocss/core": "0.48.0",
43
+ "chokidar": "^3.5.3",
44
+ "fast-glob": "^3.2.12",
45
+ "magic-string": "^0.27.0",
46
+ "unplugin": "^1.0.1",
45
47
  "webpack-sources": "^3.2.3"
46
48
  },
47
49
  "devDependencies": {