UNPKG

@anansi/webpack-config

Version:
202 lines (196 loc) 28.2 kB
"use strict"; exports.__esModule = true; exports.default = makeStorybookConfigGenerator; exports.isStorybookSpecific = exports.findLoadersInRule = exports.findLibraryRule = void 0; const isStorybookSpecific = loader => { if (!loader || typeof loader !== 'string') return false; if (!loader.includes('@storybook')) return false; return loader.includes('loader'); }; exports.isStorybookSpecific = isStorybookSpecific; const findLoadersInRule = rule => { if (!rule) return []; const loaders = []; if (rule.loader) { loaders.push(rule.loader); } if (rule.use) { const useArray = Array.isArray(rule.use) ? rule.use : [rule.use]; useArray.forEach(loadConfig => { if (typeof loadConfig === 'string') { loaders.push(loadConfig); } else if (loadConfig?.loader) { loaders.push(loadConfig.loader); } }); } if (rule.rules && Array.isArray(rule.rules)) { rule.rules.forEach(nestedRule => { loaders.push(...findLoadersInRule(nestedRule)); }); } return loaders; }; exports.findLoadersInRule = findLoadersInRule; const findLibraryRule = storybookConfig => { const rules = storybookConfig?.module?.rules; if (!Array.isArray(rules) || rules.length === 0) return undefined; // Storybook 8 specific case; we know the rule is at index 1 if (rules[1] && !rules[1].test?.test?.('test.mdx')) { const candidate = rules[1]; let hasNodeModulesInclude = false; if (candidate.include) { if (typeof candidate.include === 'string') { hasNodeModulesInclude = candidate.include.includes('node_modules'); } else if (candidate.include instanceof RegExp) { hasNodeModulesInclude = candidate.include.test('node_modules/@storybook'); } } const candidateLoaders = findLoadersInRule(candidate); const hasStorybookLoader = candidateLoaders.some(loader => typeof loader === 'string' && loader.includes('@storybook')); if (hasNodeModulesInclude || hasStorybookLoader) { return candidate; } } for (const rule of rules) { if (!rule?.include) continue; let includeStr = ''; if (typeof rule.include === 'string') { includeStr = rule.include; } else if (rule.include instanceof RegExp) { includeStr = rule.include.toString(); } if (includeStr.includes('@storybook') || includeStr.includes('node_modules')) { const loaders = findLoadersInRule(rule); if (!loaders.some(l => /export-order-loader|mdx-loader/.test(l))) { return rule; } } } return rules[1]; }; exports.findLibraryRule = findLibraryRule; function makeStorybookConfigGenerator(baseConfig) { return ({ config: storybookConfig, mode }) => { const env = mode.toLowerCase(); const argv = { mode: env }; const envConfig = typeof baseConfig === 'function' ? baseConfig(env, argv) : baseConfig; // we need some of their plugins (https://github.com/storybooks/storybook/pull/1775/files) const storybookPlugins = storybookConfig.plugins.filter(plugin => // exclude ones we configure !['DefinePlugin', 'EnvironmentPlugin', 'ReactRefreshPlugin', //'HotModuleReplacementPlugin', since storybook 6.4 we need this again 'CaseSensitivePathsPlugin', // this makes process redundant 'ProvidePlugin'].includes(plugin.constructor.name)); const basePlugins = envConfig.plugins.filter(plugin => // defer to storybook's version in this case // TODO: try to simply copy configuration and reuse our HtmlWebpackPlugin ![ // storybook runs this build after building the storybook chrome ui, so we don't want to clear that out // they also clean the directory in that stage anyway 'CleanWebpackPlugin', 'HtmlWebpackPlugin', 'ErrorOverlayPlugin', 'StatsPlugin', // storybook puts .cache in node_modules so this prevents infinite loop 'WatchMissingNodeModulesPlugin'].includes(plugin.constructor.name)); // included rules: // - .mdx // - .stories files // - acorn-jsx node_modules rule // - any storybook specific loaders (export-order-loader, mdx-loader, etc.) const storybookRules = storybookConfig.module.rules.filter(rule => { // MDX files if (rule.test?.test?.('test.mdx') || rule.test?.test?.('test.story.mdx')) return true; // Story files if (rule.test?.test?.('test.stories.tsx') || rule.test?.test?.('test.stories.jsx')) return true; // acorn-jsx node_modules rule if (rule.include instanceof RegExp && rule.include.test('node_modules/acorn-jsx/')) return true; // Check for storybook-specific loaders const loaders = findLoadersInRule(rule); if (loaders.some(isStorybookSpecific)) { return true; } // Check for export-order-loader or mdx-loader (SB9 specific) if (loaders.some(l => l && (l.includes('export-order-loader') || l.includes('mdx-loader') || l.includes('@storybook/builder-webpack5')))) { return true; } return false; }); // Find the library rule that compiles storybook's own node_modules const libraryRule = findLibraryRule(storybookConfig); // Don't run this on our project source if (libraryRule && envConfig?.resolve?.modules?.[0]) { // Ensure exclude is an array if (!libraryRule.exclude) { libraryRule.exclude = []; } else if (!Array.isArray(libraryRule.exclude)) { libraryRule.exclude = [libraryRule.exclude]; } // Add our source directory to exclude const sourcePath = envConfig.resolve.modules[0]; if (!libraryRule.exclude.includes(sourcePath)) { libraryRule.exclude.push(sourcePath); } } // storybook doesn't like us setting this very much. delete envConfig.devServer; const otherEnvRules = envConfig.module.rules.slice(1); const config = { watchOptions: storybookConfig.watchOptions, ...envConfig, resolveLoader: { ...envConfig.resolveLoader, plugins: [...(envConfig.resolveLoader?.plugins ?? []), ...(storybookConfig.resolveLoader?.plugins ?? [])] }, resolve: { ...storybookConfig.resolve, modules: envConfig.resolve.modules, extensions: envConfig.resolve.extensions, alias: { ...envConfig.resolve.alias, ...storybookConfig.resolve.alias }, fallback: { ...envConfig.resolve.fallback, ...(storybookConfig.resolve?.fallback ?? {}) }, plugins: [...(envConfig.resolve?.plugins ?? []), ...(storybookConfig.resolve?.plugins ?? [])] }, entry: storybookConfig.entry, output: storybookConfig.output, plugins: [...storybookPlugins, ...basePlugins], module: { ...envConfig.module, rules: [ // js rules (worker and normal) { test: envConfig.module.rules[0].test, exclude: /storybook-stories.js/, rules: [envConfig.module.rules[0]] }, // storybook node_module compiles (only if found) ...(libraryRule ? [libraryRule] : []), // the rest of our rules ...otherEnvRules, // typically these are various plugins ...storybookRules] } }; if (envConfig.cache) { if (typeof envConfig.cache === 'object' && envConfig.cache.type === 'filesystem') { config.cache = { ...envConfig.cache, version: envConfig.cache.version + 'storybook' }; } else { config.cache = envConfig.cache; } } return config; }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc1N0b3J5Ym9va1NwZWNpZmljIiwibG9hZGVyIiwiaW5jbHVkZXMiLCJleHBvcnRzIiwiZmluZExvYWRlcnNJblJ1bGUiLCJydWxlIiwibG9hZGVycyIsInB1c2giLCJ1c2UiLCJ1c2VBcnJheSIsIkFycmF5IiwiaXNBcnJheSIsImZvckVhY2giLCJsb2FkQ29uZmlnIiwicnVsZXMiLCJuZXN0ZWRSdWxlIiwiZmluZExpYnJhcnlSdWxlIiwic3Rvcnlib29rQ29uZmlnIiwibW9kdWxlIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwidGVzdCIsImNhbmRpZGF0ZSIsImhhc05vZGVNb2R1bGVzSW5jbHVkZSIsImluY2x1ZGUiLCJSZWdFeHAiLCJjYW5kaWRhdGVMb2FkZXJzIiwiaGFzU3Rvcnlib29rTG9hZGVyIiwic29tZSIsImluY2x1ZGVTdHIiLCJ0b1N0cmluZyIsImwiLCJtYWtlU3Rvcnlib29rQ29uZmlnR2VuZXJhdG9yIiwiYmFzZUNvbmZpZyIsImNvbmZpZyIsIm1vZGUiLCJlbnYiLCJ0b0xvd2VyQ2FzZSIsImFyZ3YiLCJlbnZDb25maWciLCJzdG9yeWJvb2tQbHVnaW5zIiwicGx1Z2lucyIsImZpbHRlciIsInBsdWdpbiIsImNvbnN0cnVjdG9yIiwibmFtZSIsImJhc2VQbHVnaW5zIiwic3Rvcnlib29rUnVsZXMiLCJsaWJyYXJ5UnVsZSIsInJlc29sdmUiLCJtb2R1bGVzIiwiZXhjbHVkZSIsInNvdXJjZVBhdGgiLCJkZXZTZXJ2ZXIiLCJvdGhlckVudlJ1bGVzIiwic2xpY2UiLCJ3YXRjaE9wdGlvbnMiLCJyZXNvbHZlTG9hZGVyIiwiZXh0ZW5zaW9ucyIsImFsaWFzIiwiZmFsbGJhY2siLCJlbnRyeSIsIm91dHB1dCIsImNhY2hlIiwidHlwZSIsInZlcnNpb24iXSwic291cmNlcyI6WyIuLi9zcmMvc3Rvcnlib29rLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGlzU3Rvcnlib29rU3BlY2lmaWMgPSBsb2FkZXIgPT4ge1xuICBpZiAoIWxvYWRlciB8fCB0eXBlb2YgbG9hZGVyICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWxvYWRlci5pbmNsdWRlcygnQHN0b3J5Ym9vaycpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBsb2FkZXIuaW5jbHVkZXMoJ2xvYWRlcicpO1xufTtcblxuY29uc3QgZmluZExvYWRlcnNJblJ1bGUgPSBydWxlID0+IHtcbiAgaWYgKCFydWxlKSByZXR1cm4gW107XG5cbiAgY29uc3QgbG9hZGVycyA9IFtdO1xuICBpZiAocnVsZS5sb2FkZXIpIHtcbiAgICBsb2FkZXJzLnB1c2gocnVsZS5sb2FkZXIpO1xuICB9XG4gIGlmIChydWxlLnVzZSkge1xuICAgIGNvbnN0IHVzZUFycmF5ID0gQXJyYXkuaXNBcnJheShydWxlLnVzZSkgPyBydWxlLnVzZSA6IFtydWxlLnVzZV07XG4gICAgdXNlQXJyYXkuZm9yRWFjaChsb2FkQ29uZmlnID0+IHtcbiAgICAgIGlmICh0eXBlb2YgbG9hZENvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbG9hZGVycy5wdXNoKGxvYWRDb25maWcpO1xuICAgICAgfSBlbHNlIGlmIChsb2FkQ29uZmlnPy5sb2FkZXIpIHtcbiAgICAgICAgbG9hZGVycy5wdXNoKGxvYWRDb25maWcubG9hZGVyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBpZiAocnVsZS5ydWxlcyAmJiBBcnJheS5pc0FycmF5KHJ1bGUucnVsZXMpKSB7XG4gICAgcnVsZS5ydWxlcy5mb3JFYWNoKG5lc3RlZFJ1bGUgPT4ge1xuICAgICAgbG9hZGVycy5wdXNoKC4uLmZpbmRMb2FkZXJzSW5SdWxlKG5lc3RlZFJ1bGUpKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbG9hZGVycztcbn07XG5cbmNvbnN0IGZpbmRMaWJyYXJ5UnVsZSA9IHN0b3J5Ym9va0NvbmZpZyA9PiB7XG4gIGNvbnN0IHJ1bGVzID0gc3Rvcnlib29rQ29uZmlnPy5tb2R1bGU/LnJ1bGVzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocnVsZXMpIHx8IHJ1bGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBTdG9yeWJvb2sgOCBzcGVjaWZpYyBjYXNlOyB3ZSBrbm93IHRoZSBydWxlIGlzIGF0IGluZGV4IDFcbiAgaWYgKHJ1bGVzWzFdICYmICFydWxlc1sxXS50ZXN0Py50ZXN0Py4oJ3Rlc3QubWR4JykpIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBydWxlc1sxXTtcbiAgICBsZXQgaGFzTm9kZU1vZHVsZXNJbmNsdWRlID0gZmFsc2U7XG4gICAgaWYgKGNhbmRpZGF0ZS5pbmNsdWRlKSB7XG4gICAgICBpZiAodHlwZW9mIGNhbmRpZGF0ZS5pbmNsdWRlID09PSAnc3RyaW5nJykge1xuICAgICAgICBoYXNOb2RlTW9kdWxlc0luY2x1ZGUgPSBjYW5kaWRhdGUuaW5jbHVkZS5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJyk7XG4gICAgICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5pbmNsdWRlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIGhhc05vZGVNb2R1bGVzSW5jbHVkZSA9IGNhbmRpZGF0ZS5pbmNsdWRlLnRlc3QoXG4gICAgICAgICAgJ25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FuZGlkYXRlTG9hZGVycyA9IGZpbmRMb2FkZXJzSW5SdWxlKGNhbmRpZGF0ZSk7XG4gICAgY29uc3QgaGFzU3Rvcnlib29rTG9hZGVyID0gY2FuZGlkYXRlTG9hZGVycy5zb21lKFxuICAgICAgbG9hZGVyID0+IHR5cGVvZiBsb2FkZXIgPT09ICdzdHJpbmcnICYmIGxvYWRlci5pbmNsdWRlcygnQHN0b3J5Ym9vaycpLFxuICAgICk7XG4gICAgaWYgKGhhc05vZGVNb2R1bGVzSW5jbHVkZSB8fCBoYXNTdG9yeWJvb2tMb2FkZXIpIHtcbiAgICAgIHJldHVybiBjYW5kaWRhdGU7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgaWYgKCFydWxlPy5pbmNsdWRlKSBjb250aW51ZTtcbiAgICBsZXQgaW5jbHVkZVN0ciA9ICcnO1xuICAgIGlmICh0eXBlb2YgcnVsZS5pbmNsdWRlID09PSAnc3RyaW5nJykge1xuICAgICAgaW5jbHVkZVN0ciA9IHJ1bGUuaW5jbHVkZTtcbiAgICB9IGVsc2UgaWYgKHJ1bGUuaW5jbHVkZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgaW5jbHVkZVN0ciA9IHJ1bGUuaW5jbHVkZS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGluY2x1ZGVTdHIuaW5jbHVkZXMoJ0BzdG9yeWJvb2snKSB8fFxuICAgICAgaW5jbHVkZVN0ci5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJylcbiAgICApIHtcbiAgICAgIGNvbnN0IGxvYWRlcnMgPSBmaW5kTG9hZGVyc0luUnVsZShydWxlKTtcbiAgICAgIGlmICghbG9hZGVycy5zb21lKGwgPT4gL2V4cG9ydC1vcmRlci1sb2FkZXJ8bWR4LWxvYWRlci8udGVzdChsKSkpIHtcbiAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJ1bGVzWzFdO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWFrZVN0b3J5Ym9va0NvbmZpZ0dlbmVyYXRvcihiYXNlQ29uZmlnKSB7XG4gIHJldHVybiAoeyBjb25maWc6IHN0b3J5Ym9va0NvbmZpZywgbW9kZSB9KSA9PiB7XG4gICAgY29uc3QgZW52ID0gbW9kZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGFyZ3YgPSB7IG1vZGU6IGVudiB9O1xuICAgIGNvbnN0IGVudkNvbmZpZyA9XG4gICAgICB0eXBlb2YgYmFzZUNvbmZpZyA9PT0gJ2Z1bmN0aW9uJyA/IGJhc2VDb25maWcoZW52LCBhcmd2KSA6IGJhc2VDb25maWc7XG5cbiAgICAvLyB3ZSBuZWVkIHNvbWUgb2YgdGhlaXIgcGx1Z2lucyAoaHR0cHM6Ly9naXRodWIuY29tL3N0b3J5Ym9va3Mvc3Rvcnlib29rL3B1bGwvMTc3NS9maWxlcylcbiAgICBjb25zdCBzdG9yeWJvb2tQbHVnaW5zID0gc3Rvcnlib29rQ29uZmlnLnBsdWdpbnMuZmlsdGVyKFxuICAgICAgcGx1Z2luID0+XG4gICAgICAgIC8vIGV4Y2x1ZGUgb25lcyB3ZSBjb25maWd1cmVcbiAgICAgICAgIVtcbiAgICAgICAgICAnRGVmaW5lUGx1Z2luJyxcbiAgICAgICAgICAnRW52aXJvbm1lbnRQbHVnaW4nLFxuICAgICAgICAgICdSZWFjdFJlZnJlc2hQbHVnaW4nLFxuICAgICAgICAgIC8vJ0hvdE1vZHVsZVJlcGxhY2VtZW50UGx1Z2luJywgc2luY2Ugc3Rvcnlib29rIDYuNCB3ZSBuZWVkIHRoaXMgYWdhaW5cbiAgICAgICAgICAnQ2FzZVNlbnNpdGl2ZVBhdGhzUGx1Z2luJyxcbiAgICAgICAgICAvLyB0aGlzIG1ha2VzIHByb2Nlc3MgcmVkdW5kYW50XG4gICAgICAgICAgJ1Byb3ZpZGVQbHVnaW4nLFxuICAgICAgICBdLmluY2x1ZGVzKHBsdWdpbi5jb25zdHJ1Y3Rvci5uYW1lKSxcbiAgICApO1xuICAgIGNvbnN0IGJhc2VQbHVnaW5zID0gZW52Q29uZmlnLnBsdWdpbnMuZmlsdGVyKFxuICAgICAgcGx1Z2luID0+XG4gICAgICAgIC8vIGRlZmVyIHRvIHN0b3J5Ym9vaydzIHZlcnNpb24gaW4gdGhpcyBjYXNlXG4gICAgICAgIC8vIFRPRE86IHRyeSB0byBzaW1wbHkgY29weSBjb25maWd1cmF0aW9uIGFuZCByZXVzZSBvdXIgSHRtbFdlYnBhY2tQbHVnaW5cbiAgICAgICAgIVtcbiAgICAgICAgICAvLyBzdG9yeWJvb2sgcnVucyB0aGlzIGJ1aWxkIGFmdGVyIGJ1aWxkaW5nIHRoZSBzdG9yeWJvb2sgY2hyb21lIHVpLCBzbyB3ZSBkb24ndCB3YW50IHRvIGNsZWFyIHRoYXQgb3V0XG4gICAgICAgICAgLy8gdGhleSBhbHNvIGNsZWFuIHRoZSBkaXJlY3RvcnkgaW4gdGhhdCBzdGFnZSBhbnl3YXlcbiAgICAgICAgICAnQ2xlYW5XZWJwYWNrUGx1Z2luJyxcbiAgICAgICAgICAnSHRtbFdlYnBhY2tQbHVnaW4nLFxuICAgICAgICAgICdFcnJvck92ZXJsYXlQbHVnaW4nLFxuICAgICAgICAgICdTdGF0c1BsdWdpbicsXG4gICAgICAgICAgLy8gc3Rvcnlib29rIHB1dHMgLmNhY2hlIGluIG5vZGVfbW9kdWxlcyBzbyB0aGlzIHByZXZlbnRzIGluZmluaXRlIGxvb3BcbiAgICAgICAgICAnV2F0Y2hNaXNzaW5nTm9kZU1vZHVsZXNQbHVnaW4nLFxuICAgICAgICBdLmluY2x1ZGVzKHBsdWdpbi5jb25zdHJ1Y3Rvci5uYW1lKSxcbiAgICApO1xuXG4gICAgLy8gaW5jbHVkZWQgcnVsZXM6XG4gICAgLy8gLSAubWR4XG4gICAgLy8gLSAuc3RvcmllcyBmaWxlc1xuICAgIC8vIC0gYWNvcm4tanN4IG5vZGVfbW9kdWxlcyBydWxlXG4gICAgLy8gLSBhbnkgc3Rvcnlib29rIHNwZWNpZmljIGxvYWRlcnMgKGV4cG9ydC1vcmRlci1sb2FkZXIsIG1keC1sb2FkZXIsIGV0Yy4pXG4gICAgY29uc3Qgc3Rvcnlib29rUnVsZXMgPSBzdG9yeWJvb2tDb25maWcubW9kdWxlLnJ1bGVzLmZpbHRlcihydWxlID0+IHtcbiAgICAgIC8vIE1EWCBmaWxlc1xuICAgICAgaWYgKHJ1bGUudGVzdD8udGVzdD8uKCd0ZXN0Lm1keCcpIHx8IHJ1bGUudGVzdD8udGVzdD8uKCd0ZXN0LnN0b3J5Lm1keCcpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIC8vIFN0b3J5IGZpbGVzXG4gICAgICBpZiAoXG4gICAgICAgIHJ1bGUudGVzdD8udGVzdD8uKCd0ZXN0LnN0b3JpZXMudHN4JykgfHxcbiAgICAgICAgcnVsZS50ZXN0Py50ZXN0Py4oJ3Rlc3Quc3Rvcmllcy5qc3gnKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIC8vIGFjb3JuLWpzeCBub2RlX21vZHVsZXMgcnVsZVxuICAgICAgaWYgKFxuICAgICAgICBydWxlLmluY2x1ZGUgaW5zdGFuY2VvZiBSZWdFeHAgJiZcbiAgICAgICAgcnVsZS5pbmNsdWRlLnRlc3QoJ25vZGVfbW9kdWxlcy9hY29ybi1qc3gvJylcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAvLyBDaGVjayBmb3Igc3Rvcnlib29rLXNwZWNpZmljIGxvYWRlcnNcbiAgICAgIGNvbnN0IGxvYWRlcnMgPSBmaW5kTG9hZGVyc0luUnVsZShydWxlKTtcbiAgICAgIGlmIChsb2FkZXJzLnNvbWUoaXNTdG9yeWJvb2tTcGVjaWZpYykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBmb3IgZXhwb3J0LW9yZGVyLWxvYWRlciBvciBtZHgtbG9hZGVyIChTQjkgc3BlY2lmaWMpXG4gICAgICBpZiAoXG4gICAgICAgIGxvYWRlcnMuc29tZShcbiAgICAgICAgICBsID0+XG4gICAgICAgICAgICBsICYmXG4gICAgICAgICAgICAobC5pbmNsdWRlcygnZXhwb3J0LW9yZGVyLWxvYWRlcicpIHx8XG4gICAgICAgICAgICAgIGwuaW5jbHVkZXMoJ21keC1sb2FkZXInKSB8fFxuICAgICAgICAgICAgICBsLmluY2x1ZGVzKCdAc3Rvcnlib29rL2J1aWxkZXItd2VicGFjazUnKSksXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgIC8vIEZpbmQgdGhlIGxpYnJhcnkgcnVsZSB0aGF0IGNvbXBpbGVzIHN0b3J5Ym9vaydzIG93biBub2RlX21vZHVsZXNcbiAgICBjb25zdCBsaWJyYXJ5UnVsZSA9IGZpbmRMaWJyYXJ5UnVsZShzdG9yeWJvb2tDb25maWcpO1xuICAgIC8vIERvbid0IHJ1biB0aGlzIG9uIG91ciBwcm9qZWN0IHNvdXJjZVxuICAgIGlmIChsaWJyYXJ5UnVsZSAmJiBlbnZDb25maWc/LnJlc29sdmU/Lm1vZHVsZXM/LlswXSkge1xuICAgICAgLy8gRW5zdXJlIGV4Y2x1ZGUgaXMgYW4gYXJyYXlcbiAgICAgIGlmICghbGlicmFyeVJ1bGUuZXhjbHVkZSkge1xuICAgICAgICBsaWJyYXJ5UnVsZS5leGNsdWRlID0gW107XG4gICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGxpYnJhcnlSdWxlLmV4Y2x1ZGUpKSB7XG4gICAgICAgIGxpYnJhcnlSdWxlLmV4Y2x1ZGUgPSBbbGlicmFyeVJ1bGUuZXhjbHVkZV07XG4gICAgICB9XG4gICAgICAvLyBBZGQgb3VyIHNvdXJjZSBkaXJlY3RvcnkgdG8gZXhjbHVkZVxuICAgICAgY29uc3Qgc291cmNlUGF0aCA9IGVudkNvbmZpZy5yZXNvbHZlLm1vZHVsZXNbMF07XG4gICAgICBpZiAoIWxpYnJhcnlSdWxlLmV4Y2x1ZGUuaW5jbHVkZXMoc291cmNlUGF0aCkpIHtcbiAgICAgICAgbGlicmFyeVJ1bGUuZXhjbHVkZS5wdXNoKHNvdXJjZVBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHN0b3J5Ym9vayBkb2Vzbid0IGxpa2UgdXMgc2V0dGluZyB0aGlzIHZlcnkgbXVjaC5cbiAgICBkZWxldGUgZW52Q29uZmlnLmRldlNlcnZlcjtcblxuICAgIGNvbnN0IG90aGVyRW52UnVsZXMgPSBlbnZDb25maWcubW9kdWxlLnJ1bGVzLnNsaWNlKDEpO1xuXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgd2F0Y2hPcHRpb25zOiBzdG9yeWJvb2tDb25maWcud2F0Y2hPcHRpb25zLFxuICAgICAgLi4uZW52Q29uZmlnLFxuICAgICAgcmVzb2x2ZUxvYWRlcjoge1xuICAgICAgICAuLi5lbnZDb25maWcucmVzb2x2ZUxvYWRlcixcbiAgICAgICAgcGx1Z2luczogW1xuICAgICAgICAgIC4uLihlbnZDb25maWcucmVzb2x2ZUxvYWRlcj8ucGx1Z2lucyA/PyBbXSksXG4gICAgICAgICAgLi4uKHN0b3J5Ym9va0NvbmZpZy5yZXNvbHZlTG9hZGVyPy5wbHVnaW5zID8/IFtdKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICByZXNvbHZlOiB7XG4gICAgICAgIC4uLnN0b3J5Ym9va0NvbmZpZy5yZXNvbHZlLFxuICAgICAgICBtb2R1bGVzOiBlbnZDb25maWcucmVzb2x2ZS5tb2R1bGVzLFxuICAgICAgICBleHRlbnNpb25zOiBlbnZDb25maWcucmVzb2x2ZS5leHRlbnNpb25zLFxuICAgICAgICBhbGlhczogeyAuLi5lbnZDb25maWcucmVzb2x2ZS5hbGlhcywgLi4uc3Rvcnlib29rQ29uZmlnLnJlc29sdmUuYWxpYXMgfSxcbiAgICAgICAgZmFsbGJhY2s6IHtcbiAgICAgICAgICAuLi5lbnZDb25maWcucmVzb2x2ZS5mYWxsYmFjayxcbiAgICAgICAgICAuLi4oc3Rvcnlib29rQ29uZmlnLnJlc29sdmU/LmZhbGxiYWNrID8/IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1Z2luczogW1xuICAgICAgICAgIC4uLihlbnZDb25maWcucmVzb2x2ZT8ucGx1Z2lucyA/PyBbXSksXG4gICAgICAgICAgLi4uKHN0b3J5Ym9va0NvbmZpZy5yZXNvbHZlPy5wbHVnaW5zID8/IFtdKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG5cbiAgICAgIGVudHJ5OiBzdG9yeWJvb2tDb25maWcuZW50cnksXG4gICAgICBvdXRwdXQ6IHN0b3J5Ym9va0NvbmZpZy5vdXRwdXQsXG4gICAgICBwbHVnaW5zOiBbLi4uc3Rvcnlib29rUGx1Z2lucywgLi4uYmFzZVBsdWdpbnNdLFxuICAgICAgbW9kdWxlOiB7XG4gICAgICAgIC4uLmVudkNvbmZpZy5tb2R1bGUsXG4gICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgLy8ganMgcnVsZXMgKHdvcmtlciBhbmQgbm9ybWFsKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRlc3Q6IGVudkNvbmZpZy5tb2R1bGUucnVsZXNbMF0udGVzdCxcbiAgICAgICAgICAgIGV4Y2x1ZGU6IC9zdG9yeWJvb2stc3Rvcmllcy5qcy8sXG4gICAgICAgICAgICBydWxlczogW2VudkNvbmZpZy5tb2R1bGUucnVsZXNbMF1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gc3Rvcnlib29rIG5vZGVfbW9kdWxlIGNvbXBpbGVzIChvbmx5IGlmIGZvdW5kKVxuICAgICAgICAgIC4uLihsaWJyYXJ5UnVsZSA/IFtsaWJyYXJ5UnVsZV0gOiBbXSksXG4gICAgICAgICAgLy8gdGhlIHJlc3Qgb2Ygb3VyIHJ1bGVzXG4gICAgICAgICAgLi4ub3RoZXJFbnZSdWxlcyxcbiAgICAgICAgICAvLyB0eXBpY2FsbHkgdGhlc2UgYXJlIHZhcmlvdXMgcGx1Z2luc1xuICAgICAgICAgIC4uLnN0b3J5Ym9va1J1bGVzLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGlmIChlbnZDb25maWcuY2FjaGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGVudkNvbmZpZy5jYWNoZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgZW52Q29uZmlnLmNhY2hlLnR5cGUgPT09ICdmaWxlc3lzdGVtJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbmZpZy5jYWNoZSA9IHtcbiAgICAgICAgICAuLi5lbnZDb25maWcuY2FjaGUsXG4gICAgICAgICAgdmVyc2lvbjogZW52Q29uZmlnLmNhY2hlLnZlcnNpb24gKyAnc3Rvcnlib29rJyxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbmZpZy5jYWNoZSA9IGVudkNvbmZpZy5jYWNoZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfTtcbn1cblxuZXhwb3J0IHsgaXNTdG9yeWJvb2tTcGVjaWZpYywgZmluZExvYWRlcnNJblJ1bGUsIGZpbmRMaWJyYXJ5UnVsZSB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE1BQU1BLG1CQUFtQixHQUFHQyxNQUFNLElBQUk7RUFDcEMsSUFBSSxDQUFDQSxNQUFNLElBQUksT0FBT0EsTUFBTSxL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