diff --git a/CONTRIBUTOR.md b/CONTRIBUTOR.md
new file mode 100644
index 0000000..ce43875
--- /dev/null
+++ b/CONTRIBUTOR.md
@@ -0,0 +1,19 @@
+# Contributor Instructions
+
+## Sign the CLA
+
+Before any contributions can be done, we need you to [sign the Sencha CLA](https://goo.gl/forms/XGj5PlhNUc9suiQE3). If you have already signed it for another Sencha open source repository, you're good to go.
+
+## Patches & Enhancements
+Have you found something that you would like to fix.
+
+1. Fork the repo
+2. Make your modification
+3. Submit your patch by pulling against the master.
+4. Wait for a repo admin to review.
+5. Possibly make modifications
+6. Repeat #4 after modifications
+7. Repo admin may merge your request.
+
+## Communication
+Please ask us questions, we want to help.
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..75e1bef
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,13 @@
+Copyright (c) 2011-2019 Sencha, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/lerna.json b/lerna.json
index c40c350..41ef5f6 100644
--- a/lerna.json
+++ b/lerna.json
@@ -2,5 +2,5 @@
"packages": [
"packages/*"
],
- "version": "3.10.7"
+ "version": "3.13.1"
}
diff --git a/misc b/misc
index 033c3b2..2ff049f 100644
--- a/misc
+++ b/misc
@@ -10,6 +10,8 @@ npm --registry https://npm.sencha.com/ whoami
https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally
+ps -ej | grep sencha.jar
+sudo kill -9 22952
git remote add upstream https://github.com/sencha/ext-react.git
git remote -v
@@ -29,6 +31,7 @@ git checkout v6.6.0
git fetch upstream
git merge upstream/master
git merge upstream/ext-gen-6.7.x
+git merge upstream/ext-gen-7.0.x
/usr/local/lib/node_modules/node/lib/node_modules/@sencha/ext-gen
diff --git a/other/u/upgrade.js b/other/u/upgrade.js
index 8694aed..cf6ed87 100644
--- a/other/u/upgrade.js
+++ b/other/u/upgrade.js
@@ -249,7 +249,7 @@ class Upgrade {
handleWorkspaceJsonUpgrade() {
var workspaceJsonObject = this.getJson('workspace.json')
workspaceJsonObject.frameworks.ext.path = 'node_modules/@sencha/ext'
- //workspaceJsonObject.frameworks.ext.version = '6.7.0.0' //needs to be looked up
+ //workspaceJsonObject.frameworks.ext.version = '7.0.0.0' //needs to be looked up
//workspaceJsonObject.packages.dir.push("node_modules/@sencha")
diff --git a/package.json b/package.json
index 2cc05c8..5ba01ed 100644
--- a/package.json
+++ b/package.json
@@ -1,12 +1,26 @@
{
- "private": true,
+ "name": "ext-gen",
+ "version": "7.0.0",
+ "description": "ext-gen root",
+ "main": "index.js",
"scripts": {
- "postinstall": "lerna bootstrap",
- "increment": "lerna publish --skip-git --skip-npm --force-publish",
- "clean": "lerna clean",
- "install:clean": "npm cache clear --force && lerna clean && npm install"
+ "postinstall": "npx lerna bootstrap --loglevel warn",
+ "increment": "npx lerna publish --skip-git --skip-npm --force-publish",
+ "clean": "npx lerna clean",
+ "install:clean": "npm cache clear --force && npx lerna clean && npm install"
},
+ "keywords": [
+ "Ext",
+ "JS",
+ "Sencha"
+ ],
+ "author": "Sencha, Inc.",
+ "license": "MIT",
"devDependencies": {
- "lerna": "3.10.7"
+ "lerna": "^3.13.1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/sencha/ext-allshared"
}
}
diff --git a/packages/ext-build-generate-app/ext-templates/application/classicdesktop/app/desktop/src/view/home/HomeView.scss.tpl.default b/packages/ext-build-generate-app/ext-templates/application/classicdesktop/app/desktop/src/view/home/HomeView.scss.tpl.default
index f80cfbb..c54a243 100644
--- a/packages/ext-build-generate-app/ext-templates/application/classicdesktop/app/desktop/src/view/home/HomeView.scss.tpl.default
+++ b/packages/ext-build-generate-app/ext-templates/application/classicdesktop/app/desktop/src/view/home/HomeView.scss.tpl.default
@@ -1,7 +1,7 @@
// sass for {appName}.view.home.HomeView
.homeview {
color: $color;
- background-color: $base-light-color;
+ background-color: white;
padding: 15px;
border: 1px solid lightgray;
box-shadow: 2px 2px 8px 0 rgba(0, 0, 0, 0.4);
diff --git a/packages/ext-build-generate-app/ext-templates/application/classicdesktop/app/desktop/src/view/main/detail/DetailView.scss.tpl.default b/packages/ext-build-generate-app/ext-templates/application/classicdesktop/app/desktop/src/view/main/detail/DetailView.scss.tpl.default
index 1700ae7..a8e9618 100644
--- a/packages/ext-build-generate-app/ext-templates/application/classicdesktop/app/desktop/src/view/main/detail/DetailView.scss.tpl.default
+++ b/packages/ext-build-generate-app/ext-templates/application/classicdesktop/app/desktop/src/view/main/detail/DetailView.scss.tpl.default
@@ -1,6 +1,6 @@
.detailview {
color: $color;
- background-color: $base-light-color;
+ background-color: white;
padding: 15px;
box-shadow: 2px 2px 8px 0 rgba(0, 0, 0, 0.4);
}
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/classicdesktop/index.js.tpl.default b/packages/ext-build-generate-app/ext-templates/application/classicdesktop/index.js.tpl.default
new file mode 100644
index 0000000..c352a83
--- /dev/null
+++ b/packages/ext-build-generate-app/ext-templates/application/classicdesktop/index.js.tpl.default
@@ -0,0 +1 @@
+//this file exists so the webpack build process will succeed
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/classicdesktop/workspace.json.tpl.default b/packages/ext-build-generate-app/ext-templates/application/classicdesktop/workspace.json.tpl.default
index 3246e3c..e0f5b0a 100644
--- a/packages/ext-build-generate-app/ext-templates/application/classicdesktop/workspace.json.tpl.default
+++ b/packages/ext-build-generate-app/ext-templates/application/classicdesktop/workspace.json.tpl.default
@@ -7,7 +7,7 @@
"dir": "$\u007Bworkspace.dir}/build"
},
"packages": {
- "dir": "$\u007Bworkspace.dir}/packages/local,{packages},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-treegrid,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-base,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-ios,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-material,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-aria,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neutral,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-classic,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-gray,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-triton,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-graphite,$\u007Bworkspace.dir}/node_modules/@sencha/ext-calendar,$\u007Bworkspace.dir}/node_modules/@sencha/ext-charts,$\u007Bworkspace.dir}/node_modules/@sencha/ext-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-exporter,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-ux",
+ "dir": "$\u007Bworkspace.dir}/packages/local,{packages},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-treegrid,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-base,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-ios,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-material,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-aria,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neutral,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-classic,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-gray,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-triton,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-graphite,$\u007Bworkspace.dir}/node_modules/@sencha/ext-calendar,$\u007Bworkspace.dir}/node_modules/@sencha/ext-charts,$\u007Bworkspace.dir}/node_modules/@sencha/ext-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-exporter,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-ux,$\u007Bworkspace.dir}/node_modules/@sencha/ext-font-ios",
"extract": "$\u007Bworkspace.dir}/packages/remote"
}
-}
+}
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/classicdesktoplogin/index.js.tpl.default b/packages/ext-build-generate-app/ext-templates/application/classicdesktoplogin/index.js.tpl.default
new file mode 100644
index 0000000..c352a83
--- /dev/null
+++ b/packages/ext-build-generate-app/ext-templates/application/classicdesktoplogin/index.js.tpl.default
@@ -0,0 +1 @@
+//this file exists so the webpack build process will succeed
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/classicdesktoplogin/workspace.json.tpl.default b/packages/ext-build-generate-app/ext-templates/application/classicdesktoplogin/workspace.json.tpl.default
index e9d798a..e0f5b0a 100644
--- a/packages/ext-build-generate-app/ext-templates/application/classicdesktoplogin/workspace.json.tpl.default
+++ b/packages/ext-build-generate-app/ext-templates/application/classicdesktoplogin/workspace.json.tpl.default
@@ -7,7 +7,7 @@
"dir": "$\u007Bworkspace.dir}/build"
},
"packages": {
- "dir": "$\u007Bworkspace.dir}/packages/local,{packages},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-treegrid,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-base,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-ios,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-material,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-aria,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neutral,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-classic,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-gray,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-triton,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-graphite,$\u007Bworkspace.dir}/node_modules/@sencha/ext-calendar,$\u007Bworkspace.dir}/node_modules/@sencha/ext-charts,$\u007Bworkspace.dir}/node_modules/@sencha/ext-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-exporter,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-ux",
+ "dir": "$\u007Bworkspace.dir}/packages/local,{packages},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-treegrid,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-base,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-ios,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-material,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-aria,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neutral,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-classic,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-gray,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-triton,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-graphite,$\u007Bworkspace.dir}/node_modules/@sencha/ext-calendar,$\u007Bworkspace.dir}/node_modules/@sencha/ext-charts,$\u007Bworkspace.dir}/node_modules/@sencha/ext-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-exporter,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-ux,$\u007Bworkspace.dir}/node_modules/@sencha/ext-font-ios",
"extract": "$\u007Bworkspace.dir}/packages/remote"
}
}
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/moderndesktop/app/desktop/src/view/main/header/HeaderView.js.tpl.default b/packages/ext-build-generate-app/ext-templates/application/moderndesktop/app/desktop/src/view/main/header/HeaderView.js.tpl.default
index 6b7718c..f9bcc5f 100644
--- a/packages/ext-build-generate-app/ext-templates/application/moderndesktop/app/desktop/src/view/main/header/HeaderView.js.tpl.default
+++ b/packages/ext-build-generate-app/ext-templates/application/moderndesktop/app/desktop/src/view/main/header/HeaderView.js.tpl.default
@@ -1,20 +1,21 @@
Ext.define('{appName}.view.main.header.HeaderView', {
- extend: 'Ext.Toolbar',
- xtype: 'headerview',
- cls: 'headerview',
- items: [
- {
- xtype: 'container',
- cls: 'headerviewtext',
- bind: { html: '\u007Bheading}' }
- },
- '->',
- {
- xtype: 'button',
- ui: 'headerbutton',
- reference: 'detailtoggle',
- handler: 'onHeaderViewDetailToggle',
- iconCls: 'x-fa fa-arrow-left'
- }
- ]
+ extend: 'Ext.Toolbar',
+ xtype: 'headerview',
+ cls: 'headerview',
+ viewModel: {},
+ items: [
+ {
+ xtype: 'container',
+ cls: 'headerviewtext',
+ bind: { html: '\u007Bheading}' }
+ },
+ '->',
+ {
+ xtype: 'button',
+ ui: 'headerbutton',
+ reference: 'detailtoggle',
+ handler: 'onHeaderViewDetailToggle',
+ iconCls: 'x-fa fa-arrow-left'
+ }
+ ]
});
diff --git a/packages/ext-build-generate-app/ext-templates/application/moderndesktop/app/desktop/src/view/personnel/PersonnelViewController.js.tpl.default b/packages/ext-build-generate-app/ext-templates/application/moderndesktop/app/desktop/src/view/personnel/PersonnelViewController.js.tpl.default
index 5da05af..6def3d5 100644
--- a/packages/ext-build-generate-app/ext-templates/application/moderndesktop/app/desktop/src/view/personnel/PersonnelViewController.js.tpl.default
+++ b/packages/ext-build-generate-app/ext-templates/application/moderndesktop/app/desktop/src/view/personnel/PersonnelViewController.js.tpl.default
@@ -1,14 +1,23 @@
Ext.define('{appName}.view.personnel.PersonnelViewController', {
- extend: 'Ext.app.ViewController',
- alias: 'controller.personnelviewcontroller',
+ extend: 'Ext.app.ViewController',
+ alias: 'controller.personnelviewcontroller',
onItemSelected: function (sender, record) {
- Ext.Msg.confirm('Confirm', 'Are you sure?', 'onConfirm', this);
+ var users = [
+ { firstName: "John", lastName: "Doe", age: 28, gender: "male" },
+ { firstName: "Jane", lastName: "Doe", age: 5, gender: "female" },
+ { firstName: "Jim", lastName: "Carrey", age: 54, gender: "male" },
+ { firstName: "Kate", lastName: "Winslet", age: 40, gender: "female" }
+ ];
+ var user = Ext._.find(users, { lastName: "Doe", gender: "male" });
+
+ Ext.Msg.confirm('Confirm', 'Are you sure? ' + user.age + ' years old', 'onConfirm', this);
+// Ext.Msg.confirm('Confirm', 'Are you sure?', 'onConfirm', this);
},
- onConfirm: function (choice) {
- if (choice === 'yes') {
- //
- }
- }
+ onConfirm: function (choice) {
+ if (choice === 'yes') {
+ //
+ }
+ }
});
diff --git a/packages/ext-build-generate-app/ext-templates/application/moderndesktop/index.js b/packages/ext-build-generate-app/ext-templates/application/moderndesktop/index.js
deleted file mode 100644
index a500dfc..0000000
--- a/packages/ext-build-generate-app/ext-templates/application/moderndesktop/index.js
+++ /dev/null
@@ -1 +0,0 @@
-//placeholder for webpack build
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/moderndesktop/index.js.tpl.default b/packages/ext-build-generate-app/ext-templates/application/moderndesktop/index.js.tpl.default
new file mode 100644
index 0000000..647e475
--- /dev/null
+++ b/packages/ext-build-generate-app/ext-templates/application/moderndesktop/index.js.tpl.default
@@ -0,0 +1,4 @@
+//this file exists so the webpack build process will succeed
+ Ext.onReady(function() {
+ Ext._ = require('lodash');
+ });
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/moderndesktop/workspace.json.tpl.default b/packages/ext-build-generate-app/ext-templates/application/moderndesktop/workspace.json.tpl.default
index e9d798a..e0f5b0a 100644
--- a/packages/ext-build-generate-app/ext-templates/application/moderndesktop/workspace.json.tpl.default
+++ b/packages/ext-build-generate-app/ext-templates/application/moderndesktop/workspace.json.tpl.default
@@ -7,7 +7,7 @@
"dir": "$\u007Bworkspace.dir}/build"
},
"packages": {
- "dir": "$\u007Bworkspace.dir}/packages/local,{packages},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-treegrid,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-base,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-ios,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-material,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-aria,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neutral,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-classic,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-gray,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-triton,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-graphite,$\u007Bworkspace.dir}/node_modules/@sencha/ext-calendar,$\u007Bworkspace.dir}/node_modules/@sencha/ext-charts,$\u007Bworkspace.dir}/node_modules/@sencha/ext-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-exporter,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-ux",
+ "dir": "$\u007Bworkspace.dir}/packages/local,{packages},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-treegrid,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-base,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-ios,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-material,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-aria,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neutral,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-classic,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-gray,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-triton,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-graphite,$\u007Bworkspace.dir}/node_modules/@sencha/ext-calendar,$\u007Bworkspace.dir}/node_modules/@sencha/ext-charts,$\u007Bworkspace.dir}/node_modules/@sencha/ext-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-exporter,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-ux,$\u007Bworkspace.dir}/node_modules/@sencha/ext-font-ios",
"extract": "$\u007Bworkspace.dir}/packages/remote"
}
}
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/moderndesktopminimal/app/desktop/src/view/main/MainView.js.tpl.default b/packages/ext-build-generate-app/ext-templates/application/moderndesktopminimal/app/desktop/src/view/main/MainView.js.tpl.default
index f7bae0d..94149f3 100644
--- a/packages/ext-build-generate-app/ext-templates/application/moderndesktopminimal/app/desktop/src/view/main/MainView.js.tpl.default
+++ b/packages/ext-build-generate-app/ext-templates/application/moderndesktopminimal/app/desktop/src/view/main/MainView.js.tpl.default
@@ -8,7 +8,7 @@ Ext.define('{appName}.view.main.MainView', {
items: [
{
xtype: 'component',
- html: 'Quick Start Tutorial Here
'
+ html: 'Quick Start Tutorial Here
'
},
{
xtype: 'displayfield',
diff --git a/packages/ext-build-generate-app/ext-templates/application/moderndesktopminimal/index.js.tpl.default b/packages/ext-build-generate-app/ext-templates/application/moderndesktopminimal/index.js.tpl.default
new file mode 100644
index 0000000..c352a83
--- /dev/null
+++ b/packages/ext-build-generate-app/ext-templates/application/moderndesktopminimal/index.js.tpl.default
@@ -0,0 +1 @@
+//this file exists so the webpack build process will succeed
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/moderndesktopminimal/workspace.json.tpl.default b/packages/ext-build-generate-app/ext-templates/application/moderndesktopminimal/workspace.json.tpl.default
index e9d798a..e0f5b0a 100644
--- a/packages/ext-build-generate-app/ext-templates/application/moderndesktopminimal/workspace.json.tpl.default
+++ b/packages/ext-build-generate-app/ext-templates/application/moderndesktopminimal/workspace.json.tpl.default
@@ -7,7 +7,7 @@
"dir": "$\u007Bworkspace.dir}/build"
},
"packages": {
- "dir": "$\u007Bworkspace.dir}/packages/local,{packages},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-treegrid,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-base,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-ios,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-material,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-aria,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neutral,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-classic,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-gray,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-triton,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-graphite,$\u007Bworkspace.dir}/node_modules/@sencha/ext-calendar,$\u007Bworkspace.dir}/node_modules/@sencha/ext-charts,$\u007Bworkspace.dir}/node_modules/@sencha/ext-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-exporter,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-ux",
+ "dir": "$\u007Bworkspace.dir}/packages/local,{packages},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-treegrid,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-base,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-ios,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-material,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-aria,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neutral,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-classic,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-gray,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-triton,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-graphite,$\u007Bworkspace.dir}/node_modules/@sencha/ext-calendar,$\u007Bworkspace.dir}/node_modules/@sencha/ext-charts,$\u007Bworkspace.dir}/node_modules/@sencha/ext-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-exporter,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-ux,$\u007Bworkspace.dir}/node_modules/@sencha/ext-font-ios",
"extract": "$\u007Bworkspace.dir}/packages/remote"
}
}
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/universalclassicmodern/index.js.tpl.default b/packages/ext-build-generate-app/ext-templates/application/universalclassicmodern/index.js.tpl.default
new file mode 100644
index 0000000..c352a83
--- /dev/null
+++ b/packages/ext-build-generate-app/ext-templates/application/universalclassicmodern/index.js.tpl.default
@@ -0,0 +1 @@
+//this file exists so the webpack build process will succeed
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/universalclassicmodern/workspace.json.tpl.default b/packages/ext-build-generate-app/ext-templates/application/universalclassicmodern/workspace.json.tpl.default
index e9d798a..e0f5b0a 100644
--- a/packages/ext-build-generate-app/ext-templates/application/universalclassicmodern/workspace.json.tpl.default
+++ b/packages/ext-build-generate-app/ext-templates/application/universalclassicmodern/workspace.json.tpl.default
@@ -7,7 +7,7 @@
"dir": "$\u007Bworkspace.dir}/build"
},
"packages": {
- "dir": "$\u007Bworkspace.dir}/packages/local,{packages},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-treegrid,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-base,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-ios,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-material,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-aria,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neutral,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-classic,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-gray,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-triton,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-graphite,$\u007Bworkspace.dir}/node_modules/@sencha/ext-calendar,$\u007Bworkspace.dir}/node_modules/@sencha/ext-charts,$\u007Bworkspace.dir}/node_modules/@sencha/ext-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-exporter,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-ux",
+ "dir": "$\u007Bworkspace.dir}/packages/local,{packages},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-treegrid,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-base,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-ios,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-material,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-aria,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neutral,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-classic,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-gray,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-triton,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-graphite,$\u007Bworkspace.dir}/node_modules/@sencha/ext-calendar,$\u007Bworkspace.dir}/node_modules/@sencha/ext-charts,$\u007Bworkspace.dir}/node_modules/@sencha/ext-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-exporter,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-ux,$\u007Bworkspace.dir}/node_modules/@sencha/ext-font-ios",
"extract": "$\u007Bworkspace.dir}/packages/remote"
}
}
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/universalmodern/app/desktop/src/view/main/header/HeaderView.js.tpl.default b/packages/ext-build-generate-app/ext-templates/application/universalmodern/app/desktop/src/view/main/header/HeaderView.js.tpl.default
index 6b7718c..bc24825 100644
--- a/packages/ext-build-generate-app/ext-templates/application/universalmodern/app/desktop/src/view/main/header/HeaderView.js.tpl.default
+++ b/packages/ext-build-generate-app/ext-templates/application/universalmodern/app/desktop/src/view/main/header/HeaderView.js.tpl.default
@@ -1,20 +1,21 @@
Ext.define('{appName}.view.main.header.HeaderView', {
- extend: 'Ext.Toolbar',
- xtype: 'headerview',
- cls: 'headerview',
- items: [
- {
- xtype: 'container',
- cls: 'headerviewtext',
- bind: { html: '\u007Bheading}' }
- },
- '->',
- {
- xtype: 'button',
- ui: 'headerbutton',
- reference: 'detailtoggle',
- handler: 'onHeaderViewDetailToggle',
- iconCls: 'x-fa fa-arrow-left'
- }
- ]
-});
+ extend: 'Ext.Toolbar',
+ xtype: 'headerview',
+ cls: 'headerview',
+ viewModel: {},
+ items: [
+ {
+ xtype: 'container',
+ cls: 'headerviewtext',
+ bind: { html: '\u007Bheading}' }
+ },
+ '->',
+ {
+ xtype: 'button',
+ ui: 'headerbutton',
+ reference: 'detailtoggle',
+ handler: 'onHeaderViewDetailToggle',
+ iconCls: 'x-fa fa-arrow-left'
+ }
+ ]
+});
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/universalmodern/index.js b/packages/ext-build-generate-app/ext-templates/application/universalmodern/index.js
deleted file mode 100644
index a500dfc..0000000
--- a/packages/ext-build-generate-app/ext-templates/application/universalmodern/index.js
+++ /dev/null
@@ -1 +0,0 @@
-//placeholder for webpack build
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/universalmodern/index.js.tpl.default b/packages/ext-build-generate-app/ext-templates/application/universalmodern/index.js.tpl.default
new file mode 100644
index 0000000..c352a83
--- /dev/null
+++ b/packages/ext-build-generate-app/ext-templates/application/universalmodern/index.js.tpl.default
@@ -0,0 +1 @@
+//this file exists so the webpack build process will succeed
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/ext-templates/application/universalmodern/workspace.json.tpl.default b/packages/ext-build-generate-app/ext-templates/application/universalmodern/workspace.json.tpl.default
index e9d798a..e0f5b0a 100644
--- a/packages/ext-build-generate-app/ext-templates/application/universalmodern/workspace.json.tpl.default
+++ b/packages/ext-build-generate-app/ext-templates/application/universalmodern/workspace.json.tpl.default
@@ -7,7 +7,7 @@
"dir": "$\u007Bworkspace.dir}/build"
},
"packages": {
- "dir": "$\u007Bworkspace.dir}/packages/local,{packages},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-treegrid,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-base,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-ios,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-material,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-aria,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neutral,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-classic,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-gray,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-triton,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-graphite,$\u007Bworkspace.dir}/node_modules/@sencha/ext-calendar,$\u007Bworkspace.dir}/node_modules/@sencha/ext-charts,$\u007Bworkspace.dir}/node_modules/@sencha/ext-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-exporter,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-ux",
+ "dir": "$\u007Bworkspace.dir}/packages/local,{packages},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name},$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-treegrid,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-base,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-ios,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-material,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-aria,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neutral,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-classic,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-gray,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-crisp-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-neptune-touch,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-triton,$\u007Bworkspace.dir}/node_modules/@sencha/ext-$\u007Btoolkit.name}-theme-graphite,$\u007Bworkspace.dir}/node_modules/@sencha/ext-calendar,$\u007Bworkspace.dir}/node_modules/@sencha/ext-charts,$\u007Bworkspace.dir}/node_modules/@sencha/ext-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-exporter,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot,$\u007Bworkspace.dir}/node_modules/@sencha/ext-pivot-d3,$\u007Bworkspace.dir}/node_modules/@sencha/ext-ux,$\u007Bworkspace.dir}/node_modules/@sencha/ext-font-ios",
"extract": "$\u007Bworkspace.dir}/packages/remote"
}
}
\ No newline at end of file
diff --git a/packages/ext-build-generate-app/package.json b/packages/ext-build-generate-app/package.json
index 18ea755..a121695 100644
--- a/packages/ext-build-generate-app/package.json
+++ b/packages/ext-build-generate-app/package.json
@@ -1,6 +1,6 @@
{
"name": "@sencha/ext-build-generate-app",
- "version": "6.7.1",
+ "version": "7.0.0",
"description": "ext-build-generate-app - app generator for ext-gen and ext-build",
"main": "generateApp.js",
"dependencies": {
diff --git a/packages/ext-build/package.json b/packages/ext-build/package.json
index ea795b4..ae5c169 100644
--- a/packages/ext-build/package.json
+++ b/packages/ext-build/package.json
@@ -1,6 +1,6 @@
{
"name": "@sencha/ext-build",
- "version": "6.7.1",
+ "version": "7.0.0",
"description": "ext-build - CLI tool for Sencha Ext JS",
"bin": {
"ext-build": "bin/ext-build.js"
@@ -10,8 +10,8 @@
"loglevel": "silent"
},
"dependencies": {
- "@sencha/ext-build-generate-app": "~6.7.0",
- "@sencha/cmd": "~6.7.0",
+ "@sencha/ext-build-generate-app": "~7.0.0",
+ "@sencha/cmd": "~7.0.0",
"node-find-folder": "^0.1.32",
"chalk": "^2.4.2",
"child-process-promise": "^2.2.1",
diff --git a/packages/ext-build/readme.md b/packages/ext-build/readme.md
index 80011de..accbb49 100644
--- a/packages/ext-build/readme.md
+++ b/packages/ext-build/readme.md
@@ -16,9 +16,9 @@ npm install -g @sencha/ext-build
* eb
## Examples
-* ext-build generate app --sdk 'Ext/ext-6.7.0' --template 'universalmodern' MyApp ./MyApp
-* ext-build gen app -s 'Ext/ext-6.7.0' -t 'universalmodern' MyApp ./MyApp
-* eb g a -s 'Ext/ext-6.7.0' -t 'universalmodern' MyApp ./MyApp
+* ext-build generate app --sdk 'Ext/ext-7.0.0' --template 'universalmodern' MyApp ./MyApp
+* ext-build gen app -s 'Ext/ext-7.0.0' -t 'universalmodern' MyApp ./MyApp
+* eb g a -s 'Ext/ext-7.0.0' -t 'universalmodern' MyApp ./MyApp
* ext-build generate viewpackage settings
## Commands Available
@@ -38,4 +38,4 @@ npm install -g @sencha/ext-build
* --template -t (name of app template to use - only one currently - universalmodern)
## Comments
-* Tested with Ext JS Version 6.7.0
+* Tested with Ext JS Version 7.0.0
diff --git a/packages/ext-gen/ext-gen.js b/packages/ext-gen/ext-gen.js
index 64b56c8..d65bfc8 100755
--- a/packages/ext-gen/ext-gen.js
+++ b/packages/ext-gen/ext-gen.js
@@ -678,6 +678,8 @@ async function stepCreate() {
answers['license'] = config.license
answers['bugsURL'] = config.bugsURL
answers['homepageURL'] = config.homepageURL
+
+ console.dir(answers)
}
function displayDefaults() {
diff --git a/packages/ext-gen/install.js b/packages/ext-gen/install.js
index ba726f7..3bd6fc5 100644
--- a/packages/ext-gen/install.js
+++ b/packages/ext-gen/install.js
@@ -36,6 +36,7 @@ if (global.isCommunity) {
else {
classic = `ext-gen app --classictheme theme-graphite -n ClassicApp
ext-gen app --template universalclassicmodern --classictheme theme-graphite --moderntheme theme-material --name CoolUniversalApp
+ext-gen app --template classicdesktop --classictheme theme-gray --name GrayDesktopApp
ext-gen app --template classicdesktop --classictheme theme-graphite --name CoolDesktopApp\n`
}
var welcome = boldGreen(`Welcome to Sencha ExtGen v${version} ${edition} Edition - The Ext JS code generator`)
diff --git a/packages/ext-gen/package.json b/packages/ext-gen/package.json
index 59a60f3..191847f 100644
--- a/packages/ext-gen/package.json
+++ b/packages/ext-gen/package.json
@@ -1,6 +1,6 @@
{
"name": "@sencha/ext-gen",
- "version": "6.7.1",
+ "version": "7.0.0",
"description": "An Ext JS code generator",
"bin": {
"ext": "ext-gen.js",
@@ -18,8 +18,8 @@
},
"preferGlobal": true,
"dependencies": {
- "@sencha/ext-build-generate-app": "~6.7.0",
- "command-line-args": "^5.0.2",
+ "@sencha/ext-build-generate-app": "~7.0.0",
+ "command-line-args": "^5.1.0",
"comment-json": "^1.1.3",
"cross-spawn": "^6.0.5",
"chalk":"~2.4.2",
diff --git a/packages/ext-gen/templates.1/webpack.config.js.tpl.default b/packages/ext-gen/templates.1/webpack.config.js.tpl.default
deleted file mode 100644
index 465da5b..0000000
--- a/packages/ext-gen/templates.1/webpack.config.js.tpl.default
+++ /dev/null
@@ -1,105 +0,0 @@
-const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin');
-const path = require('path');
-const HtmlWebpackPlugin = require('html-webpack-plugin');
-const webpack = require('webpack');
-const portfinder = require('portfinder');
-
-module.exports = async 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 basehref = env.basehref || '/'
- var mode = isProd ? 'production': 'development'
-
- portfinder.basePort = (env && env.port) || 1962;
- return portfinder.getPortPromise().then(port => {
- const nodeEnv = env && env.prod ? 'production' : 'development'
- const isProd = nodeEnv === 'production'
- const plugins = [
- new HtmlWebpackPlugin({
- template: 'index.html',
- hash: true,
- inject: "body"
- }),
- new ExtWebpackPlugin({
- framework: 'extjs',
- port: port,
- emit: true,
- browser: browserprofile,
- treeshake: treeshake,
- watch: watchprofile,
- profile: buildprofile,
- environment: buildenvironment,
- verbose: buildverbose
- })
- ]
-// if (!isProd) {
-// plugins.push(
-// new webpack.HotModuleReplacementPlugin()
-// )
-// }
- return {
- performance: { hints: false },
- mode: mode,
- devtool: (mode === 'development') ? 'inline-source-map' : false,
- context: path.join(__dirname, './'),
- entry: {
- main: "./app.js"
- },
- output: {
- path: path.resolve(__dirname, './'),
- filename: '[name].js'
- },
- module: {
- rules: [
- {
- test: /.js$/,
- exclude: /node_modules/
- }
- ]
- },
- plugins: plugins,
- devServer: {
- contentBase: './',
- historyApiFallback: true,
- host: '0.0.0.0',
- hot: false,
- port,
- disableHostCheck: false,
- compress: isProd,
- inline: !isProd,
- stats: {
- entrypoints: false,
- assets: false,
- children: false,
- chunks: false,
- hash: false,
- modules: false,
- publicPath: false,
- timings: false,
- version: false,
- warnings: false,
- colors: {
- green: '[32m'
- }
- }
- }
- }
- });
-}
diff --git a/packages/ext-gen/templates.1/package.json.tpl.default b/packages/ext-gen/templates.2/package.json.tpl.default
similarity index 88%
rename from packages/ext-gen/templates.1/package.json.tpl.default
rename to packages/ext-gen/templates.2/package.json.tpl.default
index 42f00fa..859e769 100644
--- a/packages/ext-gen/templates.1/package.json.tpl.default
+++ b/packages/ext-gen/templates.2/package.json.tpl.default
@@ -7,7 +7,7 @@
"scripts": {
"clean": "rimraf build",
"start": "cross-env-shell npm run dev",
- "dev": "webpack-dev-server --env.environment=development",
+ "dev": "webpack-dev-server --env.verbose='no'",
"prod": "webpack-dev-server --env.environment=production",
"build": "npm run clean && cross-env webpack --env.environment=production",
"desktop": "webpack-dev-server --env.profile=desktop --env.environment=development",
@@ -44,16 +44,16 @@
},
"dependencies": {
- "@sencha/ext-modern": "~6.7.0",
- "@sencha/ext-modern-{modernTheme}": "~6.7.0",
- "@sencha/ext-classic": "~6.7.0",
- "@sencha/ext-classic-{classicTheme}": "~6.7.0",
- "@sencha/ext": "~6.7.0"
+ "@sencha/ext-modern": "~7.0.0",
+ "@sencha/ext-modern-{modernTheme}": "~7.0.0",
+ "@sencha/ext-classic": "~7.0.0",
+ "@sencha/ext-classic-{classicTheme}": "~7.0.0",
+ "@sencha/ext": "~7.0.0"
},
"devDependencies": {
- "@sencha/ext-webpack-plugin": "~6.7.0",
+ "@sencha/ext-webpack-plugin": "~7.0.0",
- "html-webpack-plugin": "^3.2.0",
+ "html-webpack-plugin": "^3.2.0",
"cross-env": "^5.2.0",
"portfinder": "^1.0.20",
diff --git a/packages/ext-gen/templates.2/webpack.config.js.tpl.default b/packages/ext-gen/templates.2/webpack.config.js.tpl.default
new file mode 100644
index 0000000..4d67e25
--- /dev/null
+++ b/packages/ext-gen/templates.2/webpack.config.js.tpl.default
@@ -0,0 +1,74 @@
+const path = require('path');
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin')
+const portfinder = require('portfinder')
+
+module.exports = function (env) {
+ 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')
+ if (environment == 'production') {
+ browser = 'no'
+ watch = 'no'
+ }
+ const isProd = environment === 'production'
+ const outputFolder = './'
+ portfinder.basePort = (env && env.port) || 1962
+ return portfinder.getPortPromise().then(port => {
+ const plugins = [
+ new HtmlWebpackPlugin({template: "index.html",hash: true,inject: "body"}),
+ new ExtWebpackPlugin({
+ framework: 'extjs',
+ toolkit: 'modern',
+ theme: 'theme-kitchensink',
+ emit: 'yes',
+ script: '',
+ port: port,
+ packages: [],
+ profile: profile,
+ environment: environment,
+ treeshake: treeshake,
+ browser: browser,
+ watch: watch,
+ verbose: verbose
+ })
+ ]
+ return {
+ mode: environment,
+ devtool: (environment === 'development') ? 'inline-source-map' : false,
+ context: path.join(__dirname, './'),
+ entry: './app.js',
+ output: {
+ path: path.join(__dirname, outputFolder),
+ filename: "[name].js"
+ //filename: "[name].[chunkhash:20].js"
+ },
+ plugins: plugins,
+ module: {
+ rules: [
+ { test: /\.(js)$/, exclude: /node_modules/ }
+ ]
+ },
+ performance: { hints: false },
+ stats: 'none',
+ optimization: { noEmitOnErrors: true },
+ node: false,
+ devServer: {
+ contentBase: outputFolder,
+ hot: !isProd,
+ historyApiFallback: true,
+ host: '0.0.0.0',
+ port: port,
+ disableHostCheck: false,
+ compress: isProd,
+ inline:!isProd,
+ stats: 'none'
+ }
+ }
+ })
+}
diff --git a/packages/ext-gen/templates/package.json.tpl.default b/packages/ext-gen/templates/package.json.tpl.default
index ee4d0b6..8192472 100644
--- a/packages/ext-gen/templates/package.json.tpl.default
+++ b/packages/ext-gen/templates/package.json.tpl.default
@@ -3,73 +3,65 @@
"product": "ext",
"version": "{version}",
"description": "{description}",
+ "repository": {
+ "type": "git",
+ "url": "{repositoryURL}"
+ },
+ "keywords": [{keywords}],
+ "author": "{authorName}",
+ "license": "{license}",
+ "bugs": {
+ "url": "{bugsURL}"
+ },
+ "homepage": "{homepageURL}",
"scripts": {
+ "start": "npm run dev:desktop",
"clean": "rimraf build",
- "start": "cross-env-shell npm run dev",
- "dev": "webpack-dev-server --env.verbose='no'",
- "prod": "webpack-dev-server --env.environment=production",
- "build": "npm run clean && cross-env webpack --env.environment=production",
- "desktop": "webpack-dev-server --env.profile=desktop --env.environment=development",
- "desktop-v": "webpack-dev-server --env.profile=desktop --env.environment=development",
- "build-desktop-testing": "npx sencha app build desktop testing",
- "build-desktop-production": "npx sencha app build desktop production",
- "phone": "webpack-dev-server --env.profile=phone --env.environment=development",
- "phone-v": "webpack-dev-server --env.profile=phone --env.environment=development",
- "all": "webpack-dev-server --env.profile=all --env.environment=development",
- "all-v": "webpack-dev-server --env.profile=all --env.environment=development",
- "build-phone-testing": "npx sencha app build phone testing",
- "build-phone-production": "npx sencha app build phone production",
- "createview": "cross-env-shell npx sencha generate viewpackage $npm_package_extbuild_defaultprofile $VIEW"
+ "dev:desktop": "webpack-dev-server --env.profile=desktop --env.browser=yes --env.verbose=no",
+ "dev:phone": "webpack-dev-server --env.profile=phone --env.browser=yes --env.verbose=no",
+ "build:desktop": "npm run clean && cross-env webpack --env.profile=desktop --env.environment=production --env.treeshake=yes",
+ "build:phone": "npm run clean && cross-env webpack --env.profile=phone --env.environment=production --env.treeshake=yes"
},
"scripts": {
+ "start": "npm run dev:desktop",
"clean": "rimraf build",
- "start": "cross-env-shell npm run dev",
- "dev": "webpack-dev-server --env.environment=development",
- "prod": "webpack-dev-server --env.environment=production --env.treeshake=true",
- "build": "cross-env-shell npm run clean && cross-env webpack --env.environment=production --env.treeshake=true",
- "desktop": "webpack-dev-server --env.profile=desktop --env.environment=development",
- "desktop-v": "webpack-dev-server --env.profile=desktop --env.environment=development",
- "build-desktop-testing": "npx sencha app build desktop testing",
- "build-desktop-production": "npx sencha app build desktop production",
- "createview": "cross-env-shell npx sencha generate viewpackage $npm_package_extbuild_defaultprofile $VIEW"
+ "dev:desktop": "webpack-dev-server --env.profile=desktop --env.browser=yes --env.verbose=no",
+ "build:desktop": "npm run clean && cross-env webpack --env.profile=desktop --env.environment=production --env.treeshake=yes"
},
- "extbuild": {
- "defaultprofile": "desktop",
- "defaultenvironment": "development",
- "defaultverbose": "no"
- },
"dependencies": {
- "@sencha/ext-modern": "~6.7.0",
- "@sencha/ext-modern-{modernTheme}": "~6.7.0",
- "@sencha/ext-classic": "~6.7.0",
- "@sencha/ext-classic-{classicTheme}": "~6.7.0",
- "@sencha/ext": "~6.7.0"
+ "@sencha/ext-modern": "~7.0.0",
+ "@sencha/ext-modern-{modernTheme}": "~7.0.0",
+ "@sencha/ext-classic": "~7.0.0",
+ "@sencha/ext-classic-{classicTheme}": "~7.0.0",
+ "@sencha/ext": "~7.0.0"
},
"devDependencies": {
"@sencha/ext-webpack-plugin": "~7.0.0",
- "html-webpack-plugin": "^3.2.0",
+ "html-webpack-plugin": "^3.2.0",
+ "base-href-webpack-plugin": "~2.0.0",
+
"cross-env": "^5.2.0",
"portfinder": "^1.0.20",
- "webpack": "^4.29.1",
+ "webpack": "^4.29.6",
"webpack-cli": "^3.2.3",
- "webpack-dev-server": "^3.1.14"
- },
- "repository": {
- "type": "git",
- "url": "{repositoryURL}"
- },
- "keywords": [{keywords}],
- "author": "{authorName}",
- "license": "{license}",
- "bugs": {
- "url": "{bugsURL}"
- },
- "homepage": "{homepageURL}"
+ "webpack-dev-server": "^3.2.1",
+
+ "@babel/cli": "^7.1.0",
+ "@babel/core": "^7.1.0",
+ "@babel/plugin-proposal-object-rest-spread": "^7.0.0",
+ "@babel/plugin-transform-async-to-generator": "^7.1.0",
+ "@babel/plugin-transform-regenerator": "^7.0.0",
+ "@babel/preset-env": "^7.1.0",
+ "babel-plugin-add-module-exports": "^1.0.0",
+ "babel-loader": "^8.0.5",
+
+ "lodash": "^4.17.11"
+ }
}
diff --git a/packages/ext-gen/templates/webpack.config.js.tpl.default b/packages/ext-gen/templates/webpack.config.js.tpl.default
index 4d67e25..e93878d 100644
--- a/packages/ext-gen/templates/webpack.config.js.tpl.default
+++ b/packages/ext-gen/templates/webpack.config.js.tpl.default
@@ -1,35 +1,52 @@
const path = require('path');
-const HtmlWebpackPlugin = require('html-webpack-plugin')
-const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin')
-const portfinder = require('portfinder')
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+const { BaseHrefWebpackPlugin } = require('base-href-webpack-plugin');
+const ExtWebpackPlugin = require('@sencha/ext-webpack-plugin');
+const portfinder = require('portfinder');
-module.exports = function (env) {
+module.exports = async function (env) {
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')
- if (environment == 'production') {
- browser = 'no'
- watch = 'no'
+ //******* */
+ var framework = get('framework', 'extjs')
+ var contextFolder = get('contextFolder', './')
+ var entryFile = get('entryFile', './index.js')
+ var outputFolder = get('outputFolder', './')
+ const rules =[
+ //{ test: /\.(js|jsx)$/, exclude: /node_modules/ }
+ { test: /\.(js)$/, use: ['babel-loader'] }
+ ]
+ const resolve = {
}
+ //******* */
+
+ var toolkit = get('toolkit', 'modern')
+ var theme = get('theme', 'theme-material')
+ var packages = get('packages', ['treegrid'])
+ var script = get('script', '')
+ var emit = get('emit', 'yes')
+ 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 = './'
portfinder.basePort = (env && env.port) || 1962
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: 'extjs',
- toolkit: 'modern',
- theme: 'theme-kitchensink',
- emit: 'yes',
- script: '',
+ framework: framework,
+ toolkit: toolkit,
+ theme: theme,
+ packages: packages,
+ script: script,
+ emit: emit,
port: port,
- packages: [],
profile: profile,
environment: environment,
treeshake: treeshake,
@@ -38,22 +55,21 @@ module.exports = function (env) {
verbose: verbose
})
]
+
return {
mode: environment,
devtool: (environment === 'development') ? 'inline-source-map' : false,
- context: path.join(__dirname, './'),
- entry: './app.js',
+ context: path.join(__dirname, contextFolder),
+ entry: entryFile,
output: {
path: path.join(__dirname, outputFolder),
filename: "[name].js"
- //filename: "[name].[chunkhash:20].js"
},
plugins: plugins,
module: {
- rules: [
- { test: /\.(js)$/, exclude: /node_modules/ }
- ]
+ rules: rules
},
+ resolve: resolve,
performance: { hints: false },
stats: 'none',
optimization: { noEmitOnErrors: true },
diff --git a/packages/ext-webpack-plugin-orig/dist/angularUtil.js b/packages/ext-webpack-plugin-orig/dist/angularUtil.js
deleted file mode 100644
index 7574f02..0000000
--- a/packages/ext-webpack-plugin-orig/dist/angularUtil.js
+++ /dev/null
@@ -1,344 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.getValidateOptions = getValidateOptions;
-exports.getDefaultOptions = getDefaultOptions;
-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() {
- return {
- watchStarted: false,
- firstTime: true,
- firstCompile: true,
- browserCount: 0,
- manifest: null,
- extPath: 'ext-angular',
- pluginErrors: [],
- deps: [],
- usedExtComponents: [],
- rebuild: true
- };
-}
-
-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();
-
- if (theValue.indexOf('doctype html') == -1) {
- var type = {
- xtype: xtype
- };
- let config = JSON.stringify(type);
- statements.push(`Ext.create(${config})`);
- }
- }
-
- i += end;
- }
- }
- }
- }
- }
- }
- });
- return statements;
- } catch (e) {
- console.log(e);
- compilation.errors.push('extractFromSource: ' + e);
- return [];
- }
-}
-
-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`);
-
- 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) {
- 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) {
- console.log(e);
- return [];
- }
-}
-
-function _getAllComponents(vars, options) {
- const log = require('./pluginUtil').log;
-
- const logv = require('./pluginUtil').logv;
-
- logv(options, 'FUNCTION _getAllComponents');
-
- 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);
- return [];
- }
-}
-
-function _writeFilesToProdFolder(vars, options) {
- const log = require('./pluginUtil').log;
-
- const logv = require('./pluginUtil').logv;
-
- logv(options, 'FUNCTION _writeFilesToProdFolder');
-
- try {
- 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\":\"';
- 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) {
- console.log(e);
- return [];
- }
-}
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hbmd1bGFyVXRpbC5qcyJdLCJuYW1lcyI6WyJnZXRWYWxpZGF0ZU9wdGlvbnMiLCJnZXREZWZhdWx0T3B0aW9ucyIsInBvcnQiLCJlbWl0IiwiYnJvd3NlciIsIndhdGNoIiwicHJvZmlsZSIsInRyZWVzaGFrZSIsImVudmlyb25tZW50IiwidmVyYm9zZSIsInRvb2xraXQiLCJwYWNrYWdlcyIsImdldERlZmF1bHRWYXJzIiwid2F0Y2hTdGFydGVkIiwiZmlyc3RUaW1lIiwiZmlyc3RDb21waWxlIiwiYnJvd3NlckNvdW50IiwibWFuaWZlc3QiLCJleHRQYXRoIiwicGx1Z2luRXJyb3JzIiwiZGVwcyIsInVzZWRFeHRDb21wb25lbnRzIiwicmVidWlsZCIsInRvWHR5cGUiLCJzdHIiLCJ0b0xvd2VyQ2FzZSIsInJlcGxhY2UiLCJleHRyYWN0RnJvbVNvdXJjZSIsIm1vZHVsZSIsIm9wdGlvbnMiLCJjb21waWxhdGlvbiIsImV4dENvbXBvbmVudHMiLCJqcyIsIl9zb3VyY2UiLCJfdmFsdWUiLCJsb2d2IiwicmVxdWlyZSIsInN0YXRlbWVudHMiLCJnZW5lcmF0ZSIsImRlZmF1bHQiLCJwYXJzZSIsInRyYXZlcnNlIiwiYXN0IiwicGx1Z2lucyIsInNvdXJjZVR5cGUiLCJwcmUiLCJub2RlIiwidHlwZSIsImNhbGxlZSIsIm9iamVjdCIsIm5hbWUiLCJwdXNoIiwiY29kZSIsInZhbHVlIiwiaSIsImxlbmd0aCIsImNoYXJBdCIsInN1YnN0ciIsImluZGV4T2YiLCJzdGFydCIsInN1YnN0cmluZyIsInNwYWNlRW5kIiwibmV3bGluZUVuZCIsInRhZ0VuZCIsImVuZCIsIk1hdGgiLCJtaW4iLCJ4dHlwZSIsImluY2x1ZGVzIiwidGhlVmFsdWUiLCJjb25maWciLCJKU09OIiwic3RyaW5naWZ5IiwiZSIsImNvbnNvbGUiLCJsb2ciLCJlcnJvcnMiLCJjaGFuZ2VJdCIsIm8iLCJwYXRoIiwiZnN4Iiwid2hlcmVQYXRoIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJjd2QiLCJ3aGVyZSIsInJlYWRGaWxlU3luYyIsInRvU3RyaW5nIiwibmV3SnMiLCJmcm9tIiwidG8iLCJ3cml0ZUZpbGVTeW5jIiwiX3RvUHJvZCIsInZhcnMiLCJmcyIsIm1rZGlycCIsInBhdGhFeHRBbmd1bGFyUHJvZCIsImV4aXN0c1N5bmMiLCJzeW5jIiwidCIsImV4dEFuZ3VsYXJNb2R1bGUiLCJfdG9EZXYiLCJfZ2V0QWxsQ29tcG9uZW50cyIsInBhY2thZ2VMaWJQYXRoIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImZvckVhY2giLCJmaWxlTmFtZSIsIl93cml0ZUZpbGVzVG9Qcm9kRm9sZGVyIiwicGF0aFRvRXh0QW5ndWxhclByb2QiLCJzdHJpbmciLCJpbmRleCIsIlNldCIsIndyaXRlVG9QYXRoV3JpdHRlbiIsIm1vZHVsZVZhcnMiLCJpbXBvcnRzIiwiZXhwb3J0cyIsImRlY2xhcmF0aW9ucyIsImNhcGNsYXNzbmFtZSIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJjbGFzc0ZpbGUiLCJjb250ZW50cyIsImJhc2VDb250ZW50Il0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxrQkFBVCxHQUE4QjtBQUNuQyxTQUFPO0FBQ0wsWUFBUSxRQURIO0FBRUwsa0JBQWM7QUFDWixtQkFBZTtBQUFDLGdCQUFRLENBQUUsUUFBRjtBQUFULE9BREg7QUFFWixpQkFBZTtBQUFDLGdCQUFRLENBQUUsUUFBRjtBQUFULE9BRkg7QUFHWixjQUFlO0FBQUMsZ0JBQVEsQ0FBRSxTQUFGO0FBQVQsT0FISDtBQUlaLGNBQWU7QUFBQyxnQkFBUSxDQUFFLFNBQUY7QUFBVCxPQUpIO0FBS1osaUJBQWU7QUFBQyxnQkFBUSxDQUFFLFNBQUY7QUFBVCxPQUxIO0FBTVosZUFBZTtBQUFDLGdCQUFRLENBQUUsUUFBRjtBQUFULE9BTkg7QUFPWixpQkFBZTtBQUFDLGdCQUFRLENBQUUsUUFBRjtBQUFULE9BUEg7QUFRWixxQkFBZTtBQUFDLGdCQUFRLENBQUUsUUFBRjtBQUFULE9B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VSxDQUFDRyxZQUQ3QyxDQUFSOztBQUdBckMsTUFBQUEsR0FBRyxDQUFDVyxhQUFKLENBQW1CLEdBQUVrQixvQkFBcUIsd0JBQTFDLEVBQW1FVixDQUFuRSxFQUFzRSxPQUF0RSxFQUErRSxNQUFJO0FBQUM7QUFBTyxPQUEzRjtBQUNEOztBQUVELFVBQU13QixXQUFXLEdBQUczQyxHQUFHLENBQUNNLFlBQUosQ0FBa0IsR0FBRWlCLGNBQWUsVUFBbkMsRUFBOENoQixRQUE5QyxFQUFwQjtBQUNBUCxJQUFBQSxHQUFHLENBQUNXLGFBQUosQ0FBbUIsR0FBRWtCLG9CQUFxQixVQUExQyxFQUFxRGMsV0FBckQsRUFBa0UsT0FBbEUsRUFBMkUsTUFBSTtBQUFDO0FBQU8sS0FBdkY7QUFFRCxHQTVDRCxDQTZDQSxPQUFPbEQsQ0FBUCxFQUFVO0FBQ1JDLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZRixDQUFaO0FBQ0EsV0FBTyxFQUFQO0FBQ0Q7QUFDRiIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0ZU9wdGlvbnMoKSB7XG4gIHJldHVybiB7XG4gICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXG4gICAgXCJwcm9wZXJ0aWVzXCI6IHtcbiAgICAgIFwiZnJhbWV3b3JrXCI6ICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcInRvb2xraXRcIjogICAgIHtcInR5cGVcIjogWyBcInN0cmluZ1wiIF19LFxuICAgICAgXCJwb3J0XCI6ICAgICAgICB7XCJ0eXBlXCI6IFsgXCJpbnRlZ2VyXCIgXX0sXG4gICAgICBcImVtaXRcIjogICAgICAgIHtcInR5cGVcIjogWyBcImJvb2xlYW5cIiBdfSxcbiAgICAgIFwiYnJvd3NlclwiOiAgICAge1widHlwZVwiOiBbIFwiYm9vbGVhblwiIF19LFxuICAgICAgXCJ3YXRjaFwiOiAgICAgICB7XCJ0eXBlXCI6IFsgXCJzdHJpbmdcIiBdfSxcbiAgICAgIFwicHJvZmlsZVwiOiAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcImVudmlyb25tZW50XCI6IHtcInR5cGVcIjogWyBcInN0cmluZ1wiIF19LFxuICAgICAgXCJ2ZXJib3NlXCI6ICAgICB7XCJ0eXBlXCI6IFsgXCJzdHJpbmdcIiBdfSxcbiAgICAgIFwidGhlbWVcIjogICAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcInRyZWVzaGFrZVwiOiB7XCJ0eXBlXCI6IFsgXCJib29sZWFuXCIgXX0sXG4gICAgICBcInBhY2thZ2VzXCI6ICAgIHtcInR5cGVcIjogWyBcInN0cmluZ1wiLCBcImFycmF5XCIgXX1cbiAgICB9LFxuICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnMoKSB7XG4gIHJldHVybiB7XG4gICAgcG9ydDogMTk2MixcbiAgICBlbWl0OiB0cnVlLFxuICAgIGJyb3dzZXI6IHRydWUsXG4gICAgd2F0Y2g6ICd5ZXMnLFxuICAgIHByb2ZpbGU6ICcnLCBcbiAgICB0cmVlc2hha2U6IGZhbHNlLFxuICAgIGVudmlyb25tZW50OiAnZGV2ZWxvcG1lbnQnLCBcbiAgICB2ZXJib3NlOiAnbm8nLFxuICAgIHRvb2xraXQ6ICdtb2Rlcm4nLFxuICAgIHBhY2thZ2VzOiBudWxsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRWYXJzKCkge1xuICByZXR1cm4ge1xuICAgIHdhdGNoU3RhcnRlZCA6IGZhbHNlLFxuICAgIGZpcnN0VGltZSA6IHRydWUsXG4gICAgZmlyc3RDb21waWxlOiB0cnVlLFxuICAgIGJyb3dzZXJDb3VudCA6IDAsXG4gICAgbWFuaWZlc3Q6IG51bGwsXG4gICAgZXh0UGF0aDogJ2V4dC1hbmd1bGFyJyxcbiAgICBwbHVnaW5FcnJvcnM6IFtdLFxuICAgIGRlcHM6IFtdLFxuICAgIHVzZWRFeHRDb21wb25lbnRzOiBbXSxcbiAgICByZWJ1aWxkOiB0cnVlXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9YdHlwZShzdHIpIHtcbiAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgJy0nKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEZyb21Tb3VyY2UobW9kdWxlLCBvcHRpb25zLCBjb21waWxhdGlvbiwgZXh0Q29tcG9uZW50cykge1xuICB0cnkge1xuICAgIHZhciBqcyA9IG1vZHVsZS5fc291cmNlLl92YWx1ZVxuICAgIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gICAgLy9sb2d2KG9wdGlvbnMsJ0hPT0sgc3VjY2VlZE1vZHVsZSwgRlVOQ1RJT04gZXh0cmFjdEZyb21Tb3VyY2U6ICcgKyBtb2R1bGUucmVzb3VyY2UpXG5cbiAgICB2YXIgc3RhdGVtZW50cyA9IFtdXG5cbiAgICB2YXIgZ2VuZXJhdGUgPSByZXF1aXJlKFwiQGJhYmVsL2dlbmVyYXRvclwiKS5kZWZhdWx0XG4gICAgdmFyIHBhcnNlID0gcmVxdWlyZShcImJhYnlsb25cIikucGFyc2VcbiAgICB2YXIgdHJhdmVyc2UgPSByZXF1aXJlKFwiYXN0LXRyYXZlcnNlXCIpXG5cbiAgICB2YXIgYXN0ID0gcGFyc2UoanMsIHtcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgJ3R5cGVzY3JpcHQnLFxuICAgICAgICAnZmxvdycsXG4gICAgICAgICdkb0V4cHJlc3Npb25zJyxcbiAgICAgICAgJ29iamVjdFJlc3RTcHJlYWQnLFxuICAgICAgICAnY2xhc3NQcm9wZXJ0aWVzJyxcbiAgICAgICAgJ2V4cG9ydERlZmF1bHRGcm9tJyxcbiAgICAgICAgJ2V4cG9ydEV4dGVuc2lvbnMnLFxuICAgICAgICAnYXN5bmNHZW5lcmF0b3JzJyxcbiAgICAgICAgJ2Z1bmN0aW9uQmluZCcsXG4gICAgICAgICdmdW5jdGlvblNlbnQnLFxuICAgICAgICAnZHluYW1pY0ltcG9ydCdcbiAgICAgIF0sXG4gICAgICBzb3VyY2VUeXBlOiAnbW9kdWxlJ1xuICAgIH0pXG5cbiAgICB0cmF2ZXJzZShhc3QsIHtcbiAgICAgIHByZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJyAmJiBub2RlLmNhbGxlZSAmJiBub2RlLmNhbGxlZS5vYmplY3QgJiYgbm9kZS5jYWxsZWUub2JqZWN0Lm5hbWUgPT09ICdFeHQnKSB7XG4gICAgICAgICAgc3RhdGVtZW50cy5wdXNoKGdlbmVyYXRlKG5vZGUpLmNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgaWYobm9kZS50eXBlID09PSAnU3RyaW5nTGl0ZXJhbCcpIHtcbiAgICAgICAgICBsZXQgY29kZSA9IG5vZGUudmFsdWVcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChjb2RlLmNoYXJBdChpKSA9PSAnPCcpIHtcbiAgICAgICAgICAgICAgaWYgKGNvZGUuc3Vic3RyKGksIDQpID09ICc8IS0tJykge1xuICAgICAgICAgICAgICAgIGkgKz0gNFxuICAgICAgICAgICAgICAgIGkgKz0gY29kZS5zdWJzdHIoaSkuaW5kZXhPZignLS0+JykgKyAzXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZS5jaGFyQXQoaSsxKSAhPT0gJy8nKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gY29kZS5zdWJzdHJpbmcoaSlcbiAgICAgICAgICAgICAgICB2YXIgc3BhY2VFbmQgPSBzdGFydC5pbmRleE9mKCcgJylcbiAgICAgICAgICAgICAgICB2YXIgbmV3bGluZUVuZCA9IHN0YXJ0LmluZGV4T2YoJ1xcbicpXG4gICAgICAgICAgICAgICAgdmFyIHRhZ0VuZCA9IHN0YXJ0LmluZGV4T2YoJz4nKVxuICAgICAgICAgICAgICAgIHZhciBlbmQgPSBNYXRoLm1pbihzcGFjZUVuZCwgbmV3bGluZUVuZCwgdGFnRW5kKVxuICAgICAgICAgICAgICAgIGlmIChlbmQgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgdmFyIHh0eXBlID0gdG9YdHlwZShzdGFydC5zdWJzdHJpbmcoMSwgZW5kKSlcbiAgICAgICAgICAgICAgICAgIGlmKGV4dENvbXBvbmVudHMuaW5jbHVkZXMoeHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0aGVWYWx1ZSA9IG5vZGUudmFsdWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhlVmFsdWUuaW5kZXhPZignZG9jdHlwZSBodG1sJykgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IHt4dHlwZTogeHR5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IEpTT04uc3RyaW5naWZ5KHR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50cy5wdXNoKGBFeHQuY3JlYXRlKCR7Y29uZmlnfSlgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpICs9IGVuZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gc3RhdGVtZW50c1xuICB9XG4gIGNhdGNoKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKVxuICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCdleHRyYWN0RnJvbVNvdXJjZTogJyArIGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hhbmdlSXQobykge1xuICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG4gIGNvbnN0IGZzeCA9IHJlcXVpcmUoJ2ZzLWV4dHJhJylcbiAgY29uc3Qgd2hlcmVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIG8ud2hlcmUpXG4gIHZhciBqcyA9IGZzeC5yZWFkRmlsZVN5bmMod2hlcmVQYXRoKS50b1N0cmluZygpXG4gIHZhciBuZXdKcyA9IGpzLnJlcGxhY2Uoby5mcm9tLG8udG8pO1xuICBmc3gud3JpdGVGaWxlU3luYyh3aGVyZVBhdGgsIG5ld0pzLCAndXRmLTgnLCAoKT0+e3JldHVybn0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfdG9Qcm9kKHZhcnMsIG9wdGlvbnMpIHtcbiAgY29uc3QgbG9nID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9nXG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucywnRlVOQ1RJT04gX3RvUHJvZCcpXG4gIHRyeSB7XG4gICAgY29uc3QgZnN4ID0gcmVxdWlyZSgnZnMtZXh0cmEnKVxuICAgIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKVxuICAgIGNvbnN0IG1rZGlycCA9IHJlcXVpcmUoJ21rZGlycCcpXG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuXG4gICAgY29uc3QgcGF0aEV4dEFuZ3VsYXJQcm9kID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGBzcmMvYXBwL2V4dC1hbmd1bGFyLXByb2RgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aEV4dEFuZ3VsYXJQcm9kKSkge1xuICAgICAgbWtkaXJwLnN5bmMocGF0aEV4dEFuZ3VsYXJQcm9kKVxuICAgICAgY29uc3QgdCA9IHJlcXVpcmUoJy4vYXJ0aWZhY3RzJykuZXh0QW5ndWxhck1vZHVsZSgnJywgJycsICcnKVxuICAgICAgZnN4LndyaXRlRmlsZVN5bmMoYCR7cGF0aEV4dEFuZ3VsYXJQcm9kfS9leHQtYW5ndWxhci5tb2R1bGUudHNgLCB0LCAndXRmLTgnLCAoKSA9PiB7XG4gICAgICAgIHJldHVyblxuICAgICAgfSlcbiAgICB9XG5cbiAgICB2YXIgbyA9IHt9XG4gICAgby53aGVyZSA9ICdzcmMvYXBwL2FwcC5tb2R1bGUudHMnXG4gICAgby5mcm9tID0gYGltcG9ydCB7IEV4dEFuZ3VsYXJNb2R1bGUgfSBmcm9tICdAc2VuY2hhL2V4dC1hbmd1bGFyJ2BcbiAgICBvLnRvID0gYGltcG9ydCB7IEV4dEFuZ3VsYXJNb2R1bGUgfSBmcm9tICcuL2V4dC1hbmd1bGFyLXByb2QvZXh0LWFuZ3VsYXIubW9kdWxlJ2BcbiAgICBjaGFuZ2VJdChvKVxuXG4gICAgbyA9IHt9XG4gICAgby53aGVyZSA9ICdzcmMvbWFpbi50cydcbiAgICBvLmZyb20gPSBgYm9vdHN0cmFwTW9kdWxlKCBBcHBNb2R1bGUgKTtgXG4gICAgby50byA9IGBlbmFibGVQcm9kTW9kZSgpO2Jvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO2BcbiAgICBjaGFuZ2VJdChvKVxuICB9XG4gIGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coZSlcbiAgICByZXR1cm4gW11cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX3RvRGV2KHZhcnMsIG9wdGlvbnMpIHtcbiAgY29uc3QgbG9nID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9nXG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucywnRlVOQ1RJT04gX3RvUHJvZCcpXG4gIHRyeSB7XG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuICAgIGNvbnN0IHBhdGhFeHRBbmd1bGFyUHJvZCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBgc3JjL2FwcC9leHQtYW5ndWxhci1wcm9kYCk7XG4gICAgcmVxdWlyZSgncmltcmFmJykuc3luYyhwYXRoRXh0QW5ndWxhclByb2QpO1xuXG4gICAgdmFyIG8gPSB7fVxuICAgIG8ud2hlcmUgPSAnc3JjL2FwcC9hcHAubW9kdWxlLnRzJ1xuICAgIG8uZnJvbSA9IGBpbXBvcnQgeyBFeHRBbmd1bGFyTW9kdWxlIH0gZnJvbSAnLi9leHQtYW5ndWxhci1wcm9kL2V4dC1hbmd1bGFyLm1vZHVsZSdgXG4gICAgby50byA9IGBpbXBvcnQgeyBFeHRBbmd1bGFyTW9kdWxlIH0gZnJvbSAnQHNlbmNoYS9leHQtYW5ndWxhcidgXG4gICAgY2hhbmdlSXQobylcblxuICAgIG8gPSB7fVxuICAgIG8ud2hlcmUgPSAnc3JjL21haW4udHMnXG4gICAgby5mcm9tID0gYGVuYWJsZVByb2RNb2RlKCk7Ym9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSk7YFxuICAgIG8udG8gPSBgYm9vdHN0cmFwTW9kdWxlKCBBcHBNb2R1bGUgKTtgXG4gICAgY2hhbmdlSXQobylcbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gX2dldEFsbENvbXBvbmVudHModmFycywgb3B0aW9ucykge1xuICBjb25zdCBsb2cgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2dcbiAgY29uc3QgbG9ndiA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3ZcbiAgbG9ndihvcHRpb25zLCdGVU5DVElPTiBfZ2V0QWxsQ29tcG9uZW50cycpXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG4gICAgY29uc3QgZnN4ID0gcmVxdWlyZSgnZnMtZXh0cmEnKVxuXG4gICAgdmFyIGV4dENvbXBvbmVudHMgPSBbXVxuICAgIGNvbnN0IHBhY2thZ2VMaWJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtYW5ndWxhci9zcmMvbGliJylcbiAgICB2YXIgZmlsZXMgPSBmc3gucmVhZGRpclN5bmMocGFja2FnZUxpYlBhdGgpXG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZU5hbWUpID0+IHtcbiAgICAgIGlmIChmaWxlTmFtZSAmJiBmaWxlTmFtZS5zdWJzdHIoMCwgNCkgPT0gJ2V4dC0nKSB7XG4gICAgICAgIHZhciBlbmQgPSBmaWxlTmFtZS5zdWJzdHIoNCkuaW5kZXhPZignLmNvbXBvbmVudCcpXG4gICAgICAgIGlmIChlbmQgPj0gMCkge1xuICAgICAgICAgIGV4dENvbXBvbmVudHMucHVzaChmaWxlTmFtZS5zdWJzdHJpbmcoNCwgZW5kICsgNCkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHRDb21wb25lbnRzXG5cbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF93cml0ZUZpbGVzVG9Qcm9kRm9sZGVyKHZhcnMsIG9wdGlvbnMpIHtcbiAgY29uc3QgbG9nID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9nXG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucywnRlVOQ1RJT04gX3dyaXRlRmlsZXNUb1Byb2RGb2xkZXInKVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuICAgIGNvbnN0IGZzeCA9IHJlcXVpcmUoJ2ZzLWV4dHJhJylcblxuICAgIGNvbnN0IHBhY2thZ2VMaWJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtYW5ndWxhci9zcmMvbGliJylcbiAgICBjb25zdCBwYXRoVG9FeHRBbmd1bGFyUHJvZCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBgc3JjL2FwcC9leHQtYW5ndWxhci1wcm9kYClcbiAgICBjb25zdCBzdHJpbmcgPSAnRXh0LmNyZWF0ZSh7XFxcInh0eXBlXFxcIjpcXFwiJ1xuXG4gICAgdmFycy5kZXBzLmZvckVhY2goY29kZSA9PiB7XG4gICAgICB2YXIgaW5kZXggPSBjb2RlLmluZGV4T2Yoc3RyaW5nKVxuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgY29kZSA9IGNvZGUuc3Vic3RyaW5nKGluZGV4ICsgc3RyaW5nLmxlbmd0aClcbiAgICAgICAgdmFyIGVuZCA9IGNvZGUuaW5kZXhPZignXFxcIicpXG4gICAgICAgIHZhcnMudXNlZEV4dENvbXBvbmVudHMucHVzaChjb2RlLnN1YnN0cigwLCBlbmQpKVxuICAgICAgfVxuICAgIH0pXG4gICAgdmFycy51c2VkRXh0Q29tcG9uZW50cyA9IFsuLi5uZXcgU2V0KHZhcnMudXNlZEV4dENvbXBvbmVudHMpXVxuXG4gICAgdmFyIHdyaXRlVG9QYXRoV3JpdHRlbiA9IGZhbHNlXG4gICAgdmFyIG1vZHVsZVZhcnMgPSB7XG4gICAgICBpbXBvcnRzOiAnJyxcbiAgICAgIGV4cG9ydHM6ICcnLFxuICAgICAgZGVjbGFyYXRpb25zOiAnJ1xuICAgIH1cbiAgICB2YXJzLnVzZWRFeHRDb21wb25lbnRzLmZvckVhY2goeHR5cGUgPT4ge1xuICAgICAgdmFyIGNhcGNsYXNzbmFtZSA9IHh0eXBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgeHR5cGUucmVwbGFjZSgvLS9nLCBcIl9cIikuc2xpY2UoMSlcbiAgICAgIG1vZHVsZVZhcnMuaW1wb3J0cyA9IG1vZHVsZVZhcnMuaW1wb3J0cyArIGBpbXBvcnQgeyBFeHQke2NhcGNsYXNzbmFtZX1Db21wb25lbnQgfSBmcm9tICcuL2V4dC0ke3h0eXBlfS5jb21wb25lbnQnO1xcbmBcbiAgICAgIG1vZHVsZVZhcnMuZXhwb3J0cyA9IG1vZHVsZVZhcnMuZXhwb3J0cyArIGAgICAgRXh0JHtjYXBjbGFzc25hbWV9Q29tcG9uZW50LFxcbmBcbiAgICAgIG1vZHVsZVZhcnMuZGVjbGFyYXRpb25zID0gbW9kdWxlVmFycy5kZWNsYXJhdGlvbnMgKyBgICAgIEV4dCR7Y2FwY2xhc3NuYW1lfUNvbXBvbmVudCxcXG5gXG4gICAgICB2YXIgY2xhc3NGaWxlID0gYGV4dC0ke3h0eXBlfS5jb21wb25lbnQudHNgXG4gICAgICBjb25zdCBjb250ZW50cyA9IGZzeC5yZWFkRmlsZVN5bmMoYCR7cGFja2FnZUxpYlBhdGh9LyR7Y2xhc3NGaWxlfWApLnRvU3RyaW5nKClcbiAgICAgIGZzeC53cml0ZUZpbGVTeW5jKGAke3BhdGhUb0V4dEFuZ3VsYXJQcm9kfS8ke2NsYXNzRmlsZX1gLCBjb250ZW50cywgJ3V0Zi04JywgKCk9PntyZXR1cm59KVxuICAgICAgd3JpdGVUb1BhdGhXcml0dGVuID0gdHJ1ZVxuICAgIH0pXG4gICAgaWYgKHdyaXRlVG9QYXRoV3JpdHRlbikge1xuICAgICAgdmFyIHQgPSByZXF1aXJlKCcuL2FydGlmYWN0cycpLmV4dEFuZ3VsYXJNb2R1bGUoXG4gICAgICAgIG1vZHVsZVZhcnMuaW1wb3J0cywgbW9kdWxlVmFycy5leHBvcnRzLCBtb2R1bGVWYXJzLmRlY2xhcmF0aW9uc1xuICAgICAgKVxuICAgICAgZnN4LndyaXRlRmlsZVN5bmMoYCR7cGF0aFRvRXh0QW5ndWxhclByb2R9L2V4dC1hbmd1bGFyLm1vZHVsZS50c2AsIHQsICd1dGYtOCcsICgpPT57cmV0dXJufSlcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlQ29udGVudCA9IGZzeC5yZWFkRmlsZVN5bmMoYCR7cGFja2FnZUxpYlBhdGh9L2Jhc2UudHNgKS50b1N0cmluZygpXG4gICAgZnN4LndyaXRlRmlsZVN5bmMoYCR7cGF0aFRvRXh0QW5ndWxhclByb2R9L2Jhc2UudHNgLCBiYXNlQ29udGVudCwgJ3V0Zi04JywgKCk9PntyZXR1cm59KVxuXG4gIH1cbiAgY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKVxuICAgIHJldHVybiBbXVxuICB9XG59Il19
\ No newline at end of file
diff --git a/packages/ext-webpack-plugin-orig/dist/artifacts.js b/packages/ext-webpack-plugin-orig/dist/artifacts.js
deleted file mode 100644
index ff22ff7..0000000
--- a/packages/ext-webpack-plugin-orig/dist/artifacts.js
+++ /dev/null
@@ -1,241 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.createAppJson = createAppJson;
-exports.createJSDOMEnvironment = createJSDOMEnvironment;
-exports.createWorkspaceJson = createWorkspaceJson;
-exports.extAngularModule = exports.buildXML = void 0;
-
-const buildXML = function (compress, options, output) {
- const logv = require('./pluginUtil').logv;
-
- logv(options, 'FUNCTION buildXML');
- let compression = '';
-
- if (compress) {
- compression = `
- then
- fs
- minify
- -yui
- -from=ext.js
- -to=ext.js
- `;
- }
-
- return `
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-`.trim();
-};
-
-exports.buildXML = buildXML;
-
-function createAppJson(theme, packages, toolkit, options, output) {
- const logv = require('./pluginUtil').logv;
-
- logv(options, 'FUNCTION createAppJson');
-
- const fs = require('fs');
-
- var isWindows = typeof process != 'undefined' && typeof process.platform != 'undefined' && !!process.platform.match(/^win/);
- var pathDifference = output.substring(process.cwd().length);
- var numberOfPaths = pathDifference.split(isWindows ? "\\" : "/").length - 1;
- var nodeModulePath = '';
-
- for (var i = 0; i < numberOfPaths; i++) {
- nodeModulePath += "../";
- }
-
- const config = {
- framework: "ext",
- toolkit,
- requires: packages,
- "overrides": ["overrides", "jsdom-environment.js"],
- "packages": {
- "dir": [nodeModulePath + "node_modules/@sencha", "packages"]
- },
- output: {
- base: '.',
- resources: {
- path: './resources',
- shared: "./resources"
- }
- } // if theme is local add it as an additional package dir
-
- };
-
- if (fs.existsSync(theme)) {
- const path = require('path');
-
- const cjson = require('cjson');
-
- const packageInfo = cjson.load(path.join(theme, 'package.json'));
- config.theme = packageInfo.name;
- config.packages.dir.push(path.resolve(theme));
- } else {
- config.theme = theme;
- }
-
- return JSON.stringify(config, null, 2);
-}
-
-function createJSDOMEnvironment(options, output) {
- const logv = require('./pluginUtil').logv;
-
- logv(options, 'FUNCTION createJSDOMEnvironment');
- return 'window.Ext = Ext;';
-}
-
-function createWorkspaceJson(options, output) {
- const logv = require('./pluginUtil').logv;
-
- logv(options, 'FUNCTION createWorkspaceJson');
- var isWindows = typeof process != 'undefined' && typeof process.platform != 'undefined' && !!process.platform.match(/^win/);
- var pathDifference = output.substring(process.cwd().length);
- var numberOfPaths = pathDifference.split(isWindows ? "\\" : "/").length - 1;
- var nodeModulePath = '';
-
- for (var i = 0; i < numberOfPaths; i++) {
- nodeModulePath += "../";
- }
-
- logv(options, 'isWindows: ' + isWindows);
- logv(options, 'output: ' + output);
- logv(options, 'pathDifference: ' + pathDifference);
- logv(options, 'numberOfPaths: ' + numberOfPaths);
- logv(options, 'nodeModulePath: ' + nodeModulePath);
- const config = {
- "frameworks": {
- "ext": nodeModulePath + "node_modules/@sencha/ext"
- },
- "build": {
- "dir": "${workspace.dir}/" + nodeModulePath + "build"
- },
- "packages": {
- "dir": ["${workspace.dir}/" + nodeModulePath + "ext-" + options.framework + "/packages/local", "${workspace.dir}/" + nodeModulePath + "ext-" + options.framework + "/packages", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-base", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-ios", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-material", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-aria", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-neutral", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-classic", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-gray", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-crisp", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-crisp-touch", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-neptune", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-neptune-touch", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-triton", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-graphite"],
- "extract": "${workspace.dir}/" + nodeModulePath + "packages/remote"
- }
- };
- return JSON.stringify(config, null, 2);
-}
-
-const extAngularModule = function (imports, exports, declarations) {
- return `
- import { NgModule } from '@angular/core';
- ${imports}
- @NgModule({
- imports: [
- ],
- declarations: [
- ${declarations} ],
- exports: [
- ${exports} ]
- })
- export class ExtAngularModule { }
- `;
-};
-
-exports.extAngularModule = extAngularModule;
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hcnRpZmFjdHMuanMiXSwibmFtZXMiOlsiYnVpbGRYTUwiLCJjb21wcmVzcyIsIm9wdGlvbnMiLCJvdXRwdXQiLCJsb2d2IiwicmVxdWlyZSIsImNvbXByZXNzaW9uIiwidHJpbSIsImNyZWF0ZUFwcEpzb24iLCJ0aGVtZSIsInBhY2thZ2VzIiwidG9vbGtpdCIsImZzIiwiaXNXaW5kb3dzIiwicHJvY2VzcyIsInBsYXRmb3JtIiwibWF0Y2giLCJwYXRoRGlmZmVyZW5jZSIsInN1YnN0cmluZyIsImN3ZCIsImxlbmd0aCIsIm51bWJlck9mUGF0aHMiLCJzcGxpdCIsIm5vZGVNb2R1bGVQYXRoIiwiaSIsImNvbmZpZyIsImZyYW1ld29yayIsInJlcXVpcmVzIiwiYmFzZSIsInJlc291cmNlcyIsInBhdGgiLCJzaGFyZWQiLCJleGlzdHNTeW5jIiwiY2pzb24iLCJwYWNrYWdlSW5mbyIsImxvYWQiLCJqb2luIiwibmFtZSIsImRpciIsInB1c2giLCJyZXNvbHZlIiwiSlNPTiIsInN0cmluZ2lmeSIsImNyZWF0ZUpTRE9NRW52aXJvbm1lbnQiLCJjcmVhdGVXb3Jrc3BhY2VKc29uIiwiZXh0QW5ndWxhck1vZHVsZSIsImltcG9ydHMiLCJleHBvcnRzIiwiZGVjbGFyYXRpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQU8sTUFBTUEsUUFBUSxHQUFHLFVBQVNDLFFBQVQsRUFBbUJDLE9BQW5CLEVBQTRCQyxNQUE1QixFQUFvQztBQUMxRCxRQUFNQyxJQUFJLEdBQUdDLE9BQU8sQ0FBQyxjQUFELENBQVAsQ0FBd0JELElBQXJDOztBQUNBQSxFQUFBQSxJQUFJLENBQUNGLE9BQUQsRUFBUyxtQkFBVCxDQUFKO0FBRUEsTUFBSUksV0FBVyxHQUFHLEVBQWxCOztBQUVBLE1BQUlMLFFBQUosRUFBYztBQUNaSyxJQUFBQSxXQUFXLEdBQUk7Ozs7Ozs7S0FBZjtBQVFEOztBQUVDLFNBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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dEIsR0FBdUM7QUFwQnhDO0FBUEMsR0FBZjtBQThCQSxTQUFPa0IsSUFBSSxDQUFDQyxTQUFMLENBQWVqQixNQUFmLEVBQXVCLElBQXZCLEVBQTZCLENBQTdCLENBQVA7QUFDRDs7QUFFTSxNQUFNb0IsZ0JBQWdCLEdBQUcsVUFBU0MsT0FBVCxFQUFrQkMsT0FBbEIsRUFBMkJDLFlBQTNCLEVBQXlDO0FBQ3ZFLFNBQVE7O0lBRU5GLE9BQVE7Ozs7O0lBS1JFLFlBQWE7O0lBRWJELE9BQVE7OztHQVRWO0FBYUQsQ0FkTSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBidWlsZFhNTCA9IGZ1bmN0aW9uKGNvbXByZXNzLCBvcHRpb25zLCBvdXRwdXQpIHtcbiAgY29uc3QgbG9ndiA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3ZcbiAgbG9ndihvcHRpb25zLCdGVU5DVElPTiBidWlsZFhNTCcpXG4gIFxuICBsZXQgY29tcHJlc3Npb24gPSAnJ1xuXG4gIGlmIChjb21wcmVzcykge1xuICAgIGNvbXByZXNzaW9uID0gYFxuICAgICAgdGhlbiBcbiAgICAgIGZzIFxuICAgICAgbWluaWZ5IFxuICAgICAgICAteXVpIFxuICAgICAgICAtZnJvbT1leHQuanMgXG4gICAgICAgIC10bz1leHQuanNcbiAgICBgO1xuICB9XG5cbiAgICByZXR1cm4gYDxwcm9qZWN0IG5hbWU9XCJzaW1wbGUtYnVpbGRcIiBiYXNlZGlyPVwiLlwiPlxuICA8IS0tICBpbnRlcm5hbGx5LCB3YXRjaCBjYWxscyB0aGUgaW5pdCB0YXJnZXQsIHNvIG5lZWQgdG8gaGF2ZSBvbmUgaGVyZSAtLT5cbiAgPHRhcmdldCBuYW1lPVwiaW5pdFwiLz5cbiAgPHRhcmdldCBuYW1lPVwiaW5pdC1jbWRcIj5cbiAgICA8dGFza2RlZiAgcmVzb3VyY2U9XCJjb20vc2VuY2hhL2FudC9hbnRsaWIueG1sXCJcbiAgICAgICAgICAgICAgY2xhc3NwYXRoPVwiXFwke2NtZC5kaXJ9L3NlbmNoYS5qYXJcIlxuICAgICAgICAgICAgICBsb2FkZXJyZWY9XCJzZW5jaGFsb2FkZXJcIi8+XG4gICAgPHgtZXh0ZW5kLWNsYXNzcGF0aD5cbiAgICAgICAgPGphciBwYXRoPVwiXFwke2NtZC5kaXJ9L3NlbmNoYS5qYXJcIi8+XG4gICAgPC94LWV4dGVuZC1jbGFzc3BhdGg+XG4gICAgPHgtc2VuY2hhLWluaXQgcHJlZml4PVwiXCIvPlxuICAgIDx4LWNvbXBpbGUgcmVmaWQ9XCJ0aGVDb21waWxlclwiXG4gICAgICAgICAgICAgICAgICAgICAgZGlyPVwiXFwke2Jhc2VkaXJ9XCJcbiAgICAgICAgICAgICAgICAgICAgICBpbml0T25seT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRBbGw9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDwhW0NEQVRBW1xuICAgICAgICAgICAgICAtY2xhc3NwYXRoPVxcJHtiYXNlZGlyfS9tYW5pZmVzdC5qc1xuICAgICAgICAgICAgICBsb2FkLWFwcFxuICAgICAgICAgICAgICAgICAgLXRlbXA9XFwke2Jhc2VkaXJ9L3RlbXBcbiAgICAgICAgICAgICAgICAgIC10YWc9QXBwXG4gICAgICAgIF1dPlxuICAgICAgPC94LWNvbXBpbGU+XG4gIDwvdGFyZ2V0PlxuICA8dGFyZ2V0IG5hbWU9XCJyZWJ1aWxkXCI+XG4gICAgPHgtY29tcGlsZSByZWZpZD1cInRoZUNvbXBpbGVyXCJcbiAgICAgICAgICAgICAgZGlyPVwiXFwke2Jhc2VkaXJ9XCJcbiAgICAgICAgICAgICAgaW5oZXJpdEFsbD1cInRydWVcIj5cbiAgICAgIDwhW0NEQVRBW1xuICAgICAgLS1kZWJ1Z1xuICAgICAgZXhjbHVkZVxuICAgICAgLWFsbFxuICAgICAgYW5kXG4gICAgICBpbmNsdWRlXG4gICAgICAtZj1Cb290LmpzXG4gICAgICBhbmRcbiAgICAgIGNvbmNhdGVuYXRlXG4gICAgICAgICAgZXh0LmpzXG4gICAgICBhbmRcbiAgICAgIGV4Y2x1ZGVcbiAgICAgIC1hbGxcbiAgICAgIGFuZFxuICAgICAgIyBpbmNsdWRlIHRoZW1lIG92ZXJyaWRlc1xuICAgICAgaW5jbHVkZVxuICAgICAgICAtclxuICAgICAgICAtdGFnPW92ZXJyaWRlc1xuICAgICAgYW5kXG4gICAgICAjIGluY2x1ZGUgYWxsIGpzIGZpbGVzIG5lZWRlZCBmb3IgbWFuaWZlc3QuanNcbiAgICAgIGluY2x1ZGVcbiAgICAgICAgICAtclxuICAgICAgICAgIC1mPW1hbmlmZXN0LmpzXG4gICAgICBhbmRcbiAgICAgICMgZXhjbHVkZSB0aGUgZ2VuZXJhdGVkIG1hbmlmZXN0IGZpbGUgaXRzZWxmLFxuICAgICAgIyBzaW5jZSB3ZSBkb24ndCB3YW50IHRoZSBnZW5lcmF0ZWQgYnVuZGxlIGZpbGUgdG8gY3JlYXRlIGFueSBjb21wb25lbnRzXG4gICAgICBleGNsdWRlXG4gICAgICAtZj1tYW5pZmVzdC5qc1xuICAgICAgYW5kXG4gICAgICBjb25jYXRlbmF0ZVxuICAgICAgK2FwcGVuZFxuICAgICAgICAgIGV4dC5qc1xuICAgICAgYW5kXG4gICAgICBzY3NzXG4gICAgICAgICAgLWFwcE5hbWU9QXBwXG4gICAgICAgICAgLWltYWdlU2VhcmNoUGF0aD1yZXNvdXJjZXNcbiAgICAgICAgICAtdGhlbWVOYW1lPXRyaXRvblxuICAgICAgICAgIC1yZXNvdXJjZU1hcEJhc2U9LlxuICAgICAgICAgIC1vdXRwdXQ9ZXh0LnNjc3NcbiAgICAgIGFuZFxuICAgICAgcmVzb3VyY2VzXG4gICAgICAgICAgLWV4Y2x1ZGVzPS1hbGwqLmNzc1xuICAgICAgICAgIC1vdXQ9cmVzb3VyY2VzXG4gICAgICBhbmRcbiAgICAgIHJlc291cmNlc1xuICAgICAgICAgIC1tb2RlbD10cnVlXG4gICAgICAgICAgLW91dD1yZXNvdXJjZXNcbiAgICAgIF1dPlxuICAgIDwveC1jb21waWxlPlxuICA8L3RhcmdldD5cbiAgPHRhcmdldCBuYW1lPVwiYnVpbGRcIiBkZXBlbmRzPVwiaW5pdC1jbWQscmVidWlsZFwiPlxuICAgIDx4LXNlbmNoYS1jb21tYW5kIGRpcj1cIlxcJHtiYXNlZGlyfVwiPlxuICAgICAgPCFbQ0RBVEFbXG4gICAgICBmYXNoaW9uXG4gICAgICAgICAgLXB3ZD0uXG4gICAgICAgICAgLXNwbGl0PTQwOTVcbiAgICAgICAgICAke2NvbXByZXNzID8gJy1jb21wcmVzcycgOiAnJ31cbiAgICAgICAgICAgICAgZXh0LnNjc3NcbiAgICAgICAgICBleHQuY3NzXG4gICAgICAke2NvbXByZXNzaW9ufVxuICAgICAgXV0+XG4gICAgPC94LXNlbmNoYS1jb21tYW5kPlxuICA8L3RhcmdldD5cbiAgPHRhcmdldCBuYW1lPVwid2F0Y2hcIiBkZXBlbmRzPVwiaW5pdC1jbWQsYnVpbGRcIj5cbiAgICA8eC1mYXNoaW9uLXdhdGNoXG4gICAgICByZWZOYW1lPVwiZmFzaGlvbi13YXRjaFwiXG4gICAgICBpbnB1dEZpbGU9XCJleHQuc2Nzc1wiXG4gICAgICBvdXRwdXRGaWxlPVwiZXh0LmNzc1wiXG4gICAgICBzcGxpdD1cIjQwOTVcIlxuICAgICAgY29tcHJlc3M9XCIke2NvbXByZXNzID8gJ3RydWUnIDogJ2ZhbHNlJ31cIlxuICAgICAgY29uZmlnRmlsZT1cImFwcC5qc29uXCJcbiAgICAgIGZvcms9XCJ0cnVlXCIvPlxuICAgIDx4LXdhdGNoIGNvbXBpbGVyUmVmPVwidGhlQ29tcGlsZXJcIiB0YXJnZXRzPVwicmVidWlsZFwiLz5cbiAgPC90YXJnZXQ+XG48L3Byb2plY3Q+XG5gLnRyaW0oKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBwSnNvbiggdGhlbWUsIHBhY2thZ2VzLCB0b29sa2l0LCBvcHRpb25zLCBvdXRwdXQgKSB7XG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucywnRlVOQ1RJT04gY3JlYXRlQXBwSnNvbicpXG5cbiAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpXG5cbiAgdmFyIGlzV2luZG93cyA9IHR5cGVvZiBwcm9jZXNzICE9ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9jZXNzLnBsYXRmb3JtICE9ICd1bmRlZmluZWQnICYmICEhcHJvY2Vzcy5wbGF0Zm9ybS5tYXRjaCgvXndpbi8pO1xuICB2YXIgcGF0aERpZmZlcmVuY2UgPSBvdXRwdXQuc3Vic3RyaW5nKHByb2Nlc3MuY3dkKCkubGVuZ3RoKVxuICB2YXIgbnVtYmVyT2ZQYXRocyA9IHBhdGhEaWZmZXJlbmNlLnNwbGl0KGlzV2luZG93cyA/IFwiXFxcXFwiIDogXCIvXCIpLmxlbmd0aCAtIDE7XG4gIHZhciBub2RlTW9kdWxlUGF0aCA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtYmVyT2ZQYXRoczsgaSsrKSB7IFxuICAgIG5vZGVNb2R1bGVQYXRoICs9IFwiLi4vXCJcbiAgfVxuXG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICBmcmFtZXdvcms6IFwiZXh0XCIsXG4gICAgdG9vbGtpdCxcbiAgICByZXF1aXJlczogcGFja2FnZXMsXG4gICAgXCJvdmVycmlkZXNcIjogW1xuICAgICAgXCJvdmVycmlkZXNcIixcbiAgICAgIFwianNkb20tZW52aXJvbm1lbnQuanNcIlxuICAgIF0sXG4gICAgXCJwYWNrYWdlc1wiOiB7XG4gICAgICBcImRpclwiOiBbXG4gICAgICAgIG5vZGVNb2R1bGVQYXRoICsgXCJub2RlX21vZHVsZXMvQHNlbmNoYVwiLFxuICAgICAgICBcInBhY2thZ2VzXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIG91dHB1dDoge1xuICAgICAgYmFzZTogJy4nLFxuICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgIHBhdGg6ICcuL3Jlc291cmNlcycsXG4gICAgICAgIHNoYXJlZDogXCIuL3Jlc291cmNlc1wiXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlbWUgaXMgbG9jYWwgYWRkIGl0IGFzIGFuIGFkZGl0aW9uYWwgcGFja2FnZSBkaXJcbiAgaWYgKGZzLmV4aXN0c1N5bmModGhlbWUpKSB7XG4gICAgICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG4gICAgICBjb25zdCBjanNvbiA9IHJlcXVpcmUoJ2Nqc29uJylcbiAgICAgIGNvbnN0IHBhY2thZ2VJbmZvID0gY2pzb24ubG9hZChwYXRoLmpvaW4odGhlbWUsICdwYWNrYWdlLmpzb24nKSk7XG4gICAgICBjb25maWcudGhlbWUgPSBwYWNrYWdlSW5mby5uYW1lO1xuICAgICAgY29uZmlnLnBhY2thZ2VzLmRpci5wdXNoKHBhdGgucmVzb2x2ZSh0aGVtZSkpO1xuICB9IGVsc2Uge1xuICAgICAgY29uZmlnLnRoZW1lID0gdGhlbWU7XG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUpTRE9NRW52aXJvbm1lbnQob3B0aW9ucywgb3V0cHV0KSB7XG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucywnRlVOQ1RJT04gY3JlYXRlSlNET01FbnZpcm9ubWVudCcpXG5cbiAgcmV0dXJuICd3aW5kb3cuRXh0ID0gRXh0Oydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdvcmtzcGFjZUpzb24ob3B0aW9ucywgb3V0cHV0KSB7XG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucywnRlVOQ1RJT04gY3JlYXRlV29ya3NwYWNlSnNvbicpXG5cbiAgdmFyIGlzV2luZG93cyA9IHR5cGVvZiBwcm9jZXNzICE9ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9jZXNzLnBsYXRmb3JtICE9ICd1bmRlZmluZWQnICYmICEhcHJvY2Vzcy5wbGF0Zm9ybS5tYXRjaCgvXndpbi8pO1xuICB2YXIgcGF0aERpZmZlcmVuY2UgPSBvdXRwdXQuc3Vic3RyaW5nKHByb2Nlc3MuY3dkKCkubGVuZ3RoKVxuICB2YXIgbnVtYmVyT2ZQYXRocyA9IHBhdGhEaWZmZXJlbmNlLnNwbGl0KGlzV2luZG93cyA/IFwiXFxcXFwiIDogXCIvXCIpLmxlbmd0aCAtIDE7XG4gIHZhciBub2RlTW9kdWxlUGF0aCA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtYmVyT2ZQYXRoczsgaSsrKSB7IFxuICAgIG5vZGVNb2R1bGVQYXRoICs9IFwiLi4vXCJcbiAgfVxuXG4gIGxvZ3Yob3B0aW9ucywnaXNXaW5kb3dzOiAnICsgaXNXaW5kb3dzKVxuICBsb2d2KG9wdGlvbnMsJ291dHB1dDogJyArIG91dHB1dClcbiAgbG9ndihvcHRpb25zLCdwYXRoRGlmZmVyZW5jZTogJyArIHBhdGhEaWZmZXJlbmNlKVxuICBsb2d2KG9wdGlvbnMsJ251bWJlck9mUGF0aHM6ICcgKyBudW1iZXJPZlBhdGhzKVxuICBsb2d2KG9wdGlvbnMsJ25vZGVNb2R1bGVQYXRoOiAnICsgbm9kZU1vZHVsZVBhdGgpXG5cbiAgY29uc3QgY29uZmlnID0ge1xuICAgIFwiZnJhbWV3b3Jrc1wiOiB7XG4gICAgICBcImV4dFwiOiBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0XCJcbiAgICB9LFxuICAgIFwiYnVpbGRcIjoge1xuICAgICAgXCJkaXJcIjogXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcImJ1aWxkXCJcbiAgICB9LFxuICAgIFwicGFja2FnZXNcIjoge1xuICAgICAgXCJkaXJcIjogW1xuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwiZXh0LVwiICsgb3B0aW9ucy5mcmFtZXdvcmsgKyBcIi9wYWNrYWdlcy9sb2NhbFwiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwiZXh0LVwiICsgb3B0aW9ucy5mcmFtZXdvcmsgKyBcIi9wYWNrYWdlc1wiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGFcIixcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC0ke3Rvb2xraXQubmFtZX1cIixcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC0ke3Rvb2xraXQubmFtZX0tdGhlbWUtYmFzZVwiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LSR7dG9vbGtpdC5uYW1lfS10aGVtZS1pb3NcIixcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC0ke3Rvb2xraXQubmFtZX0tdGhlbWUtbWF0ZXJpYWxcIixcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC0ke3Rvb2xraXQubmFtZX0tdGhlbWUtYXJpYVwiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LSR7dG9vbGtpdC5uYW1lfS10aGVtZS1uZXV0cmFsXCIsXG4gICAgICAgIFwiJHt3b3Jrc3BhY2UuZGlyfS9cIiArIG5vZGVNb2R1bGVQYXRoICsgXCJub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtJHt0b29sa2l0Lm5hbWV9LXRoZW1lLWNsYXNzaWNcIixcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC0ke3Rvb2xraXQubmFtZX0tdGhlbWUtZ3JheVwiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LSR7dG9vbGtpdC5uYW1lfS10aGVtZS1jcmlzcFwiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LSR7dG9vbGtpdC5uYW1lfS10aGVtZS1jcmlzcC10b3VjaFwiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LSR7dG9vbGtpdC5uYW1lfS10aGVtZS1uZXB0dW5lXCIsXG4gICAgICAgIFwiJHt3b3Jrc3BhY2UuZGlyfS9cIiArIG5vZGVNb2R1bGVQYXRoICsgXCJub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtJHt0b29sa2l0Lm5hbWV9LXRoZW1lLW5lcHR1bmUtdG91Y2hcIixcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC0ke3Rvb2xraXQubmFtZX0tdGhlbWUtdHJpdG9uXCIsXG4gICAgICAgIFwiJHt3b3Jrc3BhY2UuZGlyfS9cIiArIG5vZGVNb2R1bGVQYXRoICsgXCJub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtJHt0b29sa2l0Lm5hbWV9LXRoZW1lLWdyYXBoaXRlXCJcbiAgICAgIF0sXG4gICAgICBcImV4dHJhY3RcIjogXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcInBhY2thZ2VzL3JlbW90ZVwiXG4gICAgfVxuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpXG59XG5cbmV4cG9ydCBjb25zdCBleHRBbmd1bGFyTW9kdWxlID0gZnVuY3Rpb24oaW1wb3J0cywgZXhwb3J0cywgZGVjbGFyYXRpb25zKSB7XG4gIHJldHVybiBgXG4gIGltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gICR7aW1wb3J0c31cbiAgQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbXG4gICAgXSxcbiAgICBkZWNsYXJhdGlvbnM6IFtcbiAgJHtkZWNsYXJhdGlvbnN9ICBdLFxuICAgIGV4cG9ydHM6IFtcbiAgJHtleHBvcnRzfSAgXVxuICB9KVxuICBleHBvcnQgY2xhc3MgRXh0QW5ndWxhck1vZHVsZSB7IH1cbiAgYFxufVxuIl19
\ No newline at end of file
diff --git a/packages/ext-webpack-plugin-orig/dist/extjsUtil.js b/packages/ext-webpack-plugin-orig/dist/extjsUtil.js
deleted file mode 100644
index 97fb0af..0000000
--- a/packages/ext-webpack-plugin-orig/dist/extjsUtil.js
+++ /dev/null
@@ -1,232 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.getValidateOptions = getValidateOptions;
-exports.getDefaultOptions = getDefaultOptions;
-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() {
- return {
- watchStarted: false,
- firstTime: true,
- browserCount: 0,
- cwd: process.cwd(),
- extPath: '.',
- pluginErrors: [],
- lastNumFiles: 0,
- lastMilliseconds: 0,
- lastMillisecondsAppJson: 0,
- files: ['./app.json'],
- dirs: ['./app', './packages']
- };
-}
-
-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);
- });
- }
- } catch (e) {
- console.log(e);
- compilation.errors.push('_afterCompile: ' + e);
- }
-}
-
-function _getFileAndContextDeps(compilation, files, dirs, cwd, options) {
- require('./pluginUtil').logv(options, 'FUNCTION _getFileAndContextDeps');
-
- const uniq = require('lodash.uniq');
-
- const isGlob = require('is-glob');
-
- const {
- fileDependencies,
- contextDependencies
- } = compilation;
- const isWebpack4 = compilation.hooks;
- let fds = isWebpack4 ? [...fileDependencies] : fileDependencies;
- let cds = isWebpack4 ? [...contextDependencies] : contextDependencies;
-
- if (files.length > 0) {
- files.forEach(pattern => {
- let f = pattern;
-
- if (isGlob(pattern)) {
- f = glob.sync(pattern, {
- cwd,
- dot: true,
- absolute: true
- });
- }
-
- fds = fds.concat(f);
- });
- fds = uniq(fds);
- }
-
- if (dirs.length > 0) {
- cds = uniq(cds.concat(dirs));
- }
-
- return {
- fileDependencies: fds,
- contextDependencies: cds
- };
-}
-
-function _prepareForBuild(app, vars, options, output, compilation) {
- try {
- const log = require('./pluginUtil').log;
-
- const logv = require('./pluginUtil').logv;
-
- logv(options, '_prepareForBuild');
-
- const fs = require('fs');
-
- const recursiveReadSync = require('recursive-readdir-sync');
-
- var watchedFiles = [];
-
- 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(), '');
-
- if (bundleDir.trim() == '') {
- bundleDir = './';
- }
-
- 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
diff --git a/packages/ext-webpack-plugin-orig/dist/index.js b/packages/ext-webpack-plugin-orig/dist/index.js
deleted file mode 100644
index 703d232..0000000
--- a/packages/ext-webpack-plugin-orig/dist/index.js
+++ /dev/null
@@ -1,82 +0,0 @@
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.default = void 0;
-
-require('@babel/polyfill');
-
-const v = require('./pluginUtil').logv;
-
-class ExtWebpackPlugin {
- constructor(options) {
- this.plugin = require(`./pluginUtil`)._constructor(options);
- }
-
- apply(compiler) {
- const vars = this.plugin.vars;
- const options = this.plugin.options;
- v(options, 'FUNCTION apply');
-
- if (!compiler.hooks) {
- console.log('not webpack 4');
- return;
- }
-
- compiler.hooks.thisCompilation.tap(`ext-this-compilation`, compilation => {
- v(options, 'HOOK thisCompilation');
-
- if (vars.pluginErrors.length > 0) {
- compilation.errors.push(new Error(vars.pluginErrors.join("")));
- }
- });
-
- 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`);
- });
- }
-
-}
-
-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
diff --git a/packages/ext-webpack-plugin-orig/dist/pluginUtil.js b/packages/ext-webpack-plugin-orig/dist/pluginUtil.js
deleted file mode 100644
index 62d80b1..0000000
--- a/packages/ext-webpack-plugin-orig/dist/pluginUtil.js
+++ /dev/null
@@ -1,683 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports._constructor = _constructor;
-exports._compilation = _compilation;
-exports._afterCompile = _afterCompile;
-exports.emit = emit;
-exports._prepareForBuild = _prepareForBuild;
-exports._buildExtBundle = _buildExtBundle;
-exports._done = _done;
-exports.executeAsync = executeAsync;
-exports.log = log;
-exports.logv = logv;
-exports._getApp = _getApp;
-exports._getVersions = _getVersions;
-
-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); } }
-
-function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
-
-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) {
- 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;
- }
-
- 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';
- }
-
- 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 (thisOptions.environment == 'production') {
- thisVars.production = true;
- } else {
- thisVars.production = false;
- }
-
- 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);
- }
-
- 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 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 (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);
- });
- }
- }
-
- if (options.framework == 'angular' && options.treeshake == false || options.framework == 'react') {
- 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');
- data.assets.js.unshift(jsPath);
- data.assets.css.unshift(cssPath);
- log(vars.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);
- }
-} //**********
-
-
-function _afterCompile(compiler, compilation, vars, options) {
- require('./pluginUtil').logv(options, 'FUNCTION _afterCompile');
-} //**********
-
-
-function emit(_x, _x2, _x3, _x4, _x5) {
- return _emit.apply(this, arguments);
-} //**********
-
-
-function _emit() {
- _emit = _asyncToGenerator(
- /*#__PURE__*/
- regeneratorRuntime.mark(function _callee(compiler, compilation, vars, options, callback) {
- var log, logv, app, framework, path, _buildExtBundle, 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);
-
- 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)) {
- _context.next = 29;
- break;
- }
-
- 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 = '';
-
- if (options.watch == 'yes' && vars.production == false) {
- command = 'watch';
- } else {
- command = 'build';
- }
-
- if (!(vars.rebuild == true)) {
- _context.next = 26;
- break;
- }
-
- 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 {
- 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)) {
- _context.next = 23;
- break;
- }
-
- _context.next = 22;
- return _buildExtBundle(app, compilation, outputPath, parms, options);
-
- case 22:
- vars.watchStarted = true;
-
- case 23:
- callback();
- _context.next = 27;
- break;
-
- case 26:
- callback();
-
- case 27:
- _context.next = 31;
- break;
-
- case 29:
- log(`${vars.app}FUNCTION emit not run`);
- callback();
-
- case 31:
- _context.next = 38;
- break;
-
- case 33:
- _context.prev = 33;
- _context.t0 = _context["catch"](0);
-
- require('./pluginUtil').logv(options, _context.t0);
-
- compilation.errors.push('emit: ' + _context.t0);
- callback();
-
- case 38:
- case "end":
- return _context.stop();
- }
- }, _callee, this, [[0, 33]]);
- }));
- return _emit.apply(this, arguments);
-}
-
-function _prepareForBuild(app, vars, options, output, compilation) {
- try {
- logv(options, '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);
-
- if (vars.firstTime) {
- rimraf.sync(output);
- mkdirp.sync(output);
-
- const buildXML = require('./artifacts').buildXML;
-
- 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(), ''));
- }
-
- 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(), ''));
- }
-
- 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(), ''));
- }
-
- 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(), ''));
- }
- }
-
- vars.firstTime = false;
- var js = '';
-
- if (vars.production) {
- js = vars.deps.join(';\n');
- } else {
- js = 'Ext.require("Ext.*")';
- }
-
- if (vars.manifest === null || js !== vars.manifest) {
- vars.manifest = js;
- const manifest = path.join(output, 'manifest.js');
- fs.writeFileSync(manifest, js, 'utf8');
- vars.rebuild = true;
- var bundleDir = output.replace(process.cwd(), '');
-
- if (bundleDir.trim() == '') {
- bundleDir = './';
- }
-
- log(app + 'Building Ext bundle at: ' + bundleDir);
- } else {
- vars.rebuild = false;
- log(app + 'Ext rebuild NOT needed');
- }
- } catch (e) {
- require('./pluginUtil').logv(options, e);
-
- compilation.errors.push('_prepareForBuild: ' + e);
- }
-} //**********
-
-
-function _buildExtBundle(app, compilation, outputPath, parms, options) {
- try {
- const fs = require('fs');
-
- const logv = require('./pluginUtil').logv;
-
- logv(options, 'FUNCTION _buildExtBundle');
- let sencha;
-
- try {
- sencha = require('@sencha/cmd');
- } catch (e) {
- sencha = 'sencha';
- }
-
- if (fs.existsSync(sencha)) {
- logv(options, 'sencha folder exists');
- } else {
- logv(options, 'sencha folder DOES NOT exist');
- }
-
- 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);
- });
- });
- } catch (e) {
- console.log('e');
-
- require('./pluginUtil').logv(options, e);
-
- compilation.errors.push('_buildExtBundle: ' + e);
- callback();
- }
-} //**********
-
-
-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);
- }
-} //**********
-
-
-function executeAsync(_x6, _x7, _x8, _x9, _x10, _x11) {
- return _executeAsync.apply(this, arguments);
-}
-
-function _executeAsync() {
- _executeAsync = _asyncToGenerator(
- /*#__PURE__*/
- regeneratorRuntime.mark(function _callee2(app, command, parms, opts, compilation, options) {
- var DEFAULT_SUBSTRS, substrings, chalk, crossSpawn, log;
- 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"];
- 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');
- _context2.next = 9;
- return new Promise((resolve, reject) => {
- logv(options, `command - ${command}`);
- logv(options, `parms - ${parms}`);
- logv(options, `opts - ${JSON.stringify(opts)}`);
- let child = crossSpawn(command, parms, opts);
- child.on('close', (code, signal) => {
- logv(options, `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`);
- compilation.errors.push(error);
- resolve(0);
- });
- child.stdout.on('data', data => {
- var str = data.toString().replace(/\r?\n|\r/g, " ").trim();
- logv(options, `${str}`);
-
- if (data && data.toString().match(/waiting for changes\.\.\./)) {
- resolve(0);
- } else {
- if (substrings.some(function (v) {
- return data.indexOf(v) >= 0;
- })) {
- str = str.replace("[INF]", "");
- str = str.replace("[LOG]", "");
- str = str.replace(process.cwd(), '').trim();
-
- if (str.includes("[ERR]")) {
- compilation.errors.push(app + str.replace(/^\[ERR\] /gi, ''));
- str = str.replace("[ERR]", `${chalk.red("[ERR]")}`);
- }
-
- log(`${app}${str}`);
- }
- }
- });
- child.stderr.on('data', data => {
- logv(options, `error on close: ` + data);
- var str = data.toString().replace(/\r?\n|\r/g, " ").trim();
- var strJavaOpts = "Picked up _JAVA_OPTIONS";
- var includes = str.includes(strJavaOpts);
-
- if (!includes) {
- console.log(`${app} ${chalk.red("[ERR]")} ${str}`);
- }
- });
- });
-
- 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]]);
- }));
- return _executeAsync.apply(this, arguments);
-}
-
-function log(s) {
- require('readline').cursorTo(process.stdout, 0);
-
- try {
- process.stdout.clearLine();
- } catch (e) {}
-
- process.stdout.write(s);
- process.stdout.write('\n');
-}
-
-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');
- }
-}
-
-function _getApp() {
- var chalk = require('chalk');
-
- var prefix = ``;
-
- const platform = require('os').platform();
-
- if (platform == 'darwin') {
- prefix = `ℹ 「ext」:`;
- } else {
- prefix = `i [ext]:`;
- }
-
- return `${chalk.green(prefix)} `;
-}
-
-function _getVersions(app, 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')) || {};
- v.pluginVersion = pluginPkg.version;
- v._resolved = pluginPkg._resolved;
-
- if (v._resolved == undefined) {
- v.edition = `Commercial`;
- } else {
- if (-1 == v._resolved.indexOf('community')) {
- v.edition = `Commercial`;
- } else {
- 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 = '';
-
- if (frameworkName == 'react') {
- frameworkPath = path.resolve(process.cwd(), 'node_modules/react');
- }
-
- if (frameworkName == 'angular') {
- frameworkPath = path.resolve(process.cwd(), 'node_modules/@angular/core');
- }
-
- var frameworkPkg = fs.existsSync(frameworkPath + '/package.json') && JSON.parse(fs.readFileSync(frameworkPath + '/package.json', 'utf-8')) || {};
- 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;
-}
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wbHVnaW5VdGlsLmpzIl0sIm5hbWVzIjpbIl9jb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJmcyIsInJlcXVpcmUiLCJ0aGlzVmFycyIsInRoaXNPcHRpb25zIiwicGx1Z2luIiwiZnJhbWV3b3JrIiwidW5kZWZpbmVkIiwicGx1Z2luRXJyb3JzIiwicHVzaCIsInZhcnMiLCJ2YWxpZGF0ZU9wdGlvbnMiLCJnZXRWYWxpZGF0ZU9wdGlvbnMiLCJnZXREZWZhdWx0VmFycyIsInBsdWdpbk5hbWUiLCJhcHAiLCJfZ2V0QXBwIiwibG9ndiIsInJjIiwiZXhpc3RzU3luYyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsImdldERlZmF1bHRPcHRpb25zIiwic3RyaW5naWZ5IiwiZW52aXJvbm1lbnQiLCJwcm9kdWN0aW9uIiwibG9nIiwiX2dldFZlcnNpb25zIiwidHJlZXNoYWtlIiwiX3RvUHJvZCIsIl9jb21waWxhdGlvbiIsImNvbXBpbGVyIiwiY29tcGlsYXRpb24iLCJleHRDb21wb25lbnRzIiwiX2dldEFsbENvbXBvbmVudHMiLCJob29rcyIsInN1Y2NlZWRNb2R1bGUiLCJ0YXAiLCJtb2R1bGUiLCJyZXNvdXJjZSIsIm1hdGNoIiwiX3NvdXJjZSIsIl92YWx1ZSIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJkZXBzIiwiZXh0cmFjdEZyb21Tb3VyY2UiLCJmaW5pc2hNb2R1bGVzIiwibW9kdWxlcyIsIl93cml0ZUZpbGVzVG9Qcm9kRm9sZGVyIiwiaHRtbFdlYnBhY2tQbHVnaW5CZWZvcmVIdG1sR2VuZXJhdGlvbiIsImRhdGEiLCJwYXRoIiwib3V0cHV0UGF0aCIsImRldlNlcnZlciIsImpvaW4iLCJjb250ZW50QmFzZSIsInJlcGxhY2UiLCJwcm9jZXNzIiwiY3dkIiwidHJpbSIsImpzUGF0aCIsImV4dFBhdGgiLCJjc3NQYXRoIiwiYXNzZXRzIiwianMiLCJ1bnNoaWZ0IiwiY3NzIiwiZSIsImVycm9ycyIsIl9hZnRlckNvbXBpbGUiLCJlbWl0IiwiY2FsbGJhY2siLCJfYnVpbGRFeHRCdW5kbGUiLCJfcHJlcGFyZUZvckJ1aWxkIiwiY29tbWFuZCIsIndhdGNoIiwicmVidWlsZCIsInBhcm1zIiwicHJvZmlsZSIsIndhdGNoU3RhcnRlZCIsIm91dHB1dCIsInJpbXJhZiIsIm1rZGlycCIsImZzeCIsInBhY2thZ2VzIiwidG9vbGtpdCIsInRoZW1lIiwiZmlyc3RUaW1lIiwic3luYyIsImJ1aWxkWE1MIiwiY3JlYXRlQXBwSnNvbiIsImNyZWF0ZVdvcmtzcGFjZUpzb24iLCJjcmVhdGVKU0RPTUVudmlyb25tZW50Iiwid3JpdGVGaWxlU3luYyIsImZyb21QYXRoIiwidG9QYXRoIiwiY29weVN5bmMiLCJmcm9tUmVzb3VyY2VzIiwidG9SZXNvdXJjZXMiLCJtYW5pZmVzdCIsImJ1bmRsZURpciIsInNlbmNoYSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib25CdWlsZERvbmUiLCJvcHRzIiwic2lsZW50Iiwic3RkaW8iLCJlbmNvZGluZyIsImV4ZWN1dGVBc3luYyIsInRoZW4iLCJyZWFzb24iLCJjb25zb2xlIiwiX2RvbmUiLCJfdG9EZXYiLCJicm93c2VyIiwiYnJvd3NlckNvdW50IiwidXJsIiwicG9ydCIsIm9wbiIsIkRFRkFVTFRfU1VCU1RSUyIsInN1YnN0cmluZ3MiLCJjaGFsayIsImNyb3NzU3Bhd24iLCJjaGlsZCIsIm9uIiwiY29kZSIsInNpZ25hbCIsIkVycm9yIiwiZXJyb3IiLCJzdGRvdXQiLCJzdHIiLCJ0b1N0cmluZyIsInNvbWUiLCJ2IiwiaW5kZXhPZiIsInJlZCIsInN0ZGVyciIsInN0ckphdmFPcHRzIiwicyIsImN1cnNvclRvIiwiY2xlYXJMaW5lIiwid3JpdGUiLCJ2ZXJib3NlIiwicHJlZml4IiwicGxhdGZvcm0iLCJncmVlbiIsImZyYW1ld29ya05hbWUiLCJwbHVnaW5QYXRoIiwicGx1Z2luUGtnIiwicGx1Z2luVmVyc2lvbiIsInZlcnNpb24iLCJfcmVzb2x2ZWQiLCJlZGl0aW9uIiwid2VicGFja1BhdGgiLCJ3ZWJwYWNrUGtnIiwid2VicGFja1ZlcnNpb24iLCJleHRQa2ciLCJleHRWZXJzaW9uIiwiY21kUGF0aCIsImNtZFBrZyIsImNtZFZlcnNpb24iLCJ2ZXJzaW9uX2Z1bGwiLCJmcmFtZXdvcmtJbmZvIiwiZnJhbWV3b3JrUGF0aCIsImZyYW1ld29ya1BrZyIsImZyYW1ld29ya1ZlcnNpb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDTyxTQUFTQSxZQUFULENBQXNCQyxPQUF0QixFQUErQjtBQUNwQyxRQUFNQyxFQUFFLEdBQUdDLE9BQU8sQ0FBQyxJQUFELENBQWxCOztBQUVBLE1BQUlDLFFBQVEsR0FBRyxFQUFmO0FBQ0EsTUFBSUMsV0FBVyxHQUFHLEVBQWxCO0FBQ0EsTUFBSUMsTUFBTSxHQUFHLEVBQWI7O0FBRUEsTUFBSUwsT0FBTyxDQUFDTSxTQUFSLElBQXFCQyxTQUF6QixFQUFvQztBQUNsQ0osSUFBQUEsUUFBUSxDQUFDSyxZQUFULEdBQXdCLEVBQXhCO0FBQ0FMLElBQUFBLFFBQVEsQ0FBQ0ssWUFBVCxDQUFzQkMsSUFBdEIsQ0FBMkIsMEdBQTNCO0FBQ0FKLElBQUFBLE1BQU0sQ0FBQ0ssSUFBUCxHQUFjUCxRQUFkO0FBQ0EsV0FBT0UsTUFBUDtBQUNEOztBQUVELFFBQU1NLGVBQWUsR0FBR1QsT0FBTyxDQUFDLGNBQUQsQ0FBL0I7O0FBQ0FTLEVBQUFBLGVBQWUsQ0FBQ1QsT0FBTyxDQUFFLEtBQUlGLE9BQU8sQ0FBQ00sU0FBVSxNQUF4QixDQUFQLENBQXNDTSxrQkFBdEMsRUFBRCxFQUE2RFosT0FBN0QsRUFBc0UsRUFBdEUsQ0FBZjtBQUNBRyxFQUFBQSxRQUFRLEdBQUdELE9BQU8sQ0FBRSxLQUFJRixPQUFPLENBQUNNLFNBQVUsTUFBeEIsQ0FBUCxDQUFzQ08sY0FBdEMsRUFBWDtBQUNBVixFQUFBQSxRQUFRLENBQUNHLFNBQVQsR0FBcUJOLE9BQU8sQ0FBQ00sU0FBN0I7O0FBQ0EsVUFBT0gsUUFBUSxDQUFD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RCxHQUFnRWhCLENBQUMsQ0FBQ3dCLFVBQWxFLEdBQStFLEdBQS9FLEdBQXFGeEIsQ0FBQyxDQUFDbUIsT0FBdkYsR0FBaUcsd0JBQWpHLEdBQTRIbkIsQ0FBQyxDQUFDMkIsVUFBOUgsR0FBMkksYUFBM0ksR0FBMkozQixDQUFDLENBQUNzQixjQUE3SixHQUE4S08sYUFBckw7QUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi8vKioqKioqKioqKlxuZXhwb3J0IGZ1bmN0aW9uIF9jb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKVxuIFxuICB2YXIgdGhpc1ZhcnMgPSB7fVxuICB2YXIgdGhpc09wdGlvbnMgPSB7fVxuICB2YXIgcGx1Z2luID0ge31cblxuICBpZiAob3B0aW9ucy5mcmFtZXdvcmsgPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1ZhcnMucGx1Z2luRXJyb3JzID0gW11cbiAgICB0aGlzVmFycy5wbHVnaW5FcnJvcnMucHVzaCgnd2VicGFjayBjb25maWc6IGZyYW1ld29yayBwYXJhbWV0ZXIgb24gZXh0LXdlYnBhY2stcGx1Z2luIGlzIG5vdCBkZWZpbmVkIC0gdmFsdWVzOiByZWFjdCwgYW5ndWxhciwgZXh0anMnKVxuICAgIHBsdWdpbi52YXJzID0gdGhpc1ZhcnNcbiAgICByZXR1cm4gcGx1Z2luXG4gIH1cblxuICBjb25zdCB2YWxpZGF0ZU9wdGlvbnMgPSByZXF1aXJlKCdzY2hlbWEtdXRpbHMnKVxuICB2YWxpZGF0ZU9wdGlvbnMocmVxdWlyZShgLi8ke29wdGlvbnMuZnJhbWV3b3JrfVV0aWxgKS5nZXRWYWxpZGF0ZU9wdGlvbnMoKSwgb3B0aW9ucywgJycpXG4gIHRoaXNWYXJzID0gcmVxdWlyZShgLi8ke29wdGlvbnMuZnJhbWV3b3JrfVV0aWxgKS5nZXREZWZhdWx0VmFycygpXG4gIHRoaXNWYXJzLmZyYW1ld29yayA9IG9wdGlvbnMuZnJhbWV3b3JrXG4gIHN3aXRjaCh0aGlzVmFycy5mcmFtZXdvcmspIHtcbiAgICBjYXNlICdleHRqcyc6XG4gICAgICB0aGlzVmFycy5wbHVnaW5OYW1lID0gJ2V4dC13ZWJwYWNrLXBsdWdpbidcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JlYWN0JzpcbiAgICAgIHRoaXNWYXJzLnBsdWdpbk5hbWUgPSAnZXh0LXJlYWN0LXdlYnBhY2stcGx1Z2luJ1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYW5ndWxhcic6XG4gICAgICB0aGlzVmFycy5wbHVnaW5OYW1lID0gJ2V4dC1hbmd1bGFyLXdlYnBhY2stcGx1Z2luJ1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXNWYXJzLnBsdWdpbk5hbWUgPSAnZXh0LXdlYnBhY2stcGx1Z2luJ1xuICB9XG5cbiAgdGhpc1ZhcnMuYXBwID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykuX2dldEFwcCgpXG4gIGxvZ3Yob3B0aW9ucywgYHBsdWdpbk5hbWUgLSAke3RoaXNWYXJzLnBsdWdpbk5hbWV9YClcbiAgbG9ndihvcHRpb25zLCBgdGhpc1ZhcnMuYXBwIC0gJHt0aGlzVmFycy5hcHB9YClcblxuICBjb25zdCByYyA9IChmcy5leGlzdHNTeW5jKGAuZXh0LSR7dGhpc1ZhcnMuZnJhbWV3b3JrfXJjYCkgJiYgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoYC5leHQtJHt0aGlzVmFycy5mcmFtZXdvcmt9cmNgLCAndXRmLTgnKSkgfHwge30pXG4gIHRoaXNPcHRpb25zID0geyAuLi5yZXF1aXJlKGAuLyR7dGhpc1ZhcnMuZnJhbWV3b3JrfVV0aWxgKS5nZXREZWZhdWx0T3B0aW9ucygpLCAuLi5vcHRpb25zLCAuLi5yYyB9XG4gIGxvZ3Yob3B0aW9ucywgYHRoaXNPcHRpb25zIC0gJHtKU09OLnN0cmluZ2lmeSh0aGlzT3B0aW9ucyl9YClcblxuICBpZiAodGhpc09wdGlvbnMuZW52aXJvbm1lbnQgPT0gJ3Byb2R1Y3Rpb24nKSBcbiAgICB7dGhpc1ZhcnMucHJvZHVjdGlvbiA9IHRydWV9XG4gIGVsc2UgXG4gICAge3RoaXNWYXJzLnByb2R1Y3Rpb24gPSBmYWxzZX1cbiAgbG9ndihvcHRpb25zLCBgdGhpc1ZhcnMgLSAke0pTT04uc3RyaW5naWZ5KHRoaXNWYXJzKX1gKVxuXG4gIGxvZyhyZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5fZ2V0VmVyc2lvbnModGhpc1ZhcnMuYXBwLCB0aGlzVmFycy5wbHVnaW5OYW1lLCB0aGlzVmFycy5mcmFtZXdvcmspKVxuICBsb2codGhpc1ZhcnMuYXBwICsgJ0J1aWxkaW5nIGZvciAnICsgdGhpc09wdGlvbnMuZW52aXJvbm1lbnQpXG4gIGxvZyh0aGlzVmFycy5hcHAgKyAnVHJlZXNoYWtlIGlzICcgKyB0aGlzT3B0aW9ucy50cmVlc2hha2UpXG5cbiAgaWYgKHRoaXNWYXJzLnByb2R1Y3Rpb24gPT0gdHJ1ZSAmJiB0aGlzT3B0aW9ucy50cmVlc2hha2UgPT0gdHJ1ZSAmJiBvcHRpb25zLmZyYW1ld29yayA9PSAnYW5ndWxhcicpIHtcbiAgICByZXF1aXJlKGAuL2FuZ3VsYXJVdGlsYCkuX3RvUHJvZCh0aGlzVmFycywgdGhpc09wdGlvbnMpXG4gIH1cblxuICBwbHVnaW4udmFycyA9IHRoaXNWYXJzXG4gIHBsdWdpbi5vcHRpb25zID0gdGhpc09wdGlvbnNcbiAgcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndihvcHRpb25zLCAnRlVOQ1RJT04gY29uc3RydWN0b3IgKGVuZCknKVxuICByZXR1cm4gcGx1Z2luXG59XG5cbi8vKioqKioqKioqKlxuZXhwb3J0IGZ1bmN0aW9uIF9jb21waWxhdGlvbihjb21waWxlciwgY29tcGlsYXRpb24sIHZhcnMsIG9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2KG9wdGlvbnMsICdGVU5DVElPTiBfY29tcGlsYXRpb24nKVxuXG4gICAgdmFyIGV4dENvbXBvbmVudHMgPSBbXVxuXG4gICAgaWYgKHZhcnMucHJvZHVjdGlvbikge1xuICAgICAgaWYgKG9wdGlvbnMuZnJhbWV3b3JrID09ICdhbmd1bGFyJyAmJiBvcHRpb25zLnRyZWVzaGFrZSkge1xuICAgICAgICBleHRDb21wb25lbnRzID0gcmVxdWlyZSgnLi9hbmd1bGFyVXRpbCcpLl9nZXRBbGxDb21wb25lbnRzKHZhcnMsIG9wdGlvbnMpXG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGF0aW9uLmhvb2tzLnN1Y2NlZWRNb2R1bGUudGFwKGBleHQtc3VjY2VlZC1tb2R1bGVgLCBtb2R1bGUgPT4ge1xuICAgICAgICAvL3JlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3Yob3B0aW9ucywgJ0hPT0sgc3VjY2VlZE1vZHVsZScpXG4gICAgICAgIGlmIChtb2R1bGUucmVzb3VyY2UgJiYgIW1vZHVsZS5yZXNvdXJjZS5tYXRjaCgvbm9kZV9tb2R1bGVzLykpIHtcbiAgICAgICAgICBpZihtb2R1bGUucmVzb3VyY2UubWF0Y2goL1xcLmh0bWwkLykgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYobW9kdWxlLl9zb3VyY2UuX3ZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2RvY3R5cGUgaHRtbCcpID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHZhcnMuZGVwcyA9IFsuLi4odmFycy5kZXBzIHx8IFtdKSwgLi4ucmVxdWlyZShgLi8ke3ZhcnMuZnJhbWV3b3JrfVV0aWxgKS5leHRyYWN0RnJvbVNvdXJjZShtb2R1bGUsIG9wdGlvbnMsIGNvbXBpbGF0aW9uLCBleHRDb21wb25lbnRzKV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXJzLmRlcHMgPSBbLi4uKHZhcnMuZGVwcyB8fCBbXSksIC4uLnJlcXVpcmUoYC4vJHt2YXJzLmZyYW1ld29ya31VdGlsYCkuZXh0cmFjdEZyb21Tb3VyY2UobW9kdWxlLCBvcHRpb25zLCBjb21waWxhdGlvbiwgZXh0Q29tcG9uZW50cyldXG5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgKGV4dENvbXBvbmVudHMubGVuZ3RoICYmIG1vZHVsZS5yZXNvdXJjZSAmJiAobW9kdWxlLnJlc291cmNlLm1hdGNoKC9cXC4oanx0KXN4PyQvKSB8fFxuICAgICAgICAvLyBvcHRpb25zLmZyYW1ld29yayA9PSAnYW5ndWxhcicgJiYgbW9kdWxlLnJlc291cmNlLm1hdGNoKC9cXC5odG1sJC8pKSAmJlxuICAgICAgICAvLyAhbW9kdWxlLnJlc291cmNlLm1hdGNoKC9ub2RlX21vZHVsZXMvKSAmJiAhbW9kdWxlLnJlc291cmNlLm1hdGNoKGAvZXh0LXskb3B0aW9ucy5mcmFtZXdvcmt9L2J1aWxkL2ApKSB7XG4gICAgICAgIC8vICAgdmFycy5kZXBzID0gWy4uLih2YXJzLmRlcHMgfHwgW10pLCAuLi5yZXF1aXJlKGAuLyR7dmFycy5mcmFtZXdvcmt9VXRpbGApLmV4dHJhY3RGcm9tU291cmNlKG1vZHVsZSwgb3B0aW9ucywgY29tcGlsYXRpb24sIGV4dENvbXBvbmVudHMpXVxuICAgICAgICAvLyB9XG4gICAgICB9KVxuXG4gICAgICBpZiAob3B0aW9ucy5mcmFtZXdvcmsgPT0gJ2FuZ3VsYXInICYmIG9wdGlvbnMudHJlZXNoYWtlID09IHRydWUpIHtcbiAgICAgICAgY29tcGlsYXRpb24uaG9va3MuZmluaXNoTW9kdWxlcy50YXAoYGV4dC1maW5pc2gtbW9kdWxlc2AsIG1vZHVsZXMgPT4ge1xuICAgICAgICAgIHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3Yob3B0aW9ucywgJ0hPT0sgZmluaXNoTW9kdWxlcycpXG4gICAgICAgICAgcmVxdWlyZSgnLi9hbmd1bGFyVXRpbCcpLl93cml0ZUZpbGVzVG9Qcm9kRm9sZGVyKHZhcnMsIG9wdGlvbnMpXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAob3B0aW9ucy5mcmFtZXdvcmsgPT0gJ2FuZ3VsYXInICYmIG9wdGlvbnMudHJlZXNoYWtlID09IGZhbHNlKSB8fFxuICAgICAgKG9wdGlvbnMuZnJhbWV3b3JrID09ICdyZWFjdCcpXG4gICAgKSB7XG4gICAgICAgIGNvbXBpbGF0aW9uLmhvb2tzLmh0bWxXZWJwYWNrUGx1Z2luQmVmb3JlSHRtbEdlbmVyYXRpb24udGFwKGBleHQtaHRtbC1nZW5lcmF0aW9uYCwoZGF0YSkgPT4ge1xuICAgICAgICBsb2d2KG9wdGlvbnMsJ0hPT0sgZXh0LWh0bWwtZ2VuZXJhdGlvbicpXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbiAgICAgICAgdmFyIG91dHB1dFBhdGggPSAnJ1xuICAgICAgICBpZiAoY29tcGlsZXIub3B0aW9ucy5kZXZTZXJ2ZXIpIHtcbiAgICAgICAgICBpZiAoY29tcGlsZXIub3V0cHV0UGF0aCA9PT0gJy8nKSB7XG4gICAgICAgICAgICBvdXRwdXRQYXRoID0gcGF0aC5qb2luKGNvbXBpbGVyLm9wdGlvbnMuZGV2U2VydmVyLmNvbnRlbnRCYXNlLCBvdXRwdXRQYXRoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb21waWxlci5vcHRpb25zLmRldlNlcnZlci5jb250ZW50QmFzZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgb3V0cHV0UGF0aCA9ICdidWlsZCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBvdXRwdXRQYXRoID0gJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgb3V0cHV0UGF0aCA9ICdidWlsZCdcbiAgICAgICAgfVxuICAgICAgICBvdXRwdXRQYXRoID0gb3V0cHV0UGF0aC5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKS50cmltKClcbiAgICAgICAgdmFyIGpzUGF0aCA9IHBhdGguam9pbihvdXRwdXRQYXRoLCB2YXJzLmV4dFBhdGgsICdleHQuanMnKVxuICAgICAgICB2YXIgY3NzUGF0aCA9IHBhdGguam9pbihvdXRwdXRQYXRoLCB2YXJzLmV4dFBhdGgsICdleHQuY3NzJylcbiAgICAgICAgZGF0YS5hc3NldHMuanMudW5zaGlmdChqc1BhdGgpXG4gICAgICAgIGRhdGEuYXNzZXRzLmNzcy51bnNoaWZ0KGNzc1BhdGgpXG4gICAgICAgIGxvZyh2YXJzLmFwcCArIGBBZGRpbmcgJHtqc1BhdGh9IGFuZCAke2Nzc1BhdGh9IHRvIGluZGV4Lmh0bWxgKVxuICAgICAgfSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsb2d2KG9wdGlvbnMsJ3NraXBwZWQgSE9PSyBleHQtaHRtbC1nZW5lcmF0aW9uJylcbiAgICB9XG4gIH1cbiAgY2F0Y2goZSkge1xuICAgIHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3Yob3B0aW9ucyxlKVxuICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCdfY29tcGlsYXRpb246ICcgKyBlKVxuICB9XG59XG5cbi8vKioqKioqKioqKlxuZXhwb3J0IGZ1bmN0aW9uIF9hZnRlckNvbXBpbGUoY29tcGlsZXIsIGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zKSB7XG4gIHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3Yob3B0aW9ucywgJ0ZVTkNUSU9OIF9hZnRlckNvbXBpbGUnKVxufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbWl0KGNvbXBpbGVyLCBjb21waWxhdGlvbiwgdmFycywgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBsb2cgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2dcbiAgICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICAgIGxvZ3Yob3B0aW9ucywnRlVOQ1RJT04gZW1pdCcpXG4gICAgdmFyIGFwcCA9IHZhcnMuYXBwXG4gICAgdmFyIGZyYW1ld29yayA9IHZhcnMuZnJhbWV3b3JrXG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuICAgIGNvbnN0IF9idWlsZEV4dEJ1bmRsZSA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLl9idWlsZEV4dEJ1bmRsZVxuICAgIGxldCBvdXRwdXRQYXRoID0gcGF0aC5qb2luKGNvbXBpbGVyLm91dHB1dFBhdGgsdmFycy5leHRQYXRoKVxuICAgIGlmIChjb21waWxlci5vdXRwdXRQYXRoID09PSAnLycgJiYgY29tcGlsZXIub3B0aW9ucy5kZXZTZXJ2ZXIpIHtcbiAgICAgIG91dHB1dFBhdGggPSBwYXRoLmpvaW4oY29tcGlsZXIub3B0aW9ucy5kZXZTZXJ2ZXIuY29udGVudEJhc2UsIG91dHB1dFBhdGgpXG4gICAgfVxuICAgIGxvZ3Yob3B0aW9ucywnb3V0cHV0UGF0aDogJyArIG91dHB1dFBhdGgpXG4gICAgbG9ndihvcHRpb25zLCdmcmFtZXdvcms6ICcgKyBmcmFtZXdvcmspXG4gICAgaWYgKG9wdGlvbnMuZW1pdCA9PSB0cnVlKSB7XG4gICAgICBpZiAoZnJhbWV3b3JrICE9ICdleHRqcycpIHtcbiAgICAgICAgX3ByZXBhcmVGb3JCdWlsZChhcHAsIHZhcnMsIG9wdGlvbnMsIG91dHB1dFBhdGgsIGNvbXBpbGF0aW9uKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChvcHRpb25zLmZyYW1ld29yayA9PSAnYW5ndWxhcicgJiYgb3B0aW9ucy50cmVlc2hha2UgPT0gZmFsc2UpIHtcbiAgICAgICAgICByZXF1aXJlKGAuLyR7ZnJhbWV3b3JrfVV0aWxgKS5fcHJlcGFyZUZvckJ1aWxkKGFwcCwgdmFycywgb3B0aW9ucywgb3V0cHV0UGF0aCwgY29tcGlsYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgcmVxdWlyZShgLi8ke2ZyYW1ld29ya31VdGlsYCkuX3ByZXBhcmVGb3JCdWlsZChhcHAsIHZhcnMsIG9wdGlvbnMsIG91dHB1dFBhdGgsIGNvbXBpbGF0aW9uKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21tYW5kID0gJydcbiAgICAgIGlmIChvcHRpb25zLndhdGNoID09ICd5ZXMnICYmIHZhcnMucHJvZHVjdGlvbiA9PSBmYWxzZSkge1xuICAgICAgICBjb21tYW5kID0gJ3dhdGNoJ1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbW1hbmQgPSAnYnVpbGQnXG4gICAgICB9XG5cbiAgICAgIGlmICh2YXJzLnJlYnVpbGQgPT0gdHJ1ZSkge1xuICAgICAgICB2YXIgcGFybXMgPSBbXVxuICAgICAgICBpZiAob3B0aW9ucy5wcm9maWxlID09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnByb2ZpbGUgPT0gJycgfHwgb3B0aW9ucy5wcm9maWxlID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoY29tbWFuZCA9PSAnYnVpbGQnKSB7XG4gICAgICAgICAgICBwYXJtcyA9IFsnYXBwJywgY29tbWFuZCwgb3B0aW9ucy5lbnZpcm9ubWVudF1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXJtcyA9IFsnYXBwJywgY29tbWFuZCwgJy0td2ViLXNlcnZlcicsICdmYWxzZScsIG9wdGlvbnMuZW52aXJvbm1lbnRdXG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGNvbW1hbmQgPT0gJ2J1aWxkJykge1xuICAgICAgICAgICAgcGFybXMgPSBbJ2FwcCcsIGNvbW1hbmQsIG9wdGlvbnMucHJvZmlsZSwgb3B0aW9ucy5lbnZpcm9ubWVudF1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXJtcyA9IFsnYXBwJywgY29tbWFuZCwgJy0td2ViLXNlcnZlcicsICdmYWxzZScsIG9wdGlvbnMucHJvZmlsZSwgb3B0aW9ucy5lbnZpcm9ubWVudF1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFycy53YXRjaFN0YXJ0ZWQgPT0gZmFsc2UpIHtcbiAgICAgICAgICBhd2FpdCBfYnVpbGRFeHRCdW5kbGUoYXBwLCBjb21waWxhdGlvbiwgb3V0cHV0UGF0aCwgcGFybXMsIG9wdGlvbnMpXG4gICAgICAgICAgdmFycy53YXRjaFN0YXJ0ZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsb2coYCR7dmFycy5hcHB9RlVOQ1RJT04gZW1pdCBub3QgcnVuYClcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9XG4gIH1cbiAgY2F0Y2goZSkge1xuICAgIHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3Yob3B0aW9ucyxlKVxuICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCdlbWl0OiAnICsgZSlcbiAgICBjYWxsYmFjaygpXG4gIH1cbn1cblxuLy8qKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gX3ByZXBhcmVGb3JCdWlsZChhcHAsIHZhcnMsIG9wdGlvbnMsIG91dHB1dCwgY29tcGlsYXRpb24pIHtcbiAgdHJ5IHtcbiAgICBsb2d2KG9wdGlvbnMsJ0ZVTkNUSU9OIF9wcmVwYXJlRm9yQnVpbGQnKVxuICAgIGNvbnN0IHJpbXJhZiA9IHJlcXVpcmUoJ3JpbXJhZicpXG4gICAgY29uc3QgbWtkaXJwID0gcmVxdWlyZSgnbWtkaXJwJylcbiAgICBjb25zdCBmc3ggPSByZXF1aXJlKCdmcy1leHRyYScpXG4gICAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpXG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuXG4gICAgdmFyIHBhY2thZ2VzID0gb3B0aW9ucy5wYWNrYWdlc1xuICAgIHZhciB0b29sa2l0ID0gb3B0aW9ucy50b29sa2l0XG4gICAgdmFyIHRoZW1lID0gb3B0aW9ucy50aGVtZVxuXG4gICAgdGhlbWUgPSB0aGVtZSB8fCAodG9vbGtpdCA9PT0gJ2NsYXNzaWMnID8gJ3RoZW1lLXRyaXRvbicgOiAndGhlbWUtbWF0ZXJpYWwnKVxuICAgIGxvZ3Yob3B0aW9ucywnZmlyc3RUaW1lOiAnICsgdmFycy5maXJzdFRpbWUpXG4gICAgaWYgKHZhcnMuZmlyc3RUaW1lKSB7XG4gICAgICByaW1yYWYuc3luYyhvdXRwdXQpXG4gICAgICBta2RpcnAuc3luYyhvdXRwdXQpXG4gICAgICBjb25zdCBidWlsZFhNTCA9IHJlcXVpcmUoJy4vYXJ0aWZhY3RzJykuYnVpbGRYTUxcbiAgICAgIGNvbnN0IGNyZWF0ZUFwcEpzb24gPSByZXF1aXJlKCcuL2FydGlmYWN0cycpLmNyZWF0ZUFwcEpzb25cbiAgICAgIGNvbnN0IGNyZWF0ZVdvcmtzcGFjZUpzb24gPSByZXF1aXJlKCcuL2FydGlmYWN0cycpLmNyZWF0ZVdvcmtzcGFjZUpzb25cbiAgICAgIGNvbnN0IGNyZWF0ZUpTRE9NRW52aXJvbm1lbnQgPSByZXF1aXJlKCcuL2FydGlmYWN0cycpLmNyZWF0ZUpTRE9NRW52aXJvbm1lbnRcblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ob3V0cHV0LCAnYnVpbGQueG1sJyksIGJ1aWxkWE1MKHZhcnMucHJvZHVjdGlvbiwgb3B0aW9ucywgb3V0cHV0KSwgJ3V0ZjgnKVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ob3V0cHV0LCAnYXBwLmpzb24nKSwgY3JlYXRlQXBwSnNvbih0aGVtZSwgcGFja2FnZXMsIHRvb2xraXQsIG9wdGlvbnMsIG91dHB1dCksICd1dGY4JylcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKG91dHB1dCwgJ2pzZG9tLWVudmlyb25tZW50LmpzJyksIGNyZWF0ZUpTRE9NRW52aXJvbm1lbnQob3B0aW9ucywgb3V0cHV0KSwgJ3V0ZjgnKVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ob3V0cHV0LCAnd29ya3NwYWNlLmpzb24nKSwgY3JlYXRlV29ya3NwYWNlSnNvbihvcHRpb25zLCBvdXRwdXQpLCAndXRmOCcpXG5cbiAgICAgIHZhciBmcmFtZXdvcmsgPSB2YXJzLmZyYW1ld29yaztcbiAgICAgIC8vYmVjYXVzZSBvZiBhIHByb2JsZW0gd2l0aCBjb2xvcnBpY2tlclxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksYGV4dC0ke2ZyYW1ld29ya30vdXgvYCkpKSB7XG4gICAgICAgIHZhciBmcm9tUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBgZXh0LSR7ZnJhbWV3b3JrfS91eC9gKVxuICAgICAgICB2YXIgdG9QYXRoID0gcGF0aC5qb2luKG91dHB1dCwgJ3V4JylcbiAgICAgICAgZnN4LmNvcHlTeW5jKGZyb21QYXRoLCB0b1BhdGgpXG4gICAgICAgIGxvZyhhcHAgKyAnQ29weWluZyAodXgpICcgKyBmcm9tUGF0aC5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKSArICcgdG86ICcgKyB0b1BhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykpXG4gICAgICB9XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSxgZXh0LSR7ZnJhbWV3b3JrfS9wYWNrYWdlcy9gKSkpIHtcbiAgICAgICAgdmFyIGZyb21QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGBleHQtJHtmcmFtZXdvcmt9L3BhY2thZ2VzL2ApXG4gICAgICAgIHZhciB0b1BhdGggPSBwYXRoLmpvaW4ob3V0cHV0LCAncGFja2FnZXMnKVxuICAgICAgICBmc3guY29weVN5bmMoZnJvbVBhdGgsIHRvUGF0aClcbiAgICAgICAgbG9nKGFwcCArICdDb3B5aW5nICcgKyBmcm9tUGF0aC5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKSArICcgdG86ICcgKyB0b1BhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykpXG4gICAgICB9XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSxgZXh0LSR7ZnJhbWV3b3JrfS9vdmVycmlkZXMvYCkpKSB7XG4gICAgICAgIHZhciBmcm9tUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBgZXh0LSR7ZnJhbWV3b3JrfS9vdmVycmlkZXMvYClcbiAgICAgICAgdmFyIHRvUGF0aCA9IHBhdGguam9pbihvdXRwdXQsICdvdmVycmlkZXMnKVxuICAgICAgICBmc3guY29weVN5bmMoZnJvbVBhdGgsIHRvUGF0aClcbiAgICAgICAgbG9nKGFwcCArICdDb3B5aW5nICcgKyBmcm9tUGF0aC5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKSArICcgdG86ICcgKyB0b1BhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykpXG4gICAgICB9XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwncmVzb3VyY2VzLycpKSkge1xuICAgICAgICB2YXIgZnJvbVJlc291cmNlcyA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAncmVzb3VyY2VzLycpXG4gICAgICAgIHZhciB0b1Jlc291cmNlcyA9IHBhdGguam9pbihvdXRwdXQsICcuLi9yZXNvdXJjZXMnKVxuICAgICAgICBmc3guY29weVN5bmMoZnJvbVJlc291cmNlcywgdG9SZXNvdXJjZXMpXG4gICAgICAgIGxvZyhhcHAgKyAnQ29weWluZyAnICsgZnJvbVJlc291cmNlcy5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKSArICcgdG86ICcgKyB0b1Jlc291cmNlcy5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKSlcbiAgICAgIH1cbiAgICB9XG4gICAgdmFycy5maXJzdFRpbWUgPSBmYWxzZVxuICAgIHZhciBqcyA9ICcnXG4gICAgaWYgKHZhcnMucHJvZHVjdGlvbikge1xuICAgICAganMgPSB2YXJzLmRlcHMuam9pbignO1xcbicpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGpzID0gJ0V4dC5yZXF1aXJlKFwiRXh0LipcIiknXG4gICAgfVxuICAgIGlmICh2YXJzLm1hbmlmZXN0ID09PSBudWxsIHx8IGpzICE9PSB2YXJzLm1hbmlmZXN0KSB7XG4gICAgICB2YXJzLm1hbmlmZXN0ID0ganNcbiAgICAgIGNvbnN0IG1hbmlmZXN0ID0gcGF0aC5qb2luKG91dHB1dCwgJ21hbmlmZXN0LmpzJylcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMobWFuaWZlc3QsIGpzLCAndXRmOCcpXG4gICAgICB2YXJzLnJlYnVpbGQgPSB0cnVlXG4gICAgICB2YXIgYnVuZGxlRGlyID0gb3V0cHV0LnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpXG4gICAgICBpZiAoYnVuZGxlRGlyLnRyaW0oKSA9PSAnJykge2J1bmRsZURpciA9ICcuLyd9XG4gICAgICBsb2coYXBwICsgJ0J1aWxkaW5nIEV4dCBidW5kbGUgYXQ6ICcgKyBidW5kbGVEaXIpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFycy5yZWJ1aWxkID0gZmFsc2VcbiAgICAgIGxvZyhhcHAgKyAnRXh0IHJlYnVpbGQgTk9UIG5lZWRlZCcpXG4gICAgfVxuICB9XG4gIGNhdGNoKGUpIHtcbiAgICByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2KG9wdGlvbnMsZSlcbiAgICBjb21waWxhdGlvbi5lcnJvcnMucHVzaCgnX3ByZXBhcmVGb3JCdWlsZDogJyArIGUpXG4gIH1cbn1cblxuLy8qKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gX2J1aWxkRXh0QnVuZGxlKGFwcCwgY29tcGlsYXRpb24sIG91dHB1dFBhdGgsIHBhcm1zLCBvcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpXG4gICAgY29uc3QgbG9ndiA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3ZcbiAgICBsb2d2KG9wdGlvbnMsJ0ZVTkNUSU9OIF9idWlsZEV4dEJ1bmRsZScpXG5cbiAgICBsZXQgc2VuY2hhOyB0cnkgeyBzZW5jaGEgPSByZXF1aXJlKCdAc2VuY2hhL2NtZCcpIH0gY2F0Y2ggKGUpIHsgc2VuY2hhID0gJ3NlbmNoYScgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHNlbmNoYSkpIHtcbiAgICAgIGxvZ3Yob3B0aW9ucywnc2VuY2hhIGZvbGRlciBleGlzdHMnKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxvZ3Yob3B0aW9ucywnc2VuY2hhIGZvbGRlciBET0VTIE5PVCBleGlzdCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IG9uQnVpbGREb25lID0gKCkgPT4ge1xuICAgICAgICBsb2d2KG9wdGlvbnMsJ29uQnVpbGREb25lJylcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG5cbiAgICAgIHZhciBvcHRzID0geyBjd2Q6IG91dHB1dFBhdGgsIHNpbGVudDogdHJ1ZSwgc3RkaW86ICdwaXBlJywgZW5jb2Rpbmc6ICd1dGYtOCd9XG4gICAgICBleGVjdXRlQXN5bmMoYXBwLCBzZW5jaGEsIHBhcm1zLCBvcHRzLCBjb21waWxhdGlvbiwgb3B0aW9ucykudGhlbiAoXG4gICAgICAgIGZ1bmN0aW9uKCkgeyBvbkJ1aWxkRG9uZSgpIH0sIFxuICAgICAgICBmdW5jdGlvbihyZWFzb24pIHsgcmVqZWN0KHJlYXNvbikgfVxuICAgICAgKVxuICAgIH0pXG4gIH1cbiAgY2F0Y2goZSkge1xuICAgIGNvbnNvbGUubG9nKCdlJylcbiAgICByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2KG9wdGlvbnMsZSlcbiAgICBjb21waWxhdGlvbi5lcnJvcnMucHVzaCgnX2J1aWxkRXh0QnVuZGxlOiAnICsgZSlcbiAgICBjYWxsYmFjaygpXG4gIH1cbn1cblxuLy8qKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gX2RvbmUodmFycywgb3B0aW9ucykge1xuICB0cnkge1xuICAgIGNvbnN0IGxvZyA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ1xuICAgIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gICAgbG9ndihvcHRpb25zLCdGVU5DVElPTiBfZG9uZScpXG5cblxuICAgIGlmICh2YXJzLnByb2R1Y3Rpb24gPT0gdHJ1ZSAmJiBvcHRpb25zLnRyZWVzaGFrZSA9PSBmYWxzZSAmJiBvcHRpb25zLmZyYW1ld29yayA9PSAnYW5ndWxhcicpIHtcbiAgICAgIHJlcXVpcmUoYC4vJHtvcHRpb25zLmZyYW1ld29ya31VdGlsYCkuX3RvRGV2KHZhcnMsIG9wdGlvbnMpXG4gICAgfVxuXG5cbiAgICB0cnkge1xuICAgICAgaWYob3B0aW9ucy5icm93c2VyID09IHRydWUgJiYgb3B0aW9ucy53YXRjaCA9PSAneWVzJyAmJiB2YXJzLnByb2R1Y3Rpb24gPT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHZhcnMuYnJvd3NlckNvdW50ID09IDApIHtcbiAgICAgICAgICB2YXIgdXJsID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6JyArIG9wdGlvbnMucG9ydFxuICAgICAgICAgIHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZyh2YXJzLmFwcCArIGBPcGVuaW5nIGJyb3dzZXIgYXQgJHt1cmx9YClcbiAgICAgICAgICB2YXJzLmJyb3dzZXJDb3VudCsrXG4gICAgICAgICAgY29uc3Qgb3BuID0gcmVxdWlyZSgnb3BuJylcbiAgICAgICAgICBvcG4odXJsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmxvZyhlKVxuICAgICAgLy9jb21waWxhdGlvbi5lcnJvcnMucHVzaCgnc2hvdyBicm93c2VyIHdpbmRvdyAtIGV4dC1kb25lOiAnICsgZSlcbiAgICB9XG4gIH1cbiAgY2F0Y2goZSkge1xuICAgIHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3Yob3B0aW9ucyxlKVxuICB9XG59XG5cbi8vKioqKioqKioqKlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBc3luYyAoYXBwLCBjb21tYW5kLCBwYXJtcywgb3B0cywgY29tcGlsYXRpb24sIG9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICAvL2NvbnN0IERFRkFVTFRfU1VCU1RSUyA9IFsnW0lORl0gTG9hZGluZycsICdbSU5GXSBQcm9jZXNzaW5nJywgJ1tMT0ddIEZhc2hpb24gYnVpbGQgY29tcGxldGUnLCAnW0VSUl0nLCAnW1dSTl0nLCBcIltJTkZdIFNlcnZlclwiLCBcIltJTkZdIFdyaXRpbmdcIiwgXCJbSU5GXSBMb2FkaW5nIEJ1aWxkXCIsIFwiW0lORl0gV2FpdGluZ1wiLCBcIltMT0ddIEZhc2hpb24gd2FpdGluZ1wiXTtcbiAgICBjb25zdCBERUZBVUxUX1NVQlNUUlMgPSBbXCJbSU5GXSB4U2VydmVyXCIsICdbSU5GXSBMb2FkaW5nJywgJ1tJTkZdIEFwcGVuZCcsICdbSU5GXSBQcm9jZXNzaW5nJywgJ1tJTkZdIFByb2Nlc3NpbmcgQnVpbGQnLCAnW0xPR10gRmFzaGlvbiBidWlsZCBjb21wbGV0ZScsICdbRVJSXScsICdbV1JOXScsIFwiW0lORl0gV3JpdGluZ1wiLCBcIltJTkZdIExvYWRpbmcgQnVpbGRcIiwgXCJbSU5GXSBXYWl0aW5nXCIsIFwiW0xPR10gRmFzaGlvbiB3YWl0aW5nXCJdO1xuICAgIHZhciBzdWJzdHJpbmdzID0gREVGQVVMVF9TVUJTVFJTIFxuICAgIHZhciBjaGFsayA9IHJlcXVpcmUoJ2NoYWxrJylcbiAgICBjb25zdCBjcm9zc1NwYXduID0gcmVxdWlyZSgnY3Jvc3Mtc3Bhd24nKVxuICAgIGNvbnN0IGxvZyA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ1xuICAgIGxvZ3Yob3B0aW9ucywgJ0ZVTkNUSU9OIGV4ZWN1dGVBc3luYycpXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbG9ndihvcHRpb25zLGBjb21tYW5kIC0gJHtjb21tYW5kfWApXG4gICAgICBsb2d2KG9wdGlvbnMsIGBwYXJtcyAtICR7cGFybXN9YClcbiAgICAgIGxvZ3Yob3B0aW9ucywgYG9wdHMgLSAke0pTT04uc3RyaW5naWZ5KG9wdHMpfWApXG4gICAgICBsZXQgY2hpbGQgPSBjcm9zc1NwYXduKGNvbW1hbmQsIHBhcm1zLCBvcHRzKVxuICAgICAgY2hpbGQub24oJ2Nsb3NlJywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBsb2d2KG9wdGlvbnMsIGBvbiBjbG9zZTogYCArIGNvZGUpIFxuICAgICAgICBpZihjb2RlID09PSAwKSB7IHJlc29sdmUoMCkgfVxuICAgICAgICBlbHNlIHsgY29tcGlsYXRpb24uZXJyb3JzLnB1c2goIG5ldyBFcnJvcihjb2RlKSApOyByZXNvbHZlKDApIH1cbiAgICAgIH0pXG4gICAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHsgXG4gICAgICAgIGxvZ3Yob3B0aW9ucywgYG9uIGVycm9yYCkgXG4gICAgICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKGVycm9yKVxuICAgICAgICByZXNvbHZlKDApXG4gICAgICB9KVxuICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgdmFyIHN0ciA9IGRhdGEudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIiBcIikudHJpbSgpXG4gICAgICAgIGxvZ3Yob3B0aW9ucywgYCR7c3RyfWApXG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEudG9TdHJpbmcoKS5tYXRjaCgvd2FpdGluZyBmb3IgY2hhbmdlc1xcLlxcLlxcLi8pKSB7XG4gICAgICAgICAgcmVzb2x2ZSgwKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChzdWJzdHJpbmdzLnNvbWUoZnVuY3Rpb24odikgeyByZXR1cm4gZGF0YS5pbmRleE9mKHYpID49IDA7IH0pKSB7IFxuICAgICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoXCJbSU5GXVwiLCBcIlwiKVxuICAgICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoXCJbTE9HXVwiLCBcIlwiKVxuICAgICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpLnRyaW0oKVxuICAgICAgICAgICAgaWYgKHN0ci5pbmNsdWRlcyhcIltFUlJdXCIpKSB7XG4gICAgICAgICAgICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKGFwcCArIHN0ci5yZXBsYWNlKC9eXFxbRVJSXFxdIC9naSwgJycpKTtcbiAgICAgICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoXCJbRVJSXVwiLCBgJHtjaGFsay5yZWQoXCJbRVJSXVwiKX1gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nKGAke2FwcH0ke3N0cn1gKSBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBsb2d2KG9wdGlvbnMsIGBlcnJvciBvbiBjbG9zZTogYCArIGRhdGEpIFxuICAgICAgICB2YXIgc3RyID0gZGF0YS50b1N0cmluZygpLnJlcGxhY2UoL1xccj9cXG58XFxyL2csIFwiIFwiKS50cmltKClcbiAgICAgICAgdmFyIHN0ckphdmFPcHRzID0gXCJQaWNrZWQgdXAgX0pBVkFfT1BUSU9OU1wiO1xuICAgICAgICB2YXIgaW5jbHVkZXMgPSBzdHIuaW5jbHVkZXMoc3RySmF2YU9wdHMpXG4gICAgICAgIGlmICghaW5jbHVkZXMpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgJHthcHB9ICR7Y2hhbGsucmVkKFwiW0VSUl1cIil9ICR7c3RyfWApXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuICBjYXRjaChlKSB7XG4gICAgcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndihvcHRpb25zLGUpXG4gICAgY29tcGlsYXRpb24uZXJyb3JzLnB1c2goJ2V4ZWN1dGVBc3luYzogJyArIGUpXG4gICAgY2FsbGJhY2soKVxuICB9IFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9nKHMpIHtcbiAgcmVxdWlyZSgncmVhZGxpbmUnKS5jdXJzb3JUbyhwcm9jZXNzLnN0ZG91dCwgMClcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLnN0ZG91dC5jbGVhckxpbmUoKVxuICB9XG4gIGNhdGNoKGUpIHt9XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHMpXG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9ndihvcHRpb25zLCBzKSB7XG4gIGlmIChvcHRpb25zLnZlcmJvc2UgPT0gJ3llcycpIHtcbiAgICByZXF1aXJlKCdyZWFkbGluZScpLmN1cnNvclRvKHByb2Nlc3Muc3Rkb3V0LCAwKVxuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC5jbGVhckxpbmUoKVxuICAgIH1cbiAgICBjYXRjaChlKSB7fVxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAtdmVyYm9zZTogJHtzfWApXG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRBcHAoKSB7XG4gIHZhciBjaGFsayA9IHJlcXVpcmUoJ2NoYWxrJylcbiAgdmFyIHByZWZpeCA9IGBgXG4gIGNvbnN0IHBsYXRmb3JtID0gcmVxdWlyZSgnb3MnKS5wbGF0Zm9ybSgpXG4gIGlmIChwbGF0Zm9ybSA9PSAnZGFyd2luJykgeyBwcmVmaXggPSBg4oS5IO+9omV4dO+9ozpgIH1cbiAgZWxzZSB7IHByZWZpeCA9IGBpIFtleHRdOmAgfVxuICByZXR1cm4gYCR7Y2hhbGsuZ3JlZW4ocHJlZml4KX0gYFxufVxuXG5leHBvcnQgZnVuY3Rpb24gX2dldFZlcnNpb25zKGFwcCwgcGx1Z2luTmFtZSwgZnJhbWV3b3JrTmFtZSkge1xuICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG4gIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKVxuXG4gIHZhciB2ID0ge31cbiAgdmFyIHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwnbm9kZV9tb2R1bGVzL0BzZW5jaGEnLCBwbHVnaW5OYW1lKVxuICB2YXIgcGx1Z2luUGtnID0gKGZzLmV4aXN0c1N5bmMocGx1Z2luUGF0aCsnL3BhY2thZ2UuanNvbicpICYmIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBsdWdpblBhdGgrJy9wYWNrYWdlLmpzb24nLCAndXRmLTgnKSkgfHwge30pO1xuICB2LnBsdWdpblZlcnNpb24gPSBwbHVnaW5Qa2cudmVyc2lvblxuICB2Ll9yZXNvbHZlZCA9IHBsdWdpblBrZy5fcmVzb2x2ZWRcbiAgaWYgKHYuX3Jlc29sdmVkID09IHVuZGVmaW5lZCkge1xuICAgIHYuZWRpdGlvbiA9IGBDb21tZXJjaWFsYFxuICB9XG4gIGVsc2Uge1xuICAgIGlmICgtMSA9PSB2Ll9yZXNvbHZlZC5pbmRleE9mKCdjb21tdW5pdHknKSkge1xuICAgICAgdi5lZGl0aW9uID0gYENvbW1lcmNpYWxgXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdi5lZGl0aW9uID0gYENvbW11bml0eWBcbiAgICB9XG4gIH1cblxuICB2YXIgd2VicGFja1BhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwnbm9kZV9tb2R1bGVzL3dlYnBhY2snKVxuICB2YXIgd2VicGFja1BrZyA9IChmcy5leGlzdHNTeW5jKHdlYnBhY2tQYXRoKycvcGFja2FnZS5qc29uJykgJiYgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMod2VicGFja1BhdGgrJy9wYWNrYWdlLmpzb24nLCAndXRmLTgnKSkgfHwge30pO1xuICB2LndlYnBhY2tWZXJzaW9uID0gd2VicGFja1BrZy52ZXJzaW9uXG5cbiAgdmFyIGV4dFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwnbm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0JylcbiAgdmFyIGV4dFBrZyA9IChmcy5leGlzdHNTeW5jKGV4dFBhdGgrJy9wYWNrYWdlLmpzb24nKSAmJiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhleHRQYXRoKycvcGFja2FnZS5qc29uJywgJ3V0Zi04JykpIHx8IHt9KTtcbiAgdi5leHRWZXJzaW9uID0gZXh0UGtnLnNlbmNoYS52ZXJzaW9uXG5cbiAgdmFyIGNtZFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSxgbm9kZV9tb2R1bGVzL0BzZW5jaGEvY21kYClcbiAgdmFyIGNtZFBrZyA9IChmcy5leGlzdHNTeW5jKGNtZFBhdGgrJy9wYWNrYWdlLmpzb24nKSAmJiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjbWRQYXRoKycvcGFja2FnZS5qc29uJywgJ3V0Zi04JykpIHx8IHt9KTtcbiAgdi5jbWRWZXJzaW9uID0gY21kUGtnLnZlcnNpb25fZnVsbFxuXG4gIGlmICh2LmNtZFZlcnNpb24gPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGNtZFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSxgbm9kZV9tb2R1bGVzL0BzZW5jaGEvJHtwbHVnaW5OYW1lfS9ub2RlX21vZHVsZXMvQHNlbmNoYS9jbWRgKVxuICAgIHZhciBjbWRQa2cgPSAoZnMuZXhpc3RzU3luYyhjbWRQYXRoKycvcGFja2FnZS5qc29uJykgJiYgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY21kUGF0aCsnL3BhY2thZ2UuanNvbicsICd1dGYtOCcpKSB8fCB7fSk7XG4gICAgdi5jbWRWZXJzaW9uID0gY21kUGtnLnZlcnNpb25fZnVsbFxuICB9XG5cbiAgdmFyIGZyYW1ld29ya0luZm8gPSAnJ1xuICAgaWYgKGZyYW1ld29ya05hbWUgIT0gdW5kZWZpbmVkICYmIGZyYW1ld29ya05hbWUgIT0gJ2V4dGpzJykge1xuICAgIHZhciBmcmFtZXdvcmtQYXRoID0gJydcbiAgICBpZiAoZnJhbWV3b3JrTmFtZSA9PSAncmVhY3QnKSB7XG4gICAgICBmcmFtZXdvcmtQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksJ25vZGVfbW9kdWxlcy9yZWFjdCcpXG4gICAgfVxuICAgIGlmIChmcmFtZXdvcmtOYW1lID09ICdhbmd1bGFyJykge1xuICAgICAgZnJhbWV3b3JrUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCdub2RlX21vZHVsZXMvQGFuZ3VsYXIvY29yZScpXG4gICAgfVxuICAgIHZhciBmcmFtZXdvcmtQa2cgPSAoZnMuZXhpc3RzU3luYyhmcmFtZXdvcmtQYXRoKycvcGFja2FnZS5qc29uJykgJiYgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZnJhbWV3b3JrUGF0aCsnL3BhY2thZ2UuanNvbicsICd1dGYtOCcpKSB8fCB7fSk7XG4gICAgdi5mcmFtZXdvcmtWZXJzaW9uID0gZnJhbWV3b3JrUGtnLnZlcnNpb25cbiAgICBmcmFtZXdvcmtJbmZvID0gJywgJyArIGZyYW1ld29ya05hbWUgKyAnIHYnICsgdi5mcmFtZXdvcmtWZXJzaW9uXG4gIH1cbiAgcmV0dXJuIGFwcCArICdleHQtd2VicGFjay1wbHVnaW4gdicgKyB2LnBsdWdpblZlcnNpb24gKyAnLCBFeHQgSlMgdicgKyB2LmV4dFZlcnNpb24gKyAnICcgKyB2LmVkaXRpb24gKyAnIEVkaXRpb24sIFNlbmNoYSBDbWQgdicgKyB2LmNtZFZlcnNpb24gKyAnLCB3ZWJwYWNrIHYnICsgdi53ZWJwYWNrVmVyc2lvbiArIGZyYW1ld29ya0luZm9cbiB9Il19
\ No newline at end of file
diff --git a/packages/ext-webpack-plugin-orig/dist/reactUtil.js b/packages/ext-webpack-plugin-orig/dist/reactUtil.js
deleted file mode 100644
index 57e2847..0000000
--- a/packages/ext-webpack-plugin-orig/dist/reactUtil.js
+++ /dev/null
@@ -1,195 +0,0 @@
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.getValidateOptions = getValidateOptions;
-exports.getDefaultOptions = getDefaultOptions;
-exports.getDefaultVars = getDefaultVars;
-exports.extractFromSource = extractFromSource;
-exports._done = _done;
-
-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() {
- return {
- watchStarted: false,
- firstTime: true,
- firstCompile: true,
- browserCount: 0,
- manifest: null,
- extPath: 'ext-react',
- pluginErrors: [],
- deps: [],
- rebuild: true
- };
-}
-
-function toXtype(str) {
- return str.toLowerCase().replace(/_/g, '-');
-}
-
-function extractFromSource(module, options, compilation) {
- try {
- var js = module._source._value;
-
- const logv = require('./pluginUtil').logv;
-
- logv(options, 'FUNCTION extractFromSource');
-
- var generate = require("@babel/generator").default;
-
- var parse = require("babylon").parse;
-
- var traverse = require("ast-traverse");
-
- const statements = [];
- const ast = parse(js, {
- plugins: ['jsx', 'flow', 'doExpressions', 'objectRestSpread', 'classProperties', 'exportExtensions', 'asyncGenerators', 'functionBind', 'functionSent', 'dynamicImport'],
- sourceType: 'module'
- });
-
- function addType(argNode) {
- var type;
-
- if (argNode.type === 'StringLiteral') {
- var xtype = toXtype(argNode.value);
-
- if (xtype != 'extreact') {
- type = {
- xtype: toXtype(argNode.value)
- };
- }
- } else {
- type = {
- xclass: js.slice(argNode.start, argNode.end)
- };
- }
-
- 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);
- }
-
- 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 [];
- }
-} //**********
-
-
-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);
- }
-}
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWFjdFV0aWwuanMiXSwibmFtZXMiOlsiZ2V0VmFsaWRhdGVPcHRpb25zIiwiZ2V0RGVmYXVsdE9wdGlvbnMiLCJwb3J0IiwiZW1pdCIsImJyb3dzZXIiLCJ3YXRjaCIsInByb2ZpbGUiLCJlbnZpcm9ubWVudCIsInZlcmJvc2UiLCJ0b29sa2l0IiwicGFja2FnZXMiLCJnZXREZWZhdWx0VmFycyIsIndhdGNoU3RhcnRlZCIsImZpcnN0VGltZSIsImZpcnN0Q29tcGlsZSIsImJyb3dzZXJDb3VudCIsIm1hbmlmZXN0IiwiZXh0UGF0aCIsInBsdWdpbkVycm9ycyIsImRlcHMiLCJyZWJ1aWxkIiwidG9YdHlwZSIsInN0ciIsInRvTG93ZXJDYXNlIiwicmVwbGFjZSIsImV4dHJhY3RGcm9tU291cmNlIiwibW9kdWxlIiwib3B0aW9ucyIsImNvbXBpbGF0aW9uIiwianMiLCJfc291cmNlIiwiX3ZhbHVlIiwibG9ndiIsInJlcXVpcmUiLCJnZW5lcmF0ZSIsImRlZmF1bHQiLCJwYXJzZSIsInRyYXZlcnNlIiwic3RhdGVtZW50cyIsImFzdCIsInBsdWdpbnMiLCJzb3VyY2VUeXBlIiwiYWRkVHlwZSIsImFyZ05vZGUiLCJ0eXBlIiwieHR5cGUiLCJ2YWx1ZSIsInhjbGFzcyIsInNsaWNlIiwic3RhcnQiLCJlbmQiLCJ1bmRlZmluZWQiLCJjb25maWciLCJKU09OIiwic3RyaW5naWZ5IiwicHVzaCIsInByZSIsIm5vZGUiLCJjYWxsZWUiLCJvYmplY3QiLCJuYW1lIiwiY29kZSIsImluaXQiLCJpIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidmFsdWVOb2RlIiwiZSIsImNvbnNvbGUiLCJsb2ciLCJyZXNvdXJjZSIsImVycm9ycyIsIl9kb25lIiwidmFycyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0FBRU8sU0FBU0Esa0JBQVQsR0FBOEI7QUFDbkMsU0FBTztBQUNMLFlBQVEsUUFESDtBQUVMLGtCQUFjO0FBQ1osbUJBQWU7QUFBQyxnQkFB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QUNGLEMsQ0FFRDs7O0FBQ08sU0FBU0ssS0FBVCxDQUFlQyxJQUFmLEVBQXFCOUMsT0FBckIsRUFBOEI7QUFDbkMsTUFBSTtBQUNGLFVBQU0wQyxHQUFHLEdBQUdwQyxPQUFPLENBQUMsY0FBRCxDQUFQLENBQXdCb0MsR0FBcEM7O0FBQ0EsVUFBTXJDLElBQUksR0FBR0MsT0FBTyxDQUFDLGNBQUQsQ0FBUCxDQUF3QkQsSUFBckM7O0FBQ0FBLElBQUFBLElBQUksQ0FBQ0wsT0FBRCxFQUFTLGdCQUFULENBQUo7O0FBRUEsUUFBSSxDQUNILENBREQsQ0FFQSxPQUFPd0MsQ0FBUCxFQUFVO0FBQ1JDLE1BQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZRixDQUFaO0FBQ0EsYUFBTyxFQUFQO0FBQ0Q7QUFDRixHQVhELENBWUEsT0FBTUEsQ0FBTixFQUFTO0FBQ1BsQyxJQUFBQSxPQUFPLENBQUMsY0FBRCxDQUFQLENBQXdCRCxJQUF4QixDQUE2QkwsT0FBN0IsRUFBcUN3QyxDQUFyQztBQUNEO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsaWRhdGVPcHRpb25zKCkge1xuICByZXR1cm4ge1xuICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuICAgIFwicHJvcGVydGllc1wiOiB7XG4gICAgICBcImZyYW1ld29ya1wiOiAgIHtcInR5cGVcIjogWyBcInN0cmluZ1wiIF19LFxuICAgICAgXCJ0b29sa2l0XCI6ICAgICB7XCJ0eXBlXCI6IFsgXCJzdHJpbmdcIiBdfSxcbiAgICAgIFwicG9ydFwiOiAgICAgICAge1widHlwZVwiOiBbIFwiaW50ZWdlclwiIF19LFxuICAgICAgXCJlbWl0XCI6ICAgICAgICB7XCJ0eXBlXCI6IFsgXCJib29sZWFuXCIgXX0sXG4gICAgICBcImJyb3dzZXJcIjogICAgIHtcInR5cGVcIjogWyBcImJvb2xlYW5cIiBdfSxcbiAgICAgIFwid2F0Y2hcIjogICAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcInByb2ZpbGVcIjogICAgIHtcInR5cGVcIjogWyBcInN0cmluZ1wiIF19LFxuICAgICAgXCJlbnZpcm9ubWVudFwiOiB7XCJ0eXBlXCI6IFsgXCJzdHJpbmdcIiBdfSxcbiAgICAgIFwidmVyYm9zZVwiOiAgICAge1widHlwZVwiOiBbIFwic3RyaW5nXCIgXX0sXG4gICAgICBcInRoZW1lXCI6ICAgICAgIHtcInR5cGVcIjogWyBcInN0cmluZ1wiIF19LFxuICAgICAgXCJ0cmVlc2hha2VcIjoge1widHlwZVwiOiBbIFwiYm9vbGVhblwiIF19LFxuICAgICAgXCJwYWNrYWdlc1wiOiAgICB7XCJ0eXBlXCI6IFsgXCJzdHJpbmdcIiwgXCJhcnJheVwiIF19XG4gICAgfSxcbiAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCI6IGZhbHNlXG4gICAgLy8gXCJlcnJvck1lc3NhZ2VcIjoge1xuICAgIC8vICAgXCJvcHRpb25cIjogXCJzaG91bGQgYmUge0Jvb2xlYW59IChodHRwczovZ2l0aHViLmNvbS9vcmcvcmVwbyNhbmNob3IpXCJcbiAgICAvLyB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCkge1xuICByZXR1cm4ge1xuICAgIHBvcnQ6IDE5NjIsXG4gICAgZW1pdDogdHJ1ZSxcbiAgICBicm93c2VyOiB0cnVlLFxuICAgIHdhdGNoOiAneWVzJyxcbiAgICBwcm9maWxlOiAnJywgXG4gICAgZW52aXJvbm1lbnQ6ICdkZXZlbG9wbWVudCcsIFxuICAgIHZlcmJvc2U6ICdubycsXG4gICAgdG9vbGtpdDogJ21vZGVybicsXG4gICAgcGFja2FnZXM6IG51bGxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFZhcnMoKSB7XG4gIHJldHVybiB7XG4gICAgd2F0Y2hTdGFydGVkIDogZmFsc2UsXG4gICAgZmlyc3RUaW1lIDogdHJ1ZSxcbiAgICBmaXJzdENvbXBpbGU6IHRydWUsXG4gICAgYnJvd3NlckNvdW50IDogMCxcbiAgICBtYW5pZmVzdDogbnVsbCxcbiAgICBleHRQYXRoOiAnZXh0LXJlYWN0JyxcbiAgICBwbHVnaW5FcnJvcnM6IFtdLFxuICAgIGRlcHM6IFtdLFxuICAgIHJlYnVpbGQ6IHRydWVcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1h0eXBlKHN0cikge1xuICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXy9nLCAnLScpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RnJvbVNvdXJjZShtb2R1bGUsIG9wdGlvbnMsIGNvbXBpbGF0aW9uKSB7XG4gIHRyeSB7XG4gICAgdmFyIGpzID0gbW9kdWxlLl9zb3VyY2UuX3ZhbHVlXG4gICAgY29uc3QgbG9ndiA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3ZcbiAgICBsb2d2KG9wdGlvbnMsJ0ZVTkNUSU9OIGV4dHJhY3RGcm9tU291cmNlJylcbiAgICB2YXIgZ2VuZXJhdGUgPSByZXF1aXJlKFwiQGJhYmVsL2dlbmVyYXRvclwiKS5kZWZhdWx0XG4gICAgdmFyIHBhcnNlID0gcmVxdWlyZShcImJhYnlsb25cIikucGFyc2VcbiAgICB2YXIgdHJhdmVyc2UgPSByZXF1aXJlKFwiYXN0LXRyYXZlcnNlXCIpXG4gICAgY29uc3Qgc3RhdGVtZW50cyA9IFtdXG4gICAgXG4gICAgY29uc3QgYXN0ID0gcGFyc2UoanMsIHtcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgJ2pzeCcsXG4gICAgICAgICdmbG93JyxcbiAgICAgICAgJ2RvRXhwcmVzc2lvbnMnLFxuICAgICAgICAnb2JqZWN0UmVzdFNwcmVhZCcsXG4gICAgICAgICdjbGFzc1Byb3BlcnRpZXMnLFxuICAgICAgICAnZXhwb3J0RXh0ZW5zaW9ucycsXG4gICAgICAgICdhc3luY0dlbmVyYXRvcnMnLFxuICAgICAgICAnZnVuY3Rpb25CaW5kJyxcbiAgICAgICAgJ2Z1bmN0aW9uU2VudCcsXG4gICAgICAgICdkeW5hbWljSW1wb3J0J1xuICAgICAgXSxcbiAgICAgIHNvdXJjZVR5cGU6ICdtb2R1bGUnXG4gICAgfSlcblxuICAgIGZ1bmN0aW9uIGFkZFR5cGUoYXJnTm9kZSkge1xuICAgICAgdmFyIHR5cGVcbiAgICAgIGlmIChhcmdOb2RlLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJykge1xuICAgICAgICB2YXIgeHR5cGUgPSB0b1h0eXBlKGFyZ05vZGUudmFsdWUpXG4gICAgICAgIGlmICh4dHlwZSAhPSAnZXh0cmVhY3QnKSB7XG4gICAgICAgICAgdHlwZSA9IHsgeHR5cGU6IHRvWHR5cGUoYXJnTm9kZS52YWx1ZSkgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0geyB4Y2xhc3M6IGpzLnNsaWNlKGFyZ05vZGUuc3RhcnQsIGFyZ05vZGUuZW5kKSB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGNvbmZpZyA9IEpTT04uc3RyaW5naWZ5KHR5cGUpXG4gICAgICAgIHN0YXRlbWVudHMucHVzaChgRXh0LmNyZWF0ZSgke2NvbmZpZ30pYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cmF2ZXJzZShhc3QsIHtcbiAgICAgIHByZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nXG4gICAgICAgICAgICAmJiBub2RlLmNhbGxlZVxuICAgICAgICAgICAgJiYgbm9kZS5jYWxsZWUub2JqZWN0XG4gICAgICAgICAgICAmJiBub2RlLmNhbGxlZS5vYmplY3QubmFtZSA9PT0gJ0V4dCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgc3RhdGVtZW50cy5wdXNoKGdlbmVyYXRlKG5vZGUpLmNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PSAnVmFyaWFibGVEZWNsYXJhdG9yJyBcbiAgICAgICAgICAgICYmIG5vZGUuaW5pdCBcbiAgICAgICAgICAgICYmIG5vZGUuaW5pdC50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nIFxuICAgICAgICAgICAgJiYgbm9kZS5pbml0LmNhbGxlZSBcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKG5vZGUuaW5pdC5jYWxsZWUubmFtZSA9PSAncmVhY3RpZnknKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuaW5pdC5hcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWVOb2RlID0gbm9kZS5pbml0LmFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgaWYgKCF2YWx1ZU5vZGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICBhZGRUeXBlKHZhbHVlTm9kZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAvLyBDb252ZXJ0IFJlYWN0LmNyZWF0ZUVsZW1lbnQoLi4uKSBjYWxscyB0byB0aGUgZXF1aXZhbGVudCBFeHQuY3JlYXRlKC4uLikgY2FsbHMgdG8gcHV0IGluIHRoZSBtYW5pZmVzdC5cbiAgICAgICAgLy8gaWYgKG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9ueCcgXG4gICAgICAgIC8vICAgICAmJiBub2RlLmNhbGxlZS5vYmplY3QgXG4gICAgICAgIC8vICAgICAmJiBub2RlLmNhbGxlZS5vYmplY3QubmFtZSA9PT0gJ1JlYWN0JyBcbiAgICAgICAgLy8gICAgICYmIG5vZGUuY2FsbGVlLnByb3BlcnR5Lm5hbWUgPT09ICdjcmVhdGVFbGVtZW50Jykge1xuICAgICAgICAvLyAgIGNvbnN0IFtwcm9wc10gPSBub2RlLmFyZ3VtZW50c1xuICAgICAgICAvLyAgIGxldCBjb25maWdcbiAgICAgICAgLy8gICBpZiAoQXJyYXkuaXNBcnJheShwcm9wcy5wcm9wZXJ0aWVzKSkge1xuICAgICAgICAvLyAgICAgY29uZmlnID0gZ2VuZXJhdGUocHJvcHMpLmNvZGVcbiAgICAgICAgLy8gICAgIGZvciAobGV0IGtleSBpbiB0eXBlKSB7XG4gICAgICAgIC8vICAgICAgIGNvbmZpZyA9IGB7XFxuICAke2tleX06ICcke3R5cGVba2V5XX0nLCR7Y29uZmlnLnNsaWNlKDEpfWBcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY29uZmlnID0gSlNPTi5zdHJpbmdpZnkodHlwZSlcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBzdGF0ZW1lbnRzXG4gIH1cbiAgY2F0Y2goZSkge1xuICAgIGNvbnNvbGUubG9nKG1vZHVsZS5yZXNvdXJjZSlcbiAgICBjb25zb2xlLmxvZyhqcylcbiAgICBjb25zb2xlLmxvZyhlKVxuICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCdleHRyYWN0RnJvbVNvdXJjZTogJyArIGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuLy8qKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gX2RvbmUodmFycywgb3B0aW9ucykge1xuICB0cnkge1xuICAgIGNvbnN0IGxvZyA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ1xuICAgIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gICAgbG9ndihvcHRpb25zLCdGVU5DVElPTiBfZG9uZScpXG5cbiAgICB0cnkge1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSlcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuICBjYXRjaChlKSB7XG4gICAgcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndihvcHRpb25zLGUpXG4gIH1cbn0iXX0=
\ No newline at end of file
diff --git a/packages/ext-webpack-plugin-orig/src/angularUtil.js b/packages/ext-webpack-plugin-orig/src/angularUtil.js
deleted file mode 100644
index f19c6e0..0000000
--- a/packages/ext-webpack-plugin-orig/src/angularUtil.js
+++ /dev/null
@@ -1,290 +0,0 @@
-"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() {
- return {
- watchStarted : false,
- firstTime : true,
- firstCompile: true,
- browserCount : 0,
- manifest: null,
- extPath: 'ext-angular',
- pluginErrors: [],
- deps: [],
- usedExtComponents: [],
- rebuild: true
- }
-}
-
-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})`)
- }
- }
- i += end
- }
- }
- }
- }
- }
- }
- })
-
- return statements
- }
- catch(e) {
- console.log(e)
- compilation.errors.push('extractFromSource: ' + e)
- return []
- }
-}
-
-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})
-}
-
-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)
-
- o = {}
- o.where = 'src/main.ts'
- o.from = `bootstrapModule( AppModule );`
- o.to = `enableProdMode();bootstrapModule(AppModule);`
- changeIt(o)
- }
- catch (e) {
- console.log(e)
- return []
- }
-}
-
-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 []
- }
-}
-
-
-export function _getAllComponents(vars, options) {
- const log = require('./pluginUtil').log
- const logv = require('./pluginUtil').logv
- logv(options,'FUNCTION _getAllComponents')
-
- 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)
- return []
- }
-}
-
-export function _writeFilesToProdFolder(vars, options) {
- const log = require('./pluginUtil').log
- const logv = require('./pluginUtil').logv
- logv(options,'FUNCTION _writeFilesToProdFolder')
-
- try {
- 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\":\"'
-
- 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) {
- console.log(e)
- return []
- }
-}
\ No newline at end of file
diff --git a/packages/ext-webpack-plugin-orig/src/index.js b/packages/ext-webpack-plugin-orig/src/index.js
deleted file mode 100644
index e000376..0000000
--- a/packages/ext-webpack-plugin-orig/src/index.js
+++ /dev/null
@@ -1,60 +0,0 @@
-'use strict'
-require('@babel/polyfill')
-const v = require('./pluginUtil').logv
-export default class ExtWebpackPlugin {
- constructor(options) {
- this.plugin = require(`./pluginUtil`)._constructor(options)
- }
-
- apply(compiler) {
- const vars = this.plugin.vars
- const options = this.plugin.options
- v(options,'FUNCTION apply')
- if (!compiler.hooks) {console.log('not webpack 4');return}
-
- compiler.hooks.thisCompilation.tap(`ext-this-compilation`, (compilation) => {
- v(options,'HOOK thisCompilation')
- if (vars.pluginErrors.length > 0) {
- compilation.errors.push( new Error(vars.pluginErrors.join("")) )
- }
- })
- 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`)
- })
- }
-}
diff --git a/packages/ext-webpack-plugin-orig/src/pluginUtil.js b/packages/ext-webpack-plugin-orig/src/pluginUtil.js
deleted file mode 100644
index 67284e6..0000000
--- a/packages/ext-webpack-plugin-orig/src/pluginUtil.js
+++ /dev/null
@@ -1,538 +0,0 @@
-//**********
-export function _constructor(options) {
- 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
- }
-
- 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'
- }
-
- 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 = { ...require(`./${thisVars.framework}Util`).getDefaultOptions(), ...options, ...rc }
- logv(options, `thisOptions - ${JSON.stringify(thisOptions)}`)
-
- if (thisOptions.environment == 'production')
- {thisVars.production = true}
- else
- {thisVars.production = false}
- 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)
- }
-
- plugin.vars = thisVars
- plugin.options = thisOptions
- require('./pluginUtil').logv(options, 'FUNCTION constructor (end)')
- return plugin
-}
-
-//**********
-export function _compilation(compiler, compilation, vars, options) {
- try {
- require('./pluginUtil').logv(options, 'FUNCTION _compilation')
-
- 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 (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)
- })
- }
-
- }
-
- if (
- (options.framework == 'angular' && options.treeshake == false) ||
- (options.framework == 'react')
- ) {
- 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')
-
- 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`)
- })
- }
- else {
- logv(options,'skipped HOOK ext-html-generation')
- }
- }
- catch(e) {
- require('./pluginUtil').logv(options,e)
- compilation.errors.push('_compilation: ' + e)
- }
-}
-
-//**********
-export function _afterCompile(compiler, compilation, vars, options) {
- require('./pluginUtil').logv(options, 'FUNCTION _afterCompile')
-}
-
-//**********
-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)
- }
- else {
- require(`./${framework}Util`)._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]
- }
- else {
- parms = ['app', command, '--web-server', 'false', 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, options)
- vars.watchStarted = true
- }
- callback()
- }
- else {
- callback()
- }
- }
- else {
- log(`${vars.app}FUNCTION emit not run`)
- callback()
- }
- }
- catch(e) {
- require('./pluginUtil').logv(options,e)
- compilation.errors.push('emit: ' + e)
- callback()
- }
-}
-
-//**********
-export function _prepareForBuild(app, vars, options, output, compilation) {
- try {
- logv(options,'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)
- if (vars.firstTime) {
- rimraf.sync(output)
- mkdirp.sync(output)
- const buildXML = require('./artifacts').buildXML
- 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(), ''))
- }
- 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(), ''))
- }
- 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(), ''))
- }
- 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(), ''))
- }
- }
- vars.firstTime = false
- var js = ''
- if (vars.production) {
- js = vars.deps.join(';\n');
- }
- else {
- js = 'Ext.require("Ext.*")'
- }
- if (vars.manifest === null || js !== vars.manifest) {
- vars.manifest = js
- const manifest = path.join(output, 'manifest.js')
- fs.writeFileSync(manifest, js, 'utf8')
- vars.rebuild = true
- var bundleDir = output.replace(process.cwd(), '')
- if (bundleDir.trim() == '') {bundleDir = './'}
- log(app + 'Building Ext bundle at: ' + bundleDir)
- }
- else {
- vars.rebuild = false
- log(app + 'Ext rebuild NOT needed')
- }
- }
- catch(e) {
- require('./pluginUtil').logv(options,e)
- compilation.errors.push('_prepareForBuild: ' + e)
- }
-}
-
-//**********
-export function _buildExtBundle(app, compilation, outputPath, parms, options) {
- try {
- const fs = require('fs')
- const logv = require('./pluginUtil').logv
- logv(options,'FUNCTION _buildExtBundle')
-
- let sencha; try { sencha = require('@sencha/cmd') } catch (e) { sencha = 'sencha' }
- if (fs.existsSync(sencha)) {
- logv(options,'sencha folder exists')
- }
- else {
- logv(options,'sencha folder DOES NOT exist')
- }
-
- 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) }
- )
- })
- }
- 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)
- }
-}
-
-//**********
-export async function executeAsync (app, command, parms, opts, compilation, options) {
- try {
- //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')
- await new Promise((resolve, reject) => {
- logv(options,`command - ${command}`)
- logv(options, `parms - ${parms}`)
- logv(options, `opts - ${JSON.stringify(opts)}`)
- let child = crossSpawn(command, parms, opts)
- child.on('close', (code, signal) => {
- logv(options, `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`)
- compilation.errors.push(error)
- resolve(0)
- })
- child.stdout.on('data', (data) => {
- var str = data.toString().replace(/\r?\n|\r/g, " ").trim()
- logv(options, `${str}`)
- if (data && data.toString().match(/Fashion waiting for changes\.\.\./)) {
- const fs = require('fs');
- var filename = process.cwd()+'/src/index.js';
- var data = fs.readFileSync(filename);
- fs.writeFileSync(filename, data + ' ', 'utf8')
- logv(options, `touching ${filename}`)
- resolve(0)
- }
- else {
- if (substrings.some(function(v) { return data.indexOf(v) >= 0; })) {
- str = str.replace("[INF]", "")
- str = str.replace("[LOG]", "")
- str = str.replace(process.cwd(), '').trim()
- if (str.includes("[ERR]")) {
- compilation.errors.push(app + str.replace(/^\[ERR\] /gi, ''));
- str = str.replace("[ERR]", `${chalk.red("[ERR]")}`)
- }
- log(`${app}${str}`)
- }
- }
- })
- child.stderr.on('data', (data) => {
- logv(options, `error on close: ` + data)
- var str = data.toString().replace(/\r?\n|\r/g, " ").trim()
- var strJavaOpts = "Picked up _JAVA_OPTIONS";
- var includes = str.includes(strJavaOpts)
- if (!includes) {
- console.log(`${app} ${chalk.red("[ERR]")} ${str}`)
- }
- })
- })
- }
- catch(e) {
- require('./pluginUtil').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')
-}
-
-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 _getApp() {
- var chalk = require('chalk')
- var prefix = ``
- const platform = require('os').platform()
- if (platform == 'darwin') { prefix = `ℹ 「ext」:` }
- else { prefix = `i [ext]:` }
- return `${chalk.green(prefix)} `
-}
-
-export function _getVersions(app, 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')) || {});
- v.pluginVersion = pluginPkg.version
- v._resolved = pluginPkg._resolved
- if (v._resolved == undefined) {
- v.edition = `Commercial`
- }
- else {
- if (-1 == v._resolved.indexOf('community')) {
- v.edition = `Commercial`
- }
- else {
- 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 = ''
- if (frameworkName == 'react') {
- frameworkPath = path.resolve(process.cwd(),'node_modules/react')
- }
- if (frameworkName == 'angular') {
- frameworkPath = path.resolve(process.cwd(),'node_modules/@angular/core')
- }
- var frameworkPkg = (fs.existsSync(frameworkPath+'/package.json') && JSON.parse(fs.readFileSync(frameworkPath+'/package.json', 'utf-8')) || {});
- 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
diff --git a/packages/ext-webpack-plugin/dist/angularUtil.js b/packages/ext-webpack-plugin/dist/angularUtil.js
new file mode 100644
index 0000000..0601284
--- /dev/null
+++ b/packages/ext-webpack-plugin/dist/angularUtil.js
@@ -0,0 +1,256 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports._getDefaultVars = _getDefaultVars;
+exports._extractFromSource = _extractFromSource;
+exports._toProd = _toProd;
+exports._toDev = _toDev;
+exports._getAllComponents = _getAllComponents;
+exports._writeFilesToProdFolder = _writeFilesToProdFolder;
+
+function _getDefaultVars() {
+ return {
+ touchFile: '/src/themer.ts',
+ watchStarted: false,
+ buildstep: '1 of 1',
+ firstTime: true,
+ firstCompile: true,
+ browserCount: 0,
+ manifest: null,
+ extPath: 'ext',
+ pluginErrors: [],
+ deps: [],
+ usedExtComponents: [],
+ rebuild: true
+ };
+}
+
+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;
+ }
+ }
+ }
+ }
+ }
+ }
+ });
+ return statements;
+}
+
+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.verbose, 'FUNCTION _toProd');
+
+ 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);
+ o = {};
+ o.where = 'src/main.ts';
+ o.from = `bootstrapModule( AppModule );`;
+ o.to = `enableProdMode();bootstrapModule(AppModule);`;
+ changeIt(o);
+}
+
+function _toDev(vars, options) {
+ const log = require('./pluginUtil').log;
+
+ const logv = require('./pluginUtil').logv;
+
+ 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);
+}
+
+function _getAllComponents(vars, options) {
+ const log = require('./pluginUtil').log;
+
+ const logv = require('./pluginUtil').logv;
+
+ logv(options.verbose, 'FUNCTION _getAllComponents');
+
+ const path = require('path');
+
+ const fsx = require('fs-extra'); // 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));
+ }
+ }
+ });
+ log(vars.app, `Writing all referenced ext-${options.framework} modules`);
+ return extComponents;
+}
+
+function _writeFilesToProdFolder(vars, options) {
+ const log = require('./pluginUtil').log;
+
+ const logv = require('./pluginUtil').logv;
+
+ logv(options.verbose, 'FUNCTION _writeFilesToProdFolder');
+
+ 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\":\"';
+ 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;
+ });
+}
+//# 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-webpack-plugin/dist/artifacts.js b/packages/ext-webpack-plugin/dist/artifacts.js
new file mode 100644
index 0000000..d348313
--- /dev/null
+++ b/packages/ext-webpack-plugin/dist/artifacts.js
@@ -0,0 +1,246 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.createAppJson = createAppJson;
+exports.createJSDOMEnvironment = createJSDOMEnvironment;
+exports.createWorkspaceJson = createWorkspaceJson;
+exports.extAngularModule = exports.buildXML = void 0;
+
+const buildXML = function (compress, options, output) {
+ const logv = require('./pluginUtil').logv;
+
+ logv(options, 'FUNCTION buildXML');
+ let compression = '';
+
+ if (compress) {
+ compression = `
+ then
+ fs
+ minify
+ -yui
+ -from=ext.js
+ -to=ext.js
+ `;
+ }
+
+ return `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`.trim();
+};
+
+exports.buildXML = buildXML;
+
+function createAppJson(theme, packages, toolkit, options, output) {
+ const logv = require('./pluginUtil').logv;
+
+ logv(options, 'FUNCTION createAppJson');
+
+ const fs = require('fs');
+
+ var isWindows = typeof process != 'undefined' && typeof process.platform != 'undefined' && !!process.platform.match(/^win/);
+ var pathDifference = output.substring(process.cwd().length);
+ var numberOfPaths = pathDifference.split(isWindows ? "\\" : "/").length - 1;
+ var nodeModulePath = '';
+
+ for (var i = 0; i < numberOfPaths; i++) {
+ nodeModulePath += "../";
+ }
+
+ const config = {
+ framework: "ext",
+ toolkit,
+ requires: packages,
+ "overrides": ["overrides", "jsdom-environment.js"],
+ // "language": {
+ // "js": {
+ // "output": "ES5"
+ // }
+ // },
+ "packages": {
+ "dir": [nodeModulePath + "node_modules/@sencha", nodeModulePath + toolkit + "/packages"]
+ },
+ output: {
+ base: '.',
+ resources: {
+ path: './resources',
+ shared: "./resources"
+ }
+ } // if theme is local add it as an additional package dir
+
+ };
+
+ if (fs.existsSync(theme)) {
+ const path = require('path');
+
+ const cjson = require('cjson');
+
+ const packageInfo = cjson.load(path.join(theme, 'package.json'));
+ config.theme = packageInfo.name;
+ config.packages.dir.push(path.resolve(theme));
+ } else {
+ config.theme = theme;
+ }
+
+ return JSON.stringify(config, null, 2);
+}
+
+function createJSDOMEnvironment(options, output) {
+ const logv = require('./pluginUtil').logv;
+
+ logv(options, 'FUNCTION createJSDOMEnvironment');
+ return 'window.Ext = Ext;';
+}
+
+function createWorkspaceJson(options, output) {
+ const logv = require('./pluginUtil').logv;
+
+ logv(options, 'FUNCTION createWorkspaceJson');
+ var isWindows = typeof process != 'undefined' && typeof process.platform != 'undefined' && !!process.platform.match(/^win/);
+ var pathDifference = output.substring(process.cwd().length);
+ var numberOfPaths = pathDifference.split(isWindows ? "\\" : "/").length - 1;
+ var nodeModulePath = '';
+
+ for (var i = 0; i < numberOfPaths; i++) {
+ nodeModulePath += "../";
+ }
+
+ logv(options, 'isWindows: ' + isWindows);
+ logv(options, 'output: ' + output);
+ logv(options, 'pathDifference: ' + pathDifference);
+ logv(options, 'numberOfPaths: ' + numberOfPaths);
+ logv(options, 'nodeModulePath: ' + nodeModulePath);
+ const config = {
+ "frameworks": {
+ "ext": nodeModulePath + "node_modules/@sencha/ext"
+ },
+ "build": {
+ "dir": "${workspace.dir}/" + nodeModulePath + "build"
+ },
+ "packages": {
+ "dir": ["${workspace.dir}/" + nodeModulePath + "ext-" + options.framework + "/packages/local", "${workspace.dir}/" + nodeModulePath + "ext-" + options.framework + "/packages", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-font-ios", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-base", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-base", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-ios", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-material", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-aria", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-neutral", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-classic", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-gray", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-crisp", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-crisp-touch", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-neptune", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-neptune-touch", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-triton", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-graphite", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-calendar", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-charts", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-d3", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-exporter", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-pivot", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-pivot-d3", "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-ux"],
+ "extract": "${workspace.dir}/" + nodeModulePath + "packages/remote"
+ }
+ };
+ return JSON.stringify(config, null, 2);
+}
+
+const extAngularModule = function (imports, exports, declarations) {
+ return `
+ import { NgModule } from '@angular/core';
+ ${imports}
+ @NgModule({
+ imports: [
+ ],
+ declarations: [
+ ${declarations} ],
+ exports: [
+ ${exports} ]
+ })
+ export class ExtAngularModule { }
+ `;
+};
+
+exports.extAngularModule = extAngularModule;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hcnRpZmFjdHMuanMiXSwibmFtZXMiOlsiYnVpbGRYTUwiLCJjb21wcmVzcyIsIm9wdGlvbnMiLCJvdXRwdXQiLCJsb2d2IiwicmVxdWlyZSIsImNvbXByZXNzaW9uIiwidHJpbSIsImNyZWF0ZUFwcEpzb24iLCJ0aGVtZSIsInBhY2thZ2VzIiwidG9vbGtpdCIsImZzIiwiaXNXaW5kb3dzIiwicHJvY2VzcyIsInBsYXRmb3JtIiwibWF0Y2giLCJwYXRoRGlmZmVyZW5jZSIsInN1YnN0cmluZyIsImN3ZCIsImxlbmd0aCIsIm51bWJlck9mUGF0aHMiLCJzcGxpdCIsIm5vZGVNb2R1bGVQYXRoIiwiaSIsImNvbmZpZyIsImZyYW1ld29yayIsInJlcXVpcmVzIiwiYmFzZSIsInJlc291cmNlcyIsInBhdGgiLCJzaGFyZWQiLCJleGlzdHNTeW5jIiwiY2pzb24iLCJwYWNrYWdlSW5mbyIsImxvYWQiLCJqb2luIiwibmFtZSIsImRpciIsInB1c2giLCJyZXNvbHZlIiwiSlNPTiIsInN0cmluZ2lmeSIsImNyZWF0ZUpTRE9NRW52aXJvbm1lbnQiLCJjcmVhdGVXb3Jrc3BhY2VKc29uIiwiZXh0QW5ndWxhck1vZHVsZSIsImltcG9ydHMiLCJleHBvcnRzIiwiZGVjbGFyYXRpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQU8sTUFBTUEsUUFBUSxHQUFHLFVBQVNDLFFBQVQsRUFBbUJDLE9BQW5CLEVBQTRCQyxNQUE1QixFQUFvQztBQUMxRCxRQUFNQyxJQUFJLEdBQUdDLE9BQU8sQ0FBQyxjQUFELENBQVAsQ0FBd0JELElBQXJDOztBQUNBQSxFQUFBQSxJQUFJLENBQUNGLE9BQUQsRUFBUyxtQkFBVCxDQUFKO0FBRUEsTUFBSUksV0FBVyxHQUFHLEVBQWxCOztBQUVBLE1BQUlMLFFBQUosRUFBYztBQUNaSyxJQUFBQSxXQUFXLEdBQUk7Ozs7Ozs7S0FBZjtBQVFEOztBQUVDLFNBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QkEsY0FBdEIsR0FBdUMsdURBakJsQyxFQWtCTCxzQkFBc0JBLGNBQXRCLEdBQXVDLHlEQWxCbEMsRUFtQkwsc0JBQXNCQSxjQUF0QixHQUF1QyxtQ0FuQmxDLEVBb0JMLHNCQUFzQkEsY0FBdEIsR0FBdUMsaUNBcEJsQyxFQXFCTCxzQkFBc0JBLGNBQXRCLEdBQXVDLDZCQXJCbEMsRUFzQkwsc0JBQXNCQSxjQUF0QixHQUF1QyxtQ0F0QmxDLEVBdUJMLHNCQUFzQkEsY0FBdEIsR0FBdUMsZ0NBdkJsQyxFQXdCTCxzQkFBc0JBLGNBQXRCLEdBQXVDLG1DQXhCbEMsRUF5Qkwsc0JBQXNCQSxjQUF0QixHQUF1Qyw2QkF6QmxDLENBREc7QUE0QlYsaUJBQVcsc0JBQXNCQSxjQUF0QixHQUF1QztBQTVCeEM7QUFQQyxHQUFmO0FBc0NBLFNBQU9rQixJQUFJLENBQUNDLFNBQUwsQ0FBZWpCLE1BQWYsRUFBdUIsSUFBdkIsRUFBNkIsQ0FBN0IsQ0FBUDtBQUNEOztBQUVNLE1BQU1vQixnQkFBZ0IsR0FBRyxVQUFTQyxPQUFULEVBQWtCQyxPQUFsQixFQUEyQkMsWUFBM0IsRUFBeUM7QUFDdkUsU0FBUTs7SUFFTkYsT0FBUTs7Ozs7SUFLUkUsWUFBYTs7SUFFYkQsT0FBUTs7O0dBVFY7QUFhRCxDQWRNIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGJ1aWxkWE1MID0gZnVuY3Rpb24oY29tcHJlc3MsIG9wdGlvbnMsIG91dHB1dCkge1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KG9wdGlvbnMsJ0ZVTkNUSU9OIGJ1aWxkWE1MJylcbiAgXG4gIGxldCBjb21wcmVzc2lvbiA9ICcnXG5cbiAgaWYgKGNvbXByZXNzKSB7XG4gICAgY29tcHJlc3Npb24gPSBgXG4gICAgICB0aGVuIFxuICAgICAgZnMgXG4gICAgICBtaW5pZnkgXG4gICAgICAgIC15dWkgXG4gICAgICAgIC1mcm9tPWV4dC5qcyBcbiAgICAgICAgLXRvPWV4dC5qc1xuICAgIGA7XG4gIH1cblxuICAgIHJldHVybiBgPHByb2plY3QgbmFtZT1cInNpbXBsZS1idWlsZFwiIGJhc2VkaXI9XCIuXCI+XG4gIDwhLS0gIGludGVybmFsbHksIHdhdGNoIGNhbGxzIHRoZSBpbml0IHRhcmdldCwgc28gbmVlZCB0byBoYXZlIG9uZSBoZXJlIC0tPlxuICA8dGFyZ2V0IG5hbWU9XCJpbml0XCIvPlxuICA8dGFyZ2V0IG5hbWU9XCJpbml0LWNtZFwiPlxuICAgIDx0YXNrZGVmICByZXNvdXJjZT1cImNvbS9zZW5jaGEvYW50L2FudGxpYi54bWxcIlxuICAgICAgICAgICAgICBjbGFzc3BhdGg9XCJcXCR7Y21kLmRpcn0vc2VuY2hhLmphclwiXG4gICAgICAgICAgICAgIGxvYWRlcnJlZj1cInNlbmNoYWxvYWRlclwiLz5cbiAgICA8eC1leHRlbmQtY2xhc3NwYXRoPlxuICAgICAgICA8amFyIHBhdGg9XCJcXCR7Y21kLmRpcn0vc2VuY2hhLmphclwiLz5cbiAgICA8L3gtZXh0ZW5kLWNsYXNzcGF0aD5cbiAgICA8eC1zZW5jaGEtaW5pdCBwcmVmaXg9XCJcIi8+XG4gICAgPHgtY29tcGlsZSByZWZpZD1cInRoZUNvbXBpbGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBkaXI9XCJcXCR7YmFzZWRpcn1cIlxuICAgICAgICAgICAgICAgICAgICAgIGluaXRPbmx5PVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdEFsbD1cInRydWVcIj5cbiAgICAgICAgICAgICAgPCFbQ0RBVEFbXG4gICAgICAgICAgICAgIC1jbGFzc3BhdGg9XFwke2Jhc2VkaXJ9L21hbmlmZXN0LmpzXG4gICAgICAgICAgICAgIGxvYWQtYXBwXG4gICAgICAgICAgICAgICAgICAtdGVtcD1cXCR7YmFzZWRpcn0vdGVtcFxuICAgICAgICAgICAgICAgICAgLXRhZz1BcHBcbiAgICAgICAgXV0+XG4gICAgICA8L3gtY29tcGlsZT5cbiAgPC90YXJnZXQ+XG4gIDx0YXJnZXQgbmFtZT1cInJlYnVpbGRcIj5cbiAgICA8eC1jb21waWxlIHJlZmlkPVwidGhlQ29tcGlsZXJcIlxuICAgICAgICAgICAgICBkaXI9XCJcXCR7YmFzZWRpcn1cIlxuICAgICAgICAgICAgICBpbmhlcml0QWxsPVwidHJ1ZVwiPlxuICAgICAgPCFbQ0RBVEFbXG4gICAgICAtLWRlYnVnXG4gICAgICBleGNsdWRlXG4gICAgICAtYWxsXG4gICAgICBhbmRcbiAgICAgIGluY2x1ZGVcbiAgICAgIC1mPUJvb3QuanNcbiAgICAgIGFuZFxuICAgICAgY29uY2F0ZW5hdGVcbiAgICAgICAgICBleHQuanNcbiAgICAgIGFuZFxuICAgICAgZXhjbHVkZVxuICAgICAgLWFsbFxuICAgICAgYW5kXG4gICAgICAjIGluY2x1ZGUgdGhlbWUgb3ZlcnJpZGVzXG4gICAgICBpbmNsdWRlXG4gICAgICAgIC1yXG4gICAgICAgIC10YWc9b3ZlcnJpZGVzXG4gICAgICBhbmRcbiAgICAgICMgaW5jbHVkZSBhbGwganMgZmlsZXMgbmVlZGVkIGZvciBtYW5pZmVzdC5qc1xuICAgICAgaW5jbHVkZVxuICAgICAgICAgIC1yXG4gICAgICAgICAgLWY9bWFuaWZlc3QuanNcbiAgICAgIGFuZFxuICAgICAgIyBleGNsdWRlIHRoZSBnZW5lcmF0ZWQgbWFuaWZlc3QgZmlsZSBpdHNlbGYsXG4gICAgICAjIHNpbmNlIHdlIGRvbid0IHdhbnQgdGhlIGdlbmVyYXRlZCBidW5kbGUgZmlsZSB0byBjcmVhdGUgYW55IGNvbXBvbmVudHNcbiAgICAgIGV4Y2x1ZGVcbiAgICAgIC1mPW1hbmlmZXN0LmpzXG4gICAgICBhbmRcbiAgICAgIGNvbmNhdGVuYXRlXG4gICAgICArYXBwZW5kXG4gICAgICAgICAgZXh0LmpzXG4gICAgICBhbmRcbiAgICAgIHNjc3NcbiAgICAgICAgICAtYXBwTmFtZT1BcHBcbiAgICAgICAgICAtaW1hZ2VTZWFyY2hQYXRoPXJlc291cmNlc1xuICAgICAgICAgIC10aGVtZU5hbWU9dHJpdG9uXG4gICAgICAgICAgLXJlc291cmNlTWFwQmFzZT0uXG4gICAgICAgICAgLW91dHB1dD1leHQuc2Nzc1xuICAgICAgYW5kXG4gICAgICByZXNvdXJjZXNcbiAgICAgICAgICAtZXhjbHVkZXM9LWFsbCouY3NzXG4gICAgICAgICAgLW91dD1yZXNvdXJjZXNcbiAgICAgIGFuZFxuICAgICAgcmVzb3VyY2VzXG4gICAgICAgICAgLW1vZGVsPXRydWVcbiAgICAgICAgICAtb3V0PXJlc291cmNlc1xuICAgICAgXV0+XG4gICAgPC94LWNvbXBpbGU+XG4gIDwvdGFyZ2V0PlxuICA8dGFyZ2V0IG5hbWU9XCJidWlsZFwiIGRlcGVuZHM9XCJpbml0LWNtZCxyZWJ1aWxkXCI+XG4gICAgPHgtc2VuY2hhLWNvbW1hbmQgZGlyPVwiXFwke2Jhc2VkaXJ9XCI+XG4gICAgICA8IVtDREFUQVtcbiAgICAgIGZhc2hpb25cbiAgICAgICAgICAtcHdkPS5cbiAgICAgICAgICAtc3BsaXQ9NDA5NVxuICAgICAgICAgICR7Y29tcHJlc3MgPyAnLWNvbXByZXNzJyA6ICcnfVxuICAgICAgICAgICAgICBleHQuc2Nzc1xuICAgICAgICAgIGV4dC5jc3NcbiAgICAgICR7Y29tcHJlc3Npb259XG4gICAgICBdXT5cbiAgICA8L3gtc2VuY2hhLWNvbW1hbmQ+XG4gIDwvdGFyZ2V0PlxuICA8dGFyZ2V0IG5hbWU9XCJ3YXRjaFwiIGRlcGVuZHM9XCJpbml0LWNtZCxidWlsZFwiPlxuICAgIDx4LWZhc2hpb24td2F0Y2hcbiAgICAgIHJlZk5hbWU9XCJmYXNoaW9uLXdhdGNoXCJcbiAgICAgIGlucHV0RmlsZT1cImV4dC5zY3NzXCJcbiAgICAgIG91dHB1dEZpbGU9XCJleHQuY3NzXCJcbiAgICAgIHNwbGl0PVwiNDA5NVwiXG4gICAgICBjb21wcmVzcz1cIiR7Y29tcHJlc3MgPyAndHJ1ZScgOiAnZmFsc2UnfVwiXG4gICAgICBjb25maWdGaWxlPVwiYXBwLmpzb25cIlxuICAgICAgZm9yaz1cInRydWVcIi8+XG4gICAgPHgtd2F0Y2ggY29tcGlsZXJSZWY9XCJ0aGVDb21waWxlclwiIHRhcmdldHM9XCJyZWJ1aWxkXCIvPlxuICA8L3RhcmdldD5cbjwvcHJvamVjdD5cbmAudHJpbSgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcHBKc29uKCB0aGVtZSwgcGFja2FnZXMsIHRvb2xraXQsIG9wdGlvbnMsIG91dHB1dCApIHtcbiAgY29uc3QgbG9ndiA9IHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3ZcbiAgbG9ndihvcHRpb25zLCdGVU5DVElPTiBjcmVhdGVBcHBKc29uJylcblxuICBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJylcblxuICB2YXIgaXNXaW5kb3dzID0gdHlwZW9mIHByb2Nlc3MgIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHByb2Nlc3MucGxhdGZvcm0gIT0gJ3VuZGVmaW5lZCcgJiYgISFwcm9jZXNzLnBsYXRmb3JtLm1hdGNoKC9ed2luLyk7XG4gIHZhciBwYXRoRGlmZmVyZW5jZSA9IG91dHB1dC5zdWJzdHJpbmcocHJvY2Vzcy5jd2QoKS5sZW5ndGgpXG4gIHZhciBudW1iZXJPZlBhdGhzID0gcGF0aERpZmZlcmVuY2Uuc3BsaXQoaXNXaW5kb3dzID8gXCJcXFxcXCIgOiBcIi9cIikubGVuZ3RoIC0gMTtcbiAgdmFyIG5vZGVNb2R1bGVQYXRoID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1iZXJPZlBhdGhzOyBpKyspIHsgXG4gICAgbm9kZU1vZHVsZVBhdGggKz0gXCIuLi9cIlxuICB9XG5cbiAgY29uc3QgY29uZmlnID0ge1xuICAgIGZyYW1ld29yazogXCJleHRcIixcbiAgICB0b29sa2l0LFxuICAgIHJlcXVpcmVzOiBwYWNrYWdlcyxcbiAgICBcIm92ZXJyaWRlc1wiOiBbXG4gICAgICBcIm92ZXJyaWRlc1wiLFxuICAgICAgXCJqc2RvbS1lbnZpcm9ubWVudC5qc1wiXG4gICAgXSxcbiAgICAvLyBcImxhbmd1YWdlXCI6IHtcbiAgICAvLyAgIFwianNcIjoge1xuICAgIC8vICAgICBcIm91dHB1dFwiOiBcIkVTNVwiXG4gICAgLy8gICB9XG4gICAgLy8gfSxcbiAgICBcInBhY2thZ2VzXCI6IHtcbiAgICAgIFwiZGlyXCI6IFtcbiAgICAgICAgbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhXCIsXG4gICAgICAgIG5vZGVNb2R1bGVQYXRoICsgdG9vbGtpdCArIFwiL3BhY2thZ2VzXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIG91dHB1dDoge1xuICAgICAgYmFzZTogJy4nLFxuICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgIHBhdGg6ICcuL3Jlc291cmNlcycsXG4gICAgICAgIHNoYXJlZDogXCIuL3Jlc291cmNlc1wiXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlbWUgaXMgbG9jYWwgYWRkIGl0IGFzIGFuIGFkZGl0aW9uYWwgcGFja2FnZSBkaXJcbiAgaWYgKGZzLmV4aXN0c1N5bmModGhlbWUpKSB7XG4gICAgICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG4gICAgICBjb25zdCBjanNvbiA9IHJlcXVpcmUoJ2Nqc29uJylcbiAgICAgIGNvbnN0IHBhY2thZ2VJbmZvID0gY2pzb24ubG9hZChwYXRoLmpvaW4odGhlbWUsICdwYWNrYWdlLmpzb24nKSk7XG4gICAgICBjb25maWcudGhlbWUgPSBwYWNrYWdlSW5mby5uYW1lO1xuICAgICAgY29uZmlnLnBhY2thZ2VzLmRpci5wdXNoKHBhdGgucmVzb2x2ZSh0aGVtZSkpO1xuICB9IGVsc2Uge1xuICAgICAgY29uZmlnLnRoZW1lID0gdGhlbWU7XG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUpTRE9NRW52aXJvbm1lbnQob3B0aW9ucywgb3V0cHV0KSB7XG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucywnRlVOQ1RJT04gY3JlYXRlSlNET01FbnZpcm9ubWVudCcpXG5cbiAgcmV0dXJuICd3aW5kb3cuRXh0ID0gRXh0Oydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdvcmtzcGFjZUpzb24ob3B0aW9ucywgb3V0cHV0KSB7XG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucywnRlVOQ1RJT04gY3JlYXRlV29ya3NwYWNlSnNvbicpXG5cbiAgdmFyIGlzV2luZG93cyA9IHR5cGVvZiBwcm9jZXNzICE9ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9jZXNzLnBsYXRmb3JtICE9ICd1bmRlZmluZWQnICYmICEhcHJvY2Vzcy5wbGF0Zm9ybS5tYXRjaCgvXndpbi8pO1xuICB2YXIgcGF0aERpZmZlcmVuY2UgPSBvdXRwdXQuc3Vic3RyaW5nKHByb2Nlc3MuY3dkKCkubGVuZ3RoKVxuICB2YXIgbnVtYmVyT2ZQYXRocyA9IHBhdGhEaWZmZXJlbmNlLnNwbGl0KGlzV2luZG93cyA/IFwiXFxcXFwiIDogXCIvXCIpLmxlbmd0aCAtIDE7XG4gIHZhciBub2RlTW9kdWxlUGF0aCA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtYmVyT2ZQYXRoczsgaSsrKSB7IFxuICAgIG5vZGVNb2R1bGVQYXRoICs9IFwiLi4vXCJcbiAgfVxuXG4gIGxvZ3Yob3B0aW9ucywnaXNXaW5kb3dzOiAnICsgaXNXaW5kb3dzKVxuICBsb2d2KG9wdGlvbnMsJ291dHB1dDogJyArIG91dHB1dClcbiAgbG9ndihvcHRpb25zLCdwYXRoRGlmZmVyZW5jZTogJyArIHBhdGhEaWZmZXJlbmNlKVxuICBsb2d2KG9wdGlvbnMsJ251bWJlck9mUGF0aHM6ICcgKyBudW1iZXJPZlBhdGhzKVxuICBsb2d2KG9wdGlvbnMsJ25vZGVNb2R1bGVQYXRoOiAnICsgbm9kZU1vZHVsZVBhdGgpXG5cblxuXG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICBcImZyYW1ld29ya3NcIjoge1xuICAgICAgXCJleHRcIjogbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dFwiXG4gICAgfSxcbiAgICBcImJ1aWxkXCI6IHtcbiAgICAgIFwiZGlyXCI6IFwiJHt3b3Jrc3BhY2UuZGlyfS9cIiArIG5vZGVNb2R1bGVQYXRoICsgXCJidWlsZFwiXG4gICAgfSxcbiAgICBcInBhY2thZ2VzXCI6IHtcbiAgICAgIFwiZGlyXCI6IFtcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcImV4dC1cIiArIG9wdGlvbnMuZnJhbWV3b3JrICsgXCIvcGFja2FnZXMvbG9jYWxcIixcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcImV4dC1cIiArIG9wdGlvbnMuZnJhbWV3b3JrICsgXCIvcGFja2FnZXNcIixcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhXCIsXG4gICAgICAgIFwiJHt3b3Jrc3BhY2UuZGlyfS9cIiArIG5vZGVNb2R1bGVQYXRoICsgXCJub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtZm9udC1pb3NcIixcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC0ke3Rvb2xraXQubmFtZX0tdGhlbWUtYmFzZVwiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LSR7dG9vbGtpdC5uYW1lfS10aGVtZS1iYXNlXCIsXG4gICAgICAgIFwiJHt3b3Jrc3BhY2UuZGlyfS9cIiArIG5vZGVNb2R1bGVQYXRoICsgXCJub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtJHt0b29sa2l0Lm5hbWV9LXRoZW1lLWlvc1wiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LSR7dG9vbGtpdC5uYW1lfS10aGVtZS1tYXRlcmlhbFwiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LSR7dG9vbGtpdC5uYW1lfS10aGVtZS1hcmlhXCIsXG4gICAgICAgIFwiJHt3b3Jrc3BhY2UuZGlyfS9cIiArIG5vZGVNb2R1bGVQYXRoICsgXCJub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtJHt0b29sa2l0Lm5hbWV9LXRoZW1lLW5ldXRyYWxcIixcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC0ke3Rvb2xraXQubmFtZX0tdGhlbWUtY2xhc3NpY1wiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LSR7dG9vbGtpdC5uYW1lfS10aGVtZS1ncmF5XCIsXG4gICAgICAgIFwiJHt3b3Jrc3BhY2UuZGlyfS9cIiArIG5vZGVNb2R1bGVQYXRoICsgXCJub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtJHt0b29sa2l0Lm5hbWV9LXRoZW1lLWNyaXNwXCIsXG4gICAgICAgIFwiJHt3b3Jrc3BhY2UuZGlyfS9cIiArIG5vZGVNb2R1bGVQYXRoICsgXCJub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtJHt0b29sa2l0Lm5hbWV9LXRoZW1lLWNyaXNwLXRvdWNoXCIsXG4gICAgICAgIFwiJHt3b3Jrc3BhY2UuZGlyfS9cIiArIG5vZGVNb2R1bGVQYXRoICsgXCJub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtJHt0b29sa2l0Lm5hbWV9LXRoZW1lLW5lcHR1bmVcIixcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC0ke3Rvb2xraXQubmFtZX0tdGhlbWUtbmVwdHVuZS10b3VjaFwiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LSR7dG9vbGtpdC5uYW1lfS10aGVtZS10cml0b25cIixcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC0ke3Rvb2xraXQubmFtZX0tdGhlbWUtZ3JhcGhpdGVcIixcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC1jYWxlbmRhclwiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LWNoYXJ0c1wiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LWQzXCIsXG4gICAgICAgIFwiJHt3b3Jrc3BhY2UuZGlyfS9cIiArIG5vZGVNb2R1bGVQYXRoICsgXCJub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtZXhwb3J0ZXJcIixcbiAgICAgICAgXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcIm5vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC1waXZvdFwiLFxuICAgICAgICBcIiR7d29ya3NwYWNlLmRpcn0vXCIgKyBub2RlTW9kdWxlUGF0aCArIFwibm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LXBpdm90LWQzXCIsXG4gICAgICAgIFwiJHt3b3Jrc3BhY2UuZGlyfS9cIiArIG5vZGVNb2R1bGVQYXRoICsgXCJub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtdXhcIixcbiAgICAgIF0sXG4gICAgICBcImV4dHJhY3RcIjogXCIke3dvcmtzcGFjZS5kaXJ9L1wiICsgbm9kZU1vZHVsZVBhdGggKyBcInBhY2thZ2VzL3JlbW90ZVwiXG4gICAgfVxuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpXG59XG5cbmV4cG9ydCBjb25zdCBleHRBbmd1bGFyTW9kdWxlID0gZnVuY3Rpb24oaW1wb3J0cywgZXhwb3J0cywgZGVjbGFyYXRpb25zKSB7XG4gIHJldHVybiBgXG4gIGltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gICR7aW1wb3J0c31cbiAgQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbXG4gICAgXSxcbiAgICBkZWNsYXJhdGlvbnM6IFtcbiAgJHtkZWNsYXJhdGlvbnN9ICBdLFxuICAgIGV4cG9ydHM6IFtcbiAgJHtleHBvcnRzfSAgXVxuICB9KVxuICBleHBvcnQgY2xhc3MgRXh0QW5ndWxhck1vZHVsZSB7IH1cbiAgYFxufVxuIl19
\ No newline at end of file
diff --git a/packages/ext-webpack-plugin/dist/componentsUtil.js b/packages/ext-webpack-plugin/dist/componentsUtil.js
new file mode 100644
index 0000000..2e0aa80
--- /dev/null
+++ b/packages/ext-webpack-plugin/dist/componentsUtil.js
@@ -0,0 +1,86 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports._getDefaultVars = _getDefaultVars;
+exports._extractFromSource = _extractFromSource;
+exports._toProd = _toProd;
+exports._toDev = _toDev;
+exports._getAllComponents = _getAllComponents;
+exports._writeFilesToProdFolder = _writeFilesToProdFolder;
+
+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
+ };
+}
+
+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 [];
+ }
+}
+
+function _toProd(vars, options) {
+ const logv = require('./pluginUtil').logv;
+
+ logv(options.verbose, 'FUNCTION _toProd (empty');
+
+ try {} catch (e) {
+ console.log(e);
+ return [];
+ }
+}
+
+function _toDev(vars, options) {
+ try {} catch (e) {
+ console.log(e);
+ return [];
+ }
+}
+
+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 [];
+ }
+}
+
+function _writeFilesToProdFolder(vars, options) {
+ const logv = require('./pluginUtil').logv;
+
+ logv(options.verbose, 'FUNCTION _writeFilesToProdFolder (empty)');
+
+ try {} catch (e) {
+ console.log(e);
+ }
+}
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnRzVXRpbC5qcyJdLCJuYW1lcyI6WyJfZ2V0RGVmYXVsdFZhcnMiLCJ0b3VjaEZpbGUiLCJ3YXRjaFN0YXJ0ZWQiLCJidWlsZHN0ZXAiLCJmaXJzdFRpbWUiLCJmaXJzdENvbXBpbGUiLCJicm93c2VyQ291bnQiLCJtYW5pZmVzdCIsImV4dFBhdGgiLCJwbHVnaW5FcnJvcnMiLCJkZXBzIiwidXNlZEV4dENvbXBvbmVudHMiLCJyZWJ1aWxkIiwiX2V4dHJhY3RGcm9tU291cmNlIiwibW9kdWxlIiwib3B0aW9ucyIsImNvbXBpbGF0aW9uIiwiZXh0Q29tcG9uZW50cyIsImxvZ3YiLCJyZXF1aXJlIiwidmVyYm9zZSIsInN0YXRlbWVudHMiLCJlIiwiY29uc29sZSIsImxvZyIsImVycm9ycyIsInB1c2giLCJfdG9Qcm9kIiwidmFycyIsIl90b0RldiIsIl9nZXRBbGxDb21wb25lbnRzIiwiX3dyaXRlRmlsZXNUb1Byb2RGb2xkZXIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7QUFFTyxTQUFTQSxlQUFULEdBQTJCO0FBQ2hDLFNBQU87QUFDTEMsSUFBQUEsU0FBUyxFQUFFLGdCQUROO0FBRUxDLElBQUFBLFlBQVksRUFBRyxLQUZWO0FBR0xDLElBQUFBLFNBQVMsRUFBRSxRQUhOO0FBSUxDLElBQUFBLFNBQVMsRUFBRyxJQUpQO0FBS0xDLElBQUFBLFlBQVksRUFBRSxJQUxUO0FBTUxDLElBQUFBLFlBQVksRUFBRyxDQU5WO0FBT0xDLElBQUFBLFFBQVEsRUFBRSxJQVBMO0FBUUxDLElBQUFBLE9BQU8sRUFBRSxLQVJKO0FBU0xDLElBQUFBLFlBQVksRUFBRSxFQVRUO0FBVUxDLElBQUFBLElBQUksRUFBRSxFQVZEO0FBV0xDLElBQUFBLGlCQUFpQixFQUFFLEVBWGQ7QUFZTEMsSUFBQUEsT0FBTyxFQUFFO0FBWkosR0FBUDtBQWNEOztBQUVNLFNBQVNDLGtCQUFULENBQTRCQyxNQUE1QixFQUFvQ0MsT0FBcEMsRUFBNkNDLFdBQTdDLEVBQTBEQyxhQUExRCxFQUF5RTtBQUM5RSxRQUFNQyxJQUFJLEdBQUdDLE9BQU8sQ0FBQyxjQUFELENBQVAsQ0FBd0JELElBQXJDOztBQUNBQSxFQUFBQSxJQUFJLENBQUNILE9BQU8sQ0FBQ0ssT0FBVCxFQUFpQixxQ0FBakIsQ0FBSjs7QUFDQSxNQUFJO0FBQ0YsUUFBSUMsVUFBVSxHQUFHLENBQ2Ysc0JBRGUsQ0FBakI7QUFHQSxXQUFPQSxVQUFQO0FBQ0QsR0FMRCxDQU1BLE9BQU1DLENBQU4sRUFBUztBQUNQQyxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWUYsQ0FBWjtBQUNBTixJQUFBQSxXQUFXLENBQUNTLE1BQVosQ0FBbUJDLElBQW5CLENBQXdCLHdCQUF3QkosQ0FBaEQ7QUFDQSxXQUFPLEVBQVA7QUFDRDtBQUNGOztBQUVNLFNBQVNLLE9BQVQsQ0FBaUJDLElBQWpCLEVBQXVCYixPQUF2QixFQUFnQztBQUNyQyxRQUFNRyxJQUFJLEdBQUdDLE9BQU8sQ0FBQyxjQUFELENBQVAsQ0FBd0JELElBQXJDOztBQUNBQSxFQUFBQSxJQUFJLENBQUNILE9BQU8sQ0FBQ0ssT0FBVCxFQUFpQix5QkFBakIsQ0FBSjs7QUFDQSxNQUFJLENBQ0gsQ0FERCxDQUVBLE9BQU9FLENBQVAsRUFBVTtBQUNSQyxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWUYsQ0FBWjtBQUNBLFdBQU8sRUFBUDtBQUNEO0FBQ0Y7O0FBRU0sU0FBU08sTUFBVCxDQUFnQkQsSUFBaEIsRUFBc0JiLE9BQXRCLEVBQStCO0FBQ3BDLE1BQUksQ0FDSCxDQURELENBRUEsT0FBT08sQ0FBUCxFQUFVO0FBQ1JDLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZRixDQUFaO0FBQ0EsV0FBTyxFQUFQO0FBQ0Q7QUFDRjs7QUFFTSxTQUFTUSxpQkFBVCxDQUEyQkYsSUFBM0IsRUFBaUNiLE9BQWpDLEVBQTBDO0FBQzlDLFFBQU1HLElBQUksR0FBR0MsT0FBTyxDQUFDLGNBQUQsQ0FBUCxDQUF3QkQsSUFBckM7O0FBQ0RBLEVBQUFBLElBQUksQ0FBQ0gsT0FBTyxDQUFDSyxPQUFULEVBQWlCLG9DQUFqQixDQUFKOztBQUNBLE1BQUk7QUFDRixRQUFJSCxhQUFhLEdBQUcsRUFBcEI7QUFDQyxXQUFPQSxhQUFQO0FBQ0YsR0FIRCxDQUlBLE9BQU9LLENBQVAsRUFBVTtBQUNSQyxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWUYsQ0FBWjtBQUNBLFdBQU8sRUFBUDtBQUNEO0FBQ0Y7O0FBRU0sU0FBU1MsdUJBQVQsQ0FBaUNILElBQWpDLEVBQXVDYixPQUF2QyxFQUFnRDtBQUNyRCxRQUFNRyxJQUFJLEdBQUdDLE9BQU8sQ0FBQyxjQUFELENBQVAsQ0FBd0JELElBQXJDOztBQUNBQSxFQUFBQSxJQUFJLENBQUNILE9BQU8sQ0FBQ0ssT0FBVCxFQUFpQiwwQ0FBakIsQ0FBSjs7QUFDQSxNQUFJLENBQ0gsQ0FERCxDQUVBLE9BQU9FLENBQVAsRUFBVTtBQUNSQyxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWUYsQ0FBWjtBQUNEO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5leHBvcnQgZnVuY3Rpb24gX2dldERlZmF1bHRWYXJzKCkge1xuICByZXR1cm4ge1xuICAgIHRvdWNoRmlsZTogJy9zcmMvdGhlbWVyLmpzJyxcbiAgICB3YXRjaFN0YXJ0ZWQgOiBmYWxzZSxcbiAgICBidWlsZHN0ZXA6ICcxIG9mIDEnLFxuICAgIGZpcnN0VGltZSA6IHRydWUsXG4gICAgZmlyc3RDb21waWxlOiB0cnVlLFxuICAgIGJyb3dzZXJDb3VudCA6IDAsXG4gICAgbWFuaWZlc3Q6IG51bGwsXG4gICAgZXh0UGF0aDogJ2V4dCcsXG4gICAgcGx1Z2luRXJyb3JzOiBbXSxcbiAgICBkZXBzOiBbXSxcbiAgICB1c2VkRXh0Q29tcG9uZW50czogW10sXG4gICAgcmVidWlsZDogdHJ1ZVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZXh0cmFjdEZyb21Tb3VyY2UobW9kdWxlLCBvcHRpb25zLCBjb21waWxhdGlvbiwgZXh0Q29tcG9uZW50cykge1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KG9wdGlvbnMudmVyYm9zZSwnRlVOQ1RJT04gX2V4dHJhY3RGcm9tU291cmNlIChlbXB0eSknKVxuICB0cnkge1xuICAgIHZhciBzdGF0ZW1lbnRzID0gW1xuICAgICAgJ0V4dC5yZXF1aXJlKFwiRXh0LipcIiknLFxuICAgIF1cbiAgICByZXR1cm4gc3RhdGVtZW50c1xuICB9XG4gIGNhdGNoKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKVxuICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCdleHRyYWN0RnJvbVNvdXJjZTogJyArIGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF90b1Byb2QodmFycywgb3B0aW9ucykge1xuICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KG9wdGlvbnMudmVyYm9zZSwnRlVOQ1RJT04gX3RvUHJvZCAoZW1wdHknKVxuICB0cnkge1xuICB9XG4gIGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coZSlcbiAgICByZXR1cm4gW11cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX3RvRGV2KHZhcnMsIG9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKGUpXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRBbGxDb21wb25lbnRzKHZhcnMsIG9wdGlvbnMpIHtcbiAgIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucy52ZXJib3NlLCdGVU5DVElPTiBfZ2V0QWxsQ29tcG9uZW50cyAoZW1wdHkpJylcbiAgdHJ5IHtcbiAgICB2YXIgZXh0Q29tcG9uZW50cyA9IFtdXG4gICAgIHJldHVybiBleHRDb21wb25lbnRzXG4gIH1cbiAgY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmxvZyhlKVxuICAgIHJldHVybiBbXVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfd3JpdGVGaWxlc1RvUHJvZEZvbGRlcih2YXJzLCBvcHRpb25zKSB7XG4gIGNvbnN0IGxvZ3YgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2XG4gIGxvZ3Yob3B0aW9ucy52ZXJib3NlLCdGVU5DVElPTiBfd3JpdGVGaWxlc1RvUHJvZEZvbGRlciAoZW1wdHkpJylcbiAgdHJ5IHtcbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUubG9nKGUpXG4gIH1cbn0iXX0=
\ No newline at end of file
diff --git a/packages/ext-webpack-plugin/dist/extjsUtil.js b/packages/ext-webpack-plugin/dist/extjsUtil.js
new file mode 100644
index 0000000..b66d952
--- /dev/null
+++ b/packages/ext-webpack-plugin/dist/extjsUtil.js
@@ -0,0 +1,172 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports._getDefaultVars = _getDefaultVars;
+exports._afterCompile = _afterCompile;
+exports._prepareForBuild = _prepareForBuild;
+
+function _getDefaultVars() {
+ return {
+ touchFile: '/themer.js',
+ rebuild: true,
+ watchStarted: false,
+ firstTime: true,
+ browserCount: 0,
+ cwd: process.cwd(),
+ extPath: '.',
+ pluginErrors: [],
+ lastNumFiles: 0,
+ lastMilliseconds: 0,
+ lastMillisecondsAppJson: 0,
+ files: ['./app.json'],
+ dirs: ['./app', './packages']
+ };
+}
+
+function _afterCompile(compilation, vars, options) {
+ 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));
+ });
+ }
+
+ if (dirs.length > 0) {
+ contextDependencies.forEach(context => {
+ compilation.contextDependencies.add(context);
+ });
+ }
+}
+
+function _getFileAndContextDeps(compilation, files, dirs, cwd, options) {
+ var verbose = options.verbose;
+
+ var logv = require('./pluginUtil').logv;
+
+ logv(verbose, 'FUNCTION _getFileAndContextDeps');
+
+ const uniq = require('lodash.uniq');
+
+ const isGlob = require('is-glob');
+
+ const {
+ fileDependencies,
+ contextDependencies
+ } = compilation;
+ const isWebpack4 = compilation.hooks;
+ let fds = isWebpack4 ? [...fileDependencies] : fileDependencies;
+ let cds = isWebpack4 ? [...contextDependencies] : contextDependencies;
+
+ if (files.length > 0) {
+ files.forEach(pattern => {
+ let f = pattern;
+
+ if (isGlob(pattern)) {
+ f = glob.sync(pattern, {
+ cwd,
+ dot: true,
+ absolute: true
+ });
+ }
+
+ fds = fds.concat(f);
+ });
+ fds = uniq(fds);
+ }
+
+ if (dirs.length > 0) {
+ cds = uniq(cds.concat(dirs));
+ }
+
+ return {
+ fileDependencies: fds,
+ contextDependencies: cds
+ };
+}
+
+function _prepareForBuild(app, vars, options, output, compilation) {
+ // try {
+ const log = require('./pluginUtil').log;
+
+ const logv = require('./pluginUtil').logv;
+
+ logv(options, '_prepareForBuild');
+
+ const fs = require('fs');
+
+ const recursiveReadSync = require('recursive-readdir-sync');
+
+ var watchedFiles = [];
+
+ 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;
+ 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(), '');
+
+ if (bundleDir.trim() == '') {
+ bundleDir = './';
+ }
+
+ 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9leHRqc1V0aWwuanMiXSwibmFtZXMiOlsiX2dldERlZmF1bHRWYXJzIiwidG91Y2hGaWxlIiwicmVidWlsZCIsIndhdGNoU3RhcnRlZCIsImZpcnN0VGltZSIsImJyb3dzZXJDb3VudCIsImN3ZCIsInByb2Nlc3MiLCJleHRQYXRoIiwicGx1Z2luRXJyb3JzIiwibGFzdE51bUZpbGVzIiwibGFzdE1pbGxpc2Vjb25kcyIsImxhc3RNaWxsaXNlY29uZHNBcHBKc29uIiwiZmlsZXMiLCJkaXJzIiwiX2FmdGVyQ29tcGlsZSIsImNvbXBpbGF0aW9uIiwidmFycyIsIm9wdGlvbnMiLCJ2ZXJib3NlIiwibG9ndiIsInJlcXVpcmUiLCJwYXRoIiwiZmlsZURlcGVuZGVuY2llcyIsImNvbnRleHREZXBlbmRlbmNpZXMiLCJfZ2V0RmlsZUFuZENvbnRleHREZXBzIiwibGVuZ3RoIiwiZm9yRWFjaCIsImZpbGUiLCJhZGQiLCJyZXNvbHZlIiwiY29udGV4dCIsInVuaXEiLCJpc0dsb2IiLCJpc1dlYnBhY2s0IiwiaG9va3MiLCJmZHMiLCJjZHMiLCJwYXR0ZXJuIiwiZiIsImdsb2IiLCJzeW5jIiwiZG90IiwiYWJzb2x1dGUiLCJjb25jYXQiLCJfcHJlcGFyZUZvckJ1aWxkIiwiYXBwIiwib3V0cHV0IiwibG9nIiwiZnMiLCJyZWN1cnNpdmVSZWFkU3luYyIsIndhdGNoZWRGaWxlcyIsImVyciIsImVycm5vIiwiY29uc29sZSIsImN1cnJlbnROdW1GaWxlcyIsImRvQnVpbGQiLCJEYXRlIiwiZ2V0VGltZSIsImZpbGVzb3VyY2UiLCJhc3NldHMiLCJzb3VyY2UiLCJzaXplIiwiYnVuZGxlRGlyIiwicmVwbGFjZSIsInRyaW0iXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7QUFFTyxTQUFTQSxlQUFULEdBQTJCO0FBQ2hDLFNBQU87QUFDTEMsSUFBQUEsU0FBUyxFQUFFLFlBRE47QUFFTEMsSUFBQUEsT0FBTyxFQUFFLElBRko7QUFHTEMsSUFBQUEsWUFB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LENBQUNqQyxNQUFsQjtBQUF5QjtBQUZvQixHQUFqRTtBQUtBTixFQUFBQSxJQUFJLENBQUNGLE9BQUQsRUFBUyxzQkFBc0JxQyxlQUEvQixDQUFKO0FBQ0FuQyxFQUFBQSxJQUFJLENBQUNGLE9BQUQsRUFBUyx3QkFBd0JELElBQUksQ0FBQ1AsWUFBdEMsQ0FBSjtBQUNBVSxFQUFBQSxJQUFJLENBQUNGLE9BQUQsRUFBUyxjQUFjc0MsT0FBdkIsQ0FBSjs7QUFFQSxNQUFJRCxlQUFlLElBQUl0QyxJQUFJLENBQUNQLFlBQXhCLElBQXdDOEMsT0FBNUMsRUFBcUQ7QUFDbkR2QyxJQUFBQSxJQUFJLENBQUNmLE9BQUwsR0FBZSxJQUFmO0FBQ0EsUUFBSTZELFNBQVMsR0FBR2hCLE1BQU0sQ0FBQ2lCLE9BQVAsQ0FBZXpELE9BQU8sQ0FBQ0QsR0FBUixFQUFmLEVBQThCLEVBQTlCLENBQWhCOztBQUNBLFFBQUl5RCxTQUFTLENBQUNFLElBQVYsTUFBb0IsRUFBeEIsRUFBNEI7QUFBQ0YsTUFBQUEsU0FBUyxHQUFHLElBQVo7QUFBaUI7O0FBQzlDZixJQUFBQSxHQUFHLENBQUNGLEdBQUcsR0FBRywwQkFBTixHQUFtQ2lCLFNBQXBDLENBQUg7QUFDRCxHQUxELE1BTUs7QUFDSDlDLElBQUFBLElBQUksQ0FBQ2YsT0FBTCxHQUFlLEtBQWY7QUFDRDs7QUFDRGUsRUFBQUEsSUFBSSxDQUFDUCxZQUFMLEdBQW9CNkMsZUFBcEIsQ0FwQ3NFLENBcUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIlxuXG5leHBvcnQgZnVuY3Rpb24gX2dldERlZmF1bHRWYXJzKCkge1xuICByZXR1cm4ge1xuICAgIHRvdWNoRmlsZTogJy90aGVtZXIuanMnLFxuICAgIHJlYnVpbGQ6IHRydWUsXG4gICAgd2F0Y2hTdGFydGVkIDogZmFsc2UsXG4gICAgZmlyc3RUaW1lIDogdHJ1ZSxcbiAgICBicm93c2VyQ291bnQgOiAwLFxuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBleHRQYXRoOiAnLicsXG4gICAgcGx1Z2luRXJyb3JzOiBbXSxcbiAgICBsYXN0TnVtRmlsZXM6IDAsXG4gICAgbGFzdE1pbGxpc2Vjb25kczogMCxcbiAgICBsYXN0TWlsbGlzZWNvbmRzQXBwSnNvbjogMCxcbiAgICBmaWxlczogWycuL2FwcC5qc29uJ10sXG4gICAgZGlyczogWycuL2FwcCcsJy4vcGFja2FnZXMnXVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfYWZ0ZXJDb21waWxlKGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zKSB7XG4gIHZhciB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlXG4gIHZhciBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KHZlcmJvc2UsJ0ZVTkNUSU9OIGV4dGpzIF9hZnRlckNvbXBpbGUnKVxuICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG4gIGxldCB7IGZpbGVzLCBkaXJzIH0gPSB2YXJzXG4gIGNvbnN0IHsgY3dkIH0gPSB2YXJzXG4gIGZpbGVzID0gdHlwZW9mIGZpbGVzID09PSAnc3RyaW5nJyA/IFtmaWxlc10gOiBmaWxlc1xuICBkaXJzID0gdHlwZW9mIGRpcnMgPT09ICdzdHJpbmcnID8gW2RpcnNdIDogZGlyc1xuICBjb25zdCB7XG4gICAgZmlsZURlcGVuZGVuY2llcyxcbiAgICBjb250ZXh0RGVwZW5kZW5jaWVzLFxuICB9ID0gX2dldEZpbGVBbmRDb250ZXh0RGVwcyhjb21waWxhdGlvbiwgZmlsZXMsIGRpcnMsIGN3ZCwgb3B0aW9ucyk7XG4gIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgZmlsZURlcGVuZGVuY2llcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICBjb21waWxhdGlvbi5maWxlRGVwZW5kZW5jaWVzLmFkZChwYXRoLnJlc29sdmUoZmlsZSkpO1xuICAgIH0pXG4gIH1cbiAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnRleHREZXBlbmRlbmNpZXMuZm9yRWFjaCgoY29udGV4dCkgPT4ge1xuICAgICAgY29tcGlsYXRpb24uY29udGV4dERlcGVuZGVuY2llcy5hZGQoY29udGV4dCk7XG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBfZ2V0RmlsZUFuZENvbnRleHREZXBzKGNvbXBpbGF0aW9uLCBmaWxlcywgZGlycywgY3dkLCBvcHRpb25zKSB7XG4gIHZhciB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlXG4gIHZhciBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICBsb2d2KHZlcmJvc2UsJ0ZVTkNUSU9OIF9nZXRGaWxlQW5kQ29udGV4dERlcHMnKVxuICBjb25zdCB1bmlxID0gcmVxdWlyZSgnbG9kYXNoLnVuaXEnKVxuICBjb25zdCBpc0dsb2IgPSByZXF1aXJlKCdpcy1nbG9iJylcblxuICBjb25zdCB7IGZpbGVEZXBlbmRlbmNpZXMsIGNvbnRleHREZXBlbmRlbmNpZXMgfSA9IGNvbXBpbGF0aW9uO1xuICBjb25zdCBpc1dlYnBhY2s0ID0gY29tcGlsYXRpb24uaG9va3M7XG4gIGxldCBmZHMgPSBpc1dlYnBhY2s0ID8gWy4uLmZpbGVEZXBlbmRlbmNpZXNdIDogZmlsZURlcGVuZGVuY2llcztcbiAgbGV0IGNkcyA9IGlzV2VicGFjazQgPyBbLi4uY29udGV4dERlcGVuZGVuY2llc10gOiBjb250ZXh0RGVwZW5kZW5jaWVzO1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGZpbGVzLmZvckVhY2goKHBhdHRlcm4pID0+IHtcbiAgICAgIGxldCBmID0gcGF0dGVyblxuICAgICAgaWYgKGlzR2xvYihwYXR0ZXJuKSkge1xuICAgICAgICBmID0gZ2xvYi5zeW5jKHBhdHRlcm4sIHsgY3dkLCBkb3Q6IHRydWUsIGFic29sdXRlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgICBmZHMgPSBmZHMuY29uY2F0KGYpXG4gICAgfSlcbiAgICBmZHMgPSB1bmlxKGZkcylcbiAgfVxuICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgY2RzID0gdW5pcShjZHMuY29uY2F0KGRpcnMpKVxuICB9XG4gIHJldHVybiB7IGZpbGVEZXBlbmRlbmNpZXM6IGZkcywgY29udGV4dERlcGVuZGVuY2llczogY2RzIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9wcmVwYXJlRm9yQnVpbGQoYXBwLCB2YXJzLCBvcHRpb25zLCBvdXRwdXQsIGNvbXBpbGF0aW9uKSB7XG4vLyAgdHJ5IHtcbiAgICBjb25zdCBsb2cgPSByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2dcbiAgICBjb25zdCBsb2d2ID0gcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndlxuICAgIGxvZ3Yob3B0aW9ucywnX3ByZXBhcmVGb3JCdWlsZCcpXG4gICAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpXG4gICAgY29uc3QgcmVjdXJzaXZlUmVhZFN5bmMgPSByZXF1aXJlKCdyZWN1cnNpdmUtcmVhZGRpci1zeW5jJylcbiAgICB2YXIgd2F0Y2hlZEZpbGVzPVtdXG4gICAgdHJ5IHt3YXRjaGVkRmlsZXMgPSByZWN1cnNpdmVSZWFkU3luYygnLi9hcHAnKS5jb25jYXQocmVjdXJzaXZlUmVhZFN5bmMoJy4vcGFja2FnZXMnKSl9XG4gICAgY2F0Y2goZXJyKSB7aWYoZXJyLmVycm5vID09PSAzNCl7Y29uc29sZS5sb2coJ1BhdGggZG9lcyBub3QgZXhpc3QnKTt9IGVsc2Uge3Rocm93IGVycjt9fVxuICAgIHZhciBjdXJyZW50TnVtRmlsZXMgPSB3YXRjaGVkRmlsZXMubGVuZ3RoXG4gICAgbG9ndihvcHRpb25zLCd3YXRjaGVkRmlsZXM6ICcgKyBjdXJyZW50TnVtRmlsZXMpXG4gICAgdmFyIGRvQnVpbGQgPSB0cnVlXG4gICAgXG4gICAgbG9ndihvcHRpb25zLCdkb0J1aWxkOiAnICsgZG9CdWlsZClcblxuICAgIHZhcnMubGFzdE1pbGxpc2Vjb25kcyA9IChuZXcgRGF0ZSkuZ2V0VGltZSgpXG4gICAgdmFyIGZpbGVzb3VyY2UgPSAndGhpcyBmaWxlIGVuYWJsZXMgY2xpZW50IHJlbG9hZCdcbiAgICBjb21waWxhdGlvbi5hc3NldHNbY3VycmVudE51bUZpbGVzICsgJ0ZpbGVzVW5kZXJBcHBGb2xkZXIubWQnXSA9IHtcbiAgICAgIHNvdXJjZTogZnVuY3Rpb24oKSB7cmV0dXJuIGZpbGVzb3VyY2V9LFxuICAgICAgc2l6ZTogZnVuY3Rpb24oKSB7cmV0dXJuIGZpbGVzb3VyY2UubGVuZ3RofVxuICAgIH1cblxuICAgIGxvZ3Yob3B0aW9ucywnY3VycmVudE51bUZpbGVzOiAnICsgY3VycmVudE51bUZpbGVzKVxuICAgIGxvZ3Yob3B0aW9ucywndmFycy5sYXN0TnVtRmlsZXM6ICcgKyB2YXJzLmxhc3ROdW1GaWxlcylcbiAgICBsb2d2KG9wdGlvbnMsJ2RvQnVpbGQ6ICcgKyBkb0J1aWxkKVxuXG4gICAgaWYgKGN1cnJlbnROdW1GaWxlcyAhPSB2YXJzLmxhc3ROdW1GaWxlcyB8fCBkb0J1aWxkKSB7XG4gICAgICB2YXJzLnJlYnVpbGQgPSB0cnVlXG4gICAgICB2YXIgYnVuZGxlRGlyID0gb3V0cHV0LnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpXG4gICAgICBpZiAoYnVuZGxlRGlyLnRyaW0oKSA9PSAnJykge2J1bmRsZURpciA9ICcuLyd9XG4gICAgICBsb2coYXBwICsgJ0J1aWxkaW5nIEV4dCBidW5kbGUgYXQ6ICcgKyBidW5kbGVEaXIpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFycy5yZWJ1aWxkID0gZmFsc2VcbiAgICB9XG4gICAgdmFycy5sYXN0TnVtRmlsZXMgPSBjdXJyZW50TnVtRmlsZXNcbiAgLy8gfVxuICAvLyBjYXRjaChlKSB7XG4gIC8vICAgY29uc29sZS5sb2coZSlcbiAgLy8gICBjb21waWxhdGlvbi5lcnJvcnMucHVzaCgnX3ByZXBhcmVGb3JCdWlsZDogJyArIGUpXG4gIC8vIH1cbn1cbiJdfQ==
\ No newline at end of file
diff --git a/packages/ext-webpack-plugin/dist/index.js b/packages/ext-webpack-plugin/dist/index.js
new file mode 100644
index 0000000..62a8b77
--- /dev/null
+++ b/packages/ext-webpack-plugin/dist/index.js
@@ -0,0 +1,66 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+require('@babel/polyfill');
+
+const p = require(`./pluginUtil`);
+
+class ExtWebpackPlugin {
+ constructor(options) {
+ var o = p._constructor(options);
+
+ this.vars = o.vars;
+ this.options = o.options;
+ }
+
+ apply(compiler) {
+ 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 => {
+ 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`);
+
+ 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);
+ });
+ }
+
+}
+
+exports.default = ExtWebpackPlugin;
+module.exports = exports.default;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJyZXF1aXJlIiwicCIsIkV4dFdlYnBhY2tQbHVnaW4iLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJvIiwiX2NvbnN0cnVjdG9yIiwidmFycyIsImFwcGx5IiwiY29tcGlsZXIiLCJhcHAiLCJob29rcyIsImNvbnNvbGUiLCJsb2ciLCJ0aGlzQ29tcGlsYXRpb24iLCJ0YXAiLCJjb21waWxhdGlvbiIsImxvZ2giLCJfdGhpc0NvbXBpbGF0aW9uIiwicGx1Z2luRXJyb3JzIiwibGVuZ3RoIiwiZXJyb3JzIiwicHVzaCIsIkVycm9yIiwiam9pbiIsIl9jb21waWxhdGlvbiIsImFmdGVyQ29tcGlsZSIsIl9hZnRlckNvbXBpbGUiLCJlbWl0IiwidGFwQXN5bmMiLCJjYWxsYmFjayIsIl9lbWl0IiwiZG9uZSIsInN0YXRzIiwiX2RvbmUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0FBQ0FBLE9BQU8sQ0FBQyxpQkFBRCxDQUFQOztBQUNBLE1BQU1DLENBQUMsR0FBR0QsT0FBTyxDQUFFLGNBQUYsQ0FBakI7O0FBRWUsTUFBTUUsZ0JBQU4sQ0FBdUI7QUFFcENDLEVBQUFBLFdBQVcsQ0FBQ0MsT0FBRCxFQUFVO0FBQ25CLFFBQUlDLENBQUMsR0FBR0osQ0FBQyxDQUFDSyxZQUFGLENBQWVGLE9BQWYsQ0FBUjs7QUFDQSxTQUFLRyxJQUFMLEdBQVlGLENBQUMsQ0FBQ0UsSUFBZDtBQUNBLFNBQUtILE9BQUwsR0FBZUMsQ0FBQyxDQUFDRCxPQUFqQjtBQUNEOztBQUVESSxFQUFBQSxLQUFLLENBQUNDLFFBQUQsRUFBVztBQUNkLFVBQU1GLElBQUksR0FBRyxLQUFLQSxJQUFsQjtBQUNBLFVBQU1ILE9BQU8sR0FBRyxLQUFLQSxPQUFyQjtBQUNBLFVBQU1NLEdBQUcsR0FBRyxLQUFLQSxHQUFqQjs7QUFFQSxRQUFJLENBQUNELFFBQVEsQ0FBQ0UsS0FBZCxFQUFxQjtBQUFDQyxNQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSxlQUFaO0FBQTZCO0FBQU87O0FBRTFESixJQUFBQSxRQUFRLENBQUNFLEtBQVQsQ0FBZUcsZUFBZixDQUErQkMsR0FBL0IsQ0FBb0Msc0JBQXBDLEVBQTREQyxXQUFELElBQWlCO0FBQzFFZixNQUFBQSxDQUFDLENBQUNnQixJQUFGLENBQU9QLEdBQVAsRUFBYSxzQkFBYjs7QUFDQVQsTUFBQUEsQ0FBQyxDQUFDaUIsZ0JBQUYsQ0FBbUJULFFBQW5CLEVBQTZCTyxXQUE3QixFQUEwQ1QsSUFBMUMsRUFBZ0RILE9BQWhEOztBQUNBLFVBQUlHLElBQUksQ0FBQ1ksWUFBTCxDQUFrQkMsTUFBbEIsR0FBMkIsQ0FBL0IsRUFBa0M7QUFDaENKLFFBQUFBLFdBQVcsQ0FBQ0ssTUFBWixDQUFtQkMsSUFBbkIsQ0FBeUIsSUFBSUMsS0FBSixDQUFVaEIsSUFBSSxDQUFDWSxZQUFMLENBQWtCSyxJQUFsQixDQUF1QixFQUF2QixDQUFWLENBQXpCO0FBQ0E7QUFDRDtBQUNGLEtBUEQ7QUFTQWYsSUFBQUEsUUFBUSxDQUFDRSxLQUFULENBQWVLLFdBQWYsQ0FBMkJELEdBQTNCLENBQWdDLGlCQUFoQyxFQUFtREMsV0FBRCxJQUFpQjtBQUNqRWYsTUFBQUEsQ0FBQyxDQUFDZ0IsSUFBRixDQUFPUCxHQUFQLEVBQWEsa0JBQWI7O0FBQ0FULE1BQUFBLENBQUMsQ0FBQ3dCLFlBQUYsQ0FBZWhCLFFBQWYsRUFBeUJPLFdBQXpCLEVBQXNDVCxJQUF0QyxFQUE0Q0gsT0FBNUM7QUFDRCxLQUhEO0FBS0FLLElBQUFBLFFBQVEsQ0FBQ0UsS0FBVCxDQUFlZSxZQUFmLENBQTRCWCxHQUE1QixDQUFnQyxtQkFBaEMsRUFBc0RDLFdBQUQsSUFBaUI7QUFDcEVmLE1BQUFBLENBQUMsQ0FBQ2dCLElBQUYsQ0FBT1AsR0FBUCxFQUFhLG1CQUFiOztBQUNBVCxNQUFBQSxDQUFDLENBQUMwQixhQUFGLENBQWdCbEIsUUFBaEIsRUFBMEJPLFdBQTFCLEVBQXVDVCxJQUF2QyxFQUE2Q0gsT0FBN0M7QUFDRCxLQUhEO0FBS0FLLElBQUFBLFFBQVEsQ0FBQ0UsS0FBVCxDQUFlaUIsSUFBZixDQUFvQkMsUUFBcEIsQ0FBOEIsVUFBOUIsRUFBeUMsQ0FBQ2IsV0FBRCxFQUFjYyxRQUFkLEtBQTJCO0FBQ2xFN0IsTUFBQUEsQ0FBQyxDQUFDZ0IsSUFBRixDQUFPUCxHQUFQLEVBQWEsbUJBQWI7O0FBQ0FULE1BQUFBLENBQUMsQ0FBQzhCLEtBQUYsQ0FBUXRCLFFBQVIsRUFBa0JPLFdBQWxCLEVBQStCVCxJQUEvQixFQUFxQ0gsT0FBckMsRUFBOEMwQixRQUE5QztBQUNELEtBSEQ7QUFLQXJCLElBQUFBLFFBQVEsQ0FBQ0UsS0FBVCxDQUFlcUIsSUFBZixDQUFvQmpCLEdBQXBCLENBQXlCLFVBQXpCLEVBQXFDa0IsS0FBRCxJQUFXO0FBQzdDaEMsTUFBQUEsQ0FBQyxDQUFDZ0IsSUFBRixDQUFPUCxHQUFQLEVBQWEsV0FBYjs7QUFDQVQsTUFBQUEsQ0FBQyxDQUFDaUMsS0FBRixDQUFRRCxLQUFSLEVBQWUxQixJQUFmLEVBQXFCSCxPQUFyQjtBQUNELEtBSEQ7QUFJRDs7QUEzQ21DIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5yZXF1aXJlKCdAYmFiZWwvcG9seWZpbGwnKVxuY29uc3QgcCA9IHJlcXVpcmUoYC4vcGx1Z2luVXRpbGApXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4dFdlYnBhY2tQbHVnaW4ge1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB2YXIgbyA9IHAuX2NvbnN0cnVjdG9yKG9wdGlvbnMpXG4gICAgdGhpcy52YXJzID0gby52YXJzXG4gICAgdGhpcy5vcHRpb25zID0gby5vcHRpb25zXG4gIH1cblxuICBhcHBseShjb21waWxlcikge1xuICAgIGNvbnN0IHZhcnMgPSB0aGlzLnZhcnNcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zXG4gICAgY29uc3QgYXBwID0gdGhpcy5hcHBcblxuICAgIGlmICghY29tcGlsZXIuaG9va3MpIHtjb25zb2xlLmxvZygnbm90IHdlYnBhY2sgNCcpO3JldHVybn1cblxuICAgIGNvbXBpbGVyLmhvb2tzLnRoaXNDb21waWxhdGlvbi50YXAoYGV4dC10aGlzLWNvbXBpbGF0aW9uYCwgKGNvbXBpbGF0aW9uKSA9PiB7XG4gICAgICBwLmxvZ2goYXBwLCBgSE9PSyB0aGlzQ29tcGlsYXRpb25gKVxuICAgICAgcC5fdGhpc0NvbXBpbGF0aW9uKGNvbXBpbGVyLCBjb21waWxhdGlvbiwgdmFycywgb3B0aW9ucylcbiAgICAgIGlmICh2YXJzLnBsdWdpbkVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCBuZXcgRXJyb3IodmFycy5wbHVnaW5FcnJvcnMuam9pbihcIlwiKSkgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29tcGlsZXIuaG9va3MuY29tcGlsYXRpb24udGFwKGBleHQtY29tcGlsYXRpb25gLCAoY29tcGlsYXRpb24pID0+IHtcbiAgICAgIHAubG9naChhcHAsIGBIT09LIGNvbXBpbGF0aW9uYClcbiAgICAgIHAuX2NvbXBpbGF0aW9uKGNvbXBpbGVyLCBjb21waWxhdGlvbiwgdmFycywgb3B0aW9ucylcbiAgICB9KVxuXG4gICAgY29tcGlsZXIuaG9va3MuYWZ0ZXJDb21waWxlLnRhcCgnZXh0LWFmdGVyLWNvbXBpbGUnLCAoY29tcGlsYXRpb24pID0+IHtcbiAgICAgIHAubG9naChhcHAsIGBIT09LIGFmdGVyQ29tcGlsZWApXG4gICAgICBwLl9hZnRlckNvbXBpbGUoY29tcGlsZXIsIGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zKVxuICAgIH0pXG5cbiAgICBjb21waWxlci5ob29rcy5lbWl0LnRhcEFzeW5jKGBleHQtZW1pdGAsIChjb21waWxhdGlvbiwgY2FsbGJhY2spID0+IHtcbiAgICAgIHAubG9naChhcHAsIGBIT09LIGVtaXQgKGFzeW5jKWApXG4gICAgICBwLl9lbWl0KGNvbXBpbGVyLCBjb21waWxhdGlvbiwgdmFycywgb3B0aW9ucywgY2FsbGJhY2spXG4gICAgfSlcblxuICAgIGNvbXBpbGVyLmhvb2tzLmRvbmUudGFwKGBleHQtZG9uZWAsIChzdGF0cykgPT4ge1xuICAgICAgcC5sb2doKGFwcCwgYEhPT0sgZG9uZWApXG4gICAgICBwLl9kb25lKHN0YXRzLCB2YXJzLCBvcHRpb25zKVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
\ No newline at end of file
diff --git a/packages/ext-webpack-plugin/dist/pluginUtil.js b/packages/ext-webpack-plugin/dist/pluginUtil.js
new file mode 100644
index 0000000..7ea4b0e
--- /dev/null
+++ b/packages/ext-webpack-plugin/dist/pluginUtil.js
@@ -0,0 +1,861 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports._constructor = _constructor;
+exports._thisCompilation = _thisCompilation;
+exports._compilation = _compilation;
+exports._afterCompile = _afterCompile;
+exports._emit = _emit;
+exports._done = _done;
+exports._prepareForBuild = _prepareForBuild;
+exports._buildExtBundle = _buildExtBundle;
+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); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
+
+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(initialOptions) {
+ const fs = require('fs');
+
+ var vars = {};
+ var options = {};
+
+ try {
+ if (initialOptions.framework == undefined) {
+ vars.pluginErrors = [];
+ vars.pluginErrors.push('webpack config: framework parameter on ext-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(_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-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)}
+
+
+ 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);
+ var o = {};
+ o.vars = vars;
+ o.options = options;
+ return o;
+ } catch (e) {
+ throw '_constructor: ' + e.toString();
+ }
+} //**********
+
+
+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();
+ }
+} //**********
+
+
+function _compilation(compiler, compilation, vars, options) {
+ try {
+ 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
+ // }
+
+ if (framework != 'extjs') {
+ var 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)];
+ }
+ } 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 (vars.buildstep == '1 of 1' || vars.buildstep == '2 of 2') {
+ compilation.hooks.htmlWebpackPluginBeforeHtmlGeneration.tap(`ext-html-generation`, data => {
+ 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(app, `Adding ${jsPath} and ${cssPath} to index.html`);
+ });
+ }
+ }
+ } catch (e) {
+ throw '_compilation: ' + e.toString(); // logv(options.verbose,e)
+ // compilation.errors.push('_compilation: ' + e)
+ }
+} //**********
+
+
+function _afterCompile(compiler, compilation, vars, options) {
+ 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 _emit2.apply(this, arguments);
+} //**********
+
+
+function _emit2() {
+ _emit2 = _asyncToGenerator(
+ /*#__PURE__*/
+ regeneratorRuntime.mark(function _callee(compiler, compilation, vars, options, callback) {
+ 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;
+ path = require('path');
+ app = vars.app;
+ verbose = options.verbose;
+ emit = options.emit;
+ framework = options.framework;
+ logv(verbose, 'FUNCTION _emit');
+
+ if (!(emit == 'yes')) {
+ _context.next = 33;
+ break;
+ }
+
+ 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);
+ }
+
+ command = '';
+
+ if (options.watch == 'yes' && vars.production == false) {
+ command = 'watch';
+ } else {
+ command = 'build';
+ }
+
+ if (!(vars.rebuild == true)) {
+ _context.next = 26;
+ break;
+ }
+
+ 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 {
+ 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)) {
+ _context.next = 23;
+ break;
+ }
+
+ _context.next = 22;
+ return _buildExtBundle(app, compilation, outputPath, parms, vars, options);
+
+ case 22:
+ vars.watchStarted = true;
+
+ case 23:
+ callback();
+ _context.next = 27;
+ break;
+
+ case 26:
+ callback();
+
+ case 27:
+ _context.next = 31;
+ break;
+
+ case 29:
+ logv(verbose, 'NOT running emit');
+ callback();
+
+ case 31:
+ _context.next = 35;
+ break;
+
+ case 33:
+ logv(verbose, 'emit is no');
+ callback();
+
+ case 35:
+ _context.next = 41;
+ break;
+
+ case 37:
+ _context.prev = 37;
+ _context.t0 = _context["catch"](0);
+ callback();
+ throw '_emit: ' + _context.t0.toString();
+
+ case 41:
+ case "end":
+ return _context.stop();
+ }
+ }, _callee, null, [[0, 37]]);
+ }));
+ 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 {
+ 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');
+
+ theme = theme || (toolkit === 'classic' ? 'theme-triton' : 'theme-material');
+ logv(verbose, 'firstTime: ' + vars.firstTime);
+
+ if (vars.firstTime) {
+ rimraf.sync(output);
+ mkdirp.sync(output);
+
+ const buildXML = require('./artifacts').buildXML;
+
+ 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(), ''));
+ }
+
+ 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(), ''));
+ }
+
+ 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(), ''));
+ }
+
+ 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(), ''));
+ }
+ }
+
+ vars.firstTime = false;
+ var js = '';
+
+ if (vars.production) {
+ js = vars.deps.join(';\n');
+ } else {
+ js = 'Ext.require(["Ext.*","Ext.data.TreeStore"])';
+ }
+
+ if (vars.manifest === null || js !== vars.manifest) {
+ vars.manifest = js;
+ const manifest = path.join(output, 'manifest.js');
+ fs.writeFileSync(manifest, js, 'utf8');
+ vars.rebuild = true;
+ var bundleDir = output.replace(process.cwd(), '');
+
+ if (bundleDir.trim() == '') {
+ bundleDir = './';
+ }
+
+ log(app, 'Building Ext bundle at: ' + bundleDir);
+ } else {
+ vars.rebuild = false;
+ log(app, 'Ext rebuild NOT needed');
+ }
+ } catch (e) {
+ require('./pluginUtil').logv(options.verbose, e);
+
+ compilation.errors.push('_prepareForBuild: ' + e);
+ }
+} //**********
+
+
+function _buildExtBundle(app, compilation, outputPath, parms, vars, options) {
+ // try {
+ var verbose = options.verbose;
+
+ const fs = require('fs');
+
+ logv(verbose, 'FUNCTION _buildExtBundle');
+ let sencha;
+
+ try {
+ sencha = require('@sencha/cmd');
+ } catch (e) {
+ sencha = 'sencha';
+ }
+
+ if (fs.existsSync(sencha)) {
+ logv(verbose, 'sencha folder exists');
+ } else {
+ logv(verbose, 'sencha folder DOES NOT exist');
+ }
+
+ 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()
+ // }
+} //**********
+
+
+function _executeAsync(_x6, _x7, _x8, _x9, _x10, _x11, _x12) {
+ return _executeAsync2.apply(this, arguments);
+} //**********
+
+
+function _executeAsync2() {
+ _executeAsync2 = _asyncToGenerator(
+ /*#__PURE__*/
+ 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:
+ // 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');
+ logv(verbose, 'FUNCTION _executeAsync');
+ _context2.next = 9;
+ return new Promise((resolve, reject) => {
+ 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(verbose, `on close: ` + code);
+
+ if (code === 0) {
+ resolve(0);
+ } else {
+ compilation.errors.push(new Error(code));
+ resolve(0);
+ }
+ });
+ child.on('error', 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(verbose, `${str}`);
+
+ if (data && data.toString().match(/Fashion waiting for changes\.\.\./)) {
+ const fs = require('fs');
+
+ var filename = process.cwd() + vars.touchFile;
+
+ try {
+ var d = new Date().toLocaleString();
+ var data = fs.readFileSync(filename);
+ fs.writeFileSync(filename, '//' + d, 'utf8');
+ logv(app, `touching ${filename}`);
+ } catch (e) {
+ logv(app, `NOT touching ${filename}`);
+ }
+
+ resolve(0);
+ } else {
+ if (substrings.some(function (v) {
+ return data.indexOf(v) >= 0;
+ })) {
+ str = str.replace("[INF]", "");
+ str = str.replace("[LOG]", "");
+ str = str.replace(process.cwd(), '').trim();
+
+ if (str.includes("[ERR]")) {
+ compilation.errors.push(app + str.replace(/^\[ERR\] /gi, ''));
+ str = str.replace("[ERR]", `${chalk.red("[ERR]")}`);
+ }
+
+ log(app, str);
+ }
+ }
+ });
+ child.stderr.on('data', data => {
+ logv(options, `error on close: ` + data);
+ var str = data.toString().replace(/\r?\n|\r/g, " ").trim();
+ var strJavaOpts = "Picked up _JAVA_OPTIONS";
+ var includes = str.includes(strJavaOpts);
+
+ if (!includes) {
+ console.log(`${app} ${chalk.red("[ERR]")} ${str}`);
+ }
+ });
+ });
+
+ case 9:
+ case "end":
+ return _context2.stop();
+ }
+ }, _callee2);
+ }));
+ return _executeAsync2.apply(this, arguments);
+}
+
+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);
+ });
+} //**********
+
+
+function _toXtype(str) {
+ return str.toLowerCase().replace(/_/g, '-');
+} //**********
+
+
+function _getApp() {
+ var chalk = require('chalk');
+
+ var prefix = ``;
+
+ const platform = require('os').platform();
+
+ if (platform == 'darwin') {
+ prefix = `ℹ 「ext」:`;
+ } else {
+ prefix = `i [ext]:`;
+ }
+
+ return `${chalk.green(prefix)} `;
+} //**********
+
+
+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')) || {};
+ v.pluginVersion = pluginPkg.version;
+ v._resolved = pluginPkg._resolved;
+
+ if (v._resolved == undefined) {
+ v.edition = `Commercial`;
+ } else {
+ if (-1 == v._resolved.indexOf('community')) {
+ v.edition = `Commercial`;
+ } else {
+ 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 = '';
+
+ if (frameworkName == 'react') {
+ frameworkPath = path.resolve(process.cwd(), 'node_modules/react');
+ }
+
+ if (frameworkName == 'angular') {
+ frameworkPath = path.resolve(process.cwd(), 'node_modules/@angular/core');
+ }
+
+ var frameworkPkg = fs.existsSync(frameworkPath + '/package.json') && JSON.parse(fs.readFileSync(frameworkPath + '/package.json', 'utf-8')) || {};
+ v.frameworkVersion = frameworkPkg.version;
+ frameworkInfo = ', ' + frameworkName + ' v' + v.frameworkVersion;
+ }
+
+ return 'ext-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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wbHVnaW5VdGlsLmpzIl0sIm5hbWVzIjpbIl9jb25zdHJ1Y3RvciIsImluaXRpYWxPcHRpb25zIiwiZnMiLCJyZXF1aXJlIiwidmFycyIsIm9wdGlvbnMiLCJmcmFtZXdvcmsiLCJ1bmRlZmluZWQiLCJwbHVnaW5FcnJvcnMiLCJwdXNoIiwibyIsInRyZWVzaGFrZSIsInZlcmJvc2UiLCJ2YWxpZGF0ZU9wdGlvbnMiLCJfZ2V0VmFsaWRhdGVPcHRpb25zIiwicmMiLCJleGlzdHNTeW5jIiwiSlNPTiIsInBhcnNlIiwicmVhZEZpbGVTeW5jIiwiX2dldERlZmF1bHRPcHRpb25zIiwiX2dldERlZmF1bHRWYXJzIiwicGx1Z2luTmFtZSIsImFwcCIsIl9nZXRBcHAiLCJsb2d2IiwiZW52aXJvbm1lbnQiLCJwcm9kdWN0aW9uIiwiYnJvd3NlciIsIndhdGNoIiwibG9nIiwiX2dldFZlcnNpb25zIiwiYnVpbGRzdGVwIiwiX3RvUHJvZCIsImUiLCJ0b1N0cmluZyIsIl90aGlzQ29tcGlsYXRpb24iLCJjb21waWxlciIsImNvbXBpbGF0aW9uIiwic2NyaXB0IiwicnVuU2NyaXB0IiwiZXJyIiwiX2NvbXBpbGF0aW9uIiwiZXh0Q29tcG9uZW50cyIsIl9nZXRBbGxDb21wb25lbnRzIiwiaG9va3MiLCJzdWNjZWVkTW9kdWxlIiwidGFwIiwibW9kdWxlIiwicmVzb3VyY2UiLCJtYXRjaCIsIl9zb3VyY2UiLCJfdmFsdWUiLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwiZGVwcyIsIl9leHRyYWN0RnJvbVNvdXJjZSIsImZpbmlzaE1vZHVsZXMiLCJtb2R1bGVzIiwiX3dyaXRlRmlsZXNUb1Byb2RGb2xkZXIiLCJodG1sV2VicGFja1BsdWdpbkJlZm9yZUh0bWxHZW5lcmF0aW9uIiwiZGF0YSIsInBhdGgiLCJqc1BhdGgiLCJqb2luIiwiZXh0UGF0aCIsImNzc1BhdGgiLCJhc3NldHMiLCJqcyIsInVuc2hpZnQiLCJjc3MiLCJfYWZ0ZXJDb21waWxlIiwiX2VtaXQiLCJjYWxsYmFjayIsImVtaXQiLCJvdXRwdXRQYXRoIiwiZGV2U2VydmVyIiwiY29udGVudEJhc2UiLCJfcHJlcGFyZUZvckJ1aWxkIiwiY29tbWFuZCIsInJlYnVpbGQiLCJwYXJtcyIsInByb2ZpbGUiLCJ3YXRjaFN0YXJ0ZWQiLCJfYnVpbGRFeHRCdW5kbGUiLCJfZG9uZSIsInN0YXRzIiwiZXJyb3JzIiwibGVuZ3RoIiwiY2hhbGsiLCJjb25zb2xlIiwicmVkIiwicHJvY2VzcyIsImV4aXQiLCJfdG9EZXYiLCJicm93c2VyQ291bnQiLCJ1cmwiLCJwb3J0Iiwib3BuIiwib3V0cHV0IiwicGFja2FnZXMiLCJ0b29sa2l0IiwidGhlbWUiLCJyaW1yYWYiLCJta2RpcnAiLCJmc3giLCJmaXJzdFRpbWUiLCJzeW5jIiwiYnVpbGRYTUwiLCJjcmVhdGVBcHBKc29uIiwiY3JlYXRlV29ya3NwYWNlSnNvbiIsImNyZWF0ZUpTRE9NRW52aXJvbm1lbnQiLCJ3cml0ZUZpbGVTeW5jIiwiY3dkIiwiZnJvbVBhdGgiLCJ0b1BhdGgiLCJjb3B5U3luYyIsInJlcGxhY2UiLCJmcm9tUmVzb3VyY2VzIiwidG9SZXNvdXJjZXMiLCJtYW5pZmVzdCIsImJ1bmRsZURpciIsInRyaW0iLCJzZW5jaGEiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uQnVpbGREb25lIiwib3B0cyIsInNpbGVudCIsInN0ZGlvIiwiZW5jb2RpbmciLCJfZXhlY3V0ZUFzeW5jIiwidGhlbiIsInJlYXNvbiIsIkRFRkFVTFRfU1VCU1RSUyIsInN1YnN0cmluZ3MiLCJjcm9zc1NwYXduIiwic3RyaW5naWZ5IiwiY2hpbGQiLCJvbiIsImNvZGUiLCJzaWduYWwiLCJFcnJvciIsImVycm9yIiwic3Rkb3V0Iiwic3RyIiwiZmlsZW5hbWUiLCJ0b3VjaEZpbGUiLCJkIiwiRGF0ZSIsInRvTG9jYWxlU3RyaW5nIiwic29tZSIsInYiLCJpbmRleE9mIiwic3RkZXJyIiwic3RySmF2YU9wdHMiLCJzY3JpcHRQYXRoIiwiY2hpbGRQcm9jZXNzIiwiaW52b2tlZCIsImZvcmsiLCJfdG9YdHlwZSIsInByZWZpeCIsInBsYXRmb3JtIiwiZ3JlZW4iLCJmcmFtZXdvcmtOYW1lIiwicGx1Z2luUGF0aCIsInBsdWdpblBrZyIsInBsdWdpblZlcnNpb24iLCJ2ZXJzaW9uIiwiX3Jlc29sdmVkIiwiZWRpdGlvbiIsIndlYnBhY2tQYXRoIiwid2VicGFja1BrZyIsIndlYnBhY2tWZXJzaW9uIiwiZXh0UGtnIiwiZXh0VmVyc2lvbiIsImNtZFBhdGgiLCJjbWRQa2ciLCJjbWRWZXJzaW9uIiwidmVyc2lvbl9mdWxsIiwiZnJhbWV3b3JrSW5mbyIsImZyYW1ld29ya1BhdGgiLCJmcmFtZXdvcmtQa2ciLCJmcmFtZXdvcmtWZXJzaW9uIiwibWVzc2FnZSIsInMiLCJjdXJzb3JUbyIsImNsZWFyTGluZSIsIndyaXRlIiwibG9naCIsImgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDTyxTQUFTQSxZQUFULENBQXNCQyxjQUF0QixFQUFzQztBQUMzQyxRQUFNQyxFQUFFLEdBQUdDLE9BQU8sQ0FBQyxJQUFELENBQWxCOztBQUNBLE1BQUlDLElBQUksR0FBRyxFQUFYO0FBQ0EsTUFBSUMsT0FBTyxHQUFHLEVBQWQ7O0FBQ0EsTUFBSTtBQUNGLFFBQUlKLGNBQWMsQ0FBQ0ssU0FBZixJQUE0QkMsU0FBaEMsRUFBMkM7QUFDekNILE1BQUFBLElBQUksQ0FBQ0ksWUFBTCxHQUFvQixFQUFwQjtBQUNBSixNQUFBQSxJQUFJLENBQUNJLFlBQUwsQ0FBa0JDLElBQWxCLENBQXVCLHNIQUF2QjtBQUNBLFVBQUlDLENBQUMsR0FBRyxFQUFSO0FBQ0FBLE1BQUFBLENBQUMsQ0FBQ04sSUFBRixHQUFTQSxJQUFUO0FBQ0EsYUFBT00sQ0FBUDtBQUNEOztBQUNELFFBQUlKLFNBQVMsR0FBR0wsY0FBYyxDQUFDSyxTQUEvQjtBQUNBLFFBQUlLLFNBQVMsR0FBR1YsY0FBYyxDQUFDVSxTQUEvQjtBQUNBLFFBQUlDLE9BQU8s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Z0JBQVEsQ0FBQyxRQUFEO0FBRkQsT0F0Q0c7QUEwQ1osaUJBQVc7QUFDVCx3QkFBZ0IsMERBRFA7QUFFVCxnQkFBUSxDQUFDLFFBQUQ7QUFGQztBQTFDQyxLQUZUO0FBaURMLDRCQUF3QjtBQWpEbkIsR0FBUDtBQW1ERDs7QUFHRCxTQUFTTSxrQkFBVCxHQUE4QjtBQUM1QixTQUFPO0FBQ0xkLElBQUFBLFNBQVMsRUFBRSxPQUROO0FBRUwrRixJQUFBQSxPQUFPLEVBQUUsUUFGSjtBQUdMQyxJQUFBQSxLQUFLLEVBQUUsZ0JBSEY7QUFJTDVCLElBQUFBLElBQUksRUFBRSxLQUpEO0FBS0xuQyxJQUFBQSxNQUFNLEVBQUUsSUFMSDtBQU1MMEQsSUFBQUEsSUFBSSxFQUFFLElBTkQ7QUFPTEcsSUFBQUEsUUFBUSxFQUFFLEVBUEw7QUFTTGxCLElBQUFBLE9BQU8sRUFBRSxFQVRKO0FBVUx4RCxJQUFBQSxXQUFXLEVBQUUsYUFWUjtBQVdMZixJQUFBQSxTQUFTLEVBQUUsSUFYTjtBQVlMaUIsSUFBQUEsT0FBTyxFQUFFLEtBWko7QUFhTEMsSUFBQUEsS0FBSyxFQUFFLEtBYkY7QUFjTGpCLElBQUFBLE9BQU8sRUFBRTtBQWRKLEdBQVA7QUFnQkQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBfY29uc3RydWN0b3IoaW5pdGlhbE9wdGlvbnMpIHtcbiAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpXG4gIHZhciB2YXJzID0ge31cbiAgdmFyIG9wdGlvbnMgPSB7fVxuICB0cnkge1xuICAgIGlmIChpbml0aWFsT3B0aW9ucy5mcmFtZXdvcmsgPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXJzLnBsdWdpbkVycm9ycyA9IFtdXG4gICAgICB2YXJzLnBsdWdpbkVycm9ycy5wdXNoKCd3ZWJwYWNrIGNvbmZpZzogZnJhbWV3b3JrIHBhcmFtZXRlciBvbiBleHQtd2VicGFjay1wbHVnaW4gaXMgbm90IGRlZmluZWQgLSB2YWx1ZXM6IHJlYWN0LCBhbmd1bGFyLCBleHRqcywgY29tcG9uZW50cycpXG4gICAgICB2YXIgbyA9IHt9XG4gICAgICBvLnZhcnMgPSB2YXJzXG4gICAgICByZXR1cm4gb1xuICAgIH1cbiAgICB2YXIgZnJhbWV3b3JrID0gaW5pdGlhbE9wdGlvbnMuZnJhbWV3b3JrXG4gICAgdmFyIHRyZWVzaGFrZSA9IGluaXRpYWxPcHRpb25zLnRyZWVzaGFrZVxuICAgIHZhciB2ZXJib3NlID0gaW5pdGlhbE9wdGlvbnMudmVyYm9zZVxuXG4gICAgY29uc3QgdmFsaWRhdGVPcHRpb25zID0gcmVxdWlyZSgnc2NoZW1hLXV0aWxzJylcbiAgICB2YWxpZGF0ZU9wdGlvbnMoX2dldFZhbGlkYXRlT3B0aW9ucygpLCBpbml0aWFsT3B0aW9ucywgJycpXG5cbiAgICBjb25zdCByYyA9IChmcy5leGlzdHNTeW5jKGAuZXh0LSR7ZnJhbWV3b3JrfXJjYCkgJiYgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoYC5leHQtJHtmcmFtZXdvcmt9cmNgLCAndXRmLTgnKSkgfHwge30pXG4gICAgb3B0aW9ucyA9IHsgLi4uX2dldERlZmF1bHRPcHRpb25zKCksIC4uLmluaXRpYWxPcHRpb25zLCAuLi5yYyB9XG5cbiAgICB2YXJzID0gcmVxdWlyZShgLi8ke2ZyYW1ld29ya31VdGlsYCkuX2dldERlZmF1bHRWYXJzKClcbiAgICB2YXJzLnBsdWdpbk5hbWUgPSAnZXh0LXdlYnBhY2stcGx1Z2luJ1xuICAgIHZhcnMuYXBwID0gX2dldEFwcCgpXG4gICAgdmFyIHBsdWdpbk5hbWUgPSB2YXJzLnBsdWdpbk5hbWVcbiAgICB2YXIgYXBwID0gdmFycy5hcHBcblxuICAgIGxvZ3YodmVyYm9zZSwgJ0ZVTkNUSU9OIF9jb25zdHJ1Y3RvcicpXG4gICAgbG9ndih2ZXJib3NlLCBgcGx1Z2luTmFtZSAtICR7cGx1Z2luTmFtZX1gKVxuICAgIGxvZ3YodmVyYm9zZSwgYGFwcCAtICR7YXBwfWApXG5cbiAgICBpZiAob3B0aW9ucy5lbnZpcm9ubWVudCA9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhcnMucHJvZHVjdGlvbiA9IHRydWVcbiAgICAgIG9wdGlvbnMuYnJvd3NlciA9ICdubydcbiAgICAgIG9wdGlvbnMud2F0Y2ggPSAnbm8nXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFycy5wcm9kdWN0aW9uID0gZmFsc2VcbiAgICB9XG4gICAgXG4gICAgLy9sb2d2KHZlcmJvc2UsIGBvcHRpb25zOmApO2lmICh2ZXJib3NlID09ICd5ZXMnKSB7Y29uc29sZS5kaXIob3B0aW9ucyl9XG4gICAgLy9sb2d2KHZlcmJvc2UsIGB2YXJzOmApO2lmICh2ZXJib3NlID09ICd5ZXMnKSB7Y29uc29sZS5kaXIodmFycyl9XG4gICAgXG4gICAgbG9nKGFwcCwgX2dldFZlcnNpb25zKHBsdWdpbk5hbWUsIGZyYW1ld29yaykpXG5cbiAgICBpZiAoZnJhbWV3b3JrID09ICdyZWFjdCcgfHwgZnJhbWV3b3JrID09ICdleHRqcycpIHtcbiAgICAgIGlmICh2YXJzLnByb2R1Y3Rpb24gPT0gdHJ1ZSkge1xuICAgICAgICB2YXJzLmJ1aWxkc3RlcCA9ICcxIG9mIDEnXG4gICAgICAgIGxvZyhhcHAsICdTdGFydGluZyBQcm9kdWN0aW9uIEJ1aWxkIGZvciAnICsgZnJhbWV3b3JrKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHZhcnMuYnVpbGRzdGVwID0gJzEgb2YgMSdcbiAgICAgICAgbG9nKGFwcCwgJ1N0YXJ0aW5nIGRldmVsb3BtZW50IGJ1aWxkIGZvciAnICsgZnJhbWV3b3JrKVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh2YXJzLnByb2R1Y3Rpb24gPT0gdHJ1ZSkge1xuICAgICAgaWYgKHRyZWVzaGFrZSA9PSAneWVzJykge1xuICAgICAgICB2YXJzLmJ1aWxkc3RlcCA9ICcxIG9mIDInXG4gICAgICAgIGxvZyhhcHAsICdTdGFydGluZyBwcm9kdWN0aW9uIGJ1aWxkIGZvciAnICsgZnJhbWV3b3JrICsgJyAtICcgKyB2YXJzLmJ1aWxkc3RlcClcbiAgICAgICAgcmVxdWlyZShgLi8ke2ZyYW1ld29ya31VdGlsYCkuX3RvUHJvZCh2YXJzLCBvcHRpb25zKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHZhcnMuYnVpbGRzdGVwID0gJzIgb2YgMidcbiAgICAgICAgbG9nKGFwcCwgJ0NvbnRpbnVpbmcgcHJvZHVjdGlvbiBidWlsZCBmb3IgJyArIGZyYW1ld29yayArICcgLSAnICsgdmFycy5idWlsZHN0ZXApXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFycy5idWlsZHN0ZXAgPSAnMSBvZiAxJ1xuICAgICAgbG9nKGFwcCwgJ1N0YXJ0aW5nIGRldmVsb3BtZW50IGJ1aWxkIGZvciAnICsgZnJhbWV3b3JrKVxuICAgIH1cbiAgICBsb2d2KHZlcmJvc2UsICdCdWlsZGluZyBmb3IgJyArIG9wdGlvbnMuZW52aXJvbm1lbnQgKyAnLCAnICsgJ1RyZWVzaGFrZSBpcyAnICsgb3B0aW9ucy50cmVlc2hha2UpXG5cbiAgICB2YXIgbyA9IHt9XG4gICAgby52YXJzID0gdmFyc1xuICAgIG8ub3B0aW9ucyA9IG9wdGlvbnNcbiAgICByZXR1cm4gb1xuICB9XG4gIGNhdGNoIChlKSB7XG4gICAgdGhyb3cgJ19jb25zdHJ1Y3RvcjogJyArIGUudG9TdHJpbmcoKVxuICB9XG59XG5cbi8vKioqKioqKioqKlxuZXhwb3J0IGZ1bmN0aW9uIF90aGlzQ29tcGlsYXRpb24oY29tcGlsZXIsIGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFwcCA9IHZhcnMuYXBwXG4gICAgdmFyIHZlcmJvc2UgPSBvcHRpb25zLnZlcmJvc2VcbiAgICBsb2d2KHZlcmJvc2UsICdGVU5DVElPTiBfdGhpc0NvbXBpbGF0aW9uJylcbiAgICBsb2d2KHZlcmJvc2UsIGBvcHRpb25zLnNjcmlwdDogJHtvcHRpb25zLnNjcmlwdCB9YClcbiAgICBsb2d2KHZlcmJvc2UsIGBidWlsZHN0ZXA6ICR7dmFycy5idWlsZHN0ZXB9YClcblxuICAgIGlmICh2YXJzLmJ1aWxkc3RlcCA9PSAnMSBvZiAxJyB8fCB2YXJzLmJ1aWxkc3RlcCA9PSAnMSBvZiAyJykge1xuICAgICAgaWYgKG9wdGlvbnMuc2NyaXB0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChvcHRpb25zLnNjcmlwdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zY3JpcHQgIT0gJycpIHtcbiAgICAgICAgICAgIGxvZyhhcHAsIGBTdGFydGVkIHJ1bm5pbmcgJHtvcHRpb25zLnNjcmlwdH1gKVxuICAgICAgICAgICAgcnVuU2NyaXB0KG9wdGlvbnMuc2NyaXB0LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChlcnIpIHRocm93IGVycjtcbiAgICAgICAgICAgICAgbG9nKGFwcCwgYEZpbmlzaGVkIHJ1bm5pbmcgJHtvcHRpb25zLnNjcmlwdH1gKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjYXRjaChlKSB7XG4gICAgdGhyb3cgJ190aGlzQ29tcGlsYXRpb246ICcgKyBlLnRvU3RyaW5nKClcbiAgfVxufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBfY29tcGlsYXRpb24oY29tcGlsZXIsIGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFwcCA9IHZhcnMuYXBwXG4gICAgdmFyIHZlcmJvc2UgPSBvcHRpb25zLnZlcmJvc2VcbiAgICB2YXIgZnJhbWV3b3JrID0gb3B0aW9ucy5mcmFtZXdvcmtcbiAgICBsb2d2KHZlcmJvc2UsICdGVU5DVElPTiBfY29tcGlsYXRpb24nKVxuICAgIFxuICAgIC8vIGlmIChmcmFtZXdvcmsgPT0gJ2V4dGpzJykge1xuICAgIC8vICAgbG9ndih2ZXJib3NlLCAnRlVOQ1RJT04gX2NvbXBpbGF0aW9uIGVuZCAoZXh0anMpJylcbiAgICAvLyAgIHJldHVyblxuICAgIC8vIH1cblxuICAgIGlmIChmcmFtZXdvcmsgIT0gJ2V4dGpzJykge1xuICAgICAgdmFyIGV4dENvbXBvbmVudHMgPSBbXVxuICAgICAgaWYgKHZhcnMuYnVpbGRzdGVwID09ICcxIG9mIDInKSB7XG4gICAgICAgIGV4dENvbXBvbmVudHMgPSByZXF1aXJlKGAuLyR7ZnJhbWV3b3JrfVV0aWxgKS5fZ2V0QWxsQ29tcG9uZW50cyh2YXJzLCBvcHRpb25zKVxuICAgICAgfVxuICAgICAgY29tcGlsYXRpb24uaG9va3Muc3VjY2VlZE1vZHVsZS50YXAoYGV4dC1zdWNjZWVkLW1vZHVsZWAsIG1vZHVsZSA9PiB7XG4gICAgICAgIGlmIChtb2R1bGUucmVzb3VyY2UgJiYgIW1vZHVsZS5yZXNvdXJjZS5tYXRjaCgvbm9kZV9tb2R1bGVzLykpIHtcbiAgICAgICAgICBpZihtb2R1bGUucmVzb3VyY2UubWF0Y2goL1xcLmh0bWwkLykgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYobW9kdWxlLl9zb3VyY2UuX3ZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2RvY3R5cGUgaHRtbCcpID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHZhcnMuZGVwcyA9IFtcbiAgICAgICAgICAgICAgICAuLi4odmFycy5kZXBzIHx8IFtdKSxcbiAgICAgICAgICAgICAgICAuLi5yZXF1aXJlKGAuLyR7ZnJhbWV3b3JrfVV0aWxgKS5fZXh0cmFjdEZyb21Tb3VyY2UobW9kdWxlLCBvcHRpb25zLCBjb21waWxhdGlvbiwgZXh0Q29tcG9uZW50cyldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFycy5kZXBzID0gW1xuICAgICAgICAgICAgICAuLi4odmFycy5kZXBzIHx8IFtdKSxcbiAgICAgICAgICAgICAgLi4ucmVxdWlyZShgLi8ke2ZyYW1ld29ya31VdGlsYCkuX2V4dHJhY3RGcm9tU291cmNlKG1vZHVsZSwgb3B0aW9ucywgY29tcGlsYXRpb24sIGV4dENvbXBvbmVudHMpXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgaWYgKHZhcnMuYnVpbGRzdGVwID09ICcxIG9mIDInKSB7XG4gICAgICAgIGNvbXBpbGF0aW9uLmhvb2tzLmZpbmlzaE1vZHVsZXMudGFwKGBleHQtZmluaXNoLW1vZHVsZXNgLCBtb2R1bGVzID0+IHtcbiAgICAgICAgICByZXF1aXJlKGAuLyR7ZnJhbWV3b3JrfVV0aWxgKS5fd3JpdGVGaWxlc1RvUHJvZEZvbGRlcih2YXJzLCBvcHRpb25zKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKHZhcnMuYnVpbGRzdGVwID09ICcxIG9mIDEnIHx8IHZhcnMuYnVpbGRzdGVwID09ICcyIG9mIDInKSB7XG4gICAgICAgIGNvbXBpbGF0aW9uLmhvb2tzLmh0bWxXZWJwYWNrUGx1Z2luQmVmb3JlSHRtbEdlbmVyYXRpb24udGFwKGBleHQtaHRtbC1nZW5lcmF0aW9uYCwoZGF0YSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbiAgICAgICAgICB2YXIganNQYXRoID0gcGF0aC5qb2luKHZhcnMuZXh0UGF0aCwgJ2V4dC5qcycpXG4gICAgICAgICAgdmFyIGNzc1BhdGggPSBwYXRoLmpvaW4odmFycy5leHRQYXRoLCAnZXh0LmNzcycpXG4gICAgICAgICAgZGF0YS5hc3NldHMuanMudW5zaGlmdChqc1BhdGgpXG4gICAgICAgICAgZGF0YS5hc3NldHMuY3NzLnVuc2hpZnQoY3NzUGF0aClcbiAgICAgICAgICBsb2coYXBwLCBgQWRkaW5nICR7anNQYXRofSBhbmQgJHtjc3NQYXRofSB0byBpbmRleC5odG1sYClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuICBjYXRjaChlKSB7XG4gICAgdGhyb3cgJ19jb21waWxhdGlvbjogJyArIGUudG9TdHJpbmcoKVxuLy8gICAgbG9ndihvcHRpb25zLnZlcmJvc2UsZSlcbi8vICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCdfY29tcGlsYXRpb246ICcgKyBlKVxuICB9XG59XG5cbi8vKioqKioqKioqKlxuZXhwb3J0IGZ1bmN0aW9uIF9hZnRlckNvbXBpbGUoY29tcGlsZXIsIGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFwcCA9IHZhcnMuYXBwXG4gICAgdmFyIHZlcmJvc2UgPSBvcHRpb25zLnZlcmJvc2VcbiAgICB2YXIgZnJhbWV3b3JrID0gb3B0aW9ucy5mcmFtZXdvcmtcbiAgICBsb2d2KHZlcmJvc2UsICdGVU5DVElPTiBfYWZ0ZXJDb21waWxlJylcbiAgICBpZiAoZnJhbWV3b3JrID09ICdleHRqcycpIHtcbiAgICAgIHJlcXVpcmUoYC4vZXh0anNVdGlsYCkuX2FmdGVyQ29tcGlsZShjb21waWxhdGlvbiwgdmFycywgb3B0aW9ucylcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsb2d2KHZlcmJvc2UsICdGVU5DVElPTiBfYWZ0ZXJDb21waWxlIG5vdCBydW4nKVxuICAgIH1cbiAgfVxuICBjYXRjaChlKSB7XG4gICAgdGhyb3cgJ19hZnRlckNvbXBpbGU6ICcgKyBlLnRvU3RyaW5nKClcbiAgfVxufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfZW1pdChjb21waWxlciwgY29tcGlsYXRpb24sIHZhcnMsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuICAgIHZhciBhcHAgPSB2YXJzLmFwcFxuICAgIHZhciB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlXG4gICAgdmFyIGVtaXQgPSBvcHRpb25zLmVtaXRcbiAgICB2YXIgZnJhbWV3b3JrID0gb3B0aW9ucy5mcmFtZXdvcmtcbiAgICBsb2d2KHZlcmJvc2UsJ0ZVTkNUSU9OIF9lbWl0JylcbiAgICBpZiAoZW1pdCA9PSAneWVzJykge1xuICAgICAgaWYgKHZhcnMuYnVpbGRzdGVwID09ICcxIG9mIDEnIHx8IHZhcnMuYnVpbGRzdGVwID09ICcxIG9mIDInKSB7XG4gICAgICAgIGxldCBvdXRwdXRQYXRoID0gcGF0aC5qb2luKGNvbXBpbGVyLm91dHB1dFBhdGgsdmFycy5leHRQYXRoKVxuICAgICAgICBpZiAoY29tcGlsZXIub3V0cHV0UGF0aCA9PT0gJy8nICYmIGNvbXBpbGVyLm9wdGlvbnMuZGV2U2VydmVyKSB7XG4gICAgICAgICAgb3V0cHV0UGF0aCA9IHBhdGguam9pbihjb21waWxlci5vcHRpb25zLmRldlNlcnZlci5jb250ZW50QmFzZSwgb3V0cHV0UGF0aClcbiAgICAgICAgfVxuICAgICAgICBsb2d2KHZlcmJvc2UsJ291dHB1dFBhdGg6ICcgKyBvdXRwdXRQYXRoKVxuICAgICAgICBsb2d2KHZlcmJvc2UsJ2ZyYW1ld29yazogJyArIGZyYW1ld29yaylcbiAgICAgICAgaWYgKGZyYW1ld29yayAhPSAnZXh0anMnKSB7XG4gICAgICAgICAgX3ByZXBhcmVGb3JCdWlsZChhcHAsIHZhcnMsIG9wdGlvbnMsIG91dHB1dFBhdGgsIGNvbXBpbGF0aW9uKVxuICAgICAgICB9XG4gICAgICAgIHZhciBjb21tYW5kID0gJydcbiAgICAgICAgaWYgKG9wdGlvbnMud2F0Y2ggPT0gJ3llcycgJiYgdmFycy5wcm9kdWN0aW9uID09IGZhbHNlKVxuICAgICAgICAgIHtjb21tYW5kID0gJ3dhdGNoJ31cbiAgICAgICAgZWxzZSBcbiAgICAgICAgICB7Y29tbWFuZCA9ICdidWlsZCd9XG4gICAgICAgIGlmICh2YXJzLnJlYnVpbGQgPT0gdHJ1ZSkge1xuICAgICAgICAgIHZhciBwYXJtcyA9IFtdXG4gICAgICAgICAgaWYgKG9wdGlvbnMucHJvZmlsZSA9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5wcm9maWxlID09ICcnIHx8IG9wdGlvbnMucHJvZmlsZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSAnYnVpbGQnKVxuICAgICAgICAgICAgICB7IHBhcm1zID0gWydhcHAnLCBjb21tYW5kLCBvcHRpb25zLmVudmlyb25tZW50XSB9XG4gICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAgICB7IHBhcm1zID0gWydhcHAnLCBjb21tYW5kLCAnLS13ZWItc2VydmVyJywgJ2ZhbHNlJywgb3B0aW9ucy5lbnZpcm9ubWVudF0gfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb21tYW5kID09ICdidWlsZCcpIFxuICAgICAgICAgICAgICB7cGFybXMgPSBbJ2FwcCcsIGNvbW1hbmQsIG9wdGlvbnMucHJvZmlsZSwgb3B0aW9ucy5lbnZpcm9ubWVudF19XG4gICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAgICB7cGFybXMgPSBbJ2FwcCcsIGNvbW1hbmQsICctLXdlYi1zZXJ2ZXInLCAnZmFsc2UnLCBvcHRpb25zLnByb2ZpbGUsIG9wdGlvbnMuZW52aXJvbm1lbnRdfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFycy53YXRjaFN0YXJ0ZWQgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGF3YWl0IF9idWlsZEV4dEJ1bmRsZShhcHAsIGNvbXBpbGF0aW9uLCBvdXRwdXRQYXRoLCBwYXJtcywgdmFycywgb3B0aW9ucylcbiAgICAgICAgICAgIHZhcnMud2F0Y2hTdGFydGVkID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbG9ndih2ZXJib3NlLCdOT1QgcnVubmluZyBlbWl0JylcbiAgICAgICAgY2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxvZ3YodmVyYm9zZSwnZW1pdCBpcyBubycpXG4gICAgICBjYWxsYmFjaygpXG4gICAgfVxuICB9XG4gIGNhdGNoKGUpIHtcbiAgICBjYWxsYmFjaygpXG4gICAgdGhyb3cgJ19lbWl0OiAnICsgZS50b1N0cmluZygpXG4gICAgLy8gbG9ndihvcHRpb25zLnZlcmJvc2UsZSlcbiAgICAvLyBjb21waWxhdGlvbi5lcnJvcnMucHVzaCgnX2VtaXQ6ICcgKyBlKVxuICAgIC8vIGNhbGxiYWNrKClcbiAgfVxufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBfZG9uZShzdGF0cywgdmFycywgb3B0aW9ucykge1xuICB0cnkge1xuICAgIHZhciB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlXG4gICAgdmFyIGZyYW1ld29yayA9IG9wdGlvbnMuZnJhbWV3b3JrXG4gICAgbG9ndih2ZXJib3NlLCdGVU5DVElPTiBfZG9uZScpXG4gICAgaWYgKHN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyAmJiBzdGF0cy5jb21waWxhdGlvbi5lcnJvcnMubGVuZ3RoKSAvLyAmJiBwcm9jZXNzLmFyZ3YuaW5kZXhPZignLS13YXRjaCcpID09IC0xKVxuICAgIHtcbiAgICAgIHZhciBjaGFsayA9IHJlcXVpcmUoJ2NoYWxrJyk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKicpKTtcbiAgICAgIGNvbnNvbGUubG9nKHN0YXRzLmNvbXBpbGF0aW9uLmVycm9yc1swXSk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG5cbiAgICAvL21qZyByZWZhY3RvclxuICAgIGlmICh2YXJzLnByb2R1Y3Rpb24gPT0gdHJ1ZSAmJiBvcHRpb25zLnRyZWVzaGFrZSA9PSAnbm8nICYmIGZyYW1ld29yayA9PSAnYW5ndWxhcicpIHtcbiAgICAgIHJlcXVpcmUoYC4vJHtvcHRpb25zLmZyYW1ld29ya31VdGlsYCkuX3RvRGV2KHZhcnMsIG9wdGlvbnMpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBpZihvcHRpb25zLmJyb3dzZXIgPT0gJ3llcycgJiYgb3B0aW9ucy53YXRjaCA9PSAneWVzJyAmJiB2YXJzLnByb2R1Y3Rpb24gPT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHZhcnMuYnJvd3NlckNvdW50ID09IDApIHtcbiAgICAgICAgICB2YXIgdXJsID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6JyArIG9wdGlvbnMucG9ydFxuICAgICAgICAgIHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZyh2YXJzLmFwcCwgYE9wZW5pbmcgYnJvd3NlciBhdCAke3VybH1gKVxuICAgICAgICAgIHZhcnMuYnJvd3NlckNvdW50KytcbiAgICAgICAgICBjb25zdCBvcG4gPSByZXF1aXJlKCdvcG4nKVxuICAgICAgICAgIG9wbih1cmwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpXG4gICAgfVxuICAgIGlmICh2YXJzLmJ1aWxkc3RlcCA9PSAnMSBvZiAxJykge1xuICAgICAgaWYgKHZhcnMucHJvZHVjdGlvbiA9PSB0cnVlKSB7XG4gICAgICAgIHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZyh2YXJzLmFwcCwgYEVuZGluZyBwcm9kdWN0aW9uIGJ1aWxkYClcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2codmFycy5hcHAsIGBFbmRpbmcgZGV2ZWxvcG1lbnQgYnVpbGRgKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFycy5idWlsZHN0ZXAgPT0gJzIgb2YgMicpIHtcbiAgICAgIHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZyh2YXJzLmFwcCwgYEVuZGluZyBwcm9kdWN0aW9uIGJ1aWxkYClcbiAgICB9XG4gIH1cbiAgY2F0Y2goZSkge1xuLy8gICAgcmVxdWlyZSgnLi9wbHVnaW5VdGlsJykubG9ndihvcHRpb25zLnZlcmJvc2UsZSlcbiAgICB0aHJvdyAnX2RvbmU6ICcgKyBlLnRvU3RyaW5nKClcbiAgfVxufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBfcHJlcGFyZUZvckJ1aWxkKGFwcCwgdmFycywgb3B0aW9ucywgb3V0cHV0LCBjb21waWxhdGlvbikge1xuICB0cnkge1xuICAgIHZhciB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlXG4gICAgdmFyIHBhY2thZ2VzID0gb3B0aW9ucy5wYWNrYWdlc1xuICAgIHZhciB0b29sa2l0ID0gb3B0aW9ucy50b29sa2l0XG4gICAgdmFyIHRoZW1lID0gb3B0aW9ucy50aGVtZVxuICAgIGxvZ3YodmVyYm9zZSwnRlVOQ1RJT04gX3ByZXBhcmVGb3JCdWlsZCcpXG4gICAgY29uc3QgcmltcmFmID0gcmVxdWlyZSgncmltcmFmJylcbiAgICBjb25zdCBta2RpcnAgPSByZXF1aXJlKCdta2RpcnAnKVxuICAgIGNvbnN0IGZzeCA9IHJlcXVpcmUoJ2ZzLWV4dHJhJylcbiAgICBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJylcbiAgICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG4gICAgdGhlbWUgPSB0aGVtZSB8fCAodG9vbGtpdCA9PT0gJ2NsYXNzaWMnID8gJ3RoZW1lLXRyaXRvbicgOiAndGhlbWUtbWF0ZXJpYWwnKVxuICAgIGxvZ3YodmVyYm9zZSwnZmlyc3RUaW1lOiAnICsgdmFycy5maXJzdFRpbWUpXG4gICAgaWYgKHZhcnMuZmlyc3RUaW1lKSB7XG4gICAgICByaW1yYWYuc3luYyhvdXRwdXQpXG4gICAgICBta2RpcnAuc3luYyhvdXRwdXQpXG4gICAgICBjb25zdCBidWlsZFhNTCA9IHJlcXVpcmUoJy4vYXJ0aWZhY3RzJykuYnVpbGRYTUxcbiAgICAgIGNvbnN0IGNyZWF0ZUFwcEpzb24gPSByZXF1aXJlKCcuL2FydGlmYWN0cycpLmNyZWF0ZUFwcEpzb25cbiAgICAgIGNvbnN0IGNyZWF0ZVdvcmtzcGFjZUpzb24gPSByZXF1aXJlKCcuL2FydGlmYWN0cycpLmNyZWF0ZVdvcmtzcGFjZUpzb25cbiAgICAgIGNvbnN0IGNyZWF0ZUpTRE9NRW52aXJvbm1lbnQgPSByZXF1aXJlKCcuL2FydGlmYWN0cycpLmNyZWF0ZUpTRE9NRW52aXJvbm1lbnRcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKG91dHB1dCwgJ2J1aWxkLnhtbCcpLCBidWlsZFhNTCh2YXJzLnByb2R1Y3Rpb24sIG9wdGlvbnMsIG91dHB1dCksICd1dGY4JylcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKG91dHB1dCwgJ2FwcC5qc29uJyksIGNyZWF0ZUFwcEpzb24odGhlbWUsIHBhY2thZ2VzLCB0b29sa2l0LCBvcHRpb25zLCBvdXRwdXQpLCAndXRmOCcpXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihvdXRwdXQsICdqc2RvbS1lbnZpcm9ubWVudC5qcycpLCBjcmVhdGVKU0RPTUVudmlyb25tZW50KG9wdGlvbnMsIG91dHB1dCksICd1dGY4JylcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKG91dHB1dCwgJ3dvcmtzcGFjZS5qc29uJyksIGNyZWF0ZVdvcmtzcGFjZUpzb24ob3B0aW9ucywgb3V0cHV0KSwgJ3V0ZjgnKVxuICAgICAgdmFyIGZyYW1ld29yayA9IHZhcnMuZnJhbWV3b3JrO1xuICAgICAgLy9iZWNhdXNlIG9mIGEgcHJvYmxlbSB3aXRoIGNvbG9ycGlja2VyXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSxgZXh0LSR7ZnJhbWV3b3JrfS91eC9gKSkpIHtcbiAgICAgICAgdmFyIGZyb21QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGBleHQtJHtmcmFtZXdvcmt9L3V4L2ApXG4gICAgICAgIHZhciB0b1BhdGggPSBwYXRoLmpvaW4ob3V0cHV0LCAndXgnKVxuICAgICAgICBmc3guY29weVN5bmMoZnJvbVBhdGgsIHRvUGF0aClcbiAgICAgICAgbG9nKGFwcCwgJ0NvcHlpbmcgKHV4KSAnICsgZnJvbVBhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykgKyAnIHRvOiAnICsgdG9QYXRoLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpKVxuICAgICAgfVxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksYGV4dC0ke2ZyYW1ld29ya30vcGFja2FnZXMvYCkpKSB7XG4gICAgICAgIHZhciBmcm9tUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBgZXh0LSR7ZnJhbWV3b3JrfS9wYWNrYWdlcy9gKVxuICAgICAgICB2YXIgdG9QYXRoID0gcGF0aC5qb2luKG91dHB1dCwgJ3BhY2thZ2VzJylcbiAgICAgICAgZnN4LmNvcHlTeW5jKGZyb21QYXRoLCB0b1BhdGgpXG4gICAgICAgIGxvZyhhcHAsICdDb3B5aW5nICcgKyBmcm9tUGF0aC5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKSArICcgdG86ICcgKyB0b1BhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykpXG4gICAgICB9XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSxgZXh0LSR7ZnJhbWV3b3JrfS9vdmVycmlkZXMvYCkpKSB7XG4gICAgICAgIHZhciBmcm9tUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBgZXh0LSR7ZnJhbWV3b3JrfS9vdmVycmlkZXMvYClcbiAgICAgICAgdmFyIHRvUGF0aCA9IHBhdGguam9pbihvdXRwdXQsICdvdmVycmlkZXMnKVxuICAgICAgICBmc3guY29weVN5bmMoZnJvbVBhdGgsIHRvUGF0aClcbiAgICAgICAgbG9nKGFwcCwgJ0NvcHlpbmcgJyArIGZyb21QYXRoLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpICsgJyB0bzogJyArIHRvUGF0aC5yZXBsYWNlKHByb2Nlc3MuY3dkKCksICcnKSlcbiAgICAgIH1cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCdyZXNvdXJjZXMvJykpKSB7XG4gICAgICAgIHZhciBmcm9tUmVzb3VyY2VzID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdyZXNvdXJjZXMvJylcbiAgICAgICAgdmFyIHRvUmVzb3VyY2VzID0gcGF0aC5qb2luKG91dHB1dCwgJy4uL3Jlc291cmNlcycpXG4gICAgICAgIGZzeC5jb3B5U3luYyhmcm9tUmVzb3VyY2VzLCB0b1Jlc291cmNlcylcbiAgICAgICAgbG9nKGFwcCwgJ0NvcHlpbmcgJyArIGZyb21SZXNvdXJjZXMucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykgKyAnIHRvOiAnICsgdG9SZXNvdXJjZXMucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykpXG4gICAgICB9XG4gICAgfVxuICAgIHZhcnMuZmlyc3RUaW1lID0gZmFsc2VcbiAgICB2YXIganMgPSAnJ1xuICAgIGlmICh2YXJzLnByb2R1Y3Rpb24pIHtcbiAgICAgIGpzID0gdmFycy5kZXBzLmpvaW4oJztcXG4nKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBqcyA9ICdFeHQucmVxdWlyZShbXCJFeHQuKlwiLFwiRXh0LmRhdGEuVHJlZVN0b3JlXCJdKSdcbiAgICB9XG4gICAgaWYgKHZhcnMubWFuaWZlc3QgPT09IG51bGwgfHwganMgIT09IHZhcnMubWFuaWZlc3QpIHtcbiAgICAgIHZhcnMubWFuaWZlc3QgPSBqc1xuICAgICAgY29uc3QgbWFuaWZlc3QgPSBwYXRoLmpvaW4ob3V0cHV0LCAnbWFuaWZlc3QuanMnKVxuICAgICAgZnMud3JpdGVGaWxlU3luYyhtYW5pZmVzdCwganMsICd1dGY4JylcbiAgICAgIHZhcnMucmVidWlsZCA9IHRydWVcbiAgICAgIHZhciBidW5kbGVEaXIgPSBvdXRwdXQucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJylcbiAgICAgIGlmIChidW5kbGVEaXIudHJpbSgpID09ICcnKSB7YnVuZGxlRGlyID0gJy4vJ31cbiAgICAgIGxvZyhhcHAsICdCdWlsZGluZyBFeHQgYnVuZGxlIGF0OiAnICsgYnVuZGxlRGlyKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHZhcnMucmVidWlsZCA9IGZhbHNlXG4gICAgICBsb2coYXBwLCAnRXh0IHJlYnVpbGQgTk9UIG5lZWRlZCcpXG4gICAgfVxuICB9XG4gIGNhdGNoKGUpIHtcbiAgICByZXF1aXJlKCcuL3BsdWdpblV0aWwnKS5sb2d2KG9wdGlvbnMudmVyYm9zZSxlKVxuICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKCdfcHJlcGFyZUZvckJ1aWxkOiAnICsgZSlcbiAgfVxufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBfYnVpbGRFeHRCdW5kbGUoYXBwLCBjb21waWxhdGlvbiwgb3V0cHV0UGF0aCwgcGFybXMsIHZhcnMsIG9wdGlvbnMpIHtcbi8vICB0cnkge1xuICAgIHZhciB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlXG4gICAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpXG4gICAgbG9ndih2ZXJib3NlLCdGVU5DVElPTiBfYnVpbGRFeHRCdW5kbGUnKVxuICAgIGxldCBzZW5jaGE7IHRyeSB7IHNlbmNoYSA9IHJlcXVpcmUoJ0BzZW5jaGEvY21kJykgfSBjYXRjaCAoZSkgeyBzZW5jaGEgPSAnc2VuY2hhJyB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoc2VuY2hhKSkge1xuICAgICAgbG9ndih2ZXJib3NlLCdzZW5jaGEgZm9sZGVyIGV4aXN0cycpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbG9ndih2ZXJib3NlLCdzZW5jaGEgZm9sZGVyIERPRVMgTk9UIGV4aXN0JylcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IG9uQnVpbGREb25lID0gKCkgPT4ge1xuICAgICAgICBsb2d2KHZlcmJvc2UsJ29uQnVpbGREb25lJylcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG4gICAgICB2YXIgb3B0cyA9IHsgY3dkOiBvdXRwdXRQYXRoLCBzaWxlbnQ6IHRydWUsIHN0ZGlvOiAncGlwZScsIGVuY29kaW5nOiAndXRmLTgnfVxuICAgICAgX2V4ZWN1dGVBc3luYyhhcHAsIHNlbmNoYSwgcGFybXMsIG9wdHMsIGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zKS50aGVuIChcbiAgICAgICAgZnVuY3Rpb24oKSB7IG9uQnVpbGREb25lKCkgfSwgXG4gICAgICAgIGZ1bmN0aW9uKHJlYXNvbikgeyByZWplY3QocmVhc29uKSB9XG4gICAgICApXG4gICAgfSlcbiAgLy8gfVxuICAvLyBjYXRjaChlKSB7XG4gIC8vICAgY29uc29sZS5sb2coJ2UnKVxuICAvLyAgIHJlcXVpcmUoJy4vcGx1Z2luVXRpbCcpLmxvZ3Yob3B0aW9ucy52ZXJib3NlLGUpXG4gIC8vICAgY29tcGlsYXRpb24uZXJyb3JzLnB1c2goJ19idWlsZEV4dEJ1bmRsZTogJyArIGUpXG4gIC8vICAgY2FsbGJhY2soKVxuICAvLyB9XG59XG5cbi8vKioqKioqKioqKlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9leGVjdXRlQXN5bmMgKGFwcCwgY29tbWFuZCwgcGFybXMsIG9wdHMsIGNvbXBpbGF0aW9uLCB2YXJzLCBvcHRpb25zKSB7XG4vLyAgdHJ5IHtcbiAgICB2YXIgdmVyYm9zZSA9IG9wdGlvbnMudmVyYm9zZVxuICAgIHZhciBmcmFtZXdvcmsgPSBvcHRpb25zLmZyYW1ld29ya1xuICAgIC8vY29uc3QgREVGQVVMVF9TVUJTVFJTID0gWydbSU5GXSBMb2FkaW5nJywgJ1tJTkZdIFByb2Nlc3NpbmcnLCAnW0xPR10gRmFzaGlvbiBidWlsZCBjb21wbGV0ZScsICdbRVJSXScsICdbV1JOXScsIFwiW0lORl0gU2VydmVyXCIsIFwiW0lORl0gV3JpdGluZ1wiLCBcIltJTkZdIExvYWRpbmcgQnVpbGRcIiwgXCJbSU5GXSBXYWl0aW5nXCIsIFwiW0xPR10gRmFzaGlvbiB3YWl0aW5nXCJdO1xuICAgIGNvbnN0IERFRkFVTFRfU1VCU1RSUyA9IFtcIltJTkZdIHhTZXJ2ZXJcIiwgJ1tJTkZdIExvYWRpbmcnLCAnW0lORl0gQXBwZW5kJywgJ1tJTkZdIFByb2Nlc3NpbmcnLCAnW0lORl0gUHJvY2Vzc2luZyBCdWlsZCcsICdbTE9HXSBGYXNoaW9uIGJ1aWxkIGNvbXBsZXRlJywgJ1tFUlJdJywgJ1tXUk5dJywgXCJbSU5GXSBXcml0aW5nXCIsIFwiW0lORl0gTG9hZGluZyBCdWlsZFwiLCBcIltJTkZdIFdhaXRpbmdcIiwgXCJbTE9HXSBGYXNoaW9uIHdhaXRpbmdcIl07XG4gICAgdmFyIHN1YnN0cmluZ3MgPSBERUZBVUxUX1NVQlNUUlMgXG4gICAgdmFyIGNoYWxrID0gcmVxdWlyZSgnY2hhbGsnKVxuICAgIGNvbnN0IGNyb3NzU3Bhd24gPSByZXF1aXJlKCdjcm9zcy1zcGF3bicpXG4gICAgbG9ndih2ZXJib3NlLCAnRlVOQ1RJT04gX2V4ZWN1dGVBc3luYycpXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbG9ndih2ZXJib3NlLGBjb21tYW5kIC0gJHtjb21tYW5kfWApXG4gICAgICBsb2d2KHZlcmJvc2UsIGBwYXJtcyAtICR7cGFybXN9YClcbiAgICAgIGxvZ3YodmVyYm9zZSwgYG9wdHMgLSAke0pTT04uc3RyaW5naWZ5KG9wdHMpfWApXG4gICAgICBsZXQgY2hpbGQgPSBjcm9zc1NwYXduKGNvbW1hbmQsIHBhcm1zLCBvcHRzKVxuICAgICAgY2hpbGQub24oJ2Nsb3NlJywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBsb2d2KHZlcmJvc2UsIGBvbiBjbG9zZTogYCArIGNvZGUpIFxuICAgICAgICBpZihjb2RlID09PSAwKSB7IHJlc29sdmUoMCkgfVxuICAgICAgICBlbHNlIHsgY29tcGlsYXRpb24uZXJyb3JzLnB1c2goIG5ldyBFcnJvcihjb2RlKSApOyByZXNvbHZlKDApIH1cbiAgICAgIH0pXG4gICAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHsgXG4gICAgICAgIGxvZ3YodmVyYm9zZSwgYG9uIGVycm9yYCkgXG4gICAgICAgIGNvbXBpbGF0aW9uLmVycm9ycy5wdXNoKGVycm9yKVxuICAgICAgICByZXNvbHZlKDApXG4gICAgICB9KVxuICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgdmFyIHN0ciA9IGRhdGEudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIiBcIikudHJpbSgpXG4gICAgICAgIGxvZ3YodmVyYm9zZSwgYCR7c3RyfWApXG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEudG9TdHJpbmcoKS5tYXRjaCgvRmFzaGlvbiB3YWl0aW5nIGZvciBjaGFuZ2VzXFwuXFwuXFwuLykpIHtcblxuICAgICAgICAgIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgICAgICAgICB2YXIgZmlsZW5hbWUgPSBwcm9jZXNzLmN3ZCgpICsgdmFycy50b3VjaEZpbGU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBkID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpXG4gICAgICAgICAgICB2YXIgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhmaWxlbmFtZSk7XG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVuYW1lLCAnLy8nICsgZCwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIGxvZ3YoYXBwLCBgdG91Y2hpbmcgJHtmaWxlbmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgbG9ndihhcHAsIGBOT1QgdG91Y2hpbmcgJHtmaWxlbmFtZX1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKDApXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHN1YnN0cmluZ3Muc29tZShmdW5jdGlvbih2KSB7IHJldHVybiBkYXRhLmluZGV4T2YodikgPj0gMDsgfSkpIHsgXG4gICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShcIltJTkZdXCIsIFwiXCIpXG4gICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShcIltMT0ddXCIsIFwiXCIpXG4gICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykudHJpbSgpXG4gICAgICAgICAgICBpZiAoc3RyLmluY2x1ZGVzKFwiW0VSUl1cIikpIHtcbiAgICAgICAgICAgICAgY29tcGlsYXRpb24uZXJyb3JzLnB1c2goYXBwICsgc3RyLnJlcGxhY2UoL15cXFtFUlJcXF0gL2dpLCAnJykpO1xuICAgICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShcIltFUlJdXCIsIGAke2NoYWxrLnJlZChcIltFUlJdXCIpfWApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2coYXBwLCBzdHIpIFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIGxvZ3Yob3B0aW9ucywgYGVycm9yIG9uIGNsb3NlOiBgICsgZGF0YSkgXG4gICAgICAgIHZhciBzdHIgPSBkYXRhLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCIgXCIpLnRyaW0oKVxuICAgICAgICB2YXIgc3RySmF2YU9wdHMgPSBcIlBpY2tlZCB1cCBfSkFWQV9PUFRJT05TXCI7XG4gICAgICAgIHZhciBpbmNsdWRlcyA9IHN0ci5pbmNsdWRlcyhzdHJKYXZhT3B0cylcbiAgICAgICAgaWYgKCFpbmNsdWRlcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAke2FwcH0gJHtjaGFsay5yZWQoXCJbRVJSXVwiKX0gJHtzdHJ9YClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICAvLyB9XG4gIC8vIGNhdGNoKGUpIHtcbiAgLy8gICBsb2d2KG9wdGlvbnMsZSlcbiAgLy8gICBjb21waWxhdGlvbi5lcnJvcnMucHVzaCgnX2V4ZWN1dGVBc3luYzogJyArIGUpXG4gIC8vICAgY2FsbGJhY2soKVxuICAvLyB9IFxufVxuXG4vLyoqKioqKioqKipcbmZ1bmN0aW9uIHJ1blNjcmlwdChzY3JpcHRQYXRoLCBjYWxsYmFjaykge1xuICB2YXIgY2hpbGRQcm9jZXNzID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpO1xuICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgY2FsbGJhY2sgaGFzIGJlZW4gaW52b2tlZCB0byBwcmV2ZW50IG11bHRpcGxlIGludm9jYXRpb25zXG4gIHZhciBpbnZva2VkID0gZmFsc2U7XG4gIHZhciBwcm9jZXNzID0gY2hpbGRQcm9jZXNzLmZvcmsoc2NyaXB0UGF0aCk7XG4gIC8vIGxpc3RlbiBmb3IgZXJyb3JzIGFzIHRoZXkgbWF5IHByZXZlbnQgdGhlIGV4aXQgZXZlbnQgZnJvbSBmaXJpbmdcbiAgcHJvY2Vzcy5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGludm9rZWQpIHJldHVybjtcbiAgICBpbnZva2VkID0gdHJ1ZTtcbiAgICBjYWxsYmFjayhlcnIpO1xuICB9KTtcbiAgLy8gZXhlY3V0ZSB0aGUgY2FsbGJhY2sgb25jZSB0aGUgcHJvY2VzcyBoYXMgZmluaXNoZWQgcnVubmluZ1xuICBwcm9jZXNzLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpIHtcbiAgICBpZiAoaW52b2tlZCkgcmV0dXJuO1xuICAgIGludm9rZWQgPSB0cnVlO1xuICAgIHZhciBlcnIgPSBjb2RlID09PSAwID8gbnVsbCA6IG5ldyBFcnJvcignZXhpdCBjb2RlICcgKyBjb2RlKTtcbiAgICBjYWxsYmFjayhlcnIpO1xuICB9KTtcbn1cblxuLy8qKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gX3RvWHR5cGUoc3RyKSB7XG4gIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csICctJylcbn1cblxuLy8qKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gX2dldEFwcCgpIHtcbiAgdmFyIGNoYWxrID0gcmVxdWlyZSgnY2hhbGsnKVxuICB2YXIgcHJlZml4ID0gYGBcbiAgY29uc3QgcGxhdGZvcm0gPSByZXF1aXJlKCdvcycpLnBsYXRmb3JtKClcbiAgaWYgKHBsYXRmb3JtID09ICdkYXJ3aW4nKSB7IHByZWZpeCA9IGDihLkg772iZXh0772jOmAgfVxuICBlbHNlIHsgcHJlZml4ID0gYGkgW2V4dF06YCB9XG4gIHJldHVybiBgJHtjaGFsay5ncmVlbihwcmVmaXgpfSBgXG59XG5cbi8vKioqKioqKioqKlxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRWZXJzaW9ucyhwbHVnaW5OYW1lLCBmcmFtZXdvcmtOYW1lKSB7XG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbiAgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpXG4gIHZhciB2ID0ge31cbiAgdmFyIHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwnbm9kZV9tb2R1bGVzL0BzZW5jaGEnLCBwbHVnaW5OYW1lKVxuICB2YXIgcGx1Z2luUGtnID0gKGZzLmV4aXN0c1N5bmMocGx1Z2luUGF0aCsnL3BhY2thZ2UuanNvbicpICYmIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBsdWdpblBhdGgrJy9wYWNrYWdlLmpzb24nLCAndXRmLTgnKSkgfHwge30pO1xuICB2LnBsdWdpblZlcnNpb24gPSBwbHVnaW5Qa2cudmVyc2lvblxuICB2Ll9yZXNvbHZlZCA9IHBsdWdpblBrZy5fcmVzb2x2ZWRcbiAgaWYgKHYuX3Jlc29sdmVkID09IHVuZGVmaW5lZCkge1xuICAgIHYuZWRpdGlvbiA9IGBDb21tZXJjaWFsYFxuICB9XG4gIGVsc2Uge1xuICAgIGlmICgtMSA9PSB2Ll9yZXNvbHZlZC5pbmRleE9mKCdjb21tdW5pdHknKSkge1xuICAgICAgdi5lZGl0aW9uID0gYENvbW1lcmNpYWxgXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdi5lZGl0aW9uID0gYENvbW11bml0eWBcbiAgICB9XG4gIH1cbiAgdmFyIHdlYnBhY2tQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksJ25vZGVfbW9kdWxlcy93ZWJwYWNrJylcbiAgdmFyIHdlYnBhY2tQa2cgPSAoZnMuZXhpc3RzU3luYyh3ZWJwYWNrUGF0aCsnL3BhY2thZ2UuanNvbicpICYmIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHdlYnBhY2tQYXRoKycvcGFja2FnZS5qc29uJywgJ3V0Zi04JykpIHx8IHt9KTtcbiAgdi53ZWJwYWNrVmVyc2lvbiA9IHdlYnBhY2tQa2cudmVyc2lvblxuICB2YXIgZXh0UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCdub2RlX21vZHVsZXMvQHNlbmNoYS9leHQnKVxuICB2YXIgZXh0UGtnID0gKGZzLmV4aXN0c1N5bmMoZXh0UGF0aCsnL3BhY2thZ2UuanNvbicpICYmIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGV4dFBhdGgrJy9wYWNrYWdlLmpzb24nLCAndXRmLTgnKSkgfHwge30pO1xuICB2LmV4dFZlcnNpb24gPSBleHRQa2cuc2VuY2hhLnZlcnNpb25cbiAgdmFyIGNtZFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSxgbm9kZV9tb2R1bGVzL0BzZW5jaGEvY21kYClcbiAgdmFyIGNtZFBrZyA9IChmcy5leGlzdHNTeW5jKGNtZFBhdGgrJy9wYWNrYWdlLmpzb24nKSAmJiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjbWRQYXRoKycvcGFja2FnZS5qc29uJywgJ3V0Zi04JykpIHx8IHt9KTtcbiAgdi5jbWRWZXJzaW9uID0gY21kUGtnLnZlcnNpb25fZnVsbFxuICBpZiAodi5jbWRWZXJzaW9uID09IHVuZGVmaW5lZCkge1xuICAgIHZhciBjbWRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksYG5vZGVfbW9kdWxlcy9Ac2VuY2hhLyR7cGx1Z2luTmFtZX0vbm9kZV9tb2R1bGVzL0BzZW5jaGEvY21kYClcbiAgICB2YXIgY21kUGtnID0gKGZzLmV4aXN0c1N5bmMoY21kUGF0aCsnL3BhY2thZ2UuanNvbicpICYmIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNtZFBhdGgrJy9wYWNrYWdlLmpzb24nLCAndXRmLTgnKSkgfHwge30pO1xuICAgIHYuY21kVmVyc2lvbiA9IGNtZFBrZy52ZXJzaW9uX2Z1bGxcbiAgfVxuICB2YXIgZnJhbWV3b3JrSW5mbyA9ICcnXG4gICBpZiAoZnJhbWV3b3JrTmFtZSAhPSB1bmRlZmluZWQgJiYgZnJhbWV3b3JrTmFtZSAhPSAnZXh0anMnKSB7XG4gICAgdmFyIGZyYW1ld29ya1BhdGggPSAnJ1xuICAgIGlmIChmcmFtZXdvcmtOYW1lID09ICdyZWFjdCcpIHtcbiAgICAgIGZyYW1ld29ya1BhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwnbm9kZV9tb2R1bGVzL3JlYWN0JylcbiAgICB9XG4gICAgaWYgKGZyYW1ld29ya05hbWUgPT0gJ2FuZ3VsYXInKSB7XG4gICAgICBmcmFtZXdvcmtQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksJ25vZGVfbW9kdWxlcy9AYW5ndWxhci9jb3JlJylcbiAgICB9XG4gICAgdmFyIGZyYW1ld29ya1BrZyA9IChmcy5leGlzdHNTeW5jKGZyYW1ld29ya1BhdGgrJy9wYWNrYWdlLmpzb24nKSAmJiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhmcmFtZXdvcmtQYXRoKycvcGFja2FnZS5qc29uJywgJ3V0Zi04JykpIHx8IHt9KTtcbiAgICB2LmZyYW1ld29ya1ZlcnNpb24gPSBmcmFtZXdvcmtQa2cudmVyc2lvblxuICAgIGZyYW1ld29ya0luZm8gPSAnLCAnICsgZnJhbWV3b3JrTmFtZSArICcgdicgKyB2LmZyYW1ld29ya1ZlcnNpb25cbiAgfVxuICByZXR1cm4gJ2V4dC13ZWJwYWNrLXBsdWdpbiB2JyArIHYucGx1Z2luVmVyc2lvbiArICcsIEV4dCBKUyB2JyArIHYuZXh0VmVyc2lvbiArICcgJyArIHYuZWRpdGlvbiArICcgRWRpdGlvbiwgU2VuY2hhIENtZCB2JyArIHYuY21kVmVyc2lvbiArICcsIHdlYnBhY2sgdicgKyB2LndlYnBhY2tWZXJzaW9uICsgZnJhbWV3b3JrSW5mb1xuIH1cblxuLy8qKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gbG9nKGFwcCxtZXNzYWdlKSB7XG4gIHZhciBzID0gYXBwICsgbWVzc2FnZSBcbiAgcmVxdWlyZSgncmVhZGxpbmUnKS5jdXJzb3JUbyhwcm9jZXNzLnN0ZG91dCwgMClcbiAgdHJ5IHtwcm9jZXNzLnN0ZG91dC5jbGVhckxpbmUoKX1jYXRjaChlKSB7fVxuICBwcm9jZXNzLnN0ZG91dC53cml0ZShzKTtwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJylcbn1cblxuLy8qKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gbG9naChhcHAsbWVzc2FnZSkge1xuICB2YXIgaCA9IGZhbHNlXG4gIHZhciBzID0gYXBwICsgbWVzc2FnZSBcbiAgaWYgKGggPT0gdHJ1ZSkge1xuICAgIHJlcXVpcmUoJ3JlYWRsaW5lJykuY3Vyc29yVG8ocHJvY2Vzcy5zdGRvdXQsIDApXG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LmNsZWFyTGluZSgpXG4gICAgfVxuICAgIGNhdGNoKGUpIHt9XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUocylcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJylcbiAgfVxufVxuXG4vLyoqKioqKioqKipcbmV4cG9ydCBmdW5jdGlvbiBsb2d2KHZlcmJvc2UsIHMpIHtcbiAgaWYgKHZlcmJvc2UgPT0gJ3llcycpIHtcbiAgICByZXF1aXJlKCdyZWFkbGluZScpLmN1cnNvclRvKHByb2Nlc3Muc3Rkb3V0LCAwKVxuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC5jbGVhckxpbmUoKVxuICAgIH1cbiAgICBjYXRjaChlKSB7fVxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAtdmVyYm9zZTogJHtzfWApXG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpXG4gIH1cbn1cblxuZnVuY3Rpb24gX2dldFZhbGlkYXRlT3B0aW9ucygpIHtcbiAgcmV0dXJuIHtcbiAgICBcInR5cGVcIjogXCJvYmplY3RcIixcbiAgICBcInByb3BlcnRpZXNcIjoge1xuICAgICAgXCJmcmFtZXdvcmtcIjoge1xuICAgICAgICBcInR5cGVcIjogW1wic3RyaW5nXCJdXG4gICAgICB9LFxuICAgICAgXCJ0b29sa2l0XCI6IHtcbiAgICAgICAgXCJ0eXBlXCI6IFtcInN0cmluZ1wiXVxuICAgICAgfSxcbiAgICAgIFwidGhlbWVcIjoge1xuICAgICAgICBcInR5cGVcIjogW1wic3RyaW5nXCJdXG4gICAgICB9LFxuICAgICAgXCJlbWl0XCI6IHtcbiAgICAgICAgXCJlcnJvck1lc3NhZ2VcIjogXCJzaG91bGQgYmUgJ3llcycgb3IgJ25vJyBzdHJpbmcgdmFsdWUgKE5PVCB0cnVlIG9yIGZhbHNlKVwiLFxuICAgICAgICBcInR5cGVcIjogW1wic3RyaW5nXCJdXG4gICAgICB9LFxuICAgICAgXCJzY3JpcHRcIjoge1xuICAgICAgICBcInR5cGVcIjogW1wic3RyaW5nXCJdXG4gICAgICB9LFxuICAgICAgXCJwb3J0XCI6IHtcbiAgICAgICAgXCJ0eXBlXCI6IFtcImludGVnZXJcIl1cbiAgICAgIH0sXG4gICAgICBcInBhY2thZ2VzXCI6IHtcbiAgICAgICAgXCJ0eXBlXCI6IFtcInN0cmluZ1wiLCBcImFycmF5XCJdXG4gICAgICB9LFxuICAgICAgXCJwcm9maWxlXCI6IHtcbiAgICAgICAgXCJ0eXBlXCI6IFtcInN0cmluZ1wiXVxuICAgICAgfSxcbiAgICAgIFwiZW52aXJvbm1lbnRcIjoge1xuICAgICAgICBcImVycm9yTWVzc2FnZVwiOiBcInNob3VsZCBiZSAnZGV2ZWxvcG1lbnQnIG9yICdwcm9kdWN0aW9uJyBzdHJpbmcgdmFsdWVcIixcbiAgICAgICAgXCJ0eXBlXCI6IFtcInN0cmluZ1wiXVxuICAgICAgfSxcbiAgICAgIFwidHJlZXNoYWtlXCI6IHtcbiAgICAgICAgXCJlcnJvck1lc3NhZ2VcIjogXCJzaG91bGQgYmUgJ3llcycgb3IgJ25vJyBzdHJpbmcgdmFsdWUgKE5PVCB0cnVlIG9yIGZhbHNlKVwiLFxuICAgICAgICBcInR5cGVcIjogW1wic3RyaW5nXCJdXG4gICAgICB9LFxuICAgICAgXCJicm93c2VyXCI6IHtcbiAgICAgICAgXCJlcnJvck1lc3NhZ2VcIjogXCJzaG91bGQgYmUgJ3llcycgb3IgJ25vJyBzdHJpbmcgdmFsdWUgKE5PVCB0cnVlIG9yIGZhbHNlKVwiLFxuICAgICAgICBcInR5cGVcIjogW1wic3RyaW5nXCJdXG4gICAgICB9LFxuICAgICAgXCJ3YXRjaFwiOiB7XG4gICAgICAgIFwiZXJyb3JNZXNzYWdlXCI6IFwic2hvdWxkIGJlICd5ZXMnIG9yICdubycgc3RyaW5nIHZhbHVlIChOT1QgdHJ1ZSBvciBmYWxzZSlcIixcbiAgICAgICAgXCJ0eXBlXCI6IFtcInN0cmluZ1wiXVxuICAgICAgfSxcbiAgICAgIFwidmVyYm9zZVwiOiB7XG4gICAgICAgIFwiZXJyb3JNZXNzYWdlXCI6IFwic2hvdWxkIGJlICd5ZXMnIG9yICdubycgc3RyaW5nIHZhbHVlIChOT1QgdHJ1ZSBvciBmYWxzZSlcIixcbiAgICAgICAgXCJ0eXBlXCI6IFtcInN0cmluZ1wiXVxuICAgICAgfVxuICAgIH0sXG4gICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiBmYWxzZVxuICB9O1xufVxuXG5cbmZ1bmN0aW9uIF9nZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIHtcbiAgICBmcmFtZXdvcms6ICdleHRqcycsXG4gICAgdG9vbGtpdDogJ21vZGVybicsXG4gICAgdGhlbWU6ICd0aGVtZS1tYXRlcmlhbCcsXG4gICAgZW1pdDogJ3llcycsXG4gICAgc2NyaXB0OiBudWxsLFxuICAgIHBvcnQ6IDE5NjIsXG4gICAgcGFja2FnZXM6IFtdLFxuXG4gICAgcHJvZmlsZTogJycsIFxuICAgIGVudmlyb25tZW50OiAnZGV2ZWxvcG1lbnQnLCBcbiAgICB0cmVlc2hha2U6ICdubycsXG4gICAgYnJvd3NlcjogJ3llcycsXG4gICAgd2F0Y2g6ICd5ZXMnLFxuICAgIHZlcmJvc2U6ICdubydcbiAgfVxufVxuXG5cbiJdfQ==
\ No newline at end of file
diff --git a/packages/ext-webpack-plugin/dist/reactUtil.js b/packages/ext-webpack-plugin/dist/reactUtil.js
new file mode 100644
index 0000000..3685a52
--- /dev/null
+++ b/packages/ext-webpack-plugin/dist/reactUtil.js
@@ -0,0 +1,111 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports._getDefaultVars = _getDefaultVars;
+exports._extractFromSource = _extractFromSource;
+
+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
+ };
+}
+
+function _extractFromSource(module, options, compilation, extComponents) {
+ const logv = require('./pluginUtil').logv;
+
+ logv(options.verbose, 'FUNCTION _extractFromSource'); // try {
+
+ var js = module._source._value;
+ logv(options.verbose, 'FUNCTION extractFromSource');
+
+ var generate = require("@babel/generator").default;
+
+ var parse = require("babylon").parse;
+
+ var traverse = require("ast-traverse");
+
+ const statements = [];
+ const ast = parse(js, {
+ plugins: ['jsx', 'flow', 'doExpressions', 'objectRestSpread', 'classProperties', 'exportExtensions', 'asyncGenerators', 'functionBind', 'functionSent', 'dynamicImport'],
+ sourceType: 'module'
+ });
+
+ function addType(argNode) {
+ var type;
+
+ if (argNode.type === 'StringLiteral') {
+ var xtype = require('./pluginUtil')._toXtype(argNode.value);
+
+ if (xtype != 'extreact') {
+ type = {
+ xtype: require('./pluginUtil')._toXtype(argNode.value)
+ };
+ }
+ } else {
+ type = {
+ xclass: js.slice(argNode.start, argNode.end)
+ };
+ }
+
+ 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);
+ }
+
+ 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 []
+ // }
+}
+//# 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-webpack-plugin-orig/package.json b/packages/ext-webpack-plugin/package.json
similarity index 69%
rename from packages/ext-webpack-plugin-orig/package.json
rename to packages/ext-webpack-plugin/package.json
index 62095f0..8d074dc 100644
--- a/packages/ext-webpack-plugin-orig/package.json
+++ b/packages/ext-webpack-plugin/package.json
@@ -1,31 +1,33 @@
{
- "name": "@sencha/ext-webpack-plugin-orig",
- "version": "6.7.1",
+ "name": "@sencha/ext-webpack-plugin",
+ "version": "7.0.0",
"description": "A webpack plugin for new Ext JS applications",
"main": "dist/index.js",
"scripts": {
"build": "babel ./src --out-dir ./dist"
},
"dependencies": {
+ "html-webpack-plugin": "^3.2.0",
"switchit":"^1.0.8",
- "@babel/generator": "^7.3.0",
- "@babel/polyfill": "^7.2.5",
- "@sencha/cmd": "~6.7.0",
+ "@babel/generator": "^7.0.0",
+ "@babel/polyfill": "^7.0.0",
+ "@sencha/cmd": "~7.0.0",
"lodash.uniq": "^4.5.0",
"schema-utils": "^1.0.0",
- "chalk": "^2.4.2",
- "fs-extra":"^7.0.1",
- "opn": "^5.4.0",
+ "babylon": "^6.18.0",
+ "ast-traverse": "^0.1.1",
+ "chalk": "^2.4.1",
+ "fs-extra":"^7.0.0",
+ "opn": "^5.3.0",
"recursive-readdir-sync": "^1.0.6"
},
"devDependencies": {
- "@babel/cli": "^7.2.3",
- "@babel/core": "^7.2.2",
- "@babel/plugin-proposal-object-rest-spread": "^7.3.1",
- "@babel/plugin-transform-async-to-generator": "^7.2.0",
+ "@babel/cli": "^7.1.0",
+ "@babel/core": "^7.1.0",
+ "@babel/plugin-proposal-object-rest-spread": "^7.0.0",
+ "@babel/plugin-transform-async-to-generator": "^7.1.0",
"@babel/plugin-transform-regenerator": "^7.0.0",
- "@babel/polyfill": "^7.2.5",
- "@babel/preset-env": "^7.3.1",
+ "@babel/preset-env": "^7.1.0",
"babel-plugin-add-module-exports": "^1.0.0"
},
"babel": {
diff --git a/packages/ext-webpack-plugin-orig/readme.md b/packages/ext-webpack-plugin/readme.md
similarity index 100%
rename from packages/ext-webpack-plugin-orig/readme.md
rename to packages/ext-webpack-plugin/readme.md
diff --git a/packages/ext-webpack-plugin/src/angularUtil.js b/packages/ext-webpack-plugin/src/angularUtil.js
new file mode 100644
index 0000000..bf7f5f2
--- /dev/null
+++ b/packages/ext-webpack-plugin/src/angularUtil.js
@@ -0,0 +1,222 @@
+"use strict"
+
+export function _getDefaultVars() {
+ return {
+ touchFile: '/src/themer.ts',
+ 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
+ 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
+ }
+ }
+ }
+ }
+ }
+ }
+ })
+
+ return statements
+}
+
+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})
+}
+
+export function _toProd(vars, options) {
+ const log = require('./pluginUtil').log
+ const logv = require('./pluginUtil').logv
+ logv(options.verbose,'FUNCTION _toProd')
+ 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)
+
+ 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.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.verbose,'FUNCTION _getAllComponents')
+
+ const path = require('path')
+ const fsx = require('fs-extra')
+
+// 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))
+ }
+ }
+ })
+ 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.verbose,'FUNCTION _writeFilesToProdFolder')
+
+ 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\":\"'
+
+ 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})
+}
\ No newline at end of file
diff --git a/packages/ext-webpack-plugin-orig/src/artifacts.js b/packages/ext-webpack-plugin/src/artifacts.js
similarity index 91%
rename from packages/ext-webpack-plugin-orig/src/artifacts.js
rename to packages/ext-webpack-plugin/src/artifacts.js
index d942666..20299af 100644
--- a/packages/ext-webpack-plugin-orig/src/artifacts.js
+++ b/packages/ext-webpack-plugin/src/artifacts.js
@@ -200,6 +200,8 @@ export function createWorkspaceJson(options, output) {
logv(options,'numberOfPaths: ' + numberOfPaths)
logv(options,'nodeModulePath: ' + nodeModulePath)
+
+
const config = {
"frameworks": {
"ext": nodeModulePath + "node_modules/@sencha/ext"
@@ -212,7 +214,8 @@ export function createWorkspaceJson(options, output) {
"${workspace.dir}/" + nodeModulePath + "ext-" + options.framework + "/packages/local",
"${workspace.dir}/" + nodeModulePath + "ext-" + options.framework + "/packages",
"${workspace.dir}/" + nodeModulePath + "node_modules/@sencha",
- "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}",
+ "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-font-ios",
+ "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-base",
"${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-base",
"${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-ios",
"${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-material",
@@ -225,7 +228,14 @@ export function createWorkspaceJson(options, output) {
"${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-neptune",
"${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-neptune-touch",
"${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-triton",
- "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-graphite"
+ "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-${toolkit.name}-theme-graphite",
+ "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-calendar",
+ "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-charts",
+ "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-d3",
+ "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-exporter",
+ "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-pivot",
+ "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-pivot-d3",
+ "${workspace.dir}/" + nodeModulePath + "node_modules/@sencha/ext-ux",
],
"extract": "${workspace.dir}/" + nodeModulePath + "packages/remote"
}
diff --git a/packages/ext-webpack-plugin/src/componentsUtil.js b/packages/ext-webpack-plugin/src/componentsUtil.js
new file mode 100644
index 0000000..9fe4bbd
--- /dev/null
+++ b/packages/ext-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-webpack-plugin-orig/src/extjsUtil.js b/packages/ext-webpack-plugin/src/extjsUtil.js
similarity index 52%
rename from packages/ext-webpack-plugin-orig/src/extjsUtil.js
rename to packages/ext-webpack-plugin/src/extjsUtil.js
index ad91c75..91f1c60 100644
--- a/packages/ext-webpack-plugin-orig/src/extjsUtil.js
+++ b/packages/ext-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-webpack-plugin/src/index.js b/packages/ext-webpack-plugin/src/index.js
new file mode 100644
index 0000000..1703563
--- /dev/null
+++ b/packages/ext-webpack-plugin/src/index.js
@@ -0,0 +1,49 @@
+'use strict'
+require('@babel/polyfill')
+const p = require(`./pluginUtil`)
+
+export default class ExtWebpackPlugin {
+
+ constructor(options) {
+ var o = p._constructor(options)
+ this.vars = o.vars
+ this.options = o.options
+ }
+
+ apply(compiler) {
+ 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) => {
+ 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`)
+ 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-webpack-plugin/src/pluginUtil.js b/packages/ext-webpack-plugin/src/pluginUtil.js
new file mode 100644
index 0000000..575780b
--- /dev/null
+++ b/packages/ext-webpack-plugin/src/pluginUtil.js
@@ -0,0 +1,697 @@
+//**********
+export function _constructor(initialOptions) {
+ const fs = require('fs')
+ var vars = {}
+ var options = {}
+ try {
+ if (initialOptions.framework == undefined) {
+ vars.pluginErrors = []
+ vars.pluginErrors.push('webpack config: framework parameter on ext-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(_getValidateOptions(), initialOptions, '')
+
+ const rc = (fs.existsSync(`.ext-${framework}rc`) && JSON.parse(fs.readFileSync(`.ext-${framework}rc`, 'utf-8')) || {})
+ options = { ..._getDefaultOptions(), ...initialOptions, ...rc }
+
+ vars = require(`./${framework}Util`)._getDefaultVars()
+ vars.pluginName = 'ext-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)}
+
+ 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)
+
+ var o = {}
+ o.vars = vars
+ o.options = options
+ return o
+ }
+ catch (e) {
+ throw '_constructor: ' + e.toString()
+ }
+}
+
+//**********
+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 {
+ 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
+ // }
+
+ if (framework != 'extjs') {
+ var 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)]
+ }
+ }
+ 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 (vars.buildstep == '1 of 1' || vars.buildstep == '2 of 2') {
+ compilation.hooks.htmlWebpackPluginBeforeHtmlGeneration.tap(`ext-html-generation`,(data) => {
+ 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(app, `Adding ${jsPath} and ${cssPath} to index.html`)
+ })
+ }
+ }
+
+ }
+ catch(e) {
+ throw '_compilation: ' + e.toString()
+// logv(options.verbose,e)
+// compilation.errors.push('_compilation: ' + e)
+ }
+}
+
+//**********
+export function _afterCompile(compiler, compilation, vars, options) {
+ 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) {
+ try {
+ const path = require('path')
+ 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)
+ }
+ 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] }
+ else
+ { parms = ['app', command, '--web-server', 'false', 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()
+ }
+ else {
+ callback()
+ }
+ }
+ else {
+ logv(verbose,'NOT running emit')
+ callback()
+ }
+ }
+ else {
+ logv(verbose,'emit is no')
+ callback()
+ }
+ }
+ catch(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 {
+ 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')
+ theme = theme || (toolkit === 'classic' ? 'theme-triton' : 'theme-material')
+ logv(verbose,'firstTime: ' + vars.firstTime)
+ if (vars.firstTime) {
+ rimraf.sync(output)
+ mkdirp.sync(output)
+ const buildXML = require('./artifacts').buildXML
+ 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(), ''))
+ }
+ 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(), ''))
+ }
+ 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(), ''))
+ }
+ 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(), ''))
+ }
+ }
+ vars.firstTime = false
+ var js = ''
+ if (vars.production) {
+ js = vars.deps.join(';\n');
+ }
+ else {
+ js = 'Ext.require(["Ext.*","Ext.data.TreeStore"])'
+ }
+ if (vars.manifest === null || js !== vars.manifest) {
+ vars.manifest = js
+ const manifest = path.join(output, 'manifest.js')
+ fs.writeFileSync(manifest, js, 'utf8')
+ vars.rebuild = true
+ var bundleDir = output.replace(process.cwd(), '')
+ if (bundleDir.trim() == '') {bundleDir = './'}
+ log(app, 'Building Ext bundle at: ' + bundleDir)
+ }
+ else {
+ vars.rebuild = false
+ log(app, 'Ext rebuild NOT needed')
+ }
+ }
+ catch(e) {
+ require('./pluginUtil').logv(options.verbose,e)
+ compilation.errors.push('_prepareForBuild: ' + e)
+ }
+}
+
+//**********
+export function _buildExtBundle(app, compilation, outputPath, parms, vars, options) {
+// try {
+ var verbose = options.verbose
+ const fs = require('fs')
+ logv(verbose,'FUNCTION _buildExtBundle')
+ let sencha; try { sencha = require('@sencha/cmd') } catch (e) { sencha = 'sencha' }
+ if (fs.existsSync(sencha)) {
+ logv(verbose,'sencha folder exists')
+ }
+ else {
+ logv(verbose,'sencha folder DOES NOT exist')
+ }
+ 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()
+ // }
+}
+
+//**********
+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')
+ logv(verbose, 'FUNCTION _executeAsync')
+ await new Promise((resolve, reject) => {
+ 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(verbose, `on close: ` + code)
+ if(code === 0) { resolve(0) }
+ else { compilation.errors.push( new Error(code) ); resolve(0) }
+ })
+ child.on('error', (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(verbose, `${str}`)
+ if (data && data.toString().match(/Fashion waiting for changes\.\.\./)) {
+
+ const fs = require('fs');
+ var filename = process.cwd() + vars.touchFile;
+ try {
+ var d = new Date().toLocaleString()
+ var data = fs.readFileSync(filename);
+ fs.writeFileSync(filename, '//' + d, 'utf8');
+ logv(app, `touching ${filename}`);
+ }
+ catch(e) {
+ logv(app, `NOT touching ${filename}`);
+ }
+
+ resolve(0)
+ }
+ else {
+ if (substrings.some(function(v) { return data.indexOf(v) >= 0; })) {
+ str = str.replace("[INF]", "")
+ str = str.replace("[LOG]", "")
+ str = str.replace(process.cwd(), '').trim()
+ if (str.includes("[ERR]")) {
+ compilation.errors.push(app + str.replace(/^\[ERR\] /gi, ''));
+ str = str.replace("[ERR]", `${chalk.red("[ERR]")}`)
+ }
+ log(app, str)
+ }
+ }
+ })
+ child.stderr.on('data', (data) => {
+ logv(options, `error on close: ` + data)
+ var str = data.toString().replace(/\r?\n|\r/g, " ").trim()
+ var strJavaOpts = "Picked up _JAVA_OPTIONS";
+ var includes = str.includes(strJavaOpts)
+ if (!includes) {
+ console.log(`${app} ${chalk.red("[ERR]")} ${str}`)
+ }
+ })
+ })
+ // }
+ // catch(e) {
+ // logv(options,e)
+ // compilation.errors.push('_executeAsync: ' + e)
+ // callback()
+ // }
+}
+
+//**********
+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 _toXtype(str) {
+ return str.toLowerCase().replace(/_/g, '-')
+}
+
+//**********
+export function _getApp() {
+ var chalk = require('chalk')
+ var prefix = ``
+ const platform = require('os').platform()
+ if (platform == 'darwin') { prefix = `ℹ 「ext」:` }
+ else { prefix = `i [ext]:` }
+ return `${chalk.green(prefix)} `
+}
+
+//**********
+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')) || {});
+ v.pluginVersion = pluginPkg.version
+ v._resolved = pluginPkg._resolved
+ if (v._resolved == undefined) {
+ v.edition = `Commercial`
+ }
+ else {
+ if (-1 == v._resolved.indexOf('community')) {
+ v.edition = `Commercial`
+ }
+ else {
+ 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 = ''
+ if (frameworkName == 'react') {
+ frameworkPath = path.resolve(process.cwd(),'node_modules/react')
+ }
+ if (frameworkName == 'angular') {
+ frameworkPath = path.resolve(process.cwd(),'node_modules/@angular/core')
+ }
+ var frameworkPkg = (fs.existsSync(frameworkPath+'/package.json') && JSON.parse(fs.readFileSync(frameworkPath+'/package.json', 'utf-8')) || {});
+ v.frameworkVersion = frameworkPkg.version
+ frameworkInfo = ', ' + frameworkName + ' v' + v.frameworkVersion
+ }
+ return 'ext-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-webpack-plugin-orig/src/reactUtil.js b/packages/ext-webpack-plugin/src/reactUtil.js
similarity index 57%
rename from packages/ext-webpack-plugin-orig/src/reactUtil.js
rename to packages/ext-webpack-plugin/src/reactUtil.js
index 428c6fc..04df2d1 100644
--- a/packages/ext-webpack-plugin-orig/src/reactUtil.js
+++ b/packages/ext-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