weboptimizer 3.0.28 → 4.0.1
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/browser.js +93 -205
- package/configurator.js +222 -335
- package/ejsLoader.js +212 -170
- package/eslint.config.mjs +4 -0
- package/helper.js +230 -540
- package/index.js +245 -574
- package/jestSetup.js +7 -5
- package/package.json +31 -35
- package/plugins/HTMLTransformation.js +68 -109
- package/plugins/InPlaceAssetsIntoHTML.js +66 -69
- package/stylelintConfigurator.js +4 -8
- package/type.js +15 -6
- package/webpackConfigurator.js +389 -600
package/browser.js
CHANGED
|
@@ -16,27 +16,19 @@
|
|
|
16
16
|
endregion
|
|
17
17
|
*/
|
|
18
18
|
// region imports
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
26
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
27
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
28
|
-
var _clientnode = require("clientnode");
|
|
29
|
-
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
30
|
-
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
31
|
-
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
32
|
-
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t2 in e) "default" !== _t2 && {}.hasOwnProperty.call(e, _t2) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t2)) && (i.get || i.set) ? o(f, _t2, i) : f[_t2] = e[_t2]); return f; })(e, t); }
|
|
19
|
+
import "core-js/modules/es.array.push.js";
|
|
20
|
+
import { CONSOLE_METHODS, Logger, ProcedureFunction, timeout } from 'clientnode';
|
|
21
|
+
import { DOMWindow, VirtualConsole } from 'jsdom';
|
|
22
|
+
import { LoaderContext } from 'webpack';
|
|
23
|
+
import { LoaderConfiguration } from './ejsLoader';
|
|
24
|
+
import { Browser, InitializedBrowser } from './type';
|
|
33
25
|
// endregion
|
|
34
26
|
// region declaration
|
|
35
27
|
|
|
36
28
|
// endregion
|
|
37
29
|
// region variables
|
|
38
|
-
|
|
39
|
-
|
|
30
|
+
const onCreatedListener = [];
|
|
31
|
+
export const browser = {
|
|
40
32
|
debug: false,
|
|
41
33
|
domContentLoaded: false,
|
|
42
34
|
DOM: null,
|
|
@@ -45,8 +37,8 @@ var browser = exports.browser = {
|
|
|
45
37
|
window: null,
|
|
46
38
|
windowLoaded: false
|
|
47
39
|
};
|
|
48
|
-
|
|
49
|
-
name: 'weboptimizer
|
|
40
|
+
export const log = new Logger({
|
|
41
|
+
name: 'weboptimizer.browser'
|
|
50
42
|
});
|
|
51
43
|
// endregion
|
|
52
44
|
// region ensure presence of common browser environment
|
|
@@ -55,171 +47,84 @@ if (typeof TARGET_TECHNOLOGY === 'undefined' || TARGET_TECHNOLOGY === 'node')
|
|
|
55
47
|
NOTE: We use an asynchronous wrapper method to initialize
|
|
56
48
|
"browser.initialized" at module loading time.
|
|
57
49
|
*/
|
|
58
|
-
(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
path = _yield$Promise$all2[1];
|
|
76
|
-
virtualConsole = new VirtualConsoleImplementation();
|
|
77
|
-
_iterator = _createForOfIteratorHelper(_clientnode.CONSOLE_METHODS);
|
|
78
|
-
try {
|
|
79
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
80
|
-
name = _step.value;
|
|
81
|
-
virtualConsole.on(name, console[name].bind(console));
|
|
82
|
-
}
|
|
83
|
-
} catch (err) {
|
|
84
|
-
_iterator.e(err);
|
|
85
|
-
} finally {
|
|
86
|
-
_iterator.f();
|
|
87
|
-
}
|
|
88
|
-
virtualConsole.on('error', function (error) {
|
|
89
|
-
if (!browser.debug && ['XMLHttpRequest', 'resource loading'].includes(error.type)) log.warn("Loading resource failed: ".concat(error.toString(), "."));else log.error(error.stack, error.detail);
|
|
90
|
-
});
|
|
91
|
-
render = function render(template) {
|
|
92
|
-
browser.DOM = JSDOM;
|
|
93
|
-
browser.initialized = true;
|
|
94
|
-
browser.instance = new browser.DOM(template, {
|
|
95
|
-
beforeParse: function beforeParse(window) {
|
|
96
|
-
var _ref2;
|
|
97
|
-
// We want to use it in a polymorphic way.
|
|
98
|
-
/*
|
|
99
|
-
eslint-disable
|
|
100
|
-
@typescript-eslint/no-unnecessary-type-assertion
|
|
101
|
-
*/
|
|
102
|
-
browser.window = (_ref2 = global.window) !== null && _ref2 !== void 0 ? _ref2 : window;
|
|
103
|
-
/*
|
|
104
|
-
eslint-enable
|
|
105
|
-
@typescript-eslint/no-unnecessary-type-assertion
|
|
106
|
-
*/
|
|
107
|
-
|
|
108
|
-
window.document.addEventListener('DOMContentLoaded', function () {
|
|
109
|
-
/*
|
|
110
|
-
Move template results into global
|
|
111
|
-
pre-defined dom.
|
|
112
|
-
*/
|
|
113
|
-
if (global.window) {
|
|
114
|
-
var _iterator2 = _createForOfIteratorHelper(['head', 'body']),
|
|
115
|
-
_step2;
|
|
116
|
-
try {
|
|
117
|
-
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
118
|
-
var type = _step2.value;
|
|
119
|
-
global.window.document[type].innerHTML = window.document[type].innerHTML;
|
|
120
|
-
}
|
|
121
|
-
} catch (err) {
|
|
122
|
-
_iterator2.e(err);
|
|
123
|
-
} finally {
|
|
124
|
-
_iterator2.f();
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
browser.domContentLoaded = true;
|
|
128
|
-
});
|
|
129
|
-
window.addEventListener('load', function () {
|
|
130
|
-
/*
|
|
131
|
-
NOTE: Maybe we have miss the "DOMContentLoaded"
|
|
132
|
-
event caused by a race condition.
|
|
133
|
-
*/
|
|
134
|
-
browser.domContentLoaded = browser.windowLoaded = true;
|
|
135
|
-
});
|
|
136
|
-
var _iterator3 = _createForOfIteratorHelper(onCreatedListener),
|
|
137
|
-
_step3;
|
|
138
|
-
try {
|
|
139
|
-
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
140
|
-
var callback = _step3.value;
|
|
141
|
-
void callback();
|
|
142
|
-
}
|
|
143
|
-
} catch (err) {
|
|
144
|
-
_iterator3.e(err);
|
|
145
|
-
} finally {
|
|
146
|
-
_iterator3.f();
|
|
147
|
-
}
|
|
148
|
-
},
|
|
149
|
-
resources: 'usable',
|
|
150
|
-
runScripts: 'dangerously',
|
|
151
|
-
url: 'http://localhost',
|
|
152
|
-
virtualConsole: virtualConsole
|
|
153
|
-
});
|
|
154
|
-
};
|
|
155
|
-
if (!(typeof NAME === 'undefined' || NAME === 'webOptimizer')) {
|
|
156
|
-
_context.next = 5;
|
|
157
|
-
break;
|
|
158
|
-
}
|
|
159
|
-
filePath = path.join(__dirname, 'index.html.ejs');
|
|
50
|
+
(async () => {
|
|
51
|
+
// region mock browser environment
|
|
52
|
+
const [{
|
|
53
|
+
JSDOM,
|
|
54
|
+
VirtualConsole: VirtualConsoleImplementation
|
|
55
|
+
}, path] = await Promise.all([import('jsdom'), import('path')]);
|
|
56
|
+
const virtualConsole = new VirtualConsoleImplementation();
|
|
57
|
+
for (const name of CONSOLE_METHODS) virtualConsole.on(name, console[name].bind(console));
|
|
58
|
+
virtualConsole.on('error', error => {
|
|
59
|
+
if (!browser.debug && ['XMLHttpRequest', 'resource loading'].includes(error.type)) log.warn(`Loading resource failed: ${error.toString()}.`);else log.error(error.stack, error.detail);
|
|
60
|
+
});
|
|
61
|
+
const render = template => {
|
|
62
|
+
browser.DOM = JSDOM;
|
|
63
|
+
browser.initialized = true;
|
|
64
|
+
browser.instance = new browser.DOM(template, {
|
|
65
|
+
beforeParse: window => {
|
|
66
|
+
// We want to use it in a polymorphic way.
|
|
160
67
|
/*
|
|
161
|
-
|
|
162
|
-
|
|
68
|
+
eslint-disable
|
|
69
|
+
@typescript-eslint/no-unnecessary-type-assertion
|
|
163
70
|
*/
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
encoding: 'utf-8'
|
|
71
|
+
browser.window = global.window ?? window;
|
|
72
|
+
/*
|
|
73
|
+
eslint-enable
|
|
74
|
+
@typescript-eslint/no-unnecessary-type-assertion
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
window.document.addEventListener('DOMContentLoaded', () => {
|
|
78
|
+
/*
|
|
79
|
+
Move template results into global
|
|
80
|
+
pre-defined dom.
|
|
81
|
+
*/
|
|
82
|
+
if (global.window) for (const type of ['head', 'body']) global.window.document[type].innerHTML = window.document[type].innerHTML;
|
|
83
|
+
browser.domContentLoaded = true;
|
|
178
84
|
});
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
break;
|
|
186
|
-
case 5:
|
|
187
|
-
_t = render;
|
|
188
|
-
_context.next = 6;
|
|
189
|
-
return Promise.resolve().then(function () {
|
|
190
|
-
return _interopRequireWildcard(require('webOptimizerDefaultTemplateFilePath'));
|
|
85
|
+
window.addEventListener('load', () => {
|
|
86
|
+
/*
|
|
87
|
+
NOTE: Maybe we have miss the "DOMContentLoaded"
|
|
88
|
+
event caused by a race condition.
|
|
89
|
+
*/
|
|
90
|
+
browser.domContentLoaded = browser.windowLoaded = true;
|
|
191
91
|
});
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
92
|
+
for (const callback of onCreatedListener) void callback();
|
|
93
|
+
},
|
|
94
|
+
resources: 'usable',
|
|
95
|
+
runScripts: 'dangerously',
|
|
96
|
+
url: 'http://localhost',
|
|
97
|
+
virtualConsole
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
if (typeof NAME === 'undefined' || NAME === 'webOptimizer') {
|
|
101
|
+
const filePath = path.join(__dirname, 'index.html.ejs');
|
|
102
|
+
/*
|
|
103
|
+
NOTE: We load dependencies now to avoid having file imports
|
|
104
|
+
after test runner has finished to isolate the environment.
|
|
105
|
+
*/
|
|
106
|
+
const ejsLoader = (await import('./ejsLoader')).default;
|
|
107
|
+
const content = await (await import('fs')).promises.readFile(filePath, {
|
|
108
|
+
encoding: 'utf-8'
|
|
109
|
+
});
|
|
110
|
+
render(ejsLoader.bind({
|
|
111
|
+
resourcePath: filePath
|
|
112
|
+
})(content));
|
|
113
|
+
} else render(await import('webOptimizerDefaultTemplateFilePath'));
|
|
114
|
+
// endregion
|
|
115
|
+
})().catch(error => {
|
|
200
116
|
log.error(error);
|
|
201
117
|
});else {
|
|
202
118
|
browser.initialized = true;
|
|
203
119
|
browser.window = window;
|
|
204
|
-
window.document.addEventListener('DOMContentLoaded',
|
|
120
|
+
window.document.addEventListener('DOMContentLoaded', () => {
|
|
205
121
|
browser.domContentLoaded = true;
|
|
206
122
|
});
|
|
207
|
-
window.addEventListener('load',
|
|
123
|
+
window.addEventListener('load', () => {
|
|
208
124
|
browser.windowLoaded = true;
|
|
209
125
|
});
|
|
210
|
-
void
|
|
211
|
-
|
|
212
|
-
_step4;
|
|
213
|
-
try {
|
|
214
|
-
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
215
|
-
var callback = _step4.value;
|
|
216
|
-
void callback();
|
|
217
|
-
}
|
|
218
|
-
} catch (err) {
|
|
219
|
-
_iterator4.e(err);
|
|
220
|
-
} finally {
|
|
221
|
-
_iterator4.f();
|
|
222
|
-
}
|
|
126
|
+
void timeout(() => {
|
|
127
|
+
for (const callback of onCreatedListener) void callback();
|
|
223
128
|
});
|
|
224
129
|
}
|
|
225
130
|
// endregion
|
|
@@ -229,38 +134,21 @@ if (typeof TARGET_TECHNOLOGY === 'undefined' || TARGET_TECHNOLOGY === 'node')
|
|
|
229
134
|
* should be replaced or not.
|
|
230
135
|
* @returns Determined environment.
|
|
231
136
|
*/
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
});
|
|
246
|
-
/*
|
|
247
|
-
NOTE: We have to define window globally before anything is loaded to
|
|
248
|
-
ensure that all future instances share the same window object.
|
|
249
|
-
*/
|
|
250
|
-
wrappedCallback = function wrappedCallback() {
|
|
251
|
-
if (replaceWindow && typeof global !== 'undefined' && global !== browser.window) global.window = browser.window;
|
|
252
|
-
resolvePromise(browser);
|
|
253
|
-
};
|
|
254
|
-
if (browser.initialized) wrappedCallback();else onCreatedListener.push(wrappedCallback);
|
|
255
|
-
return _context2.abrupt("return", promise);
|
|
256
|
-
case 1:
|
|
257
|
-
case "end":
|
|
258
|
-
return _context2.stop();
|
|
259
|
-
}
|
|
260
|
-
}, _callee2);
|
|
261
|
-
}));
|
|
262
|
-
return function getInitializedBrowser() {
|
|
263
|
-
return _ref3.apply(this, arguments);
|
|
137
|
+
export const getInitializedBrowser = async (replaceWindow = true) => {
|
|
138
|
+
let resolvePromise;
|
|
139
|
+
const promise = new Promise(resolve => {
|
|
140
|
+
resolvePromise = resolve;
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
/*
|
|
144
|
+
NOTE: We have to define window globally before anything is loaded to
|
|
145
|
+
ensure that all future instances share the same window object.
|
|
146
|
+
*/
|
|
147
|
+
const wrappedCallback = () => {
|
|
148
|
+
if (replaceWindow && typeof global !== 'undefined' && global !== browser.window) global.window = browser.window;
|
|
149
|
+
resolvePromise(browser);
|
|
264
150
|
};
|
|
265
|
-
|
|
266
|
-
|
|
151
|
+
if (browser.initialized) wrappedCallback();else onCreatedListener.push(wrappedCallback);
|
|
152
|
+
return promise;
|
|
153
|
+
};
|
|
154
|
+
export default getInitializedBrowser;
|