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' +