@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.
package/loaders/index.js CHANGED
@@ -1,17 +1,19 @@
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.markdownConfigFactory = exports.babelConfigFactory = exports.assetExtensions = exports.imageExtensions = exports.fontExtensions = exports.nullConfigFactory = exports.styleConfigFactory = void 0;
7
- const mini_css_extract_plugin_1 = __importDefault(require("mini-css-extract-plugin"));
8
- const postcss_import_webpack_resolver_1 = __importDefault(require("postcss-import-webpack-resolver"));
9
- const WebcomponentStyleLoader = require.resolve('./WebcomponentStyleLoader');
10
- const remark_code_import_1 = __importDefault(require("remark-code-import"));
11
- const rehype_unwrap_images_1 = __importDefault(require("rehype-unwrap-images"));
12
- const remark_embed_images_1 = __importDefault(require("remark-embed-images"));
13
- const styleConfigFactory = ({ raw = false, extract = false, sourceMap = false, typedStyles = false, modules = undefined, parser = undefined, aliases = {}, } = {}) => {
14
- var _a;
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: mini_css_extract_plugin_1.default.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: (_a = modules === null || modules === void 0 ? void 0 : modules.localIdentName) !== null && _a !== void 0 ? _a : '[local]_[hash:base64:5]',
59
+ localIdentName: modules?.localIdentName ?? '[local]_[hash:base64:5]',
58
60
  getLocalIdent: (loaderContext, _, localName) => {
59
- var _a;
60
61
  const { resourcePath } = loaderContext;
61
- const mappings = (_a = modules === null || modules === void 0 ? void 0 : modules.mappings) !== null && _a !== void 0 ? _a : [];
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: (0, postcss_import_webpack_resolver_1.default)({
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
- exports.styleConfigFactory = styleConfigFactory;
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
- exports.nullConfigFactory = nullConfigFactory;
123
- exports.fontExtensions = ['ttf', 'eot', 'woff', 'woff2'];
124
- exports.imageExtensions = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'ico'];
125
- const assetExtensions = (extensions = [...exports.imageExtensions, ...exports.fontExtensions]) => new RegExp(`\\.(${extensions.join('|')})(\\?.*$|$)?$`);
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
- exports.babelConfigFactory = babelConfigFactory;
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(...(0, exports.babelConfigFactory)({ babel }));
135
+ loaders.push(...babelConfigFactory({ babel }));
136
136
  loaders.push({
137
137
  loader: '@mdx-js/loader',
138
138
  options: {
139
- remarkPlugins: [remark_code_import_1.default, remark_embed_images_1.default, rehype_unwrap_images_1.default, ...remark],
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG9hZGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLG9CQUFvQixNQUFNLHlCQUF5QixDQUFBO0FBQzFELE9BQU8sZUFBZSxNQUFNLGtCQUFrQixDQUFBO0FBQzlDLE9BQU8sVUFBVSxNQUFNLG9CQUFvQixDQUFBO0FBQzNDLE9BQU8sV0FBVyxNQUFNLHNCQUFzQixDQUFBO0FBQzlDLE9BQU8sV0FBVyxNQUFNLHFCQUFxQixDQUFBO0FBRTdDLHNHQUFzRztBQUN0RyxxR0FBcUc7QUFDckcsaUdBQWlHO0FBQ2pHLGlCQUFpQjtBQUNqQixPQUFPLHVCQUF1QixNQUFNLDBDQUEwQyxDQUFBO0FBRTlFLDRGQUE0RjtBQUM1Rix1RkFBdUY7QUFDdkYsZ0dBQWdHO0FBQ2hHLHFEQUFxRDtBQUNyRCxNQUFNLEVBQUUsTUFBTSxFQUFFLHNCQUFzQixFQUFFLEdBQUcsZUFBZSxDQUFBO0FBRTFELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsRUFDakMsR0FBRyxHQUFHLEtBQUssRUFDWCxPQUFPLEdBQUcsS0FBSyxFQUNmLFNBQVMsR0FBRyxLQUFLLEVBQ2pCLFdBQVcsR0FBRyxLQUFLLEVBQ25CLE9BQU8sR0FBRyxTQUdHLEVBQ2IsTUFBTSxHQUFHLFNBQW1ELEVBQzVELE9BQU8sR0FBRyxFQUE0QixNQUNwQyxFQUFFLEVBQUUsRUFBRTtJQUNSLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtJQUVsQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNYLE1BQU0sRUFBRSx1QkFBdUI7WUFDL0IsT0FBTyxFQUFFO2dCQUNQLEdBQUcsRUFBRSxJQUFJO2dCQUNULElBQUksRUFBRSxPQUFPO2dCQUNiLE9BQU8sRUFBRSxXQUFXO2FBQ3JCO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztTQUFNLENBQUM7UUFD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QUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEVBQ3BDLEtBQUssRUFDTCxNQUFNLEdBQUcsRUFBRSxFQUNYLE1BQU0sR0FBRyxFQUFFLEVBQ1gsV0FBVyxHQUFHLEtBQUssTUFDdUQsRUFBRSxFQUFFLEVBQUU7SUFDaEYsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBO0lBRWxCLElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNYLE1BQU0sRUFBRSxnQkFBZ0I7WUFDeEIsT0FBTyxFQUFFO2dCQUNQLGFBQWEsRUFBRSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDO2dCQUNoRSxhQUFhLEVBQUUsTUFBTTtnQkFDckIsb0JBQW9CLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDaEU7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxJQUFJLENBQ1Y7WUFDRSxNQUFNLEVBQUUsYUFBYTtTQUN0QixFQUNEO1lBQ0UsTUFBTSxFQUFFLGlCQUFpQjtTQUMxQixDQUNGLENBQUE7SUFDSCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1pbmlDc3NFeHRyYWN0UGx1Z2luIGZyb20gJ21pbmktY3NzLWV4dHJhY3QtcGx1Z2luJ1xuaW1wb3J0IGVuaGFuY2VkUmVzb2x2ZSBmcm9tICdlbmhhbmNlZC1yZXNvbHZlJ1xuaW1wb3J0IGNvZGVJbXBvcnQgZnJvbSAncmVtYXJrLWNvZGUtaW1wb3J0J1xuaW1wb3J0IGltYWdlVW53cmFwIGZyb20gJ3JlaHlwZS11bndyYXAtaW1hZ2VzJ1xuaW1wb3J0IGltYWdlSW1wb3J0IGZyb20gJ3JlbWFyay1lbWJlZC1pbWFnZXMnXG5cbi8vIFJlc29sdmluZyBgLi9XZWJjb21wb25lbnRTdHlsZUxvYWRlcmAncyBhYnNvbHV0ZSBwYXRoIG5lZWRzIGByZXF1aXJlLnJlc29sdmVgIChleHRlbnNpb25sZXNzLCBzbyBpdFxuLy8gZmluZHMgdGhlIGAudHNgIHNvdXJjZSB1bmRlciB0cy1qZXN0IGFuZCB0aGUgY29tcGlsZWQgYC5qc2AgaW4gdGhlIGJ1aWx0IG91dHB1dCBhbGlrZSkgLSBkZWxlZ2F0ZWRcbi8vIHRvIGEgcGxhaW4gYC5janNgIHNpYmxpbmcgc2luY2UgdGhpcyBmaWxlJ3Mgb3duIGJ1aWxkIG91dHB1dCBoYXMgbm8gYHJlcXVpcmVgIGF0IGFsbCAoc2VlIHRoYXRcbi8vIGZpbGUgZm9yIHdoeSkuXG5pbXBvcnQgV2ViY29tcG9uZW50U3R5bGVMb2FkZXIgZnJvbSAnLi9yZXNvbHZlV2ViY29tcG9uZW50U3R5bGVMb2FkZXJQYXRoLmNqcydcblxuLy8gYGVuaGFuY2VkLXJlc29sdmVgJ3MgbmFtZWQgZXhwb3J0cyBhcmVuJ3Qgc3RhdGljYWxseSBhbmFseXphYmxlIGJ5IE5vZGUncyBDSlMvRVNNIGludGVyb3Bcbi8vIChjanMtbW9kdWxlLWxleGVyKSBhdCBydW50aW1lLCBzbyBgaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAnZW5oYW5jZWQtcmVzb2x2ZSdgIHRocm93c1xuLy8gYFN5bnRheEVycm9yOiBOYW1lZCBleHBvcnQgJ2NyZWF0ZScgbm90IGZvdW5kYCBmb3IgcmVhbCBFU00gY29uc3VtZXJzIC0gZGVzdHJ1Y3R1cmluZyBvZmYgdGhlXG4vLyBkZWZhdWx0IGltcG9ydCBpcyB0aGUgTm9kZS1yZWNvbW1lbmRlZCB3b3JrYXJvdW5kLlxuY29uc3QgeyBjcmVhdGU6IGNyZWF0ZUVuaGFuY2VkUmVzb2x2ZXIgfSA9IGVuaGFuY2VkUmVzb2x2ZVxuXG5leHBvcnQgY29uc3Qgc3R5bGVDb25maWdGYWN0b3J5ID0gKHtcbiAgcmF3ID0gZmFsc2UsXG4gIGV4dHJhY3QgPSBmYWxzZSxcbiAgc291cmNlTWFwID0gZmFsc2UsXG4gIHR5cGVkU3R5bGVzID0gZmFsc2UsXG4gIG1vZHVsZXMgPSB1bmRlZmluZWQgYXNcbiAgICB8IHsgbG9jYWxJZGVudE5hbWU/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')
@@ -0,0 +1,2 @@
1
+ declare const webcomponentStyleLoaderPath: string
2
+ export default webcomponentStyleLoaderPath
package/package.json CHANGED
@@ -1,39 +1,38 @@
1
1
  {
2
2
  "name": "@enhanced-dom/webpack",
3
- "version": "0.3.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": "~0.2.0",
12
+ "@enhanced-dom/build": "^0.3.1",
12
13
  "@mdx-js/loader": "^3.1.1",
13
- "babel-loader": "^10.0.0",
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",
23
23
  "memory-fs": "^0.5.0",
24
24
  "mini-css-extract-plugin": "^2.8.0",
25
25
  "null-loader": "^4.0.1",
26
- "css-minimizer-webpack-plugin": "^7.0.2",
27
- "postcss": "^8.4.33",
26
+ "css-minimizer-webpack-plugin": "^8.0.0",
27
+ "enhanced-resolve": "^5.24.5",
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",
34
34
  "postcss-preset-env": "^10.4.0",
35
35
  "postcss-scss": "^4.0.9",
36
- "module-from-string": "^3.3.0",
37
36
  "raw-loader": "^4.0.2",
38
37
  "remark-code-import": "^1.2.0",
39
38
  "remark-embed-images": "^5.0.0",
@@ -42,24 +41,25 @@
42
41
  "source-map-loader": "^5.0.0",
43
42
  "style-loader": "^4.0.0",
44
43
  "terser-webpack-plugin": "^5.3.10",
45
- "webpack": "^5.90.1",
44
+ "webpack": "^5.107.2",
46
45
  "webpack-bundle-analyzer": "^5.0.1",
47
46
  "webpack-cli": "^6.0.1",
48
- "webpack-dev-server": "^5.2.2",
47
+ "webpack-dev-server": "^5.2.5",
48
+ "webpack-license-plugin": "^4.5.1",
49
49
  "serve": "^14.2.5"
50
50
  },
51
51
  "devDependencies": {
52
- "@enhanced-dom/lint": "~0.2.1",
53
- "@types/html-webpack-plugin": "^3.2.9",
54
- "@types/loader-utils": "^3.0.0",
52
+ "@enhanced-dom/claude": "^0.3.1",
53
+ "@enhanced-dom/jest": "^0.3.0",
54
+ "@enhanced-dom/lint": "^0.4.2",
55
55
  "@types/memory-fs": "^0.3.7",
56
+ "@types/node": "^22.20.5",
56
57
  "@types/optimize-css-assets-webpack-plugin": "^5.0.8",
57
58
  "@types/webpack": "^5.28.5",
58
- "@types/webpack-bundle-analyzer": "^4.7.0",
59
- "typescript": "^5.9.3"
59
+ "@types/webpack-bundle-analyzer": "^4.7.0"
60
60
  },
61
61
  "engines": {
62
- "node": ">=20",
63
- "npm": ">=10"
62
+ "node": ">=22.23.2",
63
+ "npm": ">=12"
64
64
  }
65
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