├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── builders.json ├── package-lock.json ├── package.json ├── src └── command │ ├── schema.json │ ├── test.spec.ts │ └── test.ts ├── tsconfig.json └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | .npmrc 4 | **/*.log 5 | dist 6 | lib/ 7 | .DS_Store 8 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 1.1.1:q!:q: 2 | Bump dependencies due to security issues 3 | 4 | # 1.1.0 5 | Bumping angular devkit to support angular 14 6 | 7 | # 1.0.2 8 | Bump dependencies due to security issues 9 | 10 | # 1.0.1 11 | Bump dependencies due to security issues 12 | 13 | # 1.0.0 14 | Initial version -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Miguel Angel Alonso Perez 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # angular-wdio-builder 2 | 3 | Angular builder for running e2e test using webdriver.io runner. 4 | 5 | Enables include wdio laucher into angular workspace (angular.json). Replaces protractor as e2e test framework. 6 | 7 | ## Peer dependencies 8 | 9 | - _@wdio/cli_ 10 | 11 | wdio client is not installed. You must install this package by yourself, among other related packages (@wdio/sinc, services, plugins, etc.) 12 | 13 | ## Requirements 14 | 15 | - @angular/cli >= @8.0.0 16 | 17 | ## Usage 18 | 19 | ### Install 20 | 21 | npm install @migalons/angular-wdio-builder --save-dev 22 | 23 | ### Angular workspace 24 | 25 | For enabling your e2e test using angular builders, you just need to use this builder for running your e2e test: 26 | 27 | ``` 28 | { 29 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 30 | "version": 1, 31 | "newProjectRoot": "projects", 32 | "projects": { 33 | "my-awesome-project": { 34 | ... 35 | "architect": { 36 | ... 37 | "e2e": { 38 | "builder": "@migalons/angular-wdio-builder:test", 39 | "options": { 40 | "wdioConfig": "e2e/wdio.conf.js", 41 | "devServerTarget": "my-awesome-project:serve" 42 | }, 43 | "configurations": { 44 | "production": { 45 | "wdioConfig": "e2e/wdio-prod.conf.js", 46 | "devServerTarget": "my-awesome-project:serve:production" 47 | }, 48 | "dev": { 49 | "wdioOptions": { 50 | "port": 4567 // whatever options accepted by wdio cli 51 | } 52 | "devServerTarget": "my-awesome-project:serve:production", 53 | "port": 4201, 54 | "host": "0.0.0.0", 55 | "disableHostCheck: true" 56 | } 57 | } 58 | } 59 | } 60 | } 61 | ... 62 | } 63 | ``` 64 | 65 | This builders, accepts three parameters: 66 | 67 | - wdioConfig: URL for wdio cli configuration (defaults to "./e2e/wdio.conf.js). 68 | - wdioOptons: Custom options for overriding provided configuration (wdioConfig). See [wdio cli options](https://webdriver.io/docs/clioptions.html) for more information. 69 | - devServerTarget: Project target and configuration to be scheduled before running e2e test (i.e. serve app). 70 | - port: Serve angular application using a custom port 71 | - host: Host to listen on 72 | - disableHostCheck: Don't verify connected clients are part of allowed hosts. 73 | 74 | ## Example 75 | 76 | You can find an example of a project with angular application with e2e test implemented using this builder for include wdio test into angular workspace here: 77 | 78 | https://github.com/migalons/angular-wdio-builder-demo 79 | -------------------------------------------------------------------------------- /builders.json: -------------------------------------------------------------------------------- 1 | { 2 | "builders": { 3 | "test": { 4 | "implementation": "./lib/test.js", 5 | "schema": "./lib/schema.json", 6 | "description": "Runs functional test using webdriver.io runner." 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@migalons/angular-wdio-builder", 3 | "version": "1.1.1", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@migalons/angular-wdio-builder", 9 | "version": "1.1.1", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@angular-devkit/architect": "^0.1402.7", 13 | "@angular-devkit/core": "^14.2.7" 14 | }, 15 | "devDependencies": { 16 | "@types/jasmine": "^3.5.9", 17 | "@types/node": "^13.9.0", 18 | "jasmine": "^3.5.0", 19 | "jasmine-node": "^1.16.0", 20 | "ts-node": "^8.6.2", 21 | "tslint": "^6.1.0", 22 | "typescript": "^4.8.4" 23 | } 24 | }, 25 | "node_modules/@angular-devkit/architect": { 26 | "version": "0.1402.8", 27 | "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.8.tgz", 28 | "integrity": "sha512-z3HXPBi3h3y+D04NNA/5lVaUCMF+dkE/75bCqg4DG3FqV0i0dh4hozjKtWgX6xuoJ8AJlDfrJSaBCvjsog+Jhg==", 29 | "dependencies": { 30 | "@angular-devkit/core": "14.2.8", 31 | "rxjs": "6.6.7" 32 | }, 33 | "engines": { 34 | "node": "^14.15.0 || >=16.10.0", 35 | "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", 36 | "yarn": ">= 1.13.0" 37 | } 38 | }, 39 | "node_modules/@angular-devkit/core": { 40 | "version": "14.2.8", 41 | "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.8.tgz", 42 | "integrity": "sha512-30nDq2PH91X7T42xXFBlTiXTBG143z0BL8IUgpVCxTFYwxgPbtV4bcXTkiBgh1FL/usZcHa0Bd/64wxmFOpYwA==", 43 | "dependencies": { 44 | "ajv": "8.11.0", 45 | "ajv-formats": "2.1.1", 46 | "jsonc-parser": "3.1.0", 47 | "rxjs": "6.6.7", 48 | "source-map": "0.7.4" 49 | }, 50 | "engines": { 51 | "node": "^14.15.0 || >=16.10.0", 52 | "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", 53 | "yarn": ">= 1.13.0" 54 | }, 55 | "peerDependencies": { 56 | "chokidar": "^3.5.2" 57 | }, 58 | "peerDependenciesMeta": { 59 | "chokidar": { 60 | "optional": true 61 | } 62 | } 63 | }, 64 | "node_modules/@babel/code-frame": { 65 | "version": "7.8.3", 66 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 67 | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 68 | "dev": true, 69 | "dependencies": { 70 | "@babel/highlight": "^7.8.3" 71 | } 72 | }, 73 | "node_modules/@babel/highlight": { 74 | "version": "7.8.3", 75 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", 76 | "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", 77 | "dev": true, 78 | "dependencies": { 79 | "chalk": "^2.0.0", 80 | "esutils": "^2.0.2", 81 | "js-tokens": "^4.0.0" 82 | } 83 | }, 84 | "node_modules/@types/jasmine": { 85 | "version": "3.5.9", 86 | "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.9.tgz", 87 | "integrity": "sha512-KNL2Fq6GRmty2j6+ZmueT/Z/dkctLNH+5DFoGHNDtcgt7yME9NZd8x2p81Yuea1Xux/qAryDd3zVLUoKpDz1TA==", 88 | "dev": true 89 | }, 90 | "node_modules/@types/node": { 91 | "version": "13.9.1", 92 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.1.tgz", 93 | "integrity": "sha512-E6M6N0blf/jiZx8Q3nb0vNaswQeEyn0XlupO+xN6DtJ6r6IT4nXrTry7zhIfYvFCl3/8Cu6WIysmUBKiqV0bqQ==", 94 | "dev": true 95 | }, 96 | "node_modules/ajv": { 97 | "version": "8.11.0", 98 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", 99 | "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", 100 | "dependencies": { 101 | "fast-deep-equal": "^3.1.1", 102 | "json-schema-traverse": "^1.0.0", 103 | "require-from-string": "^2.0.2", 104 | "uri-js": "^4.2.2" 105 | }, 106 | "funding": { 107 | "type": "github", 108 | "url": "https://github.com/sponsors/epoberezkin" 109 | } 110 | }, 111 | "node_modules/ajv-formats": { 112 | "version": "2.1.1", 113 | "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", 114 | "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", 115 | "dependencies": { 116 | "ajv": "^8.0.0" 117 | }, 118 | "peerDependencies": { 119 | "ajv": "^8.0.0" 120 | }, 121 | "peerDependenciesMeta": { 122 | "ajv": { 123 | "optional": true 124 | } 125 | } 126 | }, 127 | "node_modules/ansi-styles": { 128 | "version": "3.2.1", 129 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 130 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 131 | "dev": true, 132 | "dependencies": { 133 | "color-convert": "^1.9.0" 134 | }, 135 | "engines": { 136 | "node": ">=4" 137 | } 138 | }, 139 | "node_modules/arg": { 140 | "version": "4.1.3", 141 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 142 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 143 | "dev": true 144 | }, 145 | "node_modules/argparse": { 146 | "version": "1.0.10", 147 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 148 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 149 | "dev": true, 150 | "dependencies": { 151 | "sprintf-js": "~1.0.2" 152 | } 153 | }, 154 | "node_modules/balanced-match": { 155 | "version": "1.0.0", 156 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 157 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 158 | "dev": true 159 | }, 160 | "node_modules/brace-expansion": { 161 | "version": "1.1.11", 162 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 163 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 164 | "dev": true, 165 | "dependencies": { 166 | "balanced-match": "^1.0.0", 167 | "concat-map": "0.0.1" 168 | } 169 | }, 170 | "node_modules/buffer-from": { 171 | "version": "1.1.1", 172 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 173 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 174 | "dev": true 175 | }, 176 | "node_modules/builtin-modules": { 177 | "version": "1.1.1", 178 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 179 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 180 | "dev": true, 181 | "engines": { 182 | "node": ">=0.10.0" 183 | } 184 | }, 185 | "node_modules/chalk": { 186 | "version": "2.4.2", 187 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 188 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 189 | "dev": true, 190 | "dependencies": { 191 | "ansi-styles": "^3.2.1", 192 | "escape-string-regexp": "^1.0.5", 193 | "supports-color": "^5.3.0" 194 | }, 195 | "engines": { 196 | "node": ">=4" 197 | } 198 | }, 199 | "node_modules/coffeescript": { 200 | "version": "1.12.7", 201 | "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", 202 | "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==", 203 | "dev": true, 204 | "bin": { 205 | "cake": "bin/cake", 206 | "coffee": "bin/coffee" 207 | }, 208 | "engines": { 209 | "node": ">=0.8.0" 210 | } 211 | }, 212 | "node_modules/color-convert": { 213 | "version": "1.9.3", 214 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 215 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 216 | "dev": true, 217 | "dependencies": { 218 | "color-name": "1.1.3" 219 | } 220 | }, 221 | "node_modules/color-name": { 222 | "version": "1.1.3", 223 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 224 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 225 | "dev": true 226 | }, 227 | "node_modules/commander": { 228 | "version": "2.20.3", 229 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 230 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 231 | "dev": true 232 | }, 233 | "node_modules/concat-map": { 234 | "version": "0.0.1", 235 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 236 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 237 | "dev": true 238 | }, 239 | "node_modules/diff": { 240 | "version": "4.0.2", 241 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 242 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 243 | "dev": true, 244 | "engines": { 245 | "node": ">=0.3.1" 246 | } 247 | }, 248 | "node_modules/escape-string-regexp": { 249 | "version": "1.0.5", 250 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 251 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 252 | "dev": true, 253 | "engines": { 254 | "node": ">=0.8.0" 255 | } 256 | }, 257 | "node_modules/esprima": { 258 | "version": "4.0.1", 259 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 260 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 261 | "dev": true, 262 | "bin": { 263 | "esparse": "bin/esparse.js", 264 | "esvalidate": "bin/esvalidate.js" 265 | }, 266 | "engines": { 267 | "node": ">=4" 268 | } 269 | }, 270 | "node_modules/esutils": { 271 | "version": "2.0.3", 272 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 273 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 274 | "dev": true, 275 | "engines": { 276 | "node": ">=0.10.0" 277 | } 278 | }, 279 | "node_modules/fast-deep-equal": { 280 | "version": "3.1.3", 281 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 282 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 283 | }, 284 | "node_modules/fs.realpath": { 285 | "version": "1.0.0", 286 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 287 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 288 | "dev": true 289 | }, 290 | "node_modules/gaze": { 291 | "version": "1.1.3", 292 | "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", 293 | "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", 294 | "dev": true, 295 | "dependencies": { 296 | "globule": "^1.0.0" 297 | }, 298 | "engines": { 299 | "node": ">= 4.0.0" 300 | } 301 | }, 302 | "node_modules/glob": { 303 | "version": "7.1.6", 304 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 305 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 306 | "dev": true, 307 | "dependencies": { 308 | "fs.realpath": "^1.0.0", 309 | "inflight": "^1.0.4", 310 | "inherits": "2", 311 | "minimatch": "^3.0.4", 312 | "once": "^1.3.0", 313 | "path-is-absolute": "^1.0.0" 314 | }, 315 | "engines": { 316 | "node": "*" 317 | }, 318 | "funding": { 319 | "url": "https://github.com/sponsors/isaacs" 320 | } 321 | }, 322 | "node_modules/globule": { 323 | "version": "1.3.1", 324 | "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", 325 | "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", 326 | "dev": true, 327 | "dependencies": { 328 | "glob": "~7.1.1", 329 | "lodash": "~4.17.12", 330 | "minimatch": "~3.0.2" 331 | }, 332 | "engines": { 333 | "node": ">= 0.10" 334 | } 335 | }, 336 | "node_modules/growl": { 337 | "version": "1.10.0", 338 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.0.tgz", 339 | "integrity": "sha512-ElsQbgadAZdhC8L+hx4RJu6fDe5uPCaRjdw8CvD39VYemGQT9CSiLdRAEYFWVIlCbPNlw+G4AbqBhQJF2qyHdg==", 340 | "dev": true 341 | }, 342 | "node_modules/has-flag": { 343 | "version": "3.0.0", 344 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 345 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 346 | "dev": true, 347 | "engines": { 348 | "node": ">=4" 349 | } 350 | }, 351 | "node_modules/inflight": { 352 | "version": "1.0.6", 353 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 354 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 355 | "dev": true, 356 | "dependencies": { 357 | "once": "^1.3.0", 358 | "wrappy": "1" 359 | } 360 | }, 361 | "node_modules/inherits": { 362 | "version": "2.0.4", 363 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 364 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 365 | "dev": true 366 | }, 367 | "node_modules/jasmine": { 368 | "version": "3.5.0", 369 | "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.5.0.tgz", 370 | "integrity": "sha512-DYypSryORqzsGoMazemIHUfMkXM7I7easFaxAvNM3Mr6Xz3Fy36TupTrAOxZWN8MVKEU5xECv22J4tUQf3uBzQ==", 371 | "dev": true, 372 | "dependencies": { 373 | "glob": "^7.1.4", 374 | "jasmine-core": "~3.5.0" 375 | }, 376 | "bin": { 377 | "jasmine": "bin/jasmine.js" 378 | } 379 | }, 380 | "node_modules/jasmine-core": { 381 | "version": "3.5.0", 382 | "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", 383 | "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", 384 | "dev": true 385 | }, 386 | "node_modules/jasmine-growl-reporter": { 387 | "version": "1.0.3", 388 | "resolved": "https://registry.npmjs.org/jasmine-growl-reporter/-/jasmine-growl-reporter-1.0.3.tgz", 389 | "integrity": "sha512-WediiANO4FybZwfvK6a3uzm8O5iOanOcpJfFN4PnOFpf3Lolg0qgGwpwqqwFv2aGVaTWoBYKzSXzXDHYH6Badg==", 390 | "dev": true, 391 | "dependencies": { 392 | "growl": "1.10.0" 393 | } 394 | }, 395 | "node_modules/jasmine-node": { 396 | "version": "1.16.0", 397 | "resolved": "https://registry.npmjs.org/jasmine-node/-/jasmine-node-1.16.0.tgz", 398 | "integrity": "sha512-3bzlFH4dTVq9kzo4Gy8ocAznhYF/nF6wL29JoVJusDOapprq8HFHERK+c4ISyYrCBpERX+Btv5fLUTlR7CM4/w==", 399 | "deprecated": "jasmine-node 1.x & 2.x are deprecated, with known vulnerability in jasmine-growl-reporter pre-2.0.0", 400 | "dev": true, 401 | "dependencies": { 402 | "coffeescript": "^1.0.1", 403 | "gaze": "~1.1.2", 404 | "jasmine-growl-reporter": "~1.0.1", 405 | "jasmine-reporters": "~1.0.0", 406 | "mkdirp": "~0.3.5", 407 | "requirejs": "^2.3.6", 408 | "underscore": "^1.9.1", 409 | "walkdir": "~0.0.12" 410 | }, 411 | "bin": { 412 | "jasmine-node": "bin/jasmine-node" 413 | } 414 | }, 415 | "node_modules/jasmine-reporters": { 416 | "version": "1.0.2", 417 | "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-1.0.2.tgz", 418 | "integrity": "sha1-q2E+1Zd9x0h+hbPBL2qOqNsq3jE=", 419 | "dev": true, 420 | "dependencies": { 421 | "mkdirp": "~0.3.5" 422 | } 423 | }, 424 | "node_modules/js-tokens": { 425 | "version": "4.0.0", 426 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 427 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 428 | "dev": true 429 | }, 430 | "node_modules/js-yaml": { 431 | "version": "3.13.1", 432 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 433 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 434 | "dev": true, 435 | "dependencies": { 436 | "argparse": "^1.0.7", 437 | "esprima": "^4.0.0" 438 | }, 439 | "bin": { 440 | "js-yaml": "bin/js-yaml.js" 441 | } 442 | }, 443 | "node_modules/json-schema-traverse": { 444 | "version": "1.0.0", 445 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 446 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" 447 | }, 448 | "node_modules/jsonc-parser": { 449 | "version": "3.1.0", 450 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", 451 | "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" 452 | }, 453 | "node_modules/lodash": { 454 | "version": "4.17.21", 455 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 456 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 457 | "dev": true 458 | }, 459 | "node_modules/make-error": { 460 | "version": "1.3.6", 461 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 462 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 463 | "dev": true 464 | }, 465 | "node_modules/minimatch": { 466 | "version": "3.0.8", 467 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", 468 | "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", 469 | "dev": true, 470 | "dependencies": { 471 | "brace-expansion": "^1.1.7" 472 | }, 473 | "engines": { 474 | "node": "*" 475 | } 476 | }, 477 | "node_modules/minimist": { 478 | "version": "1.2.6", 479 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 480 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 481 | "dev": true 482 | }, 483 | "node_modules/mkdirp": { 484 | "version": "0.3.5", 485 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", 486 | "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", 487 | "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", 488 | "dev": true 489 | }, 490 | "node_modules/once": { 491 | "version": "1.4.0", 492 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 493 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 494 | "dev": true, 495 | "dependencies": { 496 | "wrappy": "1" 497 | } 498 | }, 499 | "node_modules/path-is-absolute": { 500 | "version": "1.0.1", 501 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 502 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 503 | "dev": true, 504 | "engines": { 505 | "node": ">=0.10.0" 506 | } 507 | }, 508 | "node_modules/path-parse": { 509 | "version": "1.0.7", 510 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 511 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 512 | "dev": true 513 | }, 514 | "node_modules/punycode": { 515 | "version": "2.1.1", 516 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 517 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 518 | "engines": { 519 | "node": ">=6" 520 | } 521 | }, 522 | "node_modules/require-from-string": { 523 | "version": "2.0.2", 524 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 525 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 526 | "engines": { 527 | "node": ">=0.10.0" 528 | } 529 | }, 530 | "node_modules/requirejs": { 531 | "version": "2.3.6", 532 | "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", 533 | "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", 534 | "dev": true, 535 | "bin": { 536 | "r_js": "bin/r.js", 537 | "r.js": "bin/r.js" 538 | }, 539 | "engines": { 540 | "node": ">=0.4.0" 541 | } 542 | }, 543 | "node_modules/resolve": { 544 | "version": "1.15.1", 545 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", 546 | "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", 547 | "dev": true, 548 | "dependencies": { 549 | "path-parse": "^1.0.6" 550 | }, 551 | "funding": { 552 | "url": "https://github.com/sponsors/ljharb" 553 | } 554 | }, 555 | "node_modules/rxjs": { 556 | "version": "6.6.7", 557 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 558 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 559 | "dependencies": { 560 | "tslib": "^1.9.0" 561 | }, 562 | "engines": { 563 | "npm": ">=2.0.0" 564 | } 565 | }, 566 | "node_modules/semver": { 567 | "version": "5.7.1", 568 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 569 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 570 | "dev": true, 571 | "bin": { 572 | "semver": "bin/semver" 573 | } 574 | }, 575 | "node_modules/source-map": { 576 | "version": "0.7.4", 577 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", 578 | "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", 579 | "engines": { 580 | "node": ">= 8" 581 | } 582 | }, 583 | "node_modules/source-map-support": { 584 | "version": "0.5.16", 585 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", 586 | "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", 587 | "dev": true, 588 | "dependencies": { 589 | "buffer-from": "^1.0.0", 590 | "source-map": "^0.6.0" 591 | } 592 | }, 593 | "node_modules/source-map-support/node_modules/source-map": { 594 | "version": "0.6.1", 595 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 596 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 597 | "dev": true, 598 | "engines": { 599 | "node": ">=0.10.0" 600 | } 601 | }, 602 | "node_modules/sprintf-js": { 603 | "version": "1.0.3", 604 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 605 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 606 | "dev": true 607 | }, 608 | "node_modules/supports-color": { 609 | "version": "5.5.0", 610 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 611 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 612 | "dev": true, 613 | "dependencies": { 614 | "has-flag": "^3.0.0" 615 | }, 616 | "engines": { 617 | "node": ">=4" 618 | } 619 | }, 620 | "node_modules/ts-node": { 621 | "version": "8.6.2", 622 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz", 623 | "integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==", 624 | "dev": true, 625 | "dependencies": { 626 | "arg": "^4.1.0", 627 | "diff": "^4.0.1", 628 | "make-error": "^1.1.1", 629 | "source-map-support": "^0.5.6", 630 | "yn": "3.1.1" 631 | }, 632 | "bin": { 633 | "ts-node": "dist/bin.js", 634 | "ts-script": "dist/script.js" 635 | }, 636 | "engines": { 637 | "node": ">=6.0.0" 638 | }, 639 | "peerDependencies": { 640 | "typescript": ">=2.7" 641 | } 642 | }, 643 | "node_modules/tslib": { 644 | "version": "1.11.1", 645 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", 646 | "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" 647 | }, 648 | "node_modules/tslint": { 649 | "version": "6.1.0", 650 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.0.tgz", 651 | "integrity": "sha512-fXjYd/61vU6da04E505OZQGb2VCN2Mq3doeWcOIryuG+eqdmFUXTYVwdhnbEu2k46LNLgUYt9bI5icQze/j0bQ==", 652 | "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", 653 | "dev": true, 654 | "dependencies": { 655 | "@babel/code-frame": "^7.0.0", 656 | "builtin-modules": "^1.1.1", 657 | "chalk": "^2.3.0", 658 | "commander": "^2.12.1", 659 | "diff": "^4.0.1", 660 | "glob": "^7.1.1", 661 | "js-yaml": "^3.13.1", 662 | "minimatch": "^3.0.4", 663 | "mkdirp": "^0.5.1", 664 | "resolve": "^1.3.2", 665 | "semver": "^5.3.0", 666 | "tslib": "^1.10.0", 667 | "tsutils": "^2.29.0" 668 | }, 669 | "bin": { 670 | "tslint": "bin/tslint" 671 | }, 672 | "engines": { 673 | "node": ">=4.8.0" 674 | }, 675 | "peerDependencies": { 676 | "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" 677 | } 678 | }, 679 | "node_modules/tslint/node_modules/mkdirp": { 680 | "version": "0.5.3", 681 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", 682 | "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", 683 | "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", 684 | "dev": true, 685 | "dependencies": { 686 | "minimist": "^1.2.5" 687 | }, 688 | "bin": { 689 | "mkdirp": "bin/cmd.js" 690 | } 691 | }, 692 | "node_modules/tsutils": { 693 | "version": "2.29.0", 694 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 695 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 696 | "dev": true, 697 | "dependencies": { 698 | "tslib": "^1.8.1" 699 | }, 700 | "peerDependencies": { 701 | "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" 702 | } 703 | }, 704 | "node_modules/typescript": { 705 | "version": "4.8.4", 706 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", 707 | "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", 708 | "dev": true, 709 | "bin": { 710 | "tsc": "bin/tsc", 711 | "tsserver": "bin/tsserver" 712 | }, 713 | "engines": { 714 | "node": ">=4.2.0" 715 | } 716 | }, 717 | "node_modules/underscore": { 718 | "version": "1.13.6", 719 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", 720 | "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", 721 | "dev": true 722 | }, 723 | "node_modules/uri-js": { 724 | "version": "4.4.1", 725 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 726 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 727 | "dependencies": { 728 | "punycode": "^2.1.0" 729 | } 730 | }, 731 | "node_modules/walkdir": { 732 | "version": "0.0.12", 733 | "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.12.tgz", 734 | "integrity": "sha512-HFhaD4mMWPzFSqhpyDG48KDdrjfn409YQuVW7ckZYhW4sE87mYtWifdB/+73RA7+p4s4K18n5Jfx1kHthE1gBw==", 735 | "dev": true, 736 | "engines": { 737 | "node": ">=0.6.0" 738 | } 739 | }, 740 | "node_modules/wrappy": { 741 | "version": "1.0.2", 742 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 743 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 744 | "dev": true 745 | }, 746 | "node_modules/yn": { 747 | "version": "3.1.1", 748 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 749 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 750 | "dev": true, 751 | "engines": { 752 | "node": ">=6" 753 | } 754 | } 755 | }, 756 | "dependencies": { 757 | "@angular-devkit/architect": { 758 | "version": "0.1402.8", 759 | "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.8.tgz", 760 | "integrity": "sha512-z3HXPBi3h3y+D04NNA/5lVaUCMF+dkE/75bCqg4DG3FqV0i0dh4hozjKtWgX6xuoJ8AJlDfrJSaBCvjsog+Jhg==", 761 | "requires": { 762 | "@angular-devkit/core": "14.2.8", 763 | "rxjs": "6.6.7" 764 | } 765 | }, 766 | "@angular-devkit/core": { 767 | "version": "14.2.8", 768 | "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.8.tgz", 769 | "integrity": "sha512-30nDq2PH91X7T42xXFBlTiXTBG143z0BL8IUgpVCxTFYwxgPbtV4bcXTkiBgh1FL/usZcHa0Bd/64wxmFOpYwA==", 770 | "requires": { 771 | "ajv": "8.11.0", 772 | "ajv-formats": "2.1.1", 773 | "jsonc-parser": "3.1.0", 774 | "rxjs": "6.6.7", 775 | "source-map": "0.7.4" 776 | } 777 | }, 778 | "@babel/code-frame": { 779 | "version": "7.8.3", 780 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 781 | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 782 | "dev": true, 783 | "requires": { 784 | "@babel/highlight": "^7.8.3" 785 | } 786 | }, 787 | "@babel/highlight": { 788 | "version": "7.8.3", 789 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", 790 | "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", 791 | "dev": true, 792 | "requires": { 793 | "chalk": "^2.0.0", 794 | "esutils": "^2.0.2", 795 | "js-tokens": "^4.0.0" 796 | } 797 | }, 798 | "@types/jasmine": { 799 | "version": "3.5.9", 800 | "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.9.tgz", 801 | "integrity": "sha512-KNL2Fq6GRmty2j6+ZmueT/Z/dkctLNH+5DFoGHNDtcgt7yME9NZd8x2p81Yuea1Xux/qAryDd3zVLUoKpDz1TA==", 802 | "dev": true 803 | }, 804 | "@types/node": { 805 | "version": "13.9.1", 806 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.1.tgz", 807 | "integrity": "sha512-E6M6N0blf/jiZx8Q3nb0vNaswQeEyn0XlupO+xN6DtJ6r6IT4nXrTry7zhIfYvFCl3/8Cu6WIysmUBKiqV0bqQ==", 808 | "dev": true 809 | }, 810 | "ajv": { 811 | "version": "8.11.0", 812 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", 813 | "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", 814 | "requires": { 815 | "fast-deep-equal": "^3.1.1", 816 | "json-schema-traverse": "^1.0.0", 817 | "require-from-string": "^2.0.2", 818 | "uri-js": "^4.2.2" 819 | } 820 | }, 821 | "ajv-formats": { 822 | "version": "2.1.1", 823 | "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", 824 | "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", 825 | "requires": { 826 | "ajv": "^8.0.0" 827 | } 828 | }, 829 | "ansi-styles": { 830 | "version": "3.2.1", 831 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 832 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 833 | "dev": true, 834 | "requires": { 835 | "color-convert": "^1.9.0" 836 | } 837 | }, 838 | "arg": { 839 | "version": "4.1.3", 840 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 841 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 842 | "dev": true 843 | }, 844 | "argparse": { 845 | "version": "1.0.10", 846 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 847 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 848 | "dev": true, 849 | "requires": { 850 | "sprintf-js": "~1.0.2" 851 | } 852 | }, 853 | "balanced-match": { 854 | "version": "1.0.0", 855 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 856 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 857 | "dev": true 858 | }, 859 | "brace-expansion": { 860 | "version": "1.1.11", 861 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 862 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 863 | "dev": true, 864 | "requires": { 865 | "balanced-match": "^1.0.0", 866 | "concat-map": "0.0.1" 867 | } 868 | }, 869 | "buffer-from": { 870 | "version": "1.1.1", 871 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 872 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 873 | "dev": true 874 | }, 875 | "builtin-modules": { 876 | "version": "1.1.1", 877 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 878 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 879 | "dev": true 880 | }, 881 | "chalk": { 882 | "version": "2.4.2", 883 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 884 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 885 | "dev": true, 886 | "requires": { 887 | "ansi-styles": "^3.2.1", 888 | "escape-string-regexp": "^1.0.5", 889 | "supports-color": "^5.3.0" 890 | } 891 | }, 892 | "coffeescript": { 893 | "version": "1.12.7", 894 | "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", 895 | "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==", 896 | "dev": true 897 | }, 898 | "color-convert": { 899 | "version": "1.9.3", 900 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 901 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 902 | "dev": true, 903 | "requires": { 904 | "color-name": "1.1.3" 905 | } 906 | }, 907 | "color-name": { 908 | "version": "1.1.3", 909 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 910 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 911 | "dev": true 912 | }, 913 | "commander": { 914 | "version": "2.20.3", 915 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 916 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 917 | "dev": true 918 | }, 919 | "concat-map": { 920 | "version": "0.0.1", 921 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 922 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 923 | "dev": true 924 | }, 925 | "diff": { 926 | "version": "4.0.2", 927 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 928 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 929 | "dev": true 930 | }, 931 | "escape-string-regexp": { 932 | "version": "1.0.5", 933 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 934 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 935 | "dev": true 936 | }, 937 | "esprima": { 938 | "version": "4.0.1", 939 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 940 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 941 | "dev": true 942 | }, 943 | "esutils": { 944 | "version": "2.0.3", 945 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 946 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 947 | "dev": true 948 | }, 949 | "fast-deep-equal": { 950 | "version": "3.1.3", 951 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 952 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 953 | }, 954 | "fs.realpath": { 955 | "version": "1.0.0", 956 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 957 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 958 | "dev": true 959 | }, 960 | "gaze": { 961 | "version": "1.1.3", 962 | "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", 963 | "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", 964 | "dev": true, 965 | "requires": { 966 | "globule": "^1.0.0" 967 | } 968 | }, 969 | "glob": { 970 | "version": "7.1.6", 971 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 972 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 973 | "dev": true, 974 | "requires": { 975 | "fs.realpath": "^1.0.0", 976 | "inflight": "^1.0.4", 977 | "inherits": "2", 978 | "minimatch": "^3.0.4", 979 | "once": "^1.3.0", 980 | "path-is-absolute": "^1.0.0" 981 | } 982 | }, 983 | "globule": { 984 | "version": "1.3.1", 985 | "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", 986 | "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", 987 | "dev": true, 988 | "requires": { 989 | "glob": "~7.1.1", 990 | "lodash": "~4.17.12", 991 | "minimatch": "~3.0.2" 992 | } 993 | }, 994 | "growl": { 995 | "version": "1.10.0", 996 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.0.tgz", 997 | "integrity": "sha512-ElsQbgadAZdhC8L+hx4RJu6fDe5uPCaRjdw8CvD39VYemGQT9CSiLdRAEYFWVIlCbPNlw+G4AbqBhQJF2qyHdg==", 998 | "dev": true 999 | }, 1000 | "has-flag": { 1001 | "version": "3.0.0", 1002 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1003 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1004 | "dev": true 1005 | }, 1006 | "inflight": { 1007 | "version": "1.0.6", 1008 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1009 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1010 | "dev": true, 1011 | "requires": { 1012 | "once": "^1.3.0", 1013 | "wrappy": "1" 1014 | } 1015 | }, 1016 | "inherits": { 1017 | "version": "2.0.4", 1018 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1019 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1020 | "dev": true 1021 | }, 1022 | "jasmine": { 1023 | "version": "3.5.0", 1024 | "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.5.0.tgz", 1025 | "integrity": "sha512-DYypSryORqzsGoMazemIHUfMkXM7I7easFaxAvNM3Mr6Xz3Fy36TupTrAOxZWN8MVKEU5xECv22J4tUQf3uBzQ==", 1026 | "dev": true, 1027 | "requires": { 1028 | "glob": "^7.1.4", 1029 | "jasmine-core": "~3.5.0" 1030 | } 1031 | }, 1032 | "jasmine-core": { 1033 | "version": "3.5.0", 1034 | "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", 1035 | "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", 1036 | "dev": true 1037 | }, 1038 | "jasmine-growl-reporter": { 1039 | "version": "1.0.3", 1040 | "resolved": "https://registry.npmjs.org/jasmine-growl-reporter/-/jasmine-growl-reporter-1.0.3.tgz", 1041 | "integrity": "sha512-WediiANO4FybZwfvK6a3uzm8O5iOanOcpJfFN4PnOFpf3Lolg0qgGwpwqqwFv2aGVaTWoBYKzSXzXDHYH6Badg==", 1042 | "dev": true, 1043 | "requires": { 1044 | "growl": "1.10.0" 1045 | } 1046 | }, 1047 | "jasmine-node": { 1048 | "version": "1.16.0", 1049 | "resolved": "https://registry.npmjs.org/jasmine-node/-/jasmine-node-1.16.0.tgz", 1050 | "integrity": "sha512-3bzlFH4dTVq9kzo4Gy8ocAznhYF/nF6wL29JoVJusDOapprq8HFHERK+c4ISyYrCBpERX+Btv5fLUTlR7CM4/w==", 1051 | "dev": true, 1052 | "requires": { 1053 | "coffeescript": "^1.0.1", 1054 | "gaze": "~1.1.2", 1055 | "jasmine-growl-reporter": "~1.0.1", 1056 | "jasmine-reporters": "~1.0.0", 1057 | "mkdirp": "~0.3.5", 1058 | "requirejs": "^2.3.6", 1059 | "underscore": "^1.9.1", 1060 | "walkdir": "~0.0.12" 1061 | } 1062 | }, 1063 | "jasmine-reporters": { 1064 | "version": "1.0.2", 1065 | "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-1.0.2.tgz", 1066 | "integrity": "sha1-q2E+1Zd9x0h+hbPBL2qOqNsq3jE=", 1067 | "dev": true, 1068 | "requires": { 1069 | "mkdirp": "~0.3.5" 1070 | } 1071 | }, 1072 | "js-tokens": { 1073 | "version": "4.0.0", 1074 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1075 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1076 | "dev": true 1077 | }, 1078 | "js-yaml": { 1079 | "version": "3.13.1", 1080 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1081 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1082 | "dev": true, 1083 | "requires": { 1084 | "argparse": "^1.0.7", 1085 | "esprima": "^4.0.0" 1086 | } 1087 | }, 1088 | "json-schema-traverse": { 1089 | "version": "1.0.0", 1090 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 1091 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" 1092 | }, 1093 | "jsonc-parser": { 1094 | "version": "3.1.0", 1095 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", 1096 | "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==" 1097 | }, 1098 | "lodash": { 1099 | "version": "4.17.21", 1100 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1101 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1102 | "dev": true 1103 | }, 1104 | "make-error": { 1105 | "version": "1.3.6", 1106 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1107 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1108 | "dev": true 1109 | }, 1110 | "minimatch": { 1111 | "version": "3.0.8", 1112 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", 1113 | "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", 1114 | "dev": true, 1115 | "requires": { 1116 | "brace-expansion": "^1.1.7" 1117 | } 1118 | }, 1119 | "minimist": { 1120 | "version": "1.2.6", 1121 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1122 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 1123 | "dev": true 1124 | }, 1125 | "mkdirp": { 1126 | "version": "0.3.5", 1127 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", 1128 | "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", 1129 | "dev": true 1130 | }, 1131 | "once": { 1132 | "version": "1.4.0", 1133 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1134 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1135 | "dev": true, 1136 | "requires": { 1137 | "wrappy": "1" 1138 | } 1139 | }, 1140 | "path-is-absolute": { 1141 | "version": "1.0.1", 1142 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1143 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1144 | "dev": true 1145 | }, 1146 | "path-parse": { 1147 | "version": "1.0.7", 1148 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1149 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1150 | "dev": true 1151 | }, 1152 | "punycode": { 1153 | "version": "2.1.1", 1154 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1155 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1156 | }, 1157 | "require-from-string": { 1158 | "version": "2.0.2", 1159 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 1160 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" 1161 | }, 1162 | "requirejs": { 1163 | "version": "2.3.6", 1164 | "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", 1165 | "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", 1166 | "dev": true 1167 | }, 1168 | "resolve": { 1169 | "version": "1.15.1", 1170 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", 1171 | "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", 1172 | "dev": true, 1173 | "requires": { 1174 | "path-parse": "^1.0.6" 1175 | } 1176 | }, 1177 | "rxjs": { 1178 | "version": "6.6.7", 1179 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 1180 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 1181 | "requires": { 1182 | "tslib": "^1.9.0" 1183 | } 1184 | }, 1185 | "semver": { 1186 | "version": "5.7.1", 1187 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1188 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1189 | "dev": true 1190 | }, 1191 | "source-map": { 1192 | "version": "0.7.4", 1193 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", 1194 | "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" 1195 | }, 1196 | "source-map-support": { 1197 | "version": "0.5.16", 1198 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", 1199 | "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", 1200 | "dev": true, 1201 | "requires": { 1202 | "buffer-from": "^1.0.0", 1203 | "source-map": "^0.6.0" 1204 | }, 1205 | "dependencies": { 1206 | "source-map": { 1207 | "version": "0.6.1", 1208 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1209 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1210 | "dev": true 1211 | } 1212 | } 1213 | }, 1214 | "sprintf-js": { 1215 | "version": "1.0.3", 1216 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1217 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1218 | "dev": true 1219 | }, 1220 | "supports-color": { 1221 | "version": "5.5.0", 1222 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1223 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1224 | "dev": true, 1225 | "requires": { 1226 | "has-flag": "^3.0.0" 1227 | } 1228 | }, 1229 | "ts-node": { 1230 | "version": "8.6.2", 1231 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz", 1232 | "integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==", 1233 | "dev": true, 1234 | "requires": { 1235 | "arg": "^4.1.0", 1236 | "diff": "^4.0.1", 1237 | "make-error": "^1.1.1", 1238 | "source-map-support": "^0.5.6", 1239 | "yn": "3.1.1" 1240 | } 1241 | }, 1242 | "tslib": { 1243 | "version": "1.11.1", 1244 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", 1245 | "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" 1246 | }, 1247 | "tslint": { 1248 | "version": "6.1.0", 1249 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.0.tgz", 1250 | "integrity": "sha512-fXjYd/61vU6da04E505OZQGb2VCN2Mq3doeWcOIryuG+eqdmFUXTYVwdhnbEu2k46LNLgUYt9bI5icQze/j0bQ==", 1251 | "dev": true, 1252 | "requires": { 1253 | "@babel/code-frame": "^7.0.0", 1254 | "builtin-modules": "^1.1.1", 1255 | "chalk": "^2.3.0", 1256 | "commander": "^2.12.1", 1257 | "diff": "^4.0.1", 1258 | "glob": "^7.1.1", 1259 | "js-yaml": "^3.13.1", 1260 | "minimatch": "^3.0.4", 1261 | "mkdirp": "^0.5.1", 1262 | "resolve": "^1.3.2", 1263 | "semver": "^5.3.0", 1264 | "tslib": "^1.10.0", 1265 | "tsutils": "^2.29.0" 1266 | }, 1267 | "dependencies": { 1268 | "mkdirp": { 1269 | "version": "0.5.3", 1270 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", 1271 | "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", 1272 | "dev": true, 1273 | "requires": { 1274 | "minimist": "^1.2.5" 1275 | } 1276 | } 1277 | } 1278 | }, 1279 | "tsutils": { 1280 | "version": "2.29.0", 1281 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 1282 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 1283 | "dev": true, 1284 | "requires": { 1285 | "tslib": "^1.8.1" 1286 | } 1287 | }, 1288 | "typescript": { 1289 | "version": "4.8.4", 1290 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", 1291 | "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", 1292 | "dev": true 1293 | }, 1294 | "underscore": { 1295 | "version": "1.13.6", 1296 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", 1297 | "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", 1298 | "dev": true 1299 | }, 1300 | "uri-js": { 1301 | "version": "4.4.1", 1302 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1303 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1304 | "requires": { 1305 | "punycode": "^2.1.0" 1306 | } 1307 | }, 1308 | "walkdir": { 1309 | "version": "0.0.12", 1310 | "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.12.tgz", 1311 | "integrity": "sha512-HFhaD4mMWPzFSqhpyDG48KDdrjfn409YQuVW7ckZYhW4sE87mYtWifdB/+73RA7+p4s4K18n5Jfx1kHthE1gBw==", 1312 | "dev": true 1313 | }, 1314 | "wrappy": { 1315 | "version": "1.0.2", 1316 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1317 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1318 | "dev": true 1319 | }, 1320 | "yn": { 1321 | "version": "3.1.1", 1322 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1323 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1324 | "dev": true 1325 | } 1326 | } 1327 | } 1328 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@migalons/angular-wdio-builder", 3 | "version": "1.1.1", 4 | "description": "Angular builder for running functional test based on webdriver.io runner.", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/migalons/angular-wdio-builder" 8 | }, 9 | "main": "lib/test.js", 10 | "types": "lib/test.d.ts", 11 | "files": [ 12 | "lib/**/*", 13 | "builders.json" 14 | ], 15 | "builders": "builders.json", 16 | "author": { 17 | "name": "Miguel Angel Alonso", 18 | "email": "migalons74@gmail.com", 19 | "url": "https://github.com/migalons" 20 | }, 21 | "license": "MIT", 22 | "scripts": { 23 | "build": "tsc", 24 | "lint": "tslint -c tslint.json 'src/**/*.ts'", 25 | "test": "tsc && ts-node node_modules/jasmine/bin/jasmine src/**/*.spec.ts" 26 | }, 27 | "dependencies": { 28 | "@angular-devkit/architect": "^0.1402.7", 29 | "@angular-devkit/core": "^14.2.7" 30 | }, 31 | "devDependencies": { 32 | "@types/jasmine": "^3.5.9", 33 | "@types/node": "^13.9.0", 34 | "jasmine": "^3.5.0", 35 | "jasmine-node": "^1.16.0", 36 | "ts-node": "^8.6.2", 37 | "tslint": "^6.1.0", 38 | "typescript": "^4.8.4" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/command/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/schema", 3 | "type": "object", 4 | "properties": { 5 | "wdioConfig": { 6 | "type": "string", 7 | "default": "e2e/wdio.conf.js" 8 | }, 9 | "devServerTarget": { 10 | "type": "string" 11 | }, 12 | "wdioOptions": { 13 | "type": "object", 14 | "default": {} 15 | }, 16 | "port": { 17 | "type": "number" 18 | }, 19 | "host": { 20 | "type": "string" 21 | }, 22 | "disableHostCheck": { 23 | "type": "boolean" 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/command/test.spec.ts: -------------------------------------------------------------------------------- 1 | import { Architect } from '@angular-devkit/architect'; 2 | import { TestingArchitectHost } from '@angular-devkit/architect/testing'; 3 | import { schema, logging } from '@angular-devkit/core'; 4 | import { join } from 'path'; 5 | 6 | describe('Command Runner Builder', () => { 7 | let architect: Architect; 8 | let architectHost: TestingArchitectHost; 9 | let logger: logging.Logger; 10 | let logs: string[]; 11 | 12 | beforeEach(async () => { 13 | const registry = new schema.CoreSchemaRegistry(); 14 | registry.addPostTransform(schema.transforms.addUndefinedDefaults); 15 | 16 | // TestingArchitectHost() takes workspace and current directories. 17 | // Since we don't use those, both are the same in this case. 18 | architectHost = new TestingArchitectHost(__dirname, __dirname); 19 | architect = new Architect(architectHost, registry); 20 | 21 | // This will either take a Node package name, or a path to the directory 22 | // for the package.json file. 23 | await architectHost.addBuilderFromPackage(join(__dirname, '../..')); 24 | 25 | logger = new logging.Logger(''); 26 | logs = []; 27 | logger.subscribe(ev => logs.push(ev.message)); 28 | 29 | }); 30 | 31 | it('raises an error when wdio is not installed', async () => { 32 | const run = await architect.scheduleBuilder('@migalons/angular-wdio-builder:test', {}, { logger }); 33 | const output = await run.result; 34 | await run.stop(); 35 | expect(output.success).toBe(false); 36 | expect(logs.toString()).toContain('@wdio/cli not installed'); 37 | }); 38 | 39 | }); 40 | -------------------------------------------------------------------------------- /src/command/test.ts: -------------------------------------------------------------------------------- 1 | import { 2 | BuilderContext, 3 | BuilderOutput, 4 | BuilderRun, 5 | createBuilder, 6 | targetFromTargetString 7 | } from '@angular-devkit/architect'; 8 | import { JsonObject } from '@angular-devkit/core'; 9 | 10 | interface Options extends JsonObject { 11 | devServerTarget: string; 12 | wdioConfig: string; 13 | wdioOptions: {}; 14 | port: number; 15 | host: string; 16 | disableHostCheck: boolean; 17 | } 18 | 19 | export const runWdioTest = async ( options: Options, context: BuilderContext ): Promise => { 20 | if(!isWdioInstalled()) { 21 | context.logger.error("@wdio/cli not installed. Can not run command. Exiting."); 22 | context.reportStatus('Failed'); 23 | return Promise.resolve({"success": false, "error": "@wdio/cli not installed. Can not run command. Exiting."}) 24 | } 25 | 26 | let builderRun: BuilderRun | undefined; 27 | let builderOutput: BuilderOutput; 28 | if(options.devServerTarget) { 29 | const devServerTargetOptions: any = {port: options.port, host: options.host, disableHostCheck: options.disableHostCheck} 30 | Object.keys(devServerTargetOptions).forEach(key => devServerTargetOptions[key] === undefined && delete devServerTargetOptions[key]) 31 | 32 | builderRun = await (context.scheduleTarget(targetFromTargetString(options.devServerTarget),devServerTargetOptions)); 33 | builderOutput = await builderRun.result; 34 | if(!builderOutput.target) { 35 | return Promise.resolve({"success": false, "error": `${options.devServerTarget} failed. Can not run command. Exiting`}) 36 | } 37 | } 38 | const Launcher = require('@wdio/cli').default; 39 | const wdio = new Launcher(options.wdioConfig, options.wdioOptions); 40 | 41 | return wdio.run().then((code: number) => { 42 | if (builderRun) process.exit(code); 43 | context.reportStatus(`Done.`); 44 | return { 'success': code === 0} 45 | }, (error: any) => { 46 | if (builderRun) process.exit(1); 47 | context.reportStatus(`Failed.`); 48 | context.logger.error('Launcher failed to start the test', error.stacktrace) 49 | return { 'success': false } 50 | }) 51 | } 52 | 53 | export default createBuilder(runWdioTest); 54 | 55 | function isWdioInstalled(): boolean { 56 | try { 57 | // @ts-ignore 58 | const Launcher = require('@wdio/cli').default; 59 | return true; 60 | } catch (err) { 61 | return false; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "tsconfig", 4 | "target": "es6", 5 | "declaration": true, 6 | "module": "commonjs", 7 | "moduleResolution": "node", 8 | "noEmitOnError": true, 9 | "noFallthroughCasesInSwitch": true, 10 | "noImplicitAny": true, 11 | "noImplicitThis": true, 12 | "noUnusedParameters": true, 13 | "noUnusedLocals": true, 14 | "outDir": "lib", 15 | "resolveJsonModule": true, 16 | "skipDefaultLibCheck": true, 17 | "skipLibCheck": true, 18 | "sourceMap": true, 19 | "strictNullChecks": true, 20 | "types": [ 21 | "node", 22 | "jasmine" 23 | ] 24 | }, 25 | "include": [ 26 | "src/**/*", 27 | "src/command/schema.json" 28 | ], 29 | "exclude": [ 30 | "lib", 31 | "node_modules", 32 | "**/*.spec.ts" 33 | ] 34 | } 35 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint:recommended" 5 | ], 6 | "jsRules": {}, 7 | "rules": {}, 8 | "rulesDirectory": [] 9 | } --------------------------------------------------------------------------------