diff --git a/examples/cli-example/.angular-cli.json b/examples/cli-example/.angular-cli.json
index 158d8aa7..db7c8d34 100644
--- a/examples/cli-example/.angular-cli.json
+++ b/examples/cli-example/.angular-cli.json
@@ -18,6 +18,7 @@
"tsconfig": "tsconfig.app.json",
"testTsconfig": "tsconfig.spec.json",
"prefix": "app",
+ "serviceWorker": true,
"styles": [
"styles.css"
],
@@ -41,6 +42,7 @@
"polyfills": "polyfills.ts",
"tsconfig": "tsconfig.app.json",
"prefix": "app",
+ "serviceWorker": true,
"environmentSource": "environments/environment.ts",
"environments": {
"dev": "environments/environment.ts",
@@ -74,6 +76,7 @@
},
"defaults": {
"styleExt": "css",
- "component": {}
+ "component": {
+ }
}
}
diff --git a/examples/cli-example/README.md b/examples/cli-example/README.md
index 90ca5926..115b2bf8 100644
--- a/examples/cli-example/README.md
+++ b/examples/cli-example/README.md
@@ -1,27 +1,14 @@
-# CliExample
+# Playground Angular CLI Example
-This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.6.2.
+## Development:
-## Development server
+Install dependencies:
+```
+cd examples/cli-example/
+npm i
+```
-Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
+Run `npm run playground:build` to replace the installed angular-playground with the development version.
-## Code scaffolding
-
-Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
-
-## Build
-
-Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
-
-## Running unit tests
-
-Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
-
-## Running end-to-end tests
-
-Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
-
-## Further help
-
-To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
+`npm run playground` accesses `node_modules/angular-playground/dist/bin/index.js` directory, so changes
+within the CLI will require `npm run playground:build` to be run before changes will appear.
\ No newline at end of file
diff --git a/examples/cli-example/package-lock.json b/examples/cli-example/package-lock.json
index 5ce92d6c..d61e8718 100644
--- a/examples/cli-example/package-lock.json
+++ b/examples/cli-example/package-lock.json
@@ -202,6 +202,14 @@
"tslib": "1.8.1"
}
},
+ "@angular/service-worker": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-5.2.0.tgz",
+ "integrity": "sha512-chS7TLWpq8MvqJ7xgsOEktwT5Xf9OzxcH4eRikAPNXeN3foiW+wAJHYO2iCE5nwXNIcqMxI6ywF9rypjqSubbQ==",
+ "requires": {
+ "tslib": "1.8.1"
+ }
+ },
"@ngtools/json-schema": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.1.0.tgz",
@@ -381,6 +389,35 @@
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
"dev": true
},
+ "angular-playground": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/angular-playground/-/angular-playground-3.3.0.tgz",
+ "integrity": "sha512-jcxZrTT6klK5FQIMawYahNnYc6msFJp1FU2AbvwxttpCJAbcEPEd1PfAGq2fDX3/s6w1Nvhpei9CwiVISHf7Yw==",
+ "requires": {
+ "async": "2.6.0",
+ "chalk": "2.3.0",
+ "commander": "2.12.2",
+ "node-watch": "0.4.1",
+ "puppeteer": "0.13.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "node-watch": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.4.1.tgz",
+ "integrity": "sha1-0JR9VKmV+RE120BWtocixtfDIq0="
+ }
+ }
+ },
"ansi-html": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
@@ -397,7 +434,6 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
"integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
- "dev": true,
"requires": {
"color-convert": "1.9.1"
}
@@ -571,7 +607,6 @@
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
"integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
- "dev": true,
"requires": {
"lodash": "4.17.4"
}
@@ -592,8 +627,7 @@
"async-limiter": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
- "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
- "dev": true
+ "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
},
"asynckit": {
"version": "0.4.0",
@@ -765,8 +799,7 @@
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "dev": true
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
"base64-arraybuffer": {
"version": "0.1.5",
@@ -919,7 +952,6 @@
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
"integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
- "dev": true,
"requires": {
"balanced-match": "1.0.0",
"concat-map": "0.0.1"
@@ -1169,31 +1201,6 @@
"supports-color": "4.5.0"
}
},
- "check-sandboxes-plugin": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/check-sandboxes-plugin/-/check-sandboxes-plugin-1.1.0.tgz",
- "integrity": "sha512-gBS8TlTNhXwSZ6qRA7k/Q1Fsun+AW70dMNUL3gfAdWHlK/AFkITo1k+ma+toZT0GaXrl2DPFA6FDoDviyVBVjg==",
- "dev": true,
- "requires": {
- "async": "2.6.0",
- "chalk": "2.3.0",
- "commander": "2.12.2",
- "puppeteer": "0.13.0"
- },
- "dependencies": {
- "chalk": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
- "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "3.2.0",
- "escape-string-regexp": "1.0.5",
- "supports-color": "4.5.0"
- }
- }
- }
- },
"chokidar": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
@@ -1373,7 +1380,6 @@
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
"integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
- "dev": true,
"requires": {
"color-name": "1.1.3"
}
@@ -1381,8 +1387,7 @@
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
"color-string": {
"version": "0.3.0",
@@ -1431,8 +1436,7 @@
"commander": {
"version": "2.12.2",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz",
- "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==",
- "dev": true
+ "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA=="
},
"common-tags": {
"version": "1.6.0",
@@ -1494,14 +1498,12 @@
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"concat-stream": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
"integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
- "dev": true,
"requires": {
"inherits": "2.0.3",
"readable-stream": "2.3.3",
@@ -1657,8 +1659,7 @@
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
- "dev": true
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"cosmiconfig": {
"version": "2.2.2",
@@ -1941,7 +1942,6 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
"requires": {
"ms": "2.0.0"
}
@@ -2504,14 +2504,12 @@
"es6-promise": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.2.tgz",
- "integrity": "sha512-LSas5vsuA6Q4nEdf9wokY5/AJYXry98i0IzXsv49rYsgDGDNDPbqAYR1Pe23iFxygfbGZNR/5VrHXBCh2BhvUQ==",
- "dev": true
+ "integrity": "sha512-LSas5vsuA6Q4nEdf9wokY5/AJYXry98i0IzXsv49rYsgDGDNDPbqAYR1Pe23iFxygfbGZNR/5VrHXBCh2BhvUQ=="
},
"es6-promisify": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
"integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
- "dev": true,
"requires": {
"es6-promise": "4.2.2"
}
@@ -2560,8 +2558,7 @@
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"escope": {
"version": "3.6.0",
@@ -2847,7 +2844,6 @@
"version": "1.6.6",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz",
"integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=",
- "dev": true,
"requires": {
"concat-stream": "1.6.0",
"debug": "2.6.9",
@@ -2858,14 +2854,12 @@
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
- "dev": true
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
},
"mkdirp": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
"integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=",
- "dev": true,
"requires": {
"minimist": "0.0.8"
}
@@ -2909,7 +2903,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
"integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
- "dev": true,
"requires": {
"pend": "1.2.0"
}
@@ -3110,8 +3103,7 @@
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"fstream": {
"version": "1.0.11",
@@ -3213,7 +3205,6 @@
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
- "dev": true,
"requires": {
"fs.realpath": "1.0.0",
"inflight": "1.0.6",
@@ -3474,8 +3465,7 @@
"has-flag": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
- "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
- "dev": true
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE="
},
"has-unicode": {
"version": "2.0.1",
@@ -3884,7 +3874,6 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
"requires": {
"once": "1.4.0",
"wrappy": "1.0.2"
@@ -3893,8 +3882,7 @@
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"ini": {
"version": "1.3.5",
@@ -4183,8 +4171,7 @@
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"isbinaryfile": {
"version": "3.0.2",
@@ -4736,8 +4723,7 @@
"lodash": {
"version": "4.17.4",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
- "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
- "dev": true
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
},
"lodash.assign": {
"version": "4.2.0",
@@ -5042,8 +5028,7 @@
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "dev": true
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"mime-db": {
"version": "1.30.0",
@@ -5082,7 +5067,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
"requires": {
"brace-expansion": "1.1.8"
}
@@ -5163,8 +5147,7 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"multicast-dns": {
"version": "6.2.1",
@@ -5415,6 +5398,11 @@
}
}
},
+ "node-watch": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.4.1.tgz",
+ "integrity": "sha1-0JR9VKmV+RE120BWtocixtfDIq0="
+ },
"nopt": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
@@ -5582,7 +5570,6 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
"requires": {
"wrappy": "1.0.2"
}
@@ -5836,8 +5823,7 @@
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
"path-is-inside": {
"version": "1.0.2",
@@ -5888,8 +5874,7 @@
"pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
- "dev": true
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
},
"performance-now": {
"version": "0.2.0",
@@ -6633,14 +6618,12 @@
"process-nextick-args": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
- "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
- "dev": true
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
},
"progress": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
- "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
- "dev": true
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8="
},
"promise": {
"version": "7.3.1",
@@ -6781,8 +6764,7 @@
"proxy-from-env": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
- "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=",
- "dev": true
+ "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4="
},
"prr": {
"version": "1.0.1",
@@ -6840,7 +6822,6 @@
"version": "0.13.0",
"resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-0.13.0.tgz",
"integrity": "sha512-M52SA/WmW54YMLzFtCLGslhr9tntzfTgJIZnx3QnaDXn9F5q2BlTosywSBEKj8aVVd6al0WNfiu14MUQW3wjaw==",
- "dev": true,
"requires": {
"debug": "2.6.9",
"extract-zip": "1.6.6",
@@ -6856,7 +6837,6 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.1.2.tgz",
"integrity": "sha512-VE6QoEdaugY86BohRtfGmTDabxdU5sCKOkbcPA6PXKJsRzEi/7A3RCTxJal1ft/4qSfPht5/iQLhMh/wzSkkNw==",
- "dev": true,
"requires": {
"es6-promisify": "5.0.0"
}
@@ -6865,7 +6845,6 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.1.1.tgz",
"integrity": "sha512-LK6tQUR/VOkTI6ygAfWUKKP95I+e6M1h7N3PncGu1CATHCnex+CAv9ttR0lbHu1Uk2PXm/WoAHFo6JCGwMjVMw==",
- "dev": true,
"requires": {
"agent-base": "4.1.2",
"debug": "3.1.0"
@@ -6875,7 +6854,6 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "dev": true,
"requires": {
"ms": "2.0.0"
}
@@ -6885,14 +6863,12 @@
"ultron": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
- "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
- "dev": true
+ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
},
"ws": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
"integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
- "dev": true,
"requires": {
"async-limiter": "1.0.0",
"safe-buffer": "5.1.1",
@@ -7096,7 +7072,6 @@
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
"integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
- "dev": true,
"requires": {
"core-util-is": "1.0.2",
"inherits": "2.0.3",
@@ -7363,7 +7338,6 @@
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
- "dev": true,
"requires": {
"glob": "7.1.2"
}
@@ -7398,8 +7372,7 @@
"safe-buffer": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
- "dev": true
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
},
"sass-graph": {
"version": "2.2.4",
@@ -8102,7 +8075,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
- "dev": true,
"requires": {
"safe-buffer": "5.1.1"
}
@@ -8221,7 +8193,6 @@
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
"integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
- "dev": true,
"requires": {
"has-flag": "2.0.0"
}
@@ -8502,8 +8473,7 @@
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
- "dev": true
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
},
"typescript": {
"version": "2.4.2",
@@ -8718,8 +8688,7 @@
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"utila": {
"version": "0.4.0",
@@ -9387,8 +9356,7 @@
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"ws": {
"version": "1.1.2",
@@ -9515,7 +9483,6 @@
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
"integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
- "dev": true,
"requires": {
"fd-slicer": "1.0.1"
}
diff --git a/examples/cli-example/package.json b/examples/cli-example/package.json
index d0aedde2..04cb09be 100644
--- a/examples/cli-example/package.json
+++ b/examples/cli-example/package.json
@@ -10,9 +10,10 @@
"lint": "ng lint",
"e2e": "ng e2e",
"playground": "node ./node_modules/angular-playground/dist/bin/index.js",
+ "playground:prod": "node ./node_modules/angular-playground/dist/bin/index.js --build",
"playground:check": "node ./node_modules/angular-playground/dist/bin/index.js --check-errors",
- "playground:build": "npm run build --prefix ../../packages/angular-playground/ && node ../../packages/angular-playground/scripts/copy.js && npm run playground",
- "check-errors": "node ./node_modules/angular-playground/dist/bin/index.js --verify"
+ "playground:build": "(cd ../../ && sh ./scripts/build.sh)",
+ "check-errors": "node ./node_modules/angular-playground/dist/bin/index.js --check-errors"
},
"private": true,
"dependencies": {
@@ -25,6 +26,8 @@
"@angular/platform-browser": "^5.0.0",
"@angular/platform-browser-dynamic": "^5.0.0",
"@angular/router": "^5.0.0",
+ "@angular/service-worker": "^5.2.0",
+ "angular-playground": "^3.3.0",
"core-js": "^2.4.1",
"rxjs": "^5.5.2",
"zone.js": "^0.8.14"
diff --git a/examples/cli-example/src/app/app.module.ts b/examples/cli-example/src/app/app.module.ts
index 727d4ccc..eeff95a5 100644
--- a/examples/cli-example/src/app/app.module.ts
+++ b/examples/cli-example/src/app/app.module.ts
@@ -1,15 +1,20 @@
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
+import { ServiceWorkerModule } from '@angular/service-worker';
import { AppComponent } from './app.component';
import { SharedModule } from './shared/shared.module';
import { Feature1Module } from './feature1/feature1.module';
import { Feature2Module } from './feature2/feature2.module';
import { RouterModule } from '@angular/router';
import { Feature3Module } from './feature3/feature3.module';
+import { environment } from '../environments/environment';
@NgModule({
imports: [
BrowserModule,
+ environment.production
+ ? ServiceWorkerModule.register('/ngsw-worker.js')
+ : [],
RouterModule,
SharedModule,
Feature1Module,
diff --git a/examples/cli-example/src/my-playground.module.ts b/examples/cli-example/src/my-playground.module.ts
index 1823a61e..4b04f157 100644
--- a/examples/cli-example/src/my-playground.module.ts
+++ b/examples/cli-example/src/my-playground.module.ts
@@ -1,13 +1,18 @@
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
+import { ServiceWorkerModule } from '@angular/service-worker';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { AppComponent, PlaygroundCommonModule } from 'angular-playground';
+import { environment } from './environments/environment';
@NgModule({
imports: [
BrowserModule,
BrowserAnimationsModule,
- PlaygroundCommonModule
+ PlaygroundCommonModule,
+ environment.production
+ ? ServiceWorkerModule.register('/ngsw-worker.js')
+ : []
],
bootstrap: [AppComponent]
})
diff --git a/examples/cli-example/src/ngsw-config.json b/examples/cli-example/src/ngsw-config.json
new file mode 100644
index 00000000..b9bf3a55
--- /dev/null
+++ b/examples/cli-example/src/ngsw-config.json
@@ -0,0 +1,27 @@
+{
+ "index": "/index.html",
+ "assetGroups": [{
+ "name": "app",
+ "installMode": "prefetch",
+ "resources": {
+ "files": [
+ "/favicon.ico",
+ "/index.html"
+ ],
+ "versionedFiles": [
+ "/*.bundle.css",
+ "/*.bundle.js",
+ "/*.chunk.js"
+ ]
+ }
+ }, {
+ "name": "assets",
+ "installMode": "lazy",
+ "updateMode": "prefetch",
+ "resources": {
+ "files": [
+ "/assets/**"
+ ]
+ }
+ }]
+}
\ No newline at end of file
diff --git a/examples/example-app-webpack/package.json b/examples/example-app-webpack/package.json
index 9928de76..3f1a7166 100644
--- a/examples/example-app-webpack/package.json
+++ b/examples/example-app-webpack/package.json
@@ -2,7 +2,7 @@
"name": "example-app-webpack",
"version": "0.0.1",
"scripts": {
- "playground:copy": "node ../../scripts/copy.js",
+ "playground:copy": "(cd ../../ && sh ./scripts/build.sh)",
"playground:run": "node ./node_modules/angular-playground/dist/bin/cli.js",
"playground": "npm run playground:copy && concurrently \"npm run playground:run\" \"npm run playground:serve\"",
"playground:serve": "webpack-dev-server --inline --port 8081 --config config/webpack.playground.js",
diff --git a/packages/angular-playground/CHANGELOG.md b/packages/angular-playground/CHANGELOG.md
index 0c0ce340..a8b135c4 100644
--- a/packages/angular-playground/CHANGELOG.md
+++ b/packages/angular-playground/CHANGELOG.md
@@ -1,3 +1,15 @@
+# 3.4.0 (2018-01-11)
+
+
+
+### Features
+* **cli:** You can now build Playground apps for production with service workers
+ ([cf38864](https://github.com/SoCreate/angular-playground/pull/81/commits/cf38864)).
+
+ Use the `--build` flag to build Playground for production. Note that this requires all of the same setup
+ to enable Service Workers as outlined by the Angular CLI--see [our docs](http://angularplayground.it/docs/how-to/build-prod)
+ for more details.
+
# 3.3.0 (2018-01-09)
diff --git a/packages/angular-playground/cli/src/build-angular-cli.ts b/packages/angular-playground/cli/src/build-angular-cli.ts
new file mode 100644
index 00000000..744a93a1
--- /dev/null
+++ b/packages/angular-playground/cli/src/build-angular-cli.ts
@@ -0,0 +1,41 @@
+import chalk from 'chalk';
+import { exec } from 'child_process';
+import { join as joinPath } from 'path';
+
+export async function buildAngularCli(appName: string) {
+ try {
+ // Check package is installed locally
+ require.resolve('@angular/service-worker');
+
+ const playgroundIndex = getAppIndex(appName);
+ await toggleServiceWorker(playgroundIndex);
+
+ console.log('Building for production with sandboxes...');
+ // Cannot build w/ AOT due to runtime compiler dependency
+ exec(`ng build -a=${appName} --prod --aot=false`, (err, stdout, stderr) => {
+ if (err) throw err;
+ console.log(stdout);
+ });
+ } catch (err) {
+ console.error(chalk.red('Error: --build requires @angular/service-worker to be installed locally.'));
+ console.log('https://github.com/angular/angular-cli/wiki/build#service-worker');
+ process.exit(1);
+ }
+}
+
+function getAppIndex(appName: string): number {
+ // Assumes .angular-cli.json is at root
+ const cliFile = joinPath(process.cwd(), '.angular-cli.json').replace(/.json$/, '');
+ const cliConfig = require(cliFile);
+
+ return cliConfig.apps.findIndex(app => app.name === appName);
+}
+
+async function toggleServiceWorker(appIndex: number): Promise {
+ return new Promise((resolve, reject) => {
+ exec(`ng set apps.${appIndex}.serviceWorker=true`, (err, stdout, stderr) => {
+ if (err) reject(err);
+ resolve(true);
+ });
+ });
+}
diff --git a/packages/angular-playground/cli/src/configure.ts b/packages/angular-playground/cli/src/configure.ts
index a7240822..05a8420a 100644
--- a/packages/angular-playground/cli/src/configure.ts
+++ b/packages/angular-playground/cli/src/configure.ts
@@ -10,6 +10,7 @@ export interface Config {
chunk: boolean;
watch: boolean;
serve: boolean;
+ buildWithServiceWorkers: boolean;
verifySandboxes: boolean;
randomScenario: boolean;
@@ -33,6 +34,7 @@ export function configure(argv: any): Config {
.option('--no-watch', 'Disable sandboxes watch', false)
.option('--no-serve', 'Disable cli serve', false)
.option('--no-chunk', 'Don\'t chunk sandbox files individually', false)
+ .option('--build', 'Build your sandboxes with service workers enabled. Requires @angular/service-worker', false)
// Sandbox verification
.option('--check-errors', '', false)
@@ -60,6 +62,7 @@ export function applyConfigurationFile(program: any): Config {
chunk: negate(playgroundConfig.noChunk) || program.chunk,
watch: negate(playgroundConfig.noWatch) || program.watch,
serve: negate(playgroundConfig.noServe) || program.serve,
+ buildWithServiceWorkers: playgroundConfig.build || program.build,
verifySandboxes: playgroundConfig.verifySandboxes || program.checkErrors,
randomScenario: playgroundConfig.randomScenario || program.randomScenario,
diff --git a/packages/angular-playground/cli/src/run.ts b/packages/angular-playground/cli/src/run.ts
index ba8e891d..0d00cbfd 100644
--- a/packages/angular-playground/cli/src/run.ts
+++ b/packages/angular-playground/cli/src/run.ts
@@ -2,14 +2,19 @@ import * as program from 'commander';
import { configure, Config } from './configure';
import { buildSandboxes } from './build-sandboxes';
import { startWatch } from './start-watch';
-import { runAngularCli } from './run-angular-cli';
import { verifySandboxes } from './verify-sandboxes';
import { findFirstFreePort } from './find-port';
+import { serveAngularCli } from './serve-angular-cli';
+import { buildAngularCli } from './build-angular-cli';
export async function run() {
const config: Config = configure(process.argv);
await buildSandboxes(config.sourceRoot, config.chunk);
+ if (config.buildWithServiceWorkers) {
+ return buildAngularCli(config.angularAppName);
+ }
+
if (config.verifySandboxes) {
config.angularCliPort = await findFirstFreePort('127.0.0.1', 7000, 9000);
}
@@ -19,7 +24,7 @@ export async function run() {
}
if (config.serve || config.verifySandboxes) {
- runAngularCli(config);
+ serveAngularCli(config);
}
if (config.verifySandboxes) {
diff --git a/packages/angular-playground/cli/src/run-angular-cli.ts b/packages/angular-playground/cli/src/serve-angular-cli.ts
similarity index 80%
rename from packages/angular-playground/cli/src/run-angular-cli.ts
rename to packages/angular-playground/cli/src/serve-angular-cli.ts
index a30bc7d5..e7a2758f 100644
--- a/packages/angular-playground/cli/src/run-angular-cli.ts
+++ b/packages/angular-playground/cli/src/serve-angular-cli.ts
@@ -1,9 +1,9 @@
import chalk from 'chalk';
-import { spawn, SpawnOptions } from 'child_process';
+import { spawn, SpawnOptions, ChildProcess } from 'child_process';
import { Config } from './configure';
-export function runAngularCli(config: Config) {
- const args = configureArguments(config);
+export async function serveAngularCli(config: Config) {
+ const args: string[] = configureArguments(config);
const ngServe = spawn('node', args);
const write = (handler: any, data: any) => {
@@ -20,7 +20,7 @@ export function runAngularCli(config: Config) {
});
}
-function configureArguments(config: Config) {
+function configureArguments(config: Config): string[] {
let args = [config.angularCliPath, 'serve', '-no-progress'];
args.push(`--port=${config.angularCliPort}`);
diff --git a/packages/angular-playground/cli/src/verify-sandboxes.ts b/packages/angular-playground/cli/src/verify-sandboxes.ts
index 78ee0b21..8eddd4fb 100644
--- a/packages/angular-playground/cli/src/verify-sandboxes.ts
+++ b/packages/angular-playground/cli/src/verify-sandboxes.ts
@@ -8,7 +8,7 @@ import { Config } from './configure';
// Used to tailor the version of headless chromium ran by puppeteer
const CHROME_ARGS = [ '--disable-gpu', '--no-sandbox' ];
-const SANDBOX_PATH = resolvePath(__dirname, '../../build/src/shared/sandboxes.js');
+const SANDBOX_PATH = resolvePath(__dirname, '../../build/shared/sandboxes.js');
const SANDBOX_DEST = resolvePath(__dirname, '../../sandboxes_modified.js');
export interface ScenarioSummary {
diff --git a/packages/angular-playground/package-lock.json b/packages/angular-playground/package-lock.json
index 95994f77..93651c48 100644
--- a/packages/angular-playground/package-lock.json
+++ b/packages/angular-playground/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "angular-playground",
- "version": "3.3.0",
+ "version": "3.4.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/packages/angular-playground/package.json b/packages/angular-playground/package.json
index e3d7044c..a6bf9723 100644
--- a/packages/angular-playground/package.json
+++ b/packages/angular-playground/package.json
@@ -1,6 +1,6 @@
{
"name": "angular-playground",
- "version": "3.3.0",
+ "version": "3.4.0",
"description": "A drop in app module for working on Angular components in isolation (aka Scenario Driven Development).",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
@@ -23,7 +23,6 @@
},
"scripts": {
"ngc": "ngc",
- "clean": "node ./scripts/clean.js",
"build": "npm run app:build && npm run cli:build",
"app:build": "gulp build",
"cli:build": "tsc -p ./cli/tsconfig.json",
diff --git a/packages/angular-playground/scripts/copy.js b/packages/angular-playground/scripts/copy.js
deleted file mode 100644
index bcc446a2..00000000
--- a/packages/angular-playground/scripts/copy.js
+++ /dev/null
@@ -1,26 +0,0 @@
-const path = require('path');
-const fs = require('fs-extra');
-
-const examples = ['example-app-embed-mode', 'example-app-webpack', 'cli-example'];
-
-moveDistToExamples(examples)
- .then(() => console.log('Build successfully copied.'))
- .catch(() => console.log('Failed to copy Dist.'));
-
-/////////////////////////////////////////////
-
-function moveDistToExamples(examples) {
- console.log('Copying build to examples...');
- const promises = examples
- .map(examplePath => path.join(__dirname, `../../../examples/${examplePath}/node_modules/angular-playground/`))
- .map(examplePath => [ copyDist(examplePath), copyPackageFile(examplePath) ])
- return Promise.all(promises);
-}
-
-function copyDist(resultPath) {
- return fs.copy(path.join(__dirname, '../dist/'), path.join(resultPath, 'dist/'));
-}
-
-function copyPackageFile(resultPath) {
- return fs.copy(path.join(__dirname, '../package.json'), path.join(resultPath, 'package.json'));
-}
diff --git a/scripts/build.sh b/scripts/build.sh
new file mode 100644
index 00000000..a4ec2795
--- /dev/null
+++ b/scripts/build.sh
@@ -0,0 +1,12 @@
+npm run build --prefix ./packages/angular-playground
+
+declare -a examples=( 'cli-example' 'example-app-embed-mode' 'example-app-webpack' )
+for ex in "${examples[@]}"
+do
+ rm -rf "./examples/$ex/node_modules/angular-playground/"
+ mkdir "./examples/$ex/node_modules/angular-playground/"
+ cp -r ./packages/angular-playground/dist/ "./examples/$ex/node_modules/angular-playground/dist/"
+ cp ./packages/angular-playground/package.json "./examples/$ex/node_modules/angular-playground/"
+done
+echo 'finished copying examples'
+