├── .gitignore ├── lib ├── .gitignore ├── .npmignore ├── README.md ├── builders.json ├── package-lock.json ├── package.json ├── src │ ├── cypress │ │ ├── cypress-builder.ts │ │ ├── index.ts │ │ └── schema.json │ └── index.ts └── tsconfig.json ├── readme.md └── sample ├── .editorconfig ├── .gitignore ├── README.md ├── angular.json ├── cypress.json ├── cypress ├── cypress.json ├── fixtures │ └── example.json ├── integration │ └── simple_spec.js ├── plugins │ └── index.js └── support │ ├── commands.js │ └── index.js ├── package-lock.json ├── package.json ├── projects ├── sample-e2e-in-projects │ ├── cypress.json │ └── cypress │ │ ├── fixtures │ │ └── example.json │ │ ├── integration │ │ └── simple_spec.js │ │ ├── plugins │ │ └── index.js │ │ └── support │ │ ├── commands.js │ │ └── index.js └── sample │ ├── browserslist │ ├── karma.conf.js │ ├── src │ ├── app │ │ ├── app.component.css │ │ ├── app.component.html │ │ ├── app.component.spec.ts │ │ ├── app.component.ts │ │ └── app.module.ts │ ├── assets │ │ └── .gitkeep │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── favicon.ico │ ├── index.html │ ├── main.ts │ ├── polyfills.ts │ ├── styles.css │ └── test.ts │ ├── tsconfig.app.json │ ├── tsconfig.spec.json │ └── tslint.json ├── tsconfig.json └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | .idea 3 | -------------------------------------------------------------------------------- /lib/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | *.js 5 | *.d.ts 6 | /dist 7 | /tmp 8 | /out-tsc 9 | 10 | # dependencies 11 | /node_modules 12 | 13 | # IDEs and editors 14 | /.idea 15 | .project 16 | .classpath 17 | .c9/ 18 | *.launch 19 | .settings/ 20 | *.sublime-workspace 21 | 22 | # IDE - VSCode 23 | .vscode/* 24 | !.vscode/settings.json 25 | !.vscode/tasks.json 26 | !.vscode/launch.json 27 | !.vscode/extensions.json 28 | 29 | # misc 30 | /.sass-cache 31 | /connect.lock 32 | /coverage 33 | /libpeerconnection.log 34 | npm-debug.log 35 | yarn-error.log 36 | testem.log 37 | /typings 38 | 39 | # System Files 40 | .DS_Store 41 | Thumbs.db 42 | -------------------------------------------------------------------------------- /lib/.npmignore: -------------------------------------------------------------------------------- 1 | *.ts 2 | -------------------------------------------------------------------------------- /lib/README.md: -------------------------------------------------------------------------------- 1 | # ngx-cypress-builder 2 | 3 | Run Cypress from the Angular CLI for your E2E tests. 4 | 5 | ## Credits 6 | 7 | Big thanks to [Manfred Steyer](https://twitter.com/ManfredSteyer) for showing this was possible with [ngx-build-plus](https://github.com/manfredsteyer/ngx-build-plus) 8 | 9 | ## Tested with CLI 6.1.x 10 | 11 | This package has been created and tested with Angular CLI 6.1.x. If the CLI's underlying API changes in future, I'll provide an respective update for this version too until the CLI has build-in features for the covered use cases. 12 | 13 | ## Example 14 | 15 | https://github.com/isaacplmann/ngx-cypress-builder/sample 16 | 17 | ## Usage 18 | 19 | The next steps guides you trough getting started with `ngx-cypress-builder`. The result of this description can be found in the [repository's](https://github.com/isaacplmann/ngx-cypress-builder/sample) `sample` directory. 20 | 21 | 1. Create a new Angular CLI based project: 22 | 23 | ``` 24 | ng new my-sample-app 25 | ``` 26 | 27 | 2. Install cypress and ngx-cypress-builder: 28 | 29 | ``` 30 | npm i -D cypress ngx-cypress-builder 31 | ``` 32 | 33 | 3. Open your `angular.json` and tell the CLI to use `ngx-cypress-builder` instead of protractor: 34 | 35 | ``` 36 | [...] 37 | "my-sample-app-e2e": { 38 | "root": "cypress/", 39 | "projectType": "application", 40 | "architect": { 41 | "e2e": { 42 | "builder": "ngx-cypress-builder:cypress", 43 | "options": { 44 | "devServerTarget": "my-sample-app:serve" 45 | }, 46 | "configurations": { 47 | "production": { 48 | "devServerTarget": "my-sample-app:serve:production" 49 | } 50 | } 51 | } 52 | } 53 | } 54 | [...] 55 | ``` 56 | 57 | 4. Create a default Cypress setup 58 | 59 | ``` 60 | npx cypress open 61 | ``` 62 | 63 | 5. Close the Cypress application 64 | 65 | 6. Run the sample Cypress tests through the angular cli 66 | 67 | ```bash 68 | npm run e2e 69 | # or 70 | ng e2e 71 | ``` 72 | 73 | This will serve your application, run the Cypress tests and exit. 74 | 75 | ## devServerTarget in angular.json 76 | 77 | If you do not specify a `devServerTarget` in the `angular.json` file, the cli will skip that step and just run Cypress. 78 | -------------------------------------------------------------------------------- /lib/builders.json: -------------------------------------------------------------------------------- 1 | { 2 | "builders": { 3 | "cypress": { 4 | "class": "./src/cypress/cypress-builder", 5 | "schema": "./src/cypress/schema.json", 6 | "description": " Cypress e2e Test Runner" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ngx-cypress-builder", 3 | "version": "0.0.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@angular-devkit/architect": { 8 | "version": "0.7.1", 9 | "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.7.1.tgz", 10 | "integrity": "sha512-eJ9hXQ4JC8yJKmCjShikg48IVqYh/0laJ2tnfwrILtwbeM1mDYtpjR5NNUvovR+voYZJyI7uHc/XRu9CCz4NhA==", 11 | "requires": { 12 | "@angular-devkit/core": "0.7.1", 13 | "rxjs": "6.2.1" 14 | } 15 | }, 16 | "@angular-devkit/core": { 17 | "version": "0.7.1", 18 | "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.7.1.tgz", 19 | "integrity": "sha512-m+j1d+oMZRu0jUN7UyE4C8Kh8YoY9TP6ltjcrO2SzE89mzHg+apY1taf4EzOYKrrCZxw7Q4viPa8EXeF2AJ1cQ==", 20 | "requires": { 21 | "ajv": "6.4.0", 22 | "chokidar": "2.0.3", 23 | "rxjs": "6.2.1", 24 | "source-map": "0.5.7" 25 | } 26 | }, 27 | "@types/node": { 28 | "version": "10.3.2", 29 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.3.2.tgz", 30 | "integrity": "sha512-9NfEUDp3tgRhmoxzTpTo+lq+KIVFxZahuRX0LHF/9IzKHaWuoWsIrrJ61zw5cnnlGINX8lqJzXYfQTOICS5Q+A==", 31 | "dev": true 32 | }, 33 | "ajv": { 34 | "version": "6.4.0", 35 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", 36 | "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", 37 | "requires": { 38 | "fast-deep-equal": "1.1.0", 39 | "fast-json-stable-stringify": "2.0.0", 40 | "json-schema-traverse": "0.3.1", 41 | "uri-js": "3.0.2" 42 | } 43 | }, 44 | "anymatch": { 45 | "version": "2.0.0", 46 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", 47 | "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", 48 | "requires": { 49 | "micromatch": "3.1.10", 50 | "normalize-path": "2.1.1" 51 | } 52 | }, 53 | "arr-diff": { 54 | "version": "4.0.0", 55 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", 56 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" 57 | }, 58 | "arr-flatten": { 59 | "version": "1.1.0", 60 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 61 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" 62 | }, 63 | "arr-union": { 64 | "version": "3.1.0", 65 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 66 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" 67 | }, 68 | "array-unique": { 69 | "version": "0.3.2", 70 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", 71 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" 72 | }, 73 | "assign-symbols": { 74 | "version": "1.0.0", 75 | "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", 76 | "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" 77 | }, 78 | "async-each": { 79 | "version": "1.0.1", 80 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", 81 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" 82 | }, 83 | "atob": { 84 | "version": "2.1.1", 85 | "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", 86 | "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=" 87 | }, 88 | "balanced-match": { 89 | "version": "1.0.0", 90 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 91 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 92 | }, 93 | "base": { 94 | "version": "0.11.2", 95 | "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", 96 | "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", 97 | "requires": { 98 | "cache-base": "1.0.1", 99 | "class-utils": "0.3.6", 100 | "component-emitter": "1.2.1", 101 | "define-property": "1.0.0", 102 | "isobject": "3.0.1", 103 | "mixin-deep": "1.3.1", 104 | "pascalcase": "0.1.1" 105 | }, 106 | "dependencies": { 107 | "define-property": { 108 | "version": "1.0.0", 109 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 110 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 111 | "requires": { 112 | "is-descriptor": "1.0.2" 113 | } 114 | }, 115 | "is-accessor-descriptor": { 116 | "version": "1.0.0", 117 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 118 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 119 | "requires": { 120 | "kind-of": "6.0.2" 121 | } 122 | }, 123 | "is-data-descriptor": { 124 | "version": "1.0.0", 125 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 126 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 127 | "requires": { 128 | "kind-of": "6.0.2" 129 | } 130 | }, 131 | "is-descriptor": { 132 | "version": "1.0.2", 133 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 134 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 135 | "requires": { 136 | "is-accessor-descriptor": "1.0.0", 137 | "is-data-descriptor": "1.0.0", 138 | "kind-of": "6.0.2" 139 | } 140 | } 141 | } 142 | }, 143 | "binary-extensions": { 144 | "version": "1.11.0", 145 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", 146 | "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" 147 | }, 148 | "brace-expansion": { 149 | "version": "1.1.11", 150 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 151 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 152 | "requires": { 153 | "balanced-match": "1.0.0", 154 | "concat-map": "0.0.1" 155 | } 156 | }, 157 | "braces": { 158 | "version": "2.3.2", 159 | "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", 160 | "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", 161 | "requires": { 162 | "arr-flatten": "1.1.0", 163 | "array-unique": "0.3.2", 164 | "extend-shallow": "2.0.1", 165 | "fill-range": "4.0.0", 166 | "isobject": "3.0.1", 167 | "repeat-element": "1.1.2", 168 | "snapdragon": "0.8.2", 169 | "snapdragon-node": "2.1.1", 170 | "split-string": "3.1.0", 171 | "to-regex": "3.0.2" 172 | }, 173 | "dependencies": { 174 | "extend-shallow": { 175 | "version": "2.0.1", 176 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 177 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 178 | "requires": { 179 | "is-extendable": "0.1.1" 180 | } 181 | } 182 | } 183 | }, 184 | "cache-base": { 185 | "version": "1.0.1", 186 | "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", 187 | "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", 188 | "requires": { 189 | "collection-visit": "1.0.0", 190 | "component-emitter": "1.2.1", 191 | "get-value": "2.0.6", 192 | "has-value": "1.0.0", 193 | "isobject": "3.0.1", 194 | "set-value": "2.0.0", 195 | "to-object-path": "0.3.0", 196 | "union-value": "1.0.0", 197 | "unset-value": "1.0.0" 198 | } 199 | }, 200 | "chokidar": { 201 | "version": "2.0.3", 202 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", 203 | "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", 204 | "requires": { 205 | "anymatch": "2.0.0", 206 | "async-each": "1.0.1", 207 | "braces": "2.3.2", 208 | "fsevents": "1.2.4", 209 | "glob-parent": "3.1.0", 210 | "inherits": "2.0.3", 211 | "is-binary-path": "1.0.1", 212 | "is-glob": "4.0.0", 213 | "normalize-path": "2.1.1", 214 | "path-is-absolute": "1.0.1", 215 | "readdirp": "2.1.0", 216 | "upath": "1.1.0" 217 | } 218 | }, 219 | "class-utils": { 220 | "version": "0.3.6", 221 | "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", 222 | "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", 223 | "requires": { 224 | "arr-union": "3.1.0", 225 | "define-property": "0.2.5", 226 | "isobject": "3.0.1", 227 | "static-extend": "0.1.2" 228 | }, 229 | "dependencies": { 230 | "define-property": { 231 | "version": "0.2.5", 232 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 233 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 234 | "requires": { 235 | "is-descriptor": "0.1.6" 236 | } 237 | } 238 | } 239 | }, 240 | "collection-visit": { 241 | "version": "1.0.0", 242 | "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", 243 | "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", 244 | "requires": { 245 | "map-visit": "1.0.0", 246 | "object-visit": "1.0.1" 247 | } 248 | }, 249 | "component-emitter": { 250 | "version": "1.2.1", 251 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 252 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" 253 | }, 254 | "concat-map": { 255 | "version": "0.0.1", 256 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 257 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 258 | }, 259 | "copy-descriptor": { 260 | "version": "0.1.1", 261 | "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", 262 | "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" 263 | }, 264 | "core-util-is": { 265 | "version": "1.0.2", 266 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 267 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 268 | }, 269 | "cpr": { 270 | "version": "3.0.1", 271 | "resolved": "https://registry.npmjs.org/cpr/-/cpr-3.0.1.tgz", 272 | "integrity": "sha1-uaVQOLfNgaNcF7l2GJW9hJau8eU=", 273 | "dev": true, 274 | "requires": { 275 | "graceful-fs": "4.1.11", 276 | "minimist": "1.2.0", 277 | "mkdirp": "0.5.1", 278 | "rimraf": "2.6.2" 279 | }, 280 | "dependencies": { 281 | "minimist": { 282 | "version": "1.2.0", 283 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 284 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 285 | "dev": true 286 | } 287 | } 288 | }, 289 | "debug": { 290 | "version": "2.6.9", 291 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 292 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 293 | "requires": { 294 | "ms": "2.0.0" 295 | } 296 | }, 297 | "decode-uri-component": { 298 | "version": "0.2.0", 299 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 300 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" 301 | }, 302 | "define-property": { 303 | "version": "2.0.2", 304 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", 305 | "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", 306 | "requires": { 307 | "is-descriptor": "1.0.2", 308 | "isobject": "3.0.1" 309 | }, 310 | "dependencies": { 311 | "is-accessor-descriptor": { 312 | "version": "1.0.0", 313 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 314 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 315 | "requires": { 316 | "kind-of": "6.0.2" 317 | } 318 | }, 319 | "is-data-descriptor": { 320 | "version": "1.0.0", 321 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 322 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 323 | "requires": { 324 | "kind-of": "6.0.2" 325 | } 326 | }, 327 | "is-descriptor": { 328 | "version": "1.0.2", 329 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 330 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 331 | "requires": { 332 | "is-accessor-descriptor": "1.0.0", 333 | "is-data-descriptor": "1.0.0", 334 | "kind-of": "6.0.2" 335 | } 336 | } 337 | } 338 | }, 339 | "expand-brackets": { 340 | "version": "2.1.4", 341 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", 342 | "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", 343 | "requires": { 344 | "debug": "2.6.9", 345 | "define-property": "0.2.5", 346 | "extend-shallow": "2.0.1", 347 | "posix-character-classes": "0.1.1", 348 | "regex-not": "1.0.2", 349 | "snapdragon": "0.8.2", 350 | "to-regex": "3.0.2" 351 | }, 352 | "dependencies": { 353 | "define-property": { 354 | "version": "0.2.5", 355 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 356 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 357 | "requires": { 358 | "is-descriptor": "0.1.6" 359 | } 360 | }, 361 | "extend-shallow": { 362 | "version": "2.0.1", 363 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 364 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 365 | "requires": { 366 | "is-extendable": "0.1.1" 367 | } 368 | } 369 | } 370 | }, 371 | "extend-shallow": { 372 | "version": "3.0.2", 373 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", 374 | "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", 375 | "requires": { 376 | "assign-symbols": "1.0.0", 377 | "is-extendable": "1.0.1" 378 | }, 379 | "dependencies": { 380 | "is-extendable": { 381 | "version": "1.0.1", 382 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 383 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 384 | "requires": { 385 | "is-plain-object": "2.0.4" 386 | } 387 | } 388 | } 389 | }, 390 | "extglob": { 391 | "version": "2.0.4", 392 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", 393 | "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", 394 | "requires": { 395 | "array-unique": "0.3.2", 396 | "define-property": "1.0.0", 397 | "expand-brackets": "2.1.4", 398 | "extend-shallow": "2.0.1", 399 | "fragment-cache": "0.2.1", 400 | "regex-not": "1.0.2", 401 | "snapdragon": "0.8.2", 402 | "to-regex": "3.0.2" 403 | }, 404 | "dependencies": { 405 | "define-property": { 406 | "version": "1.0.0", 407 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 408 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 409 | "requires": { 410 | "is-descriptor": "1.0.2" 411 | } 412 | }, 413 | "extend-shallow": { 414 | "version": "2.0.1", 415 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 416 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 417 | "requires": { 418 | "is-extendable": "0.1.1" 419 | } 420 | }, 421 | "is-accessor-descriptor": { 422 | "version": "1.0.0", 423 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 424 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 425 | "requires": { 426 | "kind-of": "6.0.2" 427 | } 428 | }, 429 | "is-data-descriptor": { 430 | "version": "1.0.0", 431 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 432 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 433 | "requires": { 434 | "kind-of": "6.0.2" 435 | } 436 | }, 437 | "is-descriptor": { 438 | "version": "1.0.2", 439 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 440 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 441 | "requires": { 442 | "is-accessor-descriptor": "1.0.0", 443 | "is-data-descriptor": "1.0.0", 444 | "kind-of": "6.0.2" 445 | } 446 | } 447 | } 448 | }, 449 | "fast-deep-equal": { 450 | "version": "1.1.0", 451 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 452 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" 453 | }, 454 | "fast-json-stable-stringify": { 455 | "version": "2.0.0", 456 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 457 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 458 | }, 459 | "fill-range": { 460 | "version": "4.0.0", 461 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", 462 | "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", 463 | "requires": { 464 | "extend-shallow": "2.0.1", 465 | "is-number": "3.0.0", 466 | "repeat-string": "1.6.1", 467 | "to-regex-range": "2.1.1" 468 | }, 469 | "dependencies": { 470 | "extend-shallow": { 471 | "version": "2.0.1", 472 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 473 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 474 | "requires": { 475 | "is-extendable": "0.1.1" 476 | } 477 | } 478 | } 479 | }, 480 | "for-in": { 481 | "version": "1.0.2", 482 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 483 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" 484 | }, 485 | "fragment-cache": { 486 | "version": "0.2.1", 487 | "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", 488 | "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", 489 | "requires": { 490 | "map-cache": "0.2.2" 491 | } 492 | }, 493 | "fs.realpath": { 494 | "version": "1.0.0", 495 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 496 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 497 | "dev": true 498 | }, 499 | "fsevents": { 500 | "version": "1.2.4", 501 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", 502 | "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", 503 | "optional": true, 504 | "requires": { 505 | "nan": "2.10.0", 506 | "node-pre-gyp": "0.10.0" 507 | }, 508 | "dependencies": { 509 | "abbrev": { 510 | "version": "1.1.1", 511 | "bundled": true, 512 | "optional": true 513 | }, 514 | "ansi-regex": { 515 | "version": "2.1.1", 516 | "bundled": true 517 | }, 518 | "aproba": { 519 | "version": "1.2.0", 520 | "bundled": true, 521 | "optional": true 522 | }, 523 | "are-we-there-yet": { 524 | "version": "1.1.4", 525 | "bundled": true, 526 | "optional": true, 527 | "requires": { 528 | "delegates": "1.0.0", 529 | "readable-stream": "2.3.6" 530 | } 531 | }, 532 | "balanced-match": { 533 | "version": "1.0.0", 534 | "bundled": true 535 | }, 536 | "brace-expansion": { 537 | "version": "1.1.11", 538 | "bundled": true, 539 | "requires": { 540 | "balanced-match": "1.0.0", 541 | "concat-map": "0.0.1" 542 | } 543 | }, 544 | "chownr": { 545 | "version": "1.0.1", 546 | "bundled": true, 547 | "optional": true 548 | }, 549 | "code-point-at": { 550 | "version": "1.1.0", 551 | "bundled": true 552 | }, 553 | "concat-map": { 554 | "version": "0.0.1", 555 | "bundled": true 556 | }, 557 | "console-control-strings": { 558 | "version": "1.1.0", 559 | "bundled": true 560 | }, 561 | "core-util-is": { 562 | "version": "1.0.2", 563 | "bundled": true, 564 | "optional": true 565 | }, 566 | "debug": { 567 | "version": "2.6.9", 568 | "bundled": true, 569 | "optional": true, 570 | "requires": { 571 | "ms": "2.0.0" 572 | } 573 | }, 574 | "deep-extend": { 575 | "version": "0.5.1", 576 | "bundled": true, 577 | "optional": true 578 | }, 579 | "delegates": { 580 | "version": "1.0.0", 581 | "bundled": true, 582 | "optional": true 583 | }, 584 | "detect-libc": { 585 | "version": "1.0.3", 586 | "bundled": true, 587 | "optional": true 588 | }, 589 | "fs-minipass": { 590 | "version": "1.2.5", 591 | "bundled": true, 592 | "optional": true, 593 | "requires": { 594 | "minipass": "2.2.4" 595 | } 596 | }, 597 | "fs.realpath": { 598 | "version": "1.0.0", 599 | "bundled": true, 600 | "optional": true 601 | }, 602 | "gauge": { 603 | "version": "2.7.4", 604 | "bundled": true, 605 | "optional": true, 606 | "requires": { 607 | "aproba": "1.2.0", 608 | "console-control-strings": "1.1.0", 609 | "has-unicode": "2.0.1", 610 | "object-assign": "4.1.1", 611 | "signal-exit": "3.0.2", 612 | "string-width": "1.0.2", 613 | "strip-ansi": "3.0.1", 614 | "wide-align": "1.1.2" 615 | } 616 | }, 617 | "glob": { 618 | "version": "7.1.2", 619 | "bundled": true, 620 | "optional": true, 621 | "requires": { 622 | "fs.realpath": "1.0.0", 623 | "inflight": "1.0.6", 624 | "inherits": "2.0.3", 625 | "minimatch": "3.0.4", 626 | "once": "1.4.0", 627 | "path-is-absolute": "1.0.1" 628 | } 629 | }, 630 | "has-unicode": { 631 | "version": "2.0.1", 632 | "bundled": true, 633 | "optional": true 634 | }, 635 | "iconv-lite": { 636 | "version": "0.4.21", 637 | "bundled": true, 638 | "optional": true, 639 | "requires": { 640 | "safer-buffer": "2.1.2" 641 | } 642 | }, 643 | "ignore-walk": { 644 | "version": "3.0.1", 645 | "bundled": true, 646 | "optional": true, 647 | "requires": { 648 | "minimatch": "3.0.4" 649 | } 650 | }, 651 | "inflight": { 652 | "version": "1.0.6", 653 | "bundled": true, 654 | "optional": true, 655 | "requires": { 656 | "once": "1.4.0", 657 | "wrappy": "1.0.2" 658 | } 659 | }, 660 | "inherits": { 661 | "version": "2.0.3", 662 | "bundled": true 663 | }, 664 | "ini": { 665 | "version": "1.3.5", 666 | "bundled": true, 667 | "optional": true 668 | }, 669 | "is-fullwidth-code-point": { 670 | "version": "1.0.0", 671 | "bundled": true, 672 | "requires": { 673 | "number-is-nan": "1.0.1" 674 | } 675 | }, 676 | "isarray": { 677 | "version": "1.0.0", 678 | "bundled": true, 679 | "optional": true 680 | }, 681 | "minimatch": { 682 | "version": "3.0.4", 683 | "bundled": true, 684 | "requires": { 685 | "brace-expansion": "1.1.11" 686 | } 687 | }, 688 | "minimist": { 689 | "version": "0.0.8", 690 | "bundled": true 691 | }, 692 | "minipass": { 693 | "version": "2.2.4", 694 | "bundled": true, 695 | "requires": { 696 | "safe-buffer": "5.1.1", 697 | "yallist": "3.0.2" 698 | } 699 | }, 700 | "minizlib": { 701 | "version": "1.1.0", 702 | "bundled": true, 703 | "optional": true, 704 | "requires": { 705 | "minipass": "2.2.4" 706 | } 707 | }, 708 | "mkdirp": { 709 | "version": "0.5.1", 710 | "bundled": true, 711 | "requires": { 712 | "minimist": "0.0.8" 713 | } 714 | }, 715 | "ms": { 716 | "version": "2.0.0", 717 | "bundled": true, 718 | "optional": true 719 | }, 720 | "needle": { 721 | "version": "2.2.0", 722 | "bundled": true, 723 | "optional": true, 724 | "requires": { 725 | "debug": "2.6.9", 726 | "iconv-lite": "0.4.21", 727 | "sax": "1.2.4" 728 | } 729 | }, 730 | "node-pre-gyp": { 731 | "version": "0.10.0", 732 | "bundled": true, 733 | "optional": true, 734 | "requires": { 735 | "detect-libc": "1.0.3", 736 | "mkdirp": "0.5.1", 737 | "needle": "2.2.0", 738 | "nopt": "4.0.1", 739 | "npm-packlist": "1.1.10", 740 | "npmlog": "4.1.2", 741 | "rc": "1.2.7", 742 | "rimraf": "2.6.2", 743 | "semver": "5.5.0", 744 | "tar": "4.4.1" 745 | } 746 | }, 747 | "nopt": { 748 | "version": "4.0.1", 749 | "bundled": true, 750 | "optional": true, 751 | "requires": { 752 | "abbrev": "1.1.1", 753 | "osenv": "0.1.5" 754 | } 755 | }, 756 | "npm-bundled": { 757 | "version": "1.0.3", 758 | "bundled": true, 759 | "optional": true 760 | }, 761 | "npm-packlist": { 762 | "version": "1.1.10", 763 | "bundled": true, 764 | "optional": true, 765 | "requires": { 766 | "ignore-walk": "3.0.1", 767 | "npm-bundled": "1.0.3" 768 | } 769 | }, 770 | "npmlog": { 771 | "version": "4.1.2", 772 | "bundled": true, 773 | "optional": true, 774 | "requires": { 775 | "are-we-there-yet": "1.1.4", 776 | "console-control-strings": "1.1.0", 777 | "gauge": "2.7.4", 778 | "set-blocking": "2.0.0" 779 | } 780 | }, 781 | "number-is-nan": { 782 | "version": "1.0.1", 783 | "bundled": true 784 | }, 785 | "object-assign": { 786 | "version": "4.1.1", 787 | "bundled": true, 788 | "optional": true 789 | }, 790 | "once": { 791 | "version": "1.4.0", 792 | "bundled": true, 793 | "requires": { 794 | "wrappy": "1.0.2" 795 | } 796 | }, 797 | "os-homedir": { 798 | "version": "1.0.2", 799 | "bundled": true, 800 | "optional": true 801 | }, 802 | "os-tmpdir": { 803 | "version": "1.0.2", 804 | "bundled": true, 805 | "optional": true 806 | }, 807 | "osenv": { 808 | "version": "0.1.5", 809 | "bundled": true, 810 | "optional": true, 811 | "requires": { 812 | "os-homedir": "1.0.2", 813 | "os-tmpdir": "1.0.2" 814 | } 815 | }, 816 | "path-is-absolute": { 817 | "version": "1.0.1", 818 | "bundled": true, 819 | "optional": true 820 | }, 821 | "process-nextick-args": { 822 | "version": "2.0.0", 823 | "bundled": true, 824 | "optional": true 825 | }, 826 | "rc": { 827 | "version": "1.2.7", 828 | "bundled": true, 829 | "optional": true, 830 | "requires": { 831 | "deep-extend": "0.5.1", 832 | "ini": "1.3.5", 833 | "minimist": "1.2.0", 834 | "strip-json-comments": "2.0.1" 835 | }, 836 | "dependencies": { 837 | "minimist": { 838 | "version": "1.2.0", 839 | "bundled": true, 840 | "optional": true 841 | } 842 | } 843 | }, 844 | "readable-stream": { 845 | "version": "2.3.6", 846 | "bundled": true, 847 | "optional": true, 848 | "requires": { 849 | "core-util-is": "1.0.2", 850 | "inherits": "2.0.3", 851 | "isarray": "1.0.0", 852 | "process-nextick-args": "2.0.0", 853 | "safe-buffer": "5.1.1", 854 | "string_decoder": "1.1.1", 855 | "util-deprecate": "1.0.2" 856 | } 857 | }, 858 | "rimraf": { 859 | "version": "2.6.2", 860 | "bundled": true, 861 | "optional": true, 862 | "requires": { 863 | "glob": "7.1.2" 864 | } 865 | }, 866 | "safe-buffer": { 867 | "version": "5.1.1", 868 | "bundled": true 869 | }, 870 | "safer-buffer": { 871 | "version": "2.1.2", 872 | "bundled": true, 873 | "optional": true 874 | }, 875 | "sax": { 876 | "version": "1.2.4", 877 | "bundled": true, 878 | "optional": true 879 | }, 880 | "semver": { 881 | "version": "5.5.0", 882 | "bundled": true, 883 | "optional": true 884 | }, 885 | "set-blocking": { 886 | "version": "2.0.0", 887 | "bundled": true, 888 | "optional": true 889 | }, 890 | "signal-exit": { 891 | "version": "3.0.2", 892 | "bundled": true, 893 | "optional": true 894 | }, 895 | "string-width": { 896 | "version": "1.0.2", 897 | "bundled": true, 898 | "requires": { 899 | "code-point-at": "1.1.0", 900 | "is-fullwidth-code-point": "1.0.0", 901 | "strip-ansi": "3.0.1" 902 | } 903 | }, 904 | "string_decoder": { 905 | "version": "1.1.1", 906 | "bundled": true, 907 | "optional": true, 908 | "requires": { 909 | "safe-buffer": "5.1.1" 910 | } 911 | }, 912 | "strip-ansi": { 913 | "version": "3.0.1", 914 | "bundled": true, 915 | "requires": { 916 | "ansi-regex": "2.1.1" 917 | } 918 | }, 919 | "strip-json-comments": { 920 | "version": "2.0.1", 921 | "bundled": true, 922 | "optional": true 923 | }, 924 | "tar": { 925 | "version": "4.4.1", 926 | "bundled": true, 927 | "optional": true, 928 | "requires": { 929 | "chownr": "1.0.1", 930 | "fs-minipass": "1.2.5", 931 | "minipass": "2.2.4", 932 | "minizlib": "1.1.0", 933 | "mkdirp": "0.5.1", 934 | "safe-buffer": "5.1.1", 935 | "yallist": "3.0.2" 936 | } 937 | }, 938 | "util-deprecate": { 939 | "version": "1.0.2", 940 | "bundled": true, 941 | "optional": true 942 | }, 943 | "wide-align": { 944 | "version": "1.1.2", 945 | "bundled": true, 946 | "optional": true, 947 | "requires": { 948 | "string-width": "1.0.2" 949 | } 950 | }, 951 | "wrappy": { 952 | "version": "1.0.2", 953 | "bundled": true 954 | }, 955 | "yallist": { 956 | "version": "3.0.2", 957 | "bundled": true 958 | } 959 | } 960 | }, 961 | "get-value": { 962 | "version": "2.0.6", 963 | "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", 964 | "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" 965 | }, 966 | "glob": { 967 | "version": "7.1.2", 968 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 969 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 970 | "dev": true, 971 | "requires": { 972 | "fs.realpath": "1.0.0", 973 | "inflight": "1.0.6", 974 | "inherits": "2.0.3", 975 | "minimatch": "3.0.4", 976 | "once": "1.4.0", 977 | "path-is-absolute": "1.0.1" 978 | } 979 | }, 980 | "glob-parent": { 981 | "version": "3.1.0", 982 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 983 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 984 | "requires": { 985 | "is-glob": "3.1.0", 986 | "path-dirname": "1.0.2" 987 | }, 988 | "dependencies": { 989 | "is-glob": { 990 | "version": "3.1.0", 991 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 992 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 993 | "requires": { 994 | "is-extglob": "2.1.1" 995 | } 996 | } 997 | } 998 | }, 999 | "graceful-fs": { 1000 | "version": "4.1.11", 1001 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1002 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 1003 | }, 1004 | "has-value": { 1005 | "version": "1.0.0", 1006 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", 1007 | "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", 1008 | "requires": { 1009 | "get-value": "2.0.6", 1010 | "has-values": "1.0.0", 1011 | "isobject": "3.0.1" 1012 | } 1013 | }, 1014 | "has-values": { 1015 | "version": "1.0.0", 1016 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", 1017 | "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", 1018 | "requires": { 1019 | "is-number": "3.0.0", 1020 | "kind-of": "4.0.0" 1021 | }, 1022 | "dependencies": { 1023 | "kind-of": { 1024 | "version": "4.0.0", 1025 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 1026 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 1027 | "requires": { 1028 | "is-buffer": "1.1.6" 1029 | } 1030 | } 1031 | } 1032 | }, 1033 | "inflight": { 1034 | "version": "1.0.6", 1035 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1036 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1037 | "dev": true, 1038 | "requires": { 1039 | "once": "1.4.0", 1040 | "wrappy": "1.0.2" 1041 | } 1042 | }, 1043 | "inherits": { 1044 | "version": "2.0.3", 1045 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1046 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1047 | }, 1048 | "is-accessor-descriptor": { 1049 | "version": "0.1.6", 1050 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 1051 | "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 1052 | "requires": { 1053 | "kind-of": "3.2.2" 1054 | }, 1055 | "dependencies": { 1056 | "kind-of": { 1057 | "version": "3.2.2", 1058 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1059 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1060 | "requires": { 1061 | "is-buffer": "1.1.6" 1062 | } 1063 | } 1064 | } 1065 | }, 1066 | "is-binary-path": { 1067 | "version": "1.0.1", 1068 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 1069 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 1070 | "requires": { 1071 | "binary-extensions": "1.11.0" 1072 | } 1073 | }, 1074 | "is-buffer": { 1075 | "version": "1.1.6", 1076 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1077 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 1078 | }, 1079 | "is-data-descriptor": { 1080 | "version": "0.1.4", 1081 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 1082 | "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 1083 | "requires": { 1084 | "kind-of": "3.2.2" 1085 | }, 1086 | "dependencies": { 1087 | "kind-of": { 1088 | "version": "3.2.2", 1089 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1090 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1091 | "requires": { 1092 | "is-buffer": "1.1.6" 1093 | } 1094 | } 1095 | } 1096 | }, 1097 | "is-descriptor": { 1098 | "version": "0.1.6", 1099 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", 1100 | "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", 1101 | "requires": { 1102 | "is-accessor-descriptor": "0.1.6", 1103 | "is-data-descriptor": "0.1.4", 1104 | "kind-of": "5.1.0" 1105 | }, 1106 | "dependencies": { 1107 | "kind-of": { 1108 | "version": "5.1.0", 1109 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", 1110 | "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" 1111 | } 1112 | } 1113 | }, 1114 | "is-extendable": { 1115 | "version": "0.1.1", 1116 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1117 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 1118 | }, 1119 | "is-extglob": { 1120 | "version": "2.1.1", 1121 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1122 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 1123 | }, 1124 | "is-glob": { 1125 | "version": "4.0.0", 1126 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", 1127 | "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", 1128 | "requires": { 1129 | "is-extglob": "2.1.1" 1130 | } 1131 | }, 1132 | "is-number": { 1133 | "version": "3.0.0", 1134 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 1135 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 1136 | "requires": { 1137 | "kind-of": "3.2.2" 1138 | }, 1139 | "dependencies": { 1140 | "kind-of": { 1141 | "version": "3.2.2", 1142 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1143 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1144 | "requires": { 1145 | "is-buffer": "1.1.6" 1146 | } 1147 | } 1148 | } 1149 | }, 1150 | "is-odd": { 1151 | "version": "2.0.0", 1152 | "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", 1153 | "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", 1154 | "requires": { 1155 | "is-number": "4.0.0" 1156 | }, 1157 | "dependencies": { 1158 | "is-number": { 1159 | "version": "4.0.0", 1160 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", 1161 | "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" 1162 | } 1163 | } 1164 | }, 1165 | "is-plain-object": { 1166 | "version": "2.0.4", 1167 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1168 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1169 | "requires": { 1170 | "isobject": "3.0.1" 1171 | } 1172 | }, 1173 | "is-windows": { 1174 | "version": "1.0.2", 1175 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1176 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" 1177 | }, 1178 | "isarray": { 1179 | "version": "1.0.0", 1180 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1181 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1182 | }, 1183 | "isobject": { 1184 | "version": "3.0.1", 1185 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1186 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 1187 | }, 1188 | "json-schema-traverse": { 1189 | "version": "0.3.1", 1190 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 1191 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 1192 | }, 1193 | "kind-of": { 1194 | "version": "6.0.2", 1195 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 1196 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 1197 | }, 1198 | "map-cache": { 1199 | "version": "0.2.2", 1200 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 1201 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" 1202 | }, 1203 | "map-visit": { 1204 | "version": "1.0.0", 1205 | "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", 1206 | "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", 1207 | "requires": { 1208 | "object-visit": "1.0.1" 1209 | } 1210 | }, 1211 | "micromatch": { 1212 | "version": "3.1.10", 1213 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", 1214 | "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", 1215 | "requires": { 1216 | "arr-diff": "4.0.0", 1217 | "array-unique": "0.3.2", 1218 | "braces": "2.3.2", 1219 | "define-property": "2.0.2", 1220 | "extend-shallow": "3.0.2", 1221 | "extglob": "2.0.4", 1222 | "fragment-cache": "0.2.1", 1223 | "kind-of": "6.0.2", 1224 | "nanomatch": "1.2.9", 1225 | "object.pick": "1.3.0", 1226 | "regex-not": "1.0.2", 1227 | "snapdragon": "0.8.2", 1228 | "to-regex": "3.0.2" 1229 | } 1230 | }, 1231 | "minimatch": { 1232 | "version": "3.0.4", 1233 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1234 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1235 | "requires": { 1236 | "brace-expansion": "1.1.11" 1237 | } 1238 | }, 1239 | "minimist": { 1240 | "version": "0.0.8", 1241 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1242 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1243 | "dev": true 1244 | }, 1245 | "mixin-deep": { 1246 | "version": "1.3.1", 1247 | "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", 1248 | "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", 1249 | "requires": { 1250 | "for-in": "1.0.2", 1251 | "is-extendable": "1.0.1" 1252 | }, 1253 | "dependencies": { 1254 | "is-extendable": { 1255 | "version": "1.0.1", 1256 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 1257 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 1258 | "requires": { 1259 | "is-plain-object": "2.0.4" 1260 | } 1261 | } 1262 | } 1263 | }, 1264 | "mkdirp": { 1265 | "version": "0.5.1", 1266 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1267 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1268 | "dev": true, 1269 | "requires": { 1270 | "minimist": "0.0.8" 1271 | } 1272 | }, 1273 | "ms": { 1274 | "version": "2.0.0", 1275 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1276 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1277 | }, 1278 | "nan": { 1279 | "version": "2.10.0", 1280 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", 1281 | "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", 1282 | "optional": true 1283 | }, 1284 | "nanomatch": { 1285 | "version": "1.2.9", 1286 | "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", 1287 | "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", 1288 | "requires": { 1289 | "arr-diff": "4.0.0", 1290 | "array-unique": "0.3.2", 1291 | "define-property": "2.0.2", 1292 | "extend-shallow": "3.0.2", 1293 | "fragment-cache": "0.2.1", 1294 | "is-odd": "2.0.0", 1295 | "is-windows": "1.0.2", 1296 | "kind-of": "6.0.2", 1297 | "object.pick": "1.3.0", 1298 | "regex-not": "1.0.2", 1299 | "snapdragon": "0.8.2", 1300 | "to-regex": "3.0.2" 1301 | } 1302 | }, 1303 | "normalize-path": { 1304 | "version": "2.1.1", 1305 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1306 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1307 | "requires": { 1308 | "remove-trailing-separator": "1.1.0" 1309 | } 1310 | }, 1311 | "object-copy": { 1312 | "version": "0.1.0", 1313 | "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", 1314 | "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", 1315 | "requires": { 1316 | "copy-descriptor": "0.1.1", 1317 | "define-property": "0.2.5", 1318 | "kind-of": "3.2.2" 1319 | }, 1320 | "dependencies": { 1321 | "define-property": { 1322 | "version": "0.2.5", 1323 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 1324 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 1325 | "requires": { 1326 | "is-descriptor": "0.1.6" 1327 | } 1328 | }, 1329 | "kind-of": { 1330 | "version": "3.2.2", 1331 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1332 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1333 | "requires": { 1334 | "is-buffer": "1.1.6" 1335 | } 1336 | } 1337 | } 1338 | }, 1339 | "object-visit": { 1340 | "version": "1.0.1", 1341 | "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", 1342 | "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", 1343 | "requires": { 1344 | "isobject": "3.0.1" 1345 | } 1346 | }, 1347 | "object.pick": { 1348 | "version": "1.3.0", 1349 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 1350 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 1351 | "requires": { 1352 | "isobject": "3.0.1" 1353 | } 1354 | }, 1355 | "once": { 1356 | "version": "1.4.0", 1357 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1358 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1359 | "dev": true, 1360 | "requires": { 1361 | "wrappy": "1.0.2" 1362 | } 1363 | }, 1364 | "pascalcase": { 1365 | "version": "0.1.1", 1366 | "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", 1367 | "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" 1368 | }, 1369 | "path-dirname": { 1370 | "version": "1.0.2", 1371 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 1372 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" 1373 | }, 1374 | "path-is-absolute": { 1375 | "version": "1.0.1", 1376 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1377 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1378 | }, 1379 | "posix-character-classes": { 1380 | "version": "0.1.1", 1381 | "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", 1382 | "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" 1383 | }, 1384 | "process-nextick-args": { 1385 | "version": "2.0.0", 1386 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1387 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 1388 | }, 1389 | "punycode": { 1390 | "version": "2.1.1", 1391 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1392 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1393 | }, 1394 | "readable-stream": { 1395 | "version": "2.3.6", 1396 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1397 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1398 | "requires": { 1399 | "core-util-is": "1.0.2", 1400 | "inherits": "2.0.3", 1401 | "isarray": "1.0.0", 1402 | "process-nextick-args": "2.0.0", 1403 | "safe-buffer": "5.1.2", 1404 | "string_decoder": "1.1.1", 1405 | "util-deprecate": "1.0.2" 1406 | } 1407 | }, 1408 | "readdirp": { 1409 | "version": "2.1.0", 1410 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", 1411 | "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", 1412 | "requires": { 1413 | "graceful-fs": "4.1.11", 1414 | "minimatch": "3.0.4", 1415 | "readable-stream": "2.3.6", 1416 | "set-immediate-shim": "1.0.1" 1417 | } 1418 | }, 1419 | "regex-not": { 1420 | "version": "1.0.2", 1421 | "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", 1422 | "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", 1423 | "requires": { 1424 | "extend-shallow": "3.0.2", 1425 | "safe-regex": "1.1.0" 1426 | } 1427 | }, 1428 | "remove-trailing-separator": { 1429 | "version": "1.1.0", 1430 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1431 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 1432 | }, 1433 | "repeat-element": { 1434 | "version": "1.1.2", 1435 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 1436 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" 1437 | }, 1438 | "repeat-string": { 1439 | "version": "1.6.1", 1440 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1441 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 1442 | }, 1443 | "resolve-url": { 1444 | "version": "0.2.1", 1445 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 1446 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" 1447 | }, 1448 | "ret": { 1449 | "version": "0.1.15", 1450 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 1451 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" 1452 | }, 1453 | "rimraf": { 1454 | "version": "2.6.2", 1455 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1456 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1457 | "dev": true, 1458 | "requires": { 1459 | "glob": "7.1.2" 1460 | } 1461 | }, 1462 | "rxjs": { 1463 | "version": "6.2.1", 1464 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz", 1465 | "integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==", 1466 | "requires": { 1467 | "tslib": "1.9.2" 1468 | } 1469 | }, 1470 | "safe-buffer": { 1471 | "version": "5.1.2", 1472 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1473 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1474 | }, 1475 | "safe-regex": { 1476 | "version": "1.1.0", 1477 | "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 1478 | "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 1479 | "requires": { 1480 | "ret": "0.1.15" 1481 | } 1482 | }, 1483 | "set-immediate-shim": { 1484 | "version": "1.0.1", 1485 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 1486 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" 1487 | }, 1488 | "set-value": { 1489 | "version": "2.0.0", 1490 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", 1491 | "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", 1492 | "requires": { 1493 | "extend-shallow": "2.0.1", 1494 | "is-extendable": "0.1.1", 1495 | "is-plain-object": "2.0.4", 1496 | "split-string": "3.1.0" 1497 | }, 1498 | "dependencies": { 1499 | "extend-shallow": { 1500 | "version": "2.0.1", 1501 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1502 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1503 | "requires": { 1504 | "is-extendable": "0.1.1" 1505 | } 1506 | } 1507 | } 1508 | }, 1509 | "snapdragon": { 1510 | "version": "0.8.2", 1511 | "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", 1512 | "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", 1513 | "requires": { 1514 | "base": "0.11.2", 1515 | "debug": "2.6.9", 1516 | "define-property": "0.2.5", 1517 | "extend-shallow": "2.0.1", 1518 | "map-cache": "0.2.2", 1519 | "source-map": "0.5.7", 1520 | "source-map-resolve": "0.5.2", 1521 | "use": "3.1.0" 1522 | }, 1523 | "dependencies": { 1524 | "define-property": { 1525 | "version": "0.2.5", 1526 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 1527 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 1528 | "requires": { 1529 | "is-descriptor": "0.1.6" 1530 | } 1531 | }, 1532 | "extend-shallow": { 1533 | "version": "2.0.1", 1534 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1535 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1536 | "requires": { 1537 | "is-extendable": "0.1.1" 1538 | } 1539 | } 1540 | } 1541 | }, 1542 | "snapdragon-node": { 1543 | "version": "2.1.1", 1544 | "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", 1545 | "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", 1546 | "requires": { 1547 | "define-property": "1.0.0", 1548 | "isobject": "3.0.1", 1549 | "snapdragon-util": "3.0.1" 1550 | }, 1551 | "dependencies": { 1552 | "define-property": { 1553 | "version": "1.0.0", 1554 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 1555 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 1556 | "requires": { 1557 | "is-descriptor": "1.0.2" 1558 | } 1559 | }, 1560 | "is-accessor-descriptor": { 1561 | "version": "1.0.0", 1562 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 1563 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 1564 | "requires": { 1565 | "kind-of": "6.0.2" 1566 | } 1567 | }, 1568 | "is-data-descriptor": { 1569 | "version": "1.0.0", 1570 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 1571 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 1572 | "requires": { 1573 | "kind-of": "6.0.2" 1574 | } 1575 | }, 1576 | "is-descriptor": { 1577 | "version": "1.0.2", 1578 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 1579 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 1580 | "requires": { 1581 | "is-accessor-descriptor": "1.0.0", 1582 | "is-data-descriptor": "1.0.0", 1583 | "kind-of": "6.0.2" 1584 | } 1585 | } 1586 | } 1587 | }, 1588 | "snapdragon-util": { 1589 | "version": "3.0.1", 1590 | "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", 1591 | "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", 1592 | "requires": { 1593 | "kind-of": "3.2.2" 1594 | }, 1595 | "dependencies": { 1596 | "kind-of": { 1597 | "version": "3.2.2", 1598 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1599 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1600 | "requires": { 1601 | "is-buffer": "1.1.6" 1602 | } 1603 | } 1604 | } 1605 | }, 1606 | "source-map": { 1607 | "version": "0.5.7", 1608 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1609 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 1610 | }, 1611 | "source-map-resolve": { 1612 | "version": "0.5.2", 1613 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", 1614 | "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", 1615 | "requires": { 1616 | "atob": "2.1.1", 1617 | "decode-uri-component": "0.2.0", 1618 | "resolve-url": "0.2.1", 1619 | "source-map-url": "0.4.0", 1620 | "urix": "0.1.0" 1621 | } 1622 | }, 1623 | "source-map-url": { 1624 | "version": "0.4.0", 1625 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", 1626 | "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" 1627 | }, 1628 | "split-string": { 1629 | "version": "3.1.0", 1630 | "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", 1631 | "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", 1632 | "requires": { 1633 | "extend-shallow": "3.0.2" 1634 | } 1635 | }, 1636 | "static-extend": { 1637 | "version": "0.1.2", 1638 | "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", 1639 | "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", 1640 | "requires": { 1641 | "define-property": "0.2.5", 1642 | "object-copy": "0.1.0" 1643 | }, 1644 | "dependencies": { 1645 | "define-property": { 1646 | "version": "0.2.5", 1647 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 1648 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 1649 | "requires": { 1650 | "is-descriptor": "0.1.6" 1651 | } 1652 | } 1653 | } 1654 | }, 1655 | "string_decoder": { 1656 | "version": "1.1.1", 1657 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1658 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1659 | "requires": { 1660 | "safe-buffer": "5.1.2" 1661 | } 1662 | }, 1663 | "to-object-path": { 1664 | "version": "0.3.0", 1665 | "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", 1666 | "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", 1667 | "requires": { 1668 | "kind-of": "3.2.2" 1669 | }, 1670 | "dependencies": { 1671 | "kind-of": { 1672 | "version": "3.2.2", 1673 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1674 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1675 | "requires": { 1676 | "is-buffer": "1.1.6" 1677 | } 1678 | } 1679 | } 1680 | }, 1681 | "to-regex": { 1682 | "version": "3.0.2", 1683 | "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", 1684 | "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", 1685 | "requires": { 1686 | "define-property": "2.0.2", 1687 | "extend-shallow": "3.0.2", 1688 | "regex-not": "1.0.2", 1689 | "safe-regex": "1.1.0" 1690 | } 1691 | }, 1692 | "to-regex-range": { 1693 | "version": "2.1.1", 1694 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", 1695 | "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", 1696 | "requires": { 1697 | "is-number": "3.0.0", 1698 | "repeat-string": "1.6.1" 1699 | } 1700 | }, 1701 | "tslib": { 1702 | "version": "1.9.2", 1703 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.2.tgz", 1704 | "integrity": "sha512-AVP5Xol3WivEr7hnssHDsaM+lVrVXWUvd1cfXTRkTj80b//6g2wIFEH6hZG0muGZRnHGrfttpdzRk3YlBkWjKw==" 1705 | }, 1706 | "typescript": { 1707 | "version": "2.9.1", 1708 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.1.tgz", 1709 | "integrity": "sha512-h6pM2f/GDchCFlldnriOhs1QHuwbnmj6/v7499eMHqPeW4V2G0elua2eIc2nu8v2NdHV0Gm+tzX83Hr6nUFjQA==", 1710 | "dev": true 1711 | }, 1712 | "union-value": { 1713 | "version": "1.0.0", 1714 | "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", 1715 | "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", 1716 | "requires": { 1717 | "arr-union": "3.1.0", 1718 | "get-value": "2.0.6", 1719 | "is-extendable": "0.1.1", 1720 | "set-value": "0.4.3" 1721 | }, 1722 | "dependencies": { 1723 | "extend-shallow": { 1724 | "version": "2.0.1", 1725 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1726 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1727 | "requires": { 1728 | "is-extendable": "0.1.1" 1729 | } 1730 | }, 1731 | "set-value": { 1732 | "version": "0.4.3", 1733 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", 1734 | "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", 1735 | "requires": { 1736 | "extend-shallow": "2.0.1", 1737 | "is-extendable": "0.1.1", 1738 | "is-plain-object": "2.0.4", 1739 | "to-object-path": "0.3.0" 1740 | } 1741 | } 1742 | } 1743 | }, 1744 | "unset-value": { 1745 | "version": "1.0.0", 1746 | "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", 1747 | "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", 1748 | "requires": { 1749 | "has-value": "0.3.1", 1750 | "isobject": "3.0.1" 1751 | }, 1752 | "dependencies": { 1753 | "has-value": { 1754 | "version": "0.3.1", 1755 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", 1756 | "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", 1757 | "requires": { 1758 | "get-value": "2.0.6", 1759 | "has-values": "0.1.4", 1760 | "isobject": "2.1.0" 1761 | }, 1762 | "dependencies": { 1763 | "isobject": { 1764 | "version": "2.1.0", 1765 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 1766 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 1767 | "requires": { 1768 | "isarray": "1.0.0" 1769 | } 1770 | } 1771 | } 1772 | }, 1773 | "has-values": { 1774 | "version": "0.1.4", 1775 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", 1776 | "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" 1777 | } 1778 | } 1779 | }, 1780 | "upath": { 1781 | "version": "1.1.0", 1782 | "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", 1783 | "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" 1784 | }, 1785 | "uri-js": { 1786 | "version": "3.0.2", 1787 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", 1788 | "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", 1789 | "requires": { 1790 | "punycode": "2.1.1" 1791 | } 1792 | }, 1793 | "urix": { 1794 | "version": "0.1.0", 1795 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 1796 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" 1797 | }, 1798 | "use": { 1799 | "version": "3.1.0", 1800 | "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", 1801 | "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", 1802 | "requires": { 1803 | "kind-of": "6.0.2" 1804 | } 1805 | }, 1806 | "util-deprecate": { 1807 | "version": "1.0.2", 1808 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1809 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1810 | }, 1811 | "wrappy": { 1812 | "version": "1.0.2", 1813 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1814 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1815 | "dev": true 1816 | } 1817 | } 1818 | } 1819 | -------------------------------------------------------------------------------- /lib/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ngx-cypress-builder", 3 | "version": "1.0.2", 4 | "description": "Extensible Builder for the Angular CLI suitable not only for Angular Elements.", 5 | "license": "MIT", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/isaacplmann/ngx-cypress-builder" 9 | }, 10 | "main": "src/index.js", 11 | "typings": "src/index.d.ts", 12 | "builders": "builders.json", 13 | "scripts": { 14 | "tsc": "tsc", 15 | "copy:sample": "cpr . ../sample/node_modules/ngx-cypress-builder -d -f node_modules", 16 | "copy:readme": "cpr ../readme.md ./readme.md -o", 17 | "build": "npm run tsc && npm run copy:sample && npm run copy:readme" 18 | }, 19 | "dependencies": { 20 | "@angular-devkit/architect": "^0.7.1" 21 | }, 22 | "peerDependencies": { 23 | "rxjs": "^6.0.0", 24 | "cypress": "^3.1.0" 25 | }, 26 | "devDependencies": { 27 | "@types/node": "^10.3.2", 28 | "cpr": "^3.0.1", 29 | "typescript": "^2.9.1" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/src/cypress/cypress-builder.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright Google Inc. All Rights Reserved. 4 | * 5 | * Use of this source code is governed by an MIT-style license that can be 6 | * found in the LICENSE file at https://angular.io/license 7 | */ 8 | import { 9 | Builder, 10 | BuilderConfiguration, 11 | BuilderContext, 12 | BuilderDescription, 13 | BuildEvent 14 | } from "@angular-devkit/architect"; 15 | import { from, Observable, of } from "rxjs"; 16 | import { concatMap, map, take, tap } from "rxjs/operators"; 17 | import * as url from "url"; 18 | 19 | export enum CypressRunningMode { 20 | Console = "console", 21 | Browser = "browser" 22 | } 23 | 24 | export interface CypressBuilderOptions { 25 | devServerTarget?: string; 26 | mode?: string; 27 | baseUrl?: string; 28 | host?: string; 29 | ciBuildId?: string; 30 | env?: object; 31 | group?: string; 32 | key?: string; 33 | parallel?: boolean; 34 | port?: number; 35 | project?: string; 36 | record?: boolean; 37 | reporter?: string; 38 | reporterPath?: string; 39 | spec?: string; 40 | } 41 | 42 | export class CypressBuilder implements Builder { 43 | constructor(public context: BuilderContext) {} 44 | 45 | run( 46 | builderConfig: BuilderConfiguration 47 | ): Observable { 48 | const options = { 49 | ...builderConfig.options, 50 | project: builderConfig.root 51 | }; 52 | 53 | return of(null).pipe( 54 | concatMap( 55 | () => 56 | options.devServerTarget ? this._startDevServer(options) : of(null) 57 | ), 58 | concatMap(() => this._execute(options)), 59 | take(1) 60 | ); 61 | } 62 | 63 | // Note: this method mutates the options argument. 64 | private _startDevServer(options: CypressBuilderOptions) { 65 | const architect = this.context.architect; 66 | const [ 67 | project, 68 | targetName, 69 | configuration 70 | ] = (options.devServerTarget as string).split(":"); 71 | // Override browser build watch setting. 72 | const overrides = { watch: false, host: options.host, port: options.port }; 73 | const targetSpec = { 74 | project, 75 | target: targetName, 76 | configuration, 77 | overrides 78 | }; 79 | const builderConfig = architect.getBuilderConfiguration(targetSpec); 80 | let devServerDescription: BuilderDescription; 81 | let baseUrl: string; 82 | 83 | return architect.getBuilderDescription(builderConfig).pipe( 84 | tap( 85 | description => 86 | (devServerDescription = description as BuilderDescription) 87 | ), 88 | concatMap(description => 89 | architect.validateBuilderOptions(builderConfig, description) 90 | ), 91 | concatMap(() => { 92 | // Compute baseUrl from devServerOptions. 93 | if (options.devServerTarget && builderConfig.options.publicHost) { 94 | let publicHost = builderConfig.options.publicHost; 95 | if (!/^\w+:\/\//.test(publicHost)) { 96 | publicHost = `${ 97 | builderConfig.options.ssl ? "https" : "http" 98 | }://${publicHost}`; 99 | } 100 | const clientUrl = url.parse(publicHost); 101 | baseUrl = url.format(clientUrl); 102 | } else if (options.devServerTarget) { 103 | baseUrl = url.format({ 104 | protocol: builderConfig.options.ssl ? "https" : "http", 105 | hostname: options.host, 106 | port: builderConfig.options.port.toString() 107 | }); 108 | } 109 | 110 | // Save the computed baseUrl back so that Protractor can use it. 111 | options.baseUrl = baseUrl; 112 | 113 | return of( 114 | this.context.architect.getBuilder(devServerDescription, this.context) 115 | ); 116 | }), 117 | concatMap(builder => builder.run(builderConfig)) 118 | ); 119 | } 120 | 121 | private _execute(options: CypressBuilderOptions): Observable { 122 | const additionalCypressConfig = { 123 | config: { 124 | baseUrl: options.baseUrl 125 | }, 126 | ...(options.ciBuildId ? { ciBuildId: options.ciBuildId } : {}), 127 | ...(options.env ? { env: options.env } : {}), 128 | ...(options.group ? { group: options.group } : {}), 129 | ...(options.key ? { key: options.key } : {}), 130 | ...(options.parallel ? { parallel: options.parallel } : {}), 131 | ...(options.project ? { project: options.project } : {}), 132 | ...(options.record ? { record: options.record } : {}), 133 | ...(options.reporter ? { reporter: options.reporter } : {}), 134 | ...(options.reporterPath ? { reporter: options.reporterPath } : {}), 135 | ...(options.spec ? { spec: options.spec } : {}) 136 | }; 137 | const cypress = require("cypress"); 138 | const runner = 139 | options.mode === CypressRunningMode.Console 140 | ? from(cypress.run(additionalCypressConfig)) 141 | .pipe(map((result: any) => ({ success: result.totalFailed === 0 }))) 142 | : cypress.open(additionalCypressConfig); 143 | 144 | return from(runner); 145 | } 146 | } 147 | 148 | export default CypressBuilder; 149 | -------------------------------------------------------------------------------- /lib/src/cypress/index.ts: -------------------------------------------------------------------------------- 1 | export * from './cypress-builder'; 2 | -------------------------------------------------------------------------------- /lib/src/cypress/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Cypress Target", 3 | "description": "Cypress target options for Build Facade.", 4 | "type": "object", 5 | "properties": { 6 | "devServerTarget": { 7 | "type": "string", 8 | "description": "Dev server target to run tests against." 9 | }, 10 | "mode": { 11 | "type": "string", 12 | "enum": [ 13 | "console", 14 | "browser" 15 | ], 16 | "description": "Run mode of Cypress. Valid value are 'console' and 'browser'", 17 | "default": "console" 18 | }, 19 | "baseUrl": { 20 | "type": "string", 21 | "description": "Base URL for Cypress to connect to." 22 | }, 23 | "host": { 24 | "type": "string", 25 | "description": "Host to listen on.", 26 | "default": "localhost" 27 | }, 28 | "ciBuildId": { 29 | "type": "string", 30 | "description": "Specify a unique identifier for a run to enable grouping or parallelization" 31 | }, 32 | "env": { 33 | "type": "object", 34 | "description": "Environment variable" 35 | }, 36 | "group": { 37 | "type": "string", 38 | "description": "Group recorded tests together under a single run" 39 | }, 40 | "key": { 41 | "type": "string", 42 | "description": "Specify your secret record key" 43 | }, 44 | "parallel": { 45 | "type": "boolean", 46 | "description": "Run recorded specs in parallel across multiple machines" 47 | }, 48 | "port": { 49 | "type": "number", 50 | "description": "The port to use to serve the application." 51 | }, 52 | "project": { 53 | "type": "string", 54 | "description": "Path to a specific project" 55 | }, 56 | "record": { 57 | "type": "boolean", 58 | "description": "Whether to record and upload the test run to Cypress Dashboard" 59 | }, 60 | "reporter": { 61 | "type": "string", 62 | "description": "Specify a Mocha reporter" 63 | }, 64 | "reporterPath": { 65 | "type": "string", 66 | "description": "Relative path to the reporter based the project root" 67 | }, 68 | "spec": { 69 | "type": "string", 70 | "description": "Specify the specs to run" 71 | } 72 | }, 73 | "additionalProperties": false 74 | } 75 | -------------------------------------------------------------------------------- /lib/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './cypress'; 2 | -------------------------------------------------------------------------------- /lib/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "emitDecoratorMetadata": true, 5 | "experimentalDecorators": true, 6 | "module": "commonjs", 7 | "moduleResolution": "node", 8 | "noEmitOnError": true, 9 | "noFallthroughCasesInSwitch": true, 10 | "noImplicitAny": true, 11 | "noImplicitThis": true, 12 | "noUnusedParameters": false, // The linter is used for these. 13 | "noUnusedLocals": false, // The linter is used for these. 14 | "rootDir": ".", 15 | "skipDefaultLibCheck": true, 16 | "skipLibCheck": true, 17 | "inlineSourceMap": true, 18 | "sourceRoot": ".", 19 | // Inline sources are necessary for our tests to show the proper sources, since we are using 20 | // Istanbul (not Constantinople) as well, and applying both source maps to get the original 21 | // source in devtools. 22 | "inlineSources": true, 23 | "strictNullChecks": true, 24 | "target": "es2016", 25 | "lib": [ 26 | "es2017" 27 | ], 28 | "baseUrl": "", 29 | "typeRoots": [ 30 | "./node_modules/@types" 31 | ], 32 | "types": [ 33 | "node" 34 | ], 35 | }, 36 | "bazelOptions": { 37 | "suppressTsconfigOverrideWarnings": true 38 | }, 39 | "exclude": [ 40 | "bazel-*/**/*", 41 | "dist/**/*", 42 | "node_modules/**/*", 43 | "packages/_/devkit/**/*files/**/*", 44 | "packages/schematics/*/*/*files/**/*", 45 | "tmp/**/*", 46 | "scripts/patches/**/*", 47 | "tests/**/*" 48 | ] 49 | } 50 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # ngx-cypress-builder 2 | 3 | Run Cypress from the Angular CLI for your E2E tests. 4 | 5 | ## Credits 6 | 7 | Big thanks to [Manfred Steyer](https://twitter.com/ManfredSteyer) for showing this was possible with [ngx-build-plus](https://github.com/manfredsteyer/ngx-build-plus) 8 | 9 | ## Tested with CLI 6.1.x 10 | 11 | This package has been created and tested with Angular CLI 6.1.x. If the CLI's underlying API changes in future, I'll provide an respective update for this version too until the CLI has build-in features for the covered use cases. 12 | 13 | ## Example 14 | 15 | https://github.com/isaacplmann/ngx-cypress-builder/sample 16 | 17 | ## Usage 18 | 19 | The next steps guides you trough getting started with `ngx-cypress-builder`. The result of this description can be found in the [repository's](https://github.com/isaacplmann/ngx-cypress-builder/sample) `sample` directory. 20 | 21 | 1. Create a new Angular CLI based project: 22 | 23 | ``` 24 | ng new my-sample-app 25 | ``` 26 | 27 | 2. Install cypress and ngx-cypress-builder: 28 | 29 | ``` 30 | npm i -D cypress ngx-cypress-builder 31 | ``` 32 | 33 | 3. Open your `angular.json` and tell the CLI to use `ngx-cypress-builder` instead of protractor: 34 | 35 | ``` 36 | [...] 37 | "my-sample-app-e2e": { 38 | "root": "cypress/", 39 | "projectType": "application", 40 | "architect": { 41 | "e2e": { 42 | "builder": "ngx-cypress-builder:cypress", 43 | "options": { 44 | "devServerTarget": "my-sample-app:serve" 45 | }, 46 | "configurations": { 47 | "production": { 48 | "devServerTarget": "my-sample-app:serve:production" 49 | } 50 | } 51 | } 52 | } 53 | } 54 | [...] 55 | ``` 56 | 57 | 4. Create a default Cypress setup 58 | 59 | ``` 60 | npx cypress open 61 | ``` 62 | 63 | 5. Close the Cypress application 64 | 65 | 6. Run the sample Cypress tests through the angular cli 66 | 67 | ```bash 68 | npm run e2e 69 | # or 70 | ng e2e 71 | ``` 72 | 73 | This will serve your application, run the Cypress tests and exit. 74 | 75 | ## devServerTarget in angular.json 76 | 77 | If you do not specify a `devServerTarget` in the `angular.json` file, the cli will skip that step and just run Cypress. 78 | -------------------------------------------------------------------------------- /sample/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /sample/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | 8 | # dependencies 9 | /node_modules 10 | 11 | # IDEs and editors 12 | /.idea 13 | .project 14 | .classpath 15 | .c9/ 16 | *.launch 17 | .settings/ 18 | *.sublime-workspace 19 | 20 | # IDE - VSCode 21 | .vscode/* 22 | !.vscode/settings.json 23 | !.vscode/tasks.json 24 | !.vscode/launch.json 25 | !.vscode/extensions.json 26 | 27 | # misc 28 | /.sass-cache 29 | /connect.lock 30 | /coverage 31 | /libpeerconnection.log 32 | npm-debug.log 33 | yarn-error.log 34 | testem.log 35 | /typings 36 | 37 | # System Files 38 | .DS_Store 39 | Thumbs.db 40 | 41 | # cypress 42 | /cypress/videos 43 | /cypress/screenshots 44 | -------------------------------------------------------------------------------- /sample/README.md: -------------------------------------------------------------------------------- 1 | # Sample 2 | 3 | This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.1.2. 4 | 5 | ## Development server 6 | 7 | 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. 8 | 9 | ## Code scaffolding 10 | 11 | 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`. 12 | 13 | ## Build 14 | 15 | 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. 16 | 17 | ## Running unit tests 18 | 19 | Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). 20 | 21 | ## Running end-to-end tests 22 | 23 | Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). 24 | 25 | ## Further help 26 | 27 | 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). 28 | -------------------------------------------------------------------------------- /sample/angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "version": 1, 4 | "newProjectRoot": "projects", 5 | "projects": { 6 | "sample": { 7 | "root": "projects/sample/", 8 | "sourceRoot": "projects/sample/src", 9 | "projectType": "application", 10 | "prefix": "app", 11 | "schematics": {}, 12 | "architect": { 13 | "build": { 14 | "builder": "@angular-devkit/build-angular:browser", 15 | "options": { 16 | "outputPath": "dist/sample", 17 | "index": "projects/sample/src/index.html", 18 | "main": "projects/sample/src/main.ts", 19 | "polyfills": "projects/sample/src/polyfills.ts", 20 | "tsConfig": "projects/sample/tsconfig.app.json", 21 | "assets": [ 22 | "projects/sample/src/favicon.ico", 23 | "projects/sample/src/assets" 24 | ], 25 | "styles": [ 26 | "projects/sample/src/styles.css" 27 | ], 28 | "scripts": [] 29 | }, 30 | "configurations": { 31 | "production": { 32 | "fileReplacements": [ 33 | { 34 | "replace": "projects/sample/src/environments/environment.ts", 35 | "with": "projects/sample/src/environments/environment.prod.ts" 36 | } 37 | ], 38 | "optimization": true, 39 | "outputHashing": "all", 40 | "sourceMap": false, 41 | "extractCss": true, 42 | "namedChunks": false, 43 | "aot": true, 44 | "extractLicenses": true, 45 | "vendorChunk": false, 46 | "buildOptimizer": true 47 | } 48 | } 49 | }, 50 | "serve": { 51 | "builder": "@angular-devkit/build-angular:dev-server", 52 | "options": { 53 | "browserTarget": "sample:build" 54 | }, 55 | "configurations": { 56 | "production": { 57 | "browserTarget": "sample:build:production" 58 | } 59 | } 60 | }, 61 | "extract-i18n": { 62 | "builder": "@angular-devkit/build-angular:extract-i18n", 63 | "options": { 64 | "browserTarget": "sample:build" 65 | } 66 | }, 67 | "test": { 68 | "builder": "@angular-devkit/build-angular:karma", 69 | "options": { 70 | "main": "projects/sample/src/test.ts", 71 | "polyfills": "projects/sample/src/polyfills.ts", 72 | "tsConfig": "projects/sample/tsconfig.spec.json", 73 | "karmaConfig": "projects/sample/karma.conf.js", 74 | "styles": [ 75 | "projects/sample/src/styles.css" 76 | ], 77 | "scripts": [], 78 | "assets": [ 79 | "projects/sample/src/favicon.ico", 80 | "projects/sample/src/assets" 81 | ] 82 | } 83 | }, 84 | "lint": { 85 | "builder": "@angular-devkit/build-angular:tslint", 86 | "options": { 87 | "tsConfig": [ 88 | "projects/sample/tsconfig.app.json", 89 | "projects/sample/tsconfig.spec.json" 90 | ], 91 | "exclude": [ 92 | "**/node_modules/**" 93 | ] 94 | } 95 | } 96 | } 97 | }, 98 | "sample-e2e": { 99 | "root": "./", 100 | "projectType": "application", 101 | "architect": { 102 | "e2e": { 103 | "builder": "ngx-cypress-builder:cypress", 104 | "options": { 105 | "devServerTarget": "sample:serve", 106 | "mode": "browser" 107 | }, 108 | "configurations": { 109 | "production": { 110 | "devServerTarget": "sample:serve:production" 111 | } 112 | } 113 | } 114 | } 115 | }, 116 | "sample-e2e-in-projects": { 117 | "root": "projects/sample-e2e-in-projects/", 118 | "projectType": "application", 119 | "architect": { 120 | "e2e": { 121 | "builder": "ngx-cypress-builder:cypress", 122 | "options": { 123 | "devServerTarget": "sample:serve", 124 | "mode": "browser" 125 | }, 126 | "configurations": { 127 | "production": { 128 | "devServerTarget": "sample:serve:production" 129 | } 130 | } 131 | } 132 | } 133 | }, 134 | "sample-e2e-in-projects-run": { 135 | "root": "projects/sample-e2e-in-projects/", 136 | "projectType": "application", 137 | "architect": { 138 | "e2e": { 139 | "builder": "ngx-cypress-builder:cypress", 140 | "options": { 141 | "devServerTarget": "sample:serve" 142 | }, 143 | "configurations": { 144 | "production": { 145 | "devServerTarget": "sample:serve:production" 146 | } 147 | } 148 | } 149 | } 150 | } 151 | }, 152 | "defaultProject": "sample" 153 | } 154 | -------------------------------------------------------------------------------- /sample/cypress.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /sample/cypress/cypress.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /sample/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } -------------------------------------------------------------------------------- /sample/cypress/integration/simple_spec.js: -------------------------------------------------------------------------------- 1 | describe('Cypress basic test', function() { 2 | it('Visits the app', function() { 3 | cy.visit('/'); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /sample/cypress/plugins/index.js: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example plugins/index.js can be used to load plugins 3 | // 4 | // You can change the location of this file or turn off loading 5 | // the plugins file with the 'pluginsFile' configuration option. 6 | // 7 | // You can read more here: 8 | // https://on.cypress.io/plugins-guide 9 | // *********************************************************** 10 | 11 | // This function is called when a project is opened or re-opened (e.g. due to 12 | // the project's config changing) 13 | 14 | module.exports = (on, config) => { 15 | // `on` is used to hook into various events Cypress emits 16 | // `config` is the resolved Cypress config 17 | } 18 | -------------------------------------------------------------------------------- /sample/cypress/support/commands.js: -------------------------------------------------------------------------------- 1 | // *********************************************** 2 | // This example commands.js shows you how to 3 | // create various custom commands and overwrite 4 | // existing commands. 5 | // 6 | // For more comprehensive examples of custom 7 | // commands please read more here: 8 | // https://on.cypress.io/custom-commands 9 | // *********************************************** 10 | // 11 | // 12 | // -- This is a parent command -- 13 | // Cypress.Commands.add("login", (email, password) => { ... }) 14 | // 15 | // 16 | // -- This is a child command -- 17 | // Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) 18 | // 19 | // 20 | // -- This is a dual command -- 21 | // Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) 22 | // 23 | // 24 | // -- This is will overwrite an existing command -- 25 | // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) 26 | -------------------------------------------------------------------------------- /sample/cypress/support/index.js: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/index.js is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // Import commands.js using ES2015 syntax: 17 | import './commands' 18 | 19 | // Alternatively you can use CommonJS syntax: 20 | // require('./commands') 21 | -------------------------------------------------------------------------------- /sample/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sample", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "ng": "ng", 6 | "start": "ng serve", 7 | "build": "ng build", 8 | "test": "ng test", 9 | "lint": "ng lint", 10 | "e2e": "ng e2e" 11 | }, 12 | "private": true, 13 | "dependencies": { 14 | "@angular/animations": "^6.1.0", 15 | "@angular/common": "^6.1.0", 16 | "@angular/compiler": "^6.1.0", 17 | "@angular/core": "^6.1.0", 18 | "@angular/forms": "^6.1.0", 19 | "@angular/http": "^6.1.0", 20 | "@angular/platform-browser": "^6.1.0", 21 | "@angular/platform-browser-dynamic": "^6.1.0", 22 | "@angular/router": "^6.1.0", 23 | "core-js": "^2.5.4", 24 | "rxjs": "^6.0.0", 25 | "zone.js": "~0.8.26" 26 | }, 27 | "devDependencies": { 28 | "@angular-devkit/build-angular": "~0.7.0", 29 | "@angular/cli": "~6.1.2", 30 | "@angular/compiler-cli": "^6.1.0", 31 | "@angular/language-service": "^6.1.0", 32 | "@types/jasmine": "~2.8.6", 33 | "@types/jasminewd2": "~2.0.3", 34 | "@types/node": "~8.9.4", 35 | "codelyzer": "~4.2.1", 36 | "cypress": "^3.1.0", 37 | "jasmine-core": "~2.99.1", 38 | "jasmine-spec-reporter": "~4.2.1", 39 | "karma": "~1.7.1", 40 | "karma-chrome-launcher": "~2.2.0", 41 | "karma-coverage-istanbul-reporter": "~2.0.0", 42 | "karma-jasmine": "~1.1.1", 43 | "karma-jasmine-html-reporter": "^0.2.2", 44 | "ts-node": "~5.0.1", 45 | "tslint": "~5.9.1", 46 | "typescript": "~2.7.2" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /sample/projects/sample-e2e-in-projects/cypress.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /sample/projects/sample-e2e-in-projects/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } -------------------------------------------------------------------------------- /sample/projects/sample-e2e-in-projects/cypress/integration/simple_spec.js: -------------------------------------------------------------------------------- 1 | describe('Cypress basic test', function() { 2 | it('Visits the app', function() { 3 | cy.visit('/'); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /sample/projects/sample-e2e-in-projects/cypress/plugins/index.js: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example plugins/index.js can be used to load plugins 3 | // 4 | // You can change the location of this file or turn off loading 5 | // the plugins file with the 'pluginsFile' configuration option. 6 | // 7 | // You can read more here: 8 | // https://on.cypress.io/plugins-guide 9 | // *********************************************************** 10 | 11 | // This function is called when a project is opened or re-opened (e.g. due to 12 | // the project's config changing) 13 | 14 | module.exports = (on, config) => { 15 | // `on` is used to hook into various events Cypress emits 16 | // `config` is the resolved Cypress config 17 | } 18 | -------------------------------------------------------------------------------- /sample/projects/sample-e2e-in-projects/cypress/support/commands.js: -------------------------------------------------------------------------------- 1 | // *********************************************** 2 | // This example commands.js shows you how to 3 | // create various custom commands and overwrite 4 | // existing commands. 5 | // 6 | // For more comprehensive examples of custom 7 | // commands please read more here: 8 | // https://on.cypress.io/custom-commands 9 | // *********************************************** 10 | // 11 | // 12 | // -- This is a parent command -- 13 | // Cypress.Commands.add("login", (email, password) => { ... }) 14 | // 15 | // 16 | // -- This is a child command -- 17 | // Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) 18 | // 19 | // 20 | // -- This is a dual command -- 21 | // Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) 22 | // 23 | // 24 | // -- This is will overwrite an existing command -- 25 | // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) 26 | -------------------------------------------------------------------------------- /sample/projects/sample-e2e-in-projects/cypress/support/index.js: -------------------------------------------------------------------------------- 1 | // *********************************************************** 2 | // This example support/index.js is processed and 3 | // loaded automatically before your test files. 4 | // 5 | // This is a great place to put global configuration and 6 | // behavior that modifies Cypress. 7 | // 8 | // You can change the location of this file or turn off 9 | // automatically serving support files with the 10 | // 'supportFile' configuration option. 11 | // 12 | // You can read more here: 13 | // https://on.cypress.io/configuration 14 | // *********************************************************** 15 | 16 | // Import commands.js using ES2015 syntax: 17 | import './commands' 18 | 19 | // Alternatively you can use CommonJS syntax: 20 | // require('./commands') 21 | -------------------------------------------------------------------------------- /sample/projects/sample/browserslist: -------------------------------------------------------------------------------- 1 | # This file is currently used by autoprefixer to adjust CSS to support the below specified browsers 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | # For IE 9-11 support, please uncomment the last line of the file and adjust as needed 5 | > 0.5% 6 | last 2 versions 7 | Firefox ESR 8 | not dead 9 | # IE 9-11 -------------------------------------------------------------------------------- /sample/projects/sample/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage-istanbul-reporter'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client: { 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | coverageIstanbulReporter: { 19 | dir: require('path').join(__dirname, '../../coverage'), 20 | reports: ['html', 'lcovonly'], 21 | fixWebpackSourcePaths: true 22 | }, 23 | reporters: ['progress', 'kjhtml'], 24 | port: 9876, 25 | colors: true, 26 | logLevel: config.LOG_INFO, 27 | autoWatch: true, 28 | browsers: ['Chrome'], 29 | singleRun: false 30 | }); 31 | }; -------------------------------------------------------------------------------- /sample/projects/sample/src/app/app.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isaacplmann/ngx-cypress-builder/1e8b132732fabb202c1a722833ecba81d038612c/sample/projects/sample/src/app/app.component.css -------------------------------------------------------------------------------- /sample/projects/sample/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

