@enhanced-dom/webpack 0.3.0 → 0.5.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.
@@ -0,0 +1,10 @@
1
+ import { type Compiler, type WebpackPluginInstance } from 'webpack';
2
+ declare class SelfDecompressingHtmlPlugin implements WebpackPluginInstance {
3
+ htmlAssetName?: string;
4
+ loadingMarkup: string;
5
+ constructor({ loadingMarkup }?: {
6
+ loadingMarkup?: string;
7
+ });
8
+ apply(compiler: Compiler): void;
9
+ }
10
+ export default SelfDecompressingHtmlPlugin;
@@ -0,0 +1,119 @@
1
+ import HtmlWebpackPlugin from 'html-webpack-plugin';
2
+ import zlib from 'zlib';
3
+ const gzip = (text) => new Promise((resolve, reject) => zlib.gzip(text, (err, buf) => (err ? reject(err) : resolve(buf))));
4
+ const bodyRegExp = /<body([^>]*)>([\s\S]*)<\/body>/i;
5
+ // Shown in place of the real body while it decompresses - a body this size can take a visible
6
+ // moment to inflate, so leaving it blank would look broken. Overridable via the plugin's
7
+ // `loadingMarkup` option; this default covers both the transient styling and the spinner markup
8
+ // in one block, since neither has any meaning outside the other.
9
+ const defaultLoadingMarkup = `<style>
10
+ :root { color-scheme: light dark; }
11
+ html, body { height: 100%; margin: 0; }
12
+ body {
13
+ display: flex;
14
+ align-items: center;
15
+ justify-content: center;
16
+ background: #fff;
17
+ color: #111;
18
+ }
19
+ @media (prefers-color-scheme: dark) {
20
+ body { background: #111; color: #eee; }
21
+ }
22
+ .spinner {
23
+ width: 2.5rem;
24
+ height: 2.5rem;
25
+ border: 3px solid rgba(128, 128, 128, 0.3);
26
+ border-top-color: currentColor;
27
+ border-radius: 50%;
28
+ animation: spin 0.8s linear infinite;
29
+ }
30
+ @keyframes spin {
31
+ to { transform: rotate(360deg); }
32
+ }
33
+ </style>
34
+ <div class="spinner"></div>`;
35
+ // Inflates the gzipped, base64-encoded original body back into the page once it's ready, then
36
+ // swaps it in for the loading markup above. Rebuilds any <script> nodes via createElement/
37
+ // appendChild rather than assigning innerHTML/appendChild-ing template.content's parsed nodes
38
+ // directly - browsers deliberately don't execute a <script> that arrives either way, only one
39
+ // actually inserted via the DOM API, and the real body's inlined app bundle <script> has to run.
40
+ const bootstrapScript = (base64) => `<script>
41
+ (async () => {
42
+ try {
43
+ const bytes = Uint8Array.from(atob(${JSON.stringify(base64)}), (c) => c.charCodeAt(0))
44
+ const stream = new Blob([bytes]).stream().pipeThrough(new DecompressionStream('gzip'))
45
+ const bodyHtml = await new Response(stream).text()
46
+ const template = document.createElement('template')
47
+ template.innerHTML = bodyHtml
48
+ document.body.textContent = ''
49
+ Array.from(template.content.childNodes).forEach((node) => {
50
+ if (node.nodeName === 'SCRIPT') {
51
+ const script = document.createElement('script')
52
+ for (const attr of node.attributes) script.setAttribute(attr.name, attr.value)
53
+ script.textContent = node.textContent
54
+ document.body.appendChild(script)
55
+ } else {
56
+ document.body.appendChild(node)
57
+ }
58
+ })
59
+ } catch (err) {
60
+ document.body.textContent = 'Failed to decompress this page: ' + err.message
61
+ }
62
+ })()
63
+ </script>`;
64
+ // Gzips an HTML asset's <body> content and replaces it with a small loading placeholder plus a
65
+ // script that inflates and reinstates the original body client-side, via the browser's native
66
+ // DecompressionStream - <head> (title, meta tags, favicon, any inlined <style>/<link>) is left
67
+ // completely untouched, since html-webpack-plugin/htmlConfigFactory already built that correctly
68
+ // and there's no reason to reconstruct it. Unlike a build-time-only gzip step (e.g. a .gz sidecar
69
+ // file), this needs no server/Content-Encoding support to pay off - decompression happens
70
+ // entirely client-side in the loaded page - so it works for content served statically or opened
71
+ // directly from disk. Only replaces the body when the wrapped version actually comes out
72
+ // smaller, since gzip + base64's ~33% overhead can lose against a small/already-dense body.
73
+ class SelfDecompressingHtmlPlugin {
74
+ htmlAssetName;
75
+ loadingMarkup;
76
+ constructor({ loadingMarkup = defaultLoadingMarkup } = {}) {
77
+ this.loadingMarkup = loadingMarkup;
78
+ }
79
+ apply(compiler) {
80
+ compiler.hooks.compilation.tap('self-decompressing-html-plugin', (compilation) => {
81
+ // Capture the exact asset this plugin should act on - the one page the paired
82
+ // HtmlWebpackPlugin instance in this same htmlConfigFactory() call produced - the same way
83
+ // HtmlInlineSourcePlugin does. A pattern matched against all of compilation.assets (as an
84
+ // earlier version of this plugin did) would misfire in a multi-page build with several
85
+ // HtmlWebpackPlugin instances, touching pages this plugin instance has nothing to do with.
86
+ HtmlWebpackPlugin.getHooks(compilation).afterTemplateExecution.tap('self-decompressing-html-plugin', (htmlPluginData) => {
87
+ this.htmlAssetName = htmlPluginData.outputName;
88
+ return htmlPluginData;
89
+ });
90
+ // PROCESS_ASSETS_STAGE_REPORT is the last named processAssets stage - tapping a further
91
+ // 1000 past it, rather than at that same stage, guarantees this always runs after any
92
+ // other plugin's REPORT-stage work (e.g. an html-inlining plugin still rewriting the html
93
+ // asset at that same stage) regardless of plugin registration order, since this asset must
94
+ // be genuinely final before its body is gzipped.
95
+ compilation.hooks.processAssets.tapPromise({ name: 'self-decompressing-html-plugin', stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_REPORT + 1000 }, async () => {
96
+ if (!this.htmlAssetName)
97
+ return;
98
+ const htmlAsset = compilation.assets[this.htmlAssetName];
99
+ if (!htmlAsset)
100
+ return;
101
+ const html = htmlAsset.source().toString();
102
+ const match = html.match(bodyRegExp);
103
+ if (!match)
104
+ return;
105
+ const [fullMatch, bodyAttrs, bodyContent] = match;
106
+ if (bodyContent === undefined)
107
+ return;
108
+ const gzipped = await gzip(bodyContent);
109
+ const newBody = `<body${bodyAttrs}>${this.loadingMarkup}${bootstrapScript(gzipped.toString('base64'))}</body>`;
110
+ const wrapped = html.slice(0, match.index) + newBody + html.slice(match.index + fullMatch.length);
111
+ if (wrapped.length >= html.length)
112
+ return;
113
+ compilation.updateAsset(this.htmlAssetName, new compiler.webpack.sources.RawSource(wrapped));
114
+ });
115
+ });
116
+ }
117
+ }
118
+ export default SelfDecompressingHtmlPlugin;
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZkRlY29tcHJlc3NpbmdIdG1sUGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbnMvU2VsZkRlY29tcHJlc3NpbmdIdG1sUGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8saUJBQWlCLE1BQU0scUJBQXFCLENBQUE7QUFFbkQsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBRXZCLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBWSxFQUFtQixFQUFFLENBQzdDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFFckcsTUFBTSxVQUFVLEdBQUcsaUNBQWlDLENBQUE7QUFFcEQsOEZBQThGO0FBQzlGLHlGQUF5RjtBQUN6RixnR0FBZ0c7QUFDaEcsaUVBQWlFO0FBQ2pFLE1BQU0sb0JBQW9CLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NEJBeUJELENBQUE7QUFFNUIsOEZBQThGO0FBQzlGLDJGQUEyRjtBQUMzRiw4RkFBOEY7QUFDOUYsOEZBQThGO0FBQzlGLGlHQUFpRztBQUNqRyxNQUFNLGVBQWUsR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFLENBQUM7Ozt5Q0FHSCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7VUFvQnJELENBQUE7QUFFViwrRkFBK0Y7QUFDL0YsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRixpR0FBaUc7QUFDakcsa0dBQWtHO0FBQ2xHLDBGQUEwRjtBQUMxRixnR0FBZ0c7QUFDaEcseUZBQXlGO0FBQ3pGLDRGQUE0RjtBQUM1RixNQUFNLDJCQUEyQjtJQUMvQixhQUFhLENBQVM7SUFDdEIsYUFBYSxDQUFRO0lBRXJCLFlBQVksRUFBRSxhQUFhLEdBQUcsb0JBQW9CLEtBQWlDLEVBQUU7UUFDbkYsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7SUFDcEMsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFrQjtRQUN0QixRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQyxXQUF3QixFQUFFLEVBQUU7WUFDNUYsOEVBQThFO1lBQzlFLDJGQUEyRjtZQUMzRiwwRkFBMEY7WUFDMUYsdUZBQXVGO1lBQ3ZGLDJGQUEyRjtZQUMzRixpQkFBaUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUU7Z0JBQ3RILElBQUksQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQTtnQkFDOUMsT0FBTyxjQUFjLENBQUE7WUFDdkIsQ0FBQyxDQUFDLENBQUE7WUFFRix3RkFBd0Y7WUFDeEYsc0ZBQXNGO1lBQ3RGLDBGQUEwRjtZQUMxRiwyRkFBMkY7WUFDM0YsaURBQWlEO1lBQ2pELFdBQVcsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FDeEMsRUFBRSxJQUFJLEVBQUUsZ0NBQWdDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLDJCQUEyQixHQUFHLElBQUksRUFBRSxFQUNsSCxLQUFLLElBQUksRUFBRTtnQkFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7b0JBQUUsT0FBTTtnQkFDL0IsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7Z0JBQ3hELElBQUksQ0FBQyxTQUFTO29CQUFFLE9BQU07Z0JBRXRCLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtnQkFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtnQkFDcEMsSUFBSSxDQUFDLEtBQUs7b0JBQUUsT0FBTTtnQkFFbEIsTUFBTSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFBO2dCQUNqRCxJQUFJLFdBQVcsS0FBSyxTQUFTO29CQUFFLE9BQU07Z0JBQ3JDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO2dCQUN2QyxNQUFNLE9BQU8sR0FBRyxRQUFRLFNBQVMsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtnQkFDOUcsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUNsRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU07b0JBQUUsT0FBTTtnQkFFekMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7WUFDOUYsQ0FBQyxDQUNGLENBQUE7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRjtBQUVELGVBQWUsMkJBQTJCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSHRtbFdlYnBhY2tQbHVnaW4gZnJvbSAnaHRtbC13ZWJwYWNrLXBsdWdpbidcbmltcG9ydCB7IHR5cGUgQ29tcGlsYXRpb24sIHR5cGUgQ29tcGlsZXIsIHR5cGUgV2VicGFja1BsdWdpbkluc3RhbmNlIH0gZnJvbSAnd2VicGFjaydcbmltcG9ydCB6bGliIGZyb20gJ3psaWInXG5cbmNvbnN0IGd6aXAgPSAodGV4dDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+ID0+XG4gIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHpsaWIuZ3ppcCh0ZXh0LCAoZXJyLCBidWYpID0+IChlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoYnVmKSkpKVxuXG5jb25zdCBib2R5UmVnRXhwID0gLzxib2R5KFtePl0qKT4oW1xcc1xcU10qKTxcXC9ib2R5Pi9pXG5cbi8vIFNob3duIGluIHBsYWNlIG9mIHRoZSByZWFsIGJvZHkgd2hpbGUgaXQgZGVjb21wcmVzc2VzIC0gYSBib2R5IHRoaXMgc2l6ZSBjYW4gdGFrZSBhIHZpc2libGVcbi8vIG1vbWVudCB0byBpbmZsYXRlLCBzbyBsZWF2aW5nIGl0IGJsYW5rIHdvdWxkIGxvb2sgYnJva2VuLiBPdmVycmlkYWJsZSB2aWEgdGhlIHBsdWdpbidzXG4vLyBgbG9hZGluZ01hcmt1cGAgb3B0aW9uOyB0aGlzIGRlZmF1bHQgY292ZXJzIGJvdGggdGhlIHRyYW5zaWVudCBzdHlsaW5nIGFuZCB0aGUgc3Bpbm5lciBtYXJrdXBcbi8vIGluIG9uZSBibG9jaywgc2luY2UgbmVpdGhlciBoYXMgYW55IG1lYW5pbmcgb3V0c2lkZSB0aGUgb3RoZXIuXG5jb25zdCBkZWZhdWx0TG9hZGluZ01hcmt1cCA9IGA8c3R5bGU+XG4gIDpyb290IHsgY29sb3Itc2NoZW1lOiBsaWdodCBkYXJrOyB9XG4gIGh0bWwsIGJvZHkgeyBoZWlnaHQ6IDEwMCU7IG1hcmdpbjogMDsgfVxuICBib2R5IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICBjb2xvcjogIzExMTtcbiAgfVxuICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7XG4gICAgYm9keSB7IGJhY2tncm91bmQ6ICMxMTE7IGNvbG9yOiAjZWVlOyB9XG4gIH1cbiAgLnNwaW5uZXIge1xuICAgIHdpZHRoOiAyLjVyZW07XG4gICAgaGVpZ2h0OiAyLjVyZW07XG4gICAgYm9yZGVyOiAzcHggc29saWQgcmdiYSgxMjgsIDEyOCwgMTI4LCAwLjMpO1xuICAgIGJvcmRlci10b3AtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgYW5pbWF0aW9uOiBzcGluIDAuOHMgbGluZWFyIGluZmluaXRlO1xuICB9XG4gIEBrZXlmcmFtZXMgc3BpbiB7XG4gICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9XG4gIH1cbjwvc3R5bGU+XG48ZGl2IGNsYXNzPVwic3Bpbm5lclwiPjwvZGl2PmBcblxuLy8gSW5mbGF0ZXMgdGhlIGd6aXBwZWQsIGJhc2U2NC1lbmNvZGVkIG9yaWdpbmFsIGJvZHkgYmFjayBpbnRvIHRoZSBwYWdlIG9uY2UgaXQncyByZWFkeSwgdGhlblxuLy8gc3dhcHMgaXQgaW4gZm9yIHRoZSBsb2FkaW5nIG1hcmt1cCBhYm92ZS4gUmVidWlsZHMgYW55IDxzY3JpcHQ+IG5vZGVzIHZpYSBjcmVhdGVFbGVtZW50L1xuLy8gYXBwZW5kQ2hpbGQgcmF0aGVyIHRoYW4gYXNzaWduaW5nIGlubmVySFRNTC9hcHBlbmRDaGlsZC1pbmcgdGVtcGxhdGUuY29udGVudCdzIHBhcnNlZCBub2Rlc1xuLy8gZGlyZWN0bHkgLSBicm93c2VycyBkZWxpYmVyYXRlbHkgZG9uJ3QgZXhlY3V0ZSBhIDxzY3JpcHQ+IHRoYXQgYXJyaXZlcyBlaXRoZXIgd2F5LCBvbmx5IG9uZVxuLy8gYWN0dWFsbHkgaW5zZXJ0ZWQgdmlhIHRoZSBET00gQVBJLCBhbmQgdGhlIHJlYWwgYm9keSdzIGlubGluZWQgYXBwIGJ1bmRsZSA8c2NyaXB0PiBoYXMgdG8gcnVuLlxuY29uc3QgYm9vdHN0cmFwU2NyaXB0ID0gKGJhc2U2NDogc3RyaW5nKSA9PiBgPHNjcmlwdD5cbihhc3luYyAoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgYnl0ZXMgPSBVaW50OEFycmF5LmZyb20oYXRvYigke0pTT04uc3RyaW5naWZ5KGJhc2U2NCl9KSwgKGMpID0+IGMuY2hhckNvZGVBdCgwKSlcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmxvYihbYnl0ZXNdKS5zdHJlYW0oKS5waXBlVGhyb3VnaChuZXcgRGVjb21wcmVzc2lvblN0cmVhbSgnZ3ppcCcpKVxuICAgIGNvbnN0IGJvZHlIdG1sID0gYXdhaXQgbmV3IFJlc3BvbnNlKHN0cmVhbSkudGV4dCgpXG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpXG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gYm9keUh0bWxcbiAgICBkb2N1bWVudC5ib2R5LnRleHRDb250ZW50ID0gJydcbiAgICBBcnJheS5mcm9tKHRlbXBsYXRlLmNvbnRlbnQuY2hpbGROb2RlcykuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09ICdTQ1JJUFQnKSB7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBub2RlLmF0dHJpYnV0ZXMpIHNjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgICAgICBzY3JpcHQudGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgfVxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRvY3VtZW50LmJvZHkudGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGRlY29tcHJlc3MgdGhpcyBwYWdlOiAnICsgZXJyLm1lc3NhZ2VcbiAgfVxufSkoKVxuPC9zY3JpcHQ+YFxuXG4vLyBHemlwcyBhbiBIVE1MIGFzc2V0J3MgPGJvZHk+IGNvbnRlbnQgYW5kIHJlcGxhY2VzIGl0IHdpdGggYSBzbWFsbCBsb2FkaW5nIHBsYWNlaG9sZGVyIHBsdXMgYVxuLy8gc2NyaXB0IHRoYXQgaW5mbGF0ZXMgYW5kIHJlaW5zdGF0ZXMgdGhlIG9yaWdpbmFsIGJvZHkgY2xpZW50LXNpZGUsIHZpYSB0aGUgYnJvd3NlcidzIG5hdGl2ZVxuLy8gRGVjb21wcmVzc2lvblN0cmVhbSAtIDxoZWFkPiAodGl0bGUsIG1ldGEgdGFncywgZmF2aWNvbiwgYW55IGlubGluZWQgPHN0eWxlPi88bGluaz4pIGlzIGxlZnRcbi8vIGNvbXBsZXRlbHkgdW50b3VjaGVkLCBzaW5jZSBodG1sLXdlYnBhY2stcGx1Z2luL2h0bWxDb25maWdGYWN0b3J5IGFscmVhZHkgYnVpbHQgdGhhdCBjb3JyZWN0bHlcbi8vIGFuZCB0aGVyZSdzIG5vIHJlYXNvbiB0byByZWNvbnN0cnVjdCBpdC4gVW5saWtlIGEgYnVpbGQtdGltZS1vbmx5IGd6aXAgc3RlcCAoZS5nLiBhIC5neiBzaWRlY2FyXG4vLyBmaWxlKSwgdGhpcyBuZWVkcyBubyBzZXJ2ZXIvQ29udGVudC1FbmNvZGluZyBzdXBwb3J0IHRvIHBheSBvZmYgLSBkZWNvbXByZXNzaW9uIGhhcHBlbnNcbi8vIGVudGlyZWx5IGNsaWVudC1zaWRlIGluIHRoZSBsb2FkZWQgcGFnZSAtIHNvIGl0IHdvcmtzIGZvciBjb250ZW50IHNlcnZlZCBzdGF0aWNhbGx5IG9yIG9wZW5lZFxuLy8gZGlyZWN0bHkgZnJvbSBkaXNrLiBPbmx5IHJlcGxhY2VzIHRoZSBib2R5IHdoZW4gdGhlIHdyYXBwZWQgdmVyc2lvbiBhY3R1YWxseSBjb21lcyBvdXRcbi8vIHNtYWxsZXIsIHNpbmNlIGd6aXAgKyBiYXNlNjQncyB+MzMlIG92ZXJoZWFkIGNhbiBsb3NlIGFnYWluc3QgYSBzbWFsbC9hbHJlYWR5LWRlbnNlIGJvZHkuXG5jbGFzcyBTZWxmRGVjb21wcmVzc2luZ0h0bWxQbHVnaW4gaW1wbGVtZW50cyBXZWJwYWNrUGx1Z2luSW5zdGFuY2Uge1xuICBodG1sQXNzZXROYW1lPzogc3RyaW5nXG4gIGxvYWRpbmdNYXJrdXA6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKHsgbG9hZGluZ01hcmt1cCA9IGRlZmF1bHRMb2FkaW5nTWFya3VwIH06IHsgbG9hZGluZ01hcmt1cD86IHN0cmluZyB9ID0ge30pIHtcbiAgICB0aGlzLmxvYWRpbmdNYXJrdXAgPSBsb2FkaW5nTWFya3VwXG4gIH1cblxuICBhcHBseShjb21waWxlcjogQ29tcGlsZXIpIHtcbiAgICBjb21waWxlci5ob29rcy5jb21waWxhdGlvbi50YXAoJ3NlbGYtZGVjb21wcmVzc2luZy1odG1sLXBsdWdpbicsIChjb21waWxhdGlvbjogQ29tcGlsYXRpb24pID0+IHtcbiAgICAgIC8vIENhcHR1cmUgdGhlIGV4YWN0IGFzc2V0IHRoaXMgcGx1Z2luIHNob3VsZCBhY3Qgb24gLSB0aGUgb25lIHBhZ2UgdGhlIHBhaXJlZFxuICAgICAgLy8gSHRtbFdlYnBhY2tQbHVnaW4gaW5zdGFuY2UgaW4gdGhpcyBzYW1lIGh0bWxDb25maWdGYWN0b3J5KCkgY2FsbCBwcm9kdWNlZCAtIHRoZSBzYW1lIHdheVxuICAgICAgLy8gSHRtbElubGluZVNvdXJjZVBsdWdpbiBkb2VzLiBBIHBhdHRlcm4gbWF0Y2hlZCBhZ2FpbnN0IGFsbCBvZiBjb21waWxhdGlvbi5hc3NldHMgKGFzIGFuXG4gICAgICAvLyBlYXJsaWVyIHZlcnNpb24gb2YgdGhpcyBwbHVnaW4gZGlkKSB3b3VsZCBtaXNmaXJlIGluIGEgbXVsdGktcGFnZSBidWlsZCB3aXRoIHNldmVyYWxcbiAgICAgIC8vIEh0bWxXZWJwYWNrUGx1Z2luIGluc3RhbmNlcywgdG91Y2hpbmcgcGFnZXMgdGhpcyBwbHVnaW4gaW5zdGFuY2UgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aC5cbiAgICAgIEh0bWxXZWJwYWNrUGx1Z2luLmdldEhvb2tzKGNvbXBpbGF0aW9uKS5hZnRlclRlbXBsYXRlRXhlY3V0aW9uLnRhcCgnc2VsZi1kZWNvbXByZXNzaW5nLWh0bWwtcGx1Z2luJywgKGh0bWxQbHVnaW5EYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuaHRtbEFzc2V0TmFtZSA9IGh0bWxQbHVnaW5EYXRhLm91dHB1dE5hbWVcbiAgICAgICAgcmV0dXJuIGh0bWxQbHVnaW5EYXRhXG4gICAgICB9KVxuXG4gICAgICAvLyBQUk9DRVNTX0FTU0VUU19TVEFHRV9SRVBPUlQgaXMgdGhlIGxhc3QgbmFtZWQgcHJvY2Vzc0Fzc2V0cyBzdGFnZSAtIHRhcHBpbmcgYSBmdXJ0aGVyXG4gICAgICAvLyAxMDAwIHBhc3QgaXQsIHJhdGhlciB0aGFuIGF0IHRoYXQgc2FtZSBzdGFnZSwgZ3VhcmFudGVlcyB0aGlzIGFsd2F5cyBydW5zIGFmdGVyIGFueVxuICAgICAgLy8gb3RoZXIgcGx1Z2luJ3MgUkVQT1JULXN0YWdlIHdvcmsgKGUuZy4gYW4gaHRtbC1pbmxpbmluZyBwbHVnaW4gc3RpbGwgcmV3cml0aW5nIHRoZSBodG1sXG4gICAgICAvLyBhc3NldCBhdCB0aGF0IHNhbWUgc3RhZ2UpIHJlZ2FyZGxlc3Mgb2YgcGx1Z2luIHJlZ2lzdHJhdGlvbiBvcmRlciwgc2luY2UgdGhpcyBhc3NldCBtdXN0XG4gICAgICAvLyBiZSBnZW51aW5lbHkgZmluYWwgYmVmb3JlIGl0cyBib2R5IGlzIGd6aXBwZWQuXG4gICAgICBjb21waWxhdGlvbi5ob29rcy5wcm9jZXNzQXNzZXRzLnRhcFByb21pc2UoXG4gICAgICAgIHsgbmFtZTogJ3NlbGYtZGVjb21wcmVzc2luZy1odG1sLXBsdWdpbicsIHN0YWdlOiBjb21waWxlci53ZWJwYWNrLkNvbXBpbGF0aW9uLlBST0NFU1NfQVNTRVRTX1NUQUdFX1JFUE9SVCArIDEwMDAgfSxcbiAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5odG1sQXNzZXROYW1lKSByZXR1cm5cbiAgICAgICAgICBjb25zdCBodG1sQXNzZXQgPSBjb21waWxhdGlvbi5hc3NldHNbdGhpcy5odG1sQXNzZXROYW1lXVxuICAgICAgICAgIGlmICghaHRtbEFzc2V0KSByZXR1cm5cblxuICAgICAgICAgIGNvbnN0IGh0bWwgPSBodG1sQXNzZXQuc291cmNlKCkudG9TdHJpbmcoKVxuICAgICAgICAgIGNvbnN0IG1hdGNoID0gaHRtbC5tYXRjaChib2R5UmVnRXhwKVxuICAgICAgICAgIGlmICghbWF0Y2gpIHJldHVyblxuXG4gICAgICAgICAgY29uc3QgW2Z1bGxNYXRjaCwgYm9keUF0dHJzLCBib2R5Q29udGVudF0gPSBtYXRjaFxuICAgICAgICAgIGlmIChib2R5Q29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm5cbiAgICAgICAgICBjb25zdCBnemlwcGVkID0gYXdhaXQgZ3ppcChib2R5Q29udGVudClcbiAgICAgICAgICBjb25zdCBuZXdCb2R5ID0gYDxib2R5JHtib2R5QXR0cnN9PiR7dGhpcy5sb2FkaW5nTWFya3VwfSR7Ym9vdHN0cmFwU2NyaXB0KGd6aXBwZWQudG9TdHJpbmcoJ2Jhc2U2NCcpKX08L2JvZHk+YFxuICAgICAgICAgIGNvbnN0IHdyYXBwZWQgPSBodG1sLnNsaWNlKDAsIG1hdGNoLmluZGV4KSArIG5ld0JvZHkgKyBodG1sLnNsaWNlKG1hdGNoLmluZGV4ISArIGZ1bGxNYXRjaC5sZW5ndGgpXG4gICAgICAgICAgaWYgKHdyYXBwZWQubGVuZ3RoID49IGh0bWwubGVuZ3RoKSByZXR1cm5cblxuICAgICAgICAgIGNvbXBpbGF0aW9uLnVwZGF0ZUFzc2V0KHRoaXMuaHRtbEFzc2V0TmFtZSwgbmV3IGNvbXBpbGVyLndlYnBhY2suc291cmNlcy5SYXdTb3VyY2Uod3JhcHBlZCkpXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTZWxmRGVjb21wcmVzc2luZ0h0bWxQbHVnaW5cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ import type LicensePlugin from 'webpack-license-plugin';
2
+ type AdditionalFilesConfigType = NonNullable<NonNullable<ConstructorParameters<typeof LicensePlugin>[0]>['additionalFiles']>;
3
+ type PackageLicenseMetaType = Parameters<AdditionalFilesConfigType[string]>[0][number];
4
+ declare const formatThirdPartyNotices: (packages: PackageLicenseMetaType[]) => string;
5
+ export default formatThirdPartyNotices;
@@ -0,0 +1,11 @@
1
+ const formatThirdPartyNotices = (packages) => packages
2
+ .slice()
3
+ .sort((a, b) => a.name.localeCompare(b.name))
4
+ .map(({ name, version, license, author, repository, licenseText }) => {
5
+ const header = `${name}@${version} — ${license}${author ? ` — ${author}` : ''}${repository ? ` — ${repository}` : ''}`;
6
+ const body = (licenseText || '(license text unavailable)').trim();
7
+ return `${header}\n${'='.repeat(header.length)}\n\n${body}`;
8
+ })
9
+ .join('\n\n\n');
10
+ export default formatThirdPartyNotices;
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0VGhpcmRQYXJ0eU5vdGljZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGx1Z2lucy9mb3JtYXRUaGlyZFBhcnR5Tm90aWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxNQUFNLHVCQUF1QixHQUFHLENBQUMsUUFBa0MsRUFBRSxFQUFFLENBQ3JFLFFBQVE7S0FDTCxLQUFLLEVBQUU7S0FDUCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDNUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUU7SUFDbkUsTUFBTSxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksT0FBTyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFBO0lBQ3RILE1BQU0sSUFBSSxHQUFHLENBQUMsV0FBVyxJQUFJLDRCQUE0QixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDakUsT0FBTyxHQUFHLE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQTtBQUM3RCxDQUFDLENBQUM7S0FDRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7QUFFbkIsZUFBZSx1QkFBdUIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIExpY2Vuc2VQbHVnaW4gZnJvbSAnd2VicGFjay1saWNlbnNlLXBsdWdpbidcblxudHlwZSBBZGRpdGlvbmFsRmlsZXNDb25maWdUeXBlID0gTm9uTnVsbGFibGU8Tm9uTnVsbGFibGU8Q29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBMaWNlbnNlUGx1Z2luPlswXT5bJ2FkZGl0aW9uYWxGaWxlcyddPlxudHlwZSBQYWNrYWdlTGljZW5zZU1ldGFUeXBlID0gUGFyYW1ldGVyczxBZGRpdGlvbmFsRmlsZXNDb25maWdUeXBlW3N0cmluZ10+WzBdW251bWJlcl1cblxuY29uc3QgZm9ybWF0VGhpcmRQYXJ0eU5vdGljZXMgPSAocGFja2FnZXM6IFBhY2thZ2VMaWNlbnNlTWV0YVR5cGVbXSkgPT5cbiAgcGFja2FnZXNcbiAgICAuc2xpY2UoKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKVxuICAgIC5tYXAoKHsgbmFtZSwgdmVyc2lvbiwgbGljZW5zZSwgYXV0aG9yLCByZXBvc2l0b3J5LCBsaWNlbnNlVGV4dCB9KSA9PiB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBgJHtuYW1lfUAke3ZlcnNpb259IOKAlCAke2xpY2Vuc2V9JHthdXRob3IgPyBgIOKAlCAke2F1dGhvcn1gIDogJyd9JHtyZXBvc2l0b3J5ID8gYCDigJQgJHtyZXBvc2l0b3J5fWAgOiAnJ31gXG4gICAgICBjb25zdCBib2R5ID0gKGxpY2Vuc2VUZXh0IHx8ICcobGljZW5zZSB0ZXh0IHVuYXZhaWxhYmxlKScpLnRyaW0oKVxuICAgICAgcmV0dXJuIGAke2hlYWRlcn1cXG4keyc9Jy5yZXBlYXQoaGVhZGVyLmxlbmd0aCl9XFxuXFxuJHtib2R5fWBcbiAgICB9KVxuICAgIC5qb2luKCdcXG5cXG5cXG4nKVxuXG5leHBvcnQgZGVmYXVsdCBmb3JtYXRUaGlyZFBhcnR5Tm90aWNlc1xuIl19
@@ -1,21 +1,49 @@
1
1
  import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
