diff --git a/README.md b/README.md index b44d5a4a..37ab48f7 100644 --- a/README.md +++ b/README.md @@ -446,7 +446,7 @@ function MyComponent() { Select your toolkit, theme, and packages using [@sencha/ext-react-webpack-plugin](https://github.com/sencha/ext-react/tree/master/packages/ext-react-webpack-plugin). The plugin scans your code and only includes the classes you need in the final bundle. Here's an example: ```JavaScript -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin'); +const ExtWebpackPlugin = require('@sencha/ext-react webpack-plugin'); module.exports = { ... diff --git a/packages/ext-react-classic-boilerplate/package.json b/packages/ext-react-classic-boilerplate/package.json index 93a0cf49..1de3ff0c 100644 --- a/packages/ext-react-classic-boilerplate/package.json +++ b/packages/ext-react-classic-boilerplate/package.json @@ -55,7 +55,7 @@ "@babel/preset-env": "^7.2.0", "@babel/preset-react": "^7.0.0", "@sencha/ext-react-babel-plugin": "^6.7.0", - "@sencha/ext-webpack-plugin": "^7.0.0", + "@sencha/ext-react-webpack-plugin": "~6.7.1", "babel-loader": "^8.0.4", "copy-webpack-plugin": "^4.6.0", "cross-env": "^5.2.0", diff --git a/packages/ext-react-classic-boilerplate/webpack.config.js b/packages/ext-react-classic-boilerplate/webpack.config.js index 9df9f8bc..0477f659 100644 --- a/packages/ext-react-classic-boilerplate/webpack.config.js +++ b/packages/ext-react-classic-boilerplate/webpack.config.js @@ -1,7 +1,7 @@ const webpack = require('webpack') const path = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin') +const ExtWebpackPlugin = require('@sencha/ext-react webpack-plugin') const portfinder = require('portfinder') const sourcePath = path.join(__dirname, './src') diff --git a/packages/ext-react-classic-demo/package.json b/packages/ext-react-classic-demo/package.json index 25916550..e2fbae66 100644 --- a/packages/ext-react-classic-demo/package.json +++ b/packages/ext-react-classic-demo/package.json @@ -55,7 +55,7 @@ "@babel/preset-env": "^7.2.0", "@babel/preset-react": "^7.0.0", "@sencha/ext-react-babel-plugin": "^6.7.0", - "@sencha/ext-webpack-plugin": "^7.0.0", + "@sencha/ext-react-webpack-plugin": "~6.7.1", "babel-loader": "^8.0.4", "copy-webpack-plugin": "^4.6.0", "cross-env": "^5.2.0", diff --git a/packages/ext-react-classic-demo/webpack.config.js b/packages/ext-react-classic-demo/webpack.config.js index aa10ef31..442cbb53 100644 --- a/packages/ext-react-classic-demo/webpack.config.js +++ b/packages/ext-react-classic-demo/webpack.config.js @@ -1,7 +1,7 @@ const webpack = require('webpack') const path = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin') +const ExtWebpackPlugin = require('@sencha/ext-react webpack-plugin') const portfinder = require('portfinder') const sourcePath = path.join(__dirname, './src') diff --git a/packages/ext-react-classic-renderwhenready/package.json b/packages/ext-react-classic-renderwhenready/package.json index b4ed408d..0f40bd42 100644 --- a/packages/ext-react-classic-renderwhenready/package.json +++ b/packages/ext-react-classic-renderwhenready/package.json @@ -56,7 +56,7 @@ "@babel/preset-env": "^7.2.0", "@babel/preset-react": "^7.0.0", "@sencha/ext-react-babel-plugin": "^6.7.0", - "@sencha/ext-webpack-plugin": "^7.0.0", + "@sencha/ext-react-webpack-plugin": "~6.7.1", "babel-loader": "^8.0.0", "copy-webpack-plugin": "^4.5.2", "cross-env": "^5.2.0", diff --git a/packages/ext-react-classic-renderwhenready/webpack.config.js b/packages/ext-react-classic-renderwhenready/webpack.config.js index 45d71c55..507b33a7 100644 --- a/packages/ext-react-classic-renderwhenready/webpack.config.js +++ b/packages/ext-react-classic-renderwhenready/webpack.config.js @@ -1,7 +1,7 @@ const webpack = require('webpack'); const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin') -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin') +const ExtWebpackPlugin = require('@sencha/ext-react webpack-plugin') const portfinder = require('portfinder') const sourcePath = path.join(__dirname, './src'); diff --git a/packages/ext-react-conference-app/package.json b/packages/ext-react-conference-app/package.json index 14d6b143..f14b9692 100644 --- a/packages/ext-react-conference-app/package.json +++ b/packages/ext-react-conference-app/package.json @@ -68,7 +68,7 @@ "@babel/preset-env": "^7.2.0", "@babel/preset-react": "^7.0.0", "@sencha/ext-react-babel-plugin": "^6.7.0", - "@sencha/ext-webpack-plugin": "^7.0.0", + "@sencha/ext-react-webpack-plugin": "~6.7.1", "babel-loader": "^8.0.2", "cross-env": "^5.2.0", diff --git a/packages/ext-react-conference-app/webpack.config.js b/packages/ext-react-conference-app/webpack.config.js index 07bc7545..e43ca851 100644 --- a/packages/ext-react-conference-app/webpack.config.js +++ b/packages/ext-react-conference-app/webpack.config.js @@ -1,7 +1,7 @@ const webpack = require('webpack') const path = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin') +const ExtWebpackPlugin = require('@sencha/ext-react webpack-plugin') const portfinder = require('portfinder') const sourcePath = path.join(__dirname, './src') diff --git a/packages/ext-react-froala-example/package.json b/packages/ext-react-froala-example/package.json index 6d57e08f..df39e908 100644 --- a/packages/ext-react-froala-example/package.json +++ b/packages/ext-react-froala-example/package.json @@ -50,7 +50,7 @@ "@babel/preset-env": "^7.2.0", "@babel/preset-react": "^7.0.0", "@sencha/ext-react-babel-plugin": "^6.7.0", - "@sencha/ext-webpack-plugin": "^7.0.0", + "@sencha/ext-react-webpack-plugin": "~6.7.1", "babel-loader": "^8.0.2", "cross-env": "^5.2.0", "css-loader": "^1.0.0", diff --git a/packages/ext-react-froala-example/webpack.config.js b/packages/ext-react-froala-example/webpack.config.js index 69e2db67..7b63143a 100644 --- a/packages/ext-react-froala-example/webpack.config.js +++ b/packages/ext-react-froala-example/webpack.config.js @@ -1,7 +1,7 @@ const webpack = require('webpack'); const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin') -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin') +const ExtWebpackPlugin = require('@sencha/ext-react webpack-plugin') const portfinder = require('portfinder') const sourcePath = path.join(__dirname, './src'); diff --git a/packages/ext-react-gen/package.json b/packages/ext-react-gen/package.json index c391694c..3e49cf21 100644 --- a/packages/ext-react-gen/package.json +++ b/packages/ext-react-gen/package.json @@ -18,15 +18,15 @@ }, "preferGlobal": true, "dependencies": { - "@sencha/ext-react-modern-boilerplate": "^6.7.0", - "@sencha/ext-react-modern-typescript-boilerplate": "^6.7.0", - "@sencha/ext-react-classic-boilerplate": "^6.7.0", + "@sencha/ext-react-modern-boilerplate": "^6.7.1", + "@sencha/ext-react-modern-typescript-boilerplate": "^6.7.1", + "@sencha/ext-react-classic-boilerplate": "^6.7.1", "react": "~16.8.4", "react-dom": "~16.8.4", "react-reconciler": "~0.20.2", "chalk": "^2.4.2", "glob": "^7.1.3", - "boxen": "^2.1.0", + "boxen": "^3.0.0", "command-line-args": "^5.0.2", "comment-json": "^1.1.3", "cross-spawn": "^6.0.5", diff --git a/packages/ext-react-kitchensink/package.json b/packages/ext-react-kitchensink/package.json index 792cc264..89362008 100644 --- a/packages/ext-react-kitchensink/package.json +++ b/packages/ext-react-kitchensink/package.json @@ -5,20 +5,10 @@ "description": "A boilerplate project for Ext React showing all Ext JS modern components.", "main": "index.js", "scripts": { - "clean": "rimraf build", "start": "npm run dev", - "dev": "webpack-dev-server --env.environment=development", - "prod2": "webpack-dev-server --env.environment=production", - "build": "npm run clean && cross-env NODE_ENV=production webpack --env.environment=production --env.treeshake=true", - "prod": "npm run build", - "b1zzz": "npm run clean && cross-env webpack --env.environment=production --env.treeshake=true", - "b2zzz": "cross-env webpack --env.environment=production", - "build2zzz": "npm run clean && cross-env webpack --env.environment=production --env.treeshake=true && cross-env webpack --env.environment=production" - }, - "extbuild": { - "defaultprofile": "", - "defaultenvironment": "development", - "defaultverbose": "no" + "clean": "rimraf build", + "dev": "webpack-dev-server --env.browser='yes' --env.verbose='no'", + "build": "npm run clean && cross-env webpack --env.environment='production' --env.treeshake='yes'" }, "author": "Sencha, Inc.", "repository": { @@ -31,10 +21,12 @@ }, "homepage": "https://github.com/sencha/ext-react#readme", "dependencies": { + "@sencha/ext-react": "^6.7.1", + "@sencha/ext-react-renderercell": "^6.7.1", + "@sencha/ext-react-transition": "^6.7.1", "@sencha/ext": "^6.7.0", "@sencha/ext-modern": "^6.7.0", - "@sencha/ext-modern-theme-material": "~6.7.0", "@sencha/ext-modern-treegrid": "~6.7.0", "@sencha/ext-calendar": "~6.7.0", @@ -46,26 +38,25 @@ "@sencha/ext-pivot-d3": "~6.7.0", "@sencha/ext-ux": "^6.7.0", - "@sencha/ext-react": "^6.7.1", - "@sencha/ext-react-renderercell": "^6.7.1", - "@sencha/ext-react-transition": "^6.7.1", + "@sencha/ext-modern-theme-material": "~6.7.0", "@babel/polyfill": "^7.2.5", "@babel/runtime": "^7.3.4", + "d3": "4.5.0", "highlightjs": "~9.12.0", "history": "~4.7.2", "prop-types": "~15.7.2", + "react": "~16.8.4", - "react-dom": "~16.8.4", + "@hot-loader/react-dom":"~16.8.4", "react-redux": "~6.0.1", "react-router-dom": "~4.3.1", "redux": "~4.0.1" }, "devDependencies": { - "@sencha/ext-react-babel-plugin": "^6.7.0", - "@sencha/ext-webpack-plugin": "^7.0.0", - "@sencha/ext-webpack-plugin": "^7.0.0", + "@sencha/ext-react-babel-plugin": "^6.7.1", + "@sencha/ext-react-webpack-plugin": "~6.7.1", "@babel/core": "^7.3.4", "@babel/plugin-proposal-class-properties": "^7.3.4", @@ -80,18 +71,23 @@ "@babel/plugin-transform-runtime": "^7.3.4", "@babel/preset-env": "^7.3.4", "@babel/preset-react": "^7.0.0", - "babel-loader": "^8.0.5", "cross-env": "^5.2.0", "rimraf": "^2.6.3", "portfinder": "^1.0.20", "html-webpack-plugin": "^3.2.0", + "base-href-webpack-plugin": "~2.0.0", "copy-webpack-plugin": "^5.0.1", - "webpack-shell-plugin-next": "^0.6.4", - "css-loader": "^2.1.1", - "react-hot-loader": "^4.8.0", + + "babel-loader": "^8.0.5", + "html-loader": "^0.5.5", "style-loader": "^0.23.1", + "css-loader": "^2.1.0", + "sass-loader": "^7.1.0", + + "node-sass": "^4.11.0", + "react-hot-loader": "^4.8.0", "webpack": "^4.29.6", "webpack-cli": "^3.2.3", diff --git a/packages/ext-react-kitchensink/src/App.js b/packages/ext-react-kitchensink/src/App.js index 29b223a4..0b40176e 100644 --- a/packages/ext-react-kitchensink/src/App.js +++ b/packages/ext-react-kitchensink/src/App.js @@ -1,6 +1,5 @@ import React from 'react' import Layout from './Layout'; -//import { HashRouter as Router, Route } from 'react-router-dom' mjg import { Router, Route } from 'react-router-dom' import createHistory from 'history/createHashHistory' @@ -38,4 +37,5 @@ export default function App() { ) -} \ No newline at end of file +} +//https://github.com/gaearon/react-hot-loader/tree/7089062eac273832102c074a368d5af27e23e0b0#webpack-plugin \ No newline at end of file diff --git a/packages/ext-react-kitchensink/src/Files.js b/packages/ext-react-kitchensink/src/Files.js index 38a802c5..3fbadb67 100644 --- a/packages/ext-react-kitchensink/src/Files.js +++ b/packages/ext-react-kitchensink/src/Files.js @@ -39,10 +39,9 @@ export default class Files extends Component { } highlightCode() { - //had to add .cmp - is there a way to avoid this?? - if (this.refs.tabs) for (let el of this.refs.tabs.cmp.el.query('.code')) { - highlightBlock(el); - } + if (this.tabs) for (let el of this.tabs.cmp.el.query('.code')) { + highlightBlock(el); + } } render() { @@ -50,7 +49,7 @@ export default class Files extends Component { return ( {this.tabs = tabs}} shadow tabBar={{ layout: { diff --git a/packages/ext-react-kitchensink/src/examples/Charts/Area/BasicArea/BasicArea.js b/packages/ext-react-kitchensink/src/examples/Charts/Area/BasicArea/BasicArea.js index 7e025e5c..06f8b174 100644 --- a/packages/ext-react-kitchensink/src/examples/Charts/Area/BasicArea/BasicArea.js +++ b/packages/ext-react-kitchensink/src/examples/Charts/Area/BasicArea/BasicArea.js @@ -41,7 +41,6 @@ export default class BasicAreaChartExample extends Component { render() { var { theme } = this.state - console.log(theme) return ( @@ -52,6 +51,7 @@ export default class BasicAreaChartExample extends Component { /> Math.round(value * 180 / Math.PI) @@ -56,10 +56,11 @@ export default class NavigatorExample extends Component { /> {this.navigator = navigator}} navigator={{ axis: 'bottom' }} chart={{ xtype: 'cartesian', + downloadServerUrl: 'http://svg.sencha.io', reference: 'chart', insetPadding: '20 10 10 10', platformConfig: { diff --git a/packages/ext-react-kitchensink/src/themer.js b/packages/ext-react-kitchensink/src/themer.js new file mode 100644 index 00000000..b38bce42 --- /dev/null +++ b/packages/ext-react-kitchensink/src/themer.js @@ -0,0 +1 @@ +//2019-3-21 07:48:44 \ No newline at end of file diff --git a/packages/ext-react-kitchensink/webpack.config.js b/packages/ext-react-kitchensink/webpack.config.js index 9d16bee9..8a6b23bd 100644 --- a/packages/ext-react-kitchensink/webpack.config.js +++ b/packages/ext-react-kitchensink/webpack.config.js @@ -1,60 +1,40 @@ -const webpack = require('webpack') -const path = require('path') -const HtmlWebpackPlugin = require('html-webpack-plugin') -//const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin') -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin') -//const WebpackShellPlugin = require('webpack-shell-plugin-next') -const CopyWebpackPlugin = require('copy-webpack-plugin') +const path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const { BaseHrefWebpackPlugin } = require('base-href-webpack-plugin'); +const ExtWebpackPlugin = require('@sencha/ext-react-webpack-plugin'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); + const portfinder = require('portfinder') -//const sourcePath = path.join(__dirname, './src') module.exports = function (env) { - var browserprofile - var watchprofile - var buildenvironment = env.environment || process.env.npm_package_extbuild_defaultenvironment - if (buildenvironment == 'production') { - browserprofile = false - watchprofile = 'no' - } - else { - if (env.browser == undefined) {env.browser = true} - browserprofile = JSON.parse(env.browser) || true - watchprofile = env.watch || 'yes' - } - const isProd = buildenvironment === 'production' - var buildprofile = env.profile || process.env.npm_package_extbuild_defaultprofile - var buildenvironment = env.environment || process.env.npm_package_extbuild_defaultenvironment - var buildverbose = env.verbose || process.env.npm_package_extbuild_defaultverbose - if (buildprofile == 'all') { buildprofile = '' } - if (env.treeshake == undefined) {env.treeshake = false} - var treeshake = env.treeshake ? JSON.parse(env.treeshake) : false - var mode = isProd ? 'production': 'development' - var outputFolder = 'build' + function get(it, val) {if(env == undefined) {return val} else if(env[it] == undefined) {return val} else {return env[it]}} + var profile = get('profile', '') + var environment = get('environment', 'development') + var treeshake = get('treeshake', 'no') + var browser = get('browser', 'yes') + var watch = get('watch', 'yes') + var verbose = get('verbose', 'no') + var basehref = get('basehref', '/') + const isProd = environment === 'production' + const outputFolder = 'build' portfinder.basePort = (env && env.port) || 1962 + return portfinder.getPortPromise().then(port => { const plugins = [ - new HtmlWebpackPlugin({template: './src/index.html',hash: true,inject: "body"}), + new HtmlWebpackPlugin({ template: "index.html", hash: true, inject: "body" }), + new BaseHrefWebpackPlugin({ baseHref: basehref }), new ExtWebpackPlugin({ framework: 'react', toolkit: 'modern', theme: 'theme-kitchensink', - profile: buildprofile, - environment: buildenvironment, - treeshake: treeshake, - port: port, - emit: true, - browser: browserprofile, - watch: watchprofile, - verbose: buildverbose, - script: './extract-code.js', packages: [ 'treegrid', + 'ux', 'transition', 'renderercell', 'font-ext', - 'ux', 'd3', 'pivot-d3', 'font-awesome', @@ -62,56 +42,55 @@ module.exports = function (env) { 'pivot', 'calendar', 'charts' - ] + ], + script: './extract-code.js', + emit: 'yes', + port: port, + profile: profile, + environment: environment, + treeshake: treeshake, + browser: browser, + watch: watch, + verbose: verbose }), - // new CopyWebpackPlugin([{ - // from: './node_modules/@sencha/ext-ux/modern/resources', - // to: './ext-react/ux' - // }]), - // new WebpackShellPlugin({ - // onBuildEnd:{ - // scripts: ['node extract-code.js'], - // blocking: false, - // parallel: true - // } - // }) + new CopyWebpackPlugin([{ + from: '../node_modules/@sencha/ext-ux/modern/resources', + to: './ext/ux' + }]) ] - if (!isProd) { - plugins.push( - new webpack.HotModuleReplacementPlugin() - ) - } return { - mode: mode, - devtool: (mode === 'development') ? 'inline-source-map' : false, - entry: path.resolve(__dirname, 'src/index.js'), -// cache: true, + resolve: { + alias: { + 'react-dom': '@hot-loader/react-dom' + } + }, + mode: environment, + devtool: (environment === 'development') ? 'inline-source-map' : false, + context: path.join(__dirname, './src'), + entry: './index.js', output: { - path: path.resolve(__dirname, outputFolder), - filename: '[name].js' + path: path.join(__dirname, outputFolder), + filename: "[name].js" + //filename: "[name].[chunkhash:20].js" }, - plugins : plugins, + plugins: plugins, module: { rules: [ - //{ test: /\.(js|jsx)$/,exclude: /node_modules/,use: ['babel-loader'] }, - { test: /\.(js)$/, exclude: /node_modules/, use: ['babel-loader'] }, + { test: /\.(js|jsx)$/, exclude: /node_modules/, use: ['babel-loader'] }, + { test: /\.(html)$/,use: { loader: 'html-loader' } }, { - test: /\.css$/, - use: ['style-loader','css-loader'] + test: /\.(css|scss)$/, + use: [ + { loader: 'style-loader' }, + { loader: 'css-loader' }, + { loader: 'sass-loader' } + ] } ] }, - resolve: { - // The following is only needed when running this boilerplate within the ext-react repo. You can remove this from your own projects. - alias: { - "react-dom": path.resolve('./node_modules/react-dom'), - "react": path.resolve('./node_modules/react') - } - }, + performance: { hints: false }, stats: 'none', - optimization: { - noEmitOnErrors: true - }, + optimization: { noEmitOnErrors: true }, node: false, devServer: { contentBase: outputFolder, @@ -126,4 +105,4 @@ module.exports = function (env) { } } }) -} \ No newline at end of file +} diff --git a/packages/ext-react-modern-boilerplate/package.json b/packages/ext-react-modern-boilerplate/package.json index b683d6ac..128c92d7 100644 --- a/packages/ext-react-modern-boilerplate/package.json +++ b/packages/ext-react-modern-boilerplate/package.json @@ -7,14 +7,9 @@ "scripts": { "start": "npm run dev", "clean": "rimraf build", - "dev": "webpack-dev-server", + "dev": "webpack-dev-server --env.browser='yes' --env.verbose='no'", "build": "npm run clean && cross-env webpack --env.environment='production' --env.treeshake='yes'" }, - "extbuild": { - "defaultprofile": "", - "defaultenvironment": "development", - "defaultverbose": "no" - }, "author": "Sencha, Inc.", "repository": { "type": "git", @@ -26,26 +21,46 @@ }, "homepage": "https://github.com/sencha/ext-react#readme", "dependencies": { - "@babel/polyfill": "^7.2.5", - "@babel/runtime": "^7.3.1", - "@sencha/ext": "^6.7.0", - "@sencha/ext-modern": "^6.7.0", - "@sencha/ext-modern-theme-material": "^6.7.0", - "@sencha/ext-modern-treegrid": "^6.7.0", "@sencha/ext-react": "^6.7.1", "@sencha/ext-react-renderercell": "^6.7.1", "@sencha/ext-react-transition": "^6.7.1", - "prop-types": "^15.7.2", + + "@sencha/ext": "^6.7.0", + "@sencha/ext-modern": "^6.7.0", + "@sencha/ext-modern-treegrid": "~6.7.0", + + "@sencha/ext-calendar": "~6.7.0", + "@sencha/ext-charts": "~6.7.0", + "@sencha/ext-core": "^6.7.0", + "@sencha/ext-d3": "~6.7.0", + "@sencha/ext-exporter": "^6.7.0", + "@sencha/ext-pivot": "~6.7.0", + "@sencha/ext-pivot-d3": "~6.7.0", + "@sencha/ext-ux": "^6.7.0", + + "@sencha/ext-modern-theme-material": "~6.7.0", + + "@babel/polyfill": "^7.4.0", + "@babel/runtime": "^7.4.2", + + "d3": "4.5.0", + "highlightjs": "~9.12.0", + "history": "~4.9.0", + "prop-types": "~15.7.2", + "react": "~16.8.4", - "react-dom": "~16.8.4", - "react-router-dom": "^4.3.1" + "@hot-loader/react-dom":"~16.8.4", + "react-redux": "~6.0.1", + "react-router-dom": "~5.0.0", + "redux": "~4.0.1" }, "devDependencies": { - "@sencha/ext-react-babel-plugin": "^6.7.0", - "@sencha/ext-webpack-plugin": "^7.0.0", - "@babel/core": "^7.3.4", - "@babel/plugin-proposal-class-properties": "^7.3.4", - "@babel/plugin-proposal-decorators": "^7.3.0", + "@sencha/ext-react-babel-plugin": "^6.7.1", + "@sencha/ext-react-webpack-plugin": "~6.7.1", + + "@babel/core": "^7.4.0", + "@babel/plugin-proposal-class-properties": "^7.4.0", + "@babel/plugin-proposal-decorators": "^7.4.0", "@babel/plugin-proposal-export-namespace-from": "^7.2.0", "@babel/plugin-proposal-function-sent": "^7.2.0", "@babel/plugin-proposal-json-strings": "^7.2.0", @@ -53,29 +68,29 @@ "@babel/plugin-proposal-throw-expressions": "^7.2.0", "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-import-meta": "^7.2.0", - "@babel/plugin-transform-runtime": "^7.3.4", - "@babel/preset-env": "^7.3.4", + "@babel/plugin-transform-runtime": "^7.4.0", + "@babel/preset-env": "^7.4.2", "@babel/preset-react": "^7.0.0", - "babel-loader": "^8.0.5", + "cross-env": "^5.2.0", + "rimraf": "^2.6.3", + "portfinder": "^1.0.20", + + "html-webpack-plugin": "^3.2.0", + "base-href-webpack-plugin": "~2.0.0", + "copy-webpack-plugin": "^5.0.1", + "babel-loader": "^8.0.5", "html-loader": "^0.5.5", + "style-loader": "^0.23.1", + "css-loader": "^2.1.1", "sass-loader": "^7.1.0", "node-sass": "^4.11.0", + "react-hot-loader": "^4.8.0", - - - - - "html-webpack-plugin": "^3.2.0", - "style-loader": "^0.23.1", - "css-loader": "^2.1.0", - "portfinder": "^1.0.20", - "react-hot-loader": "^4.7.1", - "rimraf": "^2.6.3", - "webpack": "^4.29.5", - "webpack-cli": "^3.2.3", + "webpack": "^4.29.6", + "webpack-cli": "^3.3.0", "webpack-dev-server": "^3.2.1" }, "jest": { diff --git a/packages/ext-react-modern-boilerplate/src/themer.js b/packages/ext-react-modern-boilerplate/src/themer.js new file mode 100644 index 00000000..aeb123fb --- /dev/null +++ b/packages/ext-react-modern-boilerplate/src/themer.js @@ -0,0 +1 @@ +//2019-3-21 08:01:33 \ No newline at end of file diff --git a/packages/ext-react-modern-boilerplate/webpack.config.js b/packages/ext-react-modern-boilerplate/webpack.config.js index 8d6921e4..c87c6a09 100644 --- a/packages/ext-react-modern-boilerplate/webpack.config.js +++ b/packages/ext-react-modern-boilerplate/webpack.config.js @@ -1,6 +1,9 @@ const path = require('path'); -const HtmlWebpackPlugin = require('html-webpack-plugin') -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin') +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const { BaseHrefWebpackPlugin } = require('base-href-webpack-plugin'); +const ExtWebpackPlugin = require('@sencha/ext-react-webpack-plugin'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); + const portfinder = require('portfinder') module.exports = function (env) { @@ -12,6 +15,7 @@ module.exports = function (env) { var browser = get('browser', 'yes') var watch = get('watch', 'yes') var verbose = get('verbose', 'no') + var basehref = get('basehref', '/') const isProd = environment === 'production' const outputFolder = 'build' @@ -19,26 +23,37 @@ module.exports = function (env) { return portfinder.getPortPromise().then(port => { const plugins = [ - new HtmlWebpackPlugin({template: "index.html",hash: true,inject: "body"}), + new HtmlWebpackPlugin({ template: "index.html", hash: true, inject: "body" }), + new BaseHrefWebpackPlugin({ baseHref: basehref }), new ExtWebpackPlugin({ framework: 'react', toolkit: 'modern', theme: 'theme-material', - emit: 'yes', - script: '', - port: port, packages: [ - 'treegrid' + 'treegrid', + 'ux', ], + script: '', + emit: 'yes', + port: port, profile: profile, environment: environment, treeshake: treeshake, browser: browser, watch: watch, verbose: verbose - }) + }), + new CopyWebpackPlugin([{ + from: '../node_modules/@sencha/ext-ux/modern/resources', + to: './ext/ux' + }]) ] return { + resolve: { + alias: { + 'react-dom': '@hot-loader/react-dom' + } + }, mode: environment, devtool: (environment === 'development') ? 'inline-source-map' : false, context: path.join(__dirname, './src'), @@ -46,27 +61,18 @@ module.exports = function (env) { output: { path: path.join(__dirname, outputFolder), filename: "[name].js" - //filename: "[name].[chunkhash:20].js" }, plugins: plugins, module: { rules: [ - { test: /\.(js)$/, exclude: /node_modules/, use: ['babel-loader'] }, + { test: /\.(js|jsx)$/, exclude: /node_modules/, use: ['babel-loader'] }, { test: /\.(html)$/,use: { loader: 'html-loader' } }, - //{ test: /\.css$/,use: ['style-loader','css-loader'] } - { test: /\.(css|scss)$/, use: [ - { - loader: 'style-loader' - }, - { - loader: 'css-loader' - }, - { - loader: 'sass-loader' - } + { loader: 'style-loader' }, + { loader: 'css-loader' }, + { loader: 'sass-loader' } ] } ] diff --git a/packages/ext-react-modern-demo/package.json b/packages/ext-react-modern-demo/package.json index 349238dc..467b483e 100644 --- a/packages/ext-react-modern-demo/package.json +++ b/packages/ext-react-modern-demo/package.json @@ -61,7 +61,7 @@ "@babel/preset-env": "^7.2.0", "@babel/preset-react": "^7.0.0", "@sencha/ext-react-babel-plugin": "^6.7.0", - "@sencha/ext-webpack-plugin": "^7.0.0", + "@sencha/ext-react-webpack-plugin": "~6.7.1", "babel-loader": "^8.0.4", "cross-env": "^5.2.0", "html-webpack-plugin": "^3.2.0", diff --git a/packages/ext-react-modern-demo/webpack.config.js b/packages/ext-react-modern-demo/webpack.config.js index 34277a75..926c94db 100644 --- a/packages/ext-react-modern-demo/webpack.config.js +++ b/packages/ext-react-modern-demo/webpack.config.js @@ -1,7 +1,7 @@ const webpack = require('webpack'); const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin') -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin') +const ExtWebpackPlugin = require('@sencha/ext-react webpack-plugin') const portfinder = require('portfinder') const sourcePath = path.join(__dirname, './src') diff --git a/packages/ext-react-modern-renderwhenready/package.json b/packages/ext-react-modern-renderwhenready/package.json index 12b73f67..28a56741 100644 --- a/packages/ext-react-modern-renderwhenready/package.json +++ b/packages/ext-react-modern-renderwhenready/package.json @@ -60,7 +60,7 @@ "@babel/preset-env": "^7.2.0", "@babel/preset-react": "^7.0.0", "@sencha/ext-react-babel-plugin": "^6.7.0", - "@sencha/ext-webpack-plugin": "^7.0.0", + "@sencha/ext-react-webpack-plugin": "~6.7.1", "babel-loader": "^8.0.4", "copy-webpack-plugin": "^4.6.0", "cross-env": "^5.2.0", diff --git a/packages/ext-react-modern-renderwhenready/webpack.config.js b/packages/ext-react-modern-renderwhenready/webpack.config.js index 39d94b42..d92ab699 100644 --- a/packages/ext-react-modern-renderwhenready/webpack.config.js +++ b/packages/ext-react-modern-renderwhenready/webpack.config.js @@ -1,7 +1,7 @@ const webpack = require('webpack'); const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin') -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin') +const ExtWebpackPlugin = require('@sencha/ext-react webpack-plugin') const portfinder = require('portfinder') const sourcePath = path.join(__dirname, './src'); diff --git a/packages/ext-react-modern-typescript-boilerplate/package.json b/packages/ext-react-modern-typescript-boilerplate/package.json index 4d746c66..53bff4c4 100644 --- a/packages/ext-react-modern-typescript-boilerplate/package.json +++ b/packages/ext-react-modern-typescript-boilerplate/package.json @@ -52,7 +52,7 @@ "@babel/preset-env": "^7.3.4", "@babel/preset-react": "^7.0.0", "@sencha/ext-react-babel-plugin": "^6.7.0", - "@sencha/ext-webpack-plugin": "^7.0.0", + "@sencha/ext-react-webpack-plugin": "~6.7.1", "@types/react": "^16.8.8", "@types/react-dom": "^16.8.2", "awesome-typescript-loader": "^5.2.1", diff --git a/packages/ext-react-modern-typescript-boilerplate/webpack.config.js b/packages/ext-react-modern-typescript-boilerplate/webpack.config.js index 0ce0bf4f..75a7f1e4 100644 --- a/packages/ext-react-modern-typescript-boilerplate/webpack.config.js +++ b/packages/ext-react-modern-typescript-boilerplate/webpack.config.js @@ -1,7 +1,7 @@ const webpack = require('webpack'); const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin') -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin') +const ExtWebpackPlugin = require('@sencha/ext-react webpack-plugin') const portfinder = require('portfinder') const sourcePath = path.join(__dirname, './src'); diff --git a/packages/ext-react-rest-example/package.json b/packages/ext-react-rest-example/package.json index 56346541..c4f9ce64 100644 --- a/packages/ext-react-rest-example/package.json +++ b/packages/ext-react-rest-example/package.json @@ -46,7 +46,7 @@ }, "devDependencies": { "@sencha/ext-react-babel-plugin": "^6.7.0", - "@sencha/ext-webpack-plugin": "^7.0.0", + "@sencha/ext-react-webpack-plugin": "~6.7.1", "@babel/core": "^7.3.4", "@babel/plugin-proposal-class-properties": "^7.3.4", "@babel/plugin-proposal-decorators": "^7.3.0", diff --git a/packages/ext-react-rest-example/webpack.config.js b/packages/ext-react-rest-example/webpack.config.js index b555d3f4..a55e1f76 100644 --- a/packages/ext-react-rest-example/webpack.config.js +++ b/packages/ext-react-rest-example/webpack.config.js @@ -1,7 +1,7 @@ const webpack = require('webpack'); const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin') -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin') +const ExtWebpackPlugin = require('@sencha/ext-react webpack-plugin') const portfinder = require('portfinder') const sourcePath = path.join(__dirname, './src') diff --git a/packages/ext-react-tests/package.json b/packages/ext-react-tests/package.json index ec8afa45..8815f2f5 100644 --- a/packages/ext-react-tests/package.json +++ b/packages/ext-react-tests/package.json @@ -66,7 +66,7 @@ "@babel/preset-env": "^7.2.0", "@babel/preset-react": "^7.0.0", "@sencha/ext-react-babel-plugin": "^6.7.0", - "@sencha/ext-webpack-plugin": "^7.0.0", + "@sencha/ext-react-webpack-plugin": "~6.7.1", "babel-core": "^7.0.0-bridge.0", "babel-loader": "^8.0.4", "check-dependencies": "^1.1.0", diff --git a/packages/ext-react-tests/webpack.config.js b/packages/ext-react-tests/webpack.config.js index 9e76f99c..46c421da 100644 --- a/packages/ext-react-tests/webpack.config.js +++ b/packages/ext-react-tests/webpack.config.js @@ -1,7 +1,7 @@ const webpack = require('webpack'); const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin') -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin') +const ExtWebpackPlugin = require('@sencha/ext-react webpack-plugin') const portfinder = require('portfinder') const sourcePath = path.join(__dirname, './src'); diff --git a/packages/ext-react-webpack-plugin/README.md b/packages/ext-react-webpack-plugin/README.md index a0b5224c..8b715bbf 100644 --- a/packages/ext-react-webpack-plugin/README.md +++ b/packages/ext-react-webpack-plugin/README.md @@ -55,7 +55,7 @@ ExtReact components in the initial build and thus not requiring a rebuild after const path = require('path'); const webpack = require('webpack'); -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin'); +const ExtWebpackPlugin = require('@sencha/ext-react webpack-plugin'); module.exports = { devtool: 'inline-source-map', diff --git a/packages/ext-react-webpack-plugin/dist/angularUtil.js b/packages/ext-react-webpack-plugin/dist/angularUtil.js index 7574f026..0601284c 100644 --- a/packages/ext-react-webpack-plugin/dist/angularUtil.js +++ b/packages/ext-react-webpack-plugin/dist/angularUtil.js @@ -3,83 +3,23 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.getValidateOptions = getValidateOptions; -exports.getDefaultOptions = getDefaultOptions; -exports.getDefaultVars = getDefaultVars; -exports.extractFromSource = extractFromSource; +exports._getDefaultVars = _getDefaultVars; +exports._extractFromSource = _extractFromSource; exports._toProd = _toProd; exports._toDev = _toDev; exports._getAllComponents = _getAllComponents; exports._writeFilesToProdFolder = _writeFilesToProdFolder; -function getValidateOptions() { - return { - "type": "object", - "properties": { - "framework": { - "type": ["string"] - }, - "toolkit": { - "type": ["string"] - }, - "port": { - "type": ["integer"] - }, - "emit": { - "type": ["boolean"] - }, - "browser": { - "type": ["boolean"] - }, - "watch": { - "type": ["string"] - }, - "profile": { - "type": ["string"] - }, - "environment": { - "type": ["string"] - }, - "verbose": { - "type": ["string"] - }, - "theme": { - "type": ["string"] - }, - "treeshake": { - "type": ["boolean"] - }, - "packages": { - "type": ["string", "array"] - } - }, - "additionalProperties": false - }; -} - -function getDefaultOptions() { - return { - port: 1962, - emit: true, - browser: true, - watch: 'yes', - profile: '', - treeshake: false, - environment: 'development', - verbose: 'no', - toolkit: 'modern', - packages: null - }; -} - -function getDefaultVars() { +function _getDefaultVars() { return { + touchFile: '/src/themer.ts', watchStarted: false, + buildstep: '1 of 1', firstTime: true, firstCompile: true, browserCount: 0, manifest: null, - extPath: 'ext-angular', + extPath: 'ext', pluginErrors: [], deps: [], usedExtComponents: [], @@ -87,79 +27,69 @@ function getDefaultVars() { }; } -function toXtype(str) { - return str.toLowerCase().replace(/_/g, '-'); -} - -function extractFromSource(module, options, compilation, extComponents) { - try { - var js = module._source._value; - - const logv = require('./pluginUtil').logv; //logv(options,'HOOK succeedModule, FUNCTION extractFromSource: ' + module.resource) - +function _extractFromSource(module, options, compilation, extComponents) { + const logv = require('./pluginUtil').logv; - var statements = []; + const verbose = options.verbose; + logv(verbose, 'FUNCTION _extractFromSource'); + var js = module._source._value; + var statements = []; - var generate = require("@babel/generator").default; + var generate = require("@babel/generator").default; - var parse = require("babylon").parse; + var parse = require("babylon").parse; - var traverse = require("ast-traverse"); + var traverse = require("ast-traverse"); - var ast = parse(js, { - plugins: ['typescript', 'flow', 'doExpressions', 'objectRestSpread', 'classProperties', 'exportDefaultFrom', 'exportExtensions', 'asyncGenerators', 'functionBind', 'functionSent', 'dynamicImport'], - sourceType: 'module' - }); - traverse(ast, { - pre: function (node) { - if (node.type === 'CallExpression' && node.callee && node.callee.object && node.callee.object.name === 'Ext') { - statements.push(generate(node).code); - } + var ast = parse(js, { + plugins: ['typescript', 'flow', 'doExpressions', 'objectRestSpread', 'classProperties', 'exportDefaultFrom', 'exportExtensions', 'asyncGenerators', 'functionBind', 'functionSent', 'dynamicImport'], + sourceType: 'module' + }); + traverse(ast, { + pre: function (node) { + if (node.type === 'CallExpression' && node.callee && node.callee.object && node.callee.object.name === 'Ext') { + statements.push(generate(node).code); + } - if (node.type === 'StringLiteral') { - let code = node.value; - - for (var i = 0; i < code.length; ++i) { - if (code.charAt(i) == '<') { - if (code.substr(i, 4) == '') + 3; - } else if (code.charAt(i + 1) !== '/') { - var start = code.substring(i); - var spaceEnd = start.indexOf(' '); - var newlineEnd = start.indexOf('\n'); - var tagEnd = start.indexOf('>'); - var end = Math.min(spaceEnd, newlineEnd, tagEnd); - - if (end >= 0) { - var xtype = toXtype(start.substring(1, end)); - - if (extComponents.includes(xtype)) { - var theValue = node.value.toLowerCase(); - - if (theValue.indexOf('doctype html') == -1) { - var type = { - xtype: xtype - }; - let config = JSON.stringify(type); - statements.push(`Ext.create(${config})`); - } + if (node.type === 'StringLiteral') { + let code = node.value; + + for (var i = 0; i < code.length; ++i) { + if (code.charAt(i) == '<') { + if (code.substr(i, 4) == '') + 3; + } else if (code.charAt(i + 1) !== '/') { + var start = code.substring(i); + var spaceEnd = start.indexOf(' '); + var newlineEnd = start.indexOf('\n'); + var tagEnd = start.indexOf('>'); + var end = Math.min(spaceEnd, newlineEnd, tagEnd); + + if (end >= 0) { + var xtype = require('./pluginUtil')._toXtype(start.substring(1, end)); + + if (extComponents.includes(xtype)) { + var theValue = node.value.toLowerCase(); + + if (theValue.indexOf('doctype html') == -1) { + var type = { + xtype: xtype + }; + let config = JSON.stringify(type); + statements.push(`Ext.create(${config})`); } - - i += end; } + + i += end; } } } } } - }); - return statements; - } catch (e) { - console.log(e); - compilation.errors.push('extractFromSource: ' + e); - return []; - } + } + }); + return statements; } function changeIt(o) { @@ -180,43 +110,38 @@ function _toProd(vars, options) { const logv = require('./pluginUtil').logv; - logv(options, 'FUNCTION _toProd'); + logv(options.verbose, 'FUNCTION _toProd'); - try { - const fsx = require('fs-extra'); - - const fs = require('fs'); + const fsx = require('fs-extra'); - const mkdirp = require('mkdirp'); + const fs = require('fs'); - const path = require('path'); + const mkdirp = require('mkdirp'); - const pathExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`); + const path = require('path'); - if (!fs.existsSync(pathExtAngularProd)) { - mkdirp.sync(pathExtAngularProd); + const pathExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`); - const t = require('./artifacts').extAngularModule('', '', ''); + if (!fs.existsSync(pathExtAngularProd)) { + mkdirp.sync(pathExtAngularProd); - fsx.writeFileSync(`${pathExtAngularProd}/ext-angular.module.ts`, t, 'utf-8', () => { - return; - }); - } + const t = require('./artifacts').extAngularModule('', '', ''); - var o = {}; - o.where = 'src/app/app.module.ts'; - o.from = `import { ExtAngularModule } from '@sencha/ext-angular'`; - o.to = `import { ExtAngularModule } from './ext-angular-prod/ext-angular.module'`; - changeIt(o); - o = {}; - o.where = 'src/main.ts'; - o.from = `bootstrapModule( AppModule );`; - o.to = `enableProdMode();bootstrapModule(AppModule);`; - changeIt(o); - } catch (e) { - console.log(e); - return []; + fsx.writeFileSync(`${pathExtAngularProd}/ext-angular.module.ts`, t, 'utf-8', () => { + return; + }); } + + var o = {}; + o.where = 'src/app/app.module.ts'; + o.from = `import { ExtAngularModule } from '@sencha/ext-angular'`; + o.to = `import { ExtAngularModule } from './ext-angular-prod/ext-angular.module'`; + changeIt(o); + o = {}; + o.where = 'src/main.ts'; + o.from = `bootstrapModule( AppModule );`; + o.to = `enableProdMode();bootstrapModule(AppModule);`; + changeIt(o); } function _toDev(vars, options) { @@ -224,29 +149,24 @@ function _toDev(vars, options) { const logv = require('./pluginUtil').logv; - logv(options, 'FUNCTION _toProd'); + logv(options.verbose, 'FUNCTION _toDev'); - try { - const path = require('path'); + const path = require('path'); - const pathExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`); + const pathExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`); - require('rimraf').sync(pathExtAngularProd); + require('rimraf').sync(pathExtAngularProd); - var o = {}; - o.where = 'src/app/app.module.ts'; - o.from = `import { ExtAngularModule } from './ext-angular-prod/ext-angular.module'`; - o.to = `import { ExtAngularModule } from '@sencha/ext-angular'`; - changeIt(o); - o = {}; - o.where = 'src/main.ts'; - o.from = `enableProdMode();bootstrapModule(AppModule);`; - o.to = `bootstrapModule( AppModule );`; - changeIt(o); - } catch (e) { - console.log(e); - return []; - } + var o = {}; + o.where = 'src/app/app.module.ts'; + o.from = `import { ExtAngularModule } from './ext-angular-prod/ext-angular.module'`; + o.to = `import { ExtAngularModule } from '@sencha/ext-angular'`; + changeIt(o); + o = {}; + o.where = 'src/main.ts'; + o.from = `enableProdMode();bootstrapModule(AppModule);`; + o.to = `bootstrapModule( AppModule );`; + changeIt(o); } function _getAllComponents(vars, options) { @@ -254,30 +174,27 @@ function _getAllComponents(vars, options) { const logv = require('./pluginUtil').logv; - logv(options, 'FUNCTION _getAllComponents'); + logv(options.verbose, 'FUNCTION _getAllComponents'); + + const path = require('path'); - try { - const path = require('path'); + const fsx = require('fs-extra'); // log(vars.app, `Getting all referenced ext-${options.framework} modules`) - const fsx = require('fs-extra'); - var extComponents = []; - const packageLibPath = path.resolve(process.cwd(), 'node_modules/@sencha/ext-angular/src/lib'); - var files = fsx.readdirSync(packageLibPath); - files.forEach(fileName => { - if (fileName && fileName.substr(0, 4) == 'ext-') { - var end = fileName.substr(4).indexOf('.component'); + var extComponents = []; + const packageLibPath = path.resolve(process.cwd(), 'node_modules/@sencha/ext-angular/src/lib'); + var files = fsx.readdirSync(packageLibPath); + files.forEach(fileName => { + if (fileName && fileName.substr(0, 4) == 'ext-') { + var end = fileName.substr(4).indexOf('.component'); - if (end >= 0) { - extComponents.push(fileName.substring(4, end + 4)); - } + if (end >= 0) { + extComponents.push(fileName.substring(4, end + 4)); } - }); - return extComponents; - } catch (e) { - console.log(e); - return []; - } + } + }); + log(vars.app, `Writing all referenced ext-${options.framework} modules`); + return extComponents; } function _writeFilesToProdFolder(vars, options) { @@ -285,60 +202,55 @@ function _writeFilesToProdFolder(vars, options) { const logv = require('./pluginUtil').logv; - logv(options, 'FUNCTION _writeFilesToProdFolder'); + logv(options.verbose, 'FUNCTION _writeFilesToProdFolder'); - try { - const path = require('path'); + const path = require('path'); - const fsx = require('fs-extra'); + const fsx = require('fs-extra'); - const packageLibPath = path.resolve(process.cwd(), 'node_modules/@sencha/ext-angular/src/lib'); - const pathToExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`); - const string = 'Ext.create({\"xtype\":\"'; - vars.deps.forEach(code => { - var index = code.indexOf(string); + const packageLibPath = path.resolve(process.cwd(), 'node_modules/@sencha/ext-angular/src/lib'); + const pathToExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`); + const string = 'Ext.create({\"xtype\":\"'; + vars.deps.forEach(code => { + var index = code.indexOf(string); - if (index >= 0) { - code = code.substring(index + string.length); - var end = code.indexOf('\"'); - vars.usedExtComponents.push(code.substr(0, end)); - } - }); - vars.usedExtComponents = [...new Set(vars.usedExtComponents)]; - var writeToPathWritten = false; - var moduleVars = { - imports: '', - exports: '', - declarations: '' - }; - vars.usedExtComponents.forEach(xtype => { - var capclassname = xtype.charAt(0).toUpperCase() + xtype.replace(/-/g, "_").slice(1); - moduleVars.imports = moduleVars.imports + `import { Ext${capclassname}Component } from './ext-${xtype}.component';\n`; - moduleVars.exports = moduleVars.exports + ` Ext${capclassname}Component,\n`; - moduleVars.declarations = moduleVars.declarations + ` Ext${capclassname}Component,\n`; - var classFile = `ext-${xtype}.component.ts`; - const contents = fsx.readFileSync(`${packageLibPath}/${classFile}`).toString(); - fsx.writeFileSync(`${pathToExtAngularProd}/${classFile}`, contents, 'utf-8', () => { - return; - }); - writeToPathWritten = true; + if (index >= 0) { + code = code.substring(index + string.length); + var end = code.indexOf('\"'); + vars.usedExtComponents.push(code.substr(0, end)); + } + }); + vars.usedExtComponents = [...new Set(vars.usedExtComponents)]; + var writeToPathWritten = false; + var moduleVars = { + imports: '', + exports: '', + declarations: '' + }; + vars.usedExtComponents.forEach(xtype => { + var capclassname = xtype.charAt(0).toUpperCase() + xtype.replace(/-/g, "_").slice(1); + moduleVars.imports = moduleVars.imports + `import { Ext${capclassname}Component } from './ext-${xtype}.component';\n`; + moduleVars.exports = moduleVars.exports + ` Ext${capclassname}Component,\n`; + moduleVars.declarations = moduleVars.declarations + ` Ext${capclassname}Component,\n`; + var classFile = `ext-${xtype}.component.ts`; + const contents = fsx.readFileSync(`${packageLibPath}/${classFile}`).toString(); + fsx.writeFileSync(`${pathToExtAngularProd}/${classFile}`, contents, 'utf-8', () => { + return; }); + writeToPathWritten = true; + }); - if (writeToPathWritten) { - var t = require('./artifacts').extAngularModule(moduleVars.imports, moduleVars.exports, moduleVars.declarations); - - fsx.writeFileSync(`${pathToExtAngularProd}/ext-angular.module.ts`, t, 'utf-8', () => { - return; - }); - } + if (writeToPathWritten) { + var t = require('./artifacts').extAngularModule(moduleVars.imports, moduleVars.exports, moduleVars.declarations); - const baseContent = fsx.readFileSync(`${packageLibPath}/base.ts`).toString(); - fsx.writeFileSync(`${pathToExtAngularProd}/base.ts`, baseContent, 'utf-8', () => { + fsx.writeFileSync(`${pathToExtAngularProd}/ext-angular.module.ts`, t, 'utf-8', () => { return; }); - } catch (e) { - console.log(e); - return []; } + + const baseContent = fsx.readFileSync(`${packageLibPath}/base.ts`).toString(); + fsx.writeFileSync(`${pathToExtAngularProd}/base.ts`, baseContent, 'utf-8', () => { + return; + }); } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hbmd1bGFyVXRpbC5qcyJdLCJuYW1lcyI6WyJnZXRWYWxpZGF0ZU9wdGlvbnMiLCJnZXREZWZhdWx0T3B0aW9ucyIsInBvcnQiLCJlbWl0IiwiYnJvd3NlciIsIndhdGNoIiwicHJvZmlsZSIsInRyZWVzaGFrZSIsImVudmlyb25tZW50IiwidmVyYm9zZSIsInRvb2xraXQiLCJwYWNrYWdlcyIsImdldERlZmF1bHRWYXJzIiwid2F0Y2hTdGFydGVkIiwiZmlyc3RUaW1lIiwiZmlyc3RDb21waWxlIiwiYnJvd3NlckNvdW50IiwibWFuaWZlc3QiLCJleHRQYXRoIiwicGx1Z2luRXJyb3JzIiwiZGVwcyIsInVzZWRFeHRDb21wb25lbnRzIiwicmVidWlsZCIsInRvWHR5cGUiLCJzdHIiLCJ0b0xvd2VyQ2FzZSIsInJlcGxhY2UiLCJleHRyYWN0RnJvbVNvdXJjZSIsIm1vZHVsZSIsIm9wdGlvbnMiLCJjb21waWxhdGlvbiIsImV4dENvbXBvbmVudHMiLCJqcyIsIl9zb3VyY2UiLCJfdmFsdWUiLCJsb2d2IiwicmVxdWlyZSIsInN0YXRlbWVudHMiLCJnZW5lcmF0ZSIsImRlZmF1bHQiLCJwYXJzZSIsInRyYXZlcnNlIiwiYXN0IiwicGx1Z2lucyIsInNvdXJjZVR5cGUiLCJwcmUiLCJub2RlIiwidHlwZSIsImNhbGxlZSIsIm9iamVjdCIsIm5hbWUiLCJwdXNoIiwiY29kZSIsInZhbHVlIiwiaSIsImxlbmd0aCIsImNoYXJBdCIsInN1YnN0ciIsImluZGV4T2YiLCJzdGFydCIsInN1YnN0cmluZyIsInNwYWNlRW5kIiwibmV3bGluZUVuZCIsInRhZ0VuZCIsImVuZCIsIk1hdGgiLCJtaW4iLCJ4dHlwZSIsImluY2x1ZGVzIiwidGhlVmFsdWUiLCJjb25maWciLCJKU09OIiwic3RyaW5naWZ5IiwiZSIsImNvbnNvbGUiLCJsb2ciLCJlcnJvcnMiLCJjaGFuZ2VJdCIsIm8iLCJwYXRoIiwiZnN4Iiwid2hlcmVQYXRoIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJjd2QiLCJ3aGVyZSIsInJlYWRGaWxlU3luYyIsInRvU3RyaW5nIiwibmV3SnMiLCJmcm9tIiwidG8iLCJ3cml0ZUZpbGVTeW5jIiwiX3RvUHJvZCIsInZhcnMiLCJmcyIsIm1rZGlycCIsInBhdGhFeHRBbmd1bGFyUHJvZCIsImV4aXN0c1N5bmMiLCJzeW5jIiwidCIsImV4dEFuZ3VsYXJNb2R1bGUiLCJfdG9EZXYiLCJfZ2V0QWxsQ29tcG9uZW50cyIsInBhY2thZ2VMaWJQYXRoIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImZvckVhY2giLCJmaWxlTmFtZSIsIl93cml0ZUZpbGVzVG9Qcm9kRm9sZGVyIiwicGF0aFRvRXh0QW5ndWxhclByb2QiLCJzdHJpbmciLCJpbmRleCIsIlNldCIsIndyaXRlVG9QYXRoV3JpdHRlbiIsIm1vZHVsZVZhcnMiLCJpbXBvcnRzIiwiZXhwb3J0cyIsImRlY2xhcmF0aW9ucyIsImNhcGNsYXNzbmFtZSIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJjbGFzc0ZpbGUiLCJjb250ZW50cyIsImJhc2VDb250ZW50Il0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxrQkFBVCxHQUE4QjtBQUNuQyxTQUFPO0FBQ0wsWUFBUSxRQURIO0FBRUwsa0JBQWM7QUFDWixtQkFBZTtBQUFDLGdCQUFRLENBQUUsUUFBRjtBQUFULE9BREg7QUFFWixpQkFBZTtBQUFDLGdCQUFRLENBQUUsUUFBRjtBQUFULE9BRkg7QUFHWixjQUFlO0FBQUMsZ0JBQVEsQ0FBRSxTQUFGO0FBQVQsT0FISDtBQUlaLGNBQWU7QUFBQyxnQkFBUSxDQUFFLFNBQUY7QUFBVCxPQUpIO0FBS1osaUJBQWU7QUFBQyxnQkFBUSxDQUFFLFNBQUY7QUFBVCxPQUxIO0FBTVosZUFBZTtBQUFDLGdCQUFRLENBQUUsUUFBRjtBQUFULE9BTkg7QUFPWixpQkFBZTtBQUFDLGdCQUFRLENBQUUsUUFBRjtBQUFULE9BUEg7QUFRWixxQkFBZTtBQUFDLGdCQUFRLENBQUUsUUFBRjtBQUFULE9B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VSxDQUFDRyxZQUQ3QyxDQUFSOztBQUdBckMsTUFBQUEsR0FBRyxDQUFDVyxhQUFKLENBQW1CLEdBQUVrQixvQkFBcUIsd0JBQTFDLEVBQW1FVixDQUFuRSxFQUFzRSxPQUF0RSxFQUErRSxNQUFJO0FBQUM7QUFBTyxPQUEzRjtBQUNEOztBQUVELFVBQU13QixXQUFXLEdBQUczQyxHQUFHLENBQUNNLFlBQUosQ0FBa0IsR0FBRWlCLGNBQWUsVUFBbkMsRUFBOENoQixRQUE5QyxFQUFwQjtBQUNBUCxJQUFBQSxHQUFHLENBQUNXLGFBQUosQ0FBbUIsR0FBRWtCLG9CQUFxQixVQUExQyxFQUFxRGMsV0FBckQsRUFBa0UsT0FBbEUsRUFBMkUsTUFBSTtBQUFDO0FBQU8sS0FBdkY7QUFFRCxHQTVDRCxDQTZDQSxPQUFPbEQsQ0FBUCxFQUFVO0FBQ1JDLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZRixDQUFaO0FBQ0EsV0FBTyxFQUFQO0FBQ0Q7QUFDRiIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0ZU9wdGlvbnMoKSB7XG4gIHJldHVybiB7XG4gICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXG4gICAgXCJwcm9wZXJ0aWVzXCI6IHtcbiAgICAgIFwiZnJhbWV3b3JrXCI6ICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcInRvb2xraXRcIjogICAgIHtcInR5cGVcIjogWyBcInN0cmluZ1wiIF19LFxuICAgICAgXCJwb3J0XCI6ICAgICAgICB7XCJ0eXBlXCI6IFsgXCJpbnRlZ2VyXCIgXX0sXG4gICAgICBcImVtaXRcIjogICAgICAgIHtcInR5cGVcIjogWyBcImJvb2xlYW5cIiBdfSxcbiAgICAgIFwiYnJvd3NlclwiOiAgICAge1widHlwZVwiOiBbIFwiYm9vbGVhblwiIF19LFxuICAgICAgXCJ3YXRjaFwiOiAgICAgICB7XCJ0eXBlXCI6IFsgXCJzdHJpbmdcIiBdfSxcbiAgICAgIFwicHJvZmlsZVwiOiAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcImVudmlyb25tZW50XCI6IHtcInR5cGVcIjogWyBcInN0cmluZ1wiIF19LFxuICAgICAgXCJ2ZXJib3NlXCI6ICAgICB7XCJ0eXBlXCI6IFsgXCJzdHJpbmdcIiBdfSxcbiAgICAgIFwidGhlbWVcIjogICAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcInRyZWVzaGFrZVwiOiB7XCJ0eXBlXCI6IFsgXCJib29sZWFuXCIgXX0sXG4gICAgICBcInBhY2thZ2VzXCI6ICAgIHtcInR5cGVcIjogWyBcInN0cmluZ1wiLCBcImFycmF5XCIgXX1cbiAgICB9LFxuICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnMoKSB7XG4gIHJldHVybiB7XG4gICAgcG9ydDogMTk2MixcbiAgICBlbWl0OiB0cnVlLFxuICAgIGJyb3dzZXI6IHRydWUsXG4gICAgd2F0Y2g6ICd5ZXMnLFxuICAgIHByb2ZpbGU6ICcnLCBcbiAgICB0cmVlc2hha2U6IGZhbHNlLFxuICAgIGVudmlyb25tZW50OiAnZGV2ZWxvcG1lbnQnLCBcbiAgICB2ZXJib3NlOiAnbm8nLFxuICAgIHRvb2xraXQ6ICdtb2Rlcm4nLFxuICAgIHBhY2thZ2VzOiBudWxsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRWYXJzKCkge1xuICByZXR1cm4ge1xuICAgIHdhdGNoU3RhcnRlZCA6IGZhbHNlLFxuICAgIGZpcnN0VGltZSA6IHRydWUsXG4gICAgZmlyc3RDb21waWxlOiB0cnVlLFxuICAgIGJyb3dzZXJDb3VudCA6IDAsXG4gICAgbWFuaWZlc3Q6IG51bGwsXG4gICAgZXh0UGF0aDogJ2V4dC1hbmd1bGFyJyxcbiAgICBwbHVnaW5FcnJvcnM6IFtdLFxuICAgIGRlcHM6IFtdLFxuICAgIHVzZWRFeHRDb21wb25lbnRzOiBbXSxcbiAgICByZWJ1aWxkOiB0cnVlXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9YdHlwZShzdHIpIHtcbiAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgJy0nKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEZyb21Tb3VyY2UobW9kdWxlLCBvcHRpb25zLCBjb21waWxhdGlvbiwgZXh0Q29tcG9uZW50cykge1xuICB0cnkge1xuICAgIHZhciBqcyA9IG1vZHVsZS5fc291cmNlLl92YWx1ZVxuICAgIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gICAgLy9sb2d2KG9wdGlvbnMsJ0hPT0sgc3VjY2VlZE1vZHVsZSwgRlVOQ1RJT04gZXh0cmFjdEZyb21Tb3VyY2U6ICcgKyBtb2R1bGUucmVzb3VyY2UpXG5cbiAgICB2YXIgc3RhdGVtZW50cyA9IFtdXG5cbiAgICB2YXIgZ2VuZXJhdGUgPSByZXF1aXJlKFwiQGJhYmVsL2dlbmVyYXRvclwiKS5kZWZhdWx0XG4gICAgdmFyIHBhcnNlID0gcmVxdWlyZShcImJhYnlsb25cIikucGFyc2VcbiAgICB2YXIgdHJhdmVyc2UgPSByZXF1aXJlKFwiYXN0LXRyYXZlcnNlXCIpXG5cbiAgICB2YXIgYXN0ID0gcGFyc2UoanMsIHtcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgJ3R5cGVzY3JpcHQnLFxuICAgICAgICAnZmxvdycsXG4gICAgICAgICdkb0V4cHJlc3Npb25zJyxcbiAgICAgICAgJ29iamVjdFJlc3RTcHJlYWQnLFxuICAgICAgICAnY2xhc3NQcm9wZXJ0aWVzJyxcbiAgICAgICAgJ2V4cG9ydERlZmF1bHRGcm9tJyxcbiAgICAgICAgJ2V4cG9ydEV4dGVuc2lvbnMnLFxuICAgICAgICAnYXN5bmNHZW5lcmF0b3JzJyxcbiAgICAgICAgJ2Z1bmN0aW9uQmluZCcsXG4gICAgICAgICdmdW5jdGlvblNlbnQnLFxuICAgICAgICAnZHluYW1pY0ltcG9ydCdcbiAgICAgIF0sXG4gICAgICBzb3VyY2VUeXBlOiAnbW9kdWxlJ1xuICAgIH0pXG5cbiAgICB0cmF2ZXJzZShhc3QsIHtcbiAgICAgIHByZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJyAmJiBub2RlLmNhbGxlZSAmJiBub2RlLmNhbGxlZS5vYmplY3QgJiYgbm9kZS5jYWxsZWUub2JqZWN0Lm5hbWUgPT09ICdFeHQnKSB7XG4gICAgICAgICAgc3RhdGVtZW50cy5wdXNoKGdlbmVyYXRlKG5vZGUpLmNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgaWYobm9kZS50eXBlID09PSAnU3RyaW5nTGl0ZXJhbCcpIHtcbiAgICAgICAgICBsZXQgY29kZSA9IG5vZGUudmFsdWVcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChjb2RlLmNoYXJBdChpKSA9PSAnPCcpIHtcbiAgICAgICAgICAgICAgaWYgKGNvZGUuc3Vic3RyKGksIDQpID09ICc8IS0tJykge1xuICAgICAgICAgICAgICAgIGkgKz0gNFxuICAgICAgICAgICAgICAgIGkgKz0gY29kZS5zdWJzdHIoaSkuaW5kZXhPZignLS0+JykgKyAzXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZS5jaGFyQXQoaSsxKSAhPT0gJy8nKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gY29kZS5zdWJzdHJpbmcoaSlcbiAgICAgICAgICAgICAgICB2YXIgc3BhY2VFbmQgPSBzdGFydC5pbmRleE9mKCcgJylcbiAgICAgICAgICAgICAgICB2YXIgbmV3bGluZUVuZCA9IHN0YXJ0LmluZGV4T2YoJ1xcbicpXG4gICAgICAgICAgICAgICAgdmFyIHRhZ0VuZCA9IHN0YXJ0LmluZGV4T2YoJz4nKVxuICAgICAgICAgICAgICAgIHZhciBlbmQgPSBNYXRoLm1pbihzcGFjZUVuZCwgbmV3bGluZUVuZCwgdGFnRW5kKVxuICAgICAgICAgICAgICAgIGlmIChlbmQgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgdmFyIHh0eXBlID0gdG9YdHlwZShzdGFydC5zdWJzdHJpbmcoMSwgZW5kKSlcbiAgICAgICAgICAgICAgICAgIGlmKGV4dENvbXBvbmVudHMuaW5jbHVkZXMoeHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0aGVWYWx1ZSA9IG5vZGUudmFsdWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhlVmFsdWUuaW5kZXhPZignZG9jdHlwZSBodG1sJykgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IHt4dHlwZTogeHR5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IEpTT04uc3RyaW5naWZ5KHR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50cy5wdXNoKGBFeHQuY3JlYXRlKCR7Y29uZmlnfSlgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpICs9IGVuZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gc3RhdGVtZW50c1xuICB9XG4gIGNhdGNoKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKVxuICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCdleHRyYWN0RnJvbVNvdXJjZTogJyArIGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hhbmdlSXQobykge1xuICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG4gIGNvbnN0IGZzeCA9IHJlcXVpcmUoJ2ZzLWV4dHJhJylcbiAgY29uc3Qgd2hlcmVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIG8ud2hlcmUpXG4gIHZhciBqcyA9IGZzeC5yZWFkRmlsZVN5bmMod2hlcmVQYXRoKS50b1N0cmluZygpXG4gIHZhciBuZXdKcyA9IGpzLnJlcGxhY2Uoby5mcm9tLG8udG8pO1xuICBmc3gud3JpdGVGaWxlU3luYyh3aGVyZVBhdGgsIG5ld0pzLCAndXRmLTgnLCAoKT0+e3JldHVybn0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfdG9Qcm9kKHZhcnMsIG9wdGlvbnMpIHtcbiAgY29uc3QgbG9nID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9nXG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucywnRlVOQ1RJT04gX3RvUHJvZCcpXG4gIHRyeSB7XG4gICAgY29uc3QgZnN4ID0gcmVxdWlyZSgnZnMtZXh0cmEnKVxuICAgIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKVxuICAgIGNvbnN0IG1rZGlycCA9IHJlcXVpcmUoJ21rZGlycCcpXG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuXG4gICAgY29uc3QgcGF0aEV4dEFuZ3VsYXJQcm9kID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGBzcmMvYXBwL2V4dC1hbmd1bGFyLXByb2RgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aEV4dEFuZ3VsYXJQcm9kKSkge1xuICAgICAgbWtkaXJwLnN5bmMocGF0aEV4dEFuZ3VsYXJQcm9kKVxuICAgICAgY29uc3QgdCA9IHJlcXVpcmUoJy4vYXJ0aWZhY3RzJykuZXh0QW5ndWxhck1vZHVsZSgnJywgJycsICcnKVxuICAgICAgZnN4LndyaXRlRmlsZVN5bmMoYCR7cGF0aEV4dEFuZ3VsYXJQcm9kfS9leHQtYW5ndWxhci5tb2R1bGUudHNgLCB0LCAndXRmLTgnLCAoKSA9PiB7XG4gICAgICAgIHJldHVyblxuICAgICAgfSlcbiAgICB9XG5cbiAgICB2YXIgbyA9IHt9XG4gICAgby53aGVyZSA9ICdzcmMvYXBwL2FwcC5tb2R1bGUudHMnXG4gICAgby5mcm9tID0gYGltcG9ydCB7IEV4dEFuZ3VsYXJNb2R1bGUgfSBmcm9tICdAc2VuY2hhL2V4dC1hbmd1bGFyJ2BcbiAgICBvLnRvID0gYGltcG9ydCB7IEV4dEFuZ3VsYXJNb2R1bGUgfSBmcm9tICcuL2V4dC1hbmd1bGFyLXByb2QvZXh0LWFuZ3VsYXIubW9kdWxlJ2BcbiAgICBjaGFuZ2VJdChvKVxuXG4gICAgbyA9IHt9XG4gICAgby53aGVyZSA9ICdzcmMvbWFpbi50cydcbiAgICBvLmZyb20gPSBgYm9vdHN0cmFwTW9kdWxlKCBBcHBNb2R1bGUgKTtgXG4gICAgby50byA9IGBlbmFibGVQcm9kTW9kZSgpO2Jvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO2BcbiAgICBjaGFuZ2VJdChvKVxuICB9XG4gIGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coZSlcbiAgICByZXR1cm4gW11cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX3RvRGV2KHZhcnMsIG9wdGlvbnMpIHtcbiAgY29uc3QgbG9nID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9nXG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucywnRlVOQ1RJT04gX3RvUHJvZCcpXG4gIHRyeSB7XG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuICAgIGNvbnN0IHBhdGhFeHRBbmd1bGFyUHJvZCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBgc3JjL2FwcC9leHQtYW5ndWxhci1wcm9kYCk7XG4gICAgcmVxdWlyZSgncmltcmFmJykuc3luYyhwYXRoRXh0QW5ndWxhclByb2QpO1xuXG4gICAgdmFyIG8gPSB7fVxuICAgIG8ud2hlcmUgPSAnc3JjL2FwcC9hcHAubW9kdWxlLnRzJ1xuICAgIG8uZnJvbSA9IGBpbXBvcnQgeyBFeHRBbmd1bGFyTW9kdWxlIH0gZnJvbSAnLi9leHQtYW5ndWxhci1wcm9kL2V4dC1hbmd1bGFyLm1vZHVsZSdgXG4gICAgby50byA9IGBpbXBvcnQgeyBFeHRBbmd1bGFyTW9kdWxlIH0gZnJvbSAnQHNlbmNoYS9leHQtYW5ndWxhcidgXG4gICAgY2hhbmdlSXQobylcblxuICAgIG8gPSB7fVxuICAgIG8ud2hlcmUgPSAnc3JjL21haW4udHMnXG4gICAgby5mcm9tID0gYGVuYWJsZVByb2RNb2RlKCk7Ym9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSk7YFxuICAgIG8udG8gPSBgYm9vdHN0cmFwTW9kdWxlKCBBcHBNb2R1bGUgKTtgXG4gICAgY2hhbmdlSXQobylcbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gX2dldEFsbENvbXBvbmVudHModmFycywgb3B0aW9ucykge1xuICBjb25zdCBsb2cgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2dcbiAgY29uc3QgbG9ndiA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3ZcbiAgbG9ndihvcHRpb25zLCdGVU5DVElPTiBfZ2V0QWxsQ29tcG9uZW50cycpXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG4gICAgY29uc3QgZnN4ID0gcmVxdWlyZSgnZnMtZXh0cmEnKVxuXG4gICAgdmFyIGV4dENvbXBvbmVudHMgPSBbXVxuICAgIGNvbnN0IHBhY2thZ2VMaWJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtYW5ndWxhci9zcmMvbGliJylcbiAgICB2YXIgZmlsZXMgPSBmc3gucmVhZGRpclN5bmMocGFja2FnZUxpYlBhdGgpXG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZU5hbWUpID0+IHtcbiAgICAgIGlmIChmaWxlTmFtZSAmJiBmaWxlTmFtZS5zdWJzdHIoMCwgNCkgPT0gJ2V4dC0nKSB7XG4gICAgICAgIHZhciBlbmQgPSBmaWxlTmFtZS5zdWJzdHIoNCkuaW5kZXhPZignLmNvbXBvbmVudCcpXG4gICAgICAgIGlmIChlbmQgPj0gMCkge1xuICAgICAgICAgIGV4dENvbXBvbmVudHMucHVzaChmaWxlTmFtZS5zdWJzdHJpbmcoNCwgZW5kICsgNCkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHRDb21wb25lbnRzXG5cbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF93cml0ZUZpbGVzVG9Qcm9kRm9sZGVyKHZhcnMsIG9wdGlvbnMpIHtcbiAgY29uc3QgbG9nID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9nXG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucywnRlVOQ1RJT04gX3dyaXRlRmlsZXNUb1Byb2RGb2xkZXInKVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuICAgIGNvbnN0IGZzeCA9IHJlcXVpcmUoJ2ZzLWV4dHJhJylcblxuICAgIGNvbnN0IHBhY2thZ2VMaWJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtYW5ndWxhci9zcmMvbGliJylcbiAgICBjb25zdCBwYXRoVG9FeHRBbmd1bGFyUHJvZCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBgc3JjL2FwcC9leHQtYW5ndWxhci1wcm9kYClcbiAgICBjb25zdCBzdHJpbmcgPSAnRXh0LmNyZWF0ZSh7XFxcInh0eXBlXFxcIjpcXFwiJ1xuXG4gICAgdmFycy5kZXBzLmZvckVhY2goY29kZSA9PiB7XG4gICAgICB2YXIgaW5kZXggPSBjb2RlLmluZGV4T2Yoc3RyaW5nKVxuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgY29kZSA9IGNvZGUuc3Vic3RyaW5nKGluZGV4ICsgc3RyaW5nLmxlbmd0aClcbiAgICAgICAgdmFyIGVuZCA9IGNvZGUuaW5kZXhPZignXFxcIicpXG4gICAgICAgIHZhcnMudXNlZEV4dENvbXBvbmVudHMucHVzaChjb2RlLnN1YnN0cigwLCBlbmQpKVxuICAgICAgfVxuICAgIH0pXG4gICAgdmFycy51c2VkRXh0Q29tcG9uZW50cyA9IFsuLi5uZXcgU2V0KHZhcnMudXNlZEV4dENvbXBvbmVudHMpXVxuXG4gICAgdmFyIHdyaXRlVG9QYXRoV3JpdHRlbiA9IGZhbHNlXG4gICAgdmFyIG1vZHVsZVZhcnMgPSB7XG4gICAgICBpbXBvcnRzOiAnJyxcbiAgICAgIGV4cG9ydHM6ICcnLFxuICAgICAgZGVjbGFyYXRpb25zOiAnJ1xuICAgIH1cbiAgICB2YXJzLnVzZWRFeHRDb21wb25lbnRzLmZvckVhY2goeHR5cGUgPT4ge1xuICAgICAgdmFyIGNhcGNsYXNzbmFtZSA9IHh0eXBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgeHR5cGUucmVwbGFjZSgvLS9nLCBcIl9cIikuc2xpY2UoMSlcbiAgICAgIG1vZHVsZVZhcnMuaW1wb3J0cyA9IG1vZHVsZVZhcnMuaW1wb3J0cyArIGBpbXBvcnQgeyBFeHQke2NhcGNsYXNzbmFtZX1Db21wb25lbnQgfSBmcm9tICcuL2V4dC0ke3h0eXBlfS5jb21wb25lbnQnO1xcbmBcbiAgICAgIG1vZHVsZVZhcnMuZXhwb3J0cyA9IG1vZHVsZVZhcnMuZXhwb3J0cyArIGAgICAgRXh0JHtjYXBjbGFzc25hbWV9Q29tcG9uZW50LFxcbmBcbiAgICAgIG1vZHVsZVZhcnMuZGVjbGFyYXRpb25zID0gbW9kdWxlVmFycy5kZWNsYXJhdGlvbnMgKyBgICAgIEV4dCR7Y2FwY2xhc3NuYW1lfUNvbXBvbmVudCxcXG5gXG4gICAgICB2YXIgY2xhc3NGaWxlID0gYGV4dC0ke3h0eXBlfS5jb21wb25lbnQudHNgXG4gICAgICBjb25zdCBjb250ZW50cyA9IGZzeC5yZWFkRmlsZVN5bmMoYCR7cGFja2FnZUxpYlBhdGh9LyR7Y2xhc3NGaWxlfWApLnRvU3RyaW5nKClcbiAgICAgIGZzeC53cml0ZUZpbGVTeW5jKGAke3BhdGhUb0V4dEFuZ3VsYXJQcm9kfS8ke2NsYXNzRmlsZX1gLCBjb250ZW50cywgJ3V0Zi04JywgKCk9PntyZXR1cm59KVxuICAgICAgd3JpdGVUb1BhdGhXcml0dGVuID0gdHJ1ZVxuICAgIH0pXG4gICAgaWYgKHdyaXRlVG9QYXRoV3JpdHRlbikge1xuICAgICAgdmFyIHQgPSByZXF1aXJlKCcuL2FydGlmYWN0cycpLmV4dEFuZ3VsYXJNb2R1bGUoXG4gICAgICAgIG1vZHVsZVZhcnMuaW1wb3J0cywgbW9kdWxlVmFycy5leHBvcnRzLCBtb2R1bGVWYXJzLmRlY2xhcmF0aW9uc1xuICAgICAgKVxuICAgICAgZnN4LndyaXRlRmlsZVN5bmMoYCR7cGF0aFRvRXh0QW5ndWxhclByb2R9L2V4dC1hbmd1bGFyLm1vZHVsZS50c2AsIHQsICd1dGYtOCcsICgpPT57cmV0dXJufSlcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlQ29udGVudCA9IGZzeC5yZWFkRmlsZVN5bmMoYCR7cGFja2FnZUxpYlBhdGh9L2Jhc2UudHNgKS50b1N0cmluZygpXG4gICAgZnN4LndyaXRlRmlsZVN5bmMoYCR7cGF0aFRvRXh0QW5ndWxhclByb2R9L2Jhc2UudHNgLCBiYXNlQ29udGVudCwgJ3V0Zi04JywgKCk9PntyZXR1cm59KVxuXG4gIH1cbiAgY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKVxuICAgIHJldHVybiBbXVxuICB9XG59Il19 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hbmd1bGFyVXRpbC5qcyJdLCJuYW1lcyI6WyJfZ2V0RGVmYXVsdFZhcnMiLCJ0b3VjaEZpbGUiLCJ3YXRjaFN0YXJ0ZWQiLCJidWlsZHN0ZXAiLCJmaXJzdFRpbWUiLCJmaXJzdENvbXBpbGUiLCJicm93c2VyQ291bnQiLCJtYW5pZmVzdCIsImV4dFBhdGgiLCJwbHVnaW5FcnJvcnMiLCJkZXBzIiwidXNlZEV4dENvbXBvbmVudHMiLCJyZWJ1aWxkIiwiX2V4dHJhY3RGcm9tU291cmNlIiwibW9kdWxlIiwib3B0aW9ucyIsImNvbXBpbGF0aW9uIiwiZXh0Q29tcG9uZW50cyIsImxvZ3YiLCJyZXF1aXJlIiwidmVyYm9zZSIsImpzIiwiX3NvdXJjZSIsIl92YWx1ZSIsInN0YXRlbWVudHMiLCJnZW5lcmF0ZSIsImRlZmF1bHQiLCJwYXJzZSIsInRyYXZlcnNlIiwiYXN0IiwicGx1Z2lucyIsInNvdXJjZVR5cGUiLCJwcmUiLCJub2RlIiwidHlwZSIsImNhbGxlZSIsIm9iamVjdCIsIm5hbWUiLCJwdXNoIiwiY29kZSIsInZhbHVlIiwiaSIsImxlbmd0aCIsImNoYXJBdCIsInN1YnN0ciIsImluZGV4T2YiLCJzdGFydCIsInN1YnN0cmluZyIsInNwYWNlRW5kIiwibmV3bGluZUVuZCIsInRhZ0VuZCIsImVuZCIsIk1hdGgiLCJtaW4iLCJ4dHlwZSIsIl90b1h0eXBlIiwiaW5jbHVkZXMiLCJ0aGVWYWx1ZSIsInRvTG93ZXJDYXNlIiwiY29uZmlnIiwiSlNPTiIsInN0cmluZ2lmeSIsImNoYW5nZUl0IiwibyIsInBhdGgiLCJmc3giLCJ3aGVyZVBhdGgiLCJyZXNvbHZlIiwicHJvY2VzcyIsImN3ZCIsIndoZXJlIiwicmVhZEZpbGVTeW5jIiwidG9TdHJpbmciLCJuZXdKcyIsInJlcGxhY2UiLCJmcm9tIiwidG8iLCJ3cml0ZUZpbGVTeW5jIiwiX3RvUHJvZCIsInZhcnMiLCJsb2ciLCJmcyIsIm1rZGlycCIsInBhdGhFeHRBbmd1bGFyUHJvZCIsImV4aXN0c1N5bmMiLCJzeW5jIiwidCIsImV4dEFuZ3VsYXJNb2R1bGUiLCJfdG9EZXYiLCJfZ2V0QWxsQ29tcG9uZW50cyIsInBhY2thZ2VMaWJQYXRoIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImZvckVhY2giLCJmaWxlTmFtZSIsImFwcCIsImZyYW1ld29yayIsIl93cml0ZUZpbGVzVG9Qcm9kRm9sZGVyIiwicGF0aFRvRXh0QW5ndWxhclByb2QiLCJzdHJpbmciLCJpbmRleCIsIlNldCIsIndyaXRlVG9QYXRoV3JpdHRlbiIsIm1vZHVsZVZhcnMiLCJpbXBvcnRzIiwiZXhwb3J0cyIsImRlY2xhcmF0aW9ucyIsImNhcGNsYXNzbmFtZSIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJjbGFzc0ZpbGUiLCJjb250ZW50cyIsImJhc2VDb250ZW50Il0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0FBRU8sU0FBU0EsZUFBVCxHQUEyQjtBQUNoQyxTQUFPO0FBQ0xDLElBQUFBLFNBQVMsRUFBRSxnQkFETjtBQUVMQyxJQUFBQSxZQUFZLEVBQUcsS0FGVjtBQUdMQyxJQUFBQSxTQUFTLEVBQUUsUUFITjtBQUlMQyxJQUFBQSxTQUFTLEVBQUcsSUFKUDtBQUtMQyxJQUFBQSxZQUFZLEVBQUUsSUFMVDtBQU1MQyxJQUFBQSxZQUFZLEVBQUcsQ0FOVjtBQU9MQyxJQUFBQSxRQUFRLEVBQUUsSUFQTDtBQVFMQyxJQUFBQSxPQUFPLEVBQUUsS0FSSjtBQVNMQyxJQUFBQSxZQUFZLEVBQUUsRUFUVDtBQVVMQyxJQUFBQSxJQUFJLEVBQUUsRUFWRDtBQVdMQyxJQUFBQSxpQkFBaUIsRUFBRSxFQVhkO0FBWUxDLElBQUFBLE9BQU8sRUFBRTtBQVpKLEdBQVA7QUFjRDs7QUFFTSxTQUFTQyxrQkFBVCxDQUE0QkMsTUFBNUIsRUFBb0NDLE9BQXBDLEVBQTZDQyxXQUE3QyxFQUEwREMsYUFBMUQsRUFBeUU7QUFDOUUsUUFBTUMsSUFBSSxHQUFHQyxPQUFPLENBQUMsY0FBRCxDQUFQLENBQXdCRCxJQUFyQzs7QUFD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QVUsQ0FBQ0csWUFBWCxHQUEyQixVQUFTQyxZQUFhLGNBQTNFO0FBQ0EsUUFBSUcsU0FBUyxHQUFJLE9BQU14RCxLQUFNLGVBQTdCO0FBQ0EsVUFBTXlELFFBQVEsR0FBRzlDLEdBQUcsQ0FBQ00sWUFBSixDQUFrQixHQUFFbUIsY0FBZSxJQUFHb0IsU0FBVSxFQUFoRCxFQUFtRHRDLFFBQW5ELEVBQWpCO0FBQ0FQLElBQUFBLEdBQUcsQ0FBQ1ksYUFBSixDQUFtQixHQUFFcUIsb0JBQXFCLElBQUdZLFNBQVUsRUFBdkQsRUFBMERDLFFBQTFELEVBQW9FLE9BQXBFLEVBQTZFLE1BQUk7QUFBQztBQUFPLEtBQXpGO0FBQ0FULElBQUFBLGtCQUFrQixHQUFHLElBQXJCO0FBQ0QsR0FURDs7QUFVQSxNQUFJQSxrQkFBSixFQUF3QjtBQUN0QixRQUFJaEIsQ0FBQyxHQUFHbkUsT0FBTyxDQUFDLGFBQUQsQ0FBUCxDQUF1Qm9FLGdCQUF2QixDQUNOZ0IsVUFBVSxDQUFDQyxPQURMLEVBQ2NELFVBQVUsQ0FBQ0UsT0FEekIsRUFDa0NGLFVBQVUsQ0FBQ0csWUFEN0MsQ0FBUjs7QUFHQXpDLElBQUFBLEdBQUcsQ0FBQ1ksYUFBSixDQUFtQixHQUFFcUIsb0JBQXFCLHdCQUExQyxFQUFtRVosQ0FBbkUsRUFBc0UsT0FBdEUsRUFBK0UsTUFBSTtBQUFDO0FBQU8sS0FBM0Y7QUFDRDs7QUFFRCxRQUFNMEIsV0FBVyxHQUFHL0MsR0FBRyxDQUFDTSxZQUFKLENBQWtCLEdBQUVtQixjQUFlLFVBQW5DLEVBQThDbEIsUUFBOUMsRUFBcEI7QUFDQVAsRUFBQUEsR0FBRyxDQUFDWSxhQUFKLENBQW1CLEdBQUVxQixvQkFBcUIsVUFBMUMsRUFBcURjLFdBQXJELEVBQWtFLE9BQWxFLEVBQTJFLE1BQUk7QUFBQztBQUFPLEdBQXZGO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5leHBvcnQgZnVuY3Rpb24gX2dldERlZmF1bHRWYXJzKCkge1xuICByZXR1cm4ge1xuICAgIHRvdWNoRmlsZTogJy9zcmMvdGhlbWVyLnRzJyxcbiAgICB3YXRjaFN0YXJ0ZWQgOiBmYWxzZSxcbiAgICBidWlsZHN0ZXA6ICcxIG9mIDEnLFxuICAgIGZpcnN0VGltZSA6IHRydWUsXG4gICAgZmlyc3RDb21waWxlOiB0cnVlLFxuICAgIGJyb3dzZXJDb3VudCA6IDAsXG4gICAgbWFuaWZlc3Q6IG51bGwsXG4gICAgZXh0UGF0aDogJ2V4dCcsXG4gICAgcGx1Z2luRXJyb3JzOiBbXSxcbiAgICBkZXBzOiBbXSxcbiAgICB1c2VkRXh0Q29tcG9uZW50czogW10sXG4gICAgcmVidWlsZDogdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZXh0cmFjdEZyb21Tb3VyY2UobW9kdWxlLCBvcHRpb25zLCBjb21waWxhdGlvbiwgZXh0Q29tcG9uZW50cykge1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBjb25zdCB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlXG4gIGxvZ3YodmVyYm9zZSwnRlVOQ1RJT04gX2V4dHJhY3RGcm9tU291cmNlJylcbiAgdmFyIGpzID0gbW9kdWxlLl9zb3VyY2UuX3ZhbHVlXG5cbiAgdmFyIHN0YXRlbWVudHMgPSBbXVxuXG4gIHZhciBnZW5lcmF0ZSA9IHJlcXVpcmUoXCJAYmFiZWwvZ2VuZXJhdG9yXCIpLmRlZmF1bHRcbiAgdmFyIHBhcnNlID0gcmVxdWlyZShcImJhYnlsb25cIikucGFyc2VcbiAgdmFyIHRyYXZlcnNlID0gcmVxdWlyZShcImFzdC10cmF2ZXJzZVwiKVxuXG4gIHZhciBhc3QgPSBwYXJzZShqcywge1xuICAgIHBsdWdpbnM6IFtcbiAgICAgICd0eXBlc2NyaXB0JyxcbiAgICAgICdmbG93JyxcbiAgICAgICdkb0V4cHJlc3Npb25zJyxcbiAgICAgICdvYmplY3RSZXN0U3ByZWFkJyxcbiAgICAgICdjbGFzc1Byb3BlcnRpZXMnLFxuICAgICAgJ2V4cG9ydERlZmF1bHRGcm9tJyxcbiAgICAgICdleHBvcnRFeHRlbnNpb25zJyxcbiAgICAgICdhc3luY0dlbmVyYXRvcnMnLFxuICAgICAgJ2Z1bmN0aW9uQmluZCcsXG4gICAgICAnZnVuY3Rpb25TZW50JyxcbiAgICAgICdkeW5hbWljSW1wb3J0J1xuICAgIF0sXG4gICAgc291cmNlVHlwZTogJ21vZHVsZSdcbiAgfSlcblxuICB0cmF2ZXJzZShhc3QsIHtcbiAgICBwcmU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICBpZiAobm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nICYmIG5vZGUuY2FsbGVlICYmIG5vZGUuY2FsbGVlLm9iamVjdCAmJiBub2RlLmNhbGxlZS5vYmplY3QubmFtZSA9PT0gJ0V4dCcpIHtcbiAgICAgICAgc3RhdGVtZW50cy5wdXNoKGdlbmVyYXRlKG5vZGUpLmNvZGUpXG4gICAgICB9XG4gICAgICBpZihub2RlLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJykge1xuICAgICAgICBsZXQgY29kZSA9IG5vZGUudmFsdWVcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKGNvZGUuY2hhckF0KGkpID09ICc8Jykge1xuICAgICAgICAgICAgaWYgKGNvZGUuc3Vic3RyKGksIDQpID09ICc8IS0tJykge1xuICAgICAgICAgICAgICBpICs9IDRcbiAgICAgICAgICAgICAgaSArPSBjb2RlLnN1YnN0cihpKS5pbmRleE9mKCctLT4nKSArIDNcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZS5jaGFyQXQoaSsxKSAhPT0gJy8nKSB7XG4gICAgICAgICAgICAgIHZhciBzdGFydCA9IGNvZGUuc3Vic3RyaW5nKGkpXG4gICAgICAgICAgICAgIHZhciBzcGFjZUVuZCA9IHN0YXJ0LmluZGV4T2YoJyAnKVxuICAgICAgICAgICAgICB2YXIgbmV3bGluZUVuZCA9IHN0YXJ0LmluZGV4T2YoJ1xcbicpXG4gICAgICAgICAgICAgIHZhciB0YWdFbmQgPSBzdGFydC5pbmRleE9mKCc+JylcbiAgICAgICAgICAgICAgdmFyIGVuZCA9IE1hdGgubWluKHNwYWNlRW5kLCBuZXdsaW5lRW5kLCB0YWdFbmQpXG4gICAgICAgICAgICAgIGlmIChlbmQgPj0gMCkge1xuICAgICAgICAgICAgICAgIHZhciB4dHlwZSA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLl90b1h0eXBlKHN0YXJ0LnN1YnN0cmluZygxLCBlbmQpKVxuICAgICAgICAgICAgICAgIGlmKGV4dENvbXBvbmVudHMuaW5jbHVkZXMoeHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgdGhlVmFsdWUgPSBub2RlLnZhbHVlLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgIGlmICh0aGVWYWx1ZS5pbmRleE9mKCdkb2N0eXBlIGh0bWwnKSA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IHt4dHlwZTogeHR5cGV9XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25maWcgPSBKU09OLnN0cmluZ2lmeSh0eXBlKVxuICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnRzLnB1c2goYEV4dC5jcmVhdGUoJHtjb25maWd9KWApXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkgKz0gZW5kXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHN0YXRlbWVudHNcbn1cblxuZnVuY3Rpb24gY2hhbmdlSXQobykge1xuICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG4gIGNvbnN0IGZzeCA9IHJlcXVpcmUoJ2ZzLWV4dHJhJylcbiAgY29uc3Qgd2hlcmVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIG8ud2hlcmUpXG4gIHZhciBqcyA9IGZzeC5yZWFkRmlsZVN5bmMod2hlcmVQYXRoKS50b1N0cmluZygpXG4gIHZhciBuZXdKcyA9IGpzLnJlcGxhY2Uoby5mcm9tLG8udG8pO1xuICBmc3gud3JpdGVGaWxlU3luYyh3aGVyZVBhdGgsIG5ld0pzLCAndXRmLTgnLCAoKT0+e3JldHVybn0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfdG9Qcm9kKHZhcnMsIG9wdGlvbnMpIHtcbiAgY29uc3QgbG9nID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9nXG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucy52ZXJib3NlLCdGVU5DVElPTiBfdG9Qcm9kJylcbiAgY29uc3QgZnN4ID0gcmVxdWlyZSgnZnMtZXh0cmEnKVxuICBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJylcbiAgY29uc3QgbWtkaXJwID0gcmVxdWlyZSgnbWtkaXJwJylcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuXG4gIGNvbnN0IHBhdGhFeHRBbmd1bGFyUHJvZCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBgc3JjL2FwcC9leHQtYW5ndWxhci1wcm9kYCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoRXh0QW5ndWxhclByb2QpKSB7XG4gICAgbWtkaXJwLnN5bmMocGF0aEV4dEFuZ3VsYXJQcm9kKVxuICAgIGNvbnN0IHQgPSByZXF1aXJlKCcuL2FydGlmYWN0cycpLmV4dEFuZ3VsYXJNb2R1bGUoJycsICcnLCAnJylcbiAgICBmc3gud3JpdGVGaWxlU3luYyhgJHtwYXRoRXh0QW5ndWxhclByb2R9L2V4dC1hbmd1bGFyLm1vZHVsZS50c2AsIHQsICd1dGYtOCcsICgpID0+IHtcbiAgICAgIHJldHVyblxuICAgIH0pXG4gIH1cblxuICB2YXIgbyA9IHt9XG4gIG8ud2hlcmUgPSAnc3JjL2FwcC9hcHAubW9kdWxlLnRzJ1xuICBvLmZyb20gPSBgaW1wb3J0IHsgRXh0QW5ndWxhck1vZHVsZSB9IGZyb20gJ0BzZW5jaGEvZXh0LWFuZ3VsYXInYFxuICBvLnRvID0gYGltcG9ydCB7IEV4dEFuZ3VsYXJNb2R1bGUgfSBmcm9tICcuL2V4dC1hbmd1bGFyLXByb2QvZXh0LWFuZ3VsYXIubW9kdWxlJ2BcbiAgY2hhbmdlSXQobylcblxuICBvID0ge31cbiAgby53aGVyZSA9ICdzcmMvbWFpbi50cydcbiAgby5mcm9tID0gYGJvb3RzdHJhcE1vZHVsZSggQXBwTW9kdWxlICk7YFxuICBvLnRvID0gYGVuYWJsZVByb2RNb2RlKCk7Ym9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSk7YFxuICBjaGFuZ2VJdChvKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX3RvRGV2KHZhcnMsIG9wdGlvbnMpIHtcbiAgY29uc3QgbG9nID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9nXG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucy52ZXJib3NlLCdGVU5DVElPTiBfdG9EZXYnKVxuICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG4gIGNvbnN0IHBhdGhFeHRBbmd1bGFyUHJvZCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBgc3JjL2FwcC9leHQtYW5ndWxhci1wcm9kYCk7XG4gIHJlcXVpcmUoJ3JpbXJhZicpLnN5bmMocGF0aEV4dEFuZ3VsYXJQcm9kKTtcblxuICB2YXIgbyA9IHt9XG4gIG8ud2hlcmUgPSAnc3JjL2FwcC9hcHAubW9kdWxlLnRzJ1xuICBvLmZyb20gPSBgaW1wb3J0IHsgRXh0QW5ndWxhck1vZHVsZSB9IGZyb20gJy4vZXh0LWFuZ3VsYXItcHJvZC9leHQtYW5ndWxhci5tb2R1bGUnYFxuICBvLnRvID0gYGltcG9ydCB7IEV4dEFuZ3VsYXJNb2R1bGUgfSBmcm9tICdAc2VuY2hhL2V4dC1hbmd1bGFyJ2BcbiAgY2hhbmdlSXQobylcblxuICBvID0ge31cbiAgby53aGVyZSA9ICdzcmMvbWFpbi50cydcbiAgby5mcm9tID0gYGVuYWJsZVByb2RNb2RlKCk7Ym9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSk7YFxuICBvLnRvID0gYGJvb3RzdHJhcE1vZHVsZSggQXBwTW9kdWxlICk7YFxuICBjaGFuZ2VJdChvKVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0QWxsQ29tcG9uZW50cyh2YXJzLCBvcHRpb25zKSB7XG4gIGNvbnN0IGxvZyA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KG9wdGlvbnMudmVyYm9zZSwnRlVOQ1RJT04gX2dldEFsbENvbXBvbmVudHMnKVxuXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbiAgY29uc3QgZnN4ID0gcmVxdWlyZSgnZnMtZXh0cmEnKVxuXG4vLyAgICBsb2codmFycy5hcHAsIGBHZXR0aW5nIGFsbCByZWZlcmVuY2VkIGV4dC0ke29wdGlvbnMuZnJhbWV3b3JrfSBtb2R1bGVzYClcbiAgdmFyIGV4dENvbXBvbmVudHMgPSBbXVxuICBjb25zdCBwYWNrYWdlTGliUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LWFuZ3VsYXIvc3JjL2xpYicpXG4gIHZhciBmaWxlcyA9IGZzeC5yZWFkZGlyU3luYyhwYWNrYWdlTGliUGF0aClcbiAgZmlsZXMuZm9yRWFjaCgoZmlsZU5hbWUpID0+IHtcbiAgICBpZiAoZmlsZU5hbWUgJiYgZmlsZU5hbWUuc3Vic3RyKDAsIDQpID09ICdleHQtJykge1xuICAgICAgdmFyIGVuZCA9IGZpbGVOYW1lLnN1YnN0cig0KS5pbmRleE9mKCcuY29tcG9uZW50JylcbiAgICAgIGlmIChlbmQgPj0gMCkge1xuICAgICAgICBleHRDb21wb25lbnRzLnB1c2goZmlsZU5hbWUuc3Vic3RyaW5nKDQsIGVuZCArIDQpKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgbG9nKHZhcnMuYXBwLCBgV3JpdGluZyBhbGwgcmVmZXJlbmNlZCBleHQtJHtvcHRpb25zLmZyYW1ld29ya30gbW9kdWxlc2ApXG4gIHJldHVybiBleHRDb21wb25lbnRzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfd3JpdGVGaWxlc1RvUHJvZEZvbGRlcih2YXJzLCBvcHRpb25zKSB7XG4gIGNvbnN0IGxvZyA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KG9wdGlvbnMudmVyYm9zZSwnRlVOQ1RJT04gX3dyaXRlRmlsZXNUb1Byb2RGb2xkZXInKVxuXG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbiAgY29uc3QgZnN4ID0gcmVxdWlyZSgnZnMtZXh0cmEnKVxuXG4gIGNvbnN0IHBhY2thZ2VMaWJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtYW5ndWxhci9zcmMvbGliJylcbiAgY29uc3QgcGF0aFRvRXh0QW5ndWxhclByb2QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgYHNyYy9hcHAvZXh0LWFuZ3VsYXItcHJvZGApXG4gIGNvbnN0IHN0cmluZyA9ICdFeHQuY3JlYXRlKHtcXFwieHR5cGVcXFwiOlxcXCInXG5cbiAgdmFycy5kZXBzLmZvckVhY2goY29kZSA9PiB7XG4gICAgdmFyIGluZGV4ID0gY29kZS5pbmRleE9mKHN0cmluZylcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgY29kZSA9IGNvZGUuc3Vic3RyaW5nKGluZGV4ICsgc3RyaW5nLmxlbmd0aClcbiAgICAgIHZhciBlbmQgPSBjb2RlLmluZGV4T2YoJ1xcXCInKVxuICAgICAgdmFycy51c2VkRXh0Q29tcG9uZW50cy5wdXNoKGNvZGUuc3Vic3RyKDAsIGVuZCkpXG4gICAgfVxuICB9KVxuICB2YXJzLnVzZWRFeHRDb21wb25lbnRzID0gWy4uLm5ldyBTZXQodmFycy51c2VkRXh0Q29tcG9uZW50cyldXG5cbiAgdmFyIHdyaXRlVG9QYXRoV3JpdHRlbiA9IGZhbHNlXG4gIHZhciBtb2R1bGVWYXJzID0ge1xuICAgIGltcG9ydHM6ICcnLFxuICAgIGV4cG9ydHM6ICcnLFxuICAgIGRlY2xhcmF0aW9uczogJydcbiAgfVxuICB2YXJzLnVzZWRFeHRDb21wb25lbnRzLmZvckVhY2goeHR5cGUgPT4ge1xuICAgIHZhciBjYXBjbGFzc25hbWUgPSB4dHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHh0eXBlLnJlcGxhY2UoLy0vZywgXCJfXCIpLnNsaWNlKDEpXG4gICAgbW9kdWxlVmFycy5pbXBvcnRzID0gbW9kdWxlVmFycy5pbXBvcnRzICsgYGltcG9ydCB7IEV4dCR7Y2FwY2xhc3NuYW1lfUNvbXBvbmVudCB9IGZyb20gJy4vZXh0LSR7eHR5cGV9LmNvbXBvbmVudCc7XFxuYFxuICAgIG1vZHVsZVZhcnMuZXhwb3J0cyA9IG1vZHVsZVZhcnMuZXhwb3J0cyArIGAgICAgRXh0JHtjYXBjbGFzc25hbWV9Q29tcG9uZW50LFxcbmBcbiAgICBtb2R1bGVWYXJzLmRlY2xhcmF0aW9ucyA9IG1vZHVsZVZhcnMuZGVjbGFyYXRpb25zICsgYCAgICBFeHQke2NhcGNsYXNzbmFtZX1Db21wb25lbnQsXFxuYFxuICAgIHZhciBjbGFzc0ZpbGUgPSBgZXh0LSR7eHR5cGV9LmNvbXBvbmVudC50c2BcbiAgICBjb25zdCBjb250ZW50cyA9IGZzeC5yZWFkRmlsZVN5bmMoYCR7cGFja2FnZUxpYlBhdGh9LyR7Y2xhc3NGaWxlfWApLnRvU3RyaW5nKClcbiAgICBmc3gud3JpdGVGaWxlU3luYyhgJHtwYXRoVG9FeHRBbmd1bGFyUHJvZH0vJHtjbGFzc0ZpbGV9YCwgY29udGVudHMsICd1dGYtOCcsICgpPT57cmV0dXJufSlcbiAgICB3cml0ZVRvUGF0aFdyaXR0ZW4gPSB0cnVlXG4gIH0pXG4gIGlmICh3cml0ZVRvUGF0aFdyaXR0ZW4pIHtcbiAgICB2YXIgdCA9IHJlcXVpcmUoJy4vYXJ0aWZhY3RzJykuZXh0QW5ndWxhck1vZHVsZShcbiAgICAgIG1vZHVsZVZhcnMuaW1wb3J0cywgbW9kdWxlVmFycy5leHBvcnRzLCBtb2R1bGVWYXJzLmRlY2xhcmF0aW9uc1xuICAgIClcbiAgICBmc3gud3JpdGVGaWxlU3luYyhgJHtwYXRoVG9FeHRBbmd1bGFyUHJvZH0vZXh0LWFuZ3VsYXIubW9kdWxlLnRzYCwgdCwgJ3V0Zi04JywgKCk9PntyZXR1cm59KVxuICB9XG5cbiAgY29uc3QgYmFzZUNvbnRlbnQgPSBmc3gucmVhZEZpbGVTeW5jKGAke3BhY2thZ2VMaWJQYXRofS9iYXNlLnRzYCkudG9TdHJpbmcoKVxuICBmc3gud3JpdGVGaWxlU3luYyhgJHtwYXRoVG9FeHRBbmd1bGFyUHJvZH0vYmFzZS50c2AsIGJhc2VDb250ZW50LCAndXRmLTgnLCAoKT0+e3JldHVybn0pXG59Il19 \ No newline at end of file diff --git a/packages/ext-react-webpack-plugin/dist/componentsUtil.js b/packages/ext-react-webpack-plugin/dist/componentsUtil.js index 5de73d5b..2e0aa805 100644 --- a/packages/ext-react-webpack-plugin/dist/componentsUtil.js +++ b/packages/ext-react-webpack-plugin/dist/componentsUtil.js @@ -3,87 +3,23 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.getValidateOptions = getValidateOptions; -exports.getDefaultOptions = getDefaultOptions; -exports.getDefaultVars = getDefaultVars; -exports.extractFromSource = extractFromSource; +exports._getDefaultVars = _getDefaultVars; +exports._extractFromSource = _extractFromSource; exports._toProd = _toProd; exports._toDev = _toDev; exports._getAllComponents = _getAllComponents; exports._writeFilesToProdFolder = _writeFilesToProdFolder; -function getValidateOptions() { - return { - "type": "object", - "properties": { - "framework": { - "type": ["string"] - }, - "toolkit": { - "type": ["string"] - }, - "port": { - "type": ["integer"] - }, - "emit": { - "type": ["boolean"] - }, - "browser": { - "type": ["boolean"] - }, - "watch": { - "type": ["string"] - }, - "profile": { - "type": ["string"] - }, - "environment": { - "type": ["string"] - }, - "verbose": { - "type": ["string"] - }, - "theme": { - "type": ["string"] - }, - "treeshake": { - "type": ["boolean"] - }, - "script": { - "type": ["string"] - }, - "packages": { - "type": ["string", "array"] - } - }, - "additionalProperties": false - }; -} - -function getDefaultOptions() { - return { - port: 1962, - emit: true, - browser: true, - watch: 'yes', - profile: '', - treeshake: false, - script: null, - environment: 'development', - verbose: 'no', - toolkit: 'modern', - packages: null - }; -} - -function getDefaultVars() { +function _getDefaultVars() { return { + touchFile: '/src/themer.js', watchStarted: false, + buildstep: '1 of 1', firstTime: true, firstCompile: true, browserCount: 0, manifest: null, - extPath: 'ext-angular', + extPath: 'ext', pluginErrors: [], deps: [], usedExtComponents: [], @@ -91,73 +27,13 @@ function getDefaultVars() { }; } -function toXtype(str) { - return str.toLowerCase().replace(/_/g, '-'); -} - -function extractFromSource(module, options, compilation, extComponents) { - try { - var js = module._source._value; - - const logv = require('./pluginUtil').logv; //logv(options,'HOOK succeedModule, FUNCTION extractFromSource: ' + module.resource) - - - var statements = []; - - var generate = require("@babel/generator").default; - - var parse = require("babylon").parse; - - var traverse = require("ast-traverse"); - - var ast = parse(js, { - plugins: ['typescript', 'flow', 'doExpressions', 'objectRestSpread', 'classProperties', 'exportDefaultFrom', 'exportExtensions', 'asyncGenerators', 'functionBind', 'functionSent', 'dynamicImport'], - sourceType: 'module' - }); - traverse(ast, { - pre: function (node) { - if (node.type === 'CallExpression' && node.callee && node.callee.object && node.callee.object.name === 'Ext') { - statements.push(generate(node).code); - } - - if (node.type === 'StringLiteral') { - let code = node.value; - - for (var i = 0; i < code.length; ++i) { - if (code.charAt(i) == '<') { - if (code.substr(i, 4) == '') + 3; - } else if (code.charAt(i + 1) !== '/') { - var start = code.substring(i); - var spaceEnd = start.indexOf(' '); - var newlineEnd = start.indexOf('\n'); - var tagEnd = start.indexOf('>'); - var end = Math.min(spaceEnd, newlineEnd, tagEnd); - - if (end >= 0) { - var xtype = toXtype(start.substring(1, end)); - - if (extComponents.includes(xtype)) { - var theValue = node.value.toLowerCase(); +function _extractFromSource(module, options, compilation, extComponents) { + const logv = require('./pluginUtil').logv; - if (theValue.indexOf('doctype html') == -1) { - var type = { - xtype: xtype - }; - let config = JSON.stringify(type); - statements.push(`Ext.create(${config})`); - } - } + logv(options.verbose, 'FUNCTION _extractFromSource (empty)'); - i += end; - } - } - } - } - } - } - }); + try { + var statements = ['Ext.require("Ext.*")']; return statements; } catch (e) { console.log(e); @@ -166,117 +42,31 @@ function extractFromSource(module, options, compilation, extComponents) { } } -function changeIt(o) { - const path = require('path'); - - const fsx = require('fs-extra'); - - const wherePath = path.resolve(process.cwd(), o.where); - var js = fsx.readFileSync(wherePath).toString(); - var newJs = js.replace(o.from, o.to); - fsx.writeFileSync(wherePath, newJs, 'utf-8', () => { - return; - }); -} - function _toProd(vars, options) { - const log = require('./pluginUtil').log; - const logv = require('./pluginUtil').logv; - logv(options, 'FUNCTION _toProd'); - - try { - const fsx = require('fs-extra'); - - const fs = require('fs'); - - const mkdirp = require('mkdirp'); - - const path = require('path'); - - const pathExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`); + logv(options.verbose, 'FUNCTION _toProd (empty'); - if (!fs.existsSync(pathExtAngularProd)) { - mkdirp.sync(pathExtAngularProd); - - const t = require('./artifacts').extAngularModule('', '', ''); - - fsx.writeFileSync(`${pathExtAngularProd}/ext-angular.module.ts`, t, 'utf-8', () => { - return; - }); - } - - var o = {}; - o.where = 'src/app/app.module.ts'; - o.from = `import { ExtAngularModule } from '@sencha/ext-angular'`; - o.to = `import { ExtAngularModule } from './ext-angular-prod/ext-angular.module'`; - changeIt(o); - o = {}; - o.where = 'src/main.ts'; - o.from = `bootstrapModule( AppModule );`; - o.to = `enableProdMode();bootstrapModule(AppModule);`; - changeIt(o); - } catch (e) { + try {} catch (e) { console.log(e); return []; } } function _toDev(vars, options) { - const log = require('./pluginUtil').log; - - const logv = require('./pluginUtil').logv; - - logv(options, 'FUNCTION _toProd'); - - try { - const path = require('path'); - - const pathExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`); - - require('rimraf').sync(pathExtAngularProd); - - var o = {}; - o.where = 'src/app/app.module.ts'; - o.from = `import { ExtAngularModule } from './ext-angular-prod/ext-angular.module'`; - o.to = `import { ExtAngularModule } from '@sencha/ext-angular'`; - changeIt(o); - o = {}; - o.where = 'src/main.ts'; - o.from = `enableProdMode();bootstrapModule(AppModule);`; - o.to = `bootstrapModule( AppModule );`; - changeIt(o); - } catch (e) { + try {} catch (e) { console.log(e); return []; } } function _getAllComponents(vars, options) { - const log = require('./pluginUtil').log; - const logv = require('./pluginUtil').logv; - logv(options, 'FUNCTION _getAllComponents'); + logv(options.verbose, 'FUNCTION _getAllComponents (empty)'); try { - const path = require('path'); - - const fsx = require('fs-extra'); - var extComponents = []; - const packageLibPath = path.resolve(process.cwd(), 'node_modules/@sencha/ext-angular/src/lib'); - var files = fsx.readdirSync(packageLibPath); - files.forEach(fileName => { - if (fileName && fileName.substr(0, 4) == 'ext-') { - var end = fileName.substr(4).indexOf('.component'); - - if (end >= 0) { - extComponents.push(fileName.substring(4, end + 4)); - } - } - }); return extComponents; } catch (e) { console.log(e); @@ -285,64 +75,12 @@ function _getAllComponents(vars, options) { } function _writeFilesToProdFolder(vars, options) { - const log = require('./pluginUtil').log; - const logv = require('./pluginUtil').logv; - logv(options, 'FUNCTION _writeFilesToProdFolder'); - - try { - const path = require('path'); + logv(options.verbose, 'FUNCTION _writeFilesToProdFolder (empty)'); - const fsx = require('fs-extra'); - - const packageLibPath = path.resolve(process.cwd(), 'node_modules/@sencha/ext-angular/src/lib'); - const pathToExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`); - const string = 'Ext.create({\"xtype\":\"'; - vars.deps.forEach(code => { - var index = code.indexOf(string); - - if (index >= 0) { - code = code.substring(index + string.length); - var end = code.indexOf('\"'); - vars.usedExtComponents.push(code.substr(0, end)); - } - }); - vars.usedExtComponents = [...new Set(vars.usedExtComponents)]; - var writeToPathWritten = false; - var moduleVars = { - imports: '', - exports: '', - declarations: '' - }; - vars.usedExtComponents.forEach(xtype => { - var capclassname = xtype.charAt(0).toUpperCase() + xtype.replace(/-/g, "_").slice(1); - moduleVars.imports = moduleVars.imports + `import { Ext${capclassname}Component } from './ext-${xtype}.component';\n`; - moduleVars.exports = moduleVars.exports + ` Ext${capclassname}Component,\n`; - moduleVars.declarations = moduleVars.declarations + ` Ext${capclassname}Component,\n`; - var classFile = `ext-${xtype}.component.ts`; - const contents = fsx.readFileSync(`${packageLibPath}/${classFile}`).toString(); - fsx.writeFileSync(`${pathToExtAngularProd}/${classFile}`, contents, 'utf-8', () => { - return; - }); - writeToPathWritten = true; - }); - - if (writeToPathWritten) { - var t = require('./artifacts').extAngularModule(moduleVars.imports, moduleVars.exports, moduleVars.declarations); - - fsx.writeFileSync(`${pathToExtAngularProd}/ext-angular.module.ts`, t, 'utf-8', () => { - return; - }); - } - - const baseContent = fsx.readFileSync(`${packageLibPath}/base.ts`).toString(); - fsx.writeFileSync(`${pathToExtAngularProd}/base.ts`, baseContent, 'utf-8', () => { - return; - }); - } catch (e) { + try {} catch (e) { console.log(e); - return []; } } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnRzVXRpbC5qcyJdLCJuYW1lcyI6WyJnZXRWYWxpZGF0ZU9wdGlvbnMiLCJnZXREZWZhdWx0T3B0aW9ucyIsInBvcnQiLCJlbWl0IiwiYnJvd3NlciIsIndhdGNoIiwicHJvZmlsZSIsInRyZWVzaGFrZSIsInNjcmlwdCIsImVudmlyb25tZW50IiwidmVyYm9zZSIsInRvb2xraXQiLCJwYWNrYWdlcyIsImdldERlZmF1bHRWYXJzIiwid2F0Y2hTdGFydGVkIiwiZmlyc3RUaW1lIiwiZmlyc3RDb21waWxlIiwiYnJvd3NlckNvdW50IiwibWFuaWZlc3QiLCJleHRQYXRoIiwicGx1Z2luRXJyb3JzIiwiZGVwcyIsInVzZWRFeHRDb21wb25lbnRzIiwicmVidWlsZCIsInRvWHR5cGUiLCJzdHIiLCJ0b0xvd2VyQ2FzZSIsInJlcGxhY2UiLCJleHRyYWN0RnJvbVNvdXJjZSIsIm1vZHVsZSIsIm9wdGlvbnMiLCJjb21waWxhdGlvbiIsImV4dENvbXBvbmVudHMiLCJqcyIsIl9zb3VyY2UiLCJfdmFsdWUiLCJsb2d2IiwicmVxdWlyZSIsInN0YXRlbWVudHMiLCJnZW5lcmF0ZSIsImRlZmF1bHQiLCJwYXJzZSIsInRyYXZlcnNlIiwiYXN0IiwicGx1Z2lucyIsInNvdXJjZVR5cGUiLCJwcmUiLCJub2RlIiwidHlwZSIsImNhbGxlZSIsIm9iamVjdCIsIm5hbWUiLCJwdXNoIiwiY29kZSIsInZhbHVlIiwiaSIsImxlbmd0aCIsImNoYXJBdCIsInN1YnN0ciIsImluZGV4T2YiLCJzdGFydCIsInN1YnN0cmluZyIsInNwYWNlRW5kIiwibmV3bGluZUVuZCIsInRhZ0VuZCIsImVuZCIsIk1hdGgiLCJtaW4iLCJ4dHlwZSIsImluY2x1ZGVzIiwidGhlVmFsdWUiLCJjb25maWciLCJKU09OIiwic3RyaW5naWZ5IiwiZSIsImNvbnNvbGUiLCJsb2ciLCJlcnJvcnMiLCJjaGFuZ2VJdCIsIm8iLCJwYXRoIiwiZnN4Iiwid2hlcmVQYXRoIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJjd2QiLCJ3aGVyZSIsInJlYWRGaWxlU3luYyIsInRvU3RyaW5nIiwibmV3SnMiLCJmcm9tIiwidG8iLCJ3cml0ZUZpbGVTeW5jIiwiX3RvUHJvZCIsInZhcnMiLCJmcyIsIm1rZGlycCIsInBhdGhFeHRBbmd1bGFyUHJvZCIsImV4aXN0c1N5bmMiLCJzeW5jIiwidCIsImV4dEFuZ3VsYXJNb2R1bGUiLCJfdG9EZXYiLCJfZ2V0QWxsQ29tcG9uZW50cyIsInBhY2thZ2VMaWJQYXRoIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImZvckVhY2giLCJmaWxlTmFtZSIsIl93cml0ZUZpbGVzVG9Qcm9kRm9sZGVyIiwicGF0aFRvRXh0QW5ndWxhclByb2QiLCJzdHJpbmciLCJpbmRleCIsIlNldCIsIndyaXRlVG9QYXRoV3JpdHRlbiIsIm1vZHVsZVZhcnMiLCJpbXBvcnRzIiwiZXhwb3J0cyIsImRlY2xhcmF0aW9ucyIsImNhcGNsYXNzbmFtZSIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJjbGFzc0ZpbGUiLCJjb250ZW50cyIsImJhc2VDb250ZW50Il0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxrQkFBVCxHQUE4QjtBQUNuQyxTQUFPO0FBQ0wsWUFBUSxRQURIO0FBRUwsa0JBQWM7QUFDWixtQkFBZTtBQUFDLGdCQUFRLENBQUUsUUFBRjtBQUFULE9BREg7QUFFWixpQkFBZTtBQUFDLGdCQUFRLENBQUUsUUFBRjtBQUFULE9BRkg7QUFHWixjQUFlO0FBQUMsZ0JBQVEsQ0FBRSxTQUFGO0FBQVQsT0FISDtBQUlaLGNBQWU7QUFBQyxnQkFBUSxDQUFFLFNBQUY7QUFBVCxPQUpIO0FBS1osaUJBQWU7QUFBQyxnQkFBUSxDQUFFLFNBQUY7QUFBVCxPQUxIO0FBTVosZUFBZTtBQUFDLGdCQUFRLENBQUUsUUFBRjtBQUFULE9BTkg7QUFPWixpQkFBZTtBQUFDLGdCQUFRLENBQUUsUUFBRjtBQUFULE9BUEg7QUFRWixxQkFBZTtBQUFDLGdCQUFRLENBQUUs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LGFBQUQsQ0FBUCxDQUF1QmdFLGdCQUF2QixDQUNOYyxVQUFVLENBQUNDLE9BREwsRUFDY0QsVUFBVSxDQUFDRSxPQUR6QixFQUNrQ0YsVUFBVSxDQUFDRyxZQUQ3QyxDQUFSOztBQUdBckMsTUFBQUEsR0FBRyxDQUFDVyxhQUFKLENBQW1CLEdBQUVrQixvQkFBcUIsd0JBQTFDLEVBQW1FVixDQUFuRSxFQUFzRSxPQUF0RSxFQUErRSxNQUFJO0FBQUM7QUFBTyxPQUEzRjtBQUNEOztBQUVELFVBQU13QixXQUFXLEdBQUczQyxHQUFHLENBQUNNLFlBQUosQ0FBa0IsR0FBRWlCLGNBQWUsVUFBbkMsRUFBOENoQixRQUE5QyxFQUFwQjtBQUNBUCxJQUFBQSxHQUFHLENBQUNXLGFBQUosQ0FBbUIsR0FBRWtCLG9CQUFxQixVQUExQyxFQUFxRGMsV0FBckQsRUFBa0UsT0FBbEUsRUFBMkUsTUFBSTtBQUFDO0FBQU8sS0FBdkY7QUFFRCxHQTVDRCxDQTZDQSxPQUFPbEQsQ0FBUCxFQUFVO0FBQ1JDLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZRixDQUFaO0FBQ0EsV0FBTyxFQUFQO0FBQ0Q7QUFDRiIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0ZU9wdGlvbnMoKSB7XG4gIHJldHVybiB7XG4gICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXG4gICAgXCJwcm9wZXJ0aWVzXCI6IHtcbiAgICAgIFwiZnJhbWV3b3JrXCI6ICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcInRvb2xraXRcIjogICAgIHtcInR5cGVcIjogWyBcInN0cmluZ1wiIF19LFxuICAgICAgXCJwb3J0XCI6ICAgICAgICB7XCJ0eXBlXCI6IFsgXCJpbnRlZ2VyXCIgXX0sXG4gICAgICBcImVtaXRcIjogICAgICAgIHtcInR5cGVcIjogWyBcImJvb2xlYW5cIiBdfSxcbiAgICAgIFwiYnJvd3NlclwiOiAgICAge1widHlwZVwiOiBbIFwiYm9vbGVhblwiIF19LFxuICAgICAgXCJ3YXRjaFwiOiAgICAgICB7XCJ0eXBlXCI6IFsgXCJzdHJpbmdcIiBdfSxcbiAgICAgIFwicHJvZmlsZVwiOiAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcImVudmlyb25tZW50XCI6IHtcInR5cGVcIjogWyBcInN0cmluZ1wiIF19LFxuICAgICAgXCJ2ZXJib3NlXCI6ICAgICB7XCJ0eXBlXCI6IFsgXCJzdHJpbmdcIiBdfSxcbiAgICAgIFwidGhlbWVcIjogICAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcInRyZWVzaGFrZVwiOiAgIHtcInR5cGVcIjogWyBcImJvb2xlYW5cIiBdfSxcbiAgICAgIFwic2NyaXB0XCI6ICAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcInBhY2thZ2VzXCI6ICAgIHtcInR5cGVcIjogWyBcInN0cmluZ1wiLCBcImFycmF5XCIgXX1cbiAgICB9LFxuICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnMoKSB7XG4gIHJldHVybiB7XG4gICAgcG9ydDogMTk2MixcbiAgICBlbWl0OiB0cnVlLFxuICAgIGJyb3dzZXI6IHRydWUsXG4gICAgd2F0Y2g6ICd5ZXMnLFxuICAgIHByb2ZpbGU6ICcnLCBcbiAgICB0cmVlc2hha2U6IGZhbHNlLFxuICAgIHNjcmlwdDogbnVsbCxcbiAgICBlbnZpcm9ubWVudDogJ2RldmVsb3BtZW50JywgXG4gICAgdmVyYm9zZTogJ25vJyxcbiAgICB0b29sa2l0OiAnbW9kZXJuJyxcbiAgICBwYWNrYWdlczogbnVsbFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0VmFycygpIHtcbiAgcmV0dXJuIHtcbiAgICB3YXRjaFN0YXJ0ZWQgOiBmYWxzZSxcbiAgICBmaXJzdFRpbWUgOiB0cnVlLFxuICAgIGZpcnN0Q29tcGlsZTogdHJ1ZSxcbiAgICBicm93c2VyQ291bnQgOiAwLFxuICAgIG1hbmlmZXN0OiBudWxsLFxuICAgIGV4dFBhdGg6ICdleHQtYW5ndWxhcicsXG4gICAgcGx1Z2luRXJyb3JzOiBbXSxcbiAgICBkZXBzOiBbXSxcbiAgICB1c2VkRXh0Q29tcG9uZW50czogW10sXG4gICAgcmVidWlsZDogdHJ1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIHRvWHR5cGUoc3RyKSB7XG4gIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csICctJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RGcm9tU291cmNlKG1vZHVsZSwgb3B0aW9ucywgY29tcGlsYXRpb24sIGV4dENvbXBvbmVudHMpIHtcbiAgdHJ5IHtcbiAgICB2YXIganMgPSBtb2R1bGUuX3NvdXJjZS5fdmFsdWVcbiAgICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICAgIC8vbG9ndihvcHRpb25zLCdIT09LIHN1Y2NlZWRNb2R1bGUsIEZVTkNUSU9OIGV4dHJhY3RGcm9tU291cmNlOiAnICsgbW9kdWxlLnJlc291cmNlKVxuXG4gICAgdmFyIHN0YXRlbWVudHMgPSBbXVxuXG4gICAgdmFyIGdlbmVyYXRlID0gcmVxdWlyZShcIkBiYWJlbC9nZW5lcmF0b3JcIikuZGVmYXVsdFxuICAgIHZhciBwYXJzZSA9IHJlcXVpcmUoXCJiYWJ5bG9uXCIpLnBhcnNlXG4gICAgdmFyIHRyYXZlcnNlID0gcmVxdWlyZShcImFzdC10cmF2ZXJzZVwiKVxuXG4gICAgdmFyIGFzdCA9IHBhcnNlKGpzLCB7XG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgICd0eXBlc2NyaXB0JyxcbiAgICAgICAgJ2Zsb3cnLFxuICAgICAgICAnZG9FeHByZXNzaW9ucycsXG4gICAgICAgICdvYmplY3RSZXN0U3ByZWFkJyxcbiAgICAgICAgJ2NsYXNzUHJvcGVydGllcycsXG4gICAgICAgICdleHBvcnREZWZhdWx0RnJvbScsXG4gICAgICAgICdleHBvcnRFeHRlbnNpb25zJyxcbiAgICAgICAgJ2FzeW5jR2VuZXJhdG9ycycsXG4gICAgICAgICdmdW5jdGlvbkJpbmQnLFxuICAgICAgICAnZnVuY3Rpb25TZW50JyxcbiAgICAgICAgJ2R5bmFtaWNJbXBvcnQnXG4gICAgICBdLFxuICAgICAgc291cmNlVHlwZTogJ21vZHVsZSdcbiAgICB9KVxuXG4gICAgdHJhdmVyc2UoYXN0LCB7XG4gICAgICBwcmU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdDYWxsRXhwcmVzc2lvbicgJiYgbm9kZS5jYWxsZWUgJiYgbm9kZS5jYWxsZWUub2JqZWN0ICYmIG5vZGUuY2FsbGVlLm9iamVjdC5uYW1lID09PSAnRXh0Jykge1xuICAgICAgICAgIHN0YXRlbWVudHMucHVzaChnZW5lcmF0ZShub2RlKS5jb2RlKVxuICAgICAgICB9XG4gICAgICAgIGlmKG5vZGUudHlwZSA9PT0gJ1N0cmluZ0xpdGVyYWwnKSB7XG4gICAgICAgICAgbGV0IGNvZGUgPSBub2RlLnZhbHVlXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoY29kZS5jaGFyQXQoaSkgPT0gJzwnKSB7XG4gICAgICAgICAgICAgIGlmIChjb2RlLnN1YnN0cihpLCA0KSA9PSAnPCEtLScpIHtcbiAgICAgICAgICAgICAgICBpICs9IDRcbiAgICAgICAgICAgICAgICBpICs9IGNvZGUuc3Vic3RyKGkpLmluZGV4T2YoJy0tPicpICsgM1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUuY2hhckF0KGkrMSkgIT09ICcvJykge1xuICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IGNvZGUuc3Vic3RyaW5nKGkpXG4gICAgICAgICAgICAgICAgdmFyIHNwYWNlRW5kID0gc3RhcnQuaW5kZXhPZignICcpXG4gICAgICAgICAgICAgICAgdmFyIG5ld2xpbmVFbmQgPSBzdGFydC5pbmRleE9mKCdcXG4nKVxuICAgICAgICAgICAgICAgIHZhciB0YWdFbmQgPSBzdGFydC5pbmRleE9mKCc+JylcbiAgICAgICAgICAgICAgICB2YXIgZW5kID0gTWF0aC5taW4oc3BhY2VFbmQsIG5ld2xpbmVFbmQsIHRhZ0VuZClcbiAgICAgICAgICAgICAgICBpZiAoZW5kID49IDApIHtcbiAgICAgICAgICAgICAgICAgIHZhciB4dHlwZSA9IHRvWHR5cGUoc3RhcnQuc3Vic3RyaW5nKDEsIGVuZCkpXG4gICAgICAgICAgICAgICAgICBpZihleHRDb21wb25lbnRzLmluY2x1ZGVzKHh0eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGhlVmFsdWUgPSBub2RlLnZhbHVlLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoZVZhbHVlLmluZGV4T2YoJ2RvY3R5cGUgaHRtbCcpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSB7eHR5cGU6IHh0eXBlfVxuICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25maWcgPSBKU09OLnN0cmluZ2lmeSh0eXBlKVxuICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudHMucHVzaChgRXh0LmNyZWF0ZSgke2NvbmZpZ30pYClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaSArPSBlbmRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHN0YXRlbWVudHNcbiAgfVxuICBjYXRjaChlKSB7XG4gICAgY29uc29sZS5sb2coZSlcbiAgICBjb21waWxhdGlvbi5lcnJvcnMucHVzaCgnZXh0cmFjdEZyb21Tb3VyY2U6ICcgKyBlKVxuICAgIHJldHVybiBbXVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoYW5nZUl0KG8pIHtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuICBjb25zdCBmc3ggPSByZXF1aXJlKCdmcy1leHRyYScpXG4gIGNvbnN0IHdoZXJlUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBvLndoZXJlKVxuICB2YXIganMgPSBmc3gucmVhZEZpbGVTeW5jKHdoZXJlUGF0aCkudG9TdHJpbmcoKVxuICB2YXIgbmV3SnMgPSBqcy5yZXBsYWNlKG8uZnJvbSxvLnRvKTtcbiAgZnN4LndyaXRlRmlsZVN5bmMod2hlcmVQYXRoLCBuZXdKcywgJ3V0Zi04JywgKCk9PntyZXR1cm59KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX3RvUHJvZCh2YXJzLCBvcHRpb25zKSB7XG4gIGNvbnN0IGxvZyA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KG9wdGlvbnMsJ0ZVTkNUSU9OIF90b1Byb2QnKVxuICB0cnkge1xuICAgIGNvbnN0IGZzeCA9IHJlcXVpcmUoJ2ZzLWV4dHJhJylcbiAgICBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJylcbiAgICBjb25zdCBta2RpcnAgPSByZXF1aXJlKCdta2RpcnAnKVxuICAgIGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcblxuICAgIGNvbnN0IHBhdGhFeHRBbmd1bGFyUHJvZCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBgc3JjL2FwcC9leHQtYW5ndWxhci1wcm9kYCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGhFeHRBbmd1bGFyUHJvZCkpIHtcbiAgICAgIG1rZGlycC5zeW5jKHBhdGhFeHRBbmd1bGFyUHJvZClcbiAgICAgIGNvbnN0IHQgPSByZXF1aXJlKCcuL2FydGlmYWN0cycpLmV4dEFuZ3VsYXJNb2R1bGUoJycsICcnLCAnJylcbiAgICAgIGZzeC53cml0ZUZpbGVTeW5jKGAke3BhdGhFeHRBbmd1bGFyUHJvZH0vZXh0LWFuZ3VsYXIubW9kdWxlLnRzYCwgdCwgJ3V0Zi04JywgKCkgPT4ge1xuICAgICAgICByZXR1cm5cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdmFyIG8gPSB7fVxuICAgIG8ud2hlcmUgPSAnc3JjL2FwcC9hcHAubW9kdWxlLnRzJ1xuICAgIG8uZnJvbSA9IGBpbXBvcnQgeyBFeHRBbmd1bGFyTW9kdWxlIH0gZnJvbSAnQHNlbmNoYS9leHQtYW5ndWxhcidgXG4gICAgby50byA9IGBpbXBvcnQgeyBFeHRBbmd1bGFyTW9kdWxlIH0gZnJvbSAnLi9leHQtYW5ndWxhci1wcm9kL2V4dC1hbmd1bGFyLm1vZHVsZSdgXG4gICAgY2hhbmdlSXQobylcblxuICAgIG8gPSB7fVxuICAgIG8ud2hlcmUgPSAnc3JjL21haW4udHMnXG4gICAgby5mcm9tID0gYGJvb3RzdHJhcE1vZHVsZSggQXBwTW9kdWxlICk7YFxuICAgIG8udG8gPSBgZW5hYmxlUHJvZE1vZGUoKTtib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlKTtgXG4gICAgY2hhbmdlSXQobylcbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF90b0Rldih2YXJzLCBvcHRpb25zKSB7XG4gIGNvbnN0IGxvZyA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KG9wdGlvbnMsJ0ZVTkNUSU9OIF90b1Byb2QnKVxuICB0cnkge1xuICAgIGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbiAgICBjb25zdCBwYXRoRXh0QW5ndWxhclByb2QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgYHNyYy9hcHAvZXh0LWFuZ3VsYXItcHJvZGApO1xuICAgIHJlcXVpcmUoJ3JpbXJhZicpLnN5bmMocGF0aEV4dEFuZ3VsYXJQcm9kKTtcblxuICAgIHZhciBvID0ge31cbiAgICBvLndoZXJlID0gJ3NyYy9hcHAvYXBwLm1vZHVsZS50cydcbiAgICBvLmZyb20gPSBgaW1wb3J0IHsgRXh0QW5ndWxhck1vZHVsZSB9IGZyb20gJy4vZXh0LWFuZ3VsYXItcHJvZC9leHQtYW5ndWxhci5tb2R1bGUnYFxuICAgIG8udG8gPSBgaW1wb3J0IHsgRXh0QW5ndWxhck1vZHVsZSB9IGZyb20gJ0BzZW5jaGEvZXh0LWFuZ3VsYXInYFxuICAgIGNoYW5nZUl0KG8pXG5cbiAgICBvID0ge31cbiAgICBvLndoZXJlID0gJ3NyYy9tYWluLnRzJ1xuICAgIG8uZnJvbSA9IGBlbmFibGVQcm9kTW9kZSgpO2Jvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO2BcbiAgICBvLnRvID0gYGJvb3RzdHJhcE1vZHVsZSggQXBwTW9kdWxlICk7YFxuICAgIGNoYW5nZUl0KG8pXG4gIH1cbiAgY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKVxuICAgIHJldHVybiBbXVxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRBbGxDb21wb25lbnRzKHZhcnMsIG9wdGlvbnMpIHtcbiAgY29uc3QgbG9nID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9nXG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucywnRlVOQ1RJT04gX2dldEFsbENvbXBvbmVudHMnKVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuICAgIGNvbnN0IGZzeCA9IHJlcXVpcmUoJ2ZzLWV4dHJhJylcblxuICAgIHZhciBleHRDb21wb25lbnRzID0gW11cbiAgICBjb25zdCBwYWNrYWdlTGliUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LWFuZ3VsYXIvc3JjL2xpYicpXG4gICAgdmFyIGZpbGVzID0gZnN4LnJlYWRkaXJTeW5jKHBhY2thZ2VMaWJQYXRoKVxuICAgIGZpbGVzLmZvckVhY2goKGZpbGVOYW1lKSA9PiB7XG4gICAgICBpZiAoZmlsZU5hbWUgJiYgZmlsZU5hbWUuc3Vic3RyKDAsIDQpID09ICdleHQtJykge1xuICAgICAgICB2YXIgZW5kID0gZmlsZU5hbWUuc3Vic3RyKDQpLmluZGV4T2YoJy5jb21wb25lbnQnKVxuICAgICAgICBpZiAoZW5kID49IDApIHtcbiAgICAgICAgICBleHRDb21wb25lbnRzLnB1c2goZmlsZU5hbWUuc3Vic3RyaW5nKDQsIGVuZCArIDQpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZXh0Q29tcG9uZW50c1xuXG4gIH1cbiAgY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKVxuICAgIHJldHVybiBbXVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfd3JpdGVGaWxlc1RvUHJvZEZvbGRlcih2YXJzLCBvcHRpb25zKSB7XG4gIGNvbnN0IGxvZyA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KG9wdGlvbnMsJ0ZVTkNUSU9OIF93cml0ZUZpbGVzVG9Qcm9kRm9sZGVyJylcblxuICB0cnkge1xuICAgIGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbiAgICBjb25zdCBmc3ggPSByZXF1aXJlKCdmcy1leHRyYScpXG5cbiAgICBjb25zdCBwYWNrYWdlTGliUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LWFuZ3VsYXIvc3JjL2xpYicpXG4gICAgY29uc3QgcGF0aFRvRXh0QW5ndWxhclByb2QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgYHNyYy9hcHAvZXh0LWFuZ3VsYXItcHJvZGApXG4gICAgY29uc3Qgc3RyaW5nID0gJ0V4dC5jcmVhdGUoe1xcXCJ4dHlwZVxcXCI6XFxcIidcblxuICAgIHZhcnMuZGVwcy5mb3JFYWNoKGNvZGUgPT4ge1xuICAgICAgdmFyIGluZGV4ID0gY29kZS5pbmRleE9mKHN0cmluZylcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIGNvZGUgPSBjb2RlLnN1YnN0cmluZyhpbmRleCArIHN0cmluZy5sZW5ndGgpXG4gICAgICAgIHZhciBlbmQgPSBjb2RlLmluZGV4T2YoJ1xcXCInKVxuICAgICAgICB2YXJzLnVzZWRFeHRDb21wb25lbnRzLnB1c2goY29kZS5zdWJzdHIoMCwgZW5kKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHZhcnMudXNlZEV4dENvbXBvbmVudHMgPSBbLi4ubmV3IFNldCh2YXJzLnVzZWRFeHRDb21wb25lbnRzKV1cblxuICAgIHZhciB3cml0ZVRvUGF0aFdyaXR0ZW4gPSBmYWxzZVxuICAgIHZhciBtb2R1bGVWYXJzID0ge1xuICAgICAgaW1wb3J0czogJycsXG4gICAgICBleHBvcnRzOiAnJyxcbiAgICAgIGRlY2xhcmF0aW9uczogJydcbiAgICB9XG4gICAgdmFycy51c2VkRXh0Q29tcG9uZW50cy5mb3JFYWNoKHh0eXBlID0+IHtcbiAgICAgIHZhciBjYXBjbGFzc25hbWUgPSB4dHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHh0eXBlLnJlcGxhY2UoLy0vZywgXCJfXCIpLnNsaWNlKDEpXG4gICAgICBtb2R1bGVWYXJzLmltcG9ydHMgPSBtb2R1bGVWYXJzLmltcG9ydHMgKyBgaW1wb3J0IHsgRXh0JHtjYXBjbGFzc25hbWV9Q29tcG9uZW50IH0gZnJvbSAnLi9leHQtJHt4dHlwZX0uY29tcG9uZW50JztcXG5gXG4gICAgICBtb2R1bGVWYXJzLmV4cG9ydHMgPSBtb2R1bGVWYXJzLmV4cG9ydHMgKyBgICAgIEV4dCR7Y2FwY2xhc3NuYW1lfUNvbXBvbmVudCxcXG5gXG4gICAgICBtb2R1bGVWYXJzLmRlY2xhcmF0aW9ucyA9IG1vZHVsZVZhcnMuZGVjbGFyYXRpb25zICsgYCAgICBFeHQke2NhcGNsYXNzbmFtZX1Db21wb25lbnQsXFxuYFxuICAgICAgdmFyIGNsYXNzRmlsZSA9IGBleHQtJHt4dHlwZX0uY29tcG9uZW50LnRzYFxuICAgICAgY29uc3QgY29udGVudHMgPSBmc3gucmVhZEZpbGVTeW5jKGAke3BhY2thZ2VMaWJQYXRofS8ke2NsYXNzRmlsZX1gKS50b1N0cmluZygpXG4gICAgICBmc3gud3JpdGVGaWxlU3luYyhgJHtwYXRoVG9FeHRBbmd1bGFyUHJvZH0vJHtjbGFzc0ZpbGV9YCwgY29udGVudHMsICd1dGYtOCcsICgpPT57cmV0dXJufSlcbiAgICAgIHdyaXRlVG9QYXRoV3JpdHRlbiA9IHRydWVcbiAgICB9KVxuICAgIGlmICh3cml0ZVRvUGF0aFdyaXR0ZW4pIHtcbiAgICAgIHZhciB0ID0gcmVxdWlyZSgnLi9hcnRpZmFjdHMnKS5leHRBbmd1bGFyTW9kdWxlKFxuICAgICAgICBtb2R1bGVWYXJzLmltcG9ydHMsIG1vZHVsZVZhcnMuZXhwb3J0cywgbW9kdWxlVmFycy5kZWNsYXJhdGlvbnNcbiAgICAgIClcbiAgICAgIGZzeC53cml0ZUZpbGVTeW5jKGAke3BhdGhUb0V4dEFuZ3VsYXJQcm9kfS9leHQtYW5ndWxhci5tb2R1bGUudHNgLCB0LCAndXRmLTgnLCAoKT0+e3JldHVybn0pXG4gICAgfVxuXG4gICAgY29uc3QgYmFzZUNvbnRlbnQgPSBmc3gucmVhZEZpbGVTeW5jKGAke3BhY2thZ2VMaWJQYXRofS9iYXNlLnRzYCkudG9TdHJpbmcoKVxuICAgIGZzeC53cml0ZUZpbGVTeW5jKGAke3BhdGhUb0V4dEFuZ3VsYXJQcm9kfS9iYXNlLnRzYCwgYmFzZUNvbnRlbnQsICd1dGYtOCcsICgpPT57cmV0dXJufSlcblxuICB9XG4gIGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coZSlcbiAgICByZXR1cm4gW11cbiAgfVxufSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnRzVXRpbC5qcyJdLCJuYW1lcyI6WyJfZ2V0RGVmYXVsdFZhcnMiLCJ0b3VjaEZpbGUiLCJ3YXRjaFN0YXJ0ZWQiLCJidWlsZHN0ZXAiLCJmaXJzdFRpbWUiLCJmaXJzdENvbXBpbGUiLCJicm93c2VyQ291bnQiLCJtYW5pZmVzdCIsImV4dFBhdGgiLCJwbHVnaW5FcnJvcnMiLCJkZXBzIiwidXNlZEV4dENvbXBvbmVudHMiLCJyZWJ1aWxkIiwiX2V4dHJhY3RGcm9tU291cmNlIiwibW9kdWxlIiwib3B0aW9ucyIsImNvbXBpbGF0aW9uIiwiZXh0Q29tcG9uZW50cyIsImxvZ3YiLCJyZXF1aXJlIiwidmVyYm9zZSIsInN0YXRlbWVudHMiLCJlIiwiY29uc29sZSIsImxvZyIsImVycm9ycyIsInB1c2giLCJfdG9Qcm9kIiwidmFycyIsIl90b0RldiIsIl9nZXRBbGxDb21wb25lbnRzIiwiX3dyaXRlRmlsZXNUb1Byb2RGb2xkZXIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxlQUFULEdBQTJCO0FBQ2hDLFNBQU87QUFDTEMsSUFBQUEsU0FBUyxFQUFFLGdCQUROO0FBRUxDLElBQUFBLFlBQVksRUFBRyxLQUZWO0FBR0xDLElBQUFBLFNBQVMsRUFBRSxRQUhOO0FBSUxDLElBQUFBLFNBQVMsRUFBRyxJQUpQO0FBS0xDLElBQUFBLFlBQVksRUFBRSxJQUxUO0FBTUxDLElBQUFBLFlBQVksRUFBRyxDQU5WO0FBT0xDLElBQUFBLFFBQVEsRUFBRSxJQVBMO0FBUUxDLElBQUFBLE9BQU8sRUFBRSxLQVJKO0FBU0xDLElBQUFBLFlBQVksRUFBRSxFQVRUO0FBVUxDLElBQUFBLElBQUksRUFBRSxFQVZEO0FBV0xDLElBQUFBLGlCQUFpQixFQUFFLEVBWGQ7QUFZTEMsSUFBQUEsT0FBTyxFQUFFO0FBWkosR0FBUDtBQWNEOztBQUVNLFNBQVNDLGtCQUFULENBQTRCQyxNQUE1QixFQUFvQ0MsT0FBcEMsRUFBNkNDLFdBQTdDLEVBQTBEQyxhQUExRCxFQUF5RTtBQUM5RSxRQUFNQyxJQUFJLEdBQUdDLE9BQU8sQ0FBQyxjQUFELENBQVAsQ0FBd0JELElBQXJDOztBQUNBQSxFQUFBQSxJQUFJLENBQUNILE9BQU8sQ0FBQ0ssT0FBVCxFQUFpQixxQ0FBakIsQ0FBSjs7QUFDQSxNQUFJO0FBQ0YsUUFBSUMsVUFBVSxHQUFHLENBQ2Ysc0JBRGUsQ0FBakI7QUFHQSxXQUFPQSxVQUFQO0FBQ0QsR0FMRCxDQU1BLE9BQU1DLENBQU4sRUFBUztBQUNQQyxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWUYsQ0FBWjtBQUNBTixJQUFBQSxXQUFXLENBQUNTLE1BQVosQ0FBbUJDLElBQW5CLENBQXdCLHdCQUF3QkosQ0FBaEQ7QUFDQSxXQUFPLEVBQVA7QUFDRDtBQUNGOztBQUVNLFNBQVNLLE9BQVQsQ0FBaUJDLElBQWpCLEVBQXVCYixPQUF2QixFQUFnQztBQUNyQyxRQUFNRyxJQUFJLEdBQUdDLE9BQU8sQ0FBQyxjQUFELENBQVAsQ0FBd0JELElBQXJDOztBQUNBQSxFQUFBQSxJQUFJLENBQUNILE9BQU8sQ0FBQ0ssT0FBVCxFQUFpQix5QkFBakIsQ0FBSjs7QUFDQSxNQUFJLENBQ0gsQ0FERCxDQUVBLE9BQU9FLENBQVAsRUFBVTtBQUNSQyxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWUYsQ0FBWjtBQUNBLFdBQU8sRUFBUDtBQUNEO0FBQ0Y7O0FBRU0sU0FBU08sTUFBVCxDQUFnQkQsSUFBaEIsRUFBc0JiLE9BQXRCLEVBQStCO0FBQ3BDLE1BQUksQ0FDSCxDQURELENBRUEsT0FBT08sQ0FBUCxFQUFVO0FBQ1JDLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZRixDQUFaO0FBQ0EsV0FBTyxFQUFQO0FBQ0Q7QUFDRjs7QUFFTSxTQUFTUSxpQkFBVCxDQUEyQkYsSUFBM0IsRUFBaUNiLE9BQWpDLEVBQTBDO0FBQzlDLFFBQU1HLElBQUksR0FBR0MsT0FBTyxDQUFDLGNBQUQsQ0FBUCxDQUF3QkQsSUFBckM7O0FBQ0RBLEVBQUFBLElBQUksQ0FBQ0gsT0FBTyxDQUFDSyxPQUFULEVBQWlCLG9DQUFqQixDQUFKOztBQUNBLE1BQUk7QUFDRixRQUFJSCxhQUFhLEdBQUcsRUFBcEI7QUFDQyxXQUFPQSxhQUFQO0FBQ0YsR0FIRCxDQUlBLE9BQU9LLENBQVAsRUFBVTtBQUNSQyxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWUYsQ0FBWjtBQUNBLFdBQU8sRUFBUDtBQUNEO0FBQ0Y7O0FBRU0sU0FBU1MsdUJBQVQsQ0FBaUNILElBQWpDLEVBQXVDYixPQUF2QyxFQUFnRDtBQUNyRCxRQUFNRyxJQUFJLEdBQUdDLE9BQU8sQ0FBQyxjQUFELENBQVAsQ0FBd0JELElBQXJDOztBQUNBQSxFQUFBQSxJQUFJLENBQUNILE9BQU8sQ0FBQ0ssT0FBVCxFQUFpQiwwQ0FBakIsQ0FBSjs7QUFDQSxNQUFJLENBQ0gsQ0FERCxDQUVBLE9BQU9FLENBQVAsRUFBVTtBQUNSQyxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWUYsQ0FBWjtBQUNEO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5leHBvcnQgZnVuY3Rpb24gX2dldERlZmF1bHRWYXJzKCkge1xuICByZXR1cm4ge1xuICAgIHRvdWNoRmlsZTogJy9zcmMvdGhlbWVyLmpzJyxcbiAgICB3YXRjaFN0YXJ0ZWQgOiBmYWxzZSxcbiAgICBidWlsZHN0ZXA6ICcxIG9mIDEnLFxuICAgIGZpcnN0VGltZSA6IHRydWUsXG4gICAgZmlyc3RDb21waWxlOiB0cnVlLFxuICAgIGJyb3dzZXJDb3VudCA6IDAsXG4gICAgbWFuaWZlc3Q6IG51bGwsXG4gICAgZXh0UGF0aDogJ2V4dCcsXG4gICAgcGx1Z2luRXJyb3JzOiBbXSxcbiAgICBkZXBzOiBbXSxcbiAgICB1c2VkRXh0Q29tcG9uZW50czogW10sXG4gICAgcmVidWlsZDogdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZXh0cmFjdEZyb21Tb3VyY2UobW9kdWxlLCBvcHRpb25zLCBjb21waWxhdGlvbiwgZXh0Q29tcG9uZW50cykge1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KG9wdGlvbnMudmVyYm9zZSwnRlVOQ1RJT04gX2V4dHJhY3RGcm9tU291cmNlIChlbXB0eSknKVxuICB0cnkge1xuICAgIHZhciBzdGF0ZW1lbnRzID0gW1xuICAgICAgJ0V4dC5yZXF1aXJlKFwiRXh0LipcIiknLFxuICAgIF1cbiAgICByZXR1cm4gc3RhdGVtZW50c1xuICB9XG4gIGNhdGNoKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKVxuICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCdleHRyYWN0RnJvbVNvdXJjZTogJyArIGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF90b1Byb2QodmFycywgb3B0aW9ucykge1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KG9wdGlvbnMudmVyYm9zZSwnRlVOQ1RJT04gX3RvUHJvZCAoZW1wdHknKVxuICB0cnkge1xuICB9XG4gIGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coZSlcbiAgICByZXR1cm4gW11cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX3RvRGV2KHZhcnMsIG9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRBbGxDb21wb25lbnRzKHZhcnMsIG9wdGlvbnMpIHtcbiAgIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucy52ZXJib3NlLCdGVU5DVElPTiBfZ2V0QWxsQ29tcG9uZW50cyAoZW1wdHkpJylcbiAgdHJ5IHtcbiAgICB2YXIgZXh0Q29tcG9uZW50cyA9IFtdXG4gICAgIHJldHVybiBleHRDb21wb25lbnRzXG4gIH1cbiAgY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKVxuICAgIHJldHVybiBbXVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfd3JpdGVGaWxlc1RvUHJvZEZvbGRlcih2YXJzLCBvcHRpb25zKSB7XG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucy52ZXJib3NlLCdGVU5DVElPTiBfd3JpdGVGaWxlc1RvUHJvZEZvbGRlciAoZW1wdHkpJylcbiAgdHJ5IHtcbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKGUpXG4gIH1cbn0iXX0= \ No newline at end of file diff --git a/packages/ext-react-webpack-plugin/dist/extjsUtil.js b/packages/ext-react-webpack-plugin/dist/extjsUtil.js index 97fb0af1..b66d9523 100644 --- a/packages/ext-react-webpack-plugin/dist/extjsUtil.js +++ b/packages/ext-react-webpack-plugin/dist/extjsUtil.js @@ -3,68 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.getValidateOptions = getValidateOptions; -exports.getDefaultOptions = getDefaultOptions; -exports.getDefaultVars = getDefaultVars; +exports._getDefaultVars = _getDefaultVars; exports._afterCompile = _afterCompile; exports._prepareForBuild = _prepareForBuild; -function getValidateOptions() { - return { - "type": "object", - "properties": { - "framework": { - "type": ["string"] - }, - "port": { - "type": ["integer"] - }, - "emit": { - "type": ["boolean"] - }, - "browser": { - "type": ["boolean"] - }, - "watch": { - "type": ["string"] - }, - "profile": { - "type": ["string"] - }, - "environment": { - "type": ["string"] - }, - "verbose": { - "type": ["string"] - }, - // "theme": {"type": [ "string" ]}, - // "toolkit": {"type": [ "string" ]}, - "treeshake": { - "type": ["boolean"] // "packages": {"type": [ "string", "array" ]}, - - } - }, - "additionalProperties": false // "errorMessage": { - // "option": "should be {Boolean} (https:/github.com/org/repo#anchor)" - // } - - }; -} - -function getDefaultOptions() { - return { - port: 1962, - emit: true, - browser: true, - watch: 'yes', - profile: 'desktop', - environment: 'development', - verbose: 'no' - }; -} - -function getDefaultVars() { +function _getDefaultVars() { return { + touchFile: '/themer.js', + rebuild: true, watchStarted: false, firstTime: true, browserCount: 0, @@ -80,45 +26,48 @@ function getDefaultVars() { } function _afterCompile(compilation, vars, options) { - try { - require('./pluginUtil').logv(options, 'FUNCTION ext-after-compile'); - - const path = require('path'); - - let { - files, - dirs - } = vars; - const { - cwd - } = vars; - files = typeof files === 'string' ? [files] : files; - dirs = typeof dirs === 'string' ? [dirs] : dirs; - - const { - fileDependencies, - contextDependencies - } = _getFileAndContextDeps(compilation, files, dirs, cwd, options); - - if (files.length > 0) { - fileDependencies.forEach(file => { - compilation.fileDependencies.add(path.resolve(file)); - }); - } + var verbose = options.verbose; - if (dirs.length > 0) { - contextDependencies.forEach(context => { - compilation.contextDependencies.add(context); - }); - } - } catch (e) { - console.log(e); - compilation.errors.push('_afterCompile: ' + e); + var logv = require('./pluginUtil').logv; + + logv(verbose, 'FUNCTION extjs _afterCompile'); + + const path = require('path'); + + let { + files, + dirs + } = vars; + const { + cwd + } = vars; + files = typeof files === 'string' ? [files] : files; + dirs = typeof dirs === 'string' ? [dirs] : dirs; + + const { + fileDependencies, + contextDependencies + } = _getFileAndContextDeps(compilation, files, dirs, cwd, options); + + if (files.length > 0) { + fileDependencies.forEach(file => { + compilation.fileDependencies.add(path.resolve(file)); + }); + } + + if (dirs.length > 0) { + contextDependencies.forEach(context => { + compilation.contextDependencies.add(context); + }); } } function _getFileAndContextDeps(compilation, files, dirs, cwd, options) { - require('./pluginUtil').logv(options, 'FUNCTION _getFileAndContextDeps'); + var verbose = options.verbose; + + var logv = require('./pluginUtil').logv; + + logv(verbose, 'FUNCTION _getFileAndContextDeps'); const uniq = require('lodash.uniq'); @@ -160,73 +109,64 @@ function _getFileAndContextDeps(compilation, files, dirs, cwd, options) { } function _prepareForBuild(app, vars, options, output, compilation) { - try { - const log = require('./pluginUtil').log; + // try { + const log = require('./pluginUtil').log; - const logv = require('./pluginUtil').logv; + const logv = require('./pluginUtil').logv; - logv(options, '_prepareForBuild'); + logv(options, '_prepareForBuild'); - const fs = require('fs'); + const fs = require('fs'); - const recursiveReadSync = require('recursive-readdir-sync'); + const recursiveReadSync = require('recursive-readdir-sync'); - var watchedFiles = []; + var watchedFiles = []; - try { - watchedFiles = recursiveReadSync('./app').concat(recursiveReadSync('./packages')); - } catch (err) { - if (err.errno === 34) { - console.log('Path does not exist'); - } else { - throw err; - } + try { + watchedFiles = recursiveReadSync('./app').concat(recursiveReadSync('./packages')); + } catch (err) { + if (err.errno === 34) { + console.log('Path does not exist'); + } else { + throw err; } + } - var currentNumFiles = watchedFiles.length; - logv(options, 'watchedFiles: ' + currentNumFiles); - var doBuild = true; // var doBuild = false - // for (var file in watchedFiles) { - // if (vars.lastMilliseconds < fs.statSync(watchedFiles[file]).mtimeMs) { - // if (watchedFiles[file].indexOf("scss") != -1) {doBuild=true;break;} - // } - // } - // if (vars.lastMilliseconds < fs.statSync('./app.json').mtimeMs) { - // doBuild=true - // } - - logv(options, 'doBuild: ' + doBuild); - vars.lastMilliseconds = new Date().getTime(); - var filesource = 'this file enables client reload'; - compilation.assets[currentNumFiles + 'FilesUnderAppFolder.md'] = { - source: function () { - return filesource; - }, - size: function () { - return filesource.length; - } - }; - logv(options, 'currentNumFiles: ' + currentNumFiles); - logv(options, 'vars.lastNumFiles: ' + vars.lastNumFiles); - logv(options, 'doBuild: ' + doBuild); - - if (currentNumFiles != vars.lastNumFiles || doBuild) { - vars.rebuild = true; - var bundleDir = output.replace(process.cwd(), ''); + var currentNumFiles = watchedFiles.length; + logv(options, 'watchedFiles: ' + currentNumFiles); + var doBuild = true; + logv(options, 'doBuild: ' + doBuild); + vars.lastMilliseconds = new Date().getTime(); + var filesource = 'this file enables client reload'; + compilation.assets[currentNumFiles + 'FilesUnderAppFolder.md'] = { + source: function () { + return filesource; + }, + size: function () { + return filesource.length; + } + }; + logv(options, 'currentNumFiles: ' + currentNumFiles); + logv(options, 'vars.lastNumFiles: ' + vars.lastNumFiles); + logv(options, 'doBuild: ' + doBuild); - if (bundleDir.trim() == '') { - bundleDir = './'; - } + if (currentNumFiles != vars.lastNumFiles || doBuild) { + vars.rebuild = true; + var bundleDir = output.replace(process.cwd(), ''); - log(app + 'Building Ext bundle at: ' + bundleDir); - } else { - vars.rebuild = false; + if (bundleDir.trim() == '') { + bundleDir = './'; } - vars.lastNumFiles = currentNumFiles; - } catch (e) { - console.log(e); - compilation.errors.push('_prepareForBuild: ' + e); + log(app + 'Building Ext bundle at: ' + bundleDir); + } else { + vars.rebuild = false; } + + vars.lastNumFiles = currentNumFiles; // } + // catch(e) { + // console.log(e) + // compilation.errors.push('_prepareForBuild: ' + e) + // } } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9leHRqc1V0aWwuanMiXSwibmFtZXMiOlsiZ2V0VmFsaWRhdGVPcHRpb25zIiwiZ2V0RGVmYXVsdE9wdGlvbnMiLCJwb3J0IiwiZW1pdCIsImJyb3dzZXIiLCJ3YXRjaCIsInByb2ZpbGUiLCJlbnZpcm9ubWVudCIsInZlcmJvc2UiLCJnZXREZWZhdWx0VmFycyIsIndhdGNoU3RhcnRlZCIsImZpcnN0VGltZSIsImJyb3dzZXJDb3VudCIsImN3ZCIsInByb2Nlc3MiLCJleHRQYXRoIiwicGx1Z2luRXJyb3JzIiwibGFzdE51bUZpbGVzIiwibGFzdE1pbGxpc2Vjb25kcyIsImxhc3RNaWxsaXNlY29uZHNBcHBKc29uIiwiZmlsZXMiLCJkaXJzIiwiX2FmdGVyQ29tcGlsZSIsImNvbXBpbGF0aW9uIiwidmFycyIsIm9wdGlvbnMiLCJyZXF1aXJlIiwibG9ndiIsInBhdGgiLCJmaWxlRGVwZW5kZW5jaWVzIiwiY29udGV4dERlcGVuZGVuY2llcyIsIl9nZXRGaWxlQW5kQ29udGV4dERlcHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiZmlsZSIsImFkZCIsInJlc29sdmUiLCJjb250ZXh0IiwiZSIsImNvbnNvbGUiLCJsb2ciLCJlcnJvcnMiLCJwdXNoIiwidW5pcSIsImlzR2xvYiIsImlzV2VicGFjazQiLCJob29rcyIsImZkcyIsImNkcyIsInBhdHRlcm4iLCJmIiwiZ2xvYiIsInN5bmMiLCJkb3QiLCJhYnNvbHV0ZSIsImNvbmNhdCIsIl9wcmVwYXJlRm9yQnVpbGQiLCJhcHAiLCJvdXRwdXQiLCJmcyIsInJlY3Vyc2l2ZVJlYWRTeW5jIiwid2F0Y2hlZEZpbGVzIiwiZXJyIiwiZXJybm8iLCJjdXJyZW50TnVtRmlsZXMiLCJkb0J1aWxkIiwiRGF0ZSIsImdldFRpbWUiLCJmaWxlc291cmNlIiwiYXNzZXRzIiwic291cmNlIiwic2l6ZSIsInJlYnVpbGQiLCJidW5kbGVEaXIiLCJyZXBsYWNlIiwidHJpbSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7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QjtBQUZvQixLQUFqRTtBQUtBTCxJQUFBQSxJQUFJLENBQUNGLE9BQUQsRUFBUyxzQkFBc0J1QyxlQUEvQixDQUFKO0FBQ0FyQyxJQUFBQSxJQUFJLENBQUNGLE9BQUQsRUFBUyx3QkFBd0JELElBQUksQ0FBQ1AsWUFBdEMsQ0FBSjtBQUNBVSxJQUFBQSxJQUFJLENBQUNGLE9BQUQsRUFBUyxjQUFjd0MsT0FBdkIsQ0FBSjs7QUFFQSxRQUFJRCxlQUFlLElBQUl4QyxJQUFJLENBQUNQLFlBQXhCLElBQXdDZ0QsT0FBNUMsRUFBcUQ7QUFDbkR6QyxNQUFBQSxJQUFJLENBQUNnRCxPQUFMLEdBQWUsSUFBZjtBQUNBLFVBQUlDLFNBQVMsR0FBR2YsTUFBTSxDQUFDZ0IsT0FBUCxDQUFlNUQsT0FBTyxDQUFDRCxHQUFSLEVBQWYsRUFBOEIsRUFBOUIsQ0FBaEI7O0FBQ0EsVUFBSTRELFNBQVMsQ0FBQ0UsSUFBVixNQUFvQixFQUF4QixFQUE0QjtBQUFDRixRQUFBQSxTQUFTLEdBQUcsSUFBWjtBQUFpQjs7QUFDOUNqQyxNQUFBQSxHQUFHLENBQUNpQixHQUFHLEdBQUcsMEJBQU4sR0FBbUNnQixTQUFwQyxDQUFIO0FBQ0QsS0FMRCxNQU1LO0FBQ0hqRCxNQUFBQSxJQUFJLENBQUNnRCxPQUFMLEdBQWUsS0FBZjtBQUNEOztBQUNEaEQsSUFBQUEsSUFBSSxDQUFDUCxZQUFMLEdBQW9CK0MsZUFBcEI7QUFDRCxHQTlDRCxDQStDQSxPQUFNMUIsQ0FBTixFQUFTO0FBQ1BDLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZRixDQUFaO0FBQ0FmLElBQUFBLFdBQVcsQ0FBQ2tCLE1BQVosQ0FBbUJDLElBQW5CLENBQXdCLHVCQUF1QkosQ0FBL0M7QUFDRDtBQUNGIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCJcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbGlkYXRlT3B0aW9ucygpIHtcbiAgcmV0dXJuIHtcbiAgICBcInR5cGVcIjogXCJvYmplY3RcIixcbiAgICBcInByb3BlcnRpZXNcIjoge1xuICAgICAgXCJmcmFtZXdvcmtcIjogICB7XCJ0eXBlXCI6IFsgXCJzdHJpbmdcIiBdfSxcbiAgICAgIFwicG9ydFwiOiAgICAgICAge1widHlwZVwiOiBbIFwiaW50ZWdlclwiIF19LFxuICAgICAgXCJlbWl0XCI6ICAgICAgICB7XCJ0eXBlXCI6IFsgXCJib29sZWFuXCIgXX0sXG4gICAgICBcImJyb3dzZXJcIjogICAgIHtcInR5cGVcIjogWyBcImJvb2xlYW5cIiBdfSxcbiAgICAgIFwid2F0Y2hcIjogICAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcInByb2ZpbGVcIjogICAgIHtcInR5cGVcIjogWyBcInN0cmluZ1wiIF19LFxuICAgICAgXCJlbnZpcm9ubWVudFwiOiB7XCJ0eXBlXCI6IFsgXCJzdHJpbmdcIiBdfSxcbiAgICAgIFwidmVyYm9zZVwiOiAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4vLyAgICAgIFwidGhlbWVcIjogICAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4vLyAgICAgIFwidG9vbGtpdFwiOiAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcInRyZWVzaGFrZVwiOiAgIHtcInR5cGVcIjogWyBcImJvb2xlYW5cIiBdfVxuLy8gICAgICBcInBhY2thZ2VzXCI6ICAgIHtcInR5cGVcIjogWyBcInN0cmluZ1wiLCBcImFycmF5XCIgXX0sXG5cbiAgICB9LFxuICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogZmFsc2VcbiAgICAvLyBcImVycm9yTWVzc2FnZVwiOiB7XG4gICAgLy8gICBcIm9wdGlvblwiOiBcInNob3VsZCBiZSB7Qm9vbGVhbn0gKGh0dHBzOi9naXRodWIuY29tL29yZy9yZXBvI2FuY2hvcilcIlxuICAgIC8vIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnMoKSB7XG4gIHJldHVybiB7XG4gICAgcG9ydDogMTk2MixcbiAgICBlbWl0OiB0cnVlLFxuICAgIGJyb3dzZXI6IHRydWUsXG4gICAgd2F0Y2g6ICd5ZXMnLFxuICAgIHByb2ZpbGU6ICdkZXNrdG9wJywgXG4gICAgZW52aXJvbm1lbnQ6ICdkZXZlbG9wbWVudCcsIFxuICAgIHZlcmJvc2U6ICdubydcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFZhcnMoKSB7XG4gIHJldHVybiB7XG4gICAgd2F0Y2hTdGFydGVkIDogZmFsc2UsXG4gICAgZmlyc3RUaW1lIDogdHJ1ZSxcbiAgICBicm93c2VyQ291bnQgOiAwLFxuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBleHRQYXRoOiAnLicsXG4gICAgcGx1Z2luRXJyb3JzOiBbXSxcbiAgICBsYXN0TnVtRmlsZXM6IDAsXG4gICAgbGFzdE1pbGxpc2Vjb25kczogMCxcbiAgICBsYXN0TWlsbGlzZWNvbmRzQXBwSnNvbjogMCxcbiAgICBmaWxlczogWycuL2FwcC5qc29uJ10sXG4gICAgZGlyczogWycuL2FwcCcsJy4vcGFja2FnZXMnXVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfYWZ0ZXJDb21waWxlKGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndihvcHRpb25zLCdGVU5DVElPTiBleHQtYWZ0ZXItY29tcGlsZScpXG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuICAgIGxldCB7IGZpbGVzLCBkaXJzIH0gPSB2YXJzXG4gICAgY29uc3QgeyBjd2QgfSA9IHZhcnNcbiAgICBmaWxlcyA9IHR5cGVvZiBmaWxlcyA9PT0gJ3N0cmluZycgPyBbZmlsZXNdIDogZmlsZXNcbiAgICBkaXJzID0gdHlwZW9mIGRpcnMgPT09ICdzdHJpbmcnID8gW2RpcnNdIDogZGlyc1xuICAgIGNvbnN0IHtcbiAgICAgIGZpbGVEZXBlbmRlbmNpZXMsXG4gICAgICBjb250ZXh0RGVwZW5kZW5jaWVzLFxuICAgIH0gPSBfZ2V0RmlsZUFuZENvbnRleHREZXBzKGNvbXBpbGF0aW9uLCBmaWxlcywgZGlycywgY3dkLCBvcHRpb25zKTtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgZmlsZURlcGVuZGVuY2llcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbXBpbGF0aW9uLmZpbGVEZXBlbmRlbmNpZXMuYWRkKHBhdGgucmVzb2x2ZShmaWxlKSk7XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb250ZXh0RGVwZW5kZW5jaWVzLmZvckVhY2goKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29tcGlsYXRpb24uY29udGV4dERlcGVuZGVuY2llcy5hZGQoY29udGV4dCk7XG4gICAgICB9KVxuICAgIH1cbiAgfVxuICBjYXRjaChlKSB7XG4gICAgY29uc29sZS5sb2coZSlcbiAgICBjb21waWxhdGlvbi5lcnJvcnMucHVzaCgnX2FmdGVyQ29tcGlsZTogJyArIGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gX2dldEZpbGVBbmRDb250ZXh0RGVwcyhjb21waWxhdGlvbiwgZmlsZXMsIGRpcnMsIGN3ZCwgb3B0aW9ucykge1xuICByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2KG9wdGlvbnMsJ0ZVTkNUSU9OIF9nZXRGaWxlQW5kQ29udGV4dERlcHMnKVxuICBjb25zdCB1bmlxID0gcmVxdWlyZSgnbG9kYXNoLnVuaXEnKVxuICBjb25zdCBpc0dsb2IgPSByZXF1aXJlKCdpcy1nbG9iJylcblxuICBjb25zdCB7IGZpbGVEZXBlbmRlbmNpZXMsIGNvbnRleHREZXBlbmRlbmNpZXMgfSA9IGNvbXBpbGF0aW9uO1xuICBjb25zdCBpc1dlYnBhY2s0ID0gY29tcGlsYXRpb24uaG9va3M7XG4gIGxldCBmZHMgPSBpc1dlYnBhY2s0ID8gWy4uLmZpbGVEZXBlbmRlbmNpZXNdIDogZmlsZURlcGVuZGVuY2llcztcbiAgbGV0IGNkcyA9IGlzV2VicGFjazQgPyBbLi4uY29udGV4dERlcGVuZGVuY2llc10gOiBjb250ZXh0RGVwZW5kZW5jaWVzO1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGZpbGVzLmZvckVhY2goKHBhdHRlcm4pID0+IHtcbiAgICAgIGxldCBmID0gcGF0dGVyblxuICAgICAgaWYgKGlzR2xvYihwYXR0ZXJuKSkge1xuICAgICAgICBmID0gZ2xvYi5zeW5jKHBhdHRlcm4sIHsgY3dkLCBkb3Q6IHRydWUsIGFic29sdXRlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgICBmZHMgPSBmZHMuY29uY2F0KGYpXG4gICAgfSlcbiAgICBmZHMgPSB1bmlxKGZkcylcbiAgfVxuICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgY2RzID0gdW5pcShjZHMuY29uY2F0KGRpcnMpKVxuICB9XG4gIHJldHVybiB7IGZpbGVEZXBlbmRlbmNpZXM6IGZkcywgY29udGV4dERlcGVuZGVuY2llczogY2RzIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9wcmVwYXJlRm9yQnVpbGQoYXBwLCB2YXJzLCBvcHRpb25zLCBvdXRwdXQsIGNvbXBpbGF0aW9uKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgbG9nID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9nXG4gICAgY29uc3QgbG9ndiA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3ZcbiAgICBsb2d2KG9wdGlvbnMsJ19wcmVwYXJlRm9yQnVpbGQnKVxuICAgIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKVxuICAgIGNvbnN0IHJlY3Vyc2l2ZVJlYWRTeW5jID0gcmVxdWlyZSgncmVjdXJzaXZlLXJlYWRkaXItc3luYycpXG4gICAgdmFyIHdhdGNoZWRGaWxlcz1bXVxuICAgIHRyeSB7d2F0Y2hlZEZpbGVzID0gcmVjdXJzaXZlUmVhZFN5bmMoJy4vYXBwJykuY29uY2F0KHJlY3Vyc2l2ZVJlYWRTeW5jKCcuL3BhY2thZ2VzJykpfVxuICAgIGNhdGNoKGVycikge2lmKGVyci5lcnJubyA9PT0gMzQpe2NvbnNvbGUubG9nKCdQYXRoIGRvZXMgbm90IGV4aXN0Jyk7fSBlbHNlIHt0aHJvdyBlcnI7fX1cbiAgICB2YXIgY3VycmVudE51bUZpbGVzID0gd2F0Y2hlZEZpbGVzLmxlbmd0aFxuICAgIGxvZ3Yob3B0aW9ucywnd2F0Y2hlZEZpbGVzOiAnICsgY3VycmVudE51bUZpbGVzKVxuICAgIHZhciBkb0J1aWxkID0gdHJ1ZVxuXG4gICAgLy8gdmFyIGRvQnVpbGQgPSBmYWxzZVxuICAgIC8vIGZvciAodmFyIGZpbGUgaW4gd2F0Y2hlZEZpbGVzKSB7XG4gICAgLy8gICBpZiAodmFycy5sYXN0TWlsbGlzZWNvbmRzIDwgZnMuc3RhdFN5bmMod2F0Y2hlZEZpbGVzW2ZpbGVdKS5tdGltZU1zKSB7XG4gICAgLy8gICAgIGlmICh3YXRjaGVkRmlsZXNbZmlsZV0uaW5kZXhPZihcInNjc3NcIikgIT0gLTEpIHtkb0J1aWxkPXRydWU7YnJlYWs7fVxuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICAvLyBpZiAodmFycy5sYXN0TWlsbGlzZWNvbmRzIDwgZnMuc3RhdFN5bmMoJy4vYXBwLmpzb24nKS5tdGltZU1zKSB7XG4gICAgLy8gICBkb0J1aWxkPXRydWVcbiAgICAvLyB9XG4gICAgXG4gICAgbG9ndihvcHRpb25zLCdkb0J1aWxkOiAnICsgZG9CdWlsZClcblxuICAgIHZhcnMubGFzdE1pbGxpc2Vjb25kcyA9IChuZXcgRGF0ZSkuZ2V0VGltZSgpXG4gICAgdmFyIGZpbGVzb3VyY2UgPSAndGhpcyBmaWxlIGVuYWJsZXMgY2xpZW50IHJlbG9hZCdcbiAgICBjb21waWxhdGlvbi5hc3NldHNbY3VycmVudE51bUZpbGVzICsgJ0ZpbGVzVW5kZXJBcHBGb2xkZXIubWQnXSA9IHtcbiAgICAgIHNvdXJjZTogZnVuY3Rpb24oKSB7cmV0dXJuIGZpbGVzb3VyY2V9LFxuICAgICAgc2l6ZTogZnVuY3Rpb24oKSB7cmV0dXJuIGZpbGVzb3VyY2UubGVuZ3RofVxuICAgIH1cblxuICAgIGxvZ3Yob3B0aW9ucywnY3VycmVudE51bUZpbGVzOiAnICsgY3VycmVudE51bUZpbGVzKVxuICAgIGxvZ3Yob3B0aW9ucywndmFycy5sYXN0TnVtRmlsZXM6ICcgKyB2YXJzLmxhc3ROdW1GaWxlcylcbiAgICBsb2d2KG9wdGlvbnMsJ2RvQnVpbGQ6ICcgKyBkb0J1aWxkKVxuXG4gICAgaWYgKGN1cnJlbnROdW1GaWxlcyAhPSB2YXJzLmxhc3ROdW1GaWxlcyB8fCBkb0J1aWxkKSB7XG4gICAgICB2YXJzLnJlYnVpbGQgPSB0cnVlXG4gICAgICB2YXIgYnVuZGxlRGlyID0gb3V0cHV0LnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpXG4gICAgICBpZiAoYnVuZGxlRGlyLnRyaW0oKSA9PSAnJykge2J1bmRsZURpciA9ICcuLyd9XG4gICAgICBsb2coYXBwICsgJ0J1aWxkaW5nIEV4dCBidW5kbGUgYXQ6ICcgKyBidW5kbGVEaXIpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFycy5yZWJ1aWxkID0gZmFsc2VcbiAgICB9XG4gICAgdmFycy5sYXN0TnVtRmlsZXMgPSBjdXJyZW50TnVtRmlsZXNcbiAgfVxuICBjYXRjaChlKSB7XG4gICAgY29uc29sZS5sb2coZSlcbiAgICBjb21waWxhdGlvbi5lcnJvcnMucHVzaCgnX3ByZXBhcmVGb3JCdWlsZDogJyArIGUpXG4gIH1cbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9leHRqc1V0aWwuanMiXSwibmFtZXMiOlsiX2dldERlZmF1bHRWYXJzIiwidG91Y2hGaWxlIiwicmVidWlsZCIsIndhdGNoU3RhcnRlZCIsImZpcnN0VGltZSIsImJyb3dzZXJDb3VudCIsImN3ZCIsInByb2Nlc3MiLCJleHRQYXRoIiwicGx1Z2luRXJyb3JzIiwibGFzdE51bUZpbGVzIiwibGFzdE1pbGxpc2Vjb25kcyIsImxhc3RNaWxsaXNlY29uZHNBcHBKc29uIiwiZmlsZXMiLCJkaXJzIiwiX2FmdGVyQ29tcGlsZSIsImNvbXBpbGF0aW9uIiwidmFycyIsIm9wdGlvbnMiLCJ2ZXJib3NlIiwibG9ndiIsInJlcXVpcmUiLCJwYXRoIiwiZmlsZURlcGVuZGVuY2llcyIsImNvbnRleHREZXBlbmRlbmNpZXMiLCJfZ2V0RmlsZUFuZENvbnRleHREZXBzIiwibGVuZ3RoIiwiZm9yRWFjaCIsImZpbGUiLCJhZGQiLCJyZXNvbHZlIiwiY29udGV4dCIsInVuaXEiLCJpc0dsb2IiLCJpc1dlYnBhY2s0IiwiaG9va3MiLCJmZHMiLCJjZHMiLCJwYXR0ZXJuIiwiZiIsImdsb2IiLCJzeW5jIiwiZG90IiwiYWJzb2x1dGUiLCJjb25jYXQiLCJfcHJlcGFyZUZvckJ1aWxkIiwiYXBwIiwib3V0cHV0IiwibG9nIiwiZnMiLCJyZWN1cnNpdmVSZWFkU3luYyIsIndhdGNoZWRGaWxlcyIsImVyciIsImVycm5vIiwiY29uc29sZSIsImN1cnJlbnROdW1GaWxlcyIsImRvQnVpbGQiLCJEYXRlIiwiZ2V0VGltZSIsImZpbGVzb3VyY2UiLCJhc3NldHMiLCJzb3VyY2UiLCJzaXplIiwiYnVuZGxlRGlyIiwicmVwbGFjZSIsInRyaW0iXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7QUFFTyxTQUFTQSxlQUFULEdBQTJCO0FBQ2hDLFNBQU87QUFDTEMsSUFBQUEsU0FBUyxFQUFFLFlBRE47QUFFTEMsSUFBQUEsT0FBTyxFQUFFLElBRko7QUFHTEMsSUFBQUEsWUFB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LENBQUNqQyxNQUFsQjtBQUF5QjtBQUZvQixHQUFqRTtBQUtBTixFQUFBQSxJQUFJLENBQUNGLE9BQUQsRUFBUyxzQkFBc0JxQyxlQUEvQixDQUFKO0FBQ0FuQyxFQUFBQSxJQUFJLENBQUNGLE9BQUQsRUFBUyx3QkFBd0JELElBQUksQ0FBQ1AsWUFBdEMsQ0FBSjtBQUNBVSxFQUFBQSxJQUFJLENBQUNGLE9BQUQsRUFBUyxjQUFjc0MsT0FBdkIsQ0FBSjs7QUFFQSxNQUFJRCxlQUFlLElBQUl0QyxJQUFJLENBQUNQLFlBQXhCLElBQXdDOEMsT0FBNUMsRUFBcUQ7QUFDbkR2QyxJQUFBQSxJQUFJLENBQUNmLE9BQUwsR0FBZSxJQUFmO0FBQ0EsUUFBSTZELFNBQVMsR0FBR2hCLE1BQU0sQ0FBQ2lCLE9BQVAsQ0FBZXpELE9BQU8sQ0FBQ0QsR0FBUixFQUFmLEVBQThCLEVBQTlCLENBQWhCOztBQUNBLFFBQUl5RCxTQUFTLENBQUNFLElBQVYsTUFBb0IsRUFBeEIsRUFBNEI7QUFBQ0YsTUFBQUEsU0FBUyxHQUFHLElBQVo7QUFBaUI7O0FBQzlDZixJQUFBQSxHQUFHLENBQUNGLEdBQUcsR0FBRywwQkFBTixHQUFtQ2lCLFNBQXBDLENBQUg7QUFDRCxHQUxELE1BTUs7QUFDSDlDLElBQUFBLElBQUksQ0FBQ2YsT0FBTCxHQUFlLEtBQWY7QUFDRDs7QUFDRGUsRUFBQUEsSUFBSSxDQUFDUCxZQUFMLEdBQW9CNkMsZUFBcEIsQ0FwQ3NFLENBcUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5leHBvcnQgZnVuY3Rpb24gX2dldERlZmF1bHRWYXJzKCkge1xuICByZXR1cm4ge1xuICAgIHRvdWNoRmlsZTogJy90aGVtZXIuanMnLFxuICAgIHJlYnVpbGQ6IHRydWUsXG4gICAgd2F0Y2hTdGFydGVkIDogZmFsc2UsXG4gICAgZmlyc3RUaW1lIDogdHJ1ZSxcbiAgICBicm93c2VyQ291bnQgOiAwLFxuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBleHRQYXRoOiAnLicsXG4gICAgcGx1Z2luRXJyb3JzOiBbXSxcbiAgICBsYXN0TnVtRmlsZXM6IDAsXG4gICAgbGFzdE1pbGxpc2Vjb25kczogMCxcbiAgICBsYXN0TWlsbGlzZWNvbmRzQXBwSnNvbjogMCxcbiAgICBmaWxlczogWycuL2FwcC5qc29uJ10sXG4gICAgZGlyczogWycuL2FwcCcsJy4vcGFja2FnZXMnXVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfYWZ0ZXJDb21waWxlKGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zKSB7XG4gIHZhciB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlXG4gIHZhciBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KHZlcmJvc2UsJ0ZVTkNUSU9OIGV4dGpzIF9hZnRlckNvbXBpbGUnKVxuICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG4gIGxldCB7IGZpbGVzLCBkaXJzIH0gPSB2YXJzXG4gIGNvbnN0IHsgY3dkIH0gPSB2YXJzXG4gIGZpbGVzID0gdHlwZW9mIGZpbGVzID09PSAnc3RyaW5nJyA/IFtmaWxlc10gOiBmaWxlc1xuICBkaXJzID0gdHlwZW9mIGRpcnMgPT09ICdzdHJpbmcnID8gW2RpcnNdIDogZGlyc1xuICBjb25zdCB7XG4gICAgZmlsZURlcGVuZGVuY2llcyxcbiAgICBjb250ZXh0RGVwZW5kZW5jaWVzLFxuICB9ID0gX2dldEZpbGVBbmRDb250ZXh0RGVwcyhjb21waWxhdGlvbiwgZmlsZXMsIGRpcnMsIGN3ZCwgb3B0aW9ucyk7XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgZmlsZURlcGVuZGVuY2llcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICBjb21waWxhdGlvbi5maWxlRGVwZW5kZW5jaWVzLmFkZChwYXRoLnJlc29sdmUoZmlsZSkpO1xuICAgIH0pXG4gIH1cbiAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnRleHREZXBlbmRlbmNpZXMuZm9yRWFjaCgoY29udGV4dCkgPT4ge1xuICAgICAgY29tcGlsYXRpb24uY29udGV4dERlcGVuZGVuY2llcy5hZGQoY29udGV4dCk7XG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBfZ2V0RmlsZUFuZENvbnRleHREZXBzKGNvbXBpbGF0aW9uLCBmaWxlcywgZGlycywgY3dkLCBvcHRpb25zKSB7XG4gIHZhciB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlXG4gIHZhciBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KHZlcmJvc2UsJ0ZVTkNUSU9OIF9nZXRGaWxlQW5kQ29udGV4dERlcHMnKVxuICBjb25zdCB1bmlxID0gcmVxdWlyZSgnbG9kYXNoLnVuaXEnKVxuICBjb25zdCBpc0dsb2IgPSByZXF1aXJlKCdpcy1nbG9iJylcblxuICBjb25zdCB7IGZpbGVEZXBlbmRlbmNpZXMsIGNvbnRleHREZXBlbmRlbmNpZXMgfSA9IGNvbXBpbGF0aW9uO1xuICBjb25zdCBpc1dlYnBhY2s0ID0gY29tcGlsYXRpb24uaG9va3M7XG4gIGxldCBmZHMgPSBpc1dlYnBhY2s0ID8gWy4uLmZpbGVEZXBlbmRlbmNpZXNdIDogZmlsZURlcGVuZGVuY2llcztcbiAgbGV0IGNkcyA9IGlzV2VicGFjazQgPyBbLi4uY29udGV4dERlcGVuZGVuY2llc10gOiBjb250ZXh0RGVwZW5kZW5jaWVzO1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGZpbGVzLmZvckVhY2goKHBhdHRlcm4pID0+IHtcbiAgICAgIGxldCBmID0gcGF0dGVyblxuICAgICAgaWYgKGlzR2xvYihwYXR0ZXJuKSkge1xuICAgICAgICBmID0gZ2xvYi5zeW5jKHBhdHRlcm4sIHsgY3dkLCBkb3Q6IHRydWUsIGFic29sdXRlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgICBmZHMgPSBmZHMuY29uY2F0KGYpXG4gICAgfSlcbiAgICBmZHMgPSB1bmlxKGZkcylcbiAgfVxuICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgY2RzID0gdW5pcShjZHMuY29uY2F0KGRpcnMpKVxuICB9XG4gIHJldHVybiB7IGZpbGVEZXBlbmRlbmNpZXM6IGZkcywgY29udGV4dERlcGVuZGVuY2llczogY2RzIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9wcmVwYXJlRm9yQnVpbGQoYXBwLCB2YXJzLCBvcHRpb25zLCBvdXRwdXQsIGNvbXBpbGF0aW9uKSB7XG4vLyAgdHJ5IHtcbiAgICBjb25zdCBsb2cgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2dcbiAgICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICAgIGxvZ3Yob3B0aW9ucywnX3ByZXBhcmVGb3JCdWlsZCcpXG4gICAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpXG4gICAgY29uc3QgcmVjdXJzaXZlUmVhZFN5bmMgPSByZXF1aXJlKCdyZWN1cnNpdmUtcmVhZGRpci1zeW5jJylcbiAgICB2YXIgd2F0Y2hlZEZpbGVzPVtdXG4gICAgdHJ5IHt3YXRjaGVkRmlsZXMgPSByZWN1cnNpdmVSZWFkU3luYygnLi9hcHAnKS5jb25jYXQocmVjdXJzaXZlUmVhZFN5bmMoJy4vcGFja2FnZXMnKSl9XG4gICAgY2F0Y2goZXJyKSB7aWYoZXJyLmVycm5vID09PSAzNCl7Y29uc29sZS5sb2coJ1BhdGggZG9lcyBub3QgZXhpc3QnKTt9IGVsc2Uge3Rocm93IGVycjt9fVxuICAgIHZhciBjdXJyZW50TnVtRmlsZXMgPSB3YXRjaGVkRmlsZXMubGVuZ3RoXG4gICAgbG9ndihvcHRpb25zLCd3YXRjaGVkRmlsZXM6ICcgKyBjdXJyZW50TnVtRmlsZXMpXG4gICAgdmFyIGRvQnVpbGQgPSB0cnVlXG4gICAgXG4gICAgbG9ndihvcHRpb25zLCdkb0J1aWxkOiAnICsgZG9CdWlsZClcblxuICAgIHZhcnMubGFzdE1pbGxpc2Vjb25kcyA9IChuZXcgRGF0ZSkuZ2V0VGltZSgpXG4gICAgdmFyIGZpbGVzb3VyY2UgPSAndGhpcyBmaWxlIGVuYWJsZXMgY2xpZW50IHJlbG9hZCdcbiAgICBjb21waWxhdGlvbi5hc3NldHNbY3VycmVudE51bUZpbGVzICsgJ0ZpbGVzVW5kZXJBcHBGb2xkZXIubWQnXSA9IHtcbiAgICAgIHNvdXJjZTogZnVuY3Rpb24oKSB7cmV0dXJuIGZpbGVzb3VyY2V9LFxuICAgICAgc2l6ZTogZnVuY3Rpb24oKSB7cmV0dXJuIGZpbGVzb3VyY2UubGVuZ3RofVxuICAgIH1cblxuICAgIGxvZ3Yob3B0aW9ucywnY3VycmVudE51bUZpbGVzOiAnICsgY3VycmVudE51bUZpbGVzKVxuICAgIGxvZ3Yob3B0aW9ucywndmFycy5sYXN0TnVtRmlsZXM6ICcgKyB2YXJzLmxhc3ROdW1GaWxlcylcbiAgICBsb2d2KG9wdGlvbnMsJ2RvQnVpbGQ6ICcgKyBkb0J1aWxkKVxuXG4gICAgaWYgKGN1cnJlbnROdW1GaWxlcyAhPSB2YXJzLmxhc3ROdW1GaWxlcyB8fCBkb0J1aWxkKSB7XG4gICAgICB2YXJzLnJlYnVpbGQgPSB0cnVlXG4gICAgICB2YXIgYnVuZGxlRGlyID0gb3V0cHV0LnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpXG4gICAgICBpZiAoYnVuZGxlRGlyLnRyaW0oKSA9PSAnJykge2J1bmRsZURpciA9ICcuLyd9XG4gICAgICBsb2coYXBwICsgJ0J1aWxkaW5nIEV4dCBidW5kbGUgYXQ6ICcgKyBidW5kbGVEaXIpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFycy5yZWJ1aWxkID0gZmFsc2VcbiAgICB9XG4gICAgdmFycy5sYXN0TnVtRmlsZXMgPSBjdXJyZW50TnVtRmlsZXNcbiAgLy8gfVxuICAvLyBjYXRjaChlKSB7XG4gIC8vICAgY29uc29sZS5sb2coZSlcbiAgLy8gICBjb21waWxhdGlvbi5lcnJvcnMucHVzaCgnX3ByZXBhcmVGb3JCdWlsZDogJyArIGUpXG4gIC8vIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/packages/ext-react-webpack-plugin/dist/index.js b/packages/ext-react-webpack-plugin/dist/index.js index 703d2321..62a8b77d 100644 --- a/packages/ext-react-webpack-plugin/dist/index.js +++ b/packages/ext-react-webpack-plugin/dist/index.js @@ -7,17 +7,20 @@ exports.default = void 0; require('@babel/polyfill'); -const v = require('./pluginUtil').logv; +const p = require(`./pluginUtil`); class ExtWebpackPlugin { constructor(options) { - this.plugin = require(`./pluginUtil`)._constructor(options); + var o = p._constructor(options); + + this.vars = o.vars; + this.options = o.options; } apply(compiler) { - const vars = this.plugin.vars; - const options = this.plugin.options; - v(options, 'FUNCTION apply'); + const vars = this.vars; + const options = this.options; + const app = this.app; if (!compiler.hooks) { console.log('not webpack 4'); @@ -25,53 +28,34 @@ class ExtWebpackPlugin { } compiler.hooks.thisCompilation.tap(`ext-this-compilation`, compilation => { - v(options, 'HOOK thisCompilation'); + p.logh(app, `HOOK thisCompilation`); + + p._thisCompilation(compiler, compilation, vars, options); if (vars.pluginErrors.length > 0) { compilation.errors.push(new Error(vars.pluginErrors.join(""))); + return; } }); + compiler.hooks.compilation.tap(`ext-compilation`, compilation => { + p.logh(app, `HOOK compilation`); - if (vars.pluginErrors.length > 0) { - return; - } - - if (vars.framework == 'extjs') { - compiler.hooks.compilation.tap(`ext-compilation`, compilation => { - v(options, 'HOOK compilation (empty)'); - }); - compiler.hooks.afterCompile.tap('ext-after-compile', compilation => { - v(options, 'HOOK afterCompile'); - - require(`./extjsUtil`)._afterCompile(compilation, vars, options); - }); - } else { - compiler.hooks.compilation.tap(`ext-compilation`, compilation => { - v(options, 'HOOK compilation'); - - require(`./pluginUtil`)._compilation(compiler, compilation, vars, options); - }); - compiler.hooks.afterCompile.tap('ext-after-compile', compilation => { - v(options, 'HOOK afterCompile'); - - require(`./pluginUtil`)._afterCompile(compiler, compilation, vars, options); - }); - } - - if (options.treeshake == true && options.environment == 'production' || options.treeshake == false && options.environment != 'production') { - compiler.hooks.emit.tapAsync(`ext-emit`, (compilation, callback) => { - v(options, 'HOOK emit'); - - require(`./pluginUtil`).emit(compiler, compilation, vars, options, callback); - }); - } + p._compilation(compiler, compilation, vars, options); + }); + compiler.hooks.afterCompile.tap('ext-after-compile', compilation => { + p.logh(app, `HOOK afterCompile`); - compiler.hooks.done.tap(`ext-done`, () => { - v(options, 'HOOK done'); + p._afterCompile(compiler, compilation, vars, options); + }); + compiler.hooks.emit.tapAsync(`ext-emit`, (compilation, callback) => { + p.logh(app, `HOOK emit (async)`); - require(`./pluginUtil`)._done(vars, options); + p._emit(compiler, compilation, vars, options, callback); + }); + compiler.hooks.done.tap(`ext-done`, stats => { + p.logh(app, `HOOK done`); - require('./pluginUtil').log(vars.app + `Completed ext-webpack-plugin processing`); + p._done(stats, vars, options); }); } @@ -79,4 +63,4 @@ class ExtWebpackPlugin { exports.default = ExtWebpackPlugin; module.exports = exports.default; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJyZXF1aXJlIiwidiIsImxvZ3YiLCJFeHRXZWJwYWNrUGx1Z2luIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwicGx1Z2luIiwiX2NvbnN0cnVjdG9yIiwiYXBwbHkiLCJjb21waWxlciIsInZhcnMiLCJob29rcyIsImNvbnNvbGUiLCJsb2ciLCJ0aGlzQ29tcGlsYXRpb24iLCJ0YXAiLCJjb21waWxhdGlvbiIsInBsdWdpbkVycm9ycyIsImxlbmd0aCIsImVycm9ycyIsInB1c2giLCJFcnJvciIsImpvaW4iLCJmcmFtZXdvcmsiLCJhZnRlckNvbXBpbGUiLCJfYWZ0ZXJDb21waWxlIiwiX2NvbXBpbGF0aW9uIiwidHJlZXNoYWtlIiwiZW52aXJvbm1lbnQiLCJlbWl0IiwidGFwQXN5bmMiLCJjYWxsYmFjayIsImRvbmUiLCJfZG9uZSIsImFwcCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7QUFDQUEsT0FBTyxDQUFDLGlCQUFELENBQVA7O0FBQ0EsTUFBTUMsQ0FBQyxHQUFHRCxPQUFPLENBQUMsY0FBRCxDQUFQLENBQXdCRSxJQUFsQzs7QUFDZSxNQUFNQyxnQkFBTixDQUF1QjtBQUNwQ0MsRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVU7QUFDbkIsU0FBS0MsTUFBTCxHQUFjTixPQUFPLENBQUUsY0FBRixDQUFQLENBQXdCTyxZQUF4QixDQUFxQ0YsT0FBckMsQ0FBZDtBQUNEOztBQUVERyxFQUFBQSxLQUFLLENBQUNDLFFBQUQsRUFBVztBQUNkLFVBQU1DLElBQUksR0FBRyxLQUFLSixNQUFMLENBQVlJLElBQXpCO0FBQ0EsVUFBTUwsT0FBTyxHQUFHLEtBQUtDLE1BQUwsQ0FBWUQsT0FBNUI7QUFDQUosSUFBQUEsQ0FBQyxDQUFDSSxPQUFELEVBQVMsZ0JBQVQsQ0FBRDs7QUFDQSxRQUFJLENBQUNJLFFBQVEsQ0FBQ0UsS0FBZCxFQUFxQjtBQUFDQyxNQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSxl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eUIsVUFBekIsRUFBb0MsTUFBTTtBQUN4Q2QsTUFBQUEsQ0FBQyxDQUFDSSxPQUFELEVBQVMsV0FBVCxDQUFEOztBQUNBTCxNQUFBQSxPQUFPLENBQUUsY0FBRixDQUFQLENBQXdCaUMsS0FBeEIsQ0FBOEJ2QixJQUE5QixFQUFvQ0wsT0FBcEM7O0FBQ0FMLE1BQUFBLE9BQU8sQ0FBQyxjQUFELENBQVAsQ0FBd0JhLEdBQXhCLENBQTRCSCxJQUFJLENBQUN3QixHQUFMLEdBQVkseUNBQXhDO0FBQ0QsS0FKRDtBQUtEOztBQXZEbUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcbnJlcXVpcmUoJ0BiYWJlbC9wb2x5ZmlsbCcpXG5jb25zdCB2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXh0V2VicGFja1BsdWdpbiB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB0aGlzLnBsdWdpbiA9IHJlcXVpcmUoYC4vcGx1Z2luVXRpbGApLl9jb25zdHJ1Y3RvcihvcHRpb25zKVxuICB9XG5cbiAgYXBwbHkoY29tcGlsZXIpIHtcbiAgICBjb25zdCB2YXJzID0gdGhpcy5wbHVnaW4udmFyc1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnBsdWdpbi5vcHRpb25zXG4gICAgdihvcHRpb25zLCdGVU5DVElPTiBhcHBseScpXG4gICAgaWYgKCFjb21waWxlci5ob29rcykge2NvbnNvbGUubG9nKCdub3Qgd2VicGFjayA0Jyk7cmV0dXJufVxuXG4gICAgY29tcGlsZXIuaG9va3MudGhpc0NvbXBpbGF0aW9uLnRhcChgZXh0LXRoaXMtY29tcGlsYXRpb25gLCAoY29tcGlsYXRpb24pID0+IHtcbiAgICAgIHYob3B0aW9ucywnSE9PSyB0aGlzQ29tcGlsYXRpb24nKVxuICAgICAgaWYgKHZhcnMucGx1Z2luRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29tcGlsYXRpb24uZXJyb3JzLnB1c2goIG5ldyBFcnJvcih2YXJzLnBsdWdpbkVycm9ycy5qb2luKFwiXCIpKSApXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAodmFycy5wbHVnaW5FcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCB2YXJzLmZyYW1ld29yayA9PSAnZXh0anMnKSB7XG4gICAgICBjb21waWxlci5ob29rcy5jb21waWxhdGlvbi50YXAoYGV4dC1jb21waWxhdGlvbmAsIChjb21waWxhdGlvbikgPT4ge1xuICAgICAgICB2KG9wdGlvbnMsJ0hPT0sgY29tcGlsYXRpb24gKGVtcHR5KScpXG4gICAgICB9KVxuICAgICAgY29tcGlsZXIuaG9va3MuYWZ0ZXJDb21waWxlLnRhcCgnZXh0LWFmdGVyLWNvbXBpbGUnLCAoY29tcGlsYXRpb24pID0+IHtcbiAgICAgICAgdihvcHRpb25zLCdIT09LIGFmdGVyQ29tcGlsZScpXG4gICAgICAgIHJlcXVpcmUoYC4vZXh0anNVdGlsYCkuX2FmdGVyQ29tcGlsZShjb21waWxhdGlvbiwgdmFycywgb3B0aW9ucylcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29tcGlsZXIuaG9va3MuY29tcGlsYXRpb24udGFwKGBleHQtY29tcGlsYXRpb25gLCAoY29tcGlsYXRpb24pID0+IHtcbiAgICAgICAgdihvcHRpb25zLCdIT09LIGNvbXBpbGF0aW9uJylcbiAgICAgICAgcmVxdWlyZShgLi9wbHVnaW5VdGlsYCkuX2NvbXBpbGF0aW9uKGNvbXBpbGVyLCBjb21waWxhdGlvbiwgdmFycywgb3B0aW9ucylcbiAgICAgIH0pXG4gICAgICBjb21waWxlci5ob29rcy5hZnRlckNvbXBpbGUudGFwKCdleHQtYWZ0ZXItY29tcGlsZScsIChjb21waWxhdGlvbikgPT4ge1xuICAgICAgICB2KG9wdGlvbnMsJ0hPT0sgYWZ0ZXJDb21waWxlJylcbiAgICAgICAgcmVxdWlyZShgLi9wbHVnaW5VdGlsYCkuX2FmdGVyQ29tcGlsZShjb21waWxlciwgY29tcGlsYXRpb24sIHZhcnMsIG9wdGlvbnMpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmKChvcHRpb25zLnRyZWVzaGFrZSA9PSB0cnVlICYmIG9wdGlvbnMuZW52aXJvbm1lbnQgPT0gJ3Byb2R1Y3Rpb24nKSB8fFxuICAgICAgIChvcHRpb25zLnRyZWVzaGFrZSA9PSBmYWxzZSAmJiBvcHRpb25zLmVudmlyb25tZW50ICE9ICdwcm9kdWN0aW9uJykpXG4gICAge1xuICAgICAgY29tcGlsZXIuaG9va3MuZW1pdC50YXBBc3luYyhgZXh0LWVtaXRgLCAoY29tcGlsYXRpb24sIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIHYob3B0aW9ucywnSE9PSyBlbWl0JylcbiAgICAgICAgcmVxdWlyZShgLi9wbHVnaW5VdGlsYCkuZW1pdChjb21waWxlciwgY29tcGlsYXRpb24sIHZhcnMsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb21waWxlci5ob29rcy5kb25lLnRhcChgZXh0LWRvbmVgLCAoKSA9PiB7XG4gICAgICB2KG9wdGlvbnMsJ0hPT0sgZG9uZScpXG4gICAgICByZXF1aXJlKGAuL3BsdWdpblV0aWxgKS5fZG9uZSh2YXJzLCBvcHRpb25zKVxuICAgICAgcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9nKHZhcnMuYXBwICsgYENvbXBsZXRlZCBleHQtd2VicGFjay1wbHVnaW4gcHJvY2Vzc2luZ2ApXG4gICAgfSlcbiAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJyZXF1aXJlIiwicCIsIkV4dFdlYnBhY2tQbHVnaW4iLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJvIiwiX2NvbnN0cnVjdG9yIiwidmFycyIsImFwcGx5IiwiY29tcGlsZXIiLCJhcHAiLCJob29rcyIsImNvbnNvbGUiLCJsb2ciLCJ0aGlzQ29tcGlsYXRpb24iLCJ0YXAiLCJjb21waWxhdGlvbiIsImxvZ2giLCJfdGhpc0NvbXBpbGF0aW9uIiwicGx1Z2luRXJyb3JzIiwibGVuZ3RoIiwiZXJyb3JzIiwicHVzaCIsIkVycm9yIiwiam9pbiIsIl9jb21waWxhdGlvbiIsImFmdGVyQ29tcGlsZSIsIl9hZnRlckNvbXBpbGUiLCJlbWl0IiwidGFwQXN5bmMiLCJjYWxsYmFjayIsIl9lbWl0IiwiZG9uZSIsInN0YXRzIiwiX2RvbmUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0FBQ0FBLE9BQU8sQ0FBQyxpQkFBRCxDQUFQOztBQUNBLE1BQU1DLENBQUMsR0FBR0QsT0FBTyxDQUFFLGNBQUYsQ0FBakI7O0FBRWUsTUFBTUUsZ0JBQU4sQ0FBdUI7QUFFcENDLEVBQUFBLFdBQVcsQ0FBQ0MsT0FBRCxFQUFVO0FBQ25CLFFBQUlDLENBQUMsR0FBR0osQ0FBQyxDQUFDSyxZQUFGLENBQWVGLE9BQWYsQ0FBUjs7QUFDQSxTQUFLRyxJQUFMLEdBQVlGLENBQUMsQ0FBQ0UsSUFBZDtBQUNBLFNBQUtILE9BQUwsR0FBZUMsQ0FBQyxDQUFDRCxPQUFqQjtBQUNEOztBQUVESSxFQUFBQSxLQUFLLENBQUNDLFFBQUQsRUFBVztBQUNkLFVBQU1GLElBQUksR0FBRyxLQUFLQSxJQUFsQjtBQUNBLFVBQU1ILE9BQU8sR0FBRyxLQUFLQSxPQUFyQjtBQUNBLFVBQU1NLEdBQUcsR0FBRyxLQUFLQSxHQUFqQjs7QUFFQSxRQUFJLENBQUNELFFBQVEsQ0FBQ0UsS0FBZCxFQUFxQjtBQUFDQyxNQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSxlQUFaO0FBQTZCO0FBQU87O0FBRTFESixJQUFBQSxRQUFRLENBQUNFLEtBQVQsQ0FBZUcsZUFBZixDQUErQkMsR0FBL0IsQ0FBb0Msc0JBQXBDLEVBQTREQyxXQUFELElBQWlCO0FBQzFFZixNQUFBQSxDQUFDLENBQUNnQixJQUFGLENBQU9QLEdBQVAsRUFBYSxzQkFBYjs7QUFDQVQsTUFBQUEsQ0FBQyxDQUFDaUIsZ0JBQUYsQ0FBbUJULFFBQW5CLEVBQTZCTyxXQUE3QixFQUEwQ1QsSUFBMUMsRUFBZ0RILE9BQWhEOztBQUNBLFVBQUlHLElBQUksQ0FBQ1ksWUFBTCxDQUFrQkMsTUFBbEIsR0FBMkIsQ0FBL0IsRUFBa0M7QUFDaENKLFFBQUFBLFdBQVcsQ0FBQ0ssTUFBWixDQUFtQkMsSUFBbkIsQ0FBeUIsSUFBSUMsS0FBSixDQUFVaEIsSUFBSSxDQUFDWSxZQUFMLENBQWtCSyxJQUFsQixDQUF1QixFQUF2QixDQUFWLENBQXpCO0FBQ0E7QUFDRDtBQUNGLEtBUEQ7QUFTQWYsSUFBQUEsUUFBUSxDQUFDRSxLQUFULENBQWVLLFdBQWYsQ0FBMkJELEdBQTNCLENBQWdDLGlCQUFoQyxFQUFtREMsV0FBRCxJQUFpQjtBQUNqRWYsTUFBQUEsQ0FBQyxDQUFDZ0IsSUFBRixDQUFPUCxHQUFQLEVBQWEsa0JBQWI7O0FBQ0FULE1BQUFBLENBQUMsQ0FBQ3dCLFlBQUYsQ0FBZWhCLFFBQWYsRUFBeUJPLFdBQXpCLEVBQXNDVCxJQUF0QyxFQUE0Q0gsT0FBNUM7QUFDRCxLQUhEO0FBS0FLLElBQUFBLFFBQVEsQ0FBQ0UsS0FBVCxDQUFlZSxZQUFmLENBQTRCWCxHQUE1QixDQUFnQyxtQkFBaEMsRUFBc0RDLFdBQUQsSUFBaUI7QUFDcEVmLE1BQUFBLENBQUMsQ0FBQ2dCLElBQUYsQ0FBT1AsR0FBUCxFQUFhLG1CQUFiOztBQUNBVCxNQUFBQSxDQUFDLENBQUMwQixhQUFGLENBQWdCbEIsUUFBaEIsRUFBMEJPLFdBQTFCLEVBQXVDVCxJQUF2QyxFQUE2Q0gsT0FBN0M7QUFDRCxLQUhEO0FBS0FLLElBQUFBLFFBQVEsQ0FBQ0UsS0FBVCxDQUFlaUIsSUFBZixDQUFvQkMsUUFBcEIsQ0FBOEIsVUFBOUIsRUFBeUMsQ0FBQ2IsV0FBRCxFQUFjYyxRQUFkLEtBQTJCO0FBQ2xFN0IsTUFBQUEsQ0FBQyxDQUFDZ0IsSUFBRixDQUFPUCxHQUFQLEVBQWEsbUJBQWI7O0FBQ0FULE1BQUFBLENBQUMsQ0FBQzhCLEtBQUYsQ0FBUXRCLFFBQVIsRUFBa0JPLFdBQWxCLEVBQStCVCxJQUEvQixFQUFxQ0gsT0FBckMsRUFBOEMwQixRQUE5QztBQUNELEtBSEQ7QUFLQXJCLElBQUFBLFFBQVEsQ0FBQ0UsS0FBVCxDQUFlcUIsSUFBZixDQUFvQmpCLEdBQXBCLENBQXlCLFVBQXpCLEVBQXFDa0IsS0FBRCxJQUFXO0FBQzdDaEMsTUFBQUEsQ0FBQyxDQUFDZ0IsSUFBRixDQUFPUCxHQUFQLEVBQWEsV0FBYjs7QUFDQVQsTUFBQUEsQ0FBQyxDQUFDaUMsS0FBRixDQUFRRCxLQUFSLEVBQWUxQixJQUFmLEVBQXFCSCxPQUFyQjtBQUNELEtBSEQ7QUFJRDs7QUEzQ21DIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5yZXF1aXJlKCdAYmFiZWwvcG9seWZpbGwnKVxuY29uc3QgcCA9IHJlcXVpcmUoYC4vcGx1Z2luVXRpbGApXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4dFdlYnBhY2tQbHVnaW4ge1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB2YXIgbyA9IHAuX2NvbnN0cnVjdG9yKG9wdGlvbnMpXG4gICAgdGhpcy52YXJzID0gby52YXJzXG4gICAgdGhpcy5vcHRpb25zID0gby5vcHRpb25zXG4gIH1cblxuICBhcHBseShjb21waWxlcikge1xuICAgIGNvbnN0IHZhcnMgPSB0aGlzLnZhcnNcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zXG4gICAgY29uc3QgYXBwID0gdGhpcy5hcHBcblxuICAgIGlmICghY29tcGlsZXIuaG9va3MpIHtjb25zb2xlLmxvZygnbm90IHdlYnBhY2sgNCcpO3JldHVybn1cblxuICAgIGNvbXBpbGVyLmhvb2tzLnRoaXNDb21waWxhdGlvbi50YXAoYGV4dC10aGlzLWNvbXBpbGF0aW9uYCwgKGNvbXBpbGF0aW9uKSA9PiB7XG4gICAgICBwLmxvZ2goYXBwLCBgSE9PSyB0aGlzQ29tcGlsYXRpb25gKVxuICAgICAgcC5fdGhpc0NvbXBpbGF0aW9uKGNvbXBpbGVyLCBjb21waWxhdGlvbiwgdmFycywgb3B0aW9ucylcbiAgICAgIGlmICh2YXJzLnBsdWdpbkVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCBuZXcgRXJyb3IodmFycy5wbHVnaW5FcnJvcnMuam9pbihcIlwiKSkgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29tcGlsZXIuaG9va3MuY29tcGlsYXRpb24udGFwKGBleHQtY29tcGlsYXRpb25gLCAoY29tcGlsYXRpb24pID0+IHtcbiAgICAgIHAubG9naChhcHAsIGBIT09LIGNvbXBpbGF0aW9uYClcbiAgICAgIHAuX2NvbXBpbGF0aW9uKGNvbXBpbGVyLCBjb21waWxhdGlvbiwgdmFycywgb3B0aW9ucylcbiAgICB9KVxuXG4gICAgY29tcGlsZXIuaG9va3MuYWZ0ZXJDb21waWxlLnRhcCgnZXh0LWFmdGVyLWNvbXBpbGUnLCAoY29tcGlsYXRpb24pID0+IHtcbiAgICAgIHAubG9naChhcHAsIGBIT09LIGFmdGVyQ29tcGlsZWApXG4gICAgICBwLl9hZnRlckNvbXBpbGUoY29tcGlsZXIsIGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zKVxuICAgIH0pXG5cbiAgICBjb21waWxlci5ob29rcy5lbWl0LnRhcEFzeW5jKGBleHQtZW1pdGAsIChjb21waWxhdGlvbiwgY2FsbGJhY2spID0+IHtcbiAgICAgIHAubG9naChhcHAsIGBIT09LIGVtaXQgKGFzeW5jKWApXG4gICAgICBwLl9lbWl0KGNvbXBpbGVyLCBjb21waWxhdGlvbiwgdmFycywgb3B0aW9ucywgY2FsbGJhY2spXG4gICAgfSlcblxuICAgIGNvbXBpbGVyLmhvb2tzLmRvbmUudGFwKGBleHQtZG9uZWAsIChzdGF0cykgPT4ge1xuICAgICAgcC5sb2doKGFwcCwgYEhPT0sgZG9uZWApXG4gICAgICBwLl9kb25lKHN0YXRzLCB2YXJzLCBvcHRpb25zKVxuICAgIH0pXG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/packages/ext-react-webpack-plugin/dist/pluginUtil.js b/packages/ext-react-webpack-plugin/dist/pluginUtil.js index d4d30c63..a1d3df22 100644 --- a/packages/ext-react-webpack-plugin/dist/pluginUtil.js +++ b/packages/ext-react-webpack-plugin/dist/pluginUtil.js @@ -4,17 +4,20 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports._constructor = _constructor; +exports._thisCompilation = _thisCompilation; exports._compilation = _compilation; exports._afterCompile = _afterCompile; -exports.emit = emit; +exports._emit = _emit; +exports._done = _done; exports._prepareForBuild = _prepareForBuild; exports._buildExtBundle = _buildExtBundle; -exports._done = _done; -exports.executeAsync = executeAsync; -exports.log = log; -exports.logv = logv; +exports._executeAsync = _executeAsync; +exports._toXtype = _toXtype; exports._getApp = _getApp; exports._getVersions = _getVersions; +exports.log = log; +exports.logh = logh; +exports.logv = logv; function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } @@ -25,204 +28,226 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } //********** -function _constructor(options) { +function _constructor(initialOptions) { const fs = require('fs'); - var thisVars = {}; - var thisOptions = {}; - var plugin = {}; - - if (options.framework == undefined) { - thisVars.pluginErrors = []; - thisVars.pluginErrors.push('webpack config: framework parameter on ext-webpack-plugin is not defined - values: react, angular, extjs'); - plugin.vars = thisVars; - return plugin; - } + var vars = {}; + var options = {}; - const validateOptions = require('schema-utils'); - - validateOptions(require(`./${options.framework}Util`).getValidateOptions(), options, ''); - thisVars = require(`./${options.framework}Util`).getDefaultVars(); - thisVars.framework = options.framework; - - switch (thisVars.framework) { - case 'extjs': - thisVars.pluginName = 'ext-webpack-plugin'; - break; + try { + if (initialOptions.framework == undefined) { + vars.pluginErrors = []; + vars.pluginErrors.push('webpack config: framework parameter on ext-react-webpack-plugin is not defined - values: react, angular, extjs, components'); + var o = {}; + o.vars = vars; + return o; + } - case 'react': - thisVars.pluginName = 'ext-react-webpack-plugin'; - break; + var framework = initialOptions.framework; + var treeshake = initialOptions.treeshake; + var verbose = initialOptions.verbose; + + const validateOptions = require('schema-utils'); + + validateOptions(_getValidateOptions(), initialOptions, ''); + const rc = fs.existsSync(`.ext-${framework}rc`) && JSON.parse(fs.readFileSync(`.ext-${framework}rc`, 'utf-8')) || {}; + options = _objectSpread({}, _getDefaultOptions(), initialOptions, rc); + vars = require(`./${framework}Util`)._getDefaultVars(); + vars.pluginName = 'ext-react-webpack-plugin'; + vars.app = _getApp(); + var pluginName = vars.pluginName; + var app = vars.app; + logv(verbose, 'FUNCTION _constructor'); + logv(verbose, `pluginName - ${pluginName}`); + logv(verbose, `app - ${app}`); + + if (options.environment == 'production') { + vars.production = true; + options.browser = 'no'; + options.watch = 'no'; + } else { + vars.production = false; + } //logv(verbose, `options:`);if (verbose == 'yes') {console.dir(options)} + //logv(verbose, `vars:`);if (verbose == 'yes') {console.dir(vars)} - case 'angular': - thisVars.pluginName = 'ext-angular-webpack-plugin'; - break; - default: - thisVars.pluginName = 'ext-webpack-plugin'; - } + log(app, _getVersions(pluginName, framework)); - thisVars.app = require('./pluginUtil')._getApp(); - logv(options, `pluginName - ${thisVars.pluginName}`); - logv(options, `thisVars.app - ${thisVars.app}`); - const rc = fs.existsSync(`.ext-${thisVars.framework}rc`) && JSON.parse(fs.readFileSync(`.ext-${thisVars.framework}rc`, 'utf-8')) || {}; - thisOptions = _objectSpread({}, require(`./${thisVars.framework}Util`).getDefaultOptions(), options, rc); - logv(options, `thisOptions - ${JSON.stringify(thisOptions)}`); + if (framework == 'react' || framework == 'extjs') { + if (vars.production == true) { + vars.buildstep = '1 of 1'; + log(app, 'Starting Production Build for ' + framework); + } else { + vars.buildstep = '1 of 1'; + log(app, 'Starting development build for ' + framework); + } + } else if (vars.production == true) { + if (treeshake == 'yes') { + vars.buildstep = '1 of 2'; + log(app, 'Starting production build for ' + framework + ' - ' + vars.buildstep); + + require(`./${framework}Util`)._toProd(vars, options); + } else { + vars.buildstep = '2 of 2'; + log(app, 'Continuing production build for ' + framework + ' - ' + vars.buildstep); + } + } else { + vars.buildstep = '1 of 1'; + log(app, 'Starting development build for ' + framework); + } - if (thisOptions.environment == 'production') { - thisVars.production = true; - } else { - thisVars.production = false; + logv(verbose, 'Building for ' + options.environment + ', ' + 'Treeshake is ' + options.treeshake); + var o = {}; + o.vars = vars; + o.options = options; + return o; + } catch (e) { + throw '_constructor: ' + e.toString(); } +} //********** - logv(options, `thisVars - ${JSON.stringify(thisVars)}`); - log(require('./pluginUtil')._getVersions(thisVars.app, thisVars.pluginName, thisVars.framework)); - log(thisVars.app + 'Building for ' + thisOptions.environment); - log(thisVars.app + 'Treeshake is ' + thisOptions.treeshake); - if (thisVars.production == true && thisOptions.treeshake == true && options.framework == 'angular') { - require(`./angularUtil`)._toProd(thisVars, thisOptions); +function _thisCompilation(compiler, compilation, vars, options) { + try { + var app = vars.app; + var verbose = options.verbose; + logv(verbose, 'FUNCTION _thisCompilation'); + logv(verbose, `options.script: ${options.script}`); + logv(verbose, `buildstep: ${vars.buildstep}`); + + if (vars.buildstep == '1 of 1' || vars.buildstep == '1 of 2') { + if (options.script != undefined) { + if (options.script != null) { + if (options.script != '') { + log(app, `Started running ${options.script}`); + runScript(options.script, function (err) { + if (err) throw err; + log(app, `Finished running ${options.script}`); + }); + } + } + } + } + } catch (e) { + throw '_thisCompilation: ' + e.toString(); } - - plugin.vars = thisVars; - plugin.options = thisOptions; - - require('./pluginUtil').logv(options, 'FUNCTION constructor (end)'); - - return plugin; } //********** function _compilation(compiler, compilation, vars, options) { try { - require('./pluginUtil').logv(options, 'FUNCTION _compilation'); + var app = vars.app; + var verbose = options.verbose; + var framework = options.framework; + logv(verbose, 'FUNCTION _compilation'); + + if (framework == 'extjs') { + logv(verbose, 'FUNCTION _compilation end (extjs)'); + return; + } var extComponents = []; - if (vars.production) { - if (options.framework == 'angular' && options.treeshake) { - extComponents = require('./angularUtil')._getAllComponents(vars, options); - } + if (vars.buildstep == '1 of 2') { + extComponents = require(`./${framework}Util`)._getAllComponents(vars, options); + } - compilation.hooks.succeedModule.tap(`ext-succeed-module`, module => { - //require('./pluginUtil').logv(options, 'HOOK succeedModule') - if (module.resource && !module.resource.match(/node_modules/)) { - if (module.resource.match(/\.html$/) != null) { - if (module._source._value.toLowerCase().includes('doctype html') == false) { - vars.deps = [...(vars.deps || []), ...require(`./${vars.framework}Util`).extractFromSource(module, options, compilation, extComponents)]; - } - } else { - vars.deps = [...(vars.deps || []), ...require(`./${vars.framework}Util`).extractFromSource(module, options, compilation, extComponents)]; + compilation.hooks.succeedModule.tap(`ext-succeed-module`, module => { + if (module.resource && !module.resource.match(/node_modules/)) { + if (module.resource.match(/\.html$/) != null) { + if (module._source._value.toLowerCase().includes('doctype html') == false) { + vars.deps = [...(vars.deps || []), ...require(`./${framework}Util`)._extractFromSource(module, options, compilation, extComponents)]; } - } // if (extComponents.length && module.resource && (module.resource.match(/\.(j|t)sx?$/) || - // options.framework == 'angular' && module.resource.match(/\.html$/)) && - // !module.resource.match(/node_modules/) && !module.resource.match(`/ext-{$options.framework}/build/`)) { - // vars.deps = [...(vars.deps || []), ...require(`./${vars.framework}Util`).extractFromSource(module, options, compilation, extComponents)] - // } + } else { + vars.deps = [...(vars.deps || []), ...require(`./${framework}Util`)._extractFromSource(module, options, compilation, extComponents)]; + } + } + }); + if (vars.buildstep == '1 of 2') { + compilation.hooks.finishModules.tap(`ext-finish-modules`, modules => { + require(`./${framework}Util`)._writeFilesToProdFolder(vars, options); }); - - if (options.framework == 'angular' && options.treeshake == true) { - compilation.hooks.finishModules.tap(`ext-finish-modules`, modules => { - require('./pluginUtil').logv(options, 'HOOK finishModules'); - - require('./angularUtil')._writeFilesToProdFolder(vars, options); - }); - } } - if (options.framework == 'angular' && options.treeshake == false || options.framework == 'react') { + if (vars.buildstep == '1 of 1' || vars.buildstep == '2 of 2') { compilation.hooks.htmlWebpackPluginBeforeHtmlGeneration.tap(`ext-html-generation`, data => { - logv(options, 'HOOK ext-html-generation'); - - const path = require('path'); //var outputPath = '' - // if (compiler.options.devServer) { - // if (compiler.outputPath === '/') { - // outputPath = path.join(compiler.options.devServer.contentBase, outputPath) - // } - // else { - // if (compiler.options.devServer.contentBase == undefined) { - // outputPath = 'build' - // } - // else { - // outputPath = '' - // } - // } - // } - // else { - // outputPath = 'build' - // } - // outputPath = outputPath.replace(process.cwd(), '').trim() - //var jsPath = path.join(outputPath, vars.extPath, 'ext.js') - //var cssPath = path.join(outputPath, vars.extPath, 'ext.css') - + const path = require('path'); var jsPath = path.join(vars.extPath, 'ext.js'); var cssPath = path.join(vars.extPath, 'ext.css'); data.assets.js.unshift(jsPath); data.assets.css.unshift(cssPath); - log(vars.app + `Adding ${jsPath} and ${cssPath} to index.html`); + log(app, `Adding ${jsPath} and ${cssPath} to index.html`); }); - } else { - logv(options, 'skipped HOOK ext-html-generation'); } } catch (e) { - require('./pluginUtil').logv(options, e); - - compilation.errors.push('_compilation: ' + e); + throw '_compilation: ' + e.toString(); // logv(options.verbose,e) + // compilation.errors.push('_compilation: ' + e) } } //********** function _afterCompile(compiler, compilation, vars, options) { - require('./pluginUtil').logv(options, 'FUNCTION _afterCompile'); + try { + var app = vars.app; + var verbose = options.verbose; + var framework = options.framework; + logv(verbose, 'FUNCTION _afterCompile'); + + if (framework == 'extjs') { + require(`./extjsUtil`)._afterCompile(compilation, vars, options); + } else { + logv(verbose, 'FUNCTION _afterCompile not run'); + } + } catch (e) { + throw '_afterCompile: ' + e.toString(); + } } //********** -function emit(_x, _x2, _x3, _x4, _x5) { - return _emit.apply(this, arguments); +function _emit(_x, _x2, _x3, _x4, _x5) { + return _emit2.apply(this, arguments); } //********** -function _emit() { - _emit = _asyncToGenerator( +function _emit2() { + _emit2 = _asyncToGenerator( /*#__PURE__*/ regeneratorRuntime.mark(function _callee(compiler, compilation, vars, options, callback) { - var log, logv, app, framework, path, _buildExtBundle, outputPath, command, parms; - + var path, app, verbose, emit, framework, outputPath, command, parms; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.prev = 0; - log = require('./pluginUtil').log; - logv = require('./pluginUtil').logv; - logv(options, 'FUNCTION emit'); - app = vars.app; - framework = vars.framework; path = require('path'); - _buildExtBundle = require('./pluginUtil')._buildExtBundle; - outputPath = path.join(compiler.outputPath, vars.extPath); + app = vars.app; + verbose = options.verbose; + emit = options.emit; + framework = options.framework; + logv(verbose, 'FUNCTION _emit'); - if (compiler.outputPath === '/' && compiler.options.devServer) { - outputPath = path.join(compiler.options.devServer.contentBase, outputPath); + if (!(emit == 'yes')) { + _context.next = 33; + break; } - logv(options, 'outputPath: ' + outputPath); - logv(options, 'framework: ' + framework); - - if (!(options.emit == true)) { + if (!(vars.buildstep == '1 of 1' || vars.buildstep == '1 of 2')) { _context.next = 29; break; } + outputPath = path.join(compiler.outputPath, vars.extPath); + + if (compiler.outputPath === '/' && compiler.options.devServer) { + outputPath = path.join(compiler.options.devServer.contentBase, outputPath); + } + + logv(verbose, 'outputPath: ' + outputPath); + logv(verbose, 'framework: ' + framework); + if (framework != 'extjs') { _prepareForBuild(app, vars, options, outputPath, compilation); - } else { - if (options.framework == 'angular' && options.treeshake == false) { - require(`./${framework}Util`)._prepareForBuild(app, vars, options, outputPath, compilation); - } else { - require(`./${framework}Util`)._prepareForBuild(app, vars, options, outputPath, compilation); - } } command = ''; @@ -260,7 +285,7 @@ function _emit() { } _context.next = 22; - return _buildExtBundle(app, compilation, outputPath, parms, options); + return _buildExtBundle(app, compilation, outputPath, parms, vars, options); case 22: vars.watchStarted = true; @@ -278,34 +303,100 @@ function _emit() { break; case 29: - log(`${vars.app}FUNCTION emit not run`); + logv(verbose, 'NOT running emit'); callback(); case 31: - _context.next = 38; + _context.next = 35; break; case 33: - _context.prev = 33; - _context.t0 = _context["catch"](0); + logv(verbose, 'emit is no'); + callback(); - require('./pluginUtil').logv(options, _context.t0); + case 35: + _context.next = 41; + break; - compilation.errors.push('emit: ' + _context.t0); + case 37: + _context.prev = 37; + _context.t0 = _context["catch"](0); callback(); + throw '_emit: ' + _context.t0.toString(); - case 38: + case 41: case "end": return _context.stop(); } - }, _callee, this, [[0, 33]]); + }, _callee, this, [[0, 37]]); })); - return _emit.apply(this, arguments); + return _emit2.apply(this, arguments); } +function _done(stats, vars, options) { + try { + var verbose = options.verbose; + var framework = options.framework; + logv(verbose, 'FUNCTION _done'); + + if (stats.compilation.errors && stats.compilation.errors.length) // && process.argv.indexOf('--watch') == -1) + { + var chalk = require('chalk'); + + console.log(chalk.red('******************************************')); + console.log(stats.compilation.errors[0]); + console.log(chalk.red('******************************************')); + process.exit(0); + } //mjg refactor + + + if (vars.production == true && options.treeshake == 'no' && framework == 'angular') { + require(`./${options.framework}Util`)._toDev(vars, options); + } + + try { + if (options.browser == 'yes' && options.watch == 'yes' && vars.production == false) { + if (vars.browserCount == 0) { + var url = 'http://localhost:' + options.port; + + require('./pluginUtil').log(vars.app, `Opening browser at ${url}`); + + vars.browserCount++; + + const opn = require('opn'); + + opn(url); + } + } + } catch (e) { + console.log(e); + } + + if (vars.buildstep == '1 of 1') { + if (vars.production == true) { + require('./pluginUtil').log(vars.app, `Ending production build`); + } else { + require('./pluginUtil').log(vars.app, `Ending development build`); + } + } + + if (vars.buildstep == '2 of 2') { + require('./pluginUtil').log(vars.app, `Ending production build`); + } + } catch (e) { + // require('./pluginUtil').logv(options.verbose,e) + throw '_done: ' + e.toString(); + } +} //********** + + function _prepareForBuild(app, vars, options, output, compilation) { try { - logv(options, 'FUNCTION _prepareForBuild'); + var verbose = options.verbose; + var packages = options.packages; + var toolkit = options.toolkit; + var theme = options.theme; + logv(verbose, 'FUNCTION _prepareForBuild'); const rimraf = require('rimraf'); @@ -317,11 +408,8 @@ function _prepareForBuild(app, vars, options, output, compilation) { const path = require('path'); - var packages = options.packages; - var toolkit = options.toolkit; - var theme = options.theme; theme = theme || (toolkit === 'classic' ? 'theme-triton' : 'theme-material'); - logv(options, 'firstTime: ' + vars.firstTime); + logv(verbose, 'firstTime: ' + vars.firstTime); if (vars.firstTime) { rimraf.sync(output); @@ -345,28 +433,28 @@ function _prepareForBuild(app, vars, options, output, compilation) { var fromPath = path.join(process.cwd(), `ext-${framework}/ux/`); var toPath = path.join(output, 'ux'); fsx.copySync(fromPath, toPath); - log(app + 'Copying (ux) ' + fromPath.replace(process.cwd(), '') + ' to: ' + toPath.replace(process.cwd(), '')); + log(app, 'Copying (ux) ' + fromPath.replace(process.cwd(), '') + ' to: ' + toPath.replace(process.cwd(), '')); } if (fs.existsSync(path.join(process.cwd(), `ext-${framework}/packages/`))) { var fromPath = path.join(process.cwd(), `ext-${framework}/packages/`); var toPath = path.join(output, 'packages'); fsx.copySync(fromPath, toPath); - log(app + 'Copying ' + fromPath.replace(process.cwd(), '') + ' to: ' + toPath.replace(process.cwd(), '')); + log(app, 'Copying ' + fromPath.replace(process.cwd(), '') + ' to: ' + toPath.replace(process.cwd(), '')); } if (fs.existsSync(path.join(process.cwd(), `ext-${framework}/overrides/`))) { var fromPath = path.join(process.cwd(), `ext-${framework}/overrides/`); var toPath = path.join(output, 'overrides'); fsx.copySync(fromPath, toPath); - log(app + 'Copying ' + fromPath.replace(process.cwd(), '') + ' to: ' + toPath.replace(process.cwd(), '')); + log(app, 'Copying ' + fromPath.replace(process.cwd(), '') + ' to: ' + toPath.replace(process.cwd(), '')); } if (fs.existsSync(path.join(process.cwd(), 'resources/'))) { var fromResources = path.join(process.cwd(), 'resources/'); var toResources = path.join(output, '../resources'); fsx.copySync(fromResources, toResources); - log(app + 'Copying ' + fromResources.replace(process.cwd(), '') + ' to: ' + toResources.replace(process.cwd(), '')); + log(app, 'Copying ' + fromResources.replace(process.cwd(), '') + ' to: ' + toResources.replace(process.cwd(), '')); } } @@ -376,7 +464,7 @@ function _prepareForBuild(app, vars, options, output, compilation) { if (vars.production) { js = vars.deps.join(';\n'); } else { - js = 'Ext.require("Ext.*")'; + js = 'Ext.require(["Ext.*","Ext.data.TreeStore"])'; } if (vars.manifest === null || js !== vars.manifest) { @@ -390,132 +478,98 @@ function _prepareForBuild(app, vars, options, output, compilation) { bundleDir = './'; } - log(app + 'Building Ext bundle at: ' + bundleDir); + log(app, 'Building Ext bundle at: ' + bundleDir); } else { vars.rebuild = false; - log(app + 'Ext rebuild NOT needed'); + log(app, 'Ext rebuild NOT needed'); } } catch (e) { - require('./pluginUtil').logv(options, e); + require('./pluginUtil').logv(options.verbose, e); compilation.errors.push('_prepareForBuild: ' + e); } } //********** -function _buildExtBundle(app, compilation, outputPath, parms, options) { - try { - const fs = require('fs'); - - const logv = require('./pluginUtil').logv; +function _buildExtBundle(app, compilation, outputPath, parms, vars, options) { + // try { + var verbose = options.verbose; - logv(options, 'FUNCTION _buildExtBundle'); - let sencha; - - try { - sencha = require('@sencha/cmd'); - } catch (e) { - sencha = 'sencha'; - } + const fs = require('fs'); - if (fs.existsSync(sencha)) { - logv(options, 'sencha folder exists'); - } else { - logv(options, 'sencha folder DOES NOT exist'); - } + logv(verbose, 'FUNCTION _buildExtBundle'); + let sencha; - return new Promise((resolve, reject) => { - const onBuildDone = () => { - logv(options, 'onBuildDone'); - resolve(); - }; - - var opts = { - cwd: outputPath, - silent: true, - stdio: 'pipe', - encoding: 'utf-8' - }; - executeAsync(app, sencha, parms, opts, compilation, options).then(function () { - onBuildDone(); - }, function (reason) { - reject(reason); - }); - }); + try { + sencha = require('@sencha/cmd'); } catch (e) { - console.log('e'); - - require('./pluginUtil').logv(options, e); - - compilation.errors.push('_buildExtBundle: ' + e); - callback(); + sencha = 'sencha'; } -} //********** - - -function _done(vars, options) { - try { - const log = require('./pluginUtil').log; - - const logv = require('./pluginUtil').logv; - - logv(options, 'FUNCTION _done'); - - if (vars.production == true && options.treeshake == false && options.framework == 'angular') { - require(`./${options.framework}Util`)._toDev(vars, options); - } - try { - if (options.browser == true && options.watch == 'yes' && vars.production == false) { - if (vars.browserCount == 0) { - var url = 'http://localhost:' + options.port; - - require('./pluginUtil').log(vars.app + `Opening browser at ${url}`); + if (fs.existsSync(sencha)) { + logv(verbose, 'sencha folder exists'); + } else { + logv(verbose, 'sencha folder DOES NOT exist'); + } - vars.browserCount++; + return new Promise((resolve, reject) => { + const onBuildDone = () => { + logv(verbose, 'onBuildDone'); + resolve(); + }; + + var opts = { + cwd: outputPath, + silent: true, + stdio: 'pipe', + encoding: 'utf-8' + }; + + _executeAsync(app, sencha, parms, opts, compilation, vars, options).then(function () { + onBuildDone(); + }, function (reason) { + reject(reason); + }); + }); // } + // catch(e) { + // console.log('e') + // require('./pluginUtil').logv(options.verbose,e) + // compilation.errors.push('_buildExtBundle: ' + e) + // callback() + // } +} //********** - const opn = require('opn'); - opn(url); - } - } - } catch (e) { - console.log(e); //compilation.errors.push('show browser window - ext-done: ' + e) - } - } catch (e) { - require('./pluginUtil').logv(options, e); - } +function _executeAsync(_x6, _x7, _x8, _x9, _x10, _x11, _x12) { + return _executeAsync2.apply(this, arguments); } //********** -function executeAsync(_x6, _x7, _x8, _x9, _x10, _x11) { - return _executeAsync.apply(this, arguments); -} - -function _executeAsync() { - _executeAsync = _asyncToGenerator( +function _executeAsync2() { + _executeAsync2 = _asyncToGenerator( /*#__PURE__*/ - regeneratorRuntime.mark(function _callee2(app, command, parms, opts, compilation, options) { - var DEFAULT_SUBSTRS, substrings, chalk, crossSpawn, log; + regeneratorRuntime.mark(function _callee2(app, command, parms, opts, compilation, vars, options) { + var verbose, framework, DEFAULT_SUBSTRS, substrings, chalk, crossSpawn; return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: - _context2.prev = 0; - //const DEFAULT_SUBSTRS = ['[INF] Loading', '[INF] Processing', '[LOG] Fashion build complete', '[ERR]', '[WRN]', "[INF] Server", "[INF] Writing", "[INF] Loading Build", "[INF] Waiting", "[LOG] Fashion waiting"]; + // try { + verbose = options.verbose; + framework = options.framework; //const DEFAULT_SUBSTRS = ['[INF] Loading', '[INF] Processing', '[LOG] Fashion build complete', '[ERR]', '[WRN]', "[INF] Server", "[INF] Writing", "[INF] Loading Build", "[INF] Waiting", "[LOG] Fashion waiting"]; + DEFAULT_SUBSTRS = ["[INF] xServer", '[INF] Loading', '[INF] Append', '[INF] Processing', '[INF] Processing Build', '[LOG] Fashion build complete', '[ERR]', '[WRN]', "[INF] Writing", "[INF] Loading Build", "[INF] Waiting", "[LOG] Fashion waiting"]; substrings = DEFAULT_SUBSTRS; chalk = require('chalk'); crossSpawn = require('cross-spawn'); - log = require('./pluginUtil').log; - logv(options, 'FUNCTION executeAsync'); + logv(verbose, 'FUNCTION _executeAsync'); _context2.next = 9; return new Promise((resolve, reject) => { - logv(options, `command - ${command}`); - logv(options, `parms - ${parms}`); - logv(options, `opts - ${JSON.stringify(opts)}`); + logv(verbose, `command - ${command}`); + logv(verbose, `parms - ${parms}`); + logv(verbose, `opts - ${JSON.stringify(opts)}`); let child = crossSpawn(command, parms, opts); child.on('close', (code, signal) => { - logv(options, `on close: ` + code); + logv(verbose, `on close: ` + code); if (code === 0) { resolve(0); @@ -525,25 +579,26 @@ function _executeAsync() { } }); child.on('error', error => { - logv(options, `on error`); + logv(verbose, `on error`); compilation.errors.push(error); resolve(0); }); child.stdout.on('data', data => { var str = data.toString().replace(/\r?\n|\r/g, " ").trim(); - logv(options, `${str}`); + logv(verbose, `${str}`); if (data && data.toString().match(/Fashion waiting for changes\.\.\./)) { const fs = require('fs'); - var filename = process.cwd() + '/src/index.jsx'; + var filename = process.cwd() + vars.touchFile; try { + var d = new Date().toLocaleString(); var data = fs.readFileSync(filename); - fs.writeFileSync(filename, data + ' ', 'utf8'); - log(options, `touching ${filename}`); + fs.writeFileSync(filename, '//' + d, 'utf8'); + log(app, `touching ${filename}`); } catch (e) { - log(options, `NOT touching ${filename}`); + log(app, `NOT touching ${filename}`); } resolve(0); @@ -560,7 +615,7 @@ function _executeAsync() { str = str.replace("[ERR]", `${chalk.red("[ERR]")}`); } - log(`${app}${str}`); + log(app, str); } } }); @@ -577,50 +632,40 @@ function _executeAsync() { }); case 9: - _context2.next = 16; - break; - - case 11: - _context2.prev = 11; - _context2.t0 = _context2["catch"](0); - - require('./pluginUtil').logv(options, _context2.t0); - - compilation.errors.push('executeAsync: ' + _context2.t0); - callback(); - - case 16: case "end": return _context2.stop(); } - }, _callee2, this, [[0, 11]]); + }, _callee2, this); })); - return _executeAsync.apply(this, arguments); + return _executeAsync2.apply(this, arguments); } -function log(s) { - require('readline').cursorTo(process.stdout, 0); +function runScript(scriptPath, callback) { + var childProcess = require('child_process'); // keep track of whether callback has been invoked to prevent multiple invocations - try { - process.stdout.clearLine(); - } catch (e) {} - process.stdout.write(s); - process.stdout.write('\n'); -} + var invoked = false; + var process = childProcess.fork(scriptPath); // listen for errors as they may prevent the exit event from firing -function logv(options, s) { - if (options.verbose == 'yes') { - require('readline').cursorTo(process.stdout, 0); + process.on('error', function (err) { + if (invoked) return; + invoked = true; + callback(err); + }); // execute the callback once the process has finished running - try { - process.stdout.clearLine(); - } catch (e) {} + process.on('exit', function (code) { + if (invoked) return; + invoked = true; + var err = code === 0 ? null : new Error('exit code ' + code); + callback(err); + }); +} //********** + + +function _toXtype(str) { + return str.toLowerCase().replace(/_/g, '-'); +} //********** - process.stdout.write(`-verbose: ${s}`); - process.stdout.write('\n'); - } -} function _getApp() { var chalk = require('chalk'); @@ -636,9 +681,10 @@ function _getApp() { } return `${chalk.green(prefix)} `; -} +} //********** -function _getVersions(app, pluginName, frameworkName) { + +function _getVersions(pluginName, frameworkName) { const path = require('path'); const fs = require('fs'); @@ -693,6 +739,123 @@ function _getVersions(app, pluginName, frameworkName) { frameworkInfo = ', ' + frameworkName + ' v' + v.frameworkVersion; } - return app + 'ext-webpack-plugin v' + v.pluginVersion + ', Ext JS v' + v.extVersion + ' ' + v.edition + ' Edition, Sencha Cmd v' + v.cmdVersion + ', webpack v' + v.webpackVersion + frameworkInfo; + return 'ext-react-webpack-plugin v' + v.pluginVersion + ', Ext JS v' + v.extVersion + ' ' + v.edition + ' Edition, Sencha Cmd v' + v.cmdVersion + ', webpack v' + v.webpackVersion + frameworkInfo; +} //********** + + +function log(app, message) { + var s = app + message; + + require('readline').cursorTo(process.stdout, 0); + + try { + process.stdout.clearLine(); + } catch (e) {} + + process.stdout.write(s); + process.stdout.write('\n'); +} //********** + + +function logh(app, message) { + var h = false; + var s = app + message; + + if (h == true) { + require('readline').cursorTo(process.stdout, 0); + + try { + process.stdout.clearLine(); + } catch (e) {} + + process.stdout.write(s); + process.stdout.write('\n'); + } +} //********** + + +function logv(verbose, s) { + if (verbose == 'yes') { + require('readline').cursorTo(process.stdout, 0); + + try { + process.stdout.clearLine(); + } catch (e) {} + + process.stdout.write(`-verbose: ${s}`); + process.stdout.write('\n'); + } +} + +function _getValidateOptions() { + return { + "type": "object", + "properties": { + "framework": { + "type": ["string"] + }, + "toolkit": { + "type": ["string"] + }, + "theme": { + "type": ["string"] + }, + "emit": { + "errorMessage": "should be 'yes' or 'no' string value (NOT true or false)", + "type": ["string"] + }, + "script": { + "type": ["string"] + }, + "port": { + "type": ["integer"] + }, + "packages": { + "type": ["string", "array"] + }, + "profile": { + "type": ["string"] + }, + "environment": { + "errorMessage": "should be 'development' or 'production' string value", + "type": ["string"] + }, + "treeshake": { + "errorMessage": "should be 'yes' or 'no' string value (NOT true or false)", + "type": ["string"] + }, + "browser": { + "errorMessage": "should be 'yes' or 'no' string value (NOT true or false)", + "type": ["string"] + }, + "watch": { + "errorMessage": "should be 'yes' or 'no' string value (NOT true or false)", + "type": ["string"] + }, + "verbose": { + "errorMessage": "should be 'yes' or 'no' string value (NOT true or false)", + "type": ["string"] + } + }, + "additionalProperties": false + }; +} + +function _getDefaultOptions() { + return { + framework: 'extjs', + toolkit: 'modern', + theme: 'theme-material', + emit: 'yes', + script: null, + port: 1962, + packages: [], + profile: '', + environment: 'development', + treeshake: 'no', + browser: 'yes', + watch: 'yes', + verbose: 'no' + }; } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wbHVnaW5VdGlsLmpzIl0sIm5hbWVzIjpbIl9jb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJmcyIsInJlcXVpcmUiLCJ0aGlzVmFycyIsInRoaXNPcHRpb25zIiwicGx1Z2luIiwiZnJhbWV3b3JrIiwidW5kZWZpbmVkIiwicGx1Z2luRXJyb3JzIiwicHVzaCIsInZhcnMiLCJ2YWxpZGF0ZU9wdGlvbnMiLCJnZXRWYWxpZGF0ZU9wdGlvbnMiLCJnZXREZWZhdWx0VmFycyIsInBsdWdpbk5hbWUiLCJhcHAiLCJfZ2V0QXBwIiwibG9ndiIsInJjIiwiZXhpc3RzU3luYyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsImdldERlZmF1bHRPcHRpb25zIiwic3RyaW5naWZ5IiwiZW52aXJvbm1lbnQiLCJwcm9kdWN0aW9uIiwibG9nIiwiX2dldFZlcnNpb25zIiwidHJlZXNoYWtlIiwiX3RvUHJvZCIsIl9jb21waWxhdGlvbiIsImNvbXBpbGVyIiwiY29tcGlsYXRpb24iLCJleHRDb21wb25lbnRzIiwiX2dldEFsbENvbXBvbmVudHMiLCJob29rcyIsInN1Y2NlZWRNb2R1bGUiLCJ0YXAiLCJtb2R1bGUiLCJyZXNvdXJjZSIsIm1hdGNoIiwiX3NvdXJjZSIsIl92YWx1ZSIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJkZXBzIiwiZXh0cmFjdEZyb21Tb3VyY2UiLCJmaW5pc2hNb2R1bGVzIiwibW9kdWxlcyIsIl93cml0ZUZpbGVzVG9Qcm9kRm9sZGVyIiwiaHRtbFdlYnBhY2tQbHVnaW5CZWZvcmVIdG1sR2VuZXJhdGlvbiIsImRhdGEiLCJwYXRoIiwianNQYXRoIiwiam9pbiIsImV4dFBhdGgiLCJjc3NQYXRoIiwiYXNzZXRzIiwianMiLCJ1bnNoaWZ0IiwiY3NzIiwiZSIsImVycm9ycyIsIl9hZnRlckNvbXBpbGUiLCJlbWl0IiwiY2FsbGJhY2siLCJfYnVpbGRFeHRCdW5kbGUiLCJvdXRwdXRQYXRoIiwiZGV2U2VydmVyIiwiY29udGVudEJhc2UiLCJfcHJlcGFyZUZvckJ1aWxkIiwiY29tbWFuZCIsIndhdGNoIiwicmVidWlsZCIsInBhcm1zIiwicHJvZmlsZSIsIndhdGNoU3RhcnRlZCIsIm91dHB1dCIsInJpbXJhZiIsIm1rZGlycCIsImZzeCIsInBhY2thZ2VzIiwidG9vbGtpdCIsInRoZW1lIiwiZmlyc3RUaW1lIiwic3luYyIsImJ1aWxkWE1MIiwiY3JlYXRlQXBwSnNvbiIsImNyZWF0ZVdvcmtzcGFjZUpzb24iLCJjcmVhdGVKU0RPTUVudmlyb25tZW50Iiwid3JpdGVGaWxlU3luYyIsInByb2Nlc3MiLCJjd2QiLCJmcm9tUGF0aCIsInRvUGF0aCIsImNvcHlTeW5jIiwicmVwbGFjZSIsImZyb21SZXNvdXJjZXMiLCJ0b1Jlc291cmNlcyIsIm1hbmlmZXN0IiwiYnVuZGxlRGlyIiwidHJpbSIsInNlbmNoYSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib25CdWlsZERvbmUiLCJvcHRzIiwic2lsZW50Iiwic3RkaW8iLCJlbmNvZGluZyIsImV4ZWN1dGVBc3luYyIsInRoZW4iLCJyZWFzb24iLCJjb25zb2xlIiwiX2RvbmUiLCJfdG9EZXYiLCJicm93c2VyIiwiYnJvd3NlckNvdW50IiwidXJsIiwicG9ydCIsIm9wbiIsIkRFRkFVTFRfU1VCU1RSUyIsInN1YnN0cmluZ3MiLCJjaGFsayIsImNyb3NzU3Bhd24iLCJjaGlsZCIsIm9uIiwiY29kZSIsInNpZ25hbCIsIkVycm9yIiwiZXJyb3IiLCJzdGRvdXQiLCJzdHIiLCJ0b1N0cmluZyIsImZpbGVuYW1lIiwic29tZSIsInYiLCJpbmRleE9mIiwicmVkIiwic3RkZXJyIiwic3RySmF2YU9wdHMiLCJzIiwiY3Vyc29yVG8iLCJjbGVhckxpbmUiLCJ3cml0ZSIsInZlcmJvc2UiLCJwcmVmaXgiLCJwbGF0Zm9ybSIsImdyZWVuIiwiZnJhbWV3b3JrTmFtZSIsInBsdWdpblBhdGgiLCJwbHVnaW5Qa2ciLCJwbHVnaW5WZXJzaW9uIiwidmVyc2lvbiIsIl9yZXNvbHZlZCIsImVkaXRpb24iLCJ3ZWJwYWNrUGF0aCIsIndlYnBhY2tQa2ciLCJ3ZWJwYWNrVmVyc2lvbiIsImV4dFBrZyIsImV4dFZlcnNpb24iLCJjbWRQYXRoIiwiY21kUGtnIiwiY21kVmVyc2lvbiIsInZlcnNpb25fZnVsbCIsImZyYW1ld29ya0luZm8iLCJmcmFtZXdvcmtQYXRoIiwiZnJhbWV3b3JrUGtnIiwiZnJhbWV3b3JrVmVyc2lvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNPLFNBQVNBLFlBQVQsQ0FBc0JDLE9BQXRCLEVBQStCO0FBQ3BDLFFBQU1DLEVBQUUsR0FBR0MsT0FBTyxDQUFDLElBQUQsQ0FBbEI7O0FBRUEsTUFBSUMsUUFBUSxHQUFHLEVBQWY7QUFDQSxNQUFJQyxXQUFXLEdBQUcsRUFBbEI7QUFDQSxNQUFJQyxNQUFNLEdBQUcsRUFBYjs7QUFFQSxNQUFJTCxPQUFPLENBQUNNLFNBQVIsSUFBcUJDLFNBQXpCLEVBQW9DO0FBQ2xDSixJQUFBQSxRQUFRLENBQUNLLFlBQVQsR0FBd0IsRUFBeEI7QUFDQUwsSUFBQUEsUUFBUSxDQUFDSyxZQUFULENBQXNCQyxJQUF0QixDQUEyQiwwR0FBM0I7QUFDQUosSUFBQUEsTUFBTSxDQUFDSyxJQUFQLEdBQWNQLFFBQWQ7QUFDQSxXQUFPRSxNQUFQO0FBQ0Q7O0FBRUQsUUFBTU0sZUFBZSxHQUFHVCxPQUFPLENBQUMsY0FBRCxDQUEvQjs7QUFDQVMsRUFBQUEsZUFBZSxDQUFDVCxPQUFPLENBQUUsS0FBSUYsT0FBTyxDQUFDTSxTQUFVLE1BQXhCLENBQVAsQ0FBc0NNLGtCQUF0QyxFQUFELEVBQTZEWixPQUE3RCxFQUFzRSxFQUF0RSxDQUFmO0FBQ0FHLEVBQUFBLFFBQVEsR0FBR0QsT0FBTyxDQUFFLEtBQUlGLE9BQU8sQ0FBQ00sU0FBVSxNQUF4QixDQUFQLENBQXNDTyxjQUF0QyxFQUFYO0FBQ0FWLEVBQUFBLFFBQVEsQ0FBQ0csU0FBVCxHQUFxQk4sT0FBTyxDQUFDTSxTQUE3Qjs7QUFDQSxVQUFP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LEdBQWlHLHdCQUFqRyxHQUE0SG5CLENBQUMsQ0FBQzJCLFVBQTlILEdBQTJJLGFBQTNJLEdBQTJKM0IsQ0FBQyxDQUFDc0IsY0FBN0osR0FBOEtPLGFBQXJMO0FBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIvLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBfY29uc3RydWN0b3Iob3B0aW9ucykge1xuICBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJylcbiBcbiAgdmFyIHRoaXNWYXJzID0ge31cbiAgdmFyIHRoaXNPcHRpb25zID0ge31cbiAgdmFyIHBsdWdpbiA9IHt9XG5cbiAgaWYgKG9wdGlvbnMuZnJhbWV3b3JrID09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNWYXJzLnBsdWdpbkVycm9ycyA9IFtdXG4gICAgdGhpc1ZhcnMucGx1Z2luRXJyb3JzLnB1c2goJ3dlYnBhY2sgY29uZmlnOiBmcmFtZXdvcmsgcGFyYW1ldGVyIG9uIGV4dC13ZWJwYWNrLXBsdWdpbiBpcyBub3QgZGVmaW5lZCAtIHZhbHVlczogcmVhY3QsIGFuZ3VsYXIsIGV4dGpzJylcbiAgICBwbHVnaW4udmFycyA9IHRoaXNWYXJzXG4gICAgcmV0dXJuIHBsdWdpblxuICB9XG5cbiAgY29uc3QgdmFsaWRhdGVPcHRpb25zID0gcmVxdWlyZSgnc2NoZW1hLXV0aWxzJylcbiAgdmFsaWRhdGVPcHRpb25zKHJlcXVpcmUoYC4vJHtvcHRpb25zLmZyYW1ld29ya31VdGlsYCkuZ2V0VmFsaWRhdGVPcHRpb25zKCksIG9wdGlvbnMsICcnKVxuICB0aGlzVmFycyA9IHJlcXVpcmUoYC4vJHtvcHRpb25zLmZyYW1ld29ya31VdGlsYCkuZ2V0RGVmYXVsdFZhcnMoKVxuICB0aGlzVmFycy5mcmFtZXdvcmsgPSBvcHRpb25zLmZyYW1ld29ya1xuICBzd2l0Y2godGhpc1ZhcnMuZnJhbWV3b3JrKSB7XG4gICAgY2FzZSAnZXh0anMnOlxuICAgICAgdGhpc1ZhcnMucGx1Z2luTmFtZSA9ICdleHQtd2VicGFjay1wbHVnaW4nXG4gICAgICBicmVhaztcbiAgICBjYXNlICdyZWFjdCc6XG4gICAgICB0aGlzVmFycy5wbHVnaW5OYW1lID0gJ2V4dC1yZWFjdC13ZWJwYWNrLXBsdWdpbidcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2FuZ3VsYXInOlxuICAgICAgdGhpc1ZhcnMucGx1Z2luTmFtZSA9ICdleHQtYW5ndWxhci13ZWJwYWNrLXBsdWdpbidcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzVmFycy5wbHVnaW5OYW1lID0gJ2V4dC13ZWJwYWNrLXBsdWdpbidcbiAgfVxuXG4gIHRoaXNWYXJzLmFwcCA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLl9nZXRBcHAoKVxuICBsb2d2KG9wdGlvbnMsIGBwbHVnaW5OYW1lIC0gJHt0aGlzVmFycy5wbHVnaW5OYW1lfWApXG4gIGxvZ3Yob3B0aW9ucywgYHRoaXNWYXJzLmFwcCAtICR7dGhpc1ZhcnMuYXBwfWApXG5cbiAgY29uc3QgcmMgPSAoZnMuZXhpc3RzU3luYyhgLmV4dC0ke3RoaXNWYXJzLmZyYW1ld29ya31yY2ApICYmIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGAuZXh0LSR7dGhpc1ZhcnMuZnJhbWV3b3JrfXJjYCwgJ3V0Zi04JykpIHx8IHt9KVxuICB0aGlzT3B0aW9ucyA9IHsgLi4ucmVxdWlyZShgLi8ke3RoaXNWYXJzLmZyYW1ld29ya31VdGlsYCkuZ2V0RGVmYXVsdE9wdGlvbnMoKSwgLi4ub3B0aW9ucywgLi4ucmMgfVxuICBsb2d2KG9wdGlvbnMsIGB0aGlzT3B0aW9ucyAtICR7SlNPTi5zdHJpbmdpZnkodGhpc09wdGlvbnMpfWApXG5cbiAgaWYgKHRoaXNPcHRpb25zLmVudmlyb25tZW50ID09ICdwcm9kdWN0aW9uJykgXG4gICAge3RoaXNWYXJzLnByb2R1Y3Rpb24gPSB0cnVlfVxuICBlbHNlIFxuICAgIHt0aGlzVmFycy5wcm9kdWN0aW9uID0gZmFsc2V9XG4gIGxvZ3Yob3B0aW9ucywgYHRoaXNWYXJzIC0gJHtKU09OLnN0cmluZ2lmeSh0aGlzVmFycyl9YClcblxuICBsb2cocmVxdWlyZSgnLi9wbHVnaW5VdGlsJykuX2dldFZlcnNpb25zKHRoaXNWYXJzLmFwcCwgdGhpc1ZhcnMucGx1Z2luTmFtZSwgdGhpc1ZhcnMuZnJhbWV3b3JrKSlcbiAgbG9nKHRoaXNWYXJzLmFwcCArICdCdWlsZGluZyBmb3IgJyArIHRoaXNPcHRpb25zLmVudmlyb25tZW50KVxuICBsb2codGhpc1ZhcnMuYXBwICsgJ1RyZWVzaGFrZSBpcyAnICsgdGhpc09wdGlvbnMudHJlZXNoYWtlKVxuXG4gIGlmICh0aGlzVmFycy5wcm9kdWN0aW9uID09IHRydWUgJiYgdGhpc09wdGlvbnMudHJlZXNoYWtlID09IHRydWUgJiYgb3B0aW9ucy5mcmFtZXdvcmsgPT0gJ2FuZ3VsYXInKSB7XG4gICAgcmVxdWlyZShgLi9hbmd1bGFyVXRpbGApLl90b1Byb2QodGhpc1ZhcnMsIHRoaXNPcHRpb25zKVxuICB9XG5cbiAgcGx1Z2luLnZhcnMgPSB0aGlzVmFyc1xuICBwbHVnaW4ub3B0aW9ucyA9IHRoaXNPcHRpb25zXG4gIHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3Yob3B0aW9ucywgJ0ZVTkNUSU9OIGNvbnN0cnVjdG9yIChlbmQpJylcbiAgcmV0dXJuIHBsdWdpblxufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBfY29tcGlsYXRpb24oY29tcGlsZXIsIGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndihvcHRpb25zLCAnRlVOQ1RJT04gX2NvbXBpbGF0aW9uJylcblxuICAgIHZhciBleHRDb21wb25lbnRzID0gW11cblxuICAgIGlmICh2YXJzLnByb2R1Y3Rpb24pIHtcbiAgICAgIGlmIChvcHRpb25zLmZyYW1ld29yayA9PSAnYW5ndWxhcicgJiYgb3B0aW9ucy50cmVlc2hha2UpIHtcbiAgICAgICAgZXh0Q29tcG9uZW50cyA9IHJlcXVpcmUoJy4vYW5ndWxhclV0aWwnKS5fZ2V0QWxsQ29tcG9uZW50cyh2YXJzLCBvcHRpb25zKVxuICAgICAgfVxuXG4gICAgICBjb21waWxhdGlvbi5ob29rcy5zdWNjZWVkTW9kdWxlLnRhcChgZXh0LXN1Y2NlZWQtbW9kdWxlYCwgbW9kdWxlID0+IHtcbiAgICAgICAgLy9yZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2KG9wdGlvbnMsICdIT09LIHN1Y2NlZWRNb2R1bGUnKVxuICAgICAgICBpZiAobW9kdWxlLnJlc291cmNlICYmICFtb2R1bGUucmVzb3VyY2UubWF0Y2goL25vZGVfbW9kdWxlcy8pKSB7XG4gICAgICAgICAgaWYobW9kdWxlLnJlc291cmNlLm1hdGNoKC9cXC5odG1sJC8pICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmKG1vZHVsZS5fc291cmNlLl92YWx1ZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdkb2N0eXBlIGh0bWwnKSA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICB2YXJzLmRlcHMgPSBbLi4uKHZhcnMuZGVwcyB8fCBbXSksIC4uLnJlcXVpcmUoYC4vJHt2YXJzLmZyYW1ld29ya31VdGlsYCkuZXh0cmFjdEZyb21Tb3VyY2UobW9kdWxlLCBvcHRpb25zLCBjb21waWxhdGlvbiwgZXh0Q29tcG9uZW50cyldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFycy5kZXBzID0gWy4uLih2YXJzLmRlcHMgfHwgW10pLCAuLi5yZXF1aXJlKGAuLyR7dmFycy5mcmFtZXdvcmt9VXRpbGApLmV4dHJhY3RGcm9tU291cmNlKG1vZHVsZSwgb3B0aW9ucywgY29tcGlsYXRpb24sIGV4dENvbXBvbmVudHMpXVxuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmIChleHRDb21wb25lbnRzLmxlbmd0aCAmJiBtb2R1bGUucmVzb3VyY2UgJiYgKG1vZHVsZS5yZXNvdXJjZS5tYXRjaCgvXFwuKGp8dClzeD8kLykgfHxcbiAgICAgICAgLy8gb3B0aW9ucy5mcmFtZXdvcmsgPT0gJ2FuZ3VsYXInICYmIG1vZHVsZS5yZXNvdXJjZS5tYXRjaCgvXFwuaHRtbCQvKSkgJiZcbiAgICAgICAgLy8gIW1vZHVsZS5yZXNvdXJjZS5tYXRjaCgvbm9kZV9tb2R1bGVzLykgJiYgIW1vZHVsZS5yZXNvdXJjZS5tYXRjaChgL2V4dC17JG9wdGlvbnMuZnJhbWV3b3JrfS9idWlsZC9gKSkge1xuICAgICAgICAvLyAgIHZhcnMuZGVwcyA9IFsuLi4odmFycy5kZXBzIHx8IFtdKSwgLi4ucmVxdWlyZShgLi8ke3ZhcnMuZnJhbWV3b3JrfVV0aWxgKS5leHRyYWN0RnJvbVNvdXJjZShtb2R1bGUsIG9wdGlvbnMsIGNvbXBpbGF0aW9uLCBleHRDb21wb25lbnRzKV1cbiAgICAgICAgLy8gfVxuICAgICAgfSlcblxuICAgICAgaWYgKG9wdGlvbnMuZnJhbWV3b3JrID09ICdhbmd1bGFyJyAmJiBvcHRpb25zLnRyZWVzaGFrZSA9PSB0cnVlKSB7XG4gICAgICAgIGNvbXBpbGF0aW9uLmhvb2tzLmZpbmlzaE1vZHVsZXMudGFwKGBleHQtZmluaXNoLW1vZHVsZXNgLCBtb2R1bGVzID0+IHtcbiAgICAgICAgICByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2KG9wdGlvbnMsICdIT09LIGZpbmlzaE1vZHVsZXMnKVxuICAgICAgICAgIHJlcXVpcmUoJy4vYW5ndWxhclV0aWwnKS5fd3JpdGVGaWxlc1RvUHJvZEZvbGRlcih2YXJzLCBvcHRpb25zKVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKG9wdGlvbnMuZnJhbWV3b3JrID09ICdhbmd1bGFyJyAmJiBvcHRpb25zLnRyZWVzaGFrZSA9PSBmYWxzZSkgfHxcbiAgICAgIChvcHRpb25zLmZyYW1ld29yayA9PSAncmVhY3QnKVxuICAgICkge1xuICAgICAgICBjb21waWxhdGlvbi5ob29rcy5odG1sV2VicGFja1BsdWdpbkJlZm9yZUh0bWxHZW5lcmF0aW9uLnRhcChgZXh0LWh0bWwtZ2VuZXJhdGlvbmAsKGRhdGEpID0+IHtcbiAgICAgICAgbG9ndihvcHRpb25zLCdIT09LIGV4dC1odG1sLWdlbmVyYXRpb24nKVxuICAgICAgICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5cbiAgICAgICAgLy92YXIgb3V0cHV0UGF0aCA9ICcnXG4gICAgICAgIC8vIGlmIChjb21waWxlci5vcHRpb25zLmRldlNlcnZlcikge1xuICAgICAgICAvLyAgIGlmIChjb21waWxlci5vdXRwdXRQYXRoID09PSAnLycpIHtcbiAgICAgICAgLy8gICAgIG91dHB1dFBhdGggPSBwYXRoLmpvaW4oY29tcGlsZXIub3B0aW9ucy5kZXZTZXJ2ZXIuY29udGVudEJhc2UsIG91dHB1dFBhdGgpXG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyAgIGVsc2Uge1xuICAgICAgICAvLyAgICAgaWYgKGNvbXBpbGVyLm9wdGlvbnMuZGV2U2VydmVyLmNvbnRlbnRCYXNlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyAgICAgICBvdXRwdXRQYXRoID0gJ2J1aWxkJ1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgZWxzZSB7XG4gICAgICAgIC8vICAgICAgIG91dHB1dFBhdGggPSAnJ1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBlbHNlIHtcbiAgICAgICAgLy8gICBvdXRwdXRQYXRoID0gJ2J1aWxkJ1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIG91dHB1dFBhdGggPSBvdXRwdXRQYXRoLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpLnRyaW0oKVxuICAgICAgICAvL3ZhciBqc1BhdGggPSBwYXRoLmpvaW4ob3V0cHV0UGF0aCwgdmFycy5leHRQYXRoLCAnZXh0LmpzJylcbiAgICAgICAgLy92YXIgY3NzUGF0aCA9IHBhdGguam9pbihvdXRwdXRQYXRoLCB2YXJzLmV4dFBhdGgsICdleHQuY3NzJylcblxuICAgICAgICB2YXIganNQYXRoID0gcGF0aC5qb2luKHZhcnMuZXh0UGF0aCwgJ2V4dC5qcycpXG4gICAgICAgIHZhciBjc3NQYXRoID0gcGF0aC5qb2luKHZhcnMuZXh0UGF0aCwgJ2V4dC5jc3MnKVxuICAgICAgICBkYXRhLmFzc2V0cy5qcy51bnNoaWZ0KGpzUGF0aClcbiAgICAgICAgZGF0YS5hc3NldHMuY3NzLnVuc2hpZnQoY3NzUGF0aClcbiAgICAgICAgbG9nKHZhcnMuYXBwICsgYEFkZGluZyAke2pzUGF0aH0gYW5kICR7Y3NzUGF0aH0gdG8gaW5kZXguaHRtbGApXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxvZ3Yob3B0aW9ucywnc2tpcHBlZCBIT09LIGV4dC1odG1sLWdlbmVyYXRpb24nKVxuICAgIH1cbiAgfVxuICBjYXRjaChlKSB7XG4gICAgcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndihvcHRpb25zLGUpXG4gICAgY29tcGlsYXRpb24uZXJyb3JzLnB1c2goJ19jb21waWxhdGlvbjogJyArIGUpXG4gIH1cbn1cblxuLy8qKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gX2FmdGVyQ29tcGlsZShjb21waWxlciwgY29tcGlsYXRpb24sIHZhcnMsIG9wdGlvbnMpIHtcbiAgcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndihvcHRpb25zLCAnRlVOQ1RJT04gX2FmdGVyQ29tcGlsZScpXG59XG5cbi8vKioqKioqKioqKlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVtaXQoY29tcGlsZXIsIGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB0cnkge1xuICAgIGNvbnN0IGxvZyA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ1xuICAgIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gICAgbG9ndihvcHRpb25zLCdGVU5DVElPTiBlbWl0JylcbiAgICB2YXIgYXBwID0gdmFycy5hcHBcbiAgICB2YXIgZnJhbWV3b3JrID0gdmFycy5mcmFtZXdvcmtcbiAgICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG4gICAgY29uc3QgX2J1aWxkRXh0QnVuZGxlID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykuX2J1aWxkRXh0QnVuZGxlXG4gICAgbGV0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4oY29tcGlsZXIub3V0cHV0UGF0aCx2YXJzLmV4dFBhdGgpXG4gICAgaWYgKGNvbXBpbGVyLm91dHB1dFBhdGggPT09ICcvJyAmJiBjb21waWxlci5vcHRpb25zLmRldlNlcnZlcikge1xuICAgICAgb3V0cHV0UGF0aCA9IHBhdGguam9pbihjb21waWxlci5vcHRpb25zLmRldlNlcnZlci5jb250ZW50QmFzZSwgb3V0cHV0UGF0aClcbiAgICB9XG4gICAgbG9ndihvcHRpb25zLCdvdXRwdXRQYXRoOiAnICsgb3V0cHV0UGF0aClcbiAgICBsb2d2KG9wdGlvbnMsJ2ZyYW1ld29yazogJyArIGZyYW1ld29yaylcbiAgICBpZiAob3B0aW9ucy5lbWl0ID09IHRydWUpIHtcbiAgICAgIGlmIChmcmFtZXdvcmsgIT0gJ2V4dGpzJykge1xuICAgICAgICBfcHJlcGFyZUZvckJ1aWxkKGFwcCwgdmFycywgb3B0aW9ucywgb3V0cHV0UGF0aCwgY29tcGlsYXRpb24pXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZnJhbWV3b3JrID09ICdhbmd1bGFyJyAmJiBvcHRpb25zLnRyZWVzaGFrZSA9PSBmYWxzZSkge1xuICAgICAgICAgIHJlcXVpcmUoYC4vJHtmcmFtZXdvcmt9VXRpbGApLl9wcmVwYXJlRm9yQnVpbGQoYXBwLCB2YXJzLCBvcHRpb25zLCBvdXRwdXRQYXRoLCBjb21waWxhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXF1aXJlKGAuLyR7ZnJhbWV3b3JrfVV0aWxgKS5fcHJlcGFyZUZvckJ1aWxkKGFwcCwgdmFycywgb3B0aW9ucywgb3V0cHV0UGF0aCwgY29tcGlsYXRpb24pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGNvbW1hbmQgPSAnJ1xuICAgICAgaWYgKG9wdGlvbnMud2F0Y2ggPT0gJ3llcycgJiYgdmFycy5wcm9kdWN0aW9uID09IGZhbHNlKSB7XG4gICAgICAgIGNvbW1hbmQgPSAnd2F0Y2gnXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29tbWFuZCA9ICdidWlsZCdcbiAgICAgIH1cblxuICAgICAgaWYgKHZhcnMucmVidWlsZCA9PSB0cnVlKSB7XG4gICAgICAgIHZhciBwYXJtcyA9IFtdXG4gICAgICAgIGlmIChvcHRpb25zLnByb2ZpbGUgPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMucHJvZmlsZSA9PSAnJyB8fCBvcHRpb25zLnByb2ZpbGUgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChjb21tYW5kID09ICdidWlsZCcpIHtcbiAgICAgICAgICAgIHBhcm1zID0gWydhcHAnLCBjb21tYW5kLCBvcHRpb25zLmVudmlyb25tZW50XVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhcm1zID0gWydhcHAnLCBjb21tYW5kLCAnLS13ZWItc2VydmVyJywgJ2ZhbHNlJywgb3B0aW9ucy5lbnZpcm9ubWVudF1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoY29tbWFuZCA9PSAnYnVpbGQnKSB7XG4gICAgICAgICAgICBwYXJtcyA9IFsnYXBwJywgY29tbWFuZCwgb3B0aW9ucy5wcm9maWxlLCBvcHRpb25zLmVudmlyb25tZW50XVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhcm1zID0gWydhcHAnLCBjb21tYW5kLCAnLS13ZWItc2VydmVyJywgJ2ZhbHNlJywgb3B0aW9ucy5wcm9maWxlLCBvcHRpb25zLmVudmlyb25tZW50XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YXJzLndhdGNoU3RhcnRlZCA9PSBmYWxzZSkge1xuICAgICAgICAgIGF3YWl0IF9idWlsZEV4dEJ1bmRsZShhcHAsIGNvbXBpbGF0aW9uLCBvdXRwdXRQYXRoLCBwYXJtcywgb3B0aW9ucylcbiAgICAgICAgICB2YXJzLndhdGNoU3RhcnRlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbG9nKGAke3ZhcnMuYXBwfUZVTkNUSU9OIGVtaXQgbm90IHJ1bmApXG4gICAgICBjYWxsYmFjaygpXG4gICAgfVxuICB9XG4gIGNhdGNoKGUpIHtcbiAgICByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2KG9wdGlvbnMsZSlcbiAgICBjb21waWxhdGlvbi5lcnJvcnMucHVzaCgnZW1pdDogJyArIGUpXG4gICAgY2FsbGJhY2soKVxuICB9XG59XG5cbi8vKioqKioqKioqKlxuZXhwb3J0IGZ1bmN0aW9uIF9wcmVwYXJlRm9yQnVpbGQoYXBwLCB2YXJzLCBvcHRpb25zLCBvdXRwdXQsIGNvbXBpbGF0aW9uKSB7XG4gIHRyeSB7XG4gICAgbG9ndihvcHRpb25zLCdGVU5DVElPTiBfcHJlcGFyZUZvckJ1aWxkJylcbiAgICBjb25zdCByaW1yYWYgPSByZXF1aXJlKCdyaW1yYWYnKVxuICAgIGNvbnN0IG1rZGlycCA9IHJlcXVpcmUoJ21rZGlycCcpXG4gICAgY29uc3QgZnN4ID0gcmVxdWlyZSgnZnMtZXh0cmEnKVxuICAgIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKVxuICAgIGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcblxuICAgIHZhciBwYWNrYWdlcyA9IG9wdGlvbnMucGFja2FnZXNcbiAgICB2YXIgdG9vbGtpdCA9IG9wdGlvbnMudG9vbGtpdFxuICAgIHZhciB0aGVtZSA9IG9wdGlvbnMudGhlbWVcblxuICAgIHRoZW1lID0gdGhlbWUgfHwgKHRvb2xraXQgPT09ICdjbGFzc2ljJyA/ICd0aGVtZS10cml0b24nIDogJ3RoZW1lLW1hdGVyaWFsJylcbiAgICBsb2d2KG9wdGlvbnMsJ2ZpcnN0VGltZTogJyArIHZhcnMuZmlyc3RUaW1lKVxuICAgIGlmICh2YXJzLmZpcnN0VGltZSkge1xuICAgICAgcmltcmFmLnN5bmMob3V0cHV0KVxuICAgICAgbWtkaXJwLnN5bmMob3V0cHV0KVxuICAgICAgY29uc3QgYnVpbGRYTUwgPSByZXF1aXJlKCcuL2FydGlmYWN0cycpLmJ1aWxkWE1MXG4gICAgICBjb25zdCBjcmVhdGVBcHBKc29uID0gcmVxdWlyZSgnLi9hcnRpZmFjdHMnKS5jcmVhdGVBcHBKc29uXG4gICAgICBjb25zdCBjcmVhdGVXb3Jrc3BhY2VKc29uID0gcmVxdWlyZSgnLi9hcnRpZmFjdHMnKS5jcmVhdGVXb3Jrc3BhY2VKc29uXG4gICAgICBjb25zdCBjcmVhdGVKU0RPTUVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9hcnRpZmFjdHMnKS5jcmVhdGVKU0RPTUVudmlyb25tZW50XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKG91dHB1dCwgJ2J1aWxkLnhtbCcpLCBidWlsZFhNTCh2YXJzLnByb2R1Y3Rpb24sIG9wdGlvbnMsIG91dHB1dCksICd1dGY4JylcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKG91dHB1dCwgJ2FwcC5qc29uJyksIGNyZWF0ZUFwcEpzb24odGhlbWUsIHBhY2thZ2VzLCB0b29sa2l0LCBvcHRpb25zLCBvdXRwdXQpLCAndXRmOCcpXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihvdXRwdXQsICdqc2RvbS1lbnZpcm9ubWVudC5qcycpLCBjcmVhdGVKU0RPTUVudmlyb25tZW50KG9wdGlvbnMsIG91dHB1dCksICd1dGY4JylcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKG91dHB1dCwgJ3dvcmtzcGFjZS5qc29uJyksIGNyZWF0ZVdvcmtzcGFjZUpzb24ob3B0aW9ucywgb3V0cHV0KSwgJ3V0ZjgnKVxuXG4gICAgICB2YXIgZnJhbWV3b3JrID0gdmFycy5mcmFtZXdvcms7XG4gICAgICAvL2JlY2F1c2Ugb2YgYSBwcm9ibGVtIHdpdGggY29sb3JwaWNrZXJcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLGBleHQtJHtmcmFtZXdvcmt9L3V4L2ApKSkge1xuICAgICAgICB2YXIgZnJvbVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgYGV4dC0ke2ZyYW1ld29ya30vdXgvYClcbiAgICAgICAgdmFyIHRvUGF0aCA9IHBhdGguam9pbihvdXRwdXQsICd1eCcpXG4gICAgICAgIGZzeC5jb3B5U3luYyhmcm9tUGF0aCwgdG9QYXRoKVxuICAgICAgICBsb2coYXBwICsgJ0NvcHlpbmcgKHV4KSAnICsgZnJvbVBhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykgKyAnIHRvOiAnICsgdG9QYXRoLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpKVxuICAgICAgfVxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksYGV4dC0ke2ZyYW1ld29ya30vcGFja2FnZXMvYCkpKSB7XG4gICAgICAgIHZhciBmcm9tUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBgZXh0LSR7ZnJhbWV3b3JrfS9wYWNrYWdlcy9gKVxuICAgICAgICB2YXIgdG9QYXRoID0gcGF0aC5qb2luKG91dHB1dCwgJ3BhY2thZ2VzJylcbiAgICAgICAgZnN4LmNvcHlTeW5jKGZyb21QYXRoLCB0b1BhdGgpXG4gICAgICAgIGxvZyhhcHAgKyAnQ29weWluZyAnICsgZnJvbVBhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykgKyAnIHRvOiAnICsgdG9QYXRoLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpKVxuICAgICAgfVxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksYGV4dC0ke2ZyYW1ld29ya30vb3ZlcnJpZGVzL2ApKSkge1xuICAgICAgICB2YXIgZnJvbVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgYGV4dC0ke2ZyYW1ld29ya30vb3ZlcnJpZGVzL2ApXG4gICAgICAgIHZhciB0b1BhdGggPSBwYXRoLmpvaW4ob3V0cHV0LCAnb3ZlcnJpZGVzJylcbiAgICAgICAgZnN4LmNvcHlTeW5jKGZyb21QYXRoLCB0b1BhdGgpXG4gICAgICAgIGxvZyhhcHAgKyAnQ29weWluZyAnICsgZnJvbVBhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykgKyAnIHRvOiAnICsgdG9QYXRoLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpKVxuICAgICAgfVxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksJ3Jlc291cmNlcy8nKSkpIHtcbiAgICAgICAgdmFyIGZyb21SZXNvdXJjZXMgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3Jlc291cmNlcy8nKVxuICAgICAgICB2YXIgdG9SZXNvdXJjZXMgPSBwYXRoLmpvaW4ob3V0cHV0LCAnLi4vcmVzb3VyY2VzJylcbiAgICAgICAgZnN4LmNvcHlTeW5jKGZyb21SZXNvdXJjZXMsIHRvUmVzb3VyY2VzKVxuICAgICAgICBsb2coYXBwICsgJ0NvcHlpbmcgJyArIGZyb21SZXNvdXJjZXMucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykgKyAnIHRvOiAnICsgdG9SZXNvdXJjZXMucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykpXG4gICAgICB9XG4gICAgfVxuICAgIHZhcnMuZmlyc3RUaW1lID0gZmFsc2VcbiAgICB2YXIganMgPSAnJ1xuICAgIGlmICh2YXJzLnByb2R1Y3Rpb24pIHtcbiAgICAgIGpzID0gdmFycy5kZXBzLmpvaW4oJztcXG4nKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBqcyA9ICdFeHQucmVxdWlyZShcIkV4dC4qXCIpJ1xuICAgIH1cbiAgICBpZiAodmFycy5tYW5pZmVzdCA9PT0gbnVsbCB8fCBqcyAhPT0gdmFycy5tYW5pZmVzdCkge1xuICAgICAgdmFycy5tYW5pZmVzdCA9IGpzXG4gICAgICBjb25zdCBtYW5pZmVzdCA9IHBhdGguam9pbihvdXRwdXQsICdtYW5pZmVzdC5qcycpXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKG1hbmlmZXN0LCBqcywgJ3V0ZjgnKVxuICAgICAgdmFycy5yZWJ1aWxkID0gdHJ1ZVxuICAgICAgdmFyIGJ1bmRsZURpciA9IG91dHB1dC5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKVxuICAgICAgaWYgKGJ1bmRsZURpci50cmltKCkgPT0gJycpIHtidW5kbGVEaXIgPSAnLi8nfVxuICAgICAgbG9nKGFwcCArICdCdWlsZGluZyBFeHQgYnVuZGxlIGF0OiAnICsgYnVuZGxlRGlyKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHZhcnMucmVidWlsZCA9IGZhbHNlXG4gICAgICBsb2coYXBwICsgJ0V4dCByZWJ1aWxkIE5PVCBuZWVkZWQnKVxuICAgIH1cbiAgfVxuICBjYXRjaChlKSB7XG4gICAgcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndihvcHRpb25zLGUpXG4gICAgY29tcGlsYXRpb24uZXJyb3JzLnB1c2goJ19wcmVwYXJlRm9yQnVpbGQ6ICcgKyBlKVxuICB9XG59XG5cbi8vKioqKioqKioqKlxuZXhwb3J0IGZ1bmN0aW9uIF9idWlsZEV4dEJ1bmRsZShhcHAsIGNvbXBpbGF0aW9uLCBvdXRwdXRQYXRoLCBwYXJtcywgb3B0aW9ucykge1xuICB0cnkge1xuICAgIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKVxuICAgIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gICAgbG9ndihvcHRpb25zLCdGVU5DVElPTiBfYnVpbGRFeHRCdW5kbGUnKVxuXG4gICAgbGV0IHNlbmNoYTsgdHJ5IHsgc2VuY2hhID0gcmVxdWlyZSgnQHNlbmNoYS9jbWQnKSB9IGNhdGNoIChlKSB7IHNlbmNoYSA9ICdzZW5jaGEnIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhzZW5jaGEpKSB7XG4gICAgICBsb2d2KG9wdGlvbnMsJ3NlbmNoYSBmb2xkZXIgZXhpc3RzJylcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsb2d2KG9wdGlvbnMsJ3NlbmNoYSBmb2xkZXIgRE9FUyBOT1QgZXhpc3QnKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvbkJ1aWxkRG9uZSA9ICgpID0+IHtcbiAgICAgICAgbG9ndihvcHRpb25zLCdvbkJ1aWxkRG9uZScpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuXG4gICAgICB2YXIgb3B0cyA9IHsgY3dkOiBvdXRwdXRQYXRoLCBzaWxlbnQ6IHRydWUsIHN0ZGlvOiAncGlwZScsIGVuY29kaW5nOiAndXRmLTgnfVxuICAgICAgZXhlY3V0ZUFzeW5jKGFwcCwgc2VuY2hhLCBwYXJtcywgb3B0cywgY29tcGlsYXRpb24sIG9wdGlvbnMpLnRoZW4gKFxuICAgICAgICBmdW5jdGlvbigpIHsgb25CdWlsZERvbmUoKSB9LCBcbiAgICAgICAgZnVuY3Rpb24ocmVhc29uKSB7IHJlamVjdChyZWFzb24pIH1cbiAgICAgIClcbiAgICB9KVxuICB9XG4gIGNhdGNoKGUpIHtcbiAgICBjb25zb2xlLmxvZygnZScpXG4gICAgcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndihvcHRpb25zLGUpXG4gICAgY29tcGlsYXRpb24uZXJyb3JzLnB1c2goJ19idWlsZEV4dEJ1bmRsZTogJyArIGUpXG4gICAgY2FsbGJhY2soKVxuICB9XG59XG5cbi8vKioqKioqKioqKlxuZXhwb3J0IGZ1bmN0aW9uIF9kb25lKHZhcnMsIG9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBsb2cgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2dcbiAgICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICAgIGxvZ3Yob3B0aW9ucywnRlVOQ1RJT04gX2RvbmUnKVxuXG5cbiAgICBpZiAodmFycy5wcm9kdWN0aW9uID09IHRydWUgJiYgb3B0aW9ucy50cmVlc2hha2UgPT0gZmFsc2UgJiYgb3B0aW9ucy5mcmFtZXdvcmsgPT0gJ2FuZ3VsYXInKSB7XG4gICAgICByZXF1aXJlKGAuLyR7b3B0aW9ucy5mcmFtZXdvcmt9VXRpbGApLl90b0Rldih2YXJzLCBvcHRpb25zKVxuICAgIH1cblxuXG4gICAgdHJ5IHtcbiAgICAgIGlmKG9wdGlvbnMuYnJvd3NlciA9PSB0cnVlICYmIG9wdGlvbnMud2F0Y2ggPT0gJ3llcycgJiYgdmFycy5wcm9kdWN0aW9uID09IGZhbHNlKSB7XG4gICAgICAgIGlmICh2YXJzLmJyb3dzZXJDb3VudCA9PSAwKSB7XG4gICAgICAgICAgdmFyIHVybCA9ICdodHRwOi8vbG9jYWxob3N0OicgKyBvcHRpb25zLnBvcnRcbiAgICAgICAgICByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2codmFycy5hcHAgKyBgT3BlbmluZyBicm93c2VyIGF0ICR7dXJsfWApXG4gICAgICAgICAgdmFycy5icm93c2VyQ291bnQrK1xuICAgICAgICAgIGNvbnN0IG9wbiA9IHJlcXVpcmUoJ29wbicpXG4gICAgICAgICAgb3BuKHVybClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSlcbiAgICAgIC8vY29tcGlsYXRpb24uZXJyb3JzLnB1c2goJ3Nob3cgYnJvd3NlciB3aW5kb3cgLSBleHQtZG9uZTogJyArIGUpXG4gICAgfVxuICB9XG4gIGNhdGNoKGUpIHtcbiAgICByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2KG9wdGlvbnMsZSlcbiAgfVxufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQXN5bmMgKGFwcCwgY29tbWFuZCwgcGFybXMsIG9wdHMsIGNvbXBpbGF0aW9uLCBvcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgLy9jb25zdCBERUZBVUxUX1NVQlNUUlMgPSBbJ1tJTkZdIExvYWRpbmcnLCAnW0lORl0gUHJvY2Vzc2luZycsICdbTE9HXSBGYXNoaW9uIGJ1aWxkIGNvbXBsZXRlJywgJ1tFUlJdJywgJ1tXUk5dJywgXCJbSU5GXSBTZXJ2ZXJcIiwgXCJbSU5GXSBXcml0aW5nXCIsIFwiW0lORl0gTG9hZGluZyBCdWlsZFwiLCBcIltJTkZdIFdhaXRpbmdcIiwgXCJbTE9HXSBGYXNoaW9uIHdhaXRpbmdcIl07XG4gICAgY29uc3QgREVGQVVMVF9TVUJTVFJTID0gW1wiW0lORl0geFNlcnZlclwiLCAnW0lORl0gTG9hZGluZycsICdbSU5GXSBBcHBlbmQnLCAnW0lORl0gUHJvY2Vzc2luZycsICdbSU5GXSBQcm9jZXNzaW5nIEJ1aWxkJywgJ1tMT0ddIEZhc2hpb24gYnVpbGQgY29tcGxldGUnLCAnW0VSUl0nLCAnW1dSTl0nLCBcIltJTkZdIFdyaXRpbmdcIiwgXCJbSU5GXSBMb2FkaW5nIEJ1aWxkXCIsIFwiW0lORl0gV2FpdGluZ1wiLCBcIltMT0ddIEZhc2hpb24gd2FpdGluZ1wiXTtcbiAgICB2YXIgc3Vic3RyaW5ncyA9IERFRkFVTFRfU1VCU1RSUyBcbiAgICB2YXIgY2hhbGsgPSByZXF1aXJlKCdjaGFsaycpXG4gICAgY29uc3QgY3Jvc3NTcGF3biA9IHJlcXVpcmUoJ2Nyb3NzLXNwYXduJylcbiAgICBjb25zdCBsb2cgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2dcbiAgICBsb2d2KG9wdGlvbnMsICdGVU5DVElPTiBleGVjdXRlQXN5bmMnKVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxvZ3Yob3B0aW9ucyxgY29tbWFuZCAtICR7Y29tbWFuZH1gKVxuICAgICAgbG9ndihvcHRpb25zLCBgcGFybXMgLSAke3Bhcm1zfWApXG4gICAgICBsb2d2KG9wdGlvbnMsIGBvcHRzIC0gJHtKU09OLnN0cmluZ2lmeShvcHRzKX1gKVxuICAgICAgbGV0IGNoaWxkID0gY3Jvc3NTcGF3bihjb21tYW5kLCBwYXJtcywgb3B0cylcbiAgICAgIGNoaWxkLm9uKCdjbG9zZScsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgbG9ndihvcHRpb25zLCBgb24gY2xvc2U6IGAgKyBjb2RlKSBcbiAgICAgICAgaWYoY29kZSA9PT0gMCkgeyByZXNvbHZlKDApIH1cbiAgICAgICAgZWxzZSB7IGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCBuZXcgRXJyb3IoY29kZSkgKTsgcmVzb2x2ZSgwKSB9XG4gICAgICB9KVxuICAgICAgY2hpbGQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7IFxuICAgICAgICBsb2d2KG9wdGlvbnMsIGBvbiBlcnJvcmApIFxuICAgICAgICBjb21waWxhdGlvbi5lcnJvcnMucHVzaChlcnJvcilcbiAgICAgICAgcmVzb2x2ZSgwKVxuICAgICAgfSlcbiAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIHZhciBzdHIgPSBkYXRhLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCIgXCIpLnRyaW0oKVxuICAgICAgICBsb2d2KG9wdGlvbnMsIGAke3N0cn1gKVxuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnRvU3RyaW5nKCkubWF0Y2goL0Zhc2hpb24gd2FpdGluZyBmb3IgY2hhbmdlc1xcLlxcLlxcLi8pKSB7XG5cbiAgICAgICAgICBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gICAgICAgICAgdmFyIGZpbGVuYW1lID0gcHJvY2Vzcy5jd2QoKSArICcvc3JjL2luZGV4LmpzeCc7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gZnMucmVhZEZpbGVTeW5jKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZW5hbWUsIGRhdGEgKyAnICcsICd1dGY4Jyk7XG4gICAgICAgICAgICBsb2cob3B0aW9ucywgYHRvdWNoaW5nICR7ZmlsZW5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgIGxvZyhvcHRpb25zLCBgTk9UIHRvdWNoaW5nICR7ZmlsZW5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoMClcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoc3Vic3RyaW5ncy5zb21lKGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGRhdGEuaW5kZXhPZih2KSA+PSAwOyB9KSkgeyBcbiAgICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKFwiW0lORl1cIiwgXCJcIilcbiAgICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKFwiW0xPR11cIiwgXCJcIilcbiAgICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKS50cmltKClcbiAgICAgICAgICAgIGlmIChzdHIuaW5jbHVkZXMoXCJbRVJSXVwiKSkge1xuICAgICAgICAgICAgICBjb21waWxhdGlvbi5lcnJvcnMucHVzaChhcHAgKyBzdHIucmVwbGFjZSgvXlxcW0VSUlxcXSAvZ2ksICcnKSk7XG4gICAgICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKFwiW0VSUl1cIiwgYCR7Y2hhbGsucmVkKFwiW0VSUl1cIil9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZyhgJHthcHB9JHtzdHJ9YCkgXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgbG9ndihvcHRpb25zLCBgZXJyb3Igb24gY2xvc2U6IGAgKyBkYXRhKSBcbiAgICAgICAgdmFyIHN0ciA9IGRhdGEudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIiBcIikudHJpbSgpXG4gICAgICAgIHZhciBzdHJKYXZhT3B0cyA9IFwiUGlja2VkIHVwIF9KQVZBX09QVElPTlNcIjtcbiAgICAgICAgdmFyIGluY2x1ZGVzID0gc3RyLmluY2x1ZGVzKHN0ckphdmFPcHRzKVxuICAgICAgICBpZiAoIWluY2x1ZGVzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCR7YXBwfSAke2NoYWxrLnJlZChcIltFUlJdXCIpfSAke3N0cn1gKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cbiAgY2F0Y2goZSkge1xuICAgIHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3Yob3B0aW9ucyxlKVxuICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCdleGVjdXRlQXN5bmM6ICcgKyBlKVxuICAgIGNhbGxiYWNrKClcbiAgfSBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZyhzKSB7XG4gIHJlcXVpcmUoJ3JlYWRsaW5lJykuY3Vyc29yVG8ocHJvY2Vzcy5zdGRvdXQsIDApXG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQuY2xlYXJMaW5lKClcbiAgfVxuICBjYXRjaChlKSB7fVxuICBwcm9jZXNzLnN0ZG91dC53cml0ZShzKVxuICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZ3Yob3B0aW9ucywgcykge1xuICBpZiAob3B0aW9ucy52ZXJib3NlID09ICd5ZXMnKSB7XG4gICAgcmVxdWlyZSgncmVhZGxpbmUnKS5jdXJzb3JUbyhwcm9jZXNzLnN0ZG91dCwgMClcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQuY2xlYXJMaW5lKClcbiAgICB9XG4gICAgY2F0Y2goZSkge31cbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgLXZlcmJvc2U6ICR7c31gKVxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0QXBwKCkge1xuICB2YXIgY2hhbGsgPSByZXF1aXJlKCdjaGFsaycpXG4gIHZhciBwcmVmaXggPSBgYFxuICBjb25zdCBwbGF0Zm9ybSA9IHJlcXVpcmUoJ29zJykucGxhdGZvcm0oKVxuICBpZiAocGxhdGZvcm0gPT0gJ2RhcndpbicpIHsgcHJlZml4ID0gYOKEuSDvvaJleHTvvaM6YCB9XG4gIGVsc2UgeyBwcmVmaXggPSBgaSBbZXh0XTpgIH1cbiAgcmV0dXJuIGAke2NoYWxrLmdyZWVuKHByZWZpeCl9IGBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRWZXJzaW9ucyhhcHAsIHBsdWdpbk5hbWUsIGZyYW1ld29ya05hbWUpIHtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuICBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJylcblxuICB2YXIgdiA9IHt9XG4gIHZhciBwbHVnaW5QYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksJ25vZGVfbW9kdWxlcy9Ac2VuY2hhJywgcGx1Z2luTmFtZSlcbiAgdmFyIHBsdWdpblBrZyA9IChmcy5leGlzdHNTeW5jKHBsdWdpblBhdGgrJy9wYWNrYWdlLmpzb24nKSAmJiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwbHVnaW5QYXRoKycvcGFja2FnZS5qc29uJywgJ3V0Zi04JykpIHx8IHt9KTtcbiAgdi5wbHVnaW5WZXJzaW9uID0gcGx1Z2luUGtnLnZlcnNpb25cbiAgdi5fcmVzb2x2ZWQgPSBwbHVnaW5Qa2cuX3Jlc29sdmVkXG4gIGlmICh2Ll9yZXNvbHZlZCA9PSB1bmRlZmluZWQpIHtcbiAgICB2LmVkaXRpb24gPSBgQ29tbWVyY2lhbGBcbiAgfVxuICBlbHNlIHtcbiAgICBpZiAoLTEgPT0gdi5fcmVzb2x2ZWQuaW5kZXhPZignY29tbXVuaXR5JykpIHtcbiAgICAgIHYuZWRpdGlvbiA9IGBDb21tZXJjaWFsYFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHYuZWRpdGlvbiA9IGBDb21tdW5pdHlgXG4gICAgfVxuICB9XG5cbiAgdmFyIHdlYnBhY2tQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksJ25vZGVfbW9kdWxlcy93ZWJwYWNrJylcbiAgdmFyIHdlYnBhY2tQa2cgPSAoZnMuZXhpc3RzU3luYyh3ZWJwYWNrUGF0aCsnL3BhY2thZ2UuanNvbicpICYmIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHdlYnBhY2tQYXRoKycvcGFja2FnZS5qc29uJywgJ3V0Zi04JykpIHx8IHt9KTtcbiAgdi53ZWJwYWNrVmVyc2lvbiA9IHdlYnBhY2tQa2cudmVyc2lvblxuXG4gIHZhciBleHRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksJ25vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dCcpXG4gIHZhciBleHRQa2cgPSAoZnMuZXhpc3RzU3luYyhleHRQYXRoKycvcGFja2FnZS5qc29uJykgJiYgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZXh0UGF0aCsnL3BhY2thZ2UuanNvbicsICd1dGYtOCcpKSB8fCB7fSk7XG4gIHYuZXh0VmVyc2lvbiA9IGV4dFBrZy5zZW5jaGEudmVyc2lvblxuXG4gIHZhciBjbWRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksYG5vZGVfbW9kdWxlcy9Ac2VuY2hhL2NtZGApXG4gIHZhciBjbWRQa2cgPSAoZnMuZXhpc3RzU3luYyhjbWRQYXRoKycvcGFja2FnZS5qc29uJykgJiYgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY21kUGF0aCsnL3BhY2thZ2UuanNvbicsICd1dGYtOCcpKSB8fCB7fSk7XG4gIHYuY21kVmVyc2lvbiA9IGNtZFBrZy52ZXJzaW9uX2Z1bGxcblxuICBpZiAodi5jbWRWZXJzaW9uID09IHVuZGVmaW5lZCkge1xuICAgIHZhciBjbWRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksYG5vZGVfbW9kdWxlcy9Ac2VuY2hhLyR7cGx1Z2luTmFtZX0vbm9kZV9tb2R1bGVzL0BzZW5jaGEvY21kYClcbiAgICB2YXIgY21kUGtnID0gKGZzLmV4aXN0c1N5bmMoY21kUGF0aCsnL3BhY2thZ2UuanNvbicpICYmIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNtZFBhdGgrJy9wYWNrYWdlLmpzb24nLCAndXRmLTgnKSkgfHwge30pO1xuICAgIHYuY21kVmVyc2lvbiA9IGNtZFBrZy52ZXJzaW9uX2Z1bGxcbiAgfVxuXG4gIHZhciBmcmFtZXdvcmtJbmZvID0gJydcbiAgIGlmIChmcmFtZXdvcmtOYW1lICE9IHVuZGVmaW5lZCAmJiBmcmFtZXdvcmtOYW1lICE9ICdleHRqcycpIHtcbiAgICB2YXIgZnJhbWV3b3JrUGF0aCA9ICcnXG4gICAgaWYgKGZyYW1ld29ya05hbWUgPT0gJ3JlYWN0Jykge1xuICAgICAgZnJhbWV3b3JrUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCdub2RlX21vZHVsZXMvcmVhY3QnKVxuICAgIH1cbiAgICBpZiAoZnJhbWV3b3JrTmFtZSA9PSAnYW5ndWxhcicpIHtcbiAgICAgIGZyYW1ld29ya1BhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwnbm9kZV9tb2R1bGVzL0Bhbmd1bGFyL2NvcmUnKVxuICAgIH1cbiAgICB2YXIgZnJhbWV3b3JrUGtnID0gKGZzLmV4aXN0c1N5bmMoZnJhbWV3b3JrUGF0aCsnL3BhY2thZ2UuanNvbicpICYmIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGZyYW1ld29ya1BhdGgrJy9wYWNrYWdlLmpzb24nLCAndXRmLTgnKSkgfHwge30pO1xuICAgIHYuZnJhbWV3b3JrVmVyc2lvbiA9IGZyYW1ld29ya1BrZy52ZXJzaW9uXG4gICAgZnJhbWV3b3JrSW5mbyA9ICcsICcgKyBmcmFtZXdvcmtOYW1lICsgJyB2JyArIHYuZnJhbWV3b3JrVmVyc2lvblxuICB9XG4gIHJldHVybiBhcHAgKyAnZXh0LXdlYnBhY2stcGx1Z2luIHYnICsgdi5wbHVnaW5WZXJzaW9uICsgJywgRXh0IEpTIHYnICsgdi5leHRWZXJzaW9uICsgJyAnICsgdi5lZGl0aW9uICsgJyBFZGl0aW9uLCBTZW5jaGEgQ21kIHYnICsgdi5jbWRWZXJzaW9uICsgJywgd2VicGFjayB2JyArIHYud2VicGFja1ZlcnNpb24gKyBmcmFtZXdvcmtJbmZvXG4gfSJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wbHVnaW5VdGlsLmpzIl0sIm5hbWVzIjpbIl9jb25zdHJ1Y3RvciIsImluaXRpYWxPcHRpb25zIiwiZnMiLCJyZXF1aXJlIiwidmFycyIsIm9wdGlvbnMiLCJmcmFtZXdvcmsiLCJ1bmRlZmluZWQiLCJwbHVnaW5FcnJvcnMiLCJwdXNoIiwibyIsInRyZWVzaGFrZSIsInZlcmJvc2UiLCJ2YWxpZGF0ZU9wdGlvbnMiLCJfZ2V0VmFsaWRhdGVPcHRpb25zIiwicmMiLCJleGlzdHNTeW5jIiwiSlNPTiIsInBhcnNlIiwicmVhZEZpbGVTeW5jIiwiX2dldERlZmF1bHRPcHRpb25zIiwiX2dldERlZmF1bHRWYXJzIiwicGx1Z2luTmFtZSIsImFwcCIsIl9nZXRBcHAiLCJsb2d2IiwiZW52aXJvbm1lbnQiLCJwcm9kdWN0aW9uIiwiYnJvd3NlciIsIndhdGNoIiwibG9nIiwiX2dldFZlcnNpb25zIiwiYnVpbGRzdGVwIiwiX3RvUHJvZCIsImUiLCJ0b1N0cmluZyIsIl90aGlzQ29tcGlsYXRpb24iLCJjb21waWxlciIsImNvbXBpbGF0aW9uIiwic2NyaXB0IiwicnVuU2NyaXB0IiwiZXJyIiwiX2NvbXBpbGF0aW9uIiwiZXh0Q29tcG9uZW50cyIsIl9nZXRBbGxDb21wb25lbnRzIiwiaG9va3MiLCJzdWNjZWVkTW9kdWxlIiwidGFwIiwibW9kdWxlIiwicmVzb3VyY2UiLCJtYXRjaCIsIl9zb3VyY2UiLCJfdmFsdWUiLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwiZGVwcyIsIl9leHRyYWN0RnJvbVNvdXJjZSIsImZpbmlzaE1vZHVsZXMiLCJtb2R1bGVzIiwiX3dyaXRlRmlsZXNUb1Byb2RGb2xkZXIiLCJodG1sV2VicGFja1BsdWdpbkJlZm9yZUh0bWxHZW5lcmF0aW9uIiwiZGF0YSIsInBhdGgiLCJqc1BhdGgiLCJqb2luIiwiZXh0UGF0aCIsImNzc1BhdGgiLCJhc3NldHMiLCJqcyIsInVuc2hpZnQiLCJjc3MiLCJfYWZ0ZXJDb21waWxlIiwiX2VtaXQiLCJjYWxsYmFjayIsImVtaXQiLCJvdXRwdXRQYXRoIiwiZGV2U2VydmVyIiwiY29udGVudEJhc2UiLCJfcHJlcGFyZUZvckJ1aWxkIiwiY29tbWFuZCIsInJlYnVpbGQiLCJwYXJtcyIsInByb2ZpbGUiLCJ3YXRjaFN0YXJ0ZWQiLCJfYnVpbGRFeHRCdW5kbGUiLCJfZG9uZSIsInN0YXRzIiwiZXJyb3JzIiwibGVuZ3RoIiwiY2hhbGsiLCJjb25zb2xlIiwicmVkIiwicHJvY2VzcyIsImV4aXQiLCJfdG9EZXYiLCJicm93c2VyQ291bnQiLCJ1cmwiLCJwb3J0Iiwib3BuIiwib3V0cHV0IiwicGFja2FnZXMiLCJ0b29sa2l0IiwidGhlbWUiLCJyaW1yYWYiLCJta2RpcnAiLCJmc3giLCJmaXJzdFRpbWUiLCJzeW5jIiwiYnVpbGRYTUwiLCJjcmVhdGVBcHBKc29uIiwiY3JlYXRlV29ya3NwYWNlSnNvbiIsImNyZWF0ZUpTRE9NRW52aXJvbm1lbnQiLCJ3cml0ZUZpbGVTeW5jIiwiY3dkIiwiZnJvbVBhdGgiLCJ0b1BhdGgiLCJjb3B5U3luYyIsInJlcGxhY2UiLCJmcm9tUmVzb3VyY2VzIiwidG9SZXNvdXJjZXMiLCJtYW5pZmVzdCIsImJ1bmRsZURpciIsInRyaW0iLCJzZW5jaGEiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uQnVpbGREb25lIiwib3B0cyIsInNpbGVudCIsInN0ZGlvIiwiZW5jb2RpbmciLCJfZXhlY3V0ZUFzeW5jIiwidGhlbiIsInJlYXNvbiIsIkRFRkFVTFRfU1VCU1RSUyIsInN1YnN0cmluZ3MiLCJjcm9zc1NwYXduIiwic3RyaW5naWZ5IiwiY2hpbGQiLCJvbiIsImNvZGUiLCJzaWduYWwiLCJFcnJvciIsImVycm9yIiwic3Rkb3V0Iiwic3RyIiwiZmlsZW5hbWUiLCJ0b3VjaEZpbGUiLCJkIiwiRGF0ZSIsInRvTG9jYWxlU3RyaW5nIiwic29tZSIsInYiLCJpbmRleE9mIiwic3RkZXJyIiwic3RySmF2YU9wdHMiLCJzY3JpcHRQYXRoIiwiY2hpbGRQcm9jZXNzIiwiaW52b2tlZCIsImZvcmsiLCJfdG9YdHlwZSIsInByZWZpeCIsInBsYXRmb3JtIiwiZ3JlZW4iLCJmcmFtZXdvcmtOYW1lIiwicGx1Z2luUGF0aCIsInBsdWdpblBrZyIsInBsdWdpblZlcnNpb24iLCJ2ZXJzaW9uIiwiX3Jlc29sdmVkIiwiZWRpdGlvbiIsIndlYnBhY2tQYXRoIiwid2VicGFja1BrZyIsIndlYnBhY2tWZXJzaW9uIiwiZXh0UGtnIiwiZXh0VmVyc2lvbiIsImNtZFBhdGgiLCJjbWRQa2ciLCJjbWRWZXJzaW9uIiwidmVyc2lvbl9mdWxsIiwiZnJhbWV3b3JrSW5mbyIsImZyYW1ld29ya1BhdGgiLCJmcmFtZXdvcmtQa2ciLCJmcmFtZXdvcmtWZXJzaW9uIiwibWVzc2FnZSIsInMiLCJjdXJzb3JUbyIsImNsZWFyTGluZSIsIndyaXRlIiwibG9naCIsImgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDTyxTQUFTQSxZQUFULENBQXNCQyxjQUF0QixFQUFzQztBQUMzQyxRQUFNQyxFQUFFLEdBQUdDLE9BQU8sQ0FBQyxJQUFELENBQWxCOztBQUNBLE1BQUlDLElBQUksR0FBRyxFQUFYO0FBQ0EsTUFBSUMsT0FBTyxHQUFHLEVBQWQ7O0FBQ0EsTUFBSTtBQUNGLFFBQUlKLGNBQWMsQ0FBQ0ssU0FBZixJQUE0QkMsU0FBaEMsRUFBMkM7QUFDekNILE1BQUFBLElBQUksQ0FBQ0ksWUFBTCxHQUFvQixFQUFwQjtBQUNBSixNQUFBQSxJQUFJLENBQUNJLFlBQUwsQ0FBa0JDLElBQWxCLENBQXVCLDRIQUF2QjtBQUNBLFVBQUlDLENBQUMsR0FBRyxFQUFSO0FBQ0FBLE1BQUFBLENBQUMsQ0FBQ04sSUFBRixHQUFTQSxJQUFUO0FBQ0EsYUFBT00sQ0FBUDtBQUNEOztBQUNELFFBQUlKLFNBQVMsR0FBR0wsY0FBYyxDQUFDSyxTQUEvQjtBQUNBLFFBQUlLLFNBQVMsR0FBR1YsY0FBYyxDQUFDVSxTQUEvQjtBQUNBLFFBQUlDLE9BQU8s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O0FBQ1Asd0JBQWdCLDBEQURUO0FBRVAsZ0JBQVEsQ0FBQyxRQUFEO0FBRkQsT0F0Q0c7QUEwQ1osaUJBQVc7QUFDVCx3QkFBZ0IsMERBRFA7QUFFVCxnQkFBUSxDQUFDLFFBQUQ7QUFGQztBQTFDQyxLQUZUO0FBaURMLDRCQUF3QjtBQWpEbkIsR0FBUDtBQW1ERDs7QUFHRCxTQUFTTSxrQkFBVCxHQUE4QjtBQUM1QixTQUFPO0FBQ0xkLElBQUFBLFNBQVMsRUFBRSxPQUROO0FBRUwrRixJQUFBQSxPQUFPLEVBQUUsUUFGSjtBQUdMQyxJQUFBQSxLQUFLLEVBQUUsZ0JBSEY7QUFJTDVCLElBQUFBLElBQUksRUFBRSxLQUpEO0FBS0xuQyxJQUFBQSxNQUFNLEVBQUUsSUFMSDtBQU1MMEQsSUFBQUEsSUFBSSxFQUFFLElBTkQ7QUFPTEcsSUFBQUEsUUFBUSxFQUFFLEVBUEw7QUFTTGxCLElBQUFBLE9BQU8sRUFBRSxFQVRKO0FBVUx4RCxJQUFBQSxXQUFXLEVBQUUsYUFWUjtBQVdMZixJQUFBQSxTQUFTLEVBQUUsSUFYTjtBQVlMaUIsSUFBQUEsT0FBTyxFQUFFLEtBWko7QUFhTEMsSUFBQUEsS0FBSyxFQUFFLEtBYkY7QUFjTGpCLElBQUFBLE9BQU8sRUFBRTtBQWRKLEdBQVA7QUFnQkQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBfY29uc3RydWN0b3IoaW5pdGlhbE9wdGlvbnMpIHtcbiAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpXG4gIHZhciB2YXJzID0ge31cbiAgdmFyIG9wdGlvbnMgPSB7fVxuICB0cnkge1xuICAgIGlmIChpbml0aWFsT3B0aW9ucy5mcmFtZXdvcmsgPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXJzLnBsdWdpbkVycm9ycyA9IFtdXG4gICAgICB2YXJzLnBsdWdpbkVycm9ycy5wdXNoKCd3ZWJwYWNrIGNvbmZpZzogZnJhbWV3b3JrIHBhcmFtZXRlciBvbiBleHQtcmVhY3Qtd2VicGFjay1wbHVnaW4gaXMgbm90IGRlZmluZWQgLSB2YWx1ZXM6IHJlYWN0LCBhbmd1bGFyLCBleHRqcywgY29tcG9uZW50cycpXG4gICAgICB2YXIgbyA9IHt9XG4gICAgICBvLnZhcnMgPSB2YXJzXG4gICAgICByZXR1cm4gb1xuICAgIH1cbiAgICB2YXIgZnJhbWV3b3JrID0gaW5pdGlhbE9wdGlvbnMuZnJhbWV3b3JrXG4gICAgdmFyIHRyZWVzaGFrZSA9IGluaXRpYWxPcHRpb25zLnRyZWVzaGFrZVxuICAgIHZhciB2ZXJib3NlID0gaW5pdGlhbE9wdGlvbnMudmVyYm9zZVxuXG4gICAgY29uc3QgdmFsaWRhdGVPcHRpb25zID0gcmVxdWlyZSgnc2NoZW1hLXV0aWxzJylcbiAgICB2YWxpZGF0ZU9wdGlvbnMoX2dldFZhbGlkYXRlT3B0aW9ucygpLCBpbml0aWFsT3B0aW9ucywgJycpXG5cbiAgICBjb25zdCByYyA9IChmcy5leGlzdHNTeW5jKGAuZXh0LSR7ZnJhbWV3b3JrfXJjYCkgJiYgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoYC5leHQtJHtmcmFtZXdvcmt9cmNgLCAndXRmLTgnKSkgfHwge30pXG4gICAgb3B0aW9ucyA9IHsgLi4uX2dldERlZmF1bHRPcHRpb25zKCksIC4uLmluaXRpYWxPcHRpb25zLCAuLi5yYyB9XG5cbiAgICB2YXJzID0gcmVxdWlyZShgLi8ke2ZyYW1ld29ya31VdGlsYCkuX2dldERlZmF1bHRWYXJzKClcbiAgICB2YXJzLnBsdWdpbk5hbWUgPSAnZXh0LXJlYWN0LXdlYnBhY2stcGx1Z2luJ1xuICAgIHZhcnMuYXBwID0gX2dldEFwcCgpXG4gICAgdmFyIHBsdWdpbk5hbWUgPSB2YXJzLnBsdWdpbk5hbWVcbiAgICB2YXIgYXBwID0gdmFycy5hcHBcblxuICAgIGxvZ3YodmVyYm9zZSwgJ0ZVTkNUSU9OIF9jb25zdHJ1Y3RvcicpXG4gICAgbG9ndih2ZXJib3NlLCBgcGx1Z2luTmFtZSAtICR7cGx1Z2luTmFtZX1gKVxuICAgIGxvZ3YodmVyYm9zZSwgYGFwcCAtICR7YXBwfWApXG5cbiAgICBpZiAob3B0aW9ucy5lbnZpcm9ubWVudCA9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhcnMucHJvZHVjdGlvbiA9IHRydWVcbiAgICAgIG9wdGlvbnMuYnJvd3NlciA9ICdubydcbiAgICAgIG9wdGlvbnMud2F0Y2ggPSAnbm8nXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFycy5wcm9kdWN0aW9uID0gZmFsc2VcbiAgICB9XG4gICAgXG4gICAgLy9sb2d2KHZlcmJvc2UsIGBvcHRpb25zOmApO2lmICh2ZXJib3NlID09ICd5ZXMnKSB7Y29uc29sZS5kaXIob3B0aW9ucyl9XG4gICAgLy9sb2d2KHZlcmJvc2UsIGB2YXJzOmApO2lmICh2ZXJib3NlID09ICd5ZXMnKSB7Y29uc29sZS5kaXIodmFycyl9XG4gICAgXG4gICAgbG9nKGFwcCwgX2dldFZlcnNpb25zKHBsdWdpbk5hbWUsIGZyYW1ld29yaykpXG5cbiAgICBpZiAoZnJhbWV3b3JrID09ICdyZWFjdCcgfHwgZnJhbWV3b3JrID09ICdleHRqcycpIHtcbiAgICAgIGlmICh2YXJzLnByb2R1Y3Rpb24gPT0gdHJ1ZSkge1xuICAgICAgICB2YXJzLmJ1aWxkc3RlcCA9ICcxIG9mIDEnXG4gICAgICAgIGxvZyhhcHAsICdTdGFydGluZyBQcm9kdWN0aW9uIEJ1aWxkIGZvciAnICsgZnJhbWV3b3JrKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHZhcnMuYnVpbGRzdGVwID0gJzEgb2YgMSdcbiAgICAgICAgbG9nKGFwcCwgJ1N0YXJ0aW5nIGRldmVsb3BtZW50IGJ1aWxkIGZvciAnICsgZnJhbWV3b3JrKVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh2YXJzLnByb2R1Y3Rpb24gPT0gdHJ1ZSkge1xuICAgICAgaWYgKHRyZWVzaGFrZSA9PSAneWVzJykge1xuICAgICAgICB2YXJzLmJ1aWxkc3RlcCA9ICcxIG9mIDInXG4gICAgICAgIGxvZyhhcHAsICdTdGFydGluZyBwcm9kdWN0aW9uIGJ1aWxkIGZvciAnICsgZnJhbWV3b3JrICsgJyAtICcgKyB2YXJzLmJ1aWxkc3RlcClcbiAgICAgICAgcmVxdWlyZShgLi8ke2ZyYW1ld29ya31VdGlsYCkuX3RvUHJvZCh2YXJzLCBvcHRpb25zKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHZhcnMuYnVpbGRzdGVwID0gJzIgb2YgMidcbiAgICAgICAgbG9nKGFwcCwgJ0NvbnRpbnVpbmcgcHJvZHVjdGlvbiBidWlsZCBmb3IgJyArIGZyYW1ld29yayArICcgLSAnICsgdmFycy5idWlsZHN0ZXApXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFycy5idWlsZHN0ZXAgPSAnMSBvZiAxJ1xuICAgICAgbG9nKGFwcCwgJ1N0YXJ0aW5nIGRldmVsb3BtZW50IGJ1aWxkIGZvciAnICsgZnJhbWV3b3JrKVxuICAgIH1cbiAgICBsb2d2KHZlcmJvc2UsICdCdWlsZGluZyBmb3IgJyArIG9wdGlvbnMuZW52aXJvbm1lbnQgKyAnLCAnICsgJ1RyZWVzaGFrZSBpcyAnICsgb3B0aW9ucy50cmVlc2hha2UpXG5cbiAgICB2YXIgbyA9IHt9XG4gICAgby52YXJzID0gdmFyc1xuICAgIG8ub3B0aW9ucyA9IG9wdGlvbnNcbiAgICByZXR1cm4gb1xuICB9XG4gIGNhdGNoIChlKSB7XG4gICAgdGhyb3cgJ19jb25zdHJ1Y3RvcjogJyArIGUudG9TdHJpbmcoKVxuICB9XG59XG5cbi8vKioqKioqKioqKlxuZXhwb3J0IGZ1bmN0aW9uIF90aGlzQ29tcGlsYXRpb24oY29tcGlsZXIsIGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFwcCA9IHZhcnMuYXBwXG4gICAgdmFyIHZlcmJvc2UgPSBvcHRpb25zLnZlcmJvc2VcbiAgICBsb2d2KHZlcmJvc2UsICdGVU5DVElPTiBfdGhpc0NvbXBpbGF0aW9uJylcbiAgICBsb2d2KHZlcmJvc2UsIGBvcHRpb25zLnNjcmlwdDogJHtvcHRpb25zLnNjcmlwdCB9YClcbiAgICBsb2d2KHZlcmJvc2UsIGBidWlsZHN0ZXA6ICR7dmFycy5idWlsZHN0ZXB9YClcblxuICAgIGlmICh2YXJzLmJ1aWxkc3RlcCA9PSAnMSBvZiAxJyB8fCB2YXJzLmJ1aWxkc3RlcCA9PSAnMSBvZiAyJykge1xuICAgICAgaWYgKG9wdGlvbnMuc2NyaXB0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChvcHRpb25zLnNjcmlwdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zY3JpcHQgIT0gJycpIHtcbiAgICAgICAgICAgIGxvZyhhcHAsIGBTdGFydGVkIHJ1bm5pbmcgJHtvcHRpb25zLnNjcmlwdH1gKVxuICAgICAgICAgICAgcnVuU2NyaXB0KG9wdGlvbnMuc2NyaXB0LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChlcnIpIHRocm93IGVycjtcbiAgICAgICAgICAgICAgbG9nKGFwcCwgYEZpbmlzaGVkIHJ1bm5pbmcgJHtvcHRpb25zLnNjcmlwdH1gKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjYXRjaChlKSB7XG4gICAgdGhyb3cgJ190aGlzQ29tcGlsYXRpb246ICcgKyBlLnRvU3RyaW5nKClcbiAgfVxufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBfY29tcGlsYXRpb24oY29tcGlsZXIsIGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFwcCA9IHZhcnMuYXBwXG4gICAgdmFyIHZlcmJvc2UgPSBvcHRpb25zLnZlcmJvc2VcbiAgICB2YXIgZnJhbWV3b3JrID0gb3B0aW9ucy5mcmFtZXdvcmtcbiAgICBsb2d2KHZlcmJvc2UsICdGVU5DVElPTiBfY29tcGlsYXRpb24nKVxuICAgIFxuICAgIGlmIChmcmFtZXdvcmsgPT0gJ2V4dGpzJykge1xuICAgICAgbG9ndih2ZXJib3NlLCAnRlVOQ1RJT04gX2NvbXBpbGF0aW9uIGVuZCAoZXh0anMpJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YXIgZXh0Q29tcG9uZW50cyA9IFtdXG4gICAgaWYgKHZhcnMuYnVpbGRzdGVwID09ICcxIG9mIDInKSB7XG4gICAgICBleHRDb21wb25lbnRzID0gcmVxdWlyZShgLi8ke2ZyYW1ld29ya31VdGlsYCkuX2dldEFsbENvbXBvbmVudHModmFycywgb3B0aW9ucylcbiAgICB9XG4gICAgY29tcGlsYXRpb24uaG9va3Muc3VjY2VlZE1vZHVsZS50YXAoYGV4dC1zdWNjZWVkLW1vZHVsZWAsIG1vZHVsZSA9PiB7XG4gICAgICBpZiAobW9kdWxlLnJlc291cmNlICYmICFtb2R1bGUucmVzb3VyY2UubWF0Y2goL25vZGVfbW9kdWxlcy8pKSB7XG4gICAgICAgIGlmKG1vZHVsZS5yZXNvdXJjZS5tYXRjaCgvXFwuaHRtbCQvKSAhPSBudWxsKSB7XG4gICAgICAgICAgaWYobW9kdWxlLl9zb3VyY2UuX3ZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2RvY3R5cGUgaHRtbCcpID09IGZhbHNlKSB7XG4gICAgICAgICAgICB2YXJzLmRlcHMgPSBbXG4gICAgICAgICAgICAgIC4uLih2YXJzLmRlcHMgfHwgW10pLFxuICAgICAgICAgICAgICAuLi5yZXF1aXJlKGAuLyR7ZnJhbWV3b3JrfVV0aWxgKS5fZXh0cmFjdEZyb21Tb3VyY2UobW9kdWxlLCBvcHRpb25zLCBjb21waWxhdGlvbiwgZXh0Q29tcG9uZW50cyldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhcnMuZGVwcyA9IFtcbiAgICAgICAgICAgIC4uLih2YXJzLmRlcHMgfHwgW10pLFxuICAgICAgICAgICAgLi4ucmVxdWlyZShgLi8ke2ZyYW1ld29ya31VdGlsYCkuX2V4dHJhY3RGcm9tU291cmNlKG1vZHVsZSwgb3B0aW9ucywgY29tcGlsYXRpb24sIGV4dENvbXBvbmVudHMpXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAodmFycy5idWlsZHN0ZXAgPT0gJzEgb2YgMicpIHtcbiAgICAgIGNvbXBpbGF0aW9uLmhvb2tzLmZpbmlzaE1vZHVsZXMudGFwKGBleHQtZmluaXNoLW1vZHVsZXNgLCBtb2R1bGVzID0+IHtcbiAgICAgICAgcmVxdWlyZShgLi8ke2ZyYW1ld29ya31VdGlsYCkuX3dyaXRlRmlsZXNUb1Byb2RGb2xkZXIodmFycywgb3B0aW9ucylcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmICh2YXJzLmJ1aWxkc3RlcCA9PSAnMSBvZiAxJyB8fCB2YXJzLmJ1aWxkc3RlcCA9PSAnMiBvZiAyJykge1xuICAgICAgY29tcGlsYXRpb24uaG9va3MuaHRtbFdlYnBhY2tQbHVnaW5CZWZvcmVIdG1sR2VuZXJhdGlvbi50YXAoYGV4dC1odG1sLWdlbmVyYXRpb25gLChkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbiAgICAgICAgdmFyIGpzUGF0aCA9IHBhdGguam9pbih2YXJzLmV4dFBhdGgsICdleHQuanMnKVxuICAgICAgICB2YXIgY3NzUGF0aCA9IHBhdGguam9pbih2YXJzLmV4dFBhdGgsICdleHQuY3NzJylcbiAgICAgICAgZGF0YS5hc3NldHMuanMudW5zaGlmdChqc1BhdGgpXG4gICAgICAgIGRhdGEuYXNzZXRzLmNzcy51bnNoaWZ0KGNzc1BhdGgpXG4gICAgICAgIGxvZyhhcHAsIGBBZGRpbmcgJHtqc1BhdGh9IGFuZCAke2Nzc1BhdGh9IHRvIGluZGV4Lmh0bWxgKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgY2F0Y2goZSkge1xuICAgIHRocm93ICdfY29tcGlsYXRpb246ICcgKyBlLnRvU3RyaW5nKClcbi8vICAgIGxvZ3Yob3B0aW9ucy52ZXJib3NlLGUpXG4vLyAgICBjb21waWxhdGlvbi5lcnJvcnMucHVzaCgnX2NvbXBpbGF0aW9uOiAnICsgZSlcbiAgfVxufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBfYWZ0ZXJDb21waWxlKGNvbXBpbGVyLCBjb21waWxhdGlvbiwgdmFycywgb3B0aW9ucykge1xuICB0cnkge1xuICAgIHZhciBhcHAgPSB2YXJzLmFwcFxuICAgIHZhciB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlXG4gICAgdmFyIGZyYW1ld29yayA9IG9wdGlvbnMuZnJhbWV3b3JrXG4gICAgbG9ndih2ZXJib3NlLCAnRlVOQ1RJT04gX2FmdGVyQ29tcGlsZScpXG4gICAgaWYgKGZyYW1ld29yayA9PSAnZXh0anMnKSB7XG4gICAgICByZXF1aXJlKGAuL2V4dGpzVXRpbGApLl9hZnRlckNvbXBpbGUoY29tcGlsYXRpb24sIHZhcnMsIG9wdGlvbnMpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbG9ndih2ZXJib3NlLCAnRlVOQ1RJT04gX2FmdGVyQ29tcGlsZSBub3QgcnVuJylcbiAgICB9XG4gIH1cbiAgY2F0Y2goZSkge1xuICAgIHRocm93ICdfYWZ0ZXJDb21waWxlOiAnICsgZS50b1N0cmluZygpXG4gIH1cbn1cblxuLy8qKioqKioqKioqXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2VtaXQoY29tcGlsZXIsIGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB0cnkge1xuICAgIGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbiAgICB2YXIgYXBwID0gdmFycy5hcHBcbiAgICB2YXIgdmVyYm9zZSA9IG9wdGlvbnMudmVyYm9zZVxuICAgIHZhciBlbWl0ID0gb3B0aW9ucy5lbWl0XG4gICAgdmFyIGZyYW1ld29yayA9IG9wdGlvbnMuZnJhbWV3b3JrXG4gICAgbG9ndih2ZXJib3NlLCdGVU5DVElPTiBfZW1pdCcpXG4gICAgaWYgKGVtaXQgPT0gJ3llcycpIHtcbiAgICAgIGlmICh2YXJzLmJ1aWxkc3RlcCA9PSAnMSBvZiAxJyB8fCB2YXJzLmJ1aWxkc3RlcCA9PSAnMSBvZiAyJykge1xuICAgICAgICBsZXQgb3V0cHV0UGF0aCA9IHBhdGguam9pbihjb21waWxlci5vdXRwdXRQYXRoLHZhcnMuZXh0UGF0aClcbiAgICAgICAgaWYgKGNvbXBpbGVyLm91dHB1dFBhdGggPT09ICcvJyAmJiBjb21waWxlci5vcHRpb25zLmRldlNlcnZlcikge1xuICAgICAgICAgIG91dHB1dFBhdGggPSBwYXRoLmpvaW4oY29tcGlsZXIub3B0aW9ucy5kZXZTZXJ2ZXIuY29udGVudEJhc2UsIG91dHB1dFBhdGgpXG4gICAgICAgIH1cbiAgICAgICAgbG9ndih2ZXJib3NlLCdvdXRwdXRQYXRoOiAnICsgb3V0cHV0UGF0aClcbiAgICAgICAgbG9ndih2ZXJib3NlLCdmcmFtZXdvcms6ICcgKyBmcmFtZXdvcmspXG4gICAgICAgIGlmIChmcmFtZXdvcmsgIT0gJ2V4dGpzJykge1xuICAgICAgICAgIF9wcmVwYXJlRm9yQnVpbGQoYXBwLCB2YXJzLCBvcHRpb25zLCBvdXRwdXRQYXRoLCBjb21waWxhdGlvbilcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29tbWFuZCA9ICcnXG4gICAgICAgIGlmIChvcHRpb25zLndhdGNoID09ICd5ZXMnICYmIHZhcnMucHJvZHVjdGlvbiA9PSBmYWxzZSlcbiAgICAgICAgICB7Y29tbWFuZCA9ICd3YXRjaCd9XG4gICAgICAgIGVsc2UgXG4gICAgICAgICAge2NvbW1hbmQgPSAnYnVpbGQnfVxuICAgICAgICBpZiAodmFycy5yZWJ1aWxkID09IHRydWUpIHtcbiAgICAgICAgICB2YXIgcGFybXMgPSBbXVxuICAgICAgICAgIGlmIChvcHRpb25zLnByb2ZpbGUgPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMucHJvZmlsZSA9PSAnJyB8fCBvcHRpb25zLnByb2ZpbGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gJ2J1aWxkJylcbiAgICAgICAgICAgICAgeyBwYXJtcyA9IFsnYXBwJywgY29tbWFuZCwgb3B0aW9ucy5lbnZpcm9ubWVudF0gfVxuICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgeyBwYXJtcyA9IFsnYXBwJywgY29tbWFuZCwgJy0td2ViLXNlcnZlcicsICdmYWxzZScsIG9wdGlvbnMuZW52aXJvbm1lbnRdIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSAnYnVpbGQnKSBcbiAgICAgICAgICAgICAge3Bhcm1zID0gWydhcHAnLCBjb21tYW5kLCBvcHRpb25zLnByb2ZpbGUsIG9wdGlvbnMuZW52aXJvbm1lbnRdfVxuICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAge3Bhcm1zID0gWydhcHAnLCBjb21tYW5kLCAnLS13ZWItc2VydmVyJywgJ2ZhbHNlJywgb3B0aW9ucy5wcm9maWxlLCBvcHRpb25zLmVudmlyb25tZW50XX1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhcnMud2F0Y2hTdGFydGVkID09IGZhbHNlKSB7XG4gICAgICAgICAgICBhd2FpdCBfYnVpbGRFeHRCdW5kbGUoYXBwLCBjb21waWxhdGlvbiwgb3V0cHV0UGF0aCwgcGFybXMsIHZhcnMsIG9wdGlvbnMpXG4gICAgICAgICAgICB2YXJzLndhdGNoU3RhcnRlZCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGxvZ3YodmVyYm9zZSwnTk9UIHJ1bm5pbmcgZW1pdCcpXG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsb2d2KHZlcmJvc2UsJ2VtaXQgaXMgbm8nKVxuICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfVxuICBjYXRjaChlKSB7XG4gICAgY2FsbGJhY2soKVxuICAgIHRocm93ICdfZW1pdDogJyArIGUudG9TdHJpbmcoKVxuICAgIC8vIGxvZ3Yob3B0aW9ucy52ZXJib3NlLGUpXG4gICAgLy8gY29tcGlsYXRpb24uZXJyb3JzLnB1c2goJ19lbWl0OiAnICsgZSlcbiAgICAvLyBjYWxsYmFjaygpXG4gIH1cbn1cblxuLy8qKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gX2RvbmUoc3RhdHMsIHZhcnMsIG9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICB2YXIgdmVyYm9zZSA9IG9wdGlvbnMudmVyYm9zZVxuICAgIHZhciBmcmFtZXdvcmsgPSBvcHRpb25zLmZyYW1ld29ya1xuICAgIGxvZ3YodmVyYm9zZSwnRlVOQ1RJT04gX2RvbmUnKVxuICAgIGlmIChzdGF0cy5jb21waWxhdGlvbi5lcnJvcnMgJiYgc3RhdHMuY29tcGlsYXRpb24uZXJyb3JzLmxlbmd0aCkgLy8gJiYgcHJvY2Vzcy5hcmd2LmluZGV4T2YoJy0td2F0Y2gnKSA9PSAtMSlcbiAgICB7XG4gICAgICB2YXIgY2hhbGsgPSByZXF1aXJlKCdjaGFsaycpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKCcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKionKSk7XG4gICAgICBjb25zb2xlLmxvZyhzdGF0cy5jb21waWxhdGlvbi5lcnJvcnNbMF0pO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKCcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKionKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuXG4gICAgLy9tamcgcmVmYWN0b3JcbiAgICBpZiAodmFycy5wcm9kdWN0aW9uID09IHRydWUgJiYgb3B0aW9ucy50cmVlc2hha2UgPT0gJ25vJyAmJiBmcmFtZXdvcmsgPT0gJ2FuZ3VsYXInKSB7XG4gICAgICByZXF1aXJlKGAuLyR7b3B0aW9ucy5mcmFtZXdvcmt9VXRpbGApLl90b0Rldih2YXJzLCBvcHRpb25zKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgaWYob3B0aW9ucy5icm93c2VyID09ICd5ZXMnICYmIG9wdGlvbnMud2F0Y2ggPT0gJ3llcycgJiYgdmFycy5wcm9kdWN0aW9uID09IGZhbHNlKSB7XG4gICAgICAgIGlmICh2YXJzLmJyb3dzZXJDb3VudCA9PSAwKSB7XG4gICAgICAgICAgdmFyIHVybCA9ICdodHRwOi8vbG9jYWxob3N0OicgKyBvcHRpb25zLnBvcnRcbiAgICAgICAgICByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2codmFycy5hcHAsIGBPcGVuaW5nIGJyb3dzZXIgYXQgJHt1cmx9YClcbiAgICAgICAgICB2YXJzLmJyb3dzZXJDb3VudCsrXG4gICAgICAgICAgY29uc3Qgb3BuID0gcmVxdWlyZSgnb3BuJylcbiAgICAgICAgICBvcG4odXJsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmxvZyhlKVxuICAgIH1cbiAgICBpZiAodmFycy5idWlsZHN0ZXAgPT0gJzEgb2YgMScpIHtcbiAgICAgIGlmICh2YXJzLnByb2R1Y3Rpb24gPT0gdHJ1ZSkge1xuICAgICAgICByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2codmFycy5hcHAsIGBFbmRpbmcgcHJvZHVjdGlvbiBidWlsZGApXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9nKHZhcnMuYXBwLCBgRW5kaW5nIGRldmVsb3BtZW50IGJ1aWxkYClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZhcnMuYnVpbGRzdGVwID09ICcyIG9mIDInKSB7XG4gICAgICByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2codmFycy5hcHAsIGBFbmRpbmcgcHJvZHVjdGlvbiBidWlsZGApXG4gICAgfVxuICB9XG4gIGNhdGNoKGUpIHtcbi8vICAgIHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3Yob3B0aW9ucy52ZXJib3NlLGUpXG4gICAgdGhyb3cgJ19kb25lOiAnICsgZS50b1N0cmluZygpXG4gIH1cbn1cblxuLy8qKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gX3ByZXBhcmVGb3JCdWlsZChhcHAsIHZhcnMsIG9wdGlvbnMsIG91dHB1dCwgY29tcGlsYXRpb24pIHtcbiAgdHJ5IHtcbiAgICB2YXIgdmVyYm9zZSA9IG9wdGlvbnMudmVyYm9zZVxuICAgIHZhciBwYWNrYWdlcyA9IG9wdGlvbnMucGFja2FnZXNcbiAgICB2YXIgdG9vbGtpdCA9IG9wdGlvbnMudG9vbGtpdFxuICAgIHZhciB0aGVtZSA9IG9wdGlvbnMudGhlbWVcbiAgICBsb2d2KHZlcmJvc2UsJ0ZVTkNUSU9OIF9wcmVwYXJlRm9yQnVpbGQnKVxuICAgIGNvbnN0IHJpbXJhZiA9IHJlcXVpcmUoJ3JpbXJhZicpXG4gICAgY29uc3QgbWtkaXJwID0gcmVxdWlyZSgnbWtkaXJwJylcbiAgICBjb25zdCBmc3ggPSByZXF1aXJlKCdmcy1leHRyYScpXG4gICAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpXG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuICAgIHRoZW1lID0gdGhlbWUgfHwgKHRvb2xraXQgPT09ICdjbGFzc2ljJyA/ICd0aGVtZS10cml0b24nIDogJ3RoZW1lLW1hdGVyaWFsJylcbiAgICBsb2d2KHZlcmJvc2UsJ2ZpcnN0VGltZTogJyArIHZhcnMuZmlyc3RUaW1lKVxuICAgIGlmICh2YXJzLmZpcnN0VGltZSkge1xuICAgICAgcmltcmFmLnN5bmMob3V0cHV0KVxuICAgICAgbWtkaXJwLnN5bmMob3V0cHV0KVxuICAgICAgY29uc3QgYnVpbGRYTUwgPSByZXF1aXJlKCcuL2FydGlmYWN0cycpLmJ1aWxkWE1MXG4gICAgICBjb25zdCBjcmVhdGVBcHBKc29uID0gcmVxdWlyZSgnLi9hcnRpZmFjdHMnKS5jcmVhdGVBcHBKc29uXG4gICAgICBjb25zdCBjcmVhdGVXb3Jrc3BhY2VKc29uID0gcmVxdWlyZSgnLi9hcnRpZmFjdHMnKS5jcmVhdGVXb3Jrc3BhY2VKc29uXG4gICAgICBjb25zdCBjcmVhdGVKU0RPTUVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9hcnRpZmFjdHMnKS5jcmVhdGVKU0RPTUVudmlyb25tZW50XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihvdXRwdXQsICdidWlsZC54bWwnKSwgYnVpbGRYTUwodmFycy5wcm9kdWN0aW9uLCBvcHRpb25zLCBvdXRwdXQpLCAndXRmOCcpXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihvdXRwdXQsICdhcHAuanNvbicpLCBjcmVhdGVBcHBKc29uKHRoZW1lLCBwYWNrYWdlcywgdG9vbGtpdCwgb3B0aW9ucywgb3V0cHV0KSwgJ3V0ZjgnKVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ob3V0cHV0LCAnanNkb20tZW52aXJvbm1lbnQuanMnKSwgY3JlYXRlSlNET01FbnZpcm9ubWVudChvcHRpb25zLCBvdXRwdXQpLCAndXRmOCcpXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihvdXRwdXQsICd3b3Jrc3BhY2UuanNvbicpLCBjcmVhdGVXb3Jrc3BhY2VKc29uKG9wdGlvbnMsIG91dHB1dCksICd1dGY4JylcbiAgICAgIHZhciBmcmFtZXdvcmsgPSB2YXJzLmZyYW1ld29yaztcbiAgICAgIC8vYmVjYXVzZSBvZiBhIHByb2JsZW0gd2l0aCBjb2xvcnBpY2tlclxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksYGV4dC0ke2ZyYW1ld29ya30vdXgvYCkpKSB7XG4gICAgICAgIHZhciBmcm9tUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBgZXh0LSR7ZnJhbWV3b3JrfS91eC9gKVxuICAgICAgICB2YXIgdG9QYXRoID0gcGF0aC5qb2luKG91dHB1dCwgJ3V4JylcbiAgICAgICAgZnN4LmNvcHlTeW5jKGZyb21QYXRoLCB0b1BhdGgpXG4gICAgICAgIGxvZyhhcHAsICdDb3B5aW5nICh1eCkgJyArIGZyb21QYXRoLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpICsgJyB0bzogJyArIHRvUGF0aC5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKSlcbiAgICAgIH1cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLGBleHQtJHtmcmFtZXdvcmt9L3BhY2thZ2VzL2ApKSkge1xuICAgICAgICB2YXIgZnJvbVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgYGV4dC0ke2ZyYW1ld29ya30vcGFja2FnZXMvYClcbiAgICAgICAgdmFyIHRvUGF0aCA9IHBhdGguam9pbihvdXRwdXQsICdwYWNrYWdlcycpXG4gICAgICAgIGZzeC5jb3B5U3luYyhmcm9tUGF0aCwgdG9QYXRoKVxuICAgICAgICBsb2coYXBwLCAnQ29weWluZyAnICsgZnJvbVBhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykgKyAnIHRvOiAnICsgdG9QYXRoLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpKVxuICAgICAgfVxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksYGV4dC0ke2ZyYW1ld29ya30vb3ZlcnJpZGVzL2ApKSkge1xuICAgICAgICB2YXIgZnJvbVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgYGV4dC0ke2ZyYW1ld29ya30vb3ZlcnJpZGVzL2ApXG4gICAgICAgIHZhciB0b1BhdGggPSBwYXRoLmpvaW4ob3V0cHV0LCAnb3ZlcnJpZGVzJylcbiAgICAgICAgZnN4LmNvcHlTeW5jKGZyb21QYXRoLCB0b1BhdGgpXG4gICAgICAgIGxvZyhhcHAsICdDb3B5aW5nICcgKyBmcm9tUGF0aC5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKSArICcgdG86ICcgKyB0b1BhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykpXG4gICAgICB9XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwncmVzb3VyY2VzLycpKSkge1xuICAgICAgICB2YXIgZnJvbVJlc291cmNlcyA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAncmVzb3VyY2VzLycpXG4gICAgICAgIHZhciB0b1Jlc291cmNlcyA9IHBhdGguam9pbihvdXRwdXQsICcuLi9yZXNvdXJjZXMnKVxuICAgICAgICBmc3guY29weVN5bmMoZnJvbVJlc291cmNlcywgdG9SZXNvdXJjZXMpXG4gICAgICAgIGxvZyhhcHAsICdDb3B5aW5nICcgKyBmcm9tUmVzb3VyY2VzLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpICsgJyB0bzogJyArIHRvUmVzb3VyY2VzLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpKVxuICAgICAgfVxuICAgIH1cbiAgICB2YXJzLmZpcnN0VGltZSA9IGZhbHNlXG4gICAgdmFyIGpzID0gJydcbiAgICBpZiAodmFycy5wcm9kdWN0aW9uKSB7XG4gICAgICBqcyA9IHZhcnMuZGVwcy5qb2luKCc7XFxuJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAganMgPSAnRXh0LnJlcXVpcmUoW1wiRXh0LipcIixcIkV4dC5kYXRhLlRyZWVTdG9yZVwiXSknXG4gICAgfVxuICAgIGlmICh2YXJzLm1hbmlmZXN0ID09PSBudWxsIHx8IGpzICE9PSB2YXJzLm1hbmlmZXN0KSB7XG4gICAgICB2YXJzLm1hbmlmZXN0ID0ganNcbiAgICAgIGNvbnN0IG1hbmlmZXN0ID0gcGF0aC5qb2luKG91dHB1dCwgJ21hbmlmZXN0LmpzJylcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMobWFuaWZlc3QsIGpzLCAndXRmOCcpXG4gICAgICB2YXJzLnJlYnVpbGQgPSB0cnVlXG4gICAgICB2YXIgYnVuZGxlRGlyID0gb3V0cHV0LnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpXG4gICAgICBpZiAoYnVuZGxlRGlyLnRyaW0oKSA9PSAnJykge2J1bmRsZURpciA9ICcuLyd9XG4gICAgICBsb2coYXBwLCAnQnVpbGRpbmcgRXh0IGJ1bmRsZSBhdDogJyArIGJ1bmRsZURpcilcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB2YXJzLnJlYnVpbGQgPSBmYWxzZVxuICAgICAgbG9nKGFwcCwgJ0V4dCByZWJ1aWxkIE5PVCBuZWVkZWQnKVxuICAgIH1cbiAgfVxuICBjYXRjaChlKSB7XG4gICAgcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndihvcHRpb25zLnZlcmJvc2UsZSlcbiAgICBjb21waWxhdGlvbi5lcnJvcnMucHVzaCgnX3ByZXBhcmVGb3JCdWlsZDogJyArIGUpXG4gIH1cbn1cblxuLy8qKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gX2J1aWxkRXh0QnVuZGxlKGFwcCwgY29tcGlsYXRpb24sIG91dHB1dFBhdGgsIHBhcm1zLCB2YXJzLCBvcHRpb25zKSB7XG4vLyAgdHJ5IHtcbiAgICB2YXIgdmVyYm9zZSA9IG9wdGlvbnMudmVyYm9zZVxuICAgIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKVxuICAgIGxvZ3YodmVyYm9zZSwnRlVOQ1RJT04gX2J1aWxkRXh0QnVuZGxlJylcbiAgICBsZXQgc2VuY2hhOyB0cnkgeyBzZW5jaGEgPSByZXF1aXJlKCdAc2VuY2hhL2NtZCcpIH0gY2F0Y2ggKGUpIHsgc2VuY2hhID0gJ3NlbmNoYScgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHNlbmNoYSkpIHtcbiAgICAgIGxvZ3YodmVyYm9zZSwnc2VuY2hhIGZvbGRlciBleGlzdHMnKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxvZ3YodmVyYm9zZSwnc2VuY2hhIGZvbGRlciBET0VTIE5PVCBleGlzdCcpXG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvbkJ1aWxkRG9uZSA9ICgpID0+IHtcbiAgICAgICAgbG9ndih2ZXJib3NlLCdvbkJ1aWxkRG9uZScpXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuICAgICAgdmFyIG9wdHMgPSB7IGN3ZDogb3V0cHV0UGF0aCwgc2lsZW50OiB0cnVlLCBzdGRpbzogJ3BpcGUnLCBlbmNvZGluZzogJ3V0Zi04J31cbiAgICAgIF9leGVjdXRlQXN5bmMoYXBwLCBzZW5jaGEsIHBhcm1zLCBvcHRzLCBjb21waWxhdGlvbiwgdmFycywgb3B0aW9ucykudGhlbiAoXG4gICAgICAgIGZ1bmN0aW9uKCkgeyBvbkJ1aWxkRG9uZSgpIH0sIFxuICAgICAgICBmdW5jdGlvbihyZWFzb24pIHsgcmVqZWN0KHJlYXNvbikgfVxuICAgICAgKVxuICAgIH0pXG4gIC8vIH1cbiAgLy8gY2F0Y2goZSkge1xuICAvLyAgIGNvbnNvbGUubG9nKCdlJylcbiAgLy8gICByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2KG9wdGlvbnMudmVyYm9zZSxlKVxuICAvLyAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCdfYnVpbGRFeHRCdW5kbGU6ICcgKyBlKVxuICAvLyAgIGNhbGxiYWNrKClcbiAgLy8gfVxufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfZXhlY3V0ZUFzeW5jIChhcHAsIGNvbW1hbmQsIHBhcm1zLCBvcHRzLCBjb21waWxhdGlvbiwgdmFycywgb3B0aW9ucykge1xuLy8gIHRyeSB7XG4gICAgdmFyIHZlcmJvc2UgPSBvcHRpb25zLnZlcmJvc2VcbiAgICB2YXIgZnJhbWV3b3JrID0gb3B0aW9ucy5mcmFtZXdvcmtcbiAgICAvL2NvbnN0IERFRkFVTFRfU1VCU1RSUyA9IFsnW0lORl0gTG9hZGluZycsICdbSU5GXSBQcm9jZXNzaW5nJywgJ1tMT0ddIEZhc2hpb24gYnVpbGQgY29tcGxldGUnLCAnW0VSUl0nLCAnW1dSTl0nLCBcIltJTkZdIFNlcnZlclwiLCBcIltJTkZdIFdyaXRpbmdcIiwgXCJbSU5GXSBMb2FkaW5nIEJ1aWxkXCIsIFwiW0lORl0gV2FpdGluZ1wiLCBcIltMT0ddIEZhc2hpb24gd2FpdGluZ1wiXTtcbiAgICBjb25zdCBERUZBVUxUX1NVQlNUUlMgPSBbXCJbSU5GXSB4U2VydmVyXCIsICdbSU5GXSBMb2FkaW5nJywgJ1tJTkZdIEFwcGVuZCcsICdbSU5GXSBQcm9jZXNzaW5nJywgJ1tJTkZdIFByb2Nlc3NpbmcgQnVpbGQnLCAnW0xPR10gRmFzaGlvbiBidWlsZCBjb21wbGV0ZScsICdbRVJSXScsICdbV1JOXScsIFwiW0lORl0gV3JpdGluZ1wiLCBcIltJTkZdIExvYWRpbmcgQnVpbGRcIiwgXCJbSU5GXSBXYWl0aW5nXCIsIFwiW0xPR10gRmFzaGlvbiB3YWl0aW5nXCJdO1xuICAgIHZhciBzdWJzdHJpbmdzID0gREVGQVVMVF9TVUJTVFJTIFxuICAgIHZhciBjaGFsayA9IHJlcXVpcmUoJ2NoYWxrJylcbiAgICBjb25zdCBjcm9zc1NwYXduID0gcmVxdWlyZSgnY3Jvc3Mtc3Bhd24nKVxuICAgIGxvZ3YodmVyYm9zZSwgJ0ZVTkNUSU9OIF9leGVjdXRlQXN5bmMnKVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxvZ3YodmVyYm9zZSxgY29tbWFuZCAtICR7Y29tbWFuZH1gKVxuICAgICAgbG9ndih2ZXJib3NlLCBgcGFybXMgLSAke3Bhcm1zfWApXG4gICAgICBsb2d2KHZlcmJvc2UsIGBvcHRzIC0gJHtKU09OLnN0cmluZ2lmeShvcHRzKX1gKVxuICAgICAgbGV0IGNoaWxkID0gY3Jvc3NTcGF3bihjb21tYW5kLCBwYXJtcywgb3B0cylcbiAgICAgIGNoaWxkLm9uKCdjbG9zZScsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgbG9ndih2ZXJib3NlLCBgb24gY2xvc2U6IGAgKyBjb2RlKSBcbiAgICAgICAgaWYoY29kZSA9PT0gMCkgeyByZXNvbHZlKDApIH1cbiAgICAgICAgZWxzZSB7IGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCBuZXcgRXJyb3IoY29kZSkgKTsgcmVzb2x2ZSgwKSB9XG4gICAgICB9KVxuICAgICAgY2hpbGQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7IFxuICAgICAgICBsb2d2KHZlcmJvc2UsIGBvbiBlcnJvcmApIFxuICAgICAgICBjb21waWxhdGlvbi5lcnJvcnMucHVzaChlcnJvcilcbiAgICAgICAgcmVzb2x2ZSgwKVxuICAgICAgfSlcbiAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIHZhciBzdHIgPSBkYXRhLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCIgXCIpLnRyaW0oKVxuICAgICAgICBsb2d2KHZlcmJvc2UsIGAke3N0cn1gKVxuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnRvU3RyaW5nKCkubWF0Y2goL0Zhc2hpb24gd2FpdGluZyBmb3IgY2hhbmdlc1xcLlxcLlxcLi8pKSB7XG5cbiAgICAgICAgICBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gICAgICAgICAgdmFyIGZpbGVuYW1lID0gcHJvY2Vzcy5jd2QoKSArIHZhcnMudG91Y2hGaWxlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKVxuICAgICAgICAgICAgdmFyIGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZW5hbWUpO1xuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlbmFtZSwgJy8vJyArIGQsICd1dGY4Jyk7XG4gICAgICAgICAgICBsb2coYXBwLCBgdG91Y2hpbmcgJHtmaWxlbmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgbG9nKGFwcCwgYE5PVCB0b3VjaGluZyAke2ZpbGVuYW1lfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoMClcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoc3Vic3RyaW5ncy5zb21lKGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGRhdGEuaW5kZXhPZih2KSA+PSAwOyB9KSkgeyBcbiAgICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKFwiW0lORl1cIiwgXCJcIilcbiAgICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKFwiW0xPR11cIiwgXCJcIilcbiAgICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKS50cmltKClcbiAgICAgICAgICAgIGlmIChzdHIuaW5jbHVkZXMoXCJbRVJSXVwiKSkge1xuICAgICAgICAgICAgICBjb21waWxhdGlvbi5lcnJvcnMucHVzaChhcHAgKyBzdHIucmVwbGFjZSgvXlxcW0VSUlxcXSAvZ2ksICcnKSk7XG4gICAgICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKFwiW0VSUl1cIiwgYCR7Y2hhbGsucmVkKFwiW0VSUl1cIil9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZyhhcHAsIHN0cikgXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgbG9ndihvcHRpb25zLCBgZXJyb3Igb24gY2xvc2U6IGAgKyBkYXRhKSBcbiAgICAgICAgdmFyIHN0ciA9IGRhdGEudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIiBcIikudHJpbSgpXG4gICAgICAgIHZhciBzdHJKYXZhT3B0cyA9IFwiUGlja2VkIHVwIF9KQVZBX09QVElPTlNcIjtcbiAgICAgICAgdmFyIGluY2x1ZGVzID0gc3RyLmluY2x1ZGVzKHN0ckphdmFPcHRzKVxuICAgICAgICBpZiAoIWluY2x1ZGVzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCR7YXBwfSAke2NoYWxrLnJlZChcIltFUlJdXCIpfSAke3N0cn1gKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIC8vIH1cbiAgLy8gY2F0Y2goZSkge1xuICAvLyAgIGxvZ3Yob3B0aW9ucyxlKVxuICAvLyAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCdfZXhlY3V0ZUFzeW5jOiAnICsgZSlcbiAgLy8gICBjYWxsYmFjaygpXG4gIC8vIH0gXG59XG5cbi8vKioqKioqKioqKlxuZnVuY3Rpb24gcnVuU2NyaXB0KHNjcmlwdFBhdGgsIGNhbGxiYWNrKSB7XG4gIHZhciBjaGlsZFByb2Nlc3MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7XG4gIC8vIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBjYWxsYmFjayBoYXMgYmVlbiBpbnZva2VkIHRvIHByZXZlbnQgbXVsdGlwbGUgaW52b2NhdGlvbnNcbiAgdmFyIGludm9rZWQgPSBmYWxzZTtcbiAgdmFyIHByb2Nlc3MgPSBjaGlsZFByb2Nlc3MuZm9yayhzY3JpcHRQYXRoKTtcbiAgLy8gbGlzdGVuIGZvciBlcnJvcnMgYXMgdGhleSBtYXkgcHJldmVudCB0aGUgZXhpdCBldmVudCBmcm9tIGZpcmluZ1xuICBwcm9jZXNzLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoaW52b2tlZCkgcmV0dXJuO1xuICAgIGludm9rZWQgPSB0cnVlO1xuICAgIGNhbGxiYWNrKGVycik7XG4gIH0pO1xuICAvLyBleGVjdXRlIHRoZSBjYWxsYmFjayBvbmNlIHRoZSBwcm9jZXNzIGhhcyBmaW5pc2hlZCBydW5uaW5nXG4gIHByb2Nlc3Mub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSkge1xuICAgIGlmIChpbnZva2VkKSByZXR1cm47XG4gICAgaW52b2tlZCA9IHRydWU7XG4gICAgdmFyIGVyciA9IGNvZGUgPT09IDAgPyBudWxsIDogbmV3IEVycm9yKCdleGl0IGNvZGUgJyArIGNvZGUpO1xuICAgIGNhbGxiYWNrKGVycik7XG4gIH0pO1xufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBfdG9YdHlwZShzdHIpIHtcbiAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgJy0nKVxufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBfZ2V0QXBwKCkge1xuICB2YXIgY2hhbGsgPSByZXF1aXJlKCdjaGFsaycpXG4gIHZhciBwcmVmaXggPSBgYFxuICBjb25zdCBwbGF0Zm9ybSA9IHJlcXVpcmUoJ29zJykucGxhdGZvcm0oKVxuICBpZiAocGxhdGZvcm0gPT0gJ2RhcndpbicpIHsgcHJlZml4ID0gYOKEuSDvvaJleHTvvaM6YCB9XG4gIGVsc2UgeyBwcmVmaXggPSBgaSBbZXh0XTpgIH1cbiAgcmV0dXJuIGAke2NoYWxrLmdyZWVuKHByZWZpeCl9IGBcbn1cblxuLy8qKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gX2dldFZlcnNpb25zKHBsdWdpbk5hbWUsIGZyYW1ld29ya05hbWUpIHtcbiAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuICBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJylcbiAgdmFyIHYgPSB7fVxuICB2YXIgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCdub2RlX21vZHVsZXMvQHNlbmNoYScsIHBsdWdpbk5hbWUpXG4gIHZhciBwbHVnaW5Qa2cgPSAoZnMuZXhpc3RzU3luYyhwbHVnaW5QYXRoKycvcGFja2FnZS5qc29uJykgJiYgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGx1Z2luUGF0aCsnL3BhY2thZ2UuanNvbicsICd1dGYtOCcpKSB8fCB7fSk7XG4gIHYucGx1Z2luVmVyc2lvbiA9IHBsdWdpblBrZy52ZXJzaW9uXG4gIHYuX3Jlc29sdmVkID0gcGx1Z2luUGtnLl9yZXNvbHZlZFxuICBpZiAodi5fcmVzb2x2ZWQgPT0gdW5kZWZpbmVkKSB7XG4gICAgdi5lZGl0aW9uID0gYENvbW1lcmNpYWxgXG4gIH1cbiAgZWxzZSB7XG4gICAgaWYgKC0xID09IHYuX3Jlc29sdmVkLmluZGV4T2YoJ2NvbW11bml0eScpKSB7XG4gICAgICB2LmVkaXRpb24gPSBgQ29tbWVyY2lhbGBcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB2LmVkaXRpb24gPSBgQ29tbXVuaXR5YFxuICAgIH1cbiAgfVxuICB2YXIgd2VicGFja1BhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwnbm9kZV9tb2R1bGVzL3dlYnBhY2snKVxuICB2YXIgd2VicGFja1BrZyA9IChmcy5leGlzdHNTeW5jKHdlYnBhY2tQYXRoKycvcGFja2FnZS5qc29uJykgJiYgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMod2VicGFja1BhdGgrJy9wYWNrYWdlLmpzb24nLCAndXRmLTgnKSkgfHwge30pO1xuICB2LndlYnBhY2tWZXJzaW9uID0gd2VicGFja1BrZy52ZXJzaW9uXG4gIHZhciBleHRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksJ25vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dCcpXG4gIHZhciBleHRQa2cgPSAoZnMuZXhpc3RzU3luYyhleHRQYXRoKycvcGFja2FnZS5qc29uJykgJiYgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZXh0UGF0aCsnL3BhY2thZ2UuanNvbicsICd1dGYtOCcpKSB8fCB7fSk7XG4gIHYuZXh0VmVyc2lvbiA9IGV4dFBrZy5zZW5jaGEudmVyc2lvblxuICB2YXIgY21kUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLGBub2RlX21vZHVsZXMvQHNlbmNoYS9jbWRgKVxuICB2YXIgY21kUGtnID0gKGZzLmV4aXN0c1N5bmMoY21kUGF0aCsnL3BhY2thZ2UuanNvbicpICYmIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNtZFBhdGgrJy9wYWNrYWdlLmpzb24nLCAndXRmLTgnKSkgfHwge30pO1xuICB2LmNtZFZlcnNpb24gPSBjbWRQa2cudmVyc2lvbl9mdWxsXG4gIGlmICh2LmNtZFZlcnNpb24gPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGNtZFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSxgbm9kZV9tb2R1bGVzL0BzZW5jaGEvJHtwbHVnaW5OYW1lfS9ub2RlX21vZHVsZXMvQHNlbmNoYS9jbWRgKVxuICAgIHZhciBjbWRQa2cgPSAoZnMuZXhpc3RzU3luYyhjbWRQYXRoKycvcGFja2FnZS5qc29uJykgJiYgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY21kUGF0aCsnL3BhY2thZ2UuanNvbicsICd1dGYtOCcpKSB8fCB7fSk7XG4gICAgdi5jbWRWZXJzaW9uID0gY21kUGtnLnZlcnNpb25fZnVsbFxuICB9XG4gIHZhciBmcmFtZXdvcmtJbmZvID0gJydcbiAgIGlmIChmcmFtZXdvcmtOYW1lICE9IHVuZGVmaW5lZCAmJiBmcmFtZXdvcmtOYW1lICE9ICdleHRqcycpIHtcbiAgICB2YXIgZnJhbWV3b3JrUGF0aCA9ICcnXG4gICAgaWYgKGZyYW1ld29ya05hbWUgPT0gJ3JlYWN0Jykge1xuICAgICAgZnJhbWV3b3JrUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCdub2RlX21vZHVsZXMvcmVhY3QnKVxuICAgIH1cbiAgICBpZiAoZnJhbWV3b3JrTmFtZSA9PSAnYW5ndWxhcicpIHtcbiAgICAgIGZyYW1ld29ya1BhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwnbm9kZV9tb2R1bGVzL0Bhbmd1bGFyL2NvcmUnKVxuICAgIH1cbiAgICB2YXIgZnJhbWV3b3JrUGtnID0gKGZzLmV4aXN0c1N5bmMoZnJhbWV3b3JrUGF0aCsnL3BhY2thZ2UuanNvbicpICYmIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGZyYW1ld29ya1BhdGgrJy9wYWNrYWdlLmpzb24nLCAndXRmLTgnKSkgfHwge30pO1xuICAgIHYuZnJhbWV3b3JrVmVyc2lvbiA9IGZyYW1ld29ya1BrZy52ZXJzaW9uXG4gICAgZnJhbWV3b3JrSW5mbyA9ICcsICcgKyBmcmFtZXdvcmtOYW1lICsgJyB2JyArIHYuZnJhbWV3b3JrVmVyc2lvblxuICB9XG4gIHJldHVybiAnZXh0LXJlYWN0LXdlYnBhY2stcGx1Z2luIHYnICsgdi5wbHVnaW5WZXJzaW9uICsgJywgRXh0IEpTIHYnICsgdi5leHRWZXJzaW9uICsgJyAnICsgdi5lZGl0aW9uICsgJyBFZGl0aW9uLCBTZW5jaGEgQ21kIHYnICsgdi5jbWRWZXJzaW9uICsgJywgd2VicGFjayB2JyArIHYud2VicGFja1ZlcnNpb24gKyBmcmFtZXdvcmtJbmZvXG4gfVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBsb2coYXBwLG1lc3NhZ2UpIHtcbiAgdmFyIHMgPSBhcHAgKyBtZXNzYWdlIFxuICByZXF1aXJlKCdyZWFkbGluZScpLmN1cnNvclRvKHByb2Nlc3Muc3Rkb3V0LCAwKVxuICB0cnkge3Byb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgpfWNhdGNoKGUpIHt9XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHMpO3Byb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKVxufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBsb2doKGFwcCxtZXNzYWdlKSB7XG4gIHZhciBoID0gZmFsc2VcbiAgdmFyIHMgPSBhcHAgKyBtZXNzYWdlIFxuICBpZiAoaCA9PSB0cnVlKSB7XG4gICAgcmVxdWlyZSgncmVhZGxpbmUnKS5jdXJzb3JUbyhwcm9jZXNzLnN0ZG91dCwgMClcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQuY2xlYXJMaW5lKClcbiAgICB9XG4gICAgY2F0Y2goZSkge31cbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShzKVxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKVxuICB9XG59XG5cbi8vKioqKioqKioqKlxuZXhwb3J0IGZ1bmN0aW9uIGxvZ3YodmVyYm9zZSwgcykge1xuICBpZiAodmVyYm9zZSA9PSAneWVzJykge1xuICAgIHJlcXVpcmUoJ3JlYWRsaW5lJykuY3Vyc29yVG8ocHJvY2Vzcy5zdGRvdXQsIDApXG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgpXG4gICAgfVxuICAgIGNhdGNoKGUpIHt9XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYC12ZXJib3NlOiAke3N9YClcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJylcbiAgfVxufVxuXG5mdW5jdGlvbiBfZ2V0VmFsaWRhdGVPcHRpb25zKCkge1xuICByZXR1cm4ge1xuICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuICAgIFwicHJvcGVydGllc1wiOiB7XG4gICAgICBcImZyYW1ld29ya1wiOiB7XG4gICAgICAgIFwidHlwZVwiOiBbXCJzdHJpbmdcIl1cbiAgICAgIH0sXG4gICAgICBcInRvb2xraXRcIjoge1xuICAgICAgICBcInR5cGVcIjogW1wic3RyaW5nXCJdXG4gICAgICB9LFxuICAgICAgXCJ0aGVtZVwiOiB7XG4gICAgICAgIFwidHlwZVwiOiBbXCJzdHJpbmdcIl1cbiAgICAgIH0sXG4gICAgICBcImVtaXRcIjoge1xuICAgICAgICBcImVycm9yTWVzc2FnZVwiOiBcInNob3VsZCBiZSAneWVzJyBvciAnbm8nIHN0cmluZyB2YWx1ZSAoTk9UIHRydWUgb3IgZmFsc2UpXCIsXG4gICAgICAgIFwidHlwZVwiOiBbXCJzdHJpbmdcIl1cbiAgICAgIH0sXG4gICAgICBcInNjcmlwdFwiOiB7XG4gICAgICAgIFwidHlwZVwiOiBbXCJzdHJpbmdcIl1cbiAgICAgIH0sXG4gICAgICBcInBvcnRcIjoge1xuICAgICAgICBcInR5cGVcIjogW1wiaW50ZWdlclwiXVxuICAgICAgfSxcbiAgICAgIFwicGFja2FnZXNcIjoge1xuICAgICAgICBcInR5cGVcIjogW1wic3RyaW5nXCIsIFwiYXJyYXlcIl1cbiAgICAgIH0sXG4gICAgICBcInByb2ZpbGVcIjoge1xuICAgICAgICBcInR5cGVcIjogW1wic3RyaW5nXCJdXG4gICAgICB9LFxuICAgICAgXCJlbnZpcm9ubWVudFwiOiB7XG4gICAgICAgIFwiZXJyb3JNZXNzYWdlXCI6IFwic2hvdWxkIGJlICdkZXZlbG9wbWVudCcgb3IgJ3Byb2R1Y3Rpb24nIHN0cmluZyB2YWx1ZVwiLFxuICAgICAgICBcInR5cGVcIjogW1wic3RyaW5nXCJdXG4gICAgICB9LFxuICAgICAgXCJ0cmVlc2hha2VcIjoge1xuICAgICAgICBcImVycm9yTWVzc2FnZVwiOiBcInNob3VsZCBiZSAneWVzJyBvciAnbm8nIHN0cmluZyB2YWx1ZSAoTk9UIHRydWUgb3IgZmFsc2UpXCIsXG4gICAgICAgIFwidHlwZVwiOiBbXCJzdHJpbmdcIl1cbiAgICAgIH0sXG4gICAgICBcImJyb3dzZXJcIjoge1xuICAgICAgICBcImVycm9yTWVzc2FnZVwiOiBcInNob3VsZCBiZSAneWVzJyBvciAnbm8nIHN0cmluZyB2YWx1ZSAoTk9UIHRydWUgb3IgZmFsc2UpXCIsXG4gICAgICAgIFwidHlwZVwiOiBbXCJzdHJpbmdcIl1cbiAgICAgIH0sXG4gICAgICBcIndhdGNoXCI6IHtcbiAgICAgICAgXCJlcnJvck1lc3NhZ2VcIjogXCJzaG91bGQgYmUgJ3llcycgb3IgJ25vJyBzdHJpbmcgdmFsdWUgKE5PVCB0cnVlIG9yIGZhbHNlKVwiLFxuICAgICAgICBcInR5cGVcIjogW1wic3RyaW5nXCJdXG4gICAgICB9LFxuICAgICAgXCJ2ZXJib3NlXCI6IHtcbiAgICAgICAgXCJlcnJvck1lc3NhZ2VcIjogXCJzaG91bGQgYmUgJ3llcycgb3IgJ25vJyBzdHJpbmcgdmFsdWUgKE5PVCB0cnVlIG9yIGZhbHNlKVwiLFxuICAgICAgICBcInR5cGVcIjogW1wic3RyaW5nXCJdXG4gICAgICB9XG4gICAgfSxcbiAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IGZhbHNlXG4gIH07XG59XG5cblxuZnVuY3Rpb24gX2dldERlZmF1bHRPcHRpb25zKCkge1xuICByZXR1cm4ge1xuICAgIGZyYW1ld29yazogJ2V4dGpzJyxcbiAgICB0b29sa2l0OiAnbW9kZXJuJyxcbiAgICB0aGVtZTogJ3RoZW1lLW1hdGVyaWFsJyxcbiAgICBlbWl0OiAneWVzJyxcbiAgICBzY3JpcHQ6IG51bGwsXG4gICAgcG9ydDogMTk2MixcbiAgICBwYWNrYWdlczogW10sXG5cbiAgICBwcm9maWxlOiAnJywgXG4gICAgZW52aXJvbm1lbnQ6ICdkZXZlbG9wbWVudCcsIFxuICAgIHRyZWVzaGFrZTogJ25vJyxcbiAgICBicm93c2VyOiAneWVzJyxcbiAgICB3YXRjaDogJ3llcycsXG4gICAgdmVyYm9zZTogJ25vJ1xuICB9XG59XG5cblxuIl19 \ No newline at end of file diff --git a/packages/ext-react-webpack-plugin/dist/reactUtil.js b/packages/ext-react-webpack-plugin/dist/reactUtil.js index 57e2847d..3685a520 100644 --- a/packages/ext-react-webpack-plugin/dist/reactUtil.js +++ b/packages/ext-react-webpack-plugin/dist/reactUtil.js @@ -3,193 +3,109 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.getValidateOptions = getValidateOptions; -exports.getDefaultOptions = getDefaultOptions; -exports.getDefaultVars = getDefaultVars; -exports.extractFromSource = extractFromSource; -exports._done = _done; +exports._getDefaultVars = _getDefaultVars; +exports._extractFromSource = _extractFromSource; -function getValidateOptions() { - return { - "type": "object", - "properties": { - "framework": { - "type": ["string"] - }, - "toolkit": { - "type": ["string"] - }, - "port": { - "type": ["integer"] - }, - "emit": { - "type": ["boolean"] - }, - "browser": { - "type": ["boolean"] - }, - "watch": { - "type": ["string"] - }, - "profile": { - "type": ["string"] - }, - "environment": { - "type": ["string"] - }, - "verbose": { - "type": ["string"] - }, - "theme": { - "type": ["string"] - }, - "treeshake": { - "type": ["boolean"] - }, - "packages": { - "type": ["string", "array"] - } - }, - "additionalProperties": false // "errorMessage": { - // "option": "should be {Boolean} (https:/github.com/org/repo#anchor)" - // } - - }; -} - -function getDefaultOptions() { - return { - port: 1962, - emit: true, - browser: true, - watch: 'yes', - profile: '', - environment: 'development', - verbose: 'no', - toolkit: 'modern', - packages: null - }; -} - -function getDefaultVars() { +function _getDefaultVars() { return { + touchFile: '/src/themer.js', watchStarted: false, + buildstep: '1 of 1', firstTime: true, firstCompile: true, browserCount: 0, manifest: null, - extPath: 'ext-react', + extPath: 'ext', pluginErrors: [], deps: [], + usedExtComponents: [], rebuild: true }; } -function toXtype(str) { - return str.toLowerCase().replace(/_/g, '-'); -} +function _extractFromSource(module, options, compilation, extComponents) { + const logv = require('./pluginUtil').logv; -function extractFromSource(module, options, compilation) { - try { - var js = module._source._value; + logv(options.verbose, 'FUNCTION _extractFromSource'); // try { - const logv = require('./pluginUtil').logv; + var js = module._source._value; + logv(options.verbose, 'FUNCTION extractFromSource'); - logv(options, 'FUNCTION extractFromSource'); + var generate = require("@babel/generator").default; - var generate = require("@babel/generator").default; + var parse = require("babylon").parse; - var parse = require("babylon").parse; + var traverse = require("ast-traverse"); - var traverse = require("ast-traverse"); + const statements = []; + const ast = parse(js, { + plugins: ['jsx', 'flow', 'doExpressions', 'objectRestSpread', 'classProperties', 'exportExtensions', 'asyncGenerators', 'functionBind', 'functionSent', 'dynamicImport'], + sourceType: 'module' + }); - const statements = []; - const ast = parse(js, { - plugins: ['jsx', 'flow', 'doExpressions', 'objectRestSpread', 'classProperties', 'exportExtensions', 'asyncGenerators', 'functionBind', 'functionSent', 'dynamicImport'], - sourceType: 'module' - }); + function addType(argNode) { + var type; - function addType(argNode) { - var type; + if (argNode.type === 'StringLiteral') { + var xtype = require('./pluginUtil')._toXtype(argNode.value); - if (argNode.type === 'StringLiteral') { - var xtype = toXtype(argNode.value); - - if (xtype != 'extreact') { - type = { - xtype: toXtype(argNode.value) - }; - } - } else { + if (xtype != 'extreact') { type = { - xclass: js.slice(argNode.start, argNode.end) + xtype: require('./pluginUtil')._toXtype(argNode.value) }; } - - if (type != undefined) { - let config = JSON.stringify(type); - statements.push(`Ext.create(${config})`); - } + } else { + type = { + xclass: js.slice(argNode.start, argNode.end) + }; } - traverse(ast, { - pre: function (node) { - if (node.type === 'CallExpression' && node.callee && node.callee.object && node.callee.object.name === 'Ext') { - statements.push(generate(node).code); - } - - if (node.type == 'VariableDeclarator' && node.init && node.init.type === 'CallExpression' && node.init.callee) { - if (node.init.callee.name == 'reactify') { - for (let i = 0; i < node.init.arguments.length; i++) { - const valueNode = node.init.arguments[i]; - if (!valueNode) continue; - addType(valueNode); - } - } - } // // Convert React.createElement(...) calls to the equivalent Ext.create(...) calls to put in the manifest. - // if (node.type === 'CallExpressionx' - // && node.callee.object - // && node.callee.object.name === 'React' - // && node.callee.property.name === 'createElement') { - // const [props] = node.arguments - // let config - // if (Array.isArray(props.properties)) { - // config = generate(props).code - // for (let key in type) { - // config = `{\n ${key}: '${type[key]}',${config.slice(1)}` - // } - // } else { - // config = JSON.stringify(type) - // } - // } - - } - }); - return statements; - } catch (e) { - console.log(module.resource); - console.log(js); - console.log(e); - compilation.errors.push('extractFromSource: ' + e); - return []; + if (type != undefined) { + let config = JSON.stringify(type); + statements.push(`Ext.create(${config})`); + } } -} //********** + traverse(ast, { + pre: function (node) { + if (node.type === 'CallExpression' && node.callee && node.callee.object && node.callee.object.name === 'Ext') { + statements.push(generate(node).code); + } -function _done(vars, options) { - try { - const log = require('./pluginUtil').log; - - const logv = require('./pluginUtil').logv; - - logv(options, 'FUNCTION _done'); + if (node.type == 'VariableDeclarator' && node.init && node.init.type === 'CallExpression' && node.init.callee) { + if (node.init.callee.name == 'reactify') { + for (let i = 0; i < node.init.arguments.length; i++) { + const valueNode = node.init.arguments[i]; + if (!valueNode) continue; + addType(valueNode); + } + } + } // // Convert React.createElement(...) calls to the equivalent Ext.create(...) calls to put in the manifest. + // if (node.type === 'CallExpressionx' + // && node.callee.object + // && node.callee.object.name === 'React' + // && node.callee.property.name === 'createElement') { + // const [props] = node.arguments + // let config + // if (Array.isArray(props.properties)) { + // config = generate(props).code + // for (let key in type) { + // config = `{\n ${key}: '${type[key]}',${config.slice(1)}` + // } + // } else { + // config = JSON.stringify(type) + // } + // } - try {} catch (e) { - console.log(e); - return []; } - } catch (e) { - require('./pluginUtil').logv(options, e); - } + }); + return statements; // } + // catch(e) { + // console.log(module.resource) + // console.log(js) + // console.log(e) + // compilation.errors.push('extractFromSource: ' + e) + // return [] + // } } -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWFjdFV0aWwuanMiXSwibmFtZXMiOlsiZ2V0VmFsaWRhdGVPcHRpb25zIiwiZ2V0RGVmYXVsdE9wdGlvbnMiLCJwb3J0IiwiZW1pdCIsImJyb3dzZXIiLCJ3YXRjaCIsInByb2ZpbGUiLCJlbnZpcm9ubWVudCIsInZlcmJvc2UiLCJ0b29sa2l0IiwicGFja2FnZXMiLCJnZXREZWZhdWx0VmFycyIsIndhdGNoU3RhcnRlZCIsImZpcnN0VGltZSIsImZpcnN0Q29tcGlsZSIsImJyb3dzZXJDb3VudCIsIm1hbmlmZXN0IiwiZXh0UGF0aCIsInBsdWdpbkVycm9ycyIsImRlcHMiLCJyZWJ1aWxkIiwidG9YdHlwZSIsInN0ciIsInRvTG93ZXJDYXNlIiwicmVwbGFjZSIsImV4dHJhY3RGcm9tU291cmNlIiwibW9kdWxlIiwib3B0aW9ucyIsImNvbXBpbGF0aW9uIiwianMiLCJfc291cmNlIiwiX3ZhbHVlIiwibG9ndiIsInJlcXVpcmUiLCJnZW5lcmF0ZSIsImRlZmF1bHQiLCJwYXJzZSIsInRyYXZlcnNlIiwic3RhdGVtZW50cyIsImFzdCIsInBsdWdpbnMiLCJzb3VyY2VUeXBlIiwiYWRkVHlwZSIsImFyZ05vZGUiLCJ0eXBlIiwieHR5cGUiLCJ2YWx1ZSIsInhjbGFzcyIsInNsaWNlIiwic3RhcnQiLCJlbmQiLCJ1bmRlZmluZWQiLCJjb25maWciLCJKU09OIiwic3RyaW5naWZ5IiwicHVzaCIsInByZSIsIm5vZGUiLCJjYWxsZWUiLCJvYmplY3QiLCJuYW1lIiwiY29kZSIsImluaXQiLCJpIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidmFsdWVOb2RlIiwiZSIsImNvbnNvbGUiLCJsb2ciLCJyZXNvdXJjZSIsImVycm9ycyIsIl9kb25lIiwidmFycyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0FBRU8sU0FBU0Esa0JBQVQsR0FBOEI7QUFDbkMsU0FBTztBQUNMLFlBQVEsUUFESDtBQUVMLGtCQUFjO0FBQ1osbUJBQWU7QUFBQyxnQkFB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QUNGLEMsQ0FFRDs7O0FBQ08sU0FBU0ssS0FBVCxDQUFlQyxJQUFmLEVBQXFCOUMsT0FBckIsRUFBOEI7QUFDbkMsTUFBSTtBQUNGLFVBQU0wQyxHQUFHLEdBQUdwQyxPQUFPLENBQUMsY0FBRCxDQUFQLENBQXdCb0MsR0FBcEM7O0FBQ0EsVUFBTXJDLElBQUksR0FBR0MsT0FBTyxDQUFDLGNBQUQsQ0FBUCxDQUF3QkQsSUFBckM7O0FBQ0FBLElBQUFBLElBQUksQ0FBQ0wsT0FBRCxFQUFTLGdCQUFULENBQUo7O0FBRUEsUUFBSSxDQUNILENBREQsQ0FFQSxPQUFPd0MsQ0FBUCxFQUFVO0FBQ1JDLE1BQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZRixDQUFaO0FBQ0EsYUFBTyxFQUFQO0FBQ0Q7QUFDRixHQVhELENBWUEsT0FBTUEsQ0FBTixFQUFTO0FBQ1BsQyxJQUFBQSxPQUFPLENBQUMsY0FBRCxDQUFQLENBQXdCRCxJQUF4QixDQUE2QkwsT0FBN0IsRUFBcUN3QyxDQUFyQztBQUNEO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsaWRhdGVPcHRpb25zKCkge1xuICByZXR1cm4ge1xuICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuICAgIFwicHJvcGVydGllc1wiOiB7XG4gICAgICBcImZyYW1ld29ya1wiOiAgIHtcInR5cGVcIjogWyBcInN0cmluZ1wiIF19LFxuICAgICAgXCJ0b29sa2l0XCI6ICAgICB7XCJ0eXBlXCI6IFsgXCJzdHJpbmdcIiBdfSxcbiAgICAgIFwicG9ydFwiOiAgICAgICAge1widHlwZVwiOiBbIFwiaW50ZWdlclwiIF19LFxuICAgICAgXCJlbWl0XCI6ICAgICAgICB7XCJ0eXBlXCI6IFsgXCJib29sZWFuXCIgXX0sXG4gICAgICBcImJyb3dzZXJcIjogICAgIHtcInR5cGVcIjogWyBcImJvb2xlYW5cIiBdfSxcbiAgICAgIFwid2F0Y2hcIjogICAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcInByb2ZpbGVcIjogICAgIHtcInR5cGVcIjogWyBcInN0cmluZ1wiIF19LFxuICAgICAgXCJlbnZpcm9ubWVudFwiOiB7XCJ0eXBlXCI6IFsgXCJzdHJpbmdcIiBdfSxcbiAgICAgIFwidmVyYm9zZVwiOiAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcInRoZW1lXCI6ICAgICAgIHtcInR5cGVcIjogWyBcInN0cmluZ1wiIF19LFxuICAgICAgXCJ0cmVlc2hha2VcIjoge1widHlwZVwiOiBbIFwiYm9vbGVhblwiIF19LFxuICAgICAgXCJwYWNrYWdlc1wiOiAgICB7XCJ0eXBlXCI6IFsgXCJzdHJpbmdcIiwgXCJhcnJheVwiIF19XG4gICAgfSxcbiAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IGZhbHNlXG4gICAgLy8gXCJlcnJvck1lc3NhZ2VcIjoge1xuICAgIC8vICAgXCJvcHRpb25cIjogXCJzaG91bGQgYmUge0Jvb2xlYW59IChodHRwczovZ2l0aHViLmNvbS9vcmcvcmVwbyNhbmNob3IpXCJcbiAgICAvLyB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCkge1xuICByZXR1cm4ge1xuICAgIHBvcnQ6IDE5NjIsXG4gICAgZW1pdDogdHJ1ZSxcbiAgICBicm93c2VyOiB0cnVlLFxuICAgIHdhdGNoOiAneWVzJyxcbiAgICBwcm9maWxlOiAnJywgXG4gICAgZW52aXJvbm1lbnQ6ICdkZXZlbG9wbWVudCcsIFxuICAgIHZlcmJvc2U6ICdubycsXG4gICAgdG9vbGtpdDogJ21vZGVybicsXG4gICAgcGFja2FnZXM6IG51bGxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFZhcnMoKSB7XG4gIHJldHVybiB7XG4gICAgd2F0Y2hTdGFydGVkIDogZmFsc2UsXG4gICAgZmlyc3RUaW1lIDogdHJ1ZSxcbiAgICBmaXJzdENvbXBpbGU6IHRydWUsXG4gICAgYnJvd3NlckNvdW50IDogMCxcbiAgICBtYW5pZmVzdDogbnVsbCxcbiAgICBleHRQYXRoOiAnZXh0LXJlYWN0JyxcbiAgICBwbHVnaW5FcnJvcnM6IFtdLFxuICAgIGRlcHM6IFtdLFxuICAgIHJlYnVpbGQ6IHRydWVcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1h0eXBlKHN0cikge1xuICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXy9nLCAnLScpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RnJvbVNvdXJjZShtb2R1bGUsIG9wdGlvbnMsIGNvbXBpbGF0aW9uKSB7XG4gIHRyeSB7XG4gICAgdmFyIGpzID0gbW9kdWxlLl9zb3VyY2UuX3ZhbHVlXG4gICAgY29uc3QgbG9ndiA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3ZcbiAgICBsb2d2KG9wdGlvbnMsJ0ZVTkNUSU9OIGV4dHJhY3RGcm9tU291cmNlJylcbiAgICB2YXIgZ2VuZXJhdGUgPSByZXF1aXJlKFwiQGJhYmVsL2dlbmVyYXRvclwiKS5kZWZhdWx0XG4gICAgdmFyIHBhcnNlID0gcmVxdWlyZShcImJhYnlsb25cIikucGFyc2VcbiAgICB2YXIgdHJhdmVyc2UgPSByZXF1aXJlKFwiYXN0LXRyYXZlcnNlXCIpXG4gICAgY29uc3Qgc3RhdGVtZW50cyA9IFtdXG4gICAgXG4gICAgY29uc3QgYXN0ID0gcGFyc2UoanMsIHtcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgJ2pzeCcsXG4gICAgICAgICdmbG93JyxcbiAgICAgICAgJ2RvRXhwcmVzc2lvbnMnLFxuICAgICAgICAnb2JqZWN0UmVzdFNwcmVhZCcsXG4gICAgICAgICdjbGFzc1Byb3BlcnRpZXMnLFxuICAgICAgICAnZXhwb3J0RXh0ZW5zaW9ucycsXG4gICAgICAgICdhc3luY0dlbmVyYXRvcnMnLFxuICAgICAgICAnZnVuY3Rpb25CaW5kJyxcbiAgICAgICAgJ2Z1bmN0aW9uU2VudCcsXG4gICAgICAgICdkeW5hbWljSW1wb3J0J1xuICAgICAgXSxcbiAgICAgIHNvdXJjZVR5cGU6ICdtb2R1bGUnXG4gICAgfSlcblxuICAgIGZ1bmN0aW9uIGFkZFR5cGUoYXJnTm9kZSkge1xuICAgICAgdmFyIHR5cGVcbiAgICAgIGlmIChhcmdOb2RlLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJykge1xuICAgICAgICB2YXIgeHR5cGUgPSB0b1h0eXBlKGFyZ05vZGUudmFsdWUpXG4gICAgICAgIGlmICh4dHlwZSAhPSAnZXh0cmVhY3QnKSB7XG4gICAgICAgICAgdHlwZSA9IHsgeHR5cGU6IHRvWHR5cGUoYXJnTm9kZS52YWx1ZSkgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0geyB4Y2xhc3M6IGpzLnNsaWNlKGFyZ05vZGUuc3RhcnQsIGFyZ05vZGUuZW5kKSB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGNvbmZpZyA9IEpTT04uc3RyaW5naWZ5KHR5cGUpXG4gICAgICAgIHN0YXRlbWVudHMucHVzaChgRXh0LmNyZWF0ZSgke2NvbmZpZ30pYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cmF2ZXJzZShhc3QsIHtcbiAgICAgIHByZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nXG4gICAgICAgICAgICAmJiBub2RlLmNhbGxlZVxuICAgICAgICAgICAgJiYgbm9kZS5jYWxsZWUub2JqZWN0XG4gICAgICAgICAgICAmJiBub2RlLmNhbGxlZS5vYmplY3QubmFtZSA9PT0gJ0V4dCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgc3RhdGVtZW50cy5wdXNoKGdlbmVyYXRlKG5vZGUpLmNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PSAnVmFyaWFibGVEZWNsYXJhdG9yJyBcbiAgICAgICAgICAgICYmIG5vZGUuaW5pdCBcbiAgICAgICAgICAgICYmIG5vZGUuaW5pdC50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nIFxuICAgICAgICAgICAgJiYgbm9kZS5pbml0LmNhbGxlZSBcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKG5vZGUuaW5pdC5jYWxsZWUubmFtZSA9PSAncmVhY3RpZnknKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuaW5pdC5hcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWVOb2RlID0gbm9kZS5pbml0LmFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgaWYgKCF2YWx1ZU5vZGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICBhZGRUeXBlKHZhbHVlTm9kZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAvLyBDb252ZXJ0IFJlYWN0LmNyZWF0ZUVsZW1lbnQoLi4uKSBjYWxscyB0byB0aGUgZXF1aXZhbGVudCBFeHQuY3JlYXRlKC4uLikgY2FsbHMgdG8gcHV0IGluIHRoZSBtYW5pZmVzdC5cbiAgICAgICAgLy8gaWYgKG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9ueCcgXG4gICAgICAgIC8vICAgICAmJiBub2RlLmNhbGxlZS5vYmplY3QgXG4gICAgICAgIC8vICAgICAmJiBub2RlLmNhbGxlZS5vYmplY3QubmFtZSA9PT0gJ1JlYWN0JyBcbiAgICAgICAgLy8gICAgICYmIG5vZGUuY2FsbGVlLnByb3BlcnR5Lm5hbWUgPT09ICdjcmVhdGVFbGVtZW50Jykge1xuICAgICAgICAvLyAgIGNvbnN0IFtwcm9wc10gPSBub2RlLmFyZ3VtZW50c1xuICAgICAgICAvLyAgIGxldCBjb25maWdcbiAgICAgICAgLy8gICBpZiAoQXJyYXkuaXNBcnJheShwcm9wcy5wcm9wZXJ0aWVzKSkge1xuICAgICAgICAvLyAgICAgY29uZmlnID0gZ2VuZXJhdGUocHJvcHMpLmNvZGVcbiAgICAgICAgLy8gICAgIGZvciAobGV0IGtleSBpbiB0eXBlKSB7XG4gICAgICAgIC8vICAgICAgIGNvbmZpZyA9IGB7XFxuICAke2tleX06ICcke3R5cGVba2V5XX0nLCR7Y29uZmlnLnNsaWNlKDEpfWBcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY29uZmlnID0gSlNPTi5zdHJpbmdpZnkodHlwZSlcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBzdGF0ZW1lbnRzXG4gIH1cbiAgY2F0Y2goZSkge1xuICAgIGNvbnNvbGUubG9nKG1vZHVsZS5yZXNvdXJjZSlcbiAgICBjb25zb2xlLmxvZyhqcylcbiAgICBjb25zb2xlLmxvZyhlKVxuICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCdleHRyYWN0RnJvbVNvdXJjZTogJyArIGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuLy8qKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gX2RvbmUodmFycywgb3B0aW9ucykge1xuICB0cnkge1xuICAgIGNvbnN0IGxvZyA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ1xuICAgIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gICAgbG9ndihvcHRpb25zLCdGVU5DVElPTiBfZG9uZScpXG5cbiAgICB0cnkge1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSlcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuICBjYXRjaChlKSB7XG4gICAgcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndihvcHRpb25zLGUpXG4gIH1cbn0iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWFjdFV0aWwuanMiXSwibmFtZXMiOlsiX2dldERlZmF1bHRWYXJzIiwidG91Y2hGaWxlIiwid2F0Y2hTdGFydGVkIiwiYnVpbGRzdGVwIiwiZmlyc3RUaW1lIiwiZmlyc3RDb21waWxlIiwiYnJvd3NlckNvdW50IiwibWFuaWZlc3QiLCJleHRQYXRoIiwicGx1Z2luRXJyb3JzIiwiZGVwcyIsInVzZWRFeHRDb21wb25lbnRzIiwicmVidWlsZCIsIl9leHRyYWN0RnJvbVNvdXJjZSIsIm1vZHVsZSIsIm9wdGlvbnMiLCJjb21waWxhdGlvbiIsImV4dENvbXBvbmVudHMiLCJsb2d2IiwicmVxdWlyZSIsInZlcmJvc2UiLCJqcyIsIl9zb3VyY2UiLCJfdmFsdWUiLCJnZW5lcmF0ZSIsImRlZmF1bHQiLCJwYXJzZSIsInRyYXZlcnNlIiwic3RhdGVtZW50cyIsImFzdCIsInBsdWdpbnMiLCJzb3VyY2VUeXBlIiwiYWRkVHlwZSIsImFyZ05vZGUiLCJ0eXBlIiwieHR5cGUiLCJfdG9YdHlwZSIsInZhbHVlIiwieGNsYXNzIiwic2xpY2UiLCJzdGFydCIsImVuZCIsInVuZGVmaW5lZCIsImNvbmZpZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJwdXNoIiwicHJlIiwibm9kZSIsImNhbGxlZSIsIm9iamVjdCIsIm5hbWUiLCJjb2RlIiwiaW5pdCIsImkiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ2YWx1ZU5vZGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztBQUVPLFNBQVNBLGVBQVQsR0FBMkI7QUFDaEMsU0FBTztBQUNMQyxJQUFBQSxTQUFTLEVBQUUsZ0JBRE47QUFFTEMsSUFBQUEsWUFBWSxFQUFHLEtBRlY7QUFHTEMsSUFBQUEsU0FBUyxFQUFFLFFBSE47QUFJTEMsSUFBQUEsU0FBUyxFQUFHLElBSlA7QUFLTEMsSUFBQUEsWUFBWSxFQUFFLElBTFQ7QUFNTEMsSUFBQUEsWUFBWSxFQUFHLENBTlY7QUFPTEMsSUFBQUEsUUFBUSxFQUFFLElBUEw7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LFVBQUlKLElBQUksQ0FBQ2QsSUFBTCxJQUFhLG9CQUFiLElBQ0djLElBQUksQ0FBQ0ssSUFEUixJQUVHTCxJQUFJLENBQUNLLElBQUwsQ0FBVW5CLElBQVYsS0FBbUIsZ0JBRnRCLElBR0djLElBQUksQ0FBQ0ssSUFBTCxDQUFVSixNQUhqQixFQUlFO0FBQ0EsWUFBSUQsSUFBSSxDQUFDSyxJQUFMLENBQVVKLE1BQVYsQ0FBaUJFLElBQWpCLElBQXlCLFVBQTdCLEVBQXlDO0FBQ3ZDLGVBQUssSUFBSUcsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR04sSUFBSSxDQUFDSyxJQUFMLENBQVVFLFNBQVYsQ0FBb0JDLE1BQXhDLEVBQWdERixDQUFDLEVBQWpELEVBQXFEO0FBQ25ELGtCQUFNRyxTQUFTLEdBQUdULElBQUksQ0FBQ0ssSUFBTCxDQUFVRSxTQUFWLENBQW9CRCxDQUFwQixDQUFsQjtBQUNBLGdCQUFJLENBQUNHLFNBQUwsRUFBZ0I7QUFDaEJ6QixZQUFBQSxPQUFPLENBQUN5QixTQUFELENBQVA7QUFDRDtBQUNGO0FBQ0YsT0FwQmlCLENBc0JsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDRDtBQXZDVyxHQUFOLENBQVI7QUF5Q0EsU0FBTzdCLFVBQVAsQ0FwRjRFLENBcUY5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5leHBvcnQgZnVuY3Rpb24gX2dldERlZmF1bHRWYXJzKCkge1xuICByZXR1cm4ge1xuICAgIHRvdWNoRmlsZTogJy9zcmMvdGhlbWVyLmpzJyxcbiAgICB3YXRjaFN0YXJ0ZWQgOiBmYWxzZSxcbiAgICBidWlsZHN0ZXA6ICcxIG9mIDEnLFxuICAgIGZpcnN0VGltZSA6IHRydWUsXG4gICAgZmlyc3RDb21waWxlOiB0cnVlLFxuICAgIGJyb3dzZXJDb3VudCA6IDAsXG4gICAgbWFuaWZlc3Q6IG51bGwsXG4gICAgZXh0UGF0aDogJ2V4dCcsXG4gICAgcGx1Z2luRXJyb3JzOiBbXSxcbiAgICBkZXBzOiBbXSxcbiAgICB1c2VkRXh0Q29tcG9uZW50czogW10sXG4gICAgcmVidWlsZDogdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZXh0cmFjdEZyb21Tb3VyY2UobW9kdWxlLCBvcHRpb25zLCBjb21waWxhdGlvbiwgZXh0Q29tcG9uZW50cykge1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KG9wdGlvbnMudmVyYm9zZSwnRlVOQ1RJT04gX2V4dHJhY3RGcm9tU291cmNlJylcbi8vICB0cnkge1xuICAgIHZhciBqcyA9IG1vZHVsZS5fc291cmNlLl92YWx1ZVxuICAgIGxvZ3Yob3B0aW9ucy52ZXJib3NlLCdGVU5DVElPTiBleHRyYWN0RnJvbVNvdXJjZScpXG4gICAgdmFyIGdlbmVyYXRlID0gcmVxdWlyZShcIkBiYWJlbC9nZW5lcmF0b3JcIikuZGVmYXVsdFxuICAgIHZhciBwYXJzZSA9IHJlcXVpcmUoXCJiYWJ5bG9uXCIpLnBhcnNlXG4gICAgdmFyIHRyYXZlcnNlID0gcmVxdWlyZShcImFzdC10cmF2ZXJzZVwiKVxuICAgIGNvbnN0IHN0YXRlbWVudHMgPSBbXVxuICAgIFxuICAgIGNvbnN0IGFzdCA9IHBhcnNlKGpzLCB7XG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgICdqc3gnLFxuICAgICAgICAnZmxvdycsXG4gICAgICAgICdkb0V4cHJlc3Npb25zJyxcbiAgICAgICAgJ29iamVjdFJlc3RTcHJlYWQnLFxuICAgICAgICAnY2xhc3NQcm9wZXJ0aWVzJyxcbiAgICAgICAgJ2V4cG9ydEV4dGVuc2lvbnMnLFxuICAgICAgICAnYXN5bmNHZW5lcmF0b3JzJyxcbiAgICAgICAgJ2Z1bmN0aW9uQmluZCcsXG4gICAgICAgICdmdW5jdGlvblNlbnQnLFxuICAgICAgICAnZHluYW1pY0ltcG9ydCdcbiAgICAgIF0sXG4gICAgICBzb3VyY2VUeXBlOiAnbW9kdWxlJ1xuICAgIH0pXG5cbiAgICBmdW5jdGlvbiBhZGRUeXBlKGFyZ05vZGUpIHtcbiAgICAgIHZhciB0eXBlXG4gICAgICBpZiAoYXJnTm9kZS50eXBlID09PSAnU3RyaW5nTGl0ZXJhbCcpIHtcbiAgICAgICAgdmFyIHh0eXBlID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykuX3RvWHR5cGUoYXJnTm9kZS52YWx1ZSlcbiAgICAgICAgaWYgKHh0eXBlICE9ICdleHRyZWFjdCcpIHtcbiAgICAgICAgICB0eXBlID0geyB4dHlwZTogcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykuX3RvWHR5cGUoYXJnTm9kZS52YWx1ZSkgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0geyB4Y2xhc3M6IGpzLnNsaWNlKGFyZ05vZGUuc3RhcnQsIGFyZ05vZGUuZW5kKSB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGNvbmZpZyA9IEpTT04uc3RyaW5naWZ5KHR5cGUpXG4gICAgICAgIHN0YXRlbWVudHMucHVzaChgRXh0LmNyZWF0ZSgke2NvbmZpZ30pYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cmF2ZXJzZShhc3QsIHtcbiAgICAgIHByZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nXG4gICAgICAgICAgICAmJiBub2RlLmNhbGxlZVxuICAgICAgICAgICAgJiYgbm9kZS5jYWxsZWUub2JqZWN0XG4gICAgICAgICAgICAmJiBub2RlLmNhbGxlZS5vYmplY3QubmFtZSA9PT0gJ0V4dCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgc3RhdGVtZW50cy5wdXNoKGdlbmVyYXRlKG5vZGUpLmNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PSAnVmFyaWFibGVEZWNsYXJhdG9yJyBcbiAgICAgICAgICAgICYmIG5vZGUuaW5pdCBcbiAgICAgICAgICAgICYmIG5vZGUuaW5pdC50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nIFxuICAgICAgICAgICAgJiYgbm9kZS5pbml0LmNhbGxlZSBcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKG5vZGUuaW5pdC5jYWxsZWUubmFtZSA9PSAncmVhY3RpZnknKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuaW5pdC5hcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWVOb2RlID0gbm9kZS5pbml0LmFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgaWYgKCF2YWx1ZU5vZGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICBhZGRUeXBlKHZhbHVlTm9kZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAvLyBDb252ZXJ0IFJlYWN0LmNyZWF0ZUVsZW1lbnQoLi4uKSBjYWxscyB0byB0aGUgZXF1aXZhbGVudCBFeHQuY3JlYXRlKC4uLikgY2FsbHMgdG8gcHV0IGluIHRoZSBtYW5pZmVzdC5cbiAgICAgICAgLy8gaWYgKG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9ueCcgXG4gICAgICAgIC8vICAgICAmJiBub2RlLmNhbGxlZS5vYmplY3QgXG4gICAgICAgIC8vICAgICAmJiBub2RlLmNhbGxlZS5vYmplY3QubmFtZSA9PT0gJ1JlYWN0JyBcbiAgICAgICAgLy8gICAgICYmIG5vZGUuY2FsbGVlLnByb3BlcnR5Lm5hbWUgPT09ICdjcmVhdGVFbGVtZW50Jykge1xuICAgICAgICAvLyAgIGNvbnN0IFtwcm9wc10gPSBub2RlLmFyZ3VtZW50c1xuICAgICAgICAvLyAgIGxldCBjb25maWdcbiAgICAgICAgLy8gICBpZiAoQXJyYXkuaXNBcnJheShwcm9wcy5wcm9wZXJ0aWVzKSkge1xuICAgICAgICAvLyAgICAgY29uZmlnID0gZ2VuZXJhdGUocHJvcHMpLmNvZGVcbiAgICAgICAgLy8gICAgIGZvciAobGV0IGtleSBpbiB0eXBlKSB7XG4gICAgICAgIC8vICAgICAgIGNvbmZpZyA9IGB7XFxuICAke2tleX06ICcke3R5cGVba2V5XX0nLCR7Y29uZmlnLnNsaWNlKDEpfWBcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY29uZmlnID0gSlNPTi5zdHJpbmdpZnkodHlwZSlcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBzdGF0ZW1lbnRzXG4gIC8vIH1cbiAgLy8gY2F0Y2goZSkge1xuICAvLyAgIGNvbnNvbGUubG9nKG1vZHVsZS5yZXNvdXJjZSlcbiAgLy8gICBjb25zb2xlLmxvZyhqcylcbiAgLy8gICBjb25zb2xlLmxvZyhlKVxuICAvLyAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCdleHRyYWN0RnJvbVNvdXJjZTogJyArIGUpXG4gIC8vICAgcmV0dXJuIFtdXG4gIC8vIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/packages/ext-react-webpack-plugin/src/angularUtil.js b/packages/ext-react-webpack-plugin/src/angularUtil.js index f19c6e07..bf7f5f20 100644 --- a/packages/ext-react-webpack-plugin/src/angularUtil.js +++ b/packages/ext-react-webpack-plugin/src/angularUtil.js @@ -1,49 +1,15 @@ "use strict" -export function getValidateOptions() { - return { - "type": "object", - "properties": { - "framework": {"type": [ "string" ]}, - "toolkit": {"type": [ "string" ]}, - "port": {"type": [ "integer" ]}, - "emit": {"type": [ "boolean" ]}, - "browser": {"type": [ "boolean" ]}, - "watch": {"type": [ "string" ]}, - "profile": {"type": [ "string" ]}, - "environment": {"type": [ "string" ]}, - "verbose": {"type": [ "string" ]}, - "theme": {"type": [ "string" ]}, - "treeshake": {"type": [ "boolean" ]}, - "packages": {"type": [ "string", "array" ]} - }, - "additionalProperties": false - } -} - -export function getDefaultOptions() { - return { - port: 1962, - emit: true, - browser: true, - watch: 'yes', - profile: '', - treeshake: false, - environment: 'development', - verbose: 'no', - toolkit: 'modern', - packages: null - } -} - -export function getDefaultVars() { +export function _getDefaultVars() { return { + touchFile: '/src/themer.ts', watchStarted : false, + buildstep: '1 of 1', firstTime : true, firstCompile: true, browserCount : 0, manifest: null, - extPath: 'ext-angular', + extPath: 'ext', pluginErrors: [], deps: [], usedExtComponents: [], @@ -51,83 +17,73 @@ export function getDefaultVars() { } } -function toXtype(str) { - return str.toLowerCase().replace(/_/g, '-') -} - -export function extractFromSource(module, options, compilation, extComponents) { - try { - var js = module._source._value - const logv = require('./pluginUtil').logv - //logv(options,'HOOK succeedModule, FUNCTION extractFromSource: ' + module.resource) - - var statements = [] - - var generate = require("@babel/generator").default - var parse = require("babylon").parse - var traverse = require("ast-traverse") - - var ast = parse(js, { - plugins: [ - 'typescript', - 'flow', - 'doExpressions', - 'objectRestSpread', - 'classProperties', - 'exportDefaultFrom', - 'exportExtensions', - 'asyncGenerators', - 'functionBind', - 'functionSent', - 'dynamicImport' - ], - sourceType: 'module' - }) - - traverse(ast, { - pre: function (node) { - if (node.type === 'CallExpression' && node.callee && node.callee.object && node.callee.object.name === 'Ext') { - statements.push(generate(node).code) - } - if(node.type === 'StringLiteral') { - let code = node.value - for (var i = 0; i < code.length; ++i) { - if (code.charAt(i) == '<') { - if (code.substr(i, 4) == '') + 3 - } else if (code.charAt(i+1) !== '/') { - var start = code.substring(i) - var spaceEnd = start.indexOf(' ') - var newlineEnd = start.indexOf('\n') - var tagEnd = start.indexOf('>') - var end = Math.min(spaceEnd, newlineEnd, tagEnd) - if (end >= 0) { - var xtype = toXtype(start.substring(1, end)) - if(extComponents.includes(xtype)) { - var theValue = node.value.toLowerCase() - if (theValue.indexOf('doctype html') == -1) { - var type = {xtype: xtype} - let config = JSON.stringify(type) - statements.push(`Ext.create(${config})`) - } +export function _extractFromSource(module, options, compilation, extComponents) { + const logv = require('./pluginUtil').logv + const verbose = options.verbose + logv(verbose,'FUNCTION _extractFromSource') + var js = module._source._value + + var statements = [] + + var generate = require("@babel/generator").default + var parse = require("babylon").parse + var traverse = require("ast-traverse") + + var ast = parse(js, { + plugins: [ + 'typescript', + 'flow', + 'doExpressions', + 'objectRestSpread', + 'classProperties', + 'exportDefaultFrom', + 'exportExtensions', + 'asyncGenerators', + 'functionBind', + 'functionSent', + 'dynamicImport' + ], + sourceType: 'module' + }) + + traverse(ast, { + pre: function (node) { + if (node.type === 'CallExpression' && node.callee && node.callee.object && node.callee.object.name === 'Ext') { + statements.push(generate(node).code) + } + if(node.type === 'StringLiteral') { + let code = node.value + for (var i = 0; i < code.length; ++i) { + if (code.charAt(i) == '<') { + if (code.substr(i, 4) == '') + 3 + } else if (code.charAt(i+1) !== '/') { + var start = code.substring(i) + var spaceEnd = start.indexOf(' ') + var newlineEnd = start.indexOf('\n') + var tagEnd = start.indexOf('>') + var end = Math.min(spaceEnd, newlineEnd, tagEnd) + if (end >= 0) { + var xtype = require('./pluginUtil')._toXtype(start.substring(1, end)) + if(extComponents.includes(xtype)) { + var theValue = node.value.toLowerCase() + if (theValue.indexOf('doctype html') == -1) { + var type = {xtype: xtype} + let config = JSON.stringify(type) + statements.push(`Ext.create(${config})`) } - i += end } + i += end } } } } } - }) + } + }) - return statements - } - catch(e) { - console.log(e) - compilation.errors.push('extractFromSource: ' + e) - return [] - } + return statements } function changeIt(o) { @@ -142,149 +98,125 @@ function changeIt(o) { export function _toProd(vars, options) { const log = require('./pluginUtil').log const logv = require('./pluginUtil').logv - logv(options,'FUNCTION _toProd') - try { - const fsx = require('fs-extra') - const fs = require('fs') - const mkdirp = require('mkdirp') - const path = require('path') - - const pathExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`); - if (!fs.existsSync(pathExtAngularProd)) { - mkdirp.sync(pathExtAngularProd) - const t = require('./artifacts').extAngularModule('', '', '') - fsx.writeFileSync(`${pathExtAngularProd}/ext-angular.module.ts`, t, 'utf-8', () => { - return - }) - } - - var o = {} - o.where = 'src/app/app.module.ts' - o.from = `import { ExtAngularModule } from '@sencha/ext-angular'` - o.to = `import { ExtAngularModule } from './ext-angular-prod/ext-angular.module'` - changeIt(o) + logv(options.verbose,'FUNCTION _toProd') + const fsx = require('fs-extra') + const fs = require('fs') + const mkdirp = require('mkdirp') + const path = require('path') - o = {} - o.where = 'src/main.ts' - o.from = `bootstrapModule( AppModule );` - o.to = `enableProdMode();bootstrapModule(AppModule);` - changeIt(o) - } - catch (e) { - console.log(e) - return [] + const pathExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`); + if (!fs.existsSync(pathExtAngularProd)) { + mkdirp.sync(pathExtAngularProd) + const t = require('./artifacts').extAngularModule('', '', '') + fsx.writeFileSync(`${pathExtAngularProd}/ext-angular.module.ts`, t, 'utf-8', () => { + return + }) } + + var o = {} + o.where = 'src/app/app.module.ts' + o.from = `import { ExtAngularModule } from '@sencha/ext-angular'` + o.to = `import { ExtAngularModule } from './ext-angular-prod/ext-angular.module'` + changeIt(o) + + o = {} + o.where = 'src/main.ts' + o.from = `bootstrapModule( AppModule );` + o.to = `enableProdMode();bootstrapModule(AppModule);` + changeIt(o) } export function _toDev(vars, options) { const log = require('./pluginUtil').log const logv = require('./pluginUtil').logv - logv(options,'FUNCTION _toProd') - try { - const path = require('path') - const pathExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`); - require('rimraf').sync(pathExtAngularProd); - - var o = {} - o.where = 'src/app/app.module.ts' - o.from = `import { ExtAngularModule } from './ext-angular-prod/ext-angular.module'` - o.to = `import { ExtAngularModule } from '@sencha/ext-angular'` - changeIt(o) - - o = {} - o.where = 'src/main.ts' - o.from = `enableProdMode();bootstrapModule(AppModule);` - o.to = `bootstrapModule( AppModule );` - changeIt(o) - } - catch (e) { - console.log(e) - return [] - } + logv(options.verbose,'FUNCTION _toDev') + const path = require('path') + const pathExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`); + require('rimraf').sync(pathExtAngularProd); + + var o = {} + o.where = 'src/app/app.module.ts' + o.from = `import { ExtAngularModule } from './ext-angular-prod/ext-angular.module'` + o.to = `import { ExtAngularModule } from '@sencha/ext-angular'` + changeIt(o) + + o = {} + o.where = 'src/main.ts' + o.from = `enableProdMode();bootstrapModule(AppModule);` + o.to = `bootstrapModule( AppModule );` + changeIt(o) } export function _getAllComponents(vars, options) { const log = require('./pluginUtil').log const logv = require('./pluginUtil').logv - logv(options,'FUNCTION _getAllComponents') + logv(options.verbose,'FUNCTION _getAllComponents') - try { - const path = require('path') - const fsx = require('fs-extra') + const path = require('path') + const fsx = require('fs-extra') - var extComponents = [] - const packageLibPath = path.resolve(process.cwd(), 'node_modules/@sencha/ext-angular/src/lib') - var files = fsx.readdirSync(packageLibPath) - files.forEach((fileName) => { - if (fileName && fileName.substr(0, 4) == 'ext-') { - var end = fileName.substr(4).indexOf('.component') - if (end >= 0) { - extComponents.push(fileName.substring(4, end + 4)) - } +// log(vars.app, `Getting all referenced ext-${options.framework} modules`) + var extComponents = [] + const packageLibPath = path.resolve(process.cwd(), 'node_modules/@sencha/ext-angular/src/lib') + var files = fsx.readdirSync(packageLibPath) + files.forEach((fileName) => { + if (fileName && fileName.substr(0, 4) == 'ext-') { + var end = fileName.substr(4).indexOf('.component') + if (end >= 0) { + extComponents.push(fileName.substring(4, end + 4)) } - }) - return extComponents - - } - catch (e) { - console.log(e) - return [] - } + } + }) + log(vars.app, `Writing all referenced ext-${options.framework} modules`) + return extComponents } export function _writeFilesToProdFolder(vars, options) { const log = require('./pluginUtil').log const logv = require('./pluginUtil').logv - logv(options,'FUNCTION _writeFilesToProdFolder') + logv(options.verbose,'FUNCTION _writeFilesToProdFolder') - try { - const path = require('path') - const fsx = require('fs-extra') + const path = require('path') + const fsx = require('fs-extra') - const packageLibPath = path.resolve(process.cwd(), 'node_modules/@sencha/ext-angular/src/lib') - const pathToExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`) - const string = 'Ext.create({\"xtype\":\"' + const packageLibPath = path.resolve(process.cwd(), 'node_modules/@sencha/ext-angular/src/lib') + const pathToExtAngularProd = path.resolve(process.cwd(), `src/app/ext-angular-prod`) + const string = 'Ext.create({\"xtype\":\"' - vars.deps.forEach(code => { - var index = code.indexOf(string) - if (index >= 0) { - code = code.substring(index + string.length) - var end = code.indexOf('\"') - vars.usedExtComponents.push(code.substr(0, end)) - } - }) - vars.usedExtComponents = [...new Set(vars.usedExtComponents)] - - var writeToPathWritten = false - var moduleVars = { - imports: '', - exports: '', - declarations: '' - } - vars.usedExtComponents.forEach(xtype => { - var capclassname = xtype.charAt(0).toUpperCase() + xtype.replace(/-/g, "_").slice(1) - moduleVars.imports = moduleVars.imports + `import { Ext${capclassname}Component } from './ext-${xtype}.component';\n` - moduleVars.exports = moduleVars.exports + ` Ext${capclassname}Component,\n` - moduleVars.declarations = moduleVars.declarations + ` Ext${capclassname}Component,\n` - var classFile = `ext-${xtype}.component.ts` - const contents = fsx.readFileSync(`${packageLibPath}/${classFile}`).toString() - fsx.writeFileSync(`${pathToExtAngularProd}/${classFile}`, contents, 'utf-8', ()=>{return}) - writeToPathWritten = true - }) - if (writeToPathWritten) { - var t = require('./artifacts').extAngularModule( - moduleVars.imports, moduleVars.exports, moduleVars.declarations - ) - fsx.writeFileSync(`${pathToExtAngularProd}/ext-angular.module.ts`, t, 'utf-8', ()=>{return}) + vars.deps.forEach(code => { + var index = code.indexOf(string) + if (index >= 0) { + code = code.substring(index + string.length) + var end = code.indexOf('\"') + vars.usedExtComponents.push(code.substr(0, end)) } - - const baseContent = fsx.readFileSync(`${packageLibPath}/base.ts`).toString() - fsx.writeFileSync(`${pathToExtAngularProd}/base.ts`, baseContent, 'utf-8', ()=>{return}) - + }) + vars.usedExtComponents = [...new Set(vars.usedExtComponents)] + + var writeToPathWritten = false + var moduleVars = { + imports: '', + exports: '', + declarations: '' } - catch (e) { - console.log(e) - return [] + vars.usedExtComponents.forEach(xtype => { + var capclassname = xtype.charAt(0).toUpperCase() + xtype.replace(/-/g, "_").slice(1) + moduleVars.imports = moduleVars.imports + `import { Ext${capclassname}Component } from './ext-${xtype}.component';\n` + moduleVars.exports = moduleVars.exports + ` Ext${capclassname}Component,\n` + moduleVars.declarations = moduleVars.declarations + ` Ext${capclassname}Component,\n` + var classFile = `ext-${xtype}.component.ts` + const contents = fsx.readFileSync(`${packageLibPath}/${classFile}`).toString() + fsx.writeFileSync(`${pathToExtAngularProd}/${classFile}`, contents, 'utf-8', ()=>{return}) + writeToPathWritten = true + }) + if (writeToPathWritten) { + var t = require('./artifacts').extAngularModule( + moduleVars.imports, moduleVars.exports, moduleVars.declarations + ) + fsx.writeFileSync(`${pathToExtAngularProd}/ext-angular.module.ts`, t, 'utf-8', ()=>{return}) } + + const baseContent = fsx.readFileSync(`${packageLibPath}/base.ts`).toString() + fsx.writeFileSync(`${pathToExtAngularProd}/base.ts`, baseContent, 'utf-8', ()=>{return}) } \ No newline at end of file diff --git a/packages/ext-react-webpack-plugin/src/componentsUtil.js b/packages/ext-react-webpack-plugin/src/componentsUtil.js new file mode 100644 index 00000000..9fe4bbdd --- /dev/null +++ b/packages/ext-react-webpack-plugin/src/componentsUtil.js @@ -0,0 +1,77 @@ +"use strict" + +export function _getDefaultVars() { + return { + touchFile: '/src/themer.js', + watchStarted : false, + buildstep: '1 of 1', + firstTime : true, + firstCompile: true, + browserCount : 0, + manifest: null, + extPath: 'ext', + pluginErrors: [], + deps: [], + usedExtComponents: [], + rebuild: true + } +} + +export function _extractFromSource(module, options, compilation, extComponents) { + const logv = require('./pluginUtil').logv + logv(options.verbose,'FUNCTION _extractFromSource (empty)') + try { + var statements = [ + 'Ext.require("Ext.*")', + ] + return statements + } + catch(e) { + console.log(e) + compilation.errors.push('extractFromSource: ' + e) + return [] + } +} + +export function _toProd(vars, options) { + const logv = require('./pluginUtil').logv + logv(options.verbose,'FUNCTION _toProd (empty') + try { + } + catch (e) { + console.log(e) + return [] + } +} + +export function _toDev(vars, options) { + try { + } + catch (e) { + console.log(e) + return [] + } +} + +export function _getAllComponents(vars, options) { + const logv = require('./pluginUtil').logv + logv(options.verbose,'FUNCTION _getAllComponents (empty)') + try { + var extComponents = [] + return extComponents + } + catch (e) { + console.log(e) + return [] + } +} + +export function _writeFilesToProdFolder(vars, options) { + const logv = require('./pluginUtil').logv + logv(options.verbose,'FUNCTION _writeFilesToProdFolder (empty)') + try { + } + catch (e) { + console.log(e) + } +} \ No newline at end of file diff --git a/packages/ext-react-webpack-plugin/src/extjsUtil.js b/packages/ext-react-webpack-plugin/src/extjsUtil.js index ad91c756..91f1c605 100644 --- a/packages/ext-react-webpack-plugin/src/extjsUtil.js +++ b/packages/ext-react-webpack-plugin/src/extjsUtil.js @@ -1,44 +1,9 @@ "use strict" -export function getValidateOptions() { - return { - "type": "object", - "properties": { - "framework": {"type": [ "string" ]}, - "port": {"type": [ "integer" ]}, - "emit": {"type": [ "boolean" ]}, - "browser": {"type": [ "boolean" ]}, - "watch": {"type": [ "string" ]}, - "profile": {"type": [ "string" ]}, - "environment": {"type": [ "string" ]}, - "verbose": {"type": [ "string" ]}, -// "theme": {"type": [ "string" ]}, -// "toolkit": {"type": [ "string" ]}, - "treeshake": {"type": [ "boolean" ]} -// "packages": {"type": [ "string", "array" ]}, - - }, - "additionalProperties": false - // "errorMessage": { - // "option": "should be {Boolean} (https:/github.com/org/repo#anchor)" - // } - } -} - -export function getDefaultOptions() { - return { - port: 1962, - emit: true, - browser: true, - watch: 'yes', - profile: 'desktop', - environment: 'development', - verbose: 'no' - } -} - -export function getDefaultVars() { +export function _getDefaultVars() { return { + touchFile: '/themer.js', + rebuild: true, watchStarted : false, firstTime : true, browserCount : 0, @@ -54,36 +19,34 @@ export function getDefaultVars() { } export function _afterCompile(compilation, vars, options) { - try { - require('./pluginUtil').logv(options,'FUNCTION ext-after-compile') - const path = require('path') - let { files, dirs } = vars - const { cwd } = vars - files = typeof files === 'string' ? [files] : files - dirs = typeof dirs === 'string' ? [dirs] : dirs - const { - fileDependencies, - contextDependencies, - } = _getFileAndContextDeps(compilation, files, dirs, cwd, options); - if (files.length > 0) { - fileDependencies.forEach((file) => { - compilation.fileDependencies.add(path.resolve(file)); - }) - } - if (dirs.length > 0) { - contextDependencies.forEach((context) => { - compilation.contextDependencies.add(context); - }) - } + var verbose = options.verbose + var logv = require('./pluginUtil').logv + logv(verbose,'FUNCTION extjs _afterCompile') + const path = require('path') + let { files, dirs } = vars + const { cwd } = vars + files = typeof files === 'string' ? [files] : files + dirs = typeof dirs === 'string' ? [dirs] : dirs + const { + fileDependencies, + contextDependencies, + } = _getFileAndContextDeps(compilation, files, dirs, cwd, options); + if (files.length > 0) { + fileDependencies.forEach((file) => { + compilation.fileDependencies.add(path.resolve(file)); + }) } - catch(e) { - console.log(e) - compilation.errors.push('_afterCompile: ' + e) + if (dirs.length > 0) { + contextDependencies.forEach((context) => { + compilation.contextDependencies.add(context); + }) } } function _getFileAndContextDeps(compilation, files, dirs, cwd, options) { - require('./pluginUtil').logv(options,'FUNCTION _getFileAndContextDeps') + var verbose = options.verbose + var logv = require('./pluginUtil').logv + logv(verbose,'FUNCTION _getFileAndContextDeps') const uniq = require('lodash.uniq') const isGlob = require('is-glob') @@ -108,7 +71,7 @@ function _getFileAndContextDeps(compilation, files, dirs, cwd, options) { } export function _prepareForBuild(app, vars, options, output, compilation) { - try { +// try { const log = require('./pluginUtil').log const logv = require('./pluginUtil').logv logv(options,'_prepareForBuild') @@ -120,16 +83,6 @@ export function _prepareForBuild(app, vars, options, output, compilation) { var currentNumFiles = watchedFiles.length logv(options,'watchedFiles: ' + currentNumFiles) var doBuild = true - - // var doBuild = false - // for (var file in watchedFiles) { - // if (vars.lastMilliseconds < fs.statSync(watchedFiles[file]).mtimeMs) { - // if (watchedFiles[file].indexOf("scss") != -1) {doBuild=true;break;} - // } - // } - // if (vars.lastMilliseconds < fs.statSync('./app.json').mtimeMs) { - // doBuild=true - // } logv(options,'doBuild: ' + doBuild) @@ -154,9 +107,9 @@ export function _prepareForBuild(app, vars, options, output, compilation) { vars.rebuild = false } vars.lastNumFiles = currentNumFiles - } - catch(e) { - console.log(e) - compilation.errors.push('_prepareForBuild: ' + e) - } + // } + // catch(e) { + // console.log(e) + // compilation.errors.push('_prepareForBuild: ' + e) + // } } diff --git a/packages/ext-react-webpack-plugin/src/index.js b/packages/ext-react-webpack-plugin/src/index.js index e0003768..17035635 100644 --- a/packages/ext-react-webpack-plugin/src/index.js +++ b/packages/ext-react-webpack-plugin/src/index.js @@ -1,60 +1,49 @@ 'use strict' require('@babel/polyfill') -const v = require('./pluginUtil').logv +const p = require(`./pluginUtil`) + export default class ExtWebpackPlugin { + constructor(options) { - this.plugin = require(`./pluginUtil`)._constructor(options) + var o = p._constructor(options) + this.vars = o.vars + this.options = o.options } apply(compiler) { - const vars = this.plugin.vars - const options = this.plugin.options - v(options,'FUNCTION apply') + const vars = this.vars + const options = this.options + const app = this.app + if (!compiler.hooks) {console.log('not webpack 4');return} compiler.hooks.thisCompilation.tap(`ext-this-compilation`, (compilation) => { - v(options,'HOOK thisCompilation') + p.logh(app, `HOOK thisCompilation`) + p._thisCompilation(compiler, compilation, vars, options) if (vars.pluginErrors.length > 0) { compilation.errors.push( new Error(vars.pluginErrors.join("")) ) + return } }) - if (vars.pluginErrors.length > 0) { - return - } - - if ( vars.framework == 'extjs') { - compiler.hooks.compilation.tap(`ext-compilation`, (compilation) => { - v(options,'HOOK compilation (empty)') - }) - compiler.hooks.afterCompile.tap('ext-after-compile', (compilation) => { - v(options,'HOOK afterCompile') - require(`./extjsUtil`)._afterCompile(compilation, vars, options) - }) - } - else { - compiler.hooks.compilation.tap(`ext-compilation`, (compilation) => { - v(options,'HOOK compilation') - require(`./pluginUtil`)._compilation(compiler, compilation, vars, options) - }) - compiler.hooks.afterCompile.tap('ext-after-compile', (compilation) => { - v(options,'HOOK afterCompile') - require(`./pluginUtil`)._afterCompile(compiler, compilation, vars, options) - }) - } - - if((options.treeshake == true && options.environment == 'production') || - (options.treeshake == false && options.environment != 'production')) - { - compiler.hooks.emit.tapAsync(`ext-emit`, (compilation, callback) => { - v(options,'HOOK emit') - require(`./pluginUtil`).emit(compiler, compilation, vars, options, callback) - }) - } - - compiler.hooks.done.tap(`ext-done`, () => { - v(options,'HOOK done') - require(`./pluginUtil`)._done(vars, options) - require('./pluginUtil').log(vars.app + `Completed ext-webpack-plugin processing`) + + compiler.hooks.compilation.tap(`ext-compilation`, (compilation) => { + p.logh(app, `HOOK compilation`) + p._compilation(compiler, compilation, vars, options) + }) + + compiler.hooks.afterCompile.tap('ext-after-compile', (compilation) => { + p.logh(app, `HOOK afterCompile`) + p._afterCompile(compiler, compilation, vars, options) + }) + + compiler.hooks.emit.tapAsync(`ext-emit`, (compilation, callback) => { + p.logh(app, `HOOK emit (async)`) + p._emit(compiler, compilation, vars, options, callback) + }) + + compiler.hooks.done.tap(`ext-done`, (stats) => { + p.logh(app, `HOOK done`) + p._done(stats, vars, options) }) } } diff --git a/packages/ext-react-webpack-plugin/src/pluginUtil.js b/packages/ext-react-webpack-plugin/src/pluginUtil.js index 727c3f86..7d641b64 100644 --- a/packages/ext-react-webpack-plugin/src/pluginUtil.js +++ b/packages/ext-react-webpack-plugin/src/pluginUtil.js @@ -1,251 +1,323 @@ //********** -export function _constructor(options) { +export function _constructor(initialOptions) { const fs = require('fs') - - var thisVars = {} - var thisOptions = {} - var plugin = {} - - if (options.framework == undefined) { - thisVars.pluginErrors = [] - thisVars.pluginErrors.push('webpack config: framework parameter on ext-webpack-plugin is not defined - values: react, angular, extjs') - plugin.vars = thisVars - return plugin - } + var vars = {} + var options = {} + try { + if (initialOptions.framework == undefined) { + vars.pluginErrors = [] + vars.pluginErrors.push('webpack config: framework parameter on ext-react-webpack-plugin is not defined - values: react, angular, extjs, components') + var o = {} + o.vars = vars + return o + } + var framework = initialOptions.framework + var treeshake = initialOptions.treeshake + var verbose = initialOptions.verbose - const validateOptions = require('schema-utils') - validateOptions(require(`./${options.framework}Util`).getValidateOptions(), options, '') - thisVars = require(`./${options.framework}Util`).getDefaultVars() - thisVars.framework = options.framework - switch(thisVars.framework) { - case 'extjs': - thisVars.pluginName = 'ext-webpack-plugin' - break; - case 'react': - thisVars.pluginName = 'ext-react-webpack-plugin' - break; - case 'angular': - thisVars.pluginName = 'ext-angular-webpack-plugin' - break; - default: - thisVars.pluginName = 'ext-webpack-plugin' - } + const validateOptions = require('schema-utils') + validateOptions(_getValidateOptions(), initialOptions, '') - thisVars.app = require('./pluginUtil')._getApp() - logv(options, `pluginName - ${thisVars.pluginName}`) - logv(options, `thisVars.app - ${thisVars.app}`) + const rc = (fs.existsSync(`.ext-${framework}rc`) && JSON.parse(fs.readFileSync(`.ext-${framework}rc`, 'utf-8')) || {}) + options = { ..._getDefaultOptions(), ...initialOptions, ...rc } - const rc = (fs.existsSync(`.ext-${thisVars.framework}rc`) && JSON.parse(fs.readFileSync(`.ext-${thisVars.framework}rc`, 'utf-8')) || {}) - thisOptions = { ...require(`./${thisVars.framework}Util`).getDefaultOptions(), ...options, ...rc } - logv(options, `thisOptions - ${JSON.stringify(thisOptions)}`) + vars = require(`./${framework}Util`)._getDefaultVars() + vars.pluginName = 'ext-react-webpack-plugin' + vars.app = _getApp() + var pluginName = vars.pluginName + var app = vars.app - if (thisOptions.environment == 'production') - {thisVars.production = true} - else - {thisVars.production = false} - logv(options, `thisVars - ${JSON.stringify(thisVars)}`) + logv(verbose, 'FUNCTION _constructor') + logv(verbose, `pluginName - ${pluginName}`) + logv(verbose, `app - ${app}`) - log(require('./pluginUtil')._getVersions(thisVars.app, thisVars.pluginName, thisVars.framework)) - log(thisVars.app + 'Building for ' + thisOptions.environment) - log(thisVars.app + 'Treeshake is ' + thisOptions.treeshake) + if (options.environment == 'production') { + vars.production = true + options.browser = 'no' + options.watch = 'no' + } + else { + vars.production = false + } + + //logv(verbose, `options:`);if (verbose == 'yes') {console.dir(options)} + //logv(verbose, `vars:`);if (verbose == 'yes') {console.dir(vars)} + + log(app, _getVersions(pluginName, framework)) + + if (framework == 'react' || framework == 'extjs') { + if (vars.production == true) { + vars.buildstep = '1 of 1' + log(app, 'Starting Production Build for ' + framework) + } + else { + vars.buildstep = '1 of 1' + log(app, 'Starting development build for ' + framework) + } + } + else if (vars.production == true) { + if (treeshake == 'yes') { + vars.buildstep = '1 of 2' + log(app, 'Starting production build for ' + framework + ' - ' + vars.buildstep) + require(`./${framework}Util`)._toProd(vars, options) + } + else { + vars.buildstep = '2 of 2' + log(app, 'Continuing production build for ' + framework + ' - ' + vars.buildstep) + } + } + else { + vars.buildstep = '1 of 1' + log(app, 'Starting development build for ' + framework) + } + logv(verbose, 'Building for ' + options.environment + ', ' + 'Treeshake is ' + options.treeshake) - if (thisVars.production == true && thisOptions.treeshake == true && options.framework == 'angular') { - require(`./angularUtil`)._toProd(thisVars, thisOptions) + var o = {} + o.vars = vars + o.options = options + return o } + catch (e) { + throw '_constructor: ' + e.toString() + } +} - plugin.vars = thisVars - plugin.options = thisOptions - require('./pluginUtil').logv(options, 'FUNCTION constructor (end)') - return plugin +//********** +export function _thisCompilation(compiler, compilation, vars, options) { + try { + var app = vars.app + var verbose = options.verbose + logv(verbose, 'FUNCTION _thisCompilation') + logv(verbose, `options.script: ${options.script }`) + logv(verbose, `buildstep: ${vars.buildstep}`) + + if (vars.buildstep == '1 of 1' || vars.buildstep == '1 of 2') { + if (options.script != undefined) { + if (options.script != null) { + if (options.script != '') { + log(app, `Started running ${options.script}`) + runScript(options.script, function (err) { + if (err) throw err; + log(app, `Finished running ${options.script}`) + }); + } + } + } + } + } + catch(e) { + throw '_thisCompilation: ' + e.toString() + } } //********** export function _compilation(compiler, compilation, vars, options) { try { - require('./pluginUtil').logv(options, 'FUNCTION _compilation') - + var app = vars.app + var verbose = options.verbose + var framework = options.framework + logv(verbose, 'FUNCTION _compilation') + + if (framework == 'extjs') { + logv(verbose, 'FUNCTION _compilation end (extjs)') + return + } var extComponents = [] - - if (vars.production) { - if (options.framework == 'angular' && options.treeshake) { - extComponents = require('./angularUtil')._getAllComponents(vars, options) - } - - compilation.hooks.succeedModule.tap(`ext-succeed-module`, module => { - //require('./pluginUtil').logv(options, 'HOOK succeedModule') - if (module.resource && !module.resource.match(/node_modules/)) { - if(module.resource.match(/\.html$/) != null) { - if(module._source._value.toLowerCase().includes('doctype html') == false) { - vars.deps = [...(vars.deps || []), ...require(`./${vars.framework}Util`).extractFromSource(module, options, compilation, extComponents)] - } - } - else { - vars.deps = [...(vars.deps || []), ...require(`./${vars.framework}Util`).extractFromSource(module, options, compilation, extComponents)] - + if (vars.buildstep == '1 of 2') { + extComponents = require(`./${framework}Util`)._getAllComponents(vars, options) + } + compilation.hooks.succeedModule.tap(`ext-succeed-module`, module => { + if (module.resource && !module.resource.match(/node_modules/)) { + if(module.resource.match(/\.html$/) != null) { + if(module._source._value.toLowerCase().includes('doctype html') == false) { + vars.deps = [ + ...(vars.deps || []), + ...require(`./${framework}Util`)._extractFromSource(module, options, compilation, extComponents)] } } - // if (extComponents.length && module.resource && (module.resource.match(/\.(j|t)sx?$/) || - // options.framework == 'angular' && module.resource.match(/\.html$/)) && - // !module.resource.match(/node_modules/) && !module.resource.match(`/ext-{$options.framework}/build/`)) { - // vars.deps = [...(vars.deps || []), ...require(`./${vars.framework}Util`).extractFromSource(module, options, compilation, extComponents)] - // } - }) - - if (options.framework == 'angular' && options.treeshake == true) { - compilation.hooks.finishModules.tap(`ext-finish-modules`, modules => { - require('./pluginUtil').logv(options, 'HOOK finishModules') - require('./angularUtil')._writeFilesToProdFolder(vars, options) - }) + else { + vars.deps = [ + ...(vars.deps || []), + ...require(`./${framework}Util`)._extractFromSource(module, options, compilation, extComponents)] + } } - + }) + if (vars.buildstep == '1 of 2') { + compilation.hooks.finishModules.tap(`ext-finish-modules`, modules => { + require(`./${framework}Util`)._writeFilesToProdFolder(vars, options) + }) } - - if ( - (options.framework == 'angular' && options.treeshake == false) || - (options.framework == 'react') - ) { - compilation.hooks.htmlWebpackPluginBeforeHtmlGeneration.tap(`ext-html-generation`,(data) => { - logv(options,'HOOK ext-html-generation') + if (vars.buildstep == '1 of 1' || vars.buildstep == '2 of 2') { + compilation.hooks.htmlWebpackPluginBeforeHtmlGeneration.tap(`ext-html-generation`,(data) => { const path = require('path') - - //var outputPath = '' - // if (compiler.options.devServer) { - // if (compiler.outputPath === '/') { - // outputPath = path.join(compiler.options.devServer.contentBase, outputPath) - // } - // else { - // if (compiler.options.devServer.contentBase == undefined) { - // outputPath = 'build' - // } - // else { - // outputPath = '' - // } - // } - // } - // else { - // outputPath = 'build' - // } - // outputPath = outputPath.replace(process.cwd(), '').trim() - //var jsPath = path.join(outputPath, vars.extPath, 'ext.js') - //var cssPath = path.join(outputPath, vars.extPath, 'ext.css') - var jsPath = path.join(vars.extPath, 'ext.js') var cssPath = path.join(vars.extPath, 'ext.css') data.assets.js.unshift(jsPath) data.assets.css.unshift(cssPath) - log(vars.app + `Adding ${jsPath} and ${cssPath} to index.html`) + log(app, `Adding ${jsPath} and ${cssPath} to index.html`) }) } - else { - logv(options,'skipped HOOK ext-html-generation') - } } catch(e) { - require('./pluginUtil').logv(options,e) - compilation.errors.push('_compilation: ' + e) + throw '_compilation: ' + e.toString() +// logv(options.verbose,e) +// compilation.errors.push('_compilation: ' + e) } } //********** export function _afterCompile(compiler, compilation, vars, options) { - require('./pluginUtil').logv(options, 'FUNCTION _afterCompile') + try { + var app = vars.app + var verbose = options.verbose + var framework = options.framework + logv(verbose, 'FUNCTION _afterCompile') + if (framework == 'extjs') { + require(`./extjsUtil`)._afterCompile(compilation, vars, options) + } + else { + logv(verbose, 'FUNCTION _afterCompile not run') + } + } + catch(e) { + throw '_afterCompile: ' + e.toString() + } } //********** -export async function emit(compiler, compilation, vars, options, callback) { +export async function _emit(compiler, compilation, vars, options, callback) { try { - const log = require('./pluginUtil').log - const logv = require('./pluginUtil').logv - logv(options,'FUNCTION emit') - var app = vars.app - var framework = vars.framework const path = require('path') - const _buildExtBundle = require('./pluginUtil')._buildExtBundle - let outputPath = path.join(compiler.outputPath,vars.extPath) - if (compiler.outputPath === '/' && compiler.options.devServer) { - outputPath = path.join(compiler.options.devServer.contentBase, outputPath) - } - logv(options,'outputPath: ' + outputPath) - logv(options,'framework: ' + framework) - if (options.emit == true) { - if (framework != 'extjs') { - _prepareForBuild(app, vars, options, outputPath, compilation) - } - else { - if (options.framework == 'angular' && options.treeshake == false) { - require(`./${framework}Util`)._prepareForBuild(app, vars, options, outputPath, compilation) + var app = vars.app + var verbose = options.verbose + var emit = options.emit + var framework = options.framework + logv(verbose,'FUNCTION _emit') + if (emit == 'yes') { + if (vars.buildstep == '1 of 1' || vars.buildstep == '1 of 2') { + let outputPath = path.join(compiler.outputPath,vars.extPath) + if (compiler.outputPath === '/' && compiler.options.devServer) { + outputPath = path.join(compiler.options.devServer.contentBase, outputPath) } - else { - require(`./${framework}Util`)._prepareForBuild(app, vars, options, outputPath, compilation) + logv(verbose,'outputPath: ' + outputPath) + logv(verbose,'framework: ' + framework) + if (framework != 'extjs') { + _prepareForBuild(app, vars, options, outputPath, compilation) } - } - - var command = '' - if (options.watch == 'yes' && vars.production == false) { - command = 'watch' - } - else { - command = 'build' - } - - if (vars.rebuild == true) { - var parms = [] - if (options.profile == undefined || options.profile == '' || options.profile == null) { - if (command == 'build') { - parms = ['app', command, options.environment] + var command = '' + if (options.watch == 'yes' && vars.production == false) + {command = 'watch'} + else + {command = 'build'} + if (vars.rebuild == true) { + var parms = [] + if (options.profile == undefined || options.profile == '' || options.profile == null) { + if (command == 'build') + { parms = ['app', command, options.environment] } + else + { parms = ['app', command, '--web-server', 'false', options.environment] } } else { - parms = ['app', command, '--web-server', 'false', options.environment] + if (command == 'build') + {parms = ['app', command, options.profile, options.environment]} + else + {parms = ['app', command, '--web-server', 'false', options.profile, options.environment]} } - - } - else { - if (command == 'build') { - parms = ['app', command, options.profile, options.environment] - } - else { - parms = ['app', command, '--web-server', 'false', options.profile, options.environment] + if (vars.watchStarted == false) { + await _buildExtBundle(app, compilation, outputPath, parms, vars, options) + vars.watchStarted = true } + callback() } - - if (vars.watchStarted == false) { - await _buildExtBundle(app, compilation, outputPath, parms, options) - vars.watchStarted = true + else { + callback() } - callback() } else { - callback() + logv(verbose,'NOT running emit') + callback() } } else { - log(`${vars.app}FUNCTION emit not run`) + logv(verbose,'emit is no') callback() } } catch(e) { - require('./pluginUtil').logv(options,e) - compilation.errors.push('emit: ' + e) callback() + throw '_emit: ' + e.toString() + // logv(options.verbose,e) + // compilation.errors.push('_emit: ' + e) + // callback() + } +} + +//********** +export function _done(stats, vars, options) { + try { + var verbose = options.verbose + var framework = options.framework + logv(verbose,'FUNCTION _done') + if (stats.compilation.errors && stats.compilation.errors.length) // && process.argv.indexOf('--watch') == -1) + { + var chalk = require('chalk'); + console.log(chalk.red('******************************************')); + console.log(stats.compilation.errors[0]); + console.log(chalk.red('******************************************')); + process.exit(0); + } + + //mjg refactor + if (vars.production == true && options.treeshake == 'no' && framework == 'angular') { + require(`./${options.framework}Util`)._toDev(vars, options) + } + try { + if(options.browser == 'yes' && options.watch == 'yes' && vars.production == false) { + if (vars.browserCount == 0) { + var url = 'http://localhost:' + options.port + require('./pluginUtil').log(vars.app, `Opening browser at ${url}`) + vars.browserCount++ + const opn = require('opn') + opn(url) + } + } + } + catch (e) { + console.log(e) + } + if (vars.buildstep == '1 of 1') { + if (vars.production == true) { + require('./pluginUtil').log(vars.app, `Ending production build`) + } + else { + require('./pluginUtil').log(vars.app, `Ending development build`) + } + } + if (vars.buildstep == '2 of 2') { + require('./pluginUtil').log(vars.app, `Ending production build`) + } + } + catch(e) { +// require('./pluginUtil').logv(options.verbose,e) + throw '_done: ' + e.toString() } } //********** export function _prepareForBuild(app, vars, options, output, compilation) { try { - logv(options,'FUNCTION _prepareForBuild') + var verbose = options.verbose + var packages = options.packages + var toolkit = options.toolkit + var theme = options.theme + logv(verbose,'FUNCTION _prepareForBuild') const rimraf = require('rimraf') const mkdirp = require('mkdirp') const fsx = require('fs-extra') const fs = require('fs') const path = require('path') - - var packages = options.packages - var toolkit = options.toolkit - var theme = options.theme - theme = theme || (toolkit === 'classic' ? 'theme-triton' : 'theme-material') - logv(options,'firstTime: ' + vars.firstTime) + logv(verbose,'firstTime: ' + vars.firstTime) if (vars.firstTime) { rimraf.sync(output) mkdirp.sync(output) @@ -253,37 +325,35 @@ export function _prepareForBuild(app, vars, options, output, compilation) { const createAppJson = require('./artifacts').createAppJson const createWorkspaceJson = require('./artifacts').createWorkspaceJson const createJSDOMEnvironment = require('./artifacts').createJSDOMEnvironment - fs.writeFileSync(path.join(output, 'build.xml'), buildXML(vars.production, options, output), 'utf8') fs.writeFileSync(path.join(output, 'app.json'), createAppJson(theme, packages, toolkit, options, output), 'utf8') fs.writeFileSync(path.join(output, 'jsdom-environment.js'), createJSDOMEnvironment(options, output), 'utf8') fs.writeFileSync(path.join(output, 'workspace.json'), createWorkspaceJson(options, output), 'utf8') - var framework = vars.framework; //because of a problem with colorpicker if (fs.existsSync(path.join(process.cwd(),`ext-${framework}/ux/`))) { var fromPath = path.join(process.cwd(), `ext-${framework}/ux/`) var toPath = path.join(output, 'ux') fsx.copySync(fromPath, toPath) - log(app + 'Copying (ux) ' + fromPath.replace(process.cwd(), '') + ' to: ' + toPath.replace(process.cwd(), '')) + log(app, 'Copying (ux) ' + fromPath.replace(process.cwd(), '') + ' to: ' + toPath.replace(process.cwd(), '')) } if (fs.existsSync(path.join(process.cwd(),`ext-${framework}/packages/`))) { var fromPath = path.join(process.cwd(), `ext-${framework}/packages/`) var toPath = path.join(output, 'packages') fsx.copySync(fromPath, toPath) - log(app + 'Copying ' + fromPath.replace(process.cwd(), '') + ' to: ' + toPath.replace(process.cwd(), '')) + log(app, 'Copying ' + fromPath.replace(process.cwd(), '') + ' to: ' + toPath.replace(process.cwd(), '')) } if (fs.existsSync(path.join(process.cwd(),`ext-${framework}/overrides/`))) { var fromPath = path.join(process.cwd(), `ext-${framework}/overrides/`) var toPath = path.join(output, 'overrides') fsx.copySync(fromPath, toPath) - log(app + 'Copying ' + fromPath.replace(process.cwd(), '') + ' to: ' + toPath.replace(process.cwd(), '')) + log(app, 'Copying ' + fromPath.replace(process.cwd(), '') + ' to: ' + toPath.replace(process.cwd(), '')) } if (fs.existsSync(path.join(process.cwd(),'resources/'))) { var fromResources = path.join(process.cwd(), 'resources/') var toResources = path.join(output, '../resources') fsx.copySync(fromResources, toResources) - log(app + 'Copying ' + fromResources.replace(process.cwd(), '') + ' to: ' + toResources.replace(process.cwd(), '')) + log(app, 'Copying ' + fromResources.replace(process.cwd(), '') + ' to: ' + toResources.replace(process.cwd(), '')) } } vars.firstTime = false @@ -292,7 +362,7 @@ export function _prepareForBuild(app, vars, options, output, compilation) { js = vars.deps.join(';\n'); } else { - js = 'Ext.require("Ext.*")' + js = 'Ext.require(["Ext.*","Ext.data.TreeStore"])' } if (vars.manifest === null || js !== vars.manifest) { vars.manifest = js @@ -301,129 +371,95 @@ export function _prepareForBuild(app, vars, options, output, compilation) { vars.rebuild = true var bundleDir = output.replace(process.cwd(), '') if (bundleDir.trim() == '') {bundleDir = './'} - log(app + 'Building Ext bundle at: ' + bundleDir) + log(app, 'Building Ext bundle at: ' + bundleDir) } else { vars.rebuild = false - log(app + 'Ext rebuild NOT needed') + log(app, 'Ext rebuild NOT needed') } } catch(e) { - require('./pluginUtil').logv(options,e) + require('./pluginUtil').logv(options.verbose,e) compilation.errors.push('_prepareForBuild: ' + e) } } //********** -export function _buildExtBundle(app, compilation, outputPath, parms, options) { - try { +export function _buildExtBundle(app, compilation, outputPath, parms, vars, options) { +// try { + var verbose = options.verbose const fs = require('fs') - const logv = require('./pluginUtil').logv - logv(options,'FUNCTION _buildExtBundle') - + logv(verbose,'FUNCTION _buildExtBundle') let sencha; try { sencha = require('@sencha/cmd') } catch (e) { sencha = 'sencha' } if (fs.existsSync(sencha)) { - logv(options,'sencha folder exists') + logv(verbose,'sencha folder exists') } else { - logv(options,'sencha folder DOES NOT exist') + logv(verbose,'sencha folder DOES NOT exist') } - return new Promise((resolve, reject) => { const onBuildDone = () => { - logv(options,'onBuildDone') + logv(verbose,'onBuildDone') resolve() } - var opts = { cwd: outputPath, silent: true, stdio: 'pipe', encoding: 'utf-8'} - executeAsync(app, sencha, parms, opts, compilation, options).then ( + _executeAsync(app, sencha, parms, opts, compilation, vars, options).then ( function() { onBuildDone() }, function(reason) { reject(reason) } ) }) - } - catch(e) { - console.log('e') - require('./pluginUtil').logv(options,e) - compilation.errors.push('_buildExtBundle: ' + e) - callback() - } -} - -//********** -export function _done(vars, options) { - try { - const log = require('./pluginUtil').log - const logv = require('./pluginUtil').logv - logv(options,'FUNCTION _done') - - - if (vars.production == true && options.treeshake == false && options.framework == 'angular') { - require(`./${options.framework}Util`)._toDev(vars, options) - } - - - try { - if(options.browser == true && options.watch == 'yes' && vars.production == false) { - if (vars.browserCount == 0) { - var url = 'http://localhost:' + options.port - require('./pluginUtil').log(vars.app + `Opening browser at ${url}`) - vars.browserCount++ - const opn = require('opn') - opn(url) - } - } - } - catch (e) { - console.log(e) - //compilation.errors.push('show browser window - ext-done: ' + e) - } - } - catch(e) { - require('./pluginUtil').logv(options,e) - } + // } + // catch(e) { + // console.log('e') + // require('./pluginUtil').logv(options.verbose,e) + // compilation.errors.push('_buildExtBundle: ' + e) + // callback() + // } } //********** -export async function executeAsync (app, command, parms, opts, compilation, options) { - try { +export async function _executeAsync (app, command, parms, opts, compilation, vars, options) { +// try { + var verbose = options.verbose + var framework = options.framework //const DEFAULT_SUBSTRS = ['[INF] Loading', '[INF] Processing', '[LOG] Fashion build complete', '[ERR]', '[WRN]', "[INF] Server", "[INF] Writing", "[INF] Loading Build", "[INF] Waiting", "[LOG] Fashion waiting"]; const DEFAULT_SUBSTRS = ["[INF] xServer", '[INF] Loading', '[INF] Append', '[INF] Processing', '[INF] Processing Build', '[LOG] Fashion build complete', '[ERR]', '[WRN]', "[INF] Writing", "[INF] Loading Build", "[INF] Waiting", "[LOG] Fashion waiting"]; var substrings = DEFAULT_SUBSTRS var chalk = require('chalk') const crossSpawn = require('cross-spawn') - const log = require('./pluginUtil').log - logv(options, 'FUNCTION executeAsync') + logv(verbose, 'FUNCTION _executeAsync') await new Promise((resolve, reject) => { - logv(options,`command - ${command}`) - logv(options, `parms - ${parms}`) - logv(options, `opts - ${JSON.stringify(opts)}`) + logv(verbose,`command - ${command}`) + logv(verbose, `parms - ${parms}`) + logv(verbose, `opts - ${JSON.stringify(opts)}`) let child = crossSpawn(command, parms, opts) child.on('close', (code, signal) => { - logv(options, `on close: ` + code) + logv(verbose, `on close: ` + code) if(code === 0) { resolve(0) } else { compilation.errors.push( new Error(code) ); resolve(0) } }) child.on('error', (error) => { - logv(options, `on error`) + logv(verbose, `on error`) compilation.errors.push(error) resolve(0) }) child.stdout.on('data', (data) => { var str = data.toString().replace(/\r?\n|\r/g, " ").trim() - logv(options, `${str}`) + logv(verbose, `${str}`) if (data && data.toString().match(/Fashion waiting for changes\.\.\./)) { const fs = require('fs'); - var filename = process.cwd() + '/src/index.jsx'; + var filename = process.cwd() + vars.touchFile; try { + var d = new Date().toLocaleString() var data = fs.readFileSync(filename); - fs.writeFileSync(filename, data + ' ', 'utf8'); - log(options, `touching ${filename}`); + fs.writeFileSync(filename, '//' + d, 'utf8'); + log(app, `touching ${filename}`); } catch(e) { - log(options, `NOT touching ${filename}`); + log(app, `NOT touching ${filename}`); } + resolve(0) } else { @@ -435,7 +471,7 @@ export async function executeAsync (app, command, parms, opts, compilation, opti compilation.errors.push(app + str.replace(/^\[ERR\] /gi, '')); str = str.replace("[ERR]", `${chalk.red("[ERR]")}`) } - log(`${app}${str}`) + log(app, str) } } }) @@ -449,36 +485,41 @@ export async function executeAsync (app, command, parms, opts, compilation, opti } }) }) - } - catch(e) { - require('./pluginUtil').logv(options,e) - compilation.errors.push('executeAsync: ' + e) - callback() - } + // } + // catch(e) { + // logv(options,e) + // compilation.errors.push('_executeAsync: ' + e) + // callback() + // } } -export function log(s) { - require('readline').cursorTo(process.stdout, 0) - try { - process.stdout.clearLine() - } - catch(e) {} - process.stdout.write(s) - process.stdout.write('\n') +//********** +function runScript(scriptPath, callback) { + var childProcess = require('child_process'); + // keep track of whether callback has been invoked to prevent multiple invocations + var invoked = false; + var process = childProcess.fork(scriptPath); + // listen for errors as they may prevent the exit event from firing + process.on('error', function (err) { + if (invoked) return; + invoked = true; + callback(err); + }); + // execute the callback once the process has finished running + process.on('exit', function (code) { + if (invoked) return; + invoked = true; + var err = code === 0 ? null : new Error('exit code ' + code); + callback(err); + }); } -export function logv(options, s) { - if (options.verbose == 'yes') { - require('readline').cursorTo(process.stdout, 0) - try { - process.stdout.clearLine() - } - catch(e) {} - process.stdout.write(`-verbose: ${s}`) - process.stdout.write('\n') - } +//********** +export function _toXtype(str) { + return str.toLowerCase().replace(/_/g, '-') } +//********** export function _getApp() { var chalk = require('chalk') var prefix = `` @@ -488,10 +529,10 @@ export function _getApp() { return `${chalk.green(prefix)} ` } -export function _getVersions(app, pluginName, frameworkName) { +//********** +export function _getVersions(pluginName, frameworkName) { const path = require('path') const fs = require('fs') - var v = {} var pluginPath = path.resolve(process.cwd(),'node_modules/@sencha', pluginName) var pluginPkg = (fs.existsSync(pluginPath+'/package.json') && JSON.parse(fs.readFileSync(pluginPath+'/package.json', 'utf-8')) || {}); @@ -508,25 +549,20 @@ export function _getVersions(app, pluginName, frameworkName) { v.edition = `Community` } } - var webpackPath = path.resolve(process.cwd(),'node_modules/webpack') var webpackPkg = (fs.existsSync(webpackPath+'/package.json') && JSON.parse(fs.readFileSync(webpackPath+'/package.json', 'utf-8')) || {}); v.webpackVersion = webpackPkg.version - var extPath = path.resolve(process.cwd(),'node_modules/@sencha/ext') var extPkg = (fs.existsSync(extPath+'/package.json') && JSON.parse(fs.readFileSync(extPath+'/package.json', 'utf-8')) || {}); v.extVersion = extPkg.sencha.version - var cmdPath = path.resolve(process.cwd(),`node_modules/@sencha/cmd`) var cmdPkg = (fs.existsSync(cmdPath+'/package.json') && JSON.parse(fs.readFileSync(cmdPath+'/package.json', 'utf-8')) || {}); v.cmdVersion = cmdPkg.version_full - if (v.cmdVersion == undefined) { var cmdPath = path.resolve(process.cwd(),`node_modules/@sencha/${pluginName}/node_modules/@sencha/cmd`) var cmdPkg = (fs.existsSync(cmdPath+'/package.json') && JSON.parse(fs.readFileSync(cmdPath+'/package.json', 'utf-8')) || {}); v.cmdVersion = cmdPkg.version_full } - var frameworkInfo = '' if (frameworkName != undefined && frameworkName != 'extjs') { var frameworkPath = '' @@ -540,5 +576,117 @@ export function _getVersions(app, pluginName, frameworkName) { v.frameworkVersion = frameworkPkg.version frameworkInfo = ', ' + frameworkName + ' v' + v.frameworkVersion } - return app + 'ext-webpack-plugin v' + v.pluginVersion + ', Ext JS v' + v.extVersion + ' ' + v.edition + ' Edition, Sencha Cmd v' + v.cmdVersion + ', webpack v' + v.webpackVersion + frameworkInfo - } \ No newline at end of file + return 'ext-react-webpack-plugin v' + v.pluginVersion + ', Ext JS v' + v.extVersion + ' ' + v.edition + ' Edition, Sencha Cmd v' + v.cmdVersion + ', webpack v' + v.webpackVersion + frameworkInfo + } + +//********** +export function log(app,message) { + var s = app + message + require('readline').cursorTo(process.stdout, 0) + try {process.stdout.clearLine()}catch(e) {} + process.stdout.write(s);process.stdout.write('\n') +} + +//********** +export function logh(app,message) { + var h = false + var s = app + message + if (h == true) { + require('readline').cursorTo(process.stdout, 0) + try { + process.stdout.clearLine() + } + catch(e) {} + process.stdout.write(s) + process.stdout.write('\n') + } +} + +//********** +export function logv(verbose, s) { + if (verbose == 'yes') { + require('readline').cursorTo(process.stdout, 0) + try { + process.stdout.clearLine() + } + catch(e) {} + process.stdout.write(`-verbose: ${s}`) + process.stdout.write('\n') + } +} + +function _getValidateOptions() { + return { + "type": "object", + "properties": { + "framework": { + "type": ["string"] + }, + "toolkit": { + "type": ["string"] + }, + "theme": { + "type": ["string"] + }, + "emit": { + "errorMessage": "should be 'yes' or 'no' string value (NOT true or false)", + "type": ["string"] + }, + "script": { + "type": ["string"] + }, + "port": { + "type": ["integer"] + }, + "packages": { + "type": ["string", "array"] + }, + "profile": { + "type": ["string"] + }, + "environment": { + "errorMessage": "should be 'development' or 'production' string value", + "type": ["string"] + }, + "treeshake": { + "errorMessage": "should be 'yes' or 'no' string value (NOT true or false)", + "type": ["string"] + }, + "browser": { + "errorMessage": "should be 'yes' or 'no' string value (NOT true or false)", + "type": ["string"] + }, + "watch": { + "errorMessage": "should be 'yes' or 'no' string value (NOT true or false)", + "type": ["string"] + }, + "verbose": { + "errorMessage": "should be 'yes' or 'no' string value (NOT true or false)", + "type": ["string"] + } + }, + "additionalProperties": false + }; +} + + +function _getDefaultOptions() { + return { + framework: 'extjs', + toolkit: 'modern', + theme: 'theme-material', + emit: 'yes', + script: null, + port: 1962, + packages: [], + + profile: '', + environment: 'development', + treeshake: 'no', + browser: 'yes', + watch: 'yes', + verbose: 'no' + } +} + + diff --git a/packages/ext-react-webpack-plugin/src/reactUtil.js b/packages/ext-react-webpack-plugin/src/reactUtil.js index 428c6fc7..04df2d18 100644 --- a/packages/ext-react-webpack-plugin/src/reactUtil.js +++ b/packages/ext-react-webpack-plugin/src/reactUtil.js @@ -1,66 +1,28 @@ "use strict" -export function getValidateOptions() { - return { - "type": "object", - "properties": { - "framework": {"type": [ "string" ]}, - "toolkit": {"type": [ "string" ]}, - "port": {"type": [ "integer" ]}, - "emit": {"type": [ "boolean" ]}, - "browser": {"type": [ "boolean" ]}, - "watch": {"type": [ "string" ]}, - "profile": {"type": [ "string" ]}, - "environment": {"type": [ "string" ]}, - "verbose": {"type": [ "string" ]}, - "theme": {"type": [ "string" ]}, - "treeshake": {"type": [ "boolean" ]}, - "packages": {"type": [ "string", "array" ]} - }, - "additionalProperties": false - // "errorMessage": { - // "option": "should be {Boolean} (https:/github.com/org/repo#anchor)" - // } - } -} - -export function getDefaultOptions() { - return { - port: 1962, - emit: true, - browser: true, - watch: 'yes', - profile: '', - environment: 'development', - verbose: 'no', - toolkit: 'modern', - packages: null - } -} - -export function getDefaultVars() { +export function _getDefaultVars() { return { + touchFile: '/src/themer.js', watchStarted : false, + buildstep: '1 of 1', firstTime : true, firstCompile: true, browserCount : 0, manifest: null, - extPath: 'ext-react', + extPath: 'ext', pluginErrors: [], deps: [], + usedExtComponents: [], rebuild: true } } -function toXtype(str) { - return str.toLowerCase().replace(/_/g, '-') -} - -export function extractFromSource(module, options, compilation) { - try { +export function _extractFromSource(module, options, compilation, extComponents) { + const logv = require('./pluginUtil').logv + logv(options.verbose,'FUNCTION _extractFromSource') +// try { var js = module._source._value - const logv = require('./pluginUtil').logv - logv(options,'FUNCTION extractFromSource') + logv(options.verbose,'FUNCTION extractFromSource') var generate = require("@babel/generator").default var parse = require("babylon").parse var traverse = require("ast-traverse") @@ -85,9 +47,9 @@ export function extractFromSource(module, options, compilation) { function addType(argNode) { var type if (argNode.type === 'StringLiteral') { - var xtype = toXtype(argNode.value) + var xtype = require('./pluginUtil')._toXtype(argNode.value) if (xtype != 'extreact') { - type = { xtype: toXtype(argNode.value) } + type = { xtype: require('./pluginUtil')._toXtype(argNode.value) } } } else { type = { xclass: js.slice(argNode.start, argNode.end) } @@ -140,31 +102,12 @@ export function extractFromSource(module, options, compilation) { } }) return statements - } - catch(e) { - console.log(module.resource) - console.log(js) - console.log(e) - compilation.errors.push('extractFromSource: ' + e) - return [] - } + // } + // catch(e) { + // console.log(module.resource) + // console.log(js) + // console.log(e) + // compilation.errors.push('extractFromSource: ' + e) + // return [] + // } } - -//********** -export function _done(vars, options) { - try { - const log = require('./pluginUtil').log - const logv = require('./pluginUtil').logv - logv(options,'FUNCTION _done') - - try { - } - catch (e) { - console.log(e) - return [] - } - } - catch(e) { - require('./pluginUtil').logv(options,e) - } -} \ No newline at end of file diff --git a/packages/ext-react/dist/renderWhenReady.js b/packages/ext-react/dist/renderWhenReady.js index f7f32e9e..bd7b708d 100644 --- a/packages/ext-react/dist/renderWhenReady.js +++ b/packages/ext-react/dist/renderWhenReady.js @@ -48,8 +48,10 @@ export default function renderWhenReady(Component) { }(React.Component), _defineProperty(_class, "isExtJSComponent", true), _temp; } Ext.onReady(function () { - for (var _i = 0; _i < launchQueue.length; _i++) { - var queued = launchQueue[_i]; + var _arr = launchQueue; + + for (var _i = 0; _i < _arr.length; _i++) { + var queued = _arr[_i]; queued.setState({ ready: true }); diff --git a/packages/ext-react/dist/renderWhenReady.js.map b/packages/ext-react/dist/renderWhenReady.js.map index 325ae921..e8f404f4 100644 --- a/packages/ext-react/dist/renderWhenReady.js.map +++ b/packages/ext-react/dist/renderWhenReady.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/renderWhenReady.js"],"names":["React","launchQueue","renderWhenReady","Component","state","ready","Ext","isReady","done","componentWillMount","push","render","props","onReady","queued","setState"],"mappings":";;AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,IAAMC,WAAW,GAAG,EAApB;AAEA;;;;;;AAKA,eAAe,SAASC,eAAT,CAAyBC,SAAzB,EAAoC;AAAA;;AAEjD;AAAA;AAAA;AAAA;;AAGE,uCAAc;AAAA;;AACZ;AACA,YAAKC,KAAL,GAAa;AACXC,QAAAA,KAAK,EAAEC,GAAG,CAACC,OADA;AAEXC,QAAAA,IAAI,EAAE;AAFK,OAAb;AAFY;AAMb;;AATH;;AAAA,WAWEC,kBAXF,GAWE,8BAAqB;AACnB,UAAI,CAAC,KAAKL,KAAL,CAAWC,KAAhB,EAAuB;AACrBJ,QAAAA,WAAW,CAACS,IAAZ,CAAiB,IAAjB;AACD;AACF,KAfH;;AAAA,WAiBEC,MAjBF,GAiBE,kBAAS;AACP,UAAI,KAAKP,KAAL,CAAWC,KAAX,KAAqB,IAArB,IAA6B,KAAKD,KAAL,CAAWI,IAAX,IAAmB,KAApD,EAA4D;AAC1D,aAAKJ,KAAL,CAAWI,IAAX,GAAkB,IAAlB;AACA,eAAO,oBAAC,SAAD,EAAe,KAAKI,KAApB,CAAP;AACD,OAHD,MAIK;AACH,eAAO,KAAP;AACD;AACF,KAzBH;;AAAA;AAAA,IAA6CZ,KAAK,CAACG,SAAnD,+CAC4B,IAD5B;AA2BD;AAEDG,GAAG,CAACO,OAAJ,CAAY,YAAM;AAChB,wBAAmBZ,WAAnB,eAAgC;AAA3B,QAAIa,MAAM,GAAIb,WAAJ,IAAV;AACHa,IAAAA,MAAM,CAACC,QAAP,CAAgB;AAAEV,MAAAA,KAAK,EAAE;AAAT,KAAhB;AACD;AACF,CAJD","sourcesContent":["import React from 'react'\nconst launchQueue = []\n\n/**\n * Higher order function that returns a component that waits for a ExtReact to be ready before rendering.\n * @param {class} Component \n * @return {class}\n */\nexport default function renderWhenReady(Component) {\n\n return class ExtReactRenderWhenReady extends React.Component {\n static isExtJSComponent = true;\n\n constructor() {\n super();\n this.state = {\n ready: Ext.isReady,\n done: false\n }\n }\n\n componentWillMount() {\n if (!this.state.ready) {\n launchQueue.push(this);\n }\n }\n\n render() {\n if (this.state.ready === true && this.state.done == false ) {\n this.state.done = true\n return \n }\n else {\n return false\n }\n }\n }\n}\n\nExt.onReady(() => {\n for (let queued of launchQueue) {\n queued.setState({ ready: true });\n }\n})"],"file":"renderWhenReady.js"} \ No newline at end of file +{"version":3,"sources":["../src/renderWhenReady.js"],"names":["React","launchQueue","renderWhenReady","Component","state","ready","Ext","isReady","done","componentWillMount","push","render","props","onReady","queued","setState"],"mappings":";;AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,IAAMC,WAAW,GAAG,EAApB;AAEA;;;;;;AAKA,eAAe,SAASC,eAAT,CAAyBC,SAAzB,EAAoC;AAAA;;AAEjD;AAAA;AAAA;AAAA;;AAGE,uCAAc;AAAA;;AACZ;AACA,YAAKC,KAAL,GAAa;AACXC,QAAAA,KAAK,EAAEC,GAAG,CAACC,OADA;AAEXC,QAAAA,IAAI,EAAE;AAFK,OAAb;AAFY;AAMb;;AATH;;AAAA,WAWEC,kBAXF,GAWE,8BAAqB;AACnB,UAAI,CAAC,KAAKL,KAAL,CAAWC,KAAhB,EAAuB;AACrBJ,QAAAA,WAAW,CAACS,IAAZ,CAAiB,IAAjB;AACD;AACF,KAfH;;AAAA,WAiBEC,MAjBF,GAiBE,kBAAS;AACP,UAAI,KAAKP,KAAL,CAAWC,KAAX,KAAqB,IAArB,IAA6B,KAAKD,KAAL,CAAWI,IAAX,IAAmB,KAApD,EAA4D;AAC1D,aAAKJ,KAAL,CAAWI,IAAX,GAAkB,IAAlB;AACA,eAAO,oBAAC,SAAD,EAAe,KAAKI,KAApB,CAAP;AACD,OAHD,MAIK;AACH,eAAO,KAAP;AACD;AACF,KAzBH;;AAAA;AAAA,IAA6CZ,KAAK,CAACG,SAAnD,+CAC4B,IAD5B;AA2BD;AAEDG,GAAG,CAACO,OAAJ,CAAY,YAAM;AAAA,aACGZ,WADH;;AAChB,2CAAgC;AAA3B,QAAIa,MAAM,WAAV;AACHA,IAAAA,MAAM,CAACC,QAAP,CAAgB;AAAEV,MAAAA,KAAK,EAAE;AAAT,KAAhB;AACD;AACF,CAJD","sourcesContent":["import React from 'react'\nconst launchQueue = []\n\n/**\n * Higher order function that returns a component that waits for a ExtReact to be ready before rendering.\n * @param {class} Component \n * @return {class}\n */\nexport default function renderWhenReady(Component) {\n\n return class ExtReactRenderWhenReady extends React.Component {\n static isExtJSComponent = true;\n\n constructor() {\n super();\n this.state = {\n ready: Ext.isReady,\n done: false\n }\n }\n\n componentWillMount() {\n if (!this.state.ready) {\n launchQueue.push(this);\n }\n }\n\n render() {\n if (this.state.ready === true && this.state.done == false ) {\n this.state.done = true\n return \n }\n else {\n return false\n }\n }\n }\n}\n\nExt.onReady(() => {\n for (let queued of launchQueue) {\n queued.setState({ ready: true });\n }\n})"],"file":"renderWhenReady.js"} \ No newline at end of file diff --git a/packages/ext-react/package.json b/packages/ext-react/package.json index 4b7329b7..d743d508 100644 --- a/packages/ext-react/package.json +++ b/packages/ext-react/package.json @@ -28,7 +28,7 @@ "ext-react": "./bin/ext-react.js" }, "dependencies": { - "@babel/runtime": "^7.3.4", + "@babel/runtime": "^7.4.2", "comment-json": "^1.1.3", "fbjs": "1.0.0", "lodash.capitalize": "^4.2.1", @@ -38,16 +38,16 @@ "lodash.union": "^4.6.0", "minimist": "^1.2.0", "mkdirp": "^0.5.1", - "react": "~16.8.3", - "react-dom": "~16.8.3", - "react-reconciler": "~0.20.1", - "react-test-renderer": "~16.8.3" + "react": "~16.8.4", + "@hot-loader/react-dom":"~16.8.4", + "react-reconciler": "~0.20.2", + "react-test-renderer": "~16.8.4" }, "devDependencies": { "@babel/cli": "^7.2.3", - "@babel/core": "^7.3.4", - "@babel/plugin-proposal-class-properties": "^7.3.4", - "@babel/plugin-proposal-decorators": "^7.3.0", + "@babel/core": "^7.4.0", + "@babel/plugin-proposal-class-properties": "^7.4.0", + "@babel/plugin-proposal-decorators": "^7.4.0", "@babel/plugin-proposal-export-namespace-from": "^7.2.0", "@babel/plugin-proposal-function-sent": "^7.2.0", "@babel/plugin-proposal-json-strings": "^7.2.0", @@ -55,11 +55,11 @@ "@babel/plugin-proposal-throw-expressions": "^7.2.0", "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-import-meta": "^7.2.0", - "@babel/plugin-transform-runtime": "^7.3.4", - "@babel/preset-env": "^7.3.4", + "@babel/plugin-transform-runtime": "^7.4.0", + "@babel/preset-env": "^7.4.2", "@babel/preset-react": "^7.0.0", - "@types/react": "^16.8.5", - "@types/react-dom": "~16.8.2", + "@types/react": "^16.8.8", + "@types/react-dom": "~16.8.3", "react-addons-test-utils": "^15.6.2", "typescript": "^3.3.1" } diff --git a/packages/extjs-to-react-converter/package.json b/packages/extjs-to-react-converter/package.json index 5292f7b6..ed0d2360 100644 --- a/packages/extjs-to-react-converter/package.json +++ b/packages/extjs-to-react-converter/package.json @@ -37,7 +37,7 @@ }, "devDependencies": { "@sencha/ext-react-babel-plugin": "^6.7.0", - "@sencha/ext-webpack-plugin": "^7.0.0", + "@sencha/ext-react-webpack-plugin": "~6.7.1", "@babel/core": "^7.3.4", "@babel/plugin-proposal-class-properties": "^7.3.4", "@babel/plugin-proposal-decorators": "^7.3.0", diff --git a/packages/extjs-to-react-converter/webpack.config.js b/packages/extjs-to-react-converter/webpack.config.js index 62ffe381..2532a071 100644 --- a/packages/extjs-to-react-converter/webpack.config.js +++ b/packages/extjs-to-react-converter/webpack.config.js @@ -1,7 +1,7 @@ const webpack = require('webpack'); const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin') -const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin') +const ExtWebpackPlugin = require('@sencha/ext-react webpack-plugin') const portfinder = require('portfinder') const sourcePath = path.join(__dirname, './src')