4 | Welcome to {{ title }}! 5 |

6 | Angular Logo 7 |
8 |

Here are some links to help you start:

9 | 20 | 21 | -------------------------------------------------------------------------------- /sample/projects/sample/src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, async } from '@angular/core/testing'; 2 | import { AppComponent } from './app.component'; 3 | describe('AppComponent', () => { 4 | beforeEach(async(() => { 5 | TestBed.configureTestingModule({ 6 | declarations: [ 7 | AppComponent 8 | ], 9 | }).compileComponents(); 10 | })); 11 | it('should create the app', async(() => { 12 | const fixture = TestBed.createComponent(AppComponent); 13 | const app = fixture.debugElement.componentInstance; 14 | expect(app).toBeTruthy(); 15 | })); 16 | it(`should have as title 'sample-x'`, async(() => { 17 | const fixture = TestBed.createComponent(AppComponent); 18 | const app = fixture.debugElement.componentInstance; 19 | expect(app.title).toEqual('sample-x'); 20 | })); 21 | it('should render title in a h1 tag', async(() => { 22 | const fixture = TestBed.createComponent(AppComponent); 23 | fixture.detectChanges(); 24 | const compiled = fixture.debugElement.nativeElement; 25 | expect(compiled.querySelector('h1').textContent).toContain('Welcome to sample-x!'); 26 | })); 27 | }); 28 | -------------------------------------------------------------------------------- /sample/projects/sample/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-root', 5 | templateUrl: './app.component.html', 6 | styleUrls: ['./app.component.css'] 7 | }) 8 | export class AppComponent { 9 | title = 'sample-x'; 10 | } 11 | -------------------------------------------------------------------------------- /sample/projects/sample/src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from '@angular/platform-browser'; 2 | import { NgModule } from '@angular/core'; 3 | 4 | import { AppComponent } from './app.component'; 5 | 6 | @NgModule({ 7 | declarations: [ 8 | AppComponent 9 | ], 10 | imports: [ 11 | BrowserModule 12 | ], 13 | providers: [], 14 | bootstrap: [AppComponent] 15 | }) 16 | export class AppModule { } 17 | -------------------------------------------------------------------------------- /sample/projects/sample/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isaacplmann/ngx-cypress-builder/1e8b132732fabb202c1a722833ecba81d038612c/sample/projects/sample/src/assets/.gitkeep -------------------------------------------------------------------------------- /sample/projects/sample/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /sample/projects/sample/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false 7 | }; 8 | 9 | /* 10 | * In development mode, for easier debugging, you can ignore zone related error 11 | * stack frames such as `zone.run`/`zoneDelegate.invokeTask` by importing the 12 | * below file. Don't forget to comment it out in production mode 13 | * because it will have a performance impact when errors are thrown 14 | */ 15 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI. 16 | -------------------------------------------------------------------------------- /sample/projects/sample/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isaacplmann/ngx-cypress-builder/1e8b132732fabb202c1a722833ecba81d038612c/sample/projects/sample/src/favicon.ico -------------------------------------------------------------------------------- /sample/projects/sample/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SampleX 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /sample/projects/sample/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.log(err)); 13 | -------------------------------------------------------------------------------- /sample/projects/sample/src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), 12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** IE9, IE10 and IE11 requires all of the following polyfills. **/ 22 | // import 'core-js/es6/symbol'; 23 | // import 'core-js/es6/object'; 24 | // import 'core-js/es6/function'; 25 | // import 'core-js/es6/parse-int'; 26 | // import 'core-js/es6/parse-float'; 27 | // import 'core-js/es6/number'; 28 | // import 'core-js/es6/math'; 29 | // import 'core-js/es6/string'; 30 | // import 'core-js/es6/date'; 31 | // import 'core-js/es6/array'; 32 | // import 'core-js/es6/regexp'; 33 | // import 'core-js/es6/map'; 34 | // import 'core-js/es6/weak-map'; 35 | // import 'core-js/es6/set'; 36 | 37 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */ 38 | // import 'classlist.js'; // Run `npm install --save classlist.js`. 39 | 40 | /** IE10 and IE11 requires the following for the Reflect API. */ 41 | // import 'core-js/es6/reflect'; 42 | 43 | 44 | /** Evergreen browsers require these. **/ 45 | // Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. 46 | import 'core-js/es7/reflect'; 47 | 48 | 49 | /** 50 | * Web Animations `@angular/platform-browser/animations` 51 | * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. 52 | * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). 53 | **/ 54 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 55 | 56 | /** 57 | * By default, zone.js will patch all possible macroTask and DomEvents 58 | * user can disable parts of macroTask/DomEvents patch by setting following flags 59 | */ 60 | 61 | // (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame 62 | // (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick 63 | // (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames 64 | 65 | /* 66 | * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js 67 | * with the following flag, it will bypass `zone.js` patch for IE/Edge 68 | */ 69 | // (window as any).__Zone_enable_cross_context_check = true; 70 | 71 | /*************************************************************************************************** 72 | * Zone JS is required by default for Angular itself. 73 | */ 74 | import 'zone.js/dist/zone'; // Included with Angular CLI. 75 | 76 | 77 | 78 | /*************************************************************************************************** 79 | * APPLICATION IMPORTS 80 | */ 81 | -------------------------------------------------------------------------------- /sample/projects/sample/src/styles.css: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /sample/projects/sample/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone-testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | declare const require: any; 11 | 12 | // First, initialize the Angular testing environment. 13 | getTestBed().initTestEnvironment( 14 | BrowserDynamicTestingModule, 15 | platformBrowserDynamicTesting() 16 | ); 17 | // Then we find all the tests. 18 | const context = require.context('./', true, /\.spec\.ts$/); 19 | // And load the modules. 20 | context.keys().map(context); 21 | -------------------------------------------------------------------------------- /sample/projects/sample/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../out-tsc/app", 5 | "types": [] 6 | }, 7 | "exclude": [ 8 | "src/test.ts", 9 | "**/*.spec.ts" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /sample/projects/sample/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../out-tsc/spec", 5 | "types": [ 6 | "jasmine", 7 | "node" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | "src/polyfills.ts" 13 | ], 14 | "include": [ 15 | "**/*.spec.ts", 16 | "**/*.d.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /sample/projects/sample/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tslint.json", 3 | "rules": { 4 | "directive-selector": [ 5 | true, 6 | "attribute", 7 | "app", 8 | "camelCase" 9 | ], 10 | "component-selector": [ 11 | true, 12 | "element", 13 | "app", 14 | "kebab-case" 15 | ] 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /sample/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "baseUrl": "./", 5 | "outDir": "./dist/out-tsc", 6 | "sourceMap": true, 7 | "declaration": false, 8 | "module": "es2015", 9 | "moduleResolution": "node", 10 | "emitDecoratorMetadata": true, 11 | "experimentalDecorators": true, 12 | "target": "es5", 13 | "typeRoots": [ 14 | "node_modules/@types" 15 | ], 16 | "lib": [ 17 | "es2017", 18 | "dom" 19 | ] 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /sample/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": [ 3 | "node_modules/codelyzer" 4 | ], 5 | "rules": { 6 | "arrow-return-shorthand": true, 7 | "callable-types": true, 8 | "class-name": true, 9 | "comment-format": [ 10 | true, 11 | "check-space" 12 | ], 13 | "curly": true, 14 | "deprecation": { 15 | "severity": "warn" 16 | }, 17 | "eofline": true, 18 | "forin": true, 19 | "import-blacklist": [ 20 | true, 21 | "rxjs/Rx" 22 | ], 23 | "import-spacing": true, 24 | "indent": [ 25 | true, 26 | "spaces" 27 | ], 28 | "interface-over-type-literal": true, 29 | "label-position": true, 30 | "max-line-length": [ 31 | true, 32 | 140 33 | ], 34 | "member-access": false, 35 | "member-ordering": [ 36 | true, 37 | { 38 | "order": [ 39 | "static-field", 40 | "instance-field", 41 | "static-method", 42 | "instance-method" 43 | ] 44 | } 45 | ], 46 | "no-arg": true, 47 | "no-bitwise": true, 48 | "no-console": [ 49 | true, 50 | "debug", 51 | "info", 52 | "time", 53 | "timeEnd", 54 | "trace" 55 | ], 56 | "no-construct": true, 57 | "no-debugger": true, 58 | "no-duplicate-super": true, 59 | "no-empty": false, 60 | "no-empty-interface": true, 61 | "no-eval": true, 62 | "no-inferrable-types": [ 63 | true, 64 | "ignore-params" 65 | ], 66 | "no-misused-new": true, 67 | "no-non-null-assertion": true, 68 | "no-shadowed-variable": true, 69 | "no-string-literal": false, 70 | "no-string-throw": true, 71 | "no-switch-case-fall-through": true, 72 | "no-trailing-whitespace": true, 73 | "no-unnecessary-initializer": true, 74 | "no-unused-expression": true, 75 | "no-use-before-declare": true, 76 | "no-var-keyword": true, 77 | "object-literal-sort-keys": false, 78 | "one-line": [ 79 | true, 80 | "check-open-brace", 81 | "check-catch", 82 | "check-else", 83 | "check-whitespace" 84 | ], 85 | "prefer-const": true, 86 | "quotemark": [ 87 | true, 88 | "single" 89 | ], 90 | "radix": true, 91 | "semicolon": [ 92 | true, 93 | "always" 94 | ], 95 | "triple-equals": [ 96 | true, 97 | "allow-null-check" 98 | ], 99 | "typedef-whitespace": [ 100 | true, 101 | { 102 | "call-signature": "nospace", 103 | "index-signature": "nospace", 104 | "parameter": "nospace", 105 | "property-declaration": "nospace", 106 | "variable-declaration": "nospace" 107 | } 108 | ], 109 | "unified-signatures": true, 110 | "variable-name": false, 111 | "whitespace": [ 112 | true, 113 | "check-branch", 114 | "check-decl", 115 | "check-operator", 116 | "check-separator", 117 | "check-type" 118 | ], 119 | "no-output-on-prefix": true, 120 | "use-input-property-decorator": true, 121 | "use-output-property-decorator": true, 122 | "use-host-property-decorator": true, 123 | "no-input-rename": true, 124 | "no-output-rename": true, 125 | "use-life-cycle-interface": true, 126 | "use-pipe-transform-interface": true, 127 | "component-class-suffix": true, 128 | "directive-class-suffix": true 129 | } 130 | } 131 | --------------------------------------------------------------------------------