2
+ import LicensePlugin from 'webpack-license-plugin';
2
3
  import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
3
4
  import MiniCssExtractPlugin from 'mini-css-extract-plugin';
4
5
  import TerserPlugin from 'terser-webpack-plugin';
5
6
  import { MinifyOptions } from 'terser';
6
7
  import HtmlWebpackPlugin from 'html-webpack-plugin';
7
8
  import { type WebpackPluginInstance } from 'webpack';
9
+ import DefineEnvPlugin from './DefineEnvPlugin.js';
10
+ import HtmlInlineSourcePlugin from './HtmlInlineSourcePlugin.js';
11
+ import SelfDecompressingHtmlPlugin from './SelfDecompressingHtmlPlugin.js';
8
12
  export declare const cssConfigFactory: ({ filename, cssnanoOptions, }?: {
9
13
  filename?: string;
10
14
  cssnanoOptions?: any;
11
15
  }) => (MiniCssExtractPlugin | CssMinimizerPlugin<CssMinimizerPlugin.CssNanoOptionsExtended>)[];
12
16
  export declare const bundleAnalyzerConfigFactory: (extraConfig?: BundleAnalyzerPlugin.Options) => BundleAnalyzerPlugin[];
13
- export declare const htmlConfigFactory: ({ html, embed }?: {
14
- embed?: boolean;
17
+ type HtmlInlineSourceAdditionalAssetsType = NonNullable<InstanceType<typeof HtmlInlineSourcePlugin>['additionalAssets']>;
18
+ type SelfDecompressingHtmlOptionsType = ConstructorParameters<typeof SelfDecompressingHtmlPlugin>[0];
19
+ export declare const htmlConfigFactory: ({ html, embed, compress, }?: {
20
+ embed?: boolean | {
21
+ additionalAssets?: HtmlInlineSourceAdditionalAssetsType;
22
+ };
23
+ compress?: boolean | SelfDecompressingHtmlOptionsType;
15
24
  html?: Partial<HtmlWebpackPlugin.Options>;
16
25
  }) => WebpackPluginInstance[];
17
26
  export declare const terserConfigFactory: ({ enableSourcemaps, terserOptions, embed }?: {
18
- enableSourcemaps?: boolean;
19
- terserOptions?: MinifyOptions;
20
- embed?: boolean;
21
- }) => TerserPlugin<MinifyOptions>[];
27
+ enableSourcemaps?: boolean | undefined;
28
+ terserOptions?: MinifyOptions | undefined;
29
+ embed?: boolean | undefined;
30
+ }) => TerserPlugin<{
31
+ compress: boolean | import("terser").CompressOptions;
32
+ ecma?: import("terser").ECMA;
33
+ enclose?: boolean | string;
34
+ ie8: boolean;
35
+ keep_classnames: boolean | RegExp;
36
+ keep_fnames: boolean | RegExp;
37
+ mangle: boolean | import("terser").MangleOptions;
38
+ module?: boolean;
39
+ nameCache?: object;
40
+ format?: import("terser").FormatOptions;
41
+ output?: import("terser").FormatOptions;
42
+ parse?: import("terser").ParseOptions;
43
+ safari10?: boolean;
44
+ sourceMap: boolean | import("terser").SourceMapOptions;
45
+ toplevel?: boolean;
46
+ }>[];
47
+ export declare const defineEnvConfigFactory: (envVarNames: string[]) => DefineEnvPlugin[];
48
+ export declare const licenseConfigFactory: ({ outputFilename, includeNoticeText, additionalFiles, ...extraConfig }?: Partial<ConstructorParameters<typeof LicensePlugin>[0]>) => LicensePlugin[];
49
+ export {};
package/plugins/index.js CHANGED
@@ -1,36 +1,33 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.terserConfigFactory = exports.htmlConfigFactory = exports.bundleAnalyzerConfigFactory = exports.cssConfigFactory = void 0;
7
- const path_1 = __importDefault(require("path"));
8
- const webpack_bundle_analyzer_1 = require("webpack-bundle-analyzer");
9
- const css_minimizer_webpack_plugin_1 = __importDefault(require("css-minimizer-webpack-plugin"));
10
- const mini_css_extract_plugin_1 = __importDefault(require("mini-css-extract-plugin"));
11
- const terser_webpack_plugin_1 = __importDefault(require("terser-webpack-plugin"));
12
- const html_webpack_plugin_1 = __importDefault(require("html-webpack-plugin"));
13
- const fs_1 = __importDefault(require("fs"));
14
- const HtmlWebpackInlineSourcePlugin_1 = __importDefault(require("./HtmlWebpackInlineSourcePlugin"));
15
- const cssConfigFactory = ({ filename = '[name]-[chunkhash].css', cssnanoOptions = {}, } = {}) => {
1
+ import path from 'path';
2
+ import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
3
+ import LicensePlugin from 'webpack-license-plugin';
4
+ import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
5
+ import MiniCssExtractPlugin from 'mini-css-extract-plugin';
6
+ import TerserPlugin from 'terser-webpack-plugin';
7
+ import HtmlWebpackPlugin from 'html-webpack-plugin';
8
+ import fs from 'fs';
9
+ import DefineEnvPlugin from './DefineEnvPlugin.js';
10
+ import HtmlInlineSourcePlugin from './HtmlInlineSourcePlugin.js';
11
+ import SelfDecompressingHtmlPlugin from './SelfDecompressingHtmlPlugin.js';
12
+ import formatThirdPartyNotices from './formatThirdPartyNotices.js';
13
+ export const cssConfigFactory = ({ filename = '[name]-[chunkhash].css', cssnanoOptions = {}, } = {}) => {
16
14
  return [
17
- new mini_css_extract_plugin_1.default({
15
+ new MiniCssExtractPlugin({
18
16
  filename,
19
17
  }),
20
- new css_minimizer_webpack_plugin_1.default({
18
+ new CssMinimizerPlugin({
21
19
  test: /\.css$/g,
22
20
  minimizerOptions: {
23
21
  preset: ['advanced'],
24
22
  ...cssnanoOptions,
25
23
  },
26
- minify: css_minimizer_webpack_plugin_1.default.cssnanoMinify,
24
+ minify: CssMinimizerPlugin.cssnanoMinify,
27
25
  }),
28
26
  ];
29
27
  };
30
- exports.cssConfigFactory = cssConfigFactory;
31
- const bundleAnalyzerConfigFactory = (extraConfig = {}) => {
28
+ export const bundleAnalyzerConfigFactory = (extraConfig = {}) => {
32
29
  return [
33
- new webpack_bundle_analyzer_1.BundleAnalyzerPlugin({
30
+ new BundleAnalyzerPlugin({
34
31
  analyzerMode: 'static',
35
32
  reportFilename: './reports/bundle-analysis.html',
36
33
  openAnalyzer: false,
@@ -38,23 +35,26 @@ const bundleAnalyzerConfigFactory = (extraConfig = {}) => {
38
35
  }),
39
36
  ];
40
37
  };
41
- exports.bundleAnalyzerConfigFactory = bundleAnalyzerConfigFactory;
42
- const htmlConfigFactory = ({ html = {}, embed } = {}) => {
43
- var _a;
44
- const template = (_a = html.template) !== null && _a !== void 0 ? _a : path_1.default.join(process.cwd(), 'template.html');
45
- const templateExists = fs_1.default.existsSync(template);
38
+ export const htmlConfigFactory = ({ html = {}, embed, compress, } = {}) => {
39
+ const template = html.template ?? path.join(process.cwd(), 'template.html');
40
+ const templateExists = fs.existsSync(template);
41
+ // Interpolated directly here rather than left as an EJS placeholder (e.g.
42
+ // `<%= htmlWebpackPlugin.options.title %>`, the mechanism a real `template` file can use) -
43
+ // html-webpack-plugin only runs templateContent strings through its EJS child-compilation when
44
+ // they came from a file; a plain string option like this one is used completely as-is.
46
45
  const templateContent = `<!DOCTYPE html>
47
46
  <html>
48
47
  <head>
49
48
  <meta charset="UTF-8" />
49
+ ${html.title ? `<title>${html.title}</title>` : ''}
50
50
  </head>
51
51
  <body>
52
52
  <div id="root"></div>
53
53
  </body>
54
54
  </html>`;
55
- const favicon = html.favicon ? (path_1.default.isAbsolute(html.favicon) ? html.favicon : path_1.default.join(process.cwd(), html.favicon)) : undefined;
55
+ const favicon = html.favicon ? (path.isAbsolute(html.favicon) ? html.favicon : path.join(process.cwd(), html.favicon)) : undefined;
56
56
  const plugins = [
57
- new html_webpack_plugin_1.default({
57
+ new HtmlWebpackPlugin({
58
58
  inject: 'body',
59
59
  lang: 'en-US',
60
60
  ...(templateExists ? { template } : { templateContent }),
@@ -63,14 +63,23 @@ const htmlConfigFactory = ({ html = {}, embed } = {}) => {
63
63
  }),
64
64
  ];
65
65
  if (embed) {
66
- plugins.push(new HtmlWebpackInlineSourcePlugin_1.default());
66
+ const inlineSourcePlugin = new HtmlInlineSourcePlugin();
67
+ if (typeof embed === 'object') {
68
+ inlineSourcePlugin.additionalAssets = embed.additionalAssets;
69
+ }
70
+ plugins.push(inlineSourcePlugin);
71
+ }
72
+ // Runs its own processAssets tap well after HtmlInlineSourcePlugin's (see that plugin's
73
+ // comment on its stage choice), so it always gzips the fully embedded/finished body regardless
74
+ // of push order here.
75
+ if (compress) {
76
+ plugins.push(new SelfDecompressingHtmlPlugin(typeof compress === 'object' ? compress : {}));
67
77
  }
68
78
  return plugins;
69
79
  };
70
- exports.htmlConfigFactory = htmlConfigFactory;
71
- const terserConfigFactory = ({ enableSourcemaps = true, terserOptions = {}, embed = false } = {}) => [
80
+ export const terserConfigFactory = ({ enableSourcemaps = true, terserOptions = {}, embed = false } = {}) => [
72
81
  /* eslint-disable @typescript-eslint/naming-convention */
73
- new terser_webpack_plugin_1.default({
82
+ new TerserPlugin({
74
83
  parallel: true,
75
84
  extractComments: !embed,
76
85
  terserOptions: {
@@ -89,5 +98,25 @@ const terserConfigFactory = ({ enableSourcemaps = true, terserOptions = {}, embe
89
98
  },
90
99
  }),
91
100
  ];
92
- exports.terserConfigFactory = terserConfigFactory;
93
- //# sourceMappingURL=index.js.map
101
+ // Defines process.env.<name> for each listed env var as its (JSON-stringified) current value at
102
+ // build time - the DefinePlugin equivalent of dotenv-loading into the bundle. Values not set in
103
+ // the running process become the string "undefined" (JSON.stringify(undefined) === undefined,
104
+ // which DefinePlugin then coerces to that literal), same as an un-set process.env access already
105
+ // behaves at runtime.
106
+ export const defineEnvConfigFactory = (envVarNames) => {
107
+ return [new DefineEnvPlugin(envVarNames)];
108
+ };
109
+ export const licenseConfigFactory = ({ outputFilename = 'THIRD-PARTY-NOTICES.json', includeNoticeText = true, additionalFiles, ...extraConfig } = {}) => {
110
+ return [
111
+ new LicensePlugin({
112
+ outputFilename,
113
+ includeNoticeText,
114
+ additionalFiles: {
115
+ 'THIRD-PARTY-NOTICES.txt': formatThirdPartyNotices,
116
+ ...additionalFiles,
117
+ },
118
+ ...extraConfig,
119
+ }),
120
+ ];
121
+ };
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGx1Z2lucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxNQUFNLENBQUE7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDOUQsT0FBTyxhQUFhLE1BQU0sd0JBQXdCLENBQUE7QUFDbEQsT0FBTyxrQkFBa0IsTUFBTSw4QkFBOEIsQ0FBQTtBQUM3RCxPQUFPLG9CQUFvQixNQUFNLHlCQUF5QixDQUFBO0FBQzFELE9BQU8sWUFBWSxNQUFNLHVCQUF1QixDQUFBO0FBRWhELE9BQU8saUJBQWlCLE1BQU0scUJBQXFCLENBQUE7QUFDbkQsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBR25CLE9BQU8sZUFBZSxNQUFNLG1CQUFtQixDQUFBO0FBQy9DLE9BQU8sc0JBQXNCLE1BQU0sMEJBQTBCLENBQUE7QUFDN0QsT0FBTywyQkFBMkIsTUFBTSwrQkFBK0IsQ0FBQTtBQUN2RSxPQUFPLHVCQUF1QixNQUFNLDJCQUEyQixDQUFBO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsRUFDL0IsUUFBUSxHQUFHLHdCQUF3QixFQUNuQyxjQUFjLEdBQUcsRUFBRSxNQUM0QixFQUFFLEVBQUUsRUFBRTtJQUNyRCxPQUFPO1FBQ0wsSUFBSSxvQkFBb0IsQ0FBQztZQUN2QixRQUFRO1NBQ1QsQ0FBQztRQUNGLElBQUksa0JBQWtCLENBQUM7WUFDckIsSUFBSSxFQUFFLFNBQVM7WUFDZixnQkFBZ0IsRUFBRTtnQkFDaEIsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUNwQixHQUFHLGNBQWM7YUFDbEI7WUFDRCxNQUFNLEVBQUUsa0JBQWtCLENBQUMsYUFBYTtTQUN6QyxDQUFDO0tBQ0gsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENB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QUFLO2FBQ2hCO1lBQ0QsV0FBVyxFQUFFLElBQUk7WUFDakIsZUFBZSxFQUFFLElBQUk7WUFDckIsTUFBTSxFQUFFO2dCQUNOLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixlQUFlLEVBQUUsSUFBSTthQUN0QjtZQUNELEdBQUcsYUFBYTtTQUNqQjtLQUNGLENBQUM7Q0FDSCxDQUFBO0FBRUQsZ0dBQWdHO0FBQ2hHLGdHQUFnRztBQUNoRyw4RkFBOEY7QUFDOUYsaUdBQWlHO0FBQ2pHLHNCQUFzQjtBQUN0QixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFdBQXFCLEVBQUUsRUFBRTtJQUM5RCxPQUFPLENBQUMsSUFBSSxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQTtBQUMzQyxDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEVBQ25DLGNBQWMsR0FBRywwQkFBMEIsRUFDM0MsaUJBQWlCLEdBQUcsSUFBSSxFQUN4QixlQUFlLEVBQ2YsR0FBRyxXQUFXLEtBQzZDLEVBQUUsRUFBRSxFQUFFO0lBQ2pFLE9BQU87UUFDTCxJQUFJLGFBQWEsQ0FBQztZQUNoQixjQUFjO1lBQ2QsaUJBQWlCO1lBQ2pCLGVBQWUsRUFBRTtnQkFDZix5QkFBeUIsRUFBRSx1QkFBdUI7Z0JBQ2xELEdBQUcsZUFBZTthQUNuQjtZQUNELEdBQUcsV0FBVztTQUNmLENBQUM7S0FDSCxDQUFBO0FBQ0gsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IEJ1bmRsZUFuYWx5emVyUGx1Z2luIH0gZnJvbSAnd2VicGFjay1idW5kbGUtYW5hbHl6ZXInXG5pbXBvcnQgTGljZW5zZVBsdWdpbiBmcm9tICd3ZWJwYWNrLWxpY2Vuc2UtcGx1Z2luJ1xuaW1wb3J0IENzc01pbmltaXplclBsdWdpbiBmcm9tICdjc3MtbWluaW1pemVyLXdlYnBhY2stcGx1Z2luJ1xuaW1wb3J0IE1pbmlDc3NFeHRyYWN0UGx1Z2luIGZyb20gJ21pbmktY3NzLWV4dHJhY3QtcGx1Z2luJ1xuaW1wb3J0IFRlcnNlclBsdWdpbiBmcm9tICd0ZXJzZXItd2VicGFjay1wbHVnaW4nXG5pbXBvcnQgeyBNaW5pZnlPcHRpb25zIH0gZnJvbSAndGVyc2VyJ1xuaW1wb3J0IEh0bWxXZWJwYWNrUGx1Z2luIGZyb20gJ2h0bWwtd2VicGFjay1wbHVnaW4nXG5pbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgeyB0eXBlIFdlYnBhY2tQbHVnaW5JbnN0YW5jZSB9IGZyb20gJ3dlYnBhY2snXG5cbmltcG9ydCBEZWZpbmVFbnZQbHVnaW4gZnJvbSAnLi9EZWZpbmVFbnZQbHVnaW4nXG5pbXBvcnQgSHRtbElubGluZVNvdXJjZVBsdWdpbiBmcm9tICcuL0h0bWxJbmxpbmVTb3VyY2VQbHVnaW4nXG5pbXBvcnQgU2VsZkRlY29tcHJlc3NpbmdIdG1sUGx1Z2luIGZyb20gJy4vU2VsZkRlY29tcHJlc3NpbmdIdG1sUGx1Z2luJ1xuaW1wb3J0IGZvcm1hdFRoaXJkUGFydHlOb3RpY2VzIGZyb20gJy4vZm9ybWF0VGhpcmRQYXJ0eU5vdGljZXMnXG5cbmV4cG9ydCBjb25zdCBjc3NDb25maWdGYWN0b3J5ID0gKHtcbiAgZmlsZW5hbWUgPSAnW25hbWVdLVtjaHVua2hhc2hdLmNzcycsXG4gIGNzc25hbm9PcHRpb25zID0ge30sXG59OiB7IGZpbGVuYW1lPzogc3RyaW5nOyBjc3NuYW5vT3B0aW9ucz86IGFueSB9ID0ge30pID0+IHtcbiAgcmV0dXJuIFtcbiAgICBuZXcgTWluaUNzc0V4dHJhY3RQbHVnaW4oe1xuICAgICAgZmlsZW5hbWUsXG4gICAgfSksXG4gICAgbmV3IENzc01pbmltaXplclBsdWdpbih7XG4gICAgICB0ZXN0OiAvXFwuY3NzJC9nLFxuICAgICAgbWluaW1pemVyT3B0aW9uczoge1xuICAgICAgICBwcmVzZXQ6IFsnYWR2YW5jZWQnXSxcbiAgICAgICAgLi4uY3NzbmFub09wdGlvbnMsXG4gICAgICB9LFxuICAgICAgbWluaWZ5OiBDc3NNaW5pbWl6ZXJQbHVnaW4uY3NzbmFub01pbmlmeSxcbiAgICB9KSxcbiAgXVxufVxuXG5leHBvcnQgY29uc3QgYnVuZGxlQW5hbHl6ZXJDb25maWdGYWN0b3J5ID0gKGV4dHJhQ29uZmlnOiBCdW5kbGVBbmFseXplclBsdWdpbi5PcHRpb25zID0ge30pID0+IHtcbiAgcmV0dXJuIFtcbiAgICBuZXcgQnVuZGxlQW5hbHl6ZXJQbHVnaW4oe1xuICAgICAgYW5hbHl6ZXJNb2RlOiAnc3RhdGljJyxcbiAgICAgIHJlcG9ydEZpbGVuYW1lOiAnLi9yZXBvcnRzL2J1bmRsZS1hbmFseXNpcy5odG1sJyxcbiAgICAgIG9wZW5BbmFseXplcjogZmFsc2UsXG4gICAgICAuLi5leHRyYUNvbmZpZyxcbiAgICB9KSxcbiAgXVxufVxuXG50eXBlIEh0bWxJbmxpbmVTb3VyY2VBZGRpdGlvbmFsQXNzZXRzVHlwZSA9IE5vbk51bGxhYmxlPEluc3RhbmNlVHlwZTx0eXBlb2YgSHRtbElubGluZVNvdXJjZVBsdWdpbj5bJ2FkZGl0aW9uYWxBc3NldHMnXT5cbnR5cGUgU2VsZkRlY29tcHJlc3NpbmdIdG1sT3B0aW9uc1R5cGUgPSBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIFNlbGZEZWNvbXByZXNzaW5nSHRtbFBsdWdpbj5bMF1cblxuZXhwb3J0IGNvbnN0IGh0bWxDb25maWdGYWN0b3J5ID0gKHtcbiAgaHRtbCA9IHt9LFxuICBlbWJlZCxcbiAgY29tcHJlc3MsXG59OiB7XG4gIGVtYmVkPzogYm9vbGVhbiB8IHsgYWRkaXRpb25hbEFzc2V0cz86IEh0bWxJbmxpbmVTb3VyY2VBZGRpdGlvbmFsQXNzZXRzVHlwZSB9XG4gIGNvbXByZXNzPzogYm9vbGVhbiB8IFNlbGZEZWNvbXByZXNzaW5nSHRtbE9wdGlvbnNUeXBlXG4gIGh0bWw/OiBQYXJ0aWFsPEh0bWxXZWJwYWNrUGx1Z2luLk9wdGlvbnM+XG59ID0ge30pID0+IHtcbiAgY29uc3QgdGVtcGxhdGUgPSBodG1sLnRlbXBsYXRlID8/IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAndGVtcGxhdGUuaHRtbCcpXG4gIGNvbnN0IHRlbXBsYXRlRXhpc3RzID0gZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZSlcbiAgLy8gSW50ZXJwb2xhdGVkIGRpcmVjdGx5IGhlcmUgcmF0aGVyIHRoYW4gbGVmdCBhcyBhbiBFSlMgcGxhY2Vob2xkZXIgKGUuZy5cbiAgLy8gYDwlPSBodG1sV2VicGFja1BsdWdpbi5vcHRpb25zLnRpdGxlICU+YCwgdGhlIG1lY2hhbmlzbSBhIHJlYWwgYHRlbXBsYXRlYCBmaWxlIGNhbiB1c2UpIC1cbiAgLy8gaHRtbC13ZWJwYWNrLXBsdWdpbiBvbmx5IHJ1bnMgdGVtcGxhdGVDb250ZW50IHN0cmluZ3MgdGhyb3VnaCBpdHMgRUpTIGNoaWxkLWNvbXBpbGF0aW9uIHdoZW5cbiAgLy8gdGhleSBjYW1lIGZyb20gYSBmaWxlOyBhIHBsYWluIHN0cmluZyBvcHRpb24gbGlrZSB0aGlzIG9uZSBpcyB1c2VkIGNvbXBsZXRlbHkgYXMtaXMuXG4gIGNvbnN0IHRlbXBsYXRlQ29udGVudCA9IGA8IURPQ1RZUEUgaHRtbD5cbiAgPGh0bWw+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJVVEYtOFwiIC8+XG4gICAgJHtodG1sLnRpdGxlID8gYDx0aXRsZT4ke2h0bWwudGl0bGV9PC90aXRsZT5gIDogJyd9XG4gIDwvaGVhZD5cbiAgPGJvZHk+XG4gICAgPGRpdiBpZD1cInJvb3RcIj48L2Rpdj5cbiAgPC9ib2R5PlxuICA8L2h0bWw+YFxuICBjb25zdCBmYXZpY29uID0gaHRtbC5mYXZpY29uID8gKHBhdGguaXNBYnNvbHV0ZShodG1sLmZhdmljb24pID8gaHRtbC5mYXZpY29uIDogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGh0bWwuZmF2aWNvbikpIDogdW5kZWZpbmVkXG4gIGNvbnN0IHBsdWdpbnM6IFdlYnBhY2tQbHVnaW5JbnN0YW5jZVtdID0gW1xuICAgIG5ldyBIdG1sV2VicGFja1BsdWdpbih7XG4gICAgICBpbmplY3Q6ICdib2R5JyxcbiAgICAgIGxhbmc6ICdlbi1VUycsXG4gICAgICAuLi4odGVtcGxhdGVFeGlzdHMgPyB7IHRlbXBsYXRlIH0gOiB7IHRlbXBsYXRlQ29udGVudCB9KSxcbiAgICAgIC4uLmh0bWwsXG4gICAgICBmYXZpY29uLFxuICAgIH0pLFxuICBdXG5cbiAgaWYgKGVtYmVkKSB7XG4gICAgY29uc3QgaW5saW5lU291cmNlUGx1Z2luID0gbmV3IEh0bWxJbmxpbmVTb3VyY2VQbHVnaW4oKVxuICAgIGlmICh0eXBlb2YgZW1iZWQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpbmxpbmVTb3VyY2VQbHVnaW4uYWRkaXRpb25hbEFzc2V0cyA9IGVtYmVkLmFkZGl0aW9uYWxBc3NldHNcbiAgICB9XG4gICAgcGx1Z2lucy5wdXNoKGlubGluZVNvdXJjZVBsdWdpbilcbiAgfVxuXG4gIC8vIFJ1bnMgaXRzIG93biBwcm9jZXNzQXNzZXRzIHRhcCB3ZWxsIGFmdGVyIEh0bWxJbmxpbmVTb3VyY2VQbHVnaW4ncyAoc2VlIHRoYXQgcGx1Z2luJ3NcbiAgLy8gY29tbWVudCBvbiBpdHMgc3RhZ2UgY2hvaWNlKSwgc28gaXQgYWx3YXlzIGd6aXBzIHRoZSBmdWxseSBlbWJlZGRlZC9maW5pc2hlZCBib2R5IHJlZ2FyZGxlc3NcbiAgLy8gb2YgcHVzaCBvcmRlciBoZXJlLlxuICBpZiAoY29tcHJlc3MpIHtcbiAgICBwbHVnaW5zLnB1c2gobmV3IFNlbGZEZWNvbXByZXNzaW5nSHRtbFBsdWdpbih0eXBlb2YgY29tcHJlc3MgPT09ICdvYmplY3QnID8gY29tcHJlc3MgOiB7fSkpXG4gIH1cblxuICByZXR1cm4gcGx1Z2luc1xufVxuXG5leHBvcnQgY29uc3QgdGVyc2VyQ29uZmlnRmFjdG9yeSA9ICh7IGVuYWJsZVNvdXJjZW1hcHMgPSB0cnVlLCB0ZXJzZXJPcHRpb25zID0ge30gYXMgTWluaWZ5T3B0aW9ucywgZW1iZWQgPSBmYWxzZSB9ID0ge30pID0+IFtcbiAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXG4gIG5ldyBUZXJzZXJQbHVnaW4oe1xuICAgIHBhcmFsbGVsOiB0cnVlLFxuICAgIGV4dHJhY3RDb21tZW50czogIWVtYmVkLFxuICAgIHRlcnNlck9wdGlvbnM6IHtcbiAgICAgIGllODogZmFsc2UsXG4gICAgICBzb3VyY2VNYXA6IGVuYWJsZVNvdXJjZW1hcHMsXG4gICAgICBjb21wcmVzczoge1xuICAgICAgICBldmFsdWF0ZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAga2VlcF9mbmFtZXM6IHRydWUsXG4gICAgICBrZWVwX2NsYXNzbmFtZXM6IHRydWUsXG4gICAgICBtYW5nbGU6IHtcbiAgICAgICAga2VlcF9mbmFtZXM6IHRydWUsXG4gICAgICAgIGtlZXBfY2xhc3NuYW1lczogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICAuLi50ZXJzZXJPcHRpb25zLFxuICAgIH0sXG4gIH0pLFxuXVxuXG4vLyBEZWZpbmVzIHByb2Nlc3MuZW52LjxuYW1lPiBmb3IgZWFjaCBsaXN0ZWQgZW52IHZhciBhcyBpdHMgKEpTT04tc3RyaW5naWZpZWQpIGN1cnJlbnQgdmFsdWUgYXRcbi8vIGJ1aWxkIHRpbWUgLSB0aGUgRGVmaW5lUGx1Z2luIGVxdWl2YWxlbnQgb2YgZG90ZW52LWxvYWRpbmcgaW50byB0aGUgYnVuZGxlLiBWYWx1ZXMgbm90IHNldCBpblxuLy8gdGhlIHJ1bm5pbmcgcHJvY2VzcyBiZWNvbWUgdGhlIHN0cmluZyBcInVuZGVmaW5lZFwiIChKU09OLnN0cmluZ2lmeSh1bmRlZmluZWQpID09PSB1bmRlZmluZWQsXG4vLyB3aGljaCBEZWZpbmVQbHVnaW4gdGhlbiBjb2VyY2VzIHRvIHRoYXQgbGl0ZXJhbCksIHNhbWUgYXMgYW4gdW4tc2V0IHByb2Nlc3MuZW52IGFjY2VzcyBhbHJlYWR5XG4vLyBiZWhhdmVzIGF0IHJ1bnRpbWUuXG5leHBvcnQgY29uc3QgZGVmaW5lRW52Q29uZmlnRmFjdG9yeSA9IChlbnZWYXJOYW1lczogc3RyaW5nW10pID0+IHtcbiAgcmV0dXJuIFtuZXcgRGVmaW5lRW52UGx1Z2luKGVudlZhck5hbWVzKV1cbn1cblxuZXhwb3J0IGNvbnN0IGxpY2Vuc2VDb25maWdGYWN0b3J5ID0gKHtcbiAgb3V0cHV0RmlsZW5hbWUgPSAnVEhJUkQtUEFSVFktTk9USUNFUy5qc29uJyxcbiAgaW5jbHVkZU5vdGljZVRleHQgPSB0cnVlLFxuICBhZGRpdGlvbmFsRmlsZXMsXG4gIC4uLmV4dHJhQ29uZmlnXG59OiBQYXJ0aWFsPENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgTGljZW5zZVBsdWdpbj5bMF0+ID0ge30pID0+IHtcbiAgcmV0dXJuIFtcbiAgICBuZXcgTGljZW5zZVBsdWdpbih7XG4gICAgICBvdXRwdXRGaWxlbmFtZSxcbiAgICAgIGluY2x1ZGVOb3RpY2VUZXh0LFxuICAgICAgYWRkaXRpb25hbEZpbGVzOiB7XG4gICAgICAgICdUSElSRC1QQVJUWS1OT1RJQ0VTLnR4dCc6IGZvcm1hdFRoaXJkUGFydHlOb3RpY2VzLFxuICAgICAgICAuLi5hZGRpdGlvbmFsRmlsZXMsXG4gICAgICB9LFxuICAgICAgLi4uZXh0cmFDb25maWcsXG4gICAgfSksXG4gIF1cbn1cbiJdfQ==
@@ -1 +0,0 @@
1
- {"version":3,"file":"compiler.helpers.js","sourceRoot":"./","sources":["compiler.helpers.ts"],"names":[],"mappings":";;;;;;AAAA,qCAAoE;AACpE,0DAAgC;AAEzB,MAAM,eAAe,GAAG,CAAC,kBAA+C,EAAE,EAAE;IACjF,8HAA8H;IAC9H,MAAM,KAAK,GAAG,IAAI,mBAAQ,EAAE,CAAA;IAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC/C,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE;QAC5B,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAU,EAAE,MAAW,EAAE,EAAE;YAC7C,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;YAC9C,CAAC;YACD,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IACD,KAAK,CAAC,QAAQ,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE;QAChC,YAAY,CAAC,QAAQ,EAAE,CAAC,GAAU,EAAE,MAAW,EAAE,EAAE;YACjD,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;YAClD,CAAC;YACD,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAvBY,QAAA,eAAe,mBAuB3B;AAEM,MAAM,uBAAuB,GAAG,CAAC,gBAA0B,EAAE,UAAU,GAAG,IAAI,EAAE,EAAE;IACvF,MAAM,mBAAmB,GAAG,gBAG3B,CAAA;IACD,mBAAmB,CAAC,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,IAAA,uBAAe,EAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,mBAAQ,EAAE,CAAA;IACrH,mBAAmB,CAAC,gBAAgB,GAAG,IAAI,mBAAQ,EAAE,CAAA;IAErD,OAAO,mBAAmB,CAAA;AAC5B,CAAC,CAAA;AATY,QAAA,uBAAuB,2BASnC;AAEM,MAAM,mBAAmB,GAAG,CAAC,aAA4B,EAAE,UAAU,GAAG,IAAI,EAAE,EAAE;IACrF,OAAO,IAAA,+BAAuB,EAAC,IAAA,iBAAO,EAAC,aAAa,CAAC,EAAE,UAAU,CAAC,CAAA;AACpE,CAAC,CAAA;AAFY,QAAA,mBAAmB,uBAE/B","sourcesContent":["import { type Compiler, type Configuration, webpack } from 'webpack'\nimport MemoryFS from 'memory-fs'\n\nexport const proxyFilesystem = (originalFilesystem: Compiler['inputFileSystem']) => {\n // Inspired by: https://stackoverflow.com/questions/38779924/compiling-webpack-in-memory-but-resolving-to-node-modules-on-disk\n const memFs = new MemoryFS()\n const statOrig = memFs.stat.bind(memFs)\n const readFileOrig = memFs.readFile.bind(memFs)\n memFs.stat = (filePath, cb) => {\n statOrig(filePath, (err: Error, result: any) => {\n if (err) {\n return originalFilesystem.stat(filePath, cb)\n }\n return cb(err, result)\n })\n }\n memFs.readFile = (filePath, cb) => {\n readFileOrig(filePath, (err: Error, result: any) => {\n if (err) {\n return originalFilesystem.readFile(filePath, cb)\n }\n return cb(err, result)\n })\n }\n\n return memFs\n}\n\nexport const patchCompilerFileSystem = (originalCompiler: Compiler, allowProxy = true) => {\n const transformedCompiler = originalCompiler as unknown as Omit<Compiler, 'inputFileSystem' | 'outputFileSystem'> & {\n inputFileSystem: MemoryFS\n outputFileSystem: MemoryFS\n }\n transformedCompiler.inputFileSystem = allowProxy ? proxyFilesystem(originalCompiler.inputFileSystem) : new MemoryFS()\n transformedCompiler.outputFileSystem = new MemoryFS()\n\n return transformedCompiler\n}\n\nexport const getInMemoryCompiler = (webpackConfig: Configuration, allowProxy = true) => {\n return patchCompilerFileSystem(webpack(webpackConfig), allowProxy)\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"./","sources":["configs/index.ts"],"names":[],"mappings":";;;;;;AAAA,4FAAgE;AAChE,gDAAuB;AAEvB,wCAA+C;AAExC,MAAM,wBAAwB,GAAG,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAA+D,EAAE,EAAE;IACtI,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAC/B,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,cAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC,OAAO,CAAC,CAC7G,CAAA;IACD,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;QAC5B,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS;QACrD,MAAM,EAAE;YACN,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,eAAe;oBACrB,GAAG,EAAE,IAAA,4BAAkB,EAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;iBAC9F;gBACD;oBACE,IAAI,EAAE,gBAAgB;oBACtB,GAAG,EAAE,IAAA,4BAAkB,EAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;iBACnG;aACF;SACF;QACD,OAAO,EAAE,CAAC,IAAI,oCAAuB,CAAC,WAAW,CAAC,CAAC;KACpD,CAAA;AACH,CAAC,CAAA;AAvBY,QAAA,wBAAwB,4BAuBpC","sourcesContent":["import IgnoreEmitWebpackPlugin from 'ignore-emit-webpack-plugin'\nimport path from 'path'\n\nimport { styleConfigFactory } from '../loaders'\n\nexport const typedStylesConfigFactory = ({ raw, filePaths, outputPath }: { raw?: boolean; filePaths: string[]; outputPath?: string }) => {\n const fileRegexes = filePaths.map(\n (filePath) => new RegExp(`^((?!${path.basename(filePath).replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')}).)*$`),\n )\n return {\n mode: 'development',\n entry: { bundle: filePaths },\n devtool: false,\n output: outputPath ? { path: outputPath } : undefined,\n module: {\n rules: [\n {\n test: /\\.(pcss|css)$/,\n use: styleConfigFactory({ raw, typedStyles: true, parser: 'postcss', extract: !!outputPath }),\n },\n {\n test: /\\.(scss|sass)$/,\n use: styleConfigFactory({ raw, typedStyles: true, parser: 'postcss-scss', extract: !!outputPath }),\n },\n ],\n },\n plugins: [new IgnoreEmitWebpackPlugin(fileRegexes)],\n }\n}\n"]}
package/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"./","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAAoC;AACpC,mDAAoC;AACpC,mDAAoC;AACpC,6DAA8C;AAC9C,iBAAS;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;CACT,CAAA","sourcesContent":["import * as loaders from './loaders'\nimport * as plugins from './plugins'\nimport * as configs from './configs'\nimport * as compiler from './compiler.helpers'\nexport = {\n loaders,\n plugins,\n configs,\n compiler,\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"WebcomponentStyleLoader.js","sourceRoot":"./","sources":["loaders/WebcomponentStyleLoader.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path'\nimport fs from 'fs'\nimport { validate } from 'schema-utils'\nimport { type JSONSchema7 } from 'json-schema' // eslint-disable-line import/no-unresolved\n\nconst schema: JSONSchema7 = {\n type: 'object',\n properties: {\n pathPrefix: {\n type: 'string',\n },\n emit: {\n type: 'boolean',\n },\n typings: {\n type: 'boolean',\n },\n raw: {\n type: 'boolean',\n },\n named: {\n type: 'boolean',\n },\n },\n additionalProperties: false,\n}\n\nconst loader = function (content: string) {\n const options = this.getOptions()\n validate(schema, options, { name: 'webcomponent-styles' })\n\n if (options.emit) {\n const pathPrefix = options.pathPrefix ?? path.join(process.cwd(), 'src')\n const transformedAssetPath = path\n .join(path.dirname(this.resourcePath), `${path.basename(this.resourcePath)}.js`)\n .replace(pathPrefix, '')\n const transformedCode = Object.entries(this.data)\n .map(([exportName, exportValue]: [string, string]) => `export const ${exportName} = ${exportValue}`)\n .join('\\n')\n this.emitFile(transformedAssetPath, transformedCode)\n if (options.typings) {\n const transformedDtsPath = path\n .join(path.dirname(this.resourcePath), `${path.basename(this.resourcePath)}.d.ts`)\n .replace(pathPrefix, '')\n const typingsCode = [...Object.keys(this.data).map((exportName) => `export const ${exportName}: string;`)].join('\\n')\n this.emitFile(transformedDtsPath, typingsCode)\n }\n }\n if (options.typings) {\n const dtsPath = path.join(path.dirname(this.resourcePath), `${path.basename(this.resourcePath)}.d.ts`)\n const typingsCode = [...Object.keys(this.data).map((exportName) => `export const ${exportName}: string;`)].join('\\n')\n if (!fs.existsSync(dtsPath) || fs.readFileSync(dtsPath, 'utf-8') != typingsCode) {\n fs.writeFileSync(dtsPath, typingsCode, 'utf8')\n }\n }\n\n return options.raw ? content + `export var css = ${this.data.css};\\n` : content\n}\n\nloader.pitch = async function (request: string) {\n const options = this.getOptions()\n validate(schema, options, { name: 'webcomponent-styles' })\n const result = await this.importModule(this.resourcePath + '.webpack[javascript/auto]' + '!=!' + request)\n const { default: defaultExport, ...otherExports } = result\n if (options.raw) {\n this.data.css = `\\`${defaultExport.toString()}\\``\n }\n Object.entries(otherExports).forEach(\n ([exportName, exportValue]: [string, string]) => (this.data[exportName] = `'${exportValue.replace(/^[\"|'](.+)[\"|']$/, '$1')}'`),\n )\n}\n\nexport = loader\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"./","sources":["loaders/index.ts"],"names":[],"mappings":"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","sourcesContent":["import MiniCssExtractPlugin from 'mini-css-extract-plugin'\nimport createResolver from 'postcss-import-webpack-resolver'\nconst WebcomponentStyleLoader = require.resolve('./WebcomponentStyleLoader')\nimport codeImport from 'remark-code-import'\nimport imageUnwrap from 'rehype-unwrap-images'\nimport imageImport from 'remark-embed-images'\n\nexport const styleConfigFactory = ({\n raw = false,\n extract = false,\n sourceMap = false,\n typedStyles = false,\n modules = undefined as\n | { localIdentName?: string; mappings?: { filter: string; transform: (p: string) => string }[] }\n | (boolean & { localIdentName?: never; mappings?: never }),\n parser = undefined as 'postcss' | 'postcss-scss',\n aliases = {} as Record<string, string>,\n} = {}) => {\n const loaders = []\n\n if (raw) {\n loaders.push({\n loader: WebcomponentStyleLoader,\n options: {\n raw: true,\n emit: extract,\n typings: typedStyles,\n },\n })\n } else {\n if (extract) {\n loaders.push({\n loader: MiniCssExtractPlugin.loader,\n options: {\n publicPath: './',\n },\n })\n } else {\n loaders.push({ loader: 'style-loader' })\n }\n\n if (typedStyles) {\n loaders.push({\n loader: WebcomponentStyleLoader,\n options: {\n raw: false,\n emit: false,\n typings: true,\n },\n })\n }\n }\n\n const cssLoader = {\n loader: 'css-loader',\n options: {\n sourceMap,\n ...(modules || typedStyles\n ? {\n esModule: true,\n modules: {\n localIdentName: modules?.localIdentName ?? '[local]_[hash:base64:5]',\n getLocalIdent: (loaderContext: { resourcePath: string }, _: any, localName: string) => {\n const { resourcePath } = loaderContext\n const mappings = modules?.mappings ?? []\n const mapping = mappings.find(({ filter }) => resourcePath.includes(filter))\n if (!mapping) {\n return undefined // this will trigger the default css-loader getLocalIdent function\n }\n return mapping.transform(localName)\n },\n exportLocalsConvention: 'camelCaseOnly',\n namedExport: true,\n },\n sourceMap,\n }\n : { modules: false }),\n },\n }\n\n loaders.push(cssLoader)\n\n const resolveUrlLoader = {\n loader: 'resolve-url-loader',\n }\n\n loaders.push(resolveUrlLoader)\n\n const postcssLoader = {\n loader: 'postcss-loader',\n options: {\n sourceMap: true,\n postcssOptions: {\n parser,\n plugins: [\n 'postcss-normalize-whitespace',\n 'postcss-discard-comments',\n [\n 'postcss-import',\n {\n resolve: createResolver({\n alias: aliases,\n }),\n modules: ['./node_modules', 'node_modules'],\n },\n ],\n 'postcss-nested',\n // 'autoprefixer',\n [\n 'postcss-preset-env',\n {\n stage: 3,\n },\n ],\n ],\n },\n },\n }\n\n loaders.push(postcssLoader)\n\n return loaders\n}\n\nexport const nullConfigFactory = ({ rules = [] as RegExp[] } = {}) => {\n return rules.map((rule) => ({\n test: rule,\n use: 'null-loader',\n enforce: 'post',\n }))\n}\n\nexport const fontExtensions = ['ttf', 'eot', 'woff', 'woff2']\nexport const imageExtensions = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'ico']\nexport const assetExtensions = (extensions = [...imageExtensions, ...fontExtensions] as string[]) =>\n new RegExp(`\\\\.(${extensions.join('|')})(\\\\?.*$|$)?$`)\n\nexport const babelConfigFactory = ({ babel = undefined as any }) => {\n const loaders = [{ loader: 'babel-loader', options: babel }]\n return loaders\n}\n\nexport const markdownConfigFactory = ({\n babel,\n remark = [],\n rehype = [],\n useProvider = false,\n}: { babel?: any; remark?: any[]; rehype?: any[]; useProvider?: boolean } = {}) => {\n const loaders = []\n\n if (babel) {\n loaders.push(...babelConfigFactory({ babel }))\n loaders.push({\n loader: '@mdx-js/loader',\n options: {\n remarkPlugins: [codeImport, imageImport, imageUnwrap, ...remark],\n rehypePlugins: rehype,\n providerImportSource: useProvider ? '@mdx-js/react' : undefined,\n },\n })\n } else {\n loaders.push(\n {\n loader: 'html-loader',\n },\n {\n loader: 'markdown-loader',\n },\n )\n }\n return loaders\n}\n"]}
@@ -1,2 +0,0 @@
1
- import HtmlWebpackInlineSourcePlugin from 'html-webpack-inline-source-plugin';
2
- export default HtmlWebpackInlineSourcePlugin;
@@ -1,55 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- /* eslint-disable @typescript-eslint/no-this-alias */
7
- const html_webpack_plugin_1 = __importDefault(require("html-webpack-plugin"));
8
- const html_webpack_inline_source_plugin_1 = __importDefault(require("html-webpack-inline-source-plugin"));
9
- const fs_1 = __importDefault(require("fs"));
10
- const path_1 = __importDefault(require("path"));
11
- html_webpack_inline_source_plugin_1.default.prototype.processTags = function (compilation, pluginData) {
12
- const self = this;
13
- const headTags = [];
14
- const bodyTags = [];
15
- pluginData.headTags.forEach((tag) => {
16
- headTags.push(self.processTag(compilation, self.assetsRegExp, tag));
17
- });
18
- pluginData.bodyTags.forEach((tag) => {
19
- bodyTags.push(self.processTag(compilation, self.assetsRegExp, tag));
20
- });
21
- return { ...pluginData, headTags, bodyTags };
22
- };
23
- html_webpack_inline_source_plugin_1.default.prototype.apply = function (compiler) {
24
- const self = this;
25
- self.assetsRegExp = undefined;
26
- self.faviconPath = undefined;
27
- compiler.hooks.compilation.tap('html-webpack-inline-source-plugin', (compilation) => {
28
- html_webpack_plugin_1.default.getHooks(compilation).afterTemplateExecution.tapAsync('html-webpack-inline-source-plugin', (htmlPluginData, callback) => {
29
- self.assetsRegExp = new RegExp('.(js|css)$');
30
- const result = self.processTags(compilation, htmlPluginData);
31
- const favicon = htmlPluginData.plugin.options.favicon;
32
- if (!favicon || !fs_1.default.existsSync(favicon)) {
33
- return callback(null, result);
34
- }
35
- const faviconTag = result.headTags.find((tag) => tag.tagName === 'link' && tag.attributes.rel === 'icon');
36
- if (faviconTag) {
37
- self.faviconPath = faviconTag.attributes.href;
38
- faviconTag.attributes.href = `data:image/x-icon;base64, ${fs_1.default.readFileSync(favicon, 'base64')}`;
39
- }
40
- callback(null, result);
41
- });
42
- });
43
- compiler.hooks.emit.tap('html-webpack-inline-source-plugin', (compilation) => {
44
- if (self.assetsRegExp) {
45
- Object.keys(compilation.assets).forEach(function (file) {
46
- var _a, _b;
47
- if (file.match(self.assetsRegExp) || file === ((_b = (_a = self.faviconPath) === null || _a === void 0 ? void 0 : _a.split(path_1.default.sep)) === null || _b === void 0 ? void 0 : _b.pop())) {
48
- delete compilation.assets[file];
49
- }
50
- });
51
- }
52
- });
53
- };
54
- exports.default = html_webpack_inline_source_plugin_1.default;
55
- //# sourceMappingURL=HtmlWebpackInlineSourcePlugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HtmlWebpackInlineSourcePlugin.js","sourceRoot":"./","sources":["plugins/HtmlWebpackInlineSourcePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-this-alias */\nimport HtmlWebpackPlugin, { Hooks } from 'html-webpack-plugin'\nimport HtmlWebpackInlineSourcePlugin from 'html-webpack-inline-source-plugin'\nimport { type Compilation, type Compiler } from 'webpack'\nimport { AsyncSeriesWaterfallHook } from 'tapable'\nimport fs from 'fs'\nimport path from 'path'\n\ntype AsyncSeriesWaterfallHookDataType<T> = T extends AsyncSeriesWaterfallHook<infer R> ? R : never\n\nHtmlWebpackInlineSourcePlugin.prototype.processTags = function (\n compilation: Compilation,\n pluginData: AsyncSeriesWaterfallHookDataType<Hooks['afterTemplateExecution']>,\n) {\n const self = this\n\n const headTags = []\n const bodyTags = []\n\n pluginData.headTags.forEach((tag) => {\n headTags.push(self.processTag(compilation, self.assetsRegExp, tag))\n })\n\n pluginData.bodyTags.forEach((tag) => {\n bodyTags.push(self.processTag(compilation, self.assetsRegExp, tag))\n })\n\n return { ...pluginData, headTags, bodyTags }\n}\n\nHtmlWebpackInlineSourcePlugin.prototype.apply = function (compiler: Compiler) {\n const self = this\n self.assetsRegExp = undefined\n self.faviconPath = undefined\n\n compiler.hooks.compilation.tap('html-webpack-inline-source-plugin', (compilation) => {\n HtmlWebpackPlugin.getHooks(compilation).afterTemplateExecution.tapAsync(\n 'html-webpack-inline-source-plugin',\n (htmlPluginData, callback) => {\n self.assetsRegExp = new RegExp('.(js|css)$')\n const result = self.processTags(compilation, htmlPluginData) as typeof htmlPluginData\n const favicon = htmlPluginData.plugin.options.favicon\n if (!favicon || !fs.existsSync(favicon)) {\n return callback(null, result)\n }\n const faviconTag = result.headTags.find((tag) => tag.tagName === 'link' && tag.attributes.rel === 'icon')\n if (faviconTag) {\n self.faviconPath = faviconTag.attributes.href as string\n faviconTag.attributes.href = `data:image/x-icon;base64, ${fs.readFileSync(favicon, 'base64')}`\n }\n callback(null, result)\n },\n )\n })\n\n compiler.hooks.emit.tap('html-webpack-inline-source-plugin', (compilation) => {\n if (self.assetsRegExp) {\n Object.keys(compilation.assets).forEach(function (file) {\n if (file.match(self.assetsRegExp) || file === self.faviconPath?.split(path.sep)?.pop()) {\n delete compilation.assets[file]\n }\n })\n }\n })\n}\n\nexport default HtmlWebpackInlineSourcePlugin\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"./","sources":["plugins/index.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AACvB,qEAA8D;AAC9D,gGAA6D;AAC7D,sFAA0D;AAC1D,kFAAgD;AAEhD,8EAAmD;AACnD,4CAAmB;AAGnB,oGAAoE;AAE7D,MAAM,gBAAgB,GAAG,CAAC,EAC/B,QAAQ,GAAG,wBAAwB,EACnC,cAAc,GAAG,EAAE,MAC4B,EAAE,EAAE,EAAE;IACrD,OAAO;QACL,IAAI,iCAAoB,CAAC;YACvB,QAAQ;SACT,CAAC;QACF,IAAI,sCAAkB,CAAC;YACrB,IAAI,EAAE,SAAS;YACf,gBAAgB,EAAE;gBAChB,MAAM,EAAE,CAAC,UAAU,CAAC;gBACpB,GAAG,cAAc;aAClB;YACD,MAAM,EAAE,sCAAkB,CAAC,aAAa;SACzC,CAAC;KACH,CAAA;AACH,CAAC,CAAA;AAjBY,QAAA,gBAAgB,oBAiB5B;AAEM,MAAM,2BAA2B,GAAG,CAAC,cAA4C,EAAE,EAAE,EAAE;IAC5F,OAAO;QACL,IAAI,8CAAoB,CAAC;YACvB,YAAY,EAAE,QAAQ;YACtB,cAAc,EAAE,gCAAgC;YAChD,YAAY,EAAE,KAAK;YACnB,GAAG,WAAW;SACf,CAAC;KACH,CAAA;AACH,CAAC,CAAA;AATY,QAAA,2BAA2B,+BASvC;AAEM,MAAM,iBAAiB,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,KAAqE,EAAE,EAAE,EAAE;;IAC7H,MAAM,QAAQ,GAAG,MAAA,IAAI,CAAC,QAAQ,mCAAI,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAA;IAC3E,MAAM,cAAc,GAAG,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IAC9C,MAAM,eAAe,GAAG;;;;;;;;UAQhB,CAAA;IACR,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAClI,MAAM,OAAO,GAA4B;QACvC,IAAI,6BAAiB,CAAC;YACpB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,OAAO;YACb,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC;YACxD,GAAG,IAAI;YACP,OAAO;SACR,CAAC;KACH,CAAA;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,IAAI,uCAAsB,EAAE,CAAC,CAAA;IAC5C,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AA5BY,QAAA,iBAAiB,qBA4B7B;AAEM,MAAM,mBAAmB,GAAG,CAAC,EAAE,gBAAgB,GAAG,IAAI,EAAE,aAAa,GAAG,EAAmB,EAAE,KAAK,GAAG,KAAK,KAAK,EAAE,EAAE,EAAE,CAAC;IAC3H,yDAAyD;IACzD,IAAI,+BAAY,CAAC;QACf,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,CAAC,KAAK;QACvB,aAAa,EAAE;YACb,GAAG,EAAE,KAAK;YACV,SAAS,EAAE,gBAAgB;YAC3B,QAAQ,EAAE;gBACR,QAAQ,EAAE,KAAK;aAChB;YACD,WAAW,EAAE,IAAI;YACjB,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE;gBACN,WAAW,EAAE,IAAI;gBACjB,eAAe,EAAE,IAAI;aACtB;YACD,GAAG,aAAa;SACjB;KACF,CAAC;CACH,CAAA;AApBY,QAAA,mBAAmB,uBAoB/B","sourcesContent":["import path from 'path'\nimport { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'\nimport CssMinimizerPlugin from 'css-minimizer-webpack-plugin'\nimport MiniCssExtractPlugin from 'mini-css-extract-plugin'\nimport TerserPlugin from 'terser-webpack-plugin'\nimport { MinifyOptions } from 'terser'\nimport HtmlWebpackPlugin from 'html-webpack-plugin'\nimport fs from 'fs'\nimport { type WebpackPluginInstance } from 'webpack'\n\nimport HtmlInlineSourcePlugin from './HtmlWebpackInlineSourcePlugin'\n\nexport const cssConfigFactory = ({\n filename = '[name]-[chunkhash].css',\n cssnanoOptions = {},\n}: { filename?: string; cssnanoOptions?: any } = {}) => {\n return [\n new MiniCssExtractPlugin({\n filename,\n }),\n new CssMinimizerPlugin({\n test: /\\.css$/g,\n minimizerOptions: {\n preset: ['advanced'],\n ...cssnanoOptions,\n },\n minify: CssMinimizerPlugin.cssnanoMinify,\n }),\n ]\n}\n\nexport const bundleAnalyzerConfigFactory = (extraConfig: BundleAnalyzerPlugin.Options = {}) => {\n return [\n new BundleAnalyzerPlugin({\n analyzerMode: 'static',\n reportFilename: './reports/bundle-analysis.html',\n openAnalyzer: false,\n ...extraConfig,\n }),\n ]\n}\n\nexport const htmlConfigFactory = ({ html = {}, embed }: { embed?: boolean; html?: Partial<HtmlWebpackPlugin.Options> } = {}) => {\n const template = html.template ?? path.join(process.cwd(), 'template.html')\n const templateExists = fs.existsSync(template)\n const templateContent = `<!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"UTF-8\" />\n </head>\n <body>\n <div id=\"root\"></div>\n </body>\n </html>`\n const favicon = html.favicon ? (path.isAbsolute(html.favicon) ? html.favicon : path.join(process.cwd(), html.favicon)) : undefined\n const plugins: WebpackPluginInstance[] = [\n new HtmlWebpackPlugin({\n inject: 'body',\n lang: 'en-US',\n ...(templateExists ? { template } : { templateContent }),\n ...html,\n favicon,\n }),\n ]\n\n if (embed) {\n plugins.push(new HtmlInlineSourcePlugin())\n }\n\n return plugins\n}\n\nexport const terserConfigFactory = ({ enableSourcemaps = true, terserOptions = {} as MinifyOptions, embed = false } = {}) => [\n /* eslint-disable @typescript-eslint/naming-convention */\n new TerserPlugin({\n parallel: true,\n extractComments: !embed,\n terserOptions: {\n ie8: false,\n sourceMap: enableSourcemaps,\n compress: {\n evaluate: false,\n },\n keep_fnames: true,\n keep_classnames: true,\n mangle: {\n keep_fnames: true,\n keep_classnames: true,\n },\n ...terserOptions,\n },\n }),\n]\n"]}