@enhanced-dom/webpack 0.4.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.
- package/NOTICE.md +11 -0
- package/compiler.helpers.d.ts +3 -3
- package/compiler.helpers.js +10 -19
- package/configs/index.d.ts +38 -2
- package/configs/index.js +9 -16
- package/index.d.ts +5 -5
- package/index.js +6 -40
- package/loaders/WebcomponentStyleLoader.d.ts +12 -5
- package/loaders/WebcomponentStyleLoader.js +77 -41
- package/loaders/index.d.ts +51 -10
- package/loaders/index.js +34 -35
- package/loaders/resolveWebcomponentStyleLoaderPath.cjs +9 -0
- package/loaders/resolveWebcomponentStyleLoaderPath.d.cts +2 -0
- package/package.json +13 -12
- package/plugins/DefineEnvPlugin.d.ts +7 -0
- package/plugins/DefineEnvPlugin.js +17 -0
- package/plugins/HtmlInlineSourcePlugin.d.ts +22 -0
- package/plugins/HtmlInlineSourcePlugin.js +236 -0
- package/plugins/SelfDecompressingHtmlPlugin.d.ts +10 -0
- package/plugins/SelfDecompressingHtmlPlugin.js +119 -0
- package/plugins/formatThirdPartyNotices.d.ts +5 -0
- package/plugins/formatThirdPartyNotices.js +11 -0
- package/plugins/index.d.ts +17 -5
- package/plugins/index.js +63 -34
- package/compiler.helpers.js.map +0 -1
- package/configs/index.js.map +0 -1
- package/index.js.map +0 -1
- package/loaders/WebcomponentStyleLoader.js.map +0 -1
- package/loaders/index.js.map +0 -1
- package/plugins/HtmlWebpackInlineSourcePlugin.d.ts +0 -2
- package/plugins/HtmlWebpackInlineSourcePlugin.js +0 -55
- package/plugins/HtmlWebpackInlineSourcePlugin.js.map +0 -1
- package/plugins/index.js.map +0 -1
package/loaders/index.js
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
|
2
|
+
import enhancedResolve from 'enhanced-resolve';
|
|
3
|
+
import codeImport from 'remark-code-import';
|
|
4
|
+
import imageUnwrap from 'rehype-unwrap-images';
|
|
5
|
+
import imageImport from 'remark-embed-images';
|
|
6
|
+
// Resolving `./WebcomponentStyleLoader`'s absolute path needs `require.resolve` (extensionless, so it
|
|
7
|
+
// finds the `.ts` source under ts-jest and the compiled `.js` in the built output alike) - delegated
|
|
8
|
+
// to a plain `.cjs` sibling since this file's own build output has no `require` at all (see that
|
|
9
|
+
// file for why).
|
|
10
|
+
import WebcomponentStyleLoader from './resolveWebcomponentStyleLoaderPath.cjs';
|
|
11
|
+
// `enhanced-resolve`'s named exports aren't statically analyzable by Node's CJS/ESM interop
|
|
12
|
+
// (cjs-module-lexer) at runtime, so `import { create } from 'enhanced-resolve'` throws
|
|
13
|
+
// `SyntaxError: Named export 'create' not found` for real ESM consumers - destructuring off the
|
|
14
|
+
// default import is the Node-recommended workaround.
|
|
15
|
+
const { create: createEnhancedResolver } = enhancedResolve;
|
|
16
|
+
export const styleConfigFactory = ({ raw = false, extract = false, sourceMap = false, typedStyles = false, modules = undefined, parser = undefined, aliases = {}, } = {}) => {
|
|
15
17
|
const loaders = [];
|
|
16
18
|
if (raw) {
|
|
17
19
|
loaders.push({
|
|
@@ -26,7 +28,7 @@ const styleConfigFactory = ({ raw = false, extract = false, sourceMap = false, t
|
|
|
26
28
|
else {
|
|
27
29
|
if (extract) {
|
|
28
30
|
loaders.push({
|
|
29
|
-
loader:
|
|
31
|
+
loader: MiniCssExtractPlugin.loader,
|
|
30
32
|
options: {
|
|
31
33
|
publicPath: './',
|
|
32
34
|
},
|
|
@@ -54,11 +56,10 @@ const styleConfigFactory = ({ raw = false, extract = false, sourceMap = false, t
|
|
|
54
56
|
? {
|
|
55
57
|
esModule: true,
|
|
56
58
|
modules: {
|
|
57
|
-
localIdentName:
|
|
59
|
+
localIdentName: modules?.localIdentName ?? '[local]_[hash:base64:5]',
|
|
58
60
|
getLocalIdent: (loaderContext, _, localName) => {
|
|
59
|
-
var _a;
|
|
60
61
|
const { resourcePath } = loaderContext;
|
|
61
|
-
const mappings =
|
|
62
|
+
const mappings = modules?.mappings ?? [];
|
|
62
63
|
const mapping = mappings.find(({ filter }) => resourcePath.includes(filter));
|
|
63
64
|
if (!mapping) {
|
|
64
65
|
return undefined; // this will trigger the default css-loader getLocalIdent function
|
|
@@ -78,6 +79,11 @@ const styleConfigFactory = ({ raw = false, extract = false, sourceMap = false, t
|
|
|
78
79
|
loader: 'resolve-url-loader',
|
|
79
80
|
};
|
|
80
81
|
loaders.push(resolveUrlLoader);
|
|
82
|
+
const resolveCssImport = createEnhancedResolver.sync({
|
|
83
|
+
extensions: ['.css'],
|
|
84
|
+
modules: ['node_modules'],
|
|
85
|
+
alias: aliases,
|
|
86
|
+
});
|
|
81
87
|
const postcssLoader = {
|
|
82
88
|
loader: 'postcss-loader',
|
|
83
89
|
options: {
|
|
@@ -90,9 +96,7 @@ const styleConfigFactory = ({ raw = false, extract = false, sourceMap = false, t
|
|
|
90
96
|
[
|
|
91
97
|
'postcss-import',
|
|
92
98
|
{
|
|
93
|
-
resolve: (
|
|
94
|
-
alias: aliases,
|
|
95
|
-
}),
|
|
99
|
+
resolve: (id, basedir) => resolveCssImport(basedir, id),
|
|
96
100
|
modules: ['./node_modules', 'node_modules'],
|
|
97
101
|
},
|
|
98
102
|
],
|
|
@@ -111,32 +115,28 @@ const styleConfigFactory = ({ raw = false, extract = false, sourceMap = false, t
|
|
|
111
115
|
loaders.push(postcssLoader);
|
|
112
116
|
return loaders;
|
|
113
117
|
};
|
|
114
|
-
|
|
115
|
-
const nullConfigFactory = ({ rules = [] } = {}) => {
|
|
118
|
+
export const nullConfigFactory = ({ rules = [] } = {}) => {
|
|
116
119
|
return rules.map((rule) => ({
|
|
117
120
|
test: rule,
|
|
118
121
|
use: 'null-loader',
|
|
119
122
|
enforce: 'post',
|
|
120
123
|
}));
|
|
121
124
|
};
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
const
|
|
126
|
-
exports.assetExtensions = assetExtensions;
|
|
127
|
-
const babelConfigFactory = ({ babel = undefined }) => {
|
|
125
|
+
export const fontExtensions = ['ttf', 'eot', 'woff', 'woff2'];
|
|
126
|
+
export const imageExtensions = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'ico'];
|
|
127
|
+
export const assetExtensions = (extensions = [...imageExtensions, ...fontExtensions]) => new RegExp(`\\.(${extensions.join('|')})(\\?.*$|$)?$`);
|
|
128
|
+
export const babelConfigFactory = ({ babel = undefined }) => {
|
|
128
129
|
const loaders = [{ loader: 'babel-loader', options: babel }];
|
|
129
130
|
return loaders;
|
|
130
131
|
};
|
|
131
|
-
|
|
132
|
-
const markdownConfigFactory = ({ babel, remark = [], rehype = [], useProvider = false, } = {}) => {
|
|
132
|
+
export const markdownConfigFactory = ({ babel, remark = [], rehype = [], useProvider = false, } = {}) => {
|
|
133
133
|
const loaders = [];
|
|
134
134
|
if (babel) {
|
|
135
|
-
loaders.push(...
|
|
135
|
+
loaders.push(...babelConfigFactory({ babel }));
|
|
136
136
|
loaders.push({
|
|
137
137
|
loader: '@mdx-js/loader',
|
|
138
138
|
options: {
|
|
139
|
-
remarkPlugins: [
|
|
139
|
+
remarkPlugins: [codeImport, imageImport, imageUnwrap, ...remark],
|
|
140
140
|
rehypePlugins: rehype,
|
|
141
141
|
providerImportSource: useProvider ? '@mdx-js/react' : undefined,
|
|
142
142
|
},
|
|
@@ -151,5 +151,4 @@ const markdownConfigFactory = ({ babel, remark = [], rehype = [], useProvider =
|
|
|
151
151
|
}
|
|
152
152
|
return loaders;
|
|
153
153
|
};
|
|
154
|
-
exports.markdownConfigFactory = markdownConfigFactory;
|
|
155
|
-
//# sourceMappingURL=index.js.map
|
|
154
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG9hZGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLG9CQUFvQixNQUFNLHlCQUF5QixDQUFBO0FBQzFELE9BQU8sZUFBZSxNQUFNLGtCQUFrQixDQUFBO0FBQzlDLE9BQU8sVUFBVSxNQUFNLG9CQUFvQixDQUFBO0FBQzNDLE9BQU8sV0FBVyxNQUFNLHNCQUFzQixDQUFBO0FBQzlDLE9BQU8sV0FBVyxNQUFNLHFCQUFxQixDQUFBO0FBRTdDLHNHQUFzRztBQUN0RyxxR0FBcUc7QUFDckcsaUdBQWlHO0FBQ2pHLGlCQUFpQjtBQUNqQixPQUFPLHVCQUF1QixNQUFNLDBDQUEwQyxDQUFBO0FBRTlFLDRGQUE0RjtBQUM1Rix1RkFBdUY7QUFDdkYsZ0dBQWdHO0FBQ2hHLHFEQUFxRDtBQUNyRCxNQUFNLEVBQUUsTUFBTSxFQUFFLHNCQUFzQixFQUFFLEdBQUcsZUFBZSxDQUFBO0FBRTFELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsRUFDakMsR0FBRyxHQUFHLEtBQUssRUFDWCxPQUFPLEdBQUcsS0FBSyxFQUNmLFNBQVMsR0FBRyxLQUFLLEVBQ2pCLFdBQVcsR0FBRyxLQUFLLEVBQ25CLE9BQU8sR0FBRyxTQUdHLEVBQ2IsTUFBTSxHQUFHLFNBQW1ELEVBQzVELE9BQU8sR0FBRyxFQUE0QixNQUNwQyxFQUFFLEVBQUUsRUFBRTtJQUNSLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtJQUVsQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNYLE1BQU0sRUFBRSx1QkFBdUI7WUFDL0IsT0FBTyxFQUFFO2dCQUNQLEdBQUcsRUFBRSxJQUFJO2dCQUNULElBQUksRUFBRSxPQUFPO2dCQUNiLE9BQU8sRUFBRSxXQUFXO2FBQ3JCO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztTQUFNLENBQUM7UUFDTixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDWCxNQUFNLEVBQUUsb0JBQW9CLENBQUMsTUFBTTtnQkFDbkMsT0FBTyxFQUFFO29CQUNQLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjthQUNGLENBQUMsQ0FBQTtRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFBO1FBQzFDLENBQUM7UUFFRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLHVCQUF1QjtnQkFDL0IsT0FBTyxFQUFFO29CQUNQLEdBQUcsRUFBRSxLQUFLO29CQUNWLElBQUksRUFBRSxLQUFLO29CQUNYLE9BQU8sRUFBRSxJQUFJO2lCQUNkO2FBQ0YsQ0FBQyxDQUFBO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRztRQUNoQixNQUFNLEVBQUUsWUFBWTtRQUNwQixPQUFPLEVBQUU7WUFDUCxTQUFTO1lBQ1QsR0FBRyxDQUFDLE9BQU8sSUFBSSxXQUFXO2dCQUN4QixDQUFDLENBQUM7b0JBQ0UsUUFBUSxFQUFFLElBQUk7b0JBQ2QsT0FBTyxFQUFFO3dCQUNQLGNBQWMsRUFBRSxPQUFPLEVBQUUsY0FBYyxJQUFJLHlCQUF5Qjt3QkFDcEUsYUFBYSxFQUFFLENBQUMsYUFBdUMsRUFBRSxDQUFNLEVBQUUsU0FBaUIsRUFBRSxFQUFFOzRCQUNwRixNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsYUFBYSxDQUFBOzRCQUN0QyxNQUFNLFFBQVEsR0FBRyxPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQTs0QkFDeEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTs0QkFDNUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dDQUNiLE9BQU8sU0FBUyxDQUFBLENBQUMsa0VBQWtFOzRCQUNyRixDQUFDOzRCQUNELE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTt3QkFDckMsQ0FBQzt3QkFDRCxzQkFBc0IsRUFBRSxlQUFlO3dCQUN2QyxXQUFXLEVBQUUsSUFBSTtxQkFDbEI7b0JBQ0QsU0FBUztpQkFDVjtnQkFDSCxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDeEI7S0FDRixDQUFBO0lBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUV2QixNQUFNLGdCQUFnQixHQUFHO1FBQ3ZCLE1BQU0sRUFBRSxvQkFBb0I7S0FDN0IsQ0FBQTtJQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUU5QixNQUFNLGdCQUFnQixHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQztRQUNuRCxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDcEIsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDO1FBQ3pCLEtBQUssRUFBRSxPQUFPO0tBQ2YsQ0FBQyxDQUFBO0lBRUYsTUFBTSxhQUFhLEdBQUc7UUFDcEIsTUFBTSxFQUFFLGdCQUFnQjtRQUN4QixPQUFPLEVBQUU7WUFDUCxTQUFTLEVBQUUsSUFBSTtZQUNmLGNBQWMsRUFBRTtnQkFDZCxNQUFNO2dCQUNOLE9BQU8sRUFBRTtvQkFDUCw4QkFBOEI7b0JBQzlCLDBCQUEwQjtvQkFDMUI7d0JBQ0UsZ0JBQWdCO3dCQUNoQjs0QkFDRSxPQUFPLEVBQUUsQ0FBQyxFQUFVLEVBQUUsT0FBZSxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDOzRCQUN2RSxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUM7eUJBQzVDO3FCQUNGO29CQUNELGdCQUFnQjtvQkFDaEIsa0JBQWtCO29CQUNsQjt3QkFDRSxvQkFBb0I7d0JBQ3BCOzRCQUNFLEtBQUssRUFBRSxDQUFDO3lCQUNUO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtLQUNGLENBQUE7SUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBRTNCLE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBYyxLQUFLLEVBQUUsRUFBRSxFQUFFO0lBQ25FLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxQixJQUFJLEVBQUUsSUFBSTtRQUNWLEdBQUcsRUFBRSxhQUFhO1FBQ2xCLE9BQU8sRUFBRSxNQUFNO0tBQ2hCLENBQUMsQ0FBQyxDQUFBO0FBQ0wsQ0FBQyxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFDN0QsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUMxRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxlQUFlLEVBQUUsR0FBRyxjQUFjLENBQWEsRUFBRSxFQUFFLENBQ2xHLElBQUksTUFBTSxDQUFDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUE7QUFFeEQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxTQUFnQixFQUFFLEVBQUUsRUFBRTtJQUNqRSxNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUM1RCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEVBQ3BDLEtBQUssRUFDTCxNQUFNLEdBQUcsRUFBRSxFQUNYLE1BQU0sR0FBRyxFQUFFLEVBQ1gsV0FBVyxHQUFHLEtBQUssTUFDdUQsRUFBRSxFQUFFLEVBQUU7SUFDaEYsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBO0lBRWxCLElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNYLE1BQU0sRUFBRSxnQkFBZ0I7WUFDeEIsT0FBTyxFQUFFO2dCQUNQLGFBQWEsRUFBRSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDO2dCQUNoRSxhQUFhLEVBQUUsTUFBTTtnQkFDckIsb0JBQW9CLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDaEU7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxJQUFJLENBQ1Y7WUFDRSxNQUFNLEVBQUUsYUFBYTtTQUN0QixFQUNEO1lBQ0UsTUFBTSxFQUFFLGlCQUFpQjtTQUMxQixDQUNGLENBQUE7SUFDSCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1pbmlDc3NFeHRyYWN0UGx1Z2luIGZyb20gJ21pbmktY3NzLWV4dHJhY3QtcGx1Z2luJ1xuaW1wb3J0IGVuaGFuY2VkUmVzb2x2ZSBmcm9tICdlbmhhbmNlZC1yZXNvbHZlJ1xuaW1wb3J0IGNvZGVJbXBvcnQgZnJvbSAncmVtYXJrLWNvZGUtaW1wb3J0J1xuaW1wb3J0IGltYWdlVW53cmFwIGZyb20gJ3JlaHlwZS11bndyYXAtaW1hZ2VzJ1xuaW1wb3J0IGltYWdlSW1wb3J0IGZyb20gJ3JlbWFyay1lbWJlZC1pbWFnZXMnXG5cbi8vIFJlc29sdmluZyBgLi9XZWJjb21wb25lbnRTdHlsZUxvYWRlcmAncyBhYnNvbHV0ZSBwYXRoIG5lZWRzIGByZXF1aXJlLnJlc29sdmVgIChleHRlbnNpb25sZXNzLCBzbyBpdFxuLy8gZmluZHMgdGhlIGAudHNgIHNvdXJjZSB1bmRlciB0cy1qZXN0IGFuZCB0aGUgY29tcGlsZWQgYC5qc2AgaW4gdGhlIGJ1aWx0IG91dHB1dCBhbGlrZSkgLSBkZWxlZ2F0ZWRcbi8vIHRvIGEgcGxhaW4gYC5janNgIHNpYmxpbmcgc2luY2UgdGhpcyBmaWxlJ3Mgb3duIGJ1aWxkIG91dHB1dCBoYXMgbm8gYHJlcXVpcmVgIGF0IGFsbCAoc2VlIHRoYXRcbi8vIGZpbGUgZm9yIHdoeSkuXG5pbXBvcnQgV2ViY29tcG9uZW50U3R5bGVMb2FkZXIgZnJvbSAnLi9yZXNvbHZlV2ViY29tcG9uZW50U3R5bGVMb2FkZXJQYXRoLmNqcydcblxuLy8gYGVuaGFuY2VkLXJlc29sdmVgJ3MgbmFtZWQgZXhwb3J0cyBhcmVuJ3Qgc3RhdGljYWxseSBhbmFseXphYmxlIGJ5IE5vZGUncyBDSlMvRVNNIGludGVyb3Bcbi8vIChjanMtbW9kdWxlLWxleGVyKSBhdCBydW50aW1lLCBzbyBgaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAnZW5oYW5jZWQtcmVzb2x2ZSdgIHRocm93c1xuLy8gYFN5bnRheEVycm9yOiBOYW1lZCBleHBvcnQgJ2NyZWF0ZScgbm90IGZvdW5kYCBmb3IgcmVhbCBFU00gY29uc3VtZXJzIC0gZGVzdHJ1Y3R1cmluZyBvZmYgdGhlXG4vLyBkZWZhdWx0IGltcG9ydCBpcyB0aGUgTm9kZS1yZWNvbW1lbmRlZCB3b3JrYXJvdW5kLlxuY29uc3QgeyBjcmVhdGU6IGNyZWF0ZUVuaGFuY2VkUmVzb2x2ZXIgfSA9IGVuaGFuY2VkUmVzb2x2ZVxuXG5leHBvcnQgY29uc3Qgc3R5bGVDb25maWdGYWN0b3J5ID0gKHtcbiAgcmF3ID0gZmFsc2UsXG4gIGV4dHJhY3QgPSBmYWxzZSxcbiAgc291cmNlTWFwID0gZmFsc2UsXG4gIHR5cGVkU3R5bGVzID0gZmFsc2UsXG4gIG1vZHVsZXMgPSB1bmRlZmluZWQgYXNcbiAgICB8IHsgbG9jYWxJZGVudE5hbWU/OiBzdHJpbmc7IG1hcHBpbmdzPzogeyBmaWx0ZXI6IHN0cmluZzsgdHJhbnNmb3JtOiAocDogc3RyaW5nKSA9PiBzdHJpbmcgfVtdIH1cbiAgICB8IChib29sZWFuICYgeyBsb2NhbElkZW50TmFtZT86IG5ldmVyOyBtYXBwaW5ncz86IG5ldmVyIH0pXG4gICAgfCB1bmRlZmluZWQsXG4gIHBhcnNlciA9IHVuZGVmaW5lZCBhcyAncG9zdGNzcycgfCAncG9zdGNzcy1zY3NzJyB8IHVuZGVmaW5lZCxcbiAgYWxpYXNlcyA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG59ID0ge30pID0+IHtcbiAgY29uc3QgbG9hZGVycyA9IFtdXG5cbiAgaWYgKHJhdykge1xuICAgIGxvYWRlcnMucHVzaCh7XG4gICAgICBsb2FkZXI6IFdlYmNvbXBvbmVudFN0eWxlTG9hZGVyLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICByYXc6IHRydWUsXG4gICAgICAgIGVtaXQ6IGV4dHJhY3QsXG4gICAgICAgIHR5cGluZ3M6IHR5cGVkU3R5bGVzLFxuICAgICAgfSxcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIGlmIChleHRyYWN0KSB7XG4gICAgICBsb2FkZXJzLnB1c2goe1xuICAgICAgICBsb2FkZXI6IE1pbmlDc3NFeHRyYWN0UGx1Z2luLmxvYWRlcixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHB1YmxpY1BhdGg6ICcuLycsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkZXJzLnB1c2goeyBsb2FkZXI6ICdzdHlsZS1sb2FkZXInIH0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVkU3R5bGVzKSB7XG4gICAgICBsb2FkZXJzLnB1c2goe1xuICAgICAgICBsb2FkZXI6IFdlYmNvbXBvbmVudFN0eWxlTG9hZGVyLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcmF3OiBmYWxzZSxcbiAgICAgICAgICBlbWl0OiBmYWxzZSxcbiAgICAgICAgICB0eXBpbmdzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBjc3NMb2FkZXIgPSB7XG4gICAgbG9hZGVyOiAnY3NzLWxvYWRlcicsXG4gICAgb3B0aW9uczoge1xuICAgICAgc291cmNlTWFwLFxuICAgICAgLi4uKG1vZHVsZXMgfHwgdHlwZWRTdHlsZXNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBlc01vZHVsZTogdHJ1ZSxcbiAgICAgICAgICAgIG1vZHVsZXM6IHtcbiAgICAgICAgICAgICAgbG9jYWxJZGVudE5hbWU6IG1vZHVsZXM/LmxvY2FsSWRlbnROYW1lID8/ICdbbG9jYWxdX1toYXNoOmJhc2U2NDo1XScsXG4gICAgICAgICAgICAgIGdldExvY2FsSWRlbnQ6IChsb2FkZXJDb250ZXh0OiB7IHJlc291cmNlUGF0aDogc3RyaW5nIH0sIF86IGFueSwgbG9jYWxOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHJlc291cmNlUGF0aCB9ID0gbG9hZGVyQ29udGV4dFxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBpbmdzID0gbW9kdWxlcz8ubWFwcGluZ3MgPz8gW11cbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwaW5nID0gbWFwcGluZ3MuZmluZCgoeyBmaWx0ZXIgfSkgPT4gcmVzb3VyY2VQYXRoLmluY2x1ZGVzKGZpbHRlcikpXG4gICAgICAgICAgICAgICAgaWYgKCFtYXBwaW5nKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkIC8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBkZWZhdWx0IGNzcy1sb2FkZXIgZ2V0TG9jYWxJZGVudCBmdW5jdGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGluZy50cmFuc2Zvcm0obG9jYWxOYW1lKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBleHBvcnRMb2NhbHNDb252ZW50aW9uOiAnY2FtZWxDYXNlT25seScsXG4gICAgICAgICAgICAgIG5hbWVkRXhwb3J0OiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNvdXJjZU1hcCxcbiAgICAgICAgICB9XG4gICAgICAgIDogeyBtb2R1bGVzOiBmYWxzZSB9KSxcbiAgICB9LFxuICB9XG5cbiAgbG9hZGVycy5wdXNoKGNzc0xvYWRlcilcblxuICBjb25zdCByZXNvbHZlVXJsTG9hZGVyID0ge1xuICAgIGxvYWRlcjogJ3Jlc29sdmUtdXJsLWxvYWRlcicsXG4gIH1cblxuICBsb2FkZXJzLnB1c2gocmVzb2x2ZVVybExvYWRlcilcblxuICBjb25zdCByZXNvbHZlQ3NzSW1wb3J0ID0gY3JlYXRlRW5oYW5jZWRSZXNvbHZlci5zeW5jKHtcbiAgICBleHRlbnNpb25zOiBbJy5jc3MnXSxcbiAgICBtb2R1bGVzOiBbJ25vZGVfbW9kdWxlcyddLFxuICAgIGFsaWFzOiBhbGlhc2VzLFxuICB9KVxuXG4gIGNvbnN0IHBvc3Rjc3NMb2FkZXIgPSB7XG4gICAgbG9hZGVyOiAncG9zdGNzcy1sb2FkZXInLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICAgIHBvc3Rjc3NPcHRpb25zOiB7XG4gICAgICAgIHBhcnNlcixcbiAgICAgICAgcGx1Z2luczogW1xuICAgICAgICAgICdwb3N0Y3NzLW5vcm1hbGl6ZS13aGl0ZXNwYWNlJyxcbiAgICAgICAgICAncG9zdGNzcy1kaXNjYXJkLWNvbW1lbnRzJyxcbiAgICAgICAgICBbXG4gICAgICAgICAgICAncG9zdGNzcy1pbXBvcnQnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICByZXNvbHZlOiAoaWQ6IHN0cmluZywgYmFzZWRpcjogc3RyaW5nKSA9PiByZXNvbHZlQ3NzSW1wb3J0KGJhc2VkaXIsIGlkKSxcbiAgICAgICAgICAgICAgbW9kdWxlczogWycuL25vZGVfbW9kdWxlcycsICdub2RlX21vZHVsZXMnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICAncG9zdGNzcy1uZXN0ZWQnLFxuICAgICAgICAgIC8vICdhdXRvcHJlZml4ZXInLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgICdwb3N0Y3NzLXByZXNldC1lbnYnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGFnZTogMyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfVxuXG4gIGxvYWRlcnMucHVzaChwb3N0Y3NzTG9hZGVyKVxuXG4gIHJldHVybiBsb2FkZXJzXG59XG5cbmV4cG9ydCBjb25zdCBudWxsQ29uZmlnRmFjdG9yeSA9ICh7IHJ1bGVzID0gW10gYXMgUmVnRXhwW10gfSA9IHt9KSA9PiB7XG4gIHJldHVybiBydWxlcy5tYXAoKHJ1bGUpID0+ICh7XG4gICAgdGVzdDogcnVsZSxcbiAgICB1c2U6ICdudWxsLWxvYWRlcicsXG4gICAgZW5mb3JjZTogJ3Bvc3QnLFxuICB9KSlcbn1cblxuZXhwb3J0IGNvbnN0IGZvbnRFeHRlbnNpb25zID0gWyd0dGYnLCAnZW90JywgJ3dvZmYnLCAnd29mZjInXVxuZXhwb3J0IGNvbnN0IGltYWdlRXh0ZW5zaW9ucyA9IFsncG5nJywgJ2pwZycsICdqcGVnJywgJ2dpZicsICdzdmcnLCAnaWNvJ11cbmV4cG9ydCBjb25zdCBhc3NldEV4dGVuc2lvbnMgPSAoZXh0ZW5zaW9ucyA9IFsuLi5pbWFnZUV4dGVuc2lvbnMsIC4uLmZvbnRFeHRlbnNpb25zXSBhcyBzdHJpbmdbXSkgPT5cbiAgbmV3IFJlZ0V4cChgXFxcXC4oJHtleHRlbnNpb25zLmpvaW4oJ3wnKX0pKFxcXFw/LiokfCQpPyRgKVxuXG5leHBvcnQgY29uc3QgYmFiZWxDb25maWdGYWN0b3J5ID0gKHsgYmFiZWwgPSB1bmRlZmluZWQgYXMgYW55IH0pID0+IHtcbiAgY29uc3QgbG9hZGVycyA9IFt7IGxvYWRlcjogJ2JhYmVsLWxvYWRlcicsIG9wdGlvbnM6IGJhYmVsIH1dXG4gIHJldHVybiBsb2FkZXJzXG59XG5cbmV4cG9ydCBjb25zdCBtYXJrZG93bkNvbmZpZ0ZhY3RvcnkgPSAoe1xuICBiYWJlbCxcbiAgcmVtYXJrID0gW10sXG4gIHJlaHlwZSA9IFtdLFxuICB1c2VQcm92aWRlciA9IGZhbHNlLFxufTogeyBiYWJlbD86IGFueTsgcmVtYXJrPzogYW55W107IHJlaHlwZT86IGFueVtdOyB1c2VQcm92aWRlcj86IGJvb2xlYW4gfSA9IHt9KSA9PiB7XG4gIGNvbnN0IGxvYWRlcnMgPSBbXVxuXG4gIGlmIChiYWJlbCkge1xuICAgIGxvYWRlcnMucHVzaCguLi5iYWJlbENvbmZpZ0ZhY3RvcnkoeyBiYWJlbCB9KSlcbiAgICBsb2FkZXJzLnB1c2goe1xuICAgICAgbG9hZGVyOiAnQG1keC1qcy9sb2FkZXInLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICByZW1hcmtQbHVnaW5zOiBbY29kZUltcG9ydCwgaW1hZ2VJbXBvcnQsIGltYWdlVW53cmFwLCAuLi5yZW1hcmtdLFxuICAgICAgICByZWh5cGVQbHVnaW5zOiByZWh5cGUsXG4gICAgICAgIHByb3ZpZGVySW1wb3J0U291cmNlOiB1c2VQcm92aWRlciA/ICdAbWR4LWpzL3JlYWN0JyA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBsb2FkZXJzLnB1c2goXG4gICAgICB7XG4gICAgICAgIGxvYWRlcjogJ2h0bWwtbG9hZGVyJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxvYWRlcjogJ21hcmtkb3duLWxvYWRlcicsXG4gICAgICB9LFxuICAgIClcbiAgfVxuICByZXR1cm4gbG9hZGVyc1xufVxuIl19
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Plain CommonJS on purpose: `require.resolve` here needs to resolve `./WebcomponentStyleLoader`
|
|
2
|
+
// extensionlessly in both environments this project runs in - against the `.ts` source (ts-jest
|
|
3
|
+
// registers a `.ts` require extension, and this file always runs as real CJS regardless of the
|
|
4
|
+
// enclosing package's `"type": "module"`) and, in the built output, against the compiled `.js`
|
|
5
|
+
// (Node's own default-extension lookup in `require.resolve`, no registration needed). A `.ts` file
|
|
6
|
+
// can't do this itself: this project's `module: "preserve"` setting means the ESM build output has
|
|
7
|
+
// no `require` at all, and the only ESM-native alternative (`import.meta.url`) is TS-restricted
|
|
8
|
+
// under "preserve".
|
|
9
|
+
module.exports = require.resolve('./WebcomponentStyleLoader')
|
package/package.json
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enhanced-dom/webpack",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Helpers for webpack configuration",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"repository": "https://github.com/enhanced-dom/webpack.git",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"author": "CD9B4A105290E17E0948E021DF4105107C88693C59C0B891CCC08366C51AEA990902A6A156AC87D88A2FC41422A5E1C3C4071F251F19441C4516000EC25F87DF",
|
|
9
|
+
"type": "module",
|
|
9
10
|
"main": "index.js",
|
|
10
11
|
"dependencies": {
|
|
11
|
-
"@enhanced-dom/build": "
|
|
12
|
+
"@enhanced-dom/build": "^0.3.1",
|
|
12
13
|
"@mdx-js/loader": "^3.1.1",
|
|
13
|
-
"babel-loader": "^10.
|
|
14
|
+
"babel-loader": "^10.1.1",
|
|
14
15
|
"css-loader": "^7.1.2",
|
|
15
16
|
"cssnano-preset-advanced": "^7.0.10",
|
|
16
17
|
"html-inline-css-webpack-plugin": "^1.11.2",
|
|
17
18
|
"html-inline-script-webpack-plugin": "^3.2.1",
|
|
18
19
|
"html-loader": "^5.0.0",
|
|
19
|
-
"html-webpack-inline-source-plugin": "^0.0.10",
|
|
20
20
|
"html-webpack-plugin": "^5.6.0",
|
|
21
21
|
"ignore-emit-webpack-plugin": "^2.0.6",
|
|
22
22
|
"markdown-loader": "^8.0.0",
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
"mini-css-extract-plugin": "^2.8.0",
|
|
25
25
|
"null-loader": "^4.0.1",
|
|
26
26
|
"css-minimizer-webpack-plugin": "^8.0.0",
|
|
27
|
+
"enhanced-resolve": "^5.24.5",
|
|
27
28
|
"postcss": "^8.5.15",
|
|
28
29
|
"postcss-discard-comments": "^7.0.5",
|
|
29
30
|
"postcss-import": "^16.0.0",
|
|
30
|
-
"postcss-import-webpack-resolver": "^1.0.1",
|
|
31
31
|
"postcss-loader": "^8.2.0",
|
|
32
32
|
"postcss-nested": "^7.0.2",
|
|
33
33
|
"postcss-normalize-whitespace": "^7.0.1",
|
|
@@ -45,20 +45,21 @@
|
|
|
45
45
|
"webpack-bundle-analyzer": "^5.0.1",
|
|
46
46
|
"webpack-cli": "^6.0.1",
|
|
47
47
|
"webpack-dev-server": "^5.2.5",
|
|
48
|
+
"webpack-license-plugin": "^4.5.1",
|
|
48
49
|
"serve": "^14.2.5"
|
|
49
50
|
},
|
|
50
51
|
"devDependencies": {
|
|
51
|
-
"@enhanced-dom/
|
|
52
|
-
"@
|
|
53
|
-
"@
|
|
52
|
+
"@enhanced-dom/claude": "^0.3.1",
|
|
53
|
+
"@enhanced-dom/jest": "^0.3.0",
|
|
54
|
+
"@enhanced-dom/lint": "^0.4.2",
|
|
54
55
|
"@types/memory-fs": "^0.3.7",
|
|
56
|
+
"@types/node": "^22.20.5",
|
|
55
57
|
"@types/optimize-css-assets-webpack-plugin": "^5.0.8",
|
|
56
58
|
"@types/webpack": "^5.28.5",
|
|
57
|
-
"@types/webpack-bundle-analyzer": "^4.7.0"
|
|
58
|
-
"typescript": "^5.9.3"
|
|
59
|
+
"@types/webpack-bundle-analyzer": "^4.7.0"
|
|
59
60
|
},
|
|
60
61
|
"engines": {
|
|
61
|
-
"node": ">=
|
|
62
|
-
"npm": ">=
|
|
62
|
+
"node": ">=22.23.2",
|
|
63
|
+
"npm": ">=12"
|
|
63
64
|
}
|
|
64
65
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Compiler, type WebpackPluginInstance } from 'webpack';
|
|
2
|
+
declare class DefineEnvPlugin implements WebpackPluginInstance {
|
|
3
|
+
envVarNames: string[];
|
|
4
|
+
constructor(envVarNames: string[]);
|
|
5
|
+
apply(compiler: Compiler): void;
|
|
6
|
+
}
|
|
7
|
+
export default DefineEnvPlugin;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Delegates to the host compiler's own webpack.DefinePlugin (via compiler.webpack, not a direct
|
|
2
|
+
// `import { DefinePlugin } from 'webpack'`) - DefinePlugin hooks deep into the compiler's own
|
|
3
|
+
// Parser/ConstDependency internals, so constructing it from this package's own bundled webpack
|
|
4
|
+
// dependency could silently mismatch a different webpack instance/version the host project
|
|
5
|
+
// actually resolves. Same reasoning as HtmlInlineSourcePlugin's compiler.webpack.Compilation use.
|
|
6
|
+
class DefineEnvPlugin {
|
|
7
|
+
envVarNames;
|
|
8
|
+
constructor(envVarNames) {
|
|
9
|
+
this.envVarNames = envVarNames;
|
|
10
|
+
}
|
|
11
|
+
apply(compiler) {
|
|
12
|
+
const defines = this.envVarNames.reduce((acc, name) => ({ ...acc, [`process.env.${name}`]: JSON.stringify(process.env[name]) }), {});
|
|
13
|
+
new compiler.webpack.DefinePlugin(defines).apply(compiler);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export default DefineEnvPlugin;
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmaW5lRW52UGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbnMvRGVmaW5lRW52UGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLGdHQUFnRztBQUNoRyw4RkFBOEY7QUFDOUYsK0ZBQStGO0FBQy9GLDJGQUEyRjtBQUMzRixrR0FBa0c7QUFDbEcsTUFBTSxlQUFlO0lBQ25CLFdBQVcsQ0FBVTtJQUVyQixZQUFZLFdBQXFCO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBa0I7UUFDdEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQ3JDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDdkYsRUFBNEIsQ0FDN0IsQ0FBQTtRQUNELElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzVELENBQUM7Q0FDRjtBQUVELGVBQWUsZUFBZSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb21waWxlciwgdHlwZSBXZWJwYWNrUGx1Z2luSW5zdGFuY2UgfSBmcm9tICd3ZWJwYWNrJ1xuXG4vLyBEZWxlZ2F0ZXMgdG8gdGhlIGhvc3QgY29tcGlsZXIncyBvd24gd2VicGFjay5EZWZpbmVQbHVnaW4gKHZpYSBjb21waWxlci53ZWJwYWNrLCBub3QgYSBkaXJlY3Rcbi8vIGBpbXBvcnQgeyBEZWZpbmVQbHVnaW4gfSBmcm9tICd3ZWJwYWNrJ2ApIC0gRGVmaW5lUGx1Z2luIGhvb2tzIGRlZXAgaW50byB0aGUgY29tcGlsZXIncyBvd25cbi8vIFBhcnNlci9Db25zdERlcGVuZGVuY3kgaW50ZXJuYWxzLCBzbyBjb25zdHJ1Y3RpbmcgaXQgZnJvbSB0aGlzIHBhY2thZ2UncyBvd24gYnVuZGxlZCB3ZWJwYWNrXG4vLyBkZXBlbmRlbmN5IGNvdWxkIHNpbGVudGx5IG1pc21hdGNoIGEgZGlmZmVyZW50IHdlYnBhY2sgaW5zdGFuY2UvdmVyc2lvbiB0aGUgaG9zdCBwcm9qZWN0XG4vLyBhY3R1YWxseSByZXNvbHZlcy4gU2FtZSByZWFzb25pbmcgYXMgSHRtbElubGluZVNvdXJjZVBsdWdpbidzIGNvbXBpbGVyLndlYnBhY2suQ29tcGlsYXRpb24gdXNlLlxuY2xhc3MgRGVmaW5lRW52UGx1Z2luIGltcGxlbWVudHMgV2VicGFja1BsdWdpbkluc3RhbmNlIHtcbiAgZW52VmFyTmFtZXM6IHN0cmluZ1tdXG5cbiAgY29uc3RydWN0b3IoZW52VmFyTmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5lbnZWYXJOYW1lcyA9IGVudlZhck5hbWVzXG4gIH1cblxuICBhcHBseShjb21waWxlcjogQ29tcGlsZXIpIHtcbiAgICBjb25zdCBkZWZpbmVzID0gdGhpcy5lbnZWYXJOYW1lcy5yZWR1Y2UoXG4gICAgICAoYWNjLCBuYW1lKSA9PiAoeyAuLi5hY2MsIFtgcHJvY2Vzcy5lbnYuJHtuYW1lfWBdOiBKU09OLnN0cmluZ2lmeShwcm9jZXNzLmVudltuYW1lXSkgfSksXG4gICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIClcbiAgICBuZXcgY29tcGlsZXIud2VicGFjay5EZWZpbmVQbHVnaW4oZGVmaW5lcykuYXBwbHkoY29tcGlsZXIpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGVmaW5lRW52UGx1Z2luXG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Hooks, type HtmlTagObject } from 'html-webpack-plugin';
|
|
2
|
+
import { type AsyncSeriesWaterfallHook } from 'tapable';
|
|
3
|
+
import { type Chunk, type Compilation, type Compiler, type WebpackPluginInstance } from 'webpack';
|
|
4
|
+
type AsyncSeriesWaterfallHookDataType<T> = T extends AsyncSeriesWaterfallHook<infer R> ? R : never;
|
|
5
|
+
type TemplateExecutionDataType = AsyncSeriesWaterfallHookDataType<Hooks['afterTemplateExecution']>;
|
|
6
|
+
declare class HtmlInlineSourcePlugin implements WebpackPluginInstance {
|
|
7
|
+
assetsRegExp?: RegExp;
|
|
8
|
+
faviconPath?: string;
|
|
9
|
+
htmlAssetName?: string;
|
|
10
|
+
inlinedChunks?: Set<Chunk | string>;
|
|
11
|
+
additionalAssets?: {
|
|
12
|
+
pattern: RegExp;
|
|
13
|
+
wrapper: 'comment' | 'script';
|
|
14
|
+
container: 'head' | 'body' | 'footer';
|
|
15
|
+
}[];
|
|
16
|
+
resolveSourceMaps(compilation: Compilation, assetName: string, asset: Compilation['assets'][string]): string;
|
|
17
|
+
processTag(compilation: Compilation, regex: RegExp, tag: HtmlTagObject): HtmlTagObject;
|
|
18
|
+
processTags(compilation: Compilation, pluginData: TemplateExecutionDataType): TemplateExecutionDataType;
|
|
19
|
+
processAdditionalAssets(compilation: Compilation, html: string): string;
|
|
20
|
+
apply(compiler: Compiler): void;
|
|
21
|
+
}
|
|
22
|
+
export default HtmlInlineSourcePlugin;
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
// Ported from `escape-string-regexp` (inlined rather than taken as a dependency, since newer
|
|
4
|
+
// majors of these tiny sindresorhus utils are ESM-only).
|
|
5
|
+
// ATTRIBUTION: COPY | escape-string-regexp | Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com). MIT Licensed.
|
|
6
|
+
const escapeRegExp = (value) => value.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&');
|
|
7
|
+
// Ported from `slash` (same reasoning as escapeRegExp above).
|
|
8
|
+
// ATTRIBUTION: COPY | slash | Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com). MIT Licensed.
|
|
9
|
+
// eslint-disable-next-line no-control-regex
|
|
10
|
+
const toPosixPath = (value) => (/[^\x00-\x80]+/.test(value) ? value : value.replace(/\\/g, '/'));
|
|
11
|
+
// Ported from `source-map-url` (same reasoning as escapeRegExp above); only the lookup this
|
|
12
|
+
// plugin actually uses (`getFrom`) is kept.
|
|
13
|
+
// ATTRIBUTION: COPY | source-map-url | Copyright 2014 Simon Lydell. X11 ("MIT") Licensed.
|
|
14
|
+
const sourceMappingUrlRegExp = (() => {
|
|
15
|
+
const inner = `[#@] sourceMappingURL=([^\\s'"]*)`;
|
|
16
|
+
return new RegExp(`(?:/\\*(?:\\s*\r?\n(?://)?)?(?:${inner})\\s*\\*/|//(?:${inner}))\\s*`);
|
|
17
|
+
})();
|
|
18
|
+
const getSourceMappingUrl = (code) => {
|
|
19
|
+
const match = code.match(sourceMappingUrlRegExp);
|
|
20
|
+
return match ? match[1] || match[2] || '' : null;
|
|
21
|
+
};
|
|
22
|
+
// Inserts immediately before the real closing tag - found by taking the LAST match of
|
|
23
|
+
// `</tagName>` in the document, not the first. An inlined <script>'s own source can legitimately
|
|
24
|
+
// contain that same substring as plain text (e.g. an embedded HTML template string inside a
|
|
25
|
+
// Worker's source, unrelated to actual document structure) well before the document's real
|
|
26
|
+
// closing tag; matching the first occurrence would splice the insertion into the middle of that
|
|
27
|
+
// script's text instead of after it, corrupting the script the browser was supposed to run.
|
|
28
|
+
const insertBeforeClosingTag = (html, tagName, insertion) => {
|
|
29
|
+
const closingTagRegExp = new RegExp(`</${tagName}\\s*>`, 'gi');
|
|
30
|
+
let lastMatch = null;
|
|
31
|
+
let match;
|
|
32
|
+
while ((match = closingTagRegExp.exec(html))) {
|
|
33
|
+
lastMatch = match;
|
|
34
|
+
}
|
|
35
|
+
return lastMatch ? `${html.slice(0, lastMatch.index)}${insertion}${html.slice(lastMatch.index)}` : `${html}${insertion}`;
|
|
36
|
+
};
|
|
37
|
+
const buildAdditionalAssetMarkup = (wrapper, assetName, encoded) => {
|
|
38
|
+
if (wrapper === 'comment') {
|
|
39
|
+
return `<!--data-asset-name="${assetName}" data-encoding="base64" ${encoded}-->`;
|
|
40
|
+
}
|
|
41
|
+
return `<script type="application/octet-stream" data-asset-name="${assetName}" data-encoding="base64">${encoded}</script>`;
|
|
42
|
+
};
|
|
43
|
+
class HtmlInlineSourcePlugin {
|
|
44
|
+
assetsRegExp;
|
|
45
|
+
faviconPath;
|
|
46
|
+
htmlAssetName;
|
|
47
|
+
inlinedChunks;
|
|
48
|
+
additionalAssets;
|
|
49
|
+
// Rewrites a `//# sourceMappingURL=...`/`/*# sourceMappingURL=... */` comment (if any) in an
|
|
50
|
+
// asset's source to be relative to the site root instead of the asset's own directory, since
|
|
51
|
+
// inlining moves the asset's content into the html document rather than serving it from
|
|
52
|
+
// alongside its sourcemap.
|
|
53
|
+
// Adapted from `html-webpack-inline-source-plugin`'s method of the same name.
|
|
54
|
+
// ATTRIBUTION: ADAPTATION | html-webpack-inline-source-plugin | Copyright (c) 2016 Jan Nicklas. MIT Licensed.
|
|
55
|
+
resolveSourceMaps(compilation, assetName, asset) {
|
|
56
|
+
const source = asset.source();
|
|
57
|
+
const out = compilation.outputOptions;
|
|
58
|
+
const assetPath = path.join(out.path, assetName);
|
|
59
|
+
const sourceText = typeof source === 'string' ? source : source.toString();
|
|
60
|
+
const mapUrlOriginal = getSourceMappingUrl(sourceText);
|
|
61
|
+
if (!mapUrlOriginal || mapUrlOriginal.indexOf('data:') === 0 || mapUrlOriginal.indexOf('/') === 0) {
|
|
62
|
+
return sourceText;
|
|
63
|
+
}
|
|
64
|
+
const assetDir = path.dirname(assetPath);
|
|
65
|
+
const mapPath = path.join(assetDir, mapUrlOriginal);
|
|
66
|
+
const mapPathRelative = path.relative(out.path, mapPath);
|
|
67
|
+
const publicPath = typeof out.publicPath === 'string' ? out.publicPath : '';
|
|
68
|
+
const mapUrlCorrected = toPosixPath(path.join(publicPath, mapPathRelative));
|
|
69
|
+
const regex = new RegExp(`${escapeRegExp(mapUrlOriginal)}(\\s*(?:\\*/)?\\s*$)`);
|
|
70
|
+
return sourceText.replace(regex, (_match, group) => `${mapUrlCorrected}${group}`);
|
|
71
|
+
}
|
|
72
|
+
// Adapted from `html-webpack-inline-source-plugin`'s method of the same name.
|
|
73
|
+
// ATTRIBUTION: ADAPTATION | html-webpack-inline-source-plugin | Copyright (c) 2016 Jan Nicklas. MIT Licensed.
|
|
74
|
+
processTag(compilation, regex, tag) {
|
|
75
|
+
let assetUrl;
|
|
76
|
+
let resultTag = tag;
|
|
77
|
+
if (tag.tagName === 'script' && regex.test(tag.attributes.src)) {
|
|
78
|
+
assetUrl = tag.attributes.src;
|
|
79
|
+
resultTag = { tagName: 'script', voidTag: false, meta: {}, attributes: { type: 'text/javascript' } };
|
|
80
|
+
}
|
|
81
|
+
else if (tag.tagName === 'link' && regex.test(tag.attributes.href)) {
|
|
82
|
+
assetUrl = tag.attributes.href;
|
|
83
|
+
resultTag = { tagName: 'style', voidTag: false, meta: {}, attributes: { type: 'text/css' } };
|
|
84
|
+
}
|
|
85
|
+
if (assetUrl) {
|
|
86
|
+
const publicUrlPrefix = typeof compilation.outputOptions.publicPath === 'string' ? compilation.outputOptions.publicPath : '';
|
|
87
|
+
const assetName = path.posix.relative(publicUrlPrefix, assetUrl);
|
|
88
|
+
const asset = compilation.assets[assetName];
|
|
89
|
+
if (!asset) {
|
|
90
|
+
return resultTag;
|
|
91
|
+
}
|
|
92
|
+
const updatedSource = this.resolveSourceMaps(compilation, assetName, asset);
|
|
93
|
+
resultTag.innerHTML = resultTag.tagName === 'script' ? updatedSource.replace(/(<)(\/script>)/g, '\\x3C$2') : updatedSource;
|
|
94
|
+
}
|
|
95
|
+
return resultTag;
|
|
96
|
+
}
|
|
97
|
+
// Adapted from `html-webpack-inline-source-plugin`'s method of the same name.
|
|
98
|
+
// ATTRIBUTION: ADAPTATION | html-webpack-inline-source-plugin | Copyright (c) 2016 Jan Nicklas. MIT Licensed.
|
|
99
|
+
processTags(compilation, pluginData) {
|
|
100
|
+
const assetsRegExp = this.assetsRegExp;
|
|
101
|
+
if (!assetsRegExp) {
|
|
102
|
+
return pluginData;
|
|
103
|
+
}
|
|
104
|
+
const headTags = [];
|
|
105
|
+
const bodyTags = [];
|
|
106
|
+
const { publicPath } = compilation.outputOptions;
|
|
107
|
+
const publicUrlPrefix = typeof publicPath === 'string' ? publicPath : '';
|
|
108
|
+
// Mirrors processTag's own match condition (same regex, same tag-type checks) to record
|
|
109
|
+
// exactly which asset this tag will cause to be inlined, if any - without this, the
|
|
110
|
+
// processAssets hook below has no way to know which assets were actually touched. We record
|
|
111
|
+
// the owning CHUNK rather than the asset name: a chunk's identity is stable even when its
|
|
112
|
+
// contenthash (and therefore filename) is recomputed later by minification, so resolving
|
|
113
|
+
// `chunk.files` when deleting - instead of replaying a filename captured now - survives that
|
|
114
|
+
// timing gap.
|
|
115
|
+
const trackInlinedAsset = (tag) => {
|
|
116
|
+
let assetUrl;
|
|
117
|
+
if (tag.tagName === 'script' && assetsRegExp.test(tag.attributes.src)) {
|
|
118
|
+
assetUrl = tag.attributes.src;
|
|
119
|
+
}
|
|
120
|
+
else if (tag.tagName === 'link' && assetsRegExp.test(tag.attributes.href)) {
|
|
121
|
+
assetUrl = tag.attributes.href;
|
|
122
|
+
}
|
|
123
|
+
if (!assetUrl) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const assetName = path.posix.relative(publicUrlPrefix, assetUrl);
|
|
127
|
+
const owningChunk = Array.from(compilation.chunks).find((chunk) => chunk.files.has(assetName));
|
|
128
|
+
this.inlinedChunks = this.inlinedChunks ?? new Set();
|
|
129
|
+
this.inlinedChunks.add(owningChunk ?? assetName);
|
|
130
|
+
};
|
|
131
|
+
pluginData.headTags.forEach((tag) => {
|
|
132
|
+
trackInlinedAsset(tag);
|
|
133
|
+
headTags.push(this.processTag(compilation, assetsRegExp, tag));
|
|
134
|
+
});
|
|
135
|
+
pluginData.bodyTags.forEach((tag) => {
|
|
136
|
+
trackInlinedAsset(tag);
|
|
137
|
+
bodyTags.push(this.processTag(compilation, assetsRegExp, tag));
|
|
138
|
+
});
|
|
139
|
+
return { ...pluginData, headTags, bodyTags };
|
|
140
|
+
}
|
|
141
|
+
// Assets that exist in the compilation but were never referenced by a <script>/<link> tag (e.g.
|
|
142
|
+
// a license-notices file written directly via compilation.emitAsset) have nothing for
|
|
143
|
+
// processTags to match against - embed them explicitly instead, keyed by asset name so consuming
|
|
144
|
+
// code can read them back out of the DOM at runtime. `wrapper` picks the markup (an opaque,
|
|
145
|
+
// non-executing <script>, or a plain HTML comment - base64 never contains `--`, so it can't
|
|
146
|
+
// prematurely close the comment); `container` picks where it lands.
|
|
147
|
+
//
|
|
148
|
+
// This runs against the already-emitted HTML asset (see the processAssets hook below), not
|
|
149
|
+
// against pluginData inside afterTemplateExecution - some plugins that emit matchable assets
|
|
150
|
+
// (e.g. webpack-license-plugin, which writes its notices file at PROCESS_ASSETS_STAGE_ANALYSE)
|
|
151
|
+
// do so well after html-webpack-plugin has already rendered and emitted its HTML, so scanning
|
|
152
|
+
// compilation.assets from inside afterTemplateExecution would silently miss them. Since there's
|
|
153
|
+
// no headTags/bodyTags array to push a HtmlTagObject into at this point, 'script'-wrapped markup
|
|
154
|
+
// is spliced into the html string the same way 'comment'-wrapped markup already was.
|
|
155
|
+
processAdditionalAssets(compilation, html) {
|
|
156
|
+
let result = html;
|
|
157
|
+
const additionalAssets = this.additionalAssets ?? [];
|
|
158
|
+
additionalAssets.forEach(({ pattern, wrapper, container }) => {
|
|
159
|
+
Object.keys(compilation.assets)
|
|
160
|
+
.filter((name) => name !== this.htmlAssetName && pattern.test(name))
|
|
161
|
+
.forEach((name) => {
|
|
162
|
+
const encoded = compilation.assets[name].buffer().toString('base64');
|
|
163
|
+
this.inlinedChunks = this.inlinedChunks ?? new Set();
|
|
164
|
+
this.inlinedChunks.add(name);
|
|
165
|
+
const markup = buildAdditionalAssetMarkup(wrapper, name, encoded);
|
|
166
|
+
result = container === 'head' || container === 'body' ? insertBeforeClosingTag(result, container, markup) : `${result}${markup}`;
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
apply(compiler) {
|
|
172
|
+
this.assetsRegExp = undefined;
|
|
173
|
+
this.faviconPath = undefined;
|
|
174
|
+
this.inlinedChunks = new Set();
|
|
175
|
+
compiler.hooks.compilation.tap('html-inline-source-plugin', (compilation) => {
|
|
176
|
+
HtmlWebpackPlugin.getHooks(compilation).afterTemplateExecution.tapAsync('html-inline-source-plugin', (htmlPluginData, callback) => {
|
|
177
|
+
this.assetsRegExp = new RegExp('.(js|css)$');
|
|
178
|
+
this.htmlAssetName = htmlPluginData.outputName;
|
|
179
|
+
const result = this.processTags(compilation, htmlPluginData);
|
|
180
|
+
const favicon = htmlPluginData.plugin.options?.favicon;
|
|
181
|
+
const inputFs = compiler.inputFileSystem;
|
|
182
|
+
if (!favicon || !inputFs.existsSync(favicon)) {
|
|
183
|
+
return callback(null, result);
|
|
184
|
+
}
|
|
185
|
+
const faviconTag = result.headTags.find((tag) => tag.tagName === 'link' && tag.attributes.rel === 'icon');
|
|
186
|
+
if (faviconTag) {
|
|
187
|
+
this.faviconPath = faviconTag.attributes.href;
|
|
188
|
+
faviconTag.attributes.href = `data:image/x-icon;base64, ${inputFs.readFileSync(favicon, 'base64')}`;
|
|
189
|
+
}
|
|
190
|
+
callback(null, result);
|
|
191
|
+
});
|
|
192
|
+
// Patches the already-emitted HTML asset directly (see processAdditionalAssets' own comment
|
|
193
|
+
// for why this can't happen inside afterTemplateExecution above) and must run strictly
|
|
194
|
+
// before the deletion pass below - same processAssets stage, but tapped first, so Tapable's
|
|
195
|
+
// stable same-stage ordering runs this one first.
|
|
196
|
+
compilation.hooks.processAssets.tap({ name: 'html-inline-source-plugin', stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_REPORT }, () => {
|
|
197
|
+
if (!this.htmlAssetName)
|
|
198
|
+
return;
|
|
199
|
+
const htmlAsset = compilation.assets[this.htmlAssetName];
|
|
200
|
+
if (!htmlAsset)
|
|
201
|
+
return;
|
|
202
|
+
const html = this.processAdditionalAssets(compilation, htmlAsset.source().toString());
|
|
203
|
+
compilation.updateAsset(this.htmlAssetName, new compiler.webpack.sources.RawSource(html));
|
|
204
|
+
});
|
|
205
|
+
// Only remove assets that were actually inlined into the HTML above. Blanket-matching by
|
|
206
|
+
// extension would also delete unrelated .js/.css assets that were never inlining candidates
|
|
207
|
+
// in the first place - e.g. a Worker chunk, which browsers load via the separate Worker API
|
|
208
|
+
// rather than a <script> tag, so html-webpack-plugin never generates a tag for it.
|
|
209
|
+
// PROCESS_ASSETS_STAGE_REPORT is the last processAssets stage - it still runs before
|
|
210
|
+
// sealing freezes compilation.assets, so chunk.files here already reflects any earlier
|
|
211
|
+
// stage's rename (e.g. Terser's contenthash recompute).
|
|
212
|
+
compilation.hooks.processAssets.tap(
|
|
213
|
+
// Read the stage constant off compiler.webpack rather than importing Compilation as a
|
|
214
|
+
// value from 'webpack' directly - the plugin then keeps working correctly even if the
|
|
215
|
+
// host project resolves a different webpack instance than the one in this package's own
|
|
216
|
+
// node_modules (the standard reason webpack plugins avoid a direct `require('webpack')`).
|
|
217
|
+
{ name: 'html-inline-source-plugin', stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_REPORT }, () => {
|
|
218
|
+
this.inlinedChunks?.forEach((chunkOrName) => {
|
|
219
|
+
if (typeof chunkOrName === 'string') {
|
|
220
|
+
compilation.deleteAsset(chunkOrName);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
chunkOrName.files.forEach((file) => {
|
|
224
|
+
compilation.deleteAsset(file);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
const faviconFile = this.faviconPath?.split(path.sep)?.pop();
|
|
228
|
+
if (faviconFile) {
|
|
229
|
+
compilation.deleteAsset(faviconFile);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
export default HtmlInlineSourcePlugin;
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHRtbElubGluZVNvdXJjZVBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL0h0bWxJbmxpbmVTb3VyY2VQbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxpQkFBcUQsTUFBTSxxQkFBcUIsQ0FBQTtBQUd2RixPQUFPLElBQUksTUFBTSxNQUFNLENBQUE7QUFjdkIsNkZBQTZGO0FBQzdGLHlEQUF5RDtBQUN6RCw0SUFBNEk7QUFDNUksTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUE7QUFFcEYsOERBQThEO0FBQzlELDZIQUE2SDtBQUM3SCw0Q0FBNEM7QUFDNUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBRXhHLDRGQUE0RjtBQUM1Riw0Q0FBNEM7QUFDNUMsMEZBQTBGO0FBQzFGLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxHQUFHLEVBQUU7SUFDbkMsTUFBTSxLQUFLLEdBQUcsbUNBQW1DLENBQUE7SUFDakQsT0FBTyxJQUFJLE1BQU0sQ0FBQyxrQ0FBa0MsS0FBSyxrQkFBa0IsS0FBSyxRQUFRLENBQUMsQ0FBQTtBQUMzRixDQUFDLENBQUMsRUFBRSxDQUFBO0FBQ0osTUFBTSxtQkFBbUIsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFO0lBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtJQUNoRCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJ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MEZBQTBGO1lBQzFGLEVBQUUsSUFBSSxFQUFFLDJCQUEyQixFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQywyQkFBMkIsRUFBRSxFQUN0RyxHQUFHLEVBQUU7Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtvQkFDMUMsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDcEMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQTt3QkFDcEMsT0FBTTtvQkFDUixDQUFDO29CQUNELFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ2pDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQy9CLENBQUMsQ0FBQyxDQUFBO2dCQUNKLENBQUMsQ0FBQyxDQUFBO2dCQUNGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQTtnQkFDNUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsV0FBVyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtnQkFDdEMsQ0FBQztZQUNILENBQUMsQ0FDRixDQUFBO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0Y7QUFFRCxlQUFlLHNCQUFzQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEh0bWxXZWJwYWNrUGx1Z2luLCB7IHR5cGUgSG9va3MsIHR5cGUgSHRtbFRhZ09iamVjdCB9IGZyb20gJ2h0bWwtd2VicGFjay1wbHVnaW4nXG5pbXBvcnQgeyB0eXBlIEFzeW5jU2VyaWVzV2F0ZXJmYWxsSG9vayB9IGZyb20gJ3RhcGFibGUnXG5pbXBvcnQgeyB0eXBlIENodW5rLCB0eXBlIENvbXBpbGF0aW9uLCB0eXBlIENvbXBpbGVyLCB0eXBlIFdlYnBhY2tQbHVnaW5JbnN0YW5jZSB9IGZyb20gJ3dlYnBhY2snXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuXG50eXBlIEFzeW5jU2VyaWVzV2F0ZXJmYWxsSG9va0RhdGFUeXBlPFQ+ID0gVCBleHRlbmRzIEFzeW5jU2VyaWVzV2F0ZXJmYWxsSG9vazxpbmZlciBSPiA/IFIgOiBuZXZlclxudHlwZSBUZW1wbGF0ZUV4ZWN1dGlvbkRhdGFUeXBlID0gQXN5bmNTZXJpZXNXYXRlcmZhbGxIb29rRGF0YVR5cGU8SG9va3NbJ2FmdGVyVGVtcGxhdGVFeGVjdXRpb24nXT5cblxuLy8gVGhlIGNvbXBpbGVyJ3MgaW5wdXRGaWxlU3lzdGVtIGlzIG9ubHkgb2ZmaWNpYWxseSB0eXBlZCB3aXRoIGFzeW5jIChjYWxsYmFjaykgbWV0aG9kcywgYnV0IGluXG4vLyBwcmFjdGljZSBpdCdzIGVpdGhlciBOb2RlJ3MgcmVhbCBgZnNgIG9yIGEgTWVtb3J5RlMgLSBib3RoIGFsc28gZXhwb3NlIHRoZXNlIFN5bmMgZXF1aXZhbGVudHMuXG4vLyBTYW1lIGNvbXByb21pc2UgV2ViY29tcG9uZW50U3R5bGVMb2FkZXIudHMgYW5kIEBlbmhhbmNlZC1kb20vaW50bCdzIHdlYnBhY2sucGx1Z2luLnRzIG1ha2UgZm9yXG4vLyB0aGUgc2FtZSByZWFzb24uXG5pbnRlcmZhY2UgSVN5bmNGaWxlU3lzdGVtIHtcbiAgZXhpc3RzU3luYzogKHBhdGhPZkl0ZW06IHN0cmluZykgPT4gYm9vbGVhblxuICByZWFkRmlsZVN5bmM6IChwYXRoT2ZJdGVtOiBzdHJpbmcsIGVuY29kaW5nOiBzdHJpbmcpID0+IHN0cmluZ1xufVxuXG4vLyBQb3J0ZWQgZnJvbSBgZXNjYXBlLXN0cmluZy1yZWdleHBgIChpbmxpbmVkIHJhdGhlciB0aGFuIHRha2VuIGFzIGEgZGVwZW5kZW5jeSwgc2luY2UgbmV3ZXJcbi8vIG1ham9ycyBvZiB0aGVzZSB0aW55IHNpbmRyZXNvcmh1cyB1dGlscyBhcmUgRVNNLW9ubHkpLlxuLy8gQVRUUklCVVRJT046IENPUFkgfCBlc2NhcGUtc3RyaW5nLXJlZ2V4cCB8IENvcHlyaWdodCAoYykgU2luZHJlIFNvcmh1cyA8c2luZHJlc29yaHVzQGdtYWlsLmNvbT4gKGh0dHBzOi8vc2luZHJlc29yaHVzLmNvbSkuIE1JVCBMaWNlbnNlZC5cbmNvbnN0IGVzY2FwZVJlZ0V4cCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZS5yZXBsYWNlKC9bfFxcXFx7fSgpW1xcXV4kKyo/Ll0vZywgJ1xcXFwkJicpXG5cbi8vIFBvcnRlZCBmcm9tIGBzbGFzaGAgKHNhbWUgcmVhc29uaW5nIGFzIGVzY2FwZVJlZ0V4cCBhYm92ZSkuXG4vLyBBVFRSSUJVVElPTjogQ09QWSB8IHNsYXNoIHwgQ29weXJpZ2h0IChjKSBTaW5kcmUgU29yaHVzIDxzaW5kcmVzb3JodXNAZ21haWwuY29tPiAoaHR0cHM6Ly9zaW5kcmVzb3JodXMuY29tKS4gTUlUIExpY2Vuc2VkLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbmNvbnN0IHRvUG9zaXhQYXRoID0gKHZhbHVlOiBzdHJpbmcpID0+ICgvW15cXHgwMC1cXHg4MF0rLy50ZXN0KHZhbHVlKSA/IHZhbHVlIDogdmFsdWUucmVwbGFjZSgvXFxcXC9nLCAnLycpKVxuXG4vLyBQb3J0ZWQgZnJvbSBgc291cmNlLW1hcC11cmxgIChzYW1lIHJlYXNvbmluZyBhcyBlc2NhcGVSZWdFeHAgYWJvdmUpOyBvbmx5IHRoZSBsb29rdXAgdGhpc1xuLy8gcGx1Z2luIGFjdHVhbGx5IHVzZXMgKGBnZXRGcm9tYCkgaXMga2VwdC5cbi8vIEFUVFJJQlVUSU9OOiBDT1BZIHwgc291cmNlLW1hcC11cmwgfCBDb3B5cmlnaHQgMjAxNCBTaW1vbiBMeWRlbGwuIFgxMSAoXCJNSVRcIikgTGljZW5zZWQuXG5jb25zdCBzb3VyY2VNYXBwaW5nVXJsUmVnRXhwID0gKCgpID0+IHtcbiAgY29uc3QgaW5uZXIgPSBgWyNAXSBzb3VyY2VNYXBwaW5nVVJMPShbXlxcXFxzJ1wiXSopYFxuICByZXR1cm4gbmV3IFJlZ0V4cChgKD86L1xcXFwqKD86XFxcXHMqXFxyP1xcbig/Oi8vKT8pPyg/OiR7aW5uZXJ9KVxcXFxzKlxcXFwqL3wvLyg/OiR7aW5uZXJ9KSlcXFxccypgKVxufSkoKVxuY29uc3QgZ2V0U291cmNlTWFwcGluZ1VybCA9IChjb2RlOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgbWF0Y2ggPSBjb2RlLm1hdGNoKHNvdXJjZU1hcHBpbmdVcmxSZWdFeHApXG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdIHx8IG1hdGNoWzJdIHx8ICcnIDogbnVsbFxufVxuXG4vLyBJbnNlcnRzIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgcmVhbCBjbG9zaW5nIHRhZyAtIGZvdW5kIGJ5IHRha2luZyB0aGUgTEFTVCBtYXRjaCBvZlxuLy8gYDwvdGFnTmFtZT5gIGluIHRoZSBkb2N1bWVudCwgbm90IHRoZSBmaXJzdC4gQW4gaW5saW5lZCA8c2NyaXB0PidzIG93biBzb3VyY2UgY2FuIGxlZ2l0aW1hdGVseVxuLy8gY29udGFpbiB0aGF0IHNhbWUgc3Vic3RyaW5nIGFzIHBsYWluIHRleHQgKGUuZy4gYW4gZW1iZWRkZWQgSFRNTCB0ZW1wbGF0ZSBzdHJpbmcgaW5zaWRlIGFcbi8vIFdvcmtlcidzIHNvdXJjZSwgdW5yZWxhdGVkIHRvIGFjdHVhbCBkb2N1bWVudCBzdHJ1Y3R1cmUpIHdlbGwgYmVmb3JlIHRoZSBkb2N1bWVudCdzIHJlYWxcbi8vIGNsb3NpbmcgdGFnOyBtYXRjaGluZyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSB3b3VsZCBzcGxpY2UgdGhlIGluc2VydGlvbiBpbnRvIHRoZSBtaWRkbGUgb2YgdGhhdFxuLy8gc2NyaXB0J3MgdGV4dCBpbnN0ZWFkIG9mIGFmdGVyIGl0LCBjb3JydXB0aW5nIHRoZSBzY3JpcHQgdGhlIGJyb3dzZXIgd2FzIHN1cHBvc2VkIHRvIHJ1bi5cbmNvbnN0IGluc2VydEJlZm9yZUNsb3NpbmdUYWcgPSAoaHRtbDogc3RyaW5nLCB0YWdOYW1lOiAnaGVhZCcgfCAnYm9keScsIGluc2VydGlvbjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNsb3NpbmdUYWdSZWdFeHAgPSBuZXcgUmVnRXhwKGA8LyR7dGFnTmFtZX1cXFxccyo+YCwgJ2dpJylcbiAgbGV0IGxhc3RNYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbCA9IG51bGxcbiAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsXG4gIHdoaWxlICgobWF0Y2ggPSBjbG9zaW5nVGFnUmVnRXhwLmV4ZWMoaHRtbCkpKSB7XG4gICAgbGFzdE1hdGNoID0gbWF0Y2hcbiAgfVxuICByZXR1cm4gbGFzdE1hdGNoID8gYCR7aHRtbC5zbGljZSgwLCBsYXN0TWF0Y2guaW5kZXgpfSR7aW5zZXJ0aW9ufSR7aHRtbC5zbGljZShsYXN0TWF0Y2guaW5kZXgpfWAgOiBgJHtodG1sfSR7aW5zZXJ0aW9ufWBcbn1cblxuY29uc3QgYnVpbGRBZGRpdGlvbmFsQXNzZXRNYXJrdXAgPSAod3JhcHBlcjogJ2NvbW1lbnQnIHwgJ3NjcmlwdCcsIGFzc2V0TmFtZTogc3RyaW5nLCBlbmNvZGVkOiBzdHJpbmcpID0+IHtcbiAgaWYgKHdyYXBwZXIgPT09ICdjb21tZW50Jykge1xuICAgIHJldHVybiBgPCEtLWRhdGEtYXNzZXQtbmFtZT1cIiR7YXNzZXROYW1lfVwiIGRhdGEtZW5jb2Rpbmc9XCJiYXNlNjRcIiAke2VuY29kZWR9LS0+YFxuICB9XG4gIHJldHVybiBgPHNjcmlwdCB0eXBlPVwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIgZGF0YS1hc3NldC1uYW1lPVwiJHthc3NldE5hbWV9XCIgZGF0YS1lbmNvZGluZz1cImJhc2U2NFwiPiR7ZW5jb2RlZH08L3NjcmlwdD5gXG59XG5cbmNsYXNzIEh0bWxJbmxpbmVTb3VyY2VQbHVnaW4gaW1wbGVtZW50cyBXZWJwYWNrUGx1Z2luSW5zdGFuY2Uge1xuICBhc3NldHNSZWdFeHA/OiBSZWdFeHBcbiAgZmF2aWNvblBhdGg/OiBzdHJpbmdcbiAgaHRtbEFzc2V0TmFtZT86IHN0cmluZ1xuICBpbmxpbmVkQ2h1bmtzPzogU2V0PENodW5rIHwgc3RyaW5nPlxuICBhZGRpdGlvbmFsQXNzZXRzPzogeyBwYXR0ZXJuOiBSZWdFeHA7IHdyYXBwZXI6ICdjb21tZW50JyB8ICdzY3JpcHQnOyBjb250YWluZXI6ICdoZWFkJyB8ICdib2R5JyB8ICdmb290ZXInIH1bXVxuXG4gIC8vIFJld3JpdGVzIGEgYC8vIyBzb3VyY2VNYXBwaW5nVVJMPS4uLmAvYC8qIyBzb3VyY2VNYXBwaW5nVVJMPS4uLiAqL2AgY29tbWVudCAoaWYgYW55KSBpbiBhblxuICAvLyBhc3NldCdzIHNvdXJjZSB0byBiZSByZWxhdGl2ZSB0byB0aGUgc2l0ZSByb290IGluc3RlYWQgb2YgdGhlIGFzc2V0J3Mgb3duIGRpcmVjdG9yeSwgc2luY2VcbiAgLy8gaW5saW5pbmcgbW92ZXMgdGhlIGFzc2V0J3MgY29udGVudCBpbnRvIHRoZSBodG1sIGRvY3VtZW50IHJhdGhlciB0aGFuIHNlcnZpbmcgaXQgZnJvbVxuICAvLyBhbG9uZ3NpZGUgaXRzIHNvdXJjZW1hcC5cbiAgLy8gQWRhcHRlZCBmcm9tIGBodG1sLXdlYnBhY2staW5saW5lLXNvdXJjZS1wbHVnaW5gJ3MgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUuXG4gIC8vIEFUVFJJQlVUSU9OOiBBREFQVEFUSU9OIHwgaHRtbC13ZWJwYWNrLWlubGluZS1zb3VyY2UtcGx1Z2luIHwgQ29weXJpZ2h0IChjKSAyMDE2IEphbiBOaWNrbGFzLiBNSVQgTGljZW5zZWQuXG4gIHJlc29sdmVTb3VyY2VNYXBzKGNvbXBpbGF0aW9uOiBDb21waWxhdGlvbiwgYXNzZXROYW1lOiBzdHJpbmcsIGFzc2V0OiBDb21waWxhdGlvblsnYXNzZXRzJ11bc3RyaW5nXSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc291cmNlID0gYXNzZXQuc291cmNlKClcbiAgICBjb25zdCBvdXQgPSBjb21waWxhdGlvbi5vdXRwdXRPcHRpb25zXG4gICAgY29uc3QgYXNzZXRQYXRoID0gcGF0aC5qb2luKG91dC5wYXRoLCBhc3NldE5hbWUpXG4gICAgY29uc3Qgc291cmNlVGV4dCA9IHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnID8gc291cmNlIDogc291cmNlLnRvU3RyaW5nKClcbiAgICBjb25zdCBtYXBVcmxPcmlnaW5hbCA9IGdldFNvdXJjZU1hcHBpbmdVcmwoc291cmNlVGV4dClcbiAgICBpZiAoIW1hcFVybE9yaWdpbmFsIHx8IG1hcFVybE9yaWdpbmFsLmluZGV4T2YoJ2RhdGE6JykgPT09IDAgfHwgbWFwVXJsT3JpZ2luYWwuaW5kZXhPZignLycpID09PSAwKSB7XG4gICAgICByZXR1cm4gc291cmNlVGV4dFxuICAgIH1cbiAgICBjb25zdCBhc3NldERpciA9IHBhdGguZGlybmFtZShhc3NldFBhdGgpXG4gICAgY29uc3QgbWFwUGF0aCA9IHBhdGguam9pbihhc3NldERpciwgbWFwVXJsT3JpZ2luYWwpXG4gICAgY29uc3QgbWFwUGF0aFJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShvdXQucGF0aCwgbWFwUGF0aClcbiAgICBjb25zdCBwdWJsaWNQYXRoID0gdHlwZW9mIG91dC5wdWJsaWNQYXRoID09PSAnc3RyaW5nJyA/IG91dC5wdWJsaWNQYXRoIDogJydcbiAgICBjb25zdCBtYXBVcmxDb3JyZWN0ZWQgPSB0b1Bvc2l4UGF0aChwYXRoLmpvaW4ocHVibGljUGF0aCwgbWFwUGF0aFJlbGF0aXZlKSlcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYCR7ZXNjYXBlUmVnRXhwKG1hcFVybE9yaWdpbmFsKX0oXFxcXHMqKD86XFxcXCovKT9cXFxccyokKWApXG4gICAgcmV0dXJuIHNvdXJjZVRleHQucmVwbGFjZShyZWdleCwgKF9tYXRjaCwgZ3JvdXApID0+IGAke21hcFVybENvcnJlY3RlZH0ke2dyb3VwfWApXG4gIH1cblxuICAvLyBBZGFwdGVkIGZyb20gYGh0bWwtd2VicGFjay1pbmxpbmUtc291cmNlLXBsdWdpbmAncyBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZS5cbiAgLy8gQVRUUklCVVRJT046IEFEQVBUQVRJT04gfCBodG1sLXdlYnBhY2staW5saW5lLXNvdXJjZS1wbHVnaW4gfCBDb3B5cmlnaHQgKGMpIDIwMTYgSmFuIE5pY2tsYXMuIE1JVCBMaWNlbnNlZC5cbiAgcHJvY2Vzc1RhZyhjb21waWxhdGlvbjogQ29tcGlsYXRpb24sIHJlZ2V4OiBSZWdFeHAsIHRhZzogSHRtbFRhZ09iamVjdCk6IEh0bWxUYWdPYmplY3Qge1xuICAgIGxldCBhc3NldFVybDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgbGV0IHJlc3VsdFRhZyA9IHRhZ1xuXG4gICAgaWYgKHRhZy50YWdOYW1lID09PSAnc2NyaXB0JyAmJiByZWdleC50ZXN0KHRhZy5hdHRyaWJ1dGVzLnNyYyBhcyBzdHJpbmcpKSB7XG4gICAgICBhc3NldFVybCA9IHRhZy5hdHRyaWJ1dGVzLnNyYyBhcyBzdHJpbmdcbiAgICAgIHJlc3VsdFRhZyA9IHsgdGFnTmFtZTogJ3NjcmlwdCcsIHZvaWRUYWc6IGZhbHNlLCBtZXRhOiB7fSwgYXR0cmlidXRlczogeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9IH1cbiAgICB9IGVsc2UgaWYgKHRhZy50YWdOYW1lID09PSAnbGluaycgJiYgcmVnZXgudGVzdCh0YWcuYXR0cmlidXRlcy5ocmVmIGFzIHN0cmluZykpIHtcbiAgICAgIGFzc2V0VXJsID0gdGFnLmF0dHJpYnV0ZXMuaHJlZiBhcyBzdHJpbmdcbiAgICAgIHJlc3VsdFRhZyA9IHsgdGFnTmFtZTogJ3N0eWxlJywgdm9pZFRhZzogZmFsc2UsIG1ldGE6IHt9LCBhdHRyaWJ1dGVzOiB7IHR5cGU6ICd0ZXh0L2NzcycgfSB9XG4gICAgfVxuXG4gICAgaWYgKGFzc2V0VXJsKSB7XG4gICAgICBjb25zdCBwdWJsaWNVcmxQcmVmaXggPSB0eXBlb2YgY29tcGlsYXRpb24ub3V0cHV0T3B0aW9ucy5wdWJsaWNQYXRoID09PSAnc3RyaW5nJyA/IGNvbXBpbGF0aW9uLm91dHB1dE9wdGlvbnMucHVibGljUGF0aCA6ICcnXG4gICAgICBjb25zdCBhc3NldE5hbWUgPSBwYXRoLnBvc2l4LnJlbGF0aXZlKHB1YmxpY1VybFByZWZpeCwgYXNzZXRVcmwpXG4gICAgICBjb25zdCBhc3NldCA9IGNvbXBpbGF0aW9uLmFzc2V0c1thc3NldE5hbWVdXG4gICAgICBpZiAoIWFzc2V0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHRUYWdcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZWRTb3VyY2UgPSB0aGlzLnJlc29sdmVTb3VyY2VNYXBzKGNvbXBpbGF0aW9uLCBhc3NldE5hbWUsIGFzc2V0KVxuICAgICAgcmVzdWx0VGFnLmlubmVySFRNTCA9IHJlc3VsdFRhZy50YWdOYW1lID09PSAnc2NyaXB0JyA/IHVwZGF0ZWRTb3VyY2UucmVwbGFjZSgvKDwpKFxcL3NjcmlwdD4pL2csICdcXFxceDNDJDInKSA6IHVwZGF0ZWRTb3VyY2VcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0VGFnXG4gIH1cblxuICAvLyBBZGFwdGVkIGZyb20gYGh0bWwtd2VicGFjay1pbmxpbmUtc291cmNlLXBsdWdpbmAncyBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZS5cbiAgLy8gQVRUUklCVVRJT046IEFEQVBUQVRJT04gfCBodG1sLXdlYnBhY2staW5saW5lLXNvdXJjZS1wbHVnaW4gfCBDb3B5cmlnaHQgKGMpIDIwMTYgSmFuIE5pY2tsYXMuIE1JVCBMaWNlbnNlZC5cbiAgcHJvY2Vzc1RhZ3MoY29tcGlsYXRpb246IENvbXBpbGF0aW9uLCBwbHVnaW5EYXRhOiBUZW1wbGF0ZUV4ZWN1dGlvbkRhdGFUeXBlKTogVGVtcGxhdGVFeGVjdXRpb25EYXRhVHlwZSB7XG4gICAgY29uc3QgYXNzZXRzUmVnRXhwID0gdGhpcy5hc3NldHNSZWdFeHBcbiAgICBpZiAoIWFzc2V0c1JlZ0V4cCkge1xuICAgICAgcmV0dXJuIHBsdWdpbkRhdGFcbiAgICB9XG4gICAgY29uc3QgaGVhZFRhZ3M6IHR5cGVvZiBwbHVnaW5EYXRhLmhlYWRUYWdzID0gW11cbiAgICBjb25zdCBib2R5VGFnczogdHlwZW9mIHBsdWdpbkRhdGEuaGVhZFRhZ3MgPSBbXVxuXG4gICAgY29uc3QgeyBwdWJsaWNQYXRoIH0gPSBjb21waWxhdGlvbi5vdXRwdXRPcHRpb25zXG4gICAgY29uc3QgcHVibGljVXJsUHJlZml4ID0gdHlwZW9mIHB1YmxpY1BhdGggPT09ICdzdHJpbmcnID8gcHVibGljUGF0aCA6ICcnXG5cbiAgICAvLyBNaXJyb3JzIHByb2Nlc3NUYWcncyBvd24gbWF0Y2ggY29uZGl0aW9uIChzYW1lIHJlZ2V4LCBzYW1lIHRhZy10eXBlIGNoZWNrcykgdG8gcmVjb3JkXG4gICAgLy8gZXhhY3RseSB3aGljaCBhc3NldCB0aGlzIHRhZyB3aWxsIGNhdXNlIHRvIGJlIGlubGluZWQsIGlmIGFueSAtIHdpdGhvdXQgdGhpcywgdGhlXG4gICAgLy8gcHJvY2Vzc0Fzc2V0cyBob29rIGJlbG93IGhhcyBubyB3YXkgdG8ga25vdyB3aGljaCBhc3NldHMgd2VyZSBhY3R1YWxseSB0b3VjaGVkLiBXZSByZWNvcmRcbiAgICAvLyB0aGUgb3duaW5nIENIVU5LIHJhdGhlciB0aGFuIHRoZSBhc3NldCBuYW1lOiBhIGNodW5rJ3MgaWRlbnRpdHkgaXMgc3RhYmxlIGV2ZW4gd2hlbiBpdHNcbiAgICAvLyBjb250ZW50aGFzaCAoYW5kIHRoZXJlZm9yZSBmaWxlbmFtZSkgaXMgcmVjb21wdXRlZCBsYXRlciBieSBtaW5pZmljYXRpb24sIHNvIHJlc29sdmluZ1xuICAgIC8vIGBjaHVuay5maWxlc2Agd2hlbiBkZWxldGluZyAtIGluc3RlYWQgb2YgcmVwbGF5aW5nIGEgZmlsZW5hbWUgY2FwdHVyZWQgbm93IC0gc3Vydml2ZXMgdGhhdFxuICAgIC8vIHRpbWluZyBnYXAuXG4gICAgY29uc3QgdHJhY2tJbmxpbmVkQXNzZXQgPSAodGFnOiAodHlwZW9mIHBsdWdpbkRhdGEuaGVhZFRhZ3MpW251bWJlcl0pID0+IHtcbiAgICAgIGxldCBhc3NldFVybDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICBpZiAodGFnLnRhZ05hbWUgPT09ICdzY3JpcHQnICYmIGFzc2V0c1JlZ0V4cC50ZXN0KHRhZy5hdHRyaWJ1dGVzLnNyYyBhcyBzdHJpbmcpKSB7XG4gICAgICAgIGFzc2V0VXJsID0gdGFnLmF0dHJpYnV0ZXMuc3JjIGFzIHN0cmluZ1xuICAgICAgfSBlbHNlIGlmICh0YWcudGFnTmFtZSA9PT0gJ2xpbmsnICYmIGFzc2V0c1JlZ0V4cC50ZXN0KHRhZy5hdHRyaWJ1dGVzLmhyZWYgYXMgc3RyaW5nKSkge1xuICAgICAgICBhc3NldFVybCA9IHRhZy5hdHRyaWJ1dGVzLmhyZWYgYXMgc3RyaW5nXG4gICAgICB9XG4gICAgICBpZiAoIWFzc2V0VXJsKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgYXNzZXROYW1lID0gcGF0aC5wb3NpeC5yZWxhdGl2ZShwdWJsaWNVcmxQcmVmaXgsIGFzc2V0VXJsKVxuICAgICAgY29uc3Qgb3duaW5nQ2h1bmsgPSBBcnJheS5mcm9tKGNvbXBpbGF0aW9uLmNodW5rcykuZmluZCgoY2h1bmspID0+IGNodW5rLmZpbGVzLmhhcyhhc3NldE5hbWUpKVxuICAgICAgdGhpcy5pbmxpbmVkQ2h1bmtzID0gdGhpcy5pbmxpbmVkQ2h1bmtzID8/IG5ldyBTZXQoKVxuICAgICAgdGhpcy5pbmxpbmVkQ2h1bmtzLmFkZChvd25pbmdDaHVuayA/PyBhc3NldE5hbWUpXG4gICAgfVxuXG4gICAgcGx1Z2luRGF0YS5oZWFkVGFncy5mb3JFYWNoKCh0YWcpID0+IHtcbiAgICAgIHRyYWNrSW5saW5lZEFzc2V0KHRhZylcbiAgICAgIGhlYWRUYWdzLnB1c2godGhpcy5wcm9jZXNzVGFnKGNvbXBpbGF0aW9uLCBhc3NldHNSZWdFeHAsIHRhZykpXG4gICAgfSlcblxuICAgIHBsdWdpbkRhdGEuYm9keVRhZ3MuZm9yRWFjaCgodGFnKSA9PiB7XG4gICAgICB0cmFja0lubGluZWRBc3NldCh0YWcpXG4gICAgICBib2R5VGFncy5wdXNoKHRoaXMucHJvY2Vzc1RhZyhjb21waWxhdGlvbiwgYXNzZXRzUmVnRXhwLCB0YWcpKVxuICAgIH0pXG5cbiAgICByZXR1cm4geyAuLi5wbHVnaW5EYXRhLCBoZWFkVGFncywgYm9keVRhZ3MgfVxuICB9XG5cbiAgLy8gQXNzZXRzIHRoYXQgZXhpc3QgaW4gdGhlIGNvbXBpbGF0aW9uIGJ1dCB3ZXJlIG5ldmVyIHJlZmVyZW5jZWQgYnkgYSA8c2NyaXB0Pi88bGluaz4gdGFnIChlLmcuXG4gIC8vIGEgbGljZW5zZS1ub3RpY2VzIGZpbGUgd3JpdHRlbiBkaXJlY3RseSB2aWEgY29tcGlsYXRpb24uZW1pdEFzc2V0KSBoYXZlIG5vdGhpbmcgZm9yXG4gIC8vIHByb2Nlc3NUYWdzIHRvIG1hdGNoIGFnYWluc3QgLSBlbWJlZCB0aGVtIGV4cGxpY2l0bHkgaW5zdGVhZCwga2V5ZWQgYnkgYXNzZXQgbmFtZSBzbyBjb25zdW1pbmdcbiAgLy8gY29kZSBjYW4gcmVhZCB0aGVtIGJhY2sgb3V0IG9mIHRoZSBET00gYXQgcnVudGltZS4gYHdyYXBwZXJgIHBpY2tzIHRoZSBtYXJrdXAgKGFuIG9wYXF1ZSxcbiAgLy8gbm9uLWV4ZWN1dGluZyA8c2NyaXB0Piwgb3IgYSBwbGFpbiBIVE1MIGNvbW1lbnQgLSBiYXNlNjQgbmV2ZXIgY29udGFpbnMgYC0tYCwgc28gaXQgY2FuJ3RcbiAgLy8gcHJlbWF0dXJlbHkgY2xvc2UgdGhlIGNvbW1lbnQpOyBgY29udGFpbmVyYCBwaWNrcyB3aGVyZSBpdCBsYW5kcy5cbiAgLy9cbiAgLy8gVGhpcyBydW5zIGFnYWluc3QgdGhlIGFscmVhZHktZW1pdHRlZCBIVE1MIGFzc2V0IChzZWUgdGhlIHByb2Nlc3NBc3NldHMgaG9vayBiZWxvdyksIG5vdFxuICAvLyBhZ2FpbnN0IHBsdWdpbkRhdGEgaW5zaWRlIGFmdGVyVGVtcGxhdGVFeGVjdXRpb24gLSBzb21lIHBsdWdpbnMgdGhhdCBlbWl0IG1hdGNoYWJsZSBhc3NldHNcbiAgLy8gKGUuZy4gd2VicGFjay1saWNlbnNlLXBsdWdpbiwgd2hpY2ggd3JpdGVzIGl0cyBub3RpY2VzIGZpbGUgYXQgUFJPQ0VTU19BU1NFVFNfU1RBR0VfQU5BTFlTRSlcbiAgLy8gZG8gc28gd2VsbCBhZnRlciBodG1sLXdlYnBhY2stcGx1Z2luIGhhcyBhbHJlYWR5IHJlbmRlcmVkIGFuZCBlbWl0dGVkIGl0cyBIVE1MLCBzbyBzY2FubmluZ1xuICAvLyBjb21waWxhdGlvbi5hc3NldHMgZnJvbSBpbnNpZGUgYWZ0ZXJUZW1wbGF0ZUV4ZWN1dGlvbiB3b3VsZCBzaWxlbnRseSBtaXNzIHRoZW0uIFNpbmNlIHRoZXJlJ3NcbiAgLy8gbm8gaGVhZFRhZ3MvYm9keVRhZ3MgYXJyYXkgdG8gcHVzaCBhIEh0bWxUYWdPYmplY3QgaW50byBhdCB0aGlzIHBvaW50LCAnc2NyaXB0Jy13cmFwcGVkIG1hcmt1cFxuICAvLyBpcyBzcGxpY2VkIGludG8gdGhlIGh0bWwgc3RyaW5nIHRoZSBzYW1lIHdheSAnY29tbWVudCctd3JhcHBlZCBtYXJrdXAgYWxyZWFkeSB3YXMuXG4gIHByb2Nlc3NBZGRpdGlvbmFsQXNzZXRzKGNvbXBpbGF0aW9uOiBDb21waWxhdGlvbiwgaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gaHRtbFxuXG4gICAgY29uc3QgYWRkaXRpb25hbEFzc2V0cyA9IHRoaXMuYWRkaXRpb25hbEFzc2V0cyA/PyBbXVxuICAgIGFkZGl0aW9uYWxBc3NldHMuZm9yRWFjaCgoeyBwYXR0ZXJuLCB3cmFwcGVyLCBjb250YWluZXIgfSkgPT4ge1xuICAgICAgT2JqZWN0LmtleXMoY29tcGlsYXRpb24uYXNzZXRzKVxuICAgICAgICAuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSB0aGlzLmh0bWxBc3NldE5hbWUgJiYgcGF0dGVybi50ZXN0KG5hbWUpKVxuICAgICAgICAuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSBjb21waWxhdGlvbi5hc3NldHNbbmFtZV0hLmJ1ZmZlcigpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICAgIHRoaXMuaW5saW5lZENodW5rcyA9IHRoaXMuaW5saW5lZENodW5rcyA/PyBuZXcgU2V0KClcbiAgICAgICAgICB0aGlzLmlubGluZWRDaHVua3MuYWRkKG5hbWUpXG5cbiAgICAgICAgICBjb25zdCBtYXJrdXAgPSBidWlsZEFkZGl0aW9uYWxBc3NldE1hcmt1cCh3cmFwcGVyLCBuYW1lLCBlbmNvZGVkKVxuICAgICAgICAgIHJlc3VsdCA9IGNvbnRhaW5lciA9PT0gJ2hlYWQnIHx8IGNvbnRhaW5lciA9PT0gJ2JvZHknID8gaW5zZXJ0QmVmb3JlQ2xvc2luZ1RhZyhyZXN1bHQsIGNvbnRhaW5lciwgbWFya3VwKSA6IGAke3Jlc3VsdH0ke21hcmt1cH1gXG4gICAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGFwcGx5KGNvbXBpbGVyOiBDb21waWxlcikge1xuICAgIHRoaXMuYXNzZXRzUmVnRXhwID0gdW5kZWZpbmVkXG4gICAgdGhpcy5mYXZpY29uUGF0aCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuaW5saW5lZENodW5rcyA9IG5ldyBTZXQ8Q2h1bmsgfCBzdHJpbmc+KClcblxuICAgIGNvbXBpbGVyLmhvb2tzLmNvbXBpbGF0aW9uLnRhcCgnaHRtbC1pbmxpbmUtc291cmNlLXBsdWdpbicsIChjb21waWxhdGlvbikgPT4ge1xuICAgICAgSHRtbFdlYnBhY2tQbHVnaW4uZ2V0SG9va3MoY29tcGlsYXRpb24pLmFmdGVyVGVtcGxhdGVFeGVjdXRpb24udGFwQXN5bmMoJ2h0bWwtaW5saW5lLXNvdXJjZS1wbHVnaW4nLCAoaHRtbFBsdWdpbkRhdGEsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXRzUmVnRXhwID0gbmV3IFJlZ0V4cCgnLihqc3xjc3MpJCcpXG4gICAgICAgIHRoaXMuaHRtbEFzc2V0TmFtZSA9IGh0bWxQbHVnaW5EYXRhLm91dHB1dE5hbWVcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9jZXNzVGFncyhjb21waWxhdGlvbiwgaHRtbFBsdWdpbkRhdGEpXG5cbiAgICAgICAgY29uc3QgZmF2aWNvbiA9IGh0bWxQbHVnaW5EYXRhLnBsdWdpbi5vcHRpb25zPy5mYXZpY29uXG4gICAgICAgIGNvbnN0IGlucHV0RnMgPSBjb21waWxlci5pbnB1dEZpbGVTeXN0ZW0gYXMgdW5rbm93biBhcyBJU3luY0ZpbGVTeXN0ZW1cbiAgICAgICAgaWYgKCFmYXZpY29uIHx8ICFpbnB1dEZzLmV4aXN0c1N5bmMoZmF2aWNvbikpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgcmVzdWx0KVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZhdmljb25UYWcgPSByZXN1bHQuaGVhZFRhZ3MuZmluZCgodGFnKSA9PiB0YWcudGFnTmFtZSA9PT0gJ2xpbmsnICYmIHRhZy5hdHRyaWJ1dGVzLnJlbCA9PT0gJ2ljb24nKVxuICAgICAgICBpZiAoZmF2aWNvblRhZykge1xuICAgICAgICAgIHRoaXMuZmF2aWNvblBhdGggPSBmYXZpY29uVGFnLmF0dHJpYnV0ZXMuaHJlZiBhcyBzdHJpbmdcbiAgICAgICAgICBmYXZpY29uVGFnLmF0dHJpYnV0ZXMuaHJlZiA9IGBkYXRhOmltYWdlL3gtaWNvbjtiYXNlNjQsICR7aW5wdXRGcy5yZWFkRmlsZVN5bmMoZmF2aWNvbiwgJ2Jhc2U2NCcpfWBcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpXG4gICAgICB9KVxuXG4gICAgICAvLyBQYXRjaGVzIHRoZSBhbHJlYWR5LWVtaXR0ZWQgSFRNTCBhc3NldCBkaXJlY3RseSAoc2VlIHByb2Nlc3NBZGRpdGlvbmFsQXNzZXRzJyBvd24gY29tbWVudFxuICAgICAgLy8gZm9yIHdoeSB0aGlzIGNhbid0IGhhcHBlbiBpbnNpZGUgYWZ0ZXJUZW1wbGF0ZUV4ZWN1dGlvbiBhYm92ZSkgYW5kIG11c3QgcnVuIHN0cmljdGx5XG4gICAgICAvLyBiZWZvcmUgdGhlIGRlbGV0aW9uIHBhc3MgYmVsb3cgLSBzYW1lIHByb2Nlc3NBc3NldHMgc3RhZ2UsIGJ1dCB0YXBwZWQgZmlyc3QsIHNvIFRhcGFibGUnc1xuICAgICAgLy8gc3RhYmxlIHNhbWUtc3RhZ2Ugb3JkZXJpbmcgcnVucyB0aGlzIG9uZSBmaXJzdC5cbiAgICAgIGNvbXBpbGF0aW9uLmhvb2tzLnByb2Nlc3NBc3NldHMudGFwKFxuICAgICAgICB7IG5hbWU6ICdodG1sLWlubGluZS1zb3VyY2UtcGx1Z2luJywgc3RhZ2U6IGNvbXBpbGVyLndlYnBhY2suQ29tcGlsYXRpb24uUFJPQ0VTU19BU1NFVFNfU1RBR0VfUkVQT1JUIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuaHRtbEFzc2V0TmFtZSkgcmV0dXJuXG4gICAgICAgICAgY29uc3QgaHRtbEFzc2V0ID0gY29tcGlsYXRpb24uYXNzZXRzW3RoaXMuaHRtbEFzc2V0TmFtZV1cbiAgICAgICAgICBpZiAoIWh0bWxBc3NldCkgcmV0dXJuXG4gICAgICAgICAgY29uc3QgaHRtbCA9IHRoaXMucHJvY2Vzc0FkZGl0aW9uYWxBc3NldHMoY29tcGlsYXRpb24sIGh0bWxBc3NldC5zb3VyY2UoKS50b1N0cmluZygpKVxuICAgICAgICAgIGNvbXBpbGF0aW9uLnVwZGF0ZUFzc2V0KHRoaXMuaHRtbEFzc2V0TmFtZSwgbmV3IGNvbXBpbGVyLndlYnBhY2suc291cmNlcy5SYXdTb3VyY2UoaHRtbCkpXG4gICAgICAgIH0sXG4gICAgICApXG5cbiAgICAgIC8vIE9ubHkgcmVtb3ZlIGFzc2V0cyB0aGF0IHdlcmUgYWN0dWFsbHkgaW5saW5lZCBpbnRvIHRoZSBIVE1MIGFib3ZlLiBCbGFua2V0LW1hdGNoaW5nIGJ5XG4gICAgICAvLyBleHRlbnNpb24gd291bGQgYWxzbyBkZWxldGUgdW5yZWxhdGVkIC5qcy8uY3NzIGFzc2V0cyB0aGF0IHdlcmUgbmV2ZXIgaW5saW5pbmcgY2FuZGlkYXRlc1xuICAgICAgLy8gaW4gdGhlIGZpcnN0IHBsYWNlIC0gZS5nLiBhIFdvcmtlciBjaHVuaywgd2hpY2ggYnJvd3NlcnMgbG9hZCB2aWEgdGhlIHNlcGFyYXRlIFdvcmtlciBBUElcbiAgICAgIC8vIHJhdGhlciB0aGFuIGEgPHNjcmlwdD4gdGFnLCBzbyBodG1sLXdlYnBhY2stcGx1Z2luIG5ldmVyIGdlbmVyYXRlcyBhIHRhZyBmb3IgaXQuXG4gICAgICAvLyBQUk9DRVNTX0FTU0VUU19TVEFHRV9SRVBPUlQgaXMgdGhlIGxhc3QgcHJvY2Vzc0Fzc2V0cyBzdGFnZSAtIGl0IHN0aWxsIHJ1bnMgYmVmb3JlXG4gICAgICAvLyBzZWFsaW5nIGZyZWV6ZXMgY29tcGlsYXRpb24uYXNzZXRzLCBzbyBjaHVuay5maWxlcyBoZXJlIGFscmVhZHkgcmVmbGVjdHMgYW55IGVhcmxpZXJcbiAgICAgIC8vIHN0YWdlJ3MgcmVuYW1lIChlLmcuIFRlcnNlcidzIGNvbnRlbnRoYXNoIHJlY29tcHV0ZSkuXG4gICAgICBjb21waWxhdGlvbi5ob29rcy5wcm9jZXNzQXNzZXRzLnRhcChcbiAgICAgICAgLy8gUmVhZCB0aGUgc3RhZ2UgY29uc3RhbnQgb2ZmIGNvbXBpbGVyLndlYnBhY2sgcmF0aGVyIHRoYW4gaW1wb3J0aW5nIENvbXBpbGF0aW9uIGFzIGFcbiAgICAgICAgLy8gdmFsdWUgZnJvbSAnd2VicGFjaycgZGlyZWN0bHkgLSB0aGUgcGx1Z2luIHRoZW4ga2VlcHMgd29ya2luZyBjb3JyZWN0bHkgZXZlbiBpZiB0aGVcbiAgICAgICAgLy8gaG9zdCBwcm9qZWN0IHJlc29sdmVzIGEgZGlmZmVyZW50IHdlYnBhY2sgaW5zdGFuY2UgdGhhbiB0aGUgb25lIGluIHRoaXMgcGFja2FnZSdzIG93blxuICAgICAgICAvLyBub2RlX21vZHVsZXMgKHRoZSBzdGFuZGFyZCByZWFzb24gd2VicGFjayBwbHVnaW5zIGF2b2lkIGEgZGlyZWN0IGByZXF1aXJlKCd3ZWJwYWNrJylgKS5cbiAgICAgICAgeyBuYW1lOiAnaHRtbC1pbmxpbmUtc291cmNlLXBsdWdpbicsIHN0YWdlOiBjb21waWxlci53ZWJwYWNrLkNvbXBpbGF0aW9uLlBST0NFU1NfQVNTRVRTX1NUQUdFX1JFUE9SVCB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbmxpbmVkQ2h1bmtzPy5mb3JFYWNoKChjaHVua09yTmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjaHVua09yTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29tcGlsYXRpb24uZGVsZXRlQXNzZXQoY2h1bmtPck5hbWUpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2h1bmtPck5hbWUuZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgICBjb21waWxhdGlvbi5kZWxldGVBc3NldChmaWxlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnN0IGZhdmljb25GaWxlID0gdGhpcy5mYXZpY29uUGF0aD8uc3BsaXQocGF0aC5zZXApPy5wb3AoKVxuICAgICAgICAgIGlmIChmYXZpY29uRmlsZSkge1xuICAgICAgICAgICAgY29tcGlsYXRpb24uZGVsZXRlQXNzZXQoZmF2aWNvbkZpbGUpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSHRtbElubGluZVNvdXJjZVBsdWdpblxuIl19
|
|
@@ -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;
|