diff --git a/.gitignore b/.gitignore index 3c3629e..627a374 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ node_modules +test/cypress/videos diff --git a/package-lock.json b/package-lock.json index 4403877..830d992 100644 --- a/package-lock.json +++ b/package-lock.json @@ -974,6 +974,97 @@ "to-fast-properties": "^2.0.0" } }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true + }, + "@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + } + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } + }, + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "@lhncbc/ucum-lhc": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@lhncbc/ucum-lhc/-/ucum-lhc-4.1.4.tgz", @@ -1036,10 +1127,16 @@ "integrity": "sha512-lCvvI24L21ZVeIiyIUHZ5Oflv1hhHQ5E1S25IRlKIXaRkVgmXpJMI3wUJkmym2bTbCe+WoIibQnMVAU3FguaOg==", "dev": true }, - "@types/selenium-webdriver": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", - "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", "dev": true }, "@types/source-list-map": { @@ -1112,6 +1209,16 @@ } } }, + "@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -1320,19 +1427,14 @@ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, - "adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" } }, "ajv": { @@ -1386,6 +1488,15 @@ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", @@ -1439,6 +1550,12 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1492,12 +1609,6 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -1571,6 +1682,12 @@ "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", "dev": true }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, "async": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", @@ -1598,6 +1715,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -2538,14 +2661,11 @@ "file-uri-to-path": "1.0.0" } }, - "blocking-proxy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", - "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } + "blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true }, "bluebird": { "version": "3.7.2", @@ -2808,15 +2928,6 @@ } } }, - "browserstack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz", - "integrity": "sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw==", - "dev": true, - "requires": { - "https-proxy-agent": "^2.2.1" - } - }, "btoa": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", @@ -2834,6 +2945,12 @@ "isarray": "^1.0.0" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -2904,6 +3021,12 @@ "unset-value": "^1.0.0" } }, + "cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true + }, "camel-case": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", @@ -2955,6 +3078,12 @@ "supports-color": "^5.3.0" } }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -2990,6 +3119,12 @@ "tslib": "^1.9.0" } }, + "ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -3040,6 +3175,12 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "clean-webpack-plugin": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", @@ -3050,32 +3191,33 @@ "del": "^4.1.1" } }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "restore-cursor": "^3.1.0" + } + }, + "cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" } }, "collection-visit": { @@ -3136,6 +3278,12 @@ "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -4061,120 +4209,399 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "cypress": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.10.0.tgz", + "integrity": "sha512-bU8r44x1NIYAUNNXt3CwJpLOVth7HUv2hUhYCxZmgZ1IugowDvuHNpevnoZRQx1KKOEisLvIJW+Xen5Pjn41pg==", + "dev": true, + "requires": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" }, "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "@types/node": { + "version": "14.18.32", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.32.tgz", + "integrity": "sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "color-convert": "^2.0.1" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" + }, + "dayjs": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.5.tgz", + "integrity": "sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { "@types/glob": "^7.1.1", "globby": "^6.1.0", "is-path-cwd": "^2.0.0", @@ -4455,6 +4882,23 @@ } } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + } + } + }, "entities": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", @@ -4500,21 +4944,6 @@ "is-symbol": "^1.0.2" } }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, "es6-templates": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", @@ -4585,6 +5014,12 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, + "eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true + }, "eventemitter3": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", @@ -4631,11 +5066,22 @@ "strip-eof": "^1.0.0" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } }, "expand-brackets": { "version": "2.1.4", @@ -4870,6 +5316,29 @@ "resolve": "^1.8.1" } }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -4903,6 +5372,15 @@ "websocket-driver": ">=0.5.1" } }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "fhirclient": { "version": "2.3.10", "resolved": "https://registry.npmjs.org/fhirclient/-/fhirclient-2.3.10.tgz", @@ -4946,6 +5424,15 @@ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, "file-loader": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", @@ -5131,6 +5618,30 @@ "readable-stream": "^2.0.0" } }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "dependencies": { + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + } + } + }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -5172,12 +5683,6 @@ "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", "dev": true }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -5187,12 +5692,29 @@ "pump": "^3.0.0" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "requires": { + "async": "^3.2.0" + }, + "dependencies": { + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + } + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -5237,6 +5759,23 @@ } } }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "requires": { + "ini": "2.0.0" + }, + "dependencies": { + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + } + } + }, "global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -5310,22 +5849,6 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5658,43 +6181,17 @@ "micromatch": "^3.1.10" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true }, "iconv-lite": { "version": "0.4.24", @@ -5723,12 +6220,6 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -5745,6 +6236,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", @@ -5885,6 +6382,15 @@ "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", "dev": true }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "requires": { + "ci-info": "^3.2.0" + } + }, "is-color-stop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", @@ -5984,6 +6490,24 @@ "is-extglob": "^2.1.1" } }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "dependencies": { + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + } + } + }, "is-integer": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", @@ -6087,6 +6611,12 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -6122,23 +6652,6 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", - "dev": true, - "requires": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.8.0" - } - }, - "jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", - "dev": true - }, "jasmine-spec-reporter": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", @@ -6148,12 +6661,6 @@ "colors": "1.1.2" } }, - "jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", - "dev": true - }, "jquery": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", @@ -6214,12 +6721,6 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -6255,30 +6756,6 @@ "graceful-fs": "^4.1.6" } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jszip": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", - "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -6301,6 +6778,12 @@ "webpack-sources": "^1.1.0" } }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true + }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -6388,21 +6871,95 @@ } } }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, "lilconfig": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz", "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", "dev": true }, + "listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -6448,12 +7005,134 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, "loglevel": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", @@ -6568,6 +7247,12 @@ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -6938,12 +7623,6 @@ "boolbase": "~1.0.0" } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -7073,6 +7752,15 @@ "wrappy": "1" } }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, "opn": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", @@ -7131,6 +7819,12 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -7282,6 +7976,12 @@ "sha.js": "^2.4.8" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -7497,6 +8197,12 @@ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, "pretty-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", @@ -7535,146 +8241,6 @@ "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.0.tgz", "integrity": "sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g==" }, - "protractor": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", - "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", - "dev": true, - "requires": { - "@types/q": "^0.0.32", - "@types/selenium-webdriver": "^3.0.0", - "blocking-proxy": "^1.0.0", - "browserstack": "^1.5.1", - "chalk": "^1.1.3", - "glob": "^7.0.3", - "jasmine": "2.8.0", - "jasminewd2": "^2.1.0", - "q": "1.4.1", - "saucelabs": "^1.5.0", - "selenium-webdriver": "3.6.0", - "source-map-support": "~0.4.0", - "webdriver-js-extender": "2.1.0", - "webdriver-manager": "^12.1.7", - "yargs": "^15.3.1" - }, - "dependencies": { - "@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "webdriver-manager": { - "version": "12.1.7", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", - "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", - "dev": true, - "requires": { - "adm-zip": "^0.4.9", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "^1.2.0", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" - } - } - } - }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -7685,6 +8251,12 @@ "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -8007,32 +8579,13 @@ "is-finite": "^1.0.0" } }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", "dev": true, "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "throttleit": "^1.0.0" } }, "require-directory": { @@ -8041,12 +8594,6 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -8105,6 +8652,16 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -8117,6 +8674,12 @@ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -8157,6 +8720,23 @@ "aproba": "^1.1.1" } }, + "rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + } + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -8177,21 +8757,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "saucelabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", - "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", - "dev": true, - "requires": { - "https-proxy-agent": "^2.2.1" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", @@ -8209,18 +8774,6 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, - "selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dev": true, - "requires": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" - } - }, "selfsigned": { "version": "1.10.8", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", @@ -8365,12 +8918,6 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -8443,6 +8990,49 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + } + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -8953,6 +9543,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -9039,6 +9635,12 @@ } } }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -9076,15 +9678,6 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.1" - } - }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -9194,6 +9787,12 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -9304,6 +9903,12 @@ "imurmurhash": "^0.1.4" } }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -9350,6 +9955,12 @@ } } }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -9637,16 +10248,6 @@ "minimalistic-assert": "^1.0.0" } }, - "webdriver-js-extender": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", - "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", - "dev": true, - "requires": { - "@types/selenium-webdriver": "^3.0.0", - "selenium-webdriver": "^3.0.1" - } - }, "webpack": { "version": "4.43.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", @@ -10290,22 +10891,6 @@ "async-limiter": "~1.0.0" } }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, "xmldoc": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-0.4.0.tgz", @@ -10345,84 +10930,14 @@ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } } } diff --git a/package.json b/package.json index 5d4dc10..41ff17a 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,12 @@ "description": "A website for rendering a FHIR Questionnaire using the LHC-Forms widget", "main": "app.js", "scripts": { - "update-webdriver": "node node_modules/protractor/bin/webdriver-manager update --versions.chrome $(google-chrome --version |awk '{print $NF}')", - "test": "webpack-dev-server --config webpack.development.js & sleep 1; protractor test/e2e/protractor.conf.js; s=$?; kill %1; exit $s", + "test": "npm run start-no-open & sleep 1; npm run cy:run; s=$?; kill %1; exit $s", "build": "webpack --config webpack.production.js", - "start": "webpack-dev-server --open --config webpack.development.js" + "start": "webpack-dev-server --open --config webpack.development.js", + "start-no-open": "webpack-dev-server --config webpack.development.js", + "cy:open": "cypress open --project test", + "cy:run": "cypress run --project test" }, "repository": { "type": "git", @@ -25,6 +27,7 @@ "babel-loader": "^8.0.6", "clean-webpack-plugin": "^3.0.0", "css-loader": "^5.2.4", + "cypress": "^10.10.0", "extract-loader": "^3.1.0", "file-loader": "^4.1.0", "file-saver": "^2.0.2", @@ -34,7 +37,6 @@ "mini-css-extract-plugin": "^0.8.0", "moment": "^2.24.0", "optimize-css-assets-webpack-plugin": "^6.0.0", - "protractor": "^7.0.0", "terser-webpack-plugin": "^1.3.0", "webpack": "^4.37.0", "webpack-cli": "^3.3.6", diff --git a/test/cypress.config.js b/test/cypress.config.js new file mode 100644 index 0000000..103ff83 --- /dev/null +++ b/test/cypress.config.js @@ -0,0 +1,11 @@ +const { defineConfig } = require("cypress"); + +module.exports = defineConfig({ + e2e: { + setupNodeEvents(on, config) { + // implement node event listeners here + }, + baseUrl: 'http://localhost:4029/', + specPattern: 'cypress/e2e/**/*.spec.{js,jsx,ts,tsx}' + }, +}); diff --git a/test/cypress/e2e/error_handling.spec.js b/test/cypress/e2e/error_handling.spec.js new file mode 100644 index 0000000..ee5765d --- /dev/null +++ b/test/cypress/e2e/error_handling.spec.js @@ -0,0 +1,367 @@ +describe('FHIR Questionnaire Viewer', () => { + describe('Error handling when URLs are provided on page', () => { + beforeEach(() => { + cy.visit('/'); + }); + + let error = 'qv-error'; + let info = 'qv-form-info'; + let warning = 'qv-form-warning'; + let btnWarning = 'qv-btn-show-warning'; + + function loadQuestionnaire(qFileName, pFileName) { + const urlQ = 'urlQuestionnaire', + urlP = 'urlPackage', + firstItem = '/q1/1', + btn = 'qv-btn-load'; + + cy.byId(urlQ) + .clear() + .type(Cypress.config().baseUrl + qFileName); + if (pFileName) { + cy.byId(urlP) + .clear() + .type(Cypress.config().baseUrl + pFileName); + } + cy.byId(btn) + .click(); + } + + it('should show no errors initially', () => { + cy.byId(error) + .should('not.be.visible'); + cy.byId(info) + .should('not.be.visible'); + }); + + it('should show no errors when a Questionnaire is loaded', () => { + loadQuestionnaire("questionnaire-use-package.json"); + cy.byId(info) + .should('contain.text', 'questionnaire-use-package.json'); + cy.byId(error) + .should('not.be.visible'); + }); + + it('should show no errors when a Questionnaire and a package file are loaded', () => { + loadQuestionnaire("questionnaire-use-package.json", "package.json.tgz"); + cy.byId(error) + .should('not.be.visible'); + cy.byId(info) + .should('contain.text', 'The following Questionnaire was loaded from') + .should('contain.text', 'questionnaire-use-package.json') + .should('contain.text', 'with resources from') + .should('contain.text', 'package.json.tgz'); + }); + + it('should show related errors when a Questionnaire URL is empty', () => { + const urlQ = 'urlQuestionnaire'; + const btn = 'qv-btn-load'; + cy.byId(urlQ) + .clear(); + cy.byId(btn) + .click(); + cy.byId(error) + .should('be.visible') + .should('contain.text', 'Please provide the URL of a FHIR Questionnaire'); + }); + + it('should show related errors when a Questionnaire failed to load', () => { + loadQuestionnaire("invalid_url.json"); + cy.byId(error) + .should('be.visible') + .should('contain.text', 'No data returned from') + .should('contain.text', 'invalid_url.json'); + }); + + it('should show related errors when a url for Questionnaire returns a resource that is not a Questionnaire', () => { + loadQuestionnaire("questionnaire-use-package-invalid-not-questionnaire.json"); + cy.byId(error) + .should('be.visible') + .should('contain.text', 'No Questionnaire (JSON) returned from') + .should('contain.text', 'questionnaire-use-package-invalid-not-questionnaire.json'); + }); + + it('should show related errors when a url for Questionnaire returns a resource that cannot be converted or displayed by LHC-Forms', () => { + loadQuestionnaire("questionnaire-use-package-invalid-cannot-be-imported.json"); + cy.byId(error) + .should('be.visible') + // The space between below 2 sentences in the page uses a different character. Breaking into 2 lines of assert. + .should('contain.text', 'cannot be processed by LHC-Forms.') + .should('contain.text', 'Please check if the Questionnaire is valid or if it has features that LHC-Forms does not support yet') + .should('contain.text', 'questionnaire-use-package-invalid-cannot-be-imported.json'); + }); + + it('should show related info message when Questionaire is fine, but the package cannot be fetched', () => { + loadQuestionnaire("questionnaire-use-package.json", "invalid-package-url"); + cy.byId(error) + .should('not.be.visible'); + cy.byId(info) + .should('contain.text', 'The following Questionnaire was loaded from') + .should('contain.text', 'questionnaire-use-package.json') + .should('contain.text', 'but failed to fetch the package file from') + .should('contain.text', 'invalid-package-url'); + }); + + it('should show related info message when Questionaire is fine, but the package file cannot be read', () => { + // don't know how to test it yet + }); + + it('should show related info message when Questionaire is fine, but the package file is a corrupted gzip file', () => { + loadQuestionnaire("questionnaire-use-package.json", "package.json.corrupted_gzip.tgz"); + cy.byId(error) + .should('not.be.visible'); + cy.byId(info) + .should('contain.text', 'The following Questionnaire was loaded from') + .should('contain.text', 'questionnaire-use-package.json') + .should('contain.text', 'but failed to unzip the package file from') + .should('contain.text', 'package.json.corrupted_gzip.tgz'); + }); + + it('should show related info message when Questionaire is fine, but the package file contains a corrupted tar file', () => { + loadQuestionnaire("questionnaire-use-package.json", "package.json.corrupted_tar.tgz"); + cy.byId(error) + .should('not.be.visible'); + cy.byId(info) + .should('contain.text', 'The following Questionnaire was loaded from') + .should('contain.text', 'questionnaire-use-package.json') + .should('contain.text', 'but failed to untar the package file from') + .should('contain.text', 'package.json.corrupted_tar.tgz'); + }); + + it('should show related info message when Questionaire is fine, but the package file cannot be processed', () => { + // no tests yet + }); + + it('should show warings when a Questionnaire is loaded but answer list are not loaded from urls', () => { + loadQuestionnaire("questionnaire-use-package.json"); + cy.byId(info) + .should('contain.text', 'questionnaire-use-package.json'); + cy.byId(error) + .should('not.be.visible'); + cy.byId(btnWarning) + .should('be.visible'); + cy.byId(warning) + .should('not.be.visible'); + cy.byId(btnWarning) + .should('contain.text', 'Show Warning Messages'); + // show messages + cy.byId(btnWarning) + .click() + .should('contain.text', 'Hide Warning Messages'); + cy.byId(warning) + .should('be.visible') + .should('contain.text', 'http://hl7.org/fhir/ValueSet/example-expansion|20150622') + .should('contain.text', 'http://hl7.org/fhir/ValueSet/example-expansion'); + + // hide messages + cy.byId(btnWarning) + .click() + .should('contain.text', 'Show Warning Messages'); + cy.byId(warning) + .should('not.be.visible'); + }); + + it('should not show warings when a Questionnaire is loaded with all answer lists', () => { + loadQuestionnaire("questionnaire-use-package.json", "package.json.tgz"); + cy.byId(error) + .should('not.be.visible'); + cy.byId(btnWarning) + .should('not.be.visible'); + cy.byId(warning) + .should('not.be.visible'); + cy.byId(info) + .should('contain.text', 'questionnaire-use-package.json'); + }); + }); + + describe('Error handling when URLs are provided as url parameters', () => { + let error = 'qv-error'; + let info = 'qv-form-info'; + let inputs = 'qv-form-input-settings'; + let warning = 'qv-form-warning'; + let btnWarning = 'qv-btn-show-warning'; + + function loadQuestionnaire(qFileName, pFileName) { + const baseUrl = Cypress.config().baseUrl; + let url = baseUrl + '/?q=' + baseUrl + '/' + qFileName; + if (pFileName) { + url += '&p=' + baseUrl + '/' + pFileName; + } + cy.visit(url); + } + + it('should show no errors and no inputs when a Questionnaire is loaded', () => { + loadQuestionnaire("questionnaire-use-package.json"); + cy.byId(info) + .should('contain.text', 'questionnaire-use-package.json'); + cy.byId(error) + .should('not.be.visible'); + cy.byId(inputs) + .should('not.be.visible'); + }); + + it('should show no errors when a Questionnaire and a package file are loaded', () => { + loadQuestionnaire("questionnaire-use-package.json", "package.json.tgz"); + cy.byId(error) + .should('not.be.visible'); + cy.byId(info) + .should('contain.text', 'The following Questionnaire was loaded from') + .should('contain.text', 'questionnaire-use-package.json') + .should('contain.text', 'with resources from') + .should('contain.text', 'package.json.tgz'); + cy.byId(inputs) + .should('not.be.visible'); + }); + + it('should show related errors when a Questionnaire failed to load', () => { + loadQuestionnaire("invalid_url.json"); + cy.byId(error) + .should('be.visible') + .should('contain.text', 'No data returned from') + .should('contain.text', 'invalid_url.json'); + cy.byId(inputs) + .should('not.be.visible'); + }); + + it('should show related errors when a url for Questionnaire returns a resource that is not a Questionnaire', () => { + loadQuestionnaire("questionnaire-use-package-invalid-not-questionnaire.json"); + cy.byId(error) + .should('be.visible') + .should('contain.text', 'No Questionnaire (JSON) returned from') + .should('contain.text', 'questionnaire-use-package-invalid-not-questionnaire.json'); + cy.byId(inputs) + .should('not.be.visible'); + }); + + it('should show related errors when a url for Questionnaire returns a resource that cannot be converted or displayed by LHC-Forms', () => { + loadQuestionnaire("questionnaire-use-package-invalid-cannot-be-imported.json"); + cy.byId(error) + .should('be.visible') + // The space between below 2 sentences in the page uses a different character. Breaking into 2 lines of assert. + .should('contain.text', 'cannot be processed by LHC-Forms.') + .should('contain.text', 'Please check if the Questionnaire is valid or if it has features that LHC-Forms does not support yet') + .should('contain.text', 'questionnaire-use-package-invalid-cannot-be-imported.json'); + cy.byId(inputs) + .should('not.be.visible'); + }); + + it('should show related info message when Questionaire is fine, but the package cannot be fetched', () => { + loadQuestionnaire("questionnaire-use-package.json", "invalid-package-url"); + cy.byId(error) + .should('not.be.visible'); + cy.byId(info) + .should('contain.text', 'The following Questionnaire was loaded from') + .should('contain.text', 'questionnaire-use-package.json') + .should('contain.text', 'but failed to fetch the package file from') + .should('contain.text', 'invalid-package-url'); + cy.byId(inputs) + .should('not.be.visible'); + }); + + it('should show related info message when Questionaire is fine, but the package file cannot be read', () => { + // don't know how to test it yet + }); + + it('should show related info message when Questionaire is fine, but the package file is a corrupted gzip file', () => { + loadQuestionnaire("questionnaire-use-package.json", "package.json.corrupted_gzip.tgz"); + cy.byId(error) + .should('not.be.visible'); + cy.byId(info) + .should('contain.text', 'The following Questionnaire was loaded from') + .should('contain.text', 'questionnaire-use-package.json') + .should('contain.text', 'but failed to unzip the package file from') + .should('contain.text', 'package.json.corrupted_gzip.tgz'); + cy.byId(inputs) + .should('not.be.visible'); + }); + + it('should show related info message when Questionaire is fine, but the package file contains a corrupted tar file', () => { + loadQuestionnaire("questionnaire-use-package.json", "package.json.corrupted_tar.tgz"); + cy.byId(error) + .should('not.be.visible'); + cy.byId(info) + .should('contain.text', 'The following Questionnaire was loaded from') + .should('contain.text', 'questionnaire-use-package.json') + .should('contain.text', 'but failed to untar the package file from') + .should('contain.text', 'package.json.corrupted_tar.tgz'); + cy.byId(inputs) + .should('not.be.visible'); + }); + + it('should show related info message when Questionaire is fine, but the package file cannot be processed', () => { + // no tests yet + }); + + it('should show warings when a R4 Questionnaire is loaded but answer list are not loaded from urls', () => { + loadQuestionnaire("questionnaire-use-package.json"); + cy.byId(info) + .should('contain.text', 'questionnaire-use-package.json'); + cy.byId(error) + .should('not.be.visible'); + cy.byId(btnWarning) + .should('be.visible'); + cy.byId(warning) + .should('not.be.visible'); + cy.byId(btnWarning) + .should('contain.text', 'Show Warning Messages'); + // show messages + cy.byId(btnWarning) + .click() + .should('contain.text', 'Hide Warning Messages'); + cy.byId(warning) + .should('be.visible') + .should('contain.text', 'http://hl7.org/fhir/ValueSet/example-expansion|20150622') + .should('contain.text', 'http://hl7.org/fhir/ValueSet/example-expansion'); + + // hide messages + cy.byId(btnWarning) + .click() + .should('contain.text', 'Show Warning Messages'); + cy.byId(warning) + .should('not.be.visible'); + }); + + it('should show warings when a STU3 Questionnaire is loaded but answer list are not loaded from urls', () => { + loadQuestionnaire("4712701.json"); + cy.byId(info) + .should('contain.text', '4712701.json'); + cy.byId(error) + .should('not.be.visible'); + cy.byId(btnWarning) + .should('be.visible'); + cy.byId(warning) + .should('not.be.visible'); + cy.byId(btnWarning) + .should('contain.text', 'Show Warning Messages'); + // show messages + cy.byId(btnWarning) + .click() + .should('contain.text', 'Hide Warning Messages'); + cy.byId(warning) + .should('be.visible') + .should('contain.text', 'http://hl7.org/fhir/ValueSet/v3-ActEncounterCode') // 1st message + .should('contain.text', 'http://uni-koeln.de/fhir/ValueSet/ecog') // 2nd message + .should('contain.text', 'http://uni-koeln.de/fhir/ValueSet/icd-o-3-m-lunge') // 3rd message + .should('contain.text', 'http://uni-koeln.de/fhir/ValueSet/uicc-lunge'); // 11th message + + // hide messages + cy.byId(btnWarning) + .click() + .should('contain.text', 'Show Warning Messages'); + cy.byId(warning) + .should('not.be.visible'); + }); + + it('should not show warings when a Questionnaire is loaded with all answer lists', () => { + loadQuestionnaire("questionnaire-use-package.json", "package.json.tgz"); + cy.byId(error) + .should('not.be.visible'); + cy.byId(btnWarning) + .should('not.be.visible'); + cy.byId(warning) + .should('not.be.visible'); + cy.byId(info) + .should('contain.text', 'questionnaire-use-package.json'); + }); + }); +}); diff --git a/test/cypress/e2e/main.spec.js b/test/cypress/e2e/main.spec.js new file mode 100644 index 0000000..20fcb09 --- /dev/null +++ b/test/cypress/e2e/main.spec.js @@ -0,0 +1,285 @@ +describe('FHIR Questionnaire Viewer', () => { + describe('URLs provided on page', () => { + beforeEach(() => { + cy.visit('/'); + }); + + it('should load a Questionnaire without resource package', () => { + const urlQ = 'urlQuestionnaire', + urlP = 'urlPackage', + firstItem = '/q1/1', + btn = 'qv-btn-load', + notes = 'qv-form-notes'; + + cy.byId(urlQ) + .clear() + .type(Cypress.config().baseUrl + '/questionnaire-use-package.json'); + cy.byId(btn) + .click(); + cy.byId(firstItem) + .should('be.visible') + .click() + .type('{downArrow}') + .blur(); + cy.byId(firstItem) + .should('have.value', ''); + cy.byId(notes) + .should('contain.text', '/questionnaire-use-package.json'); + }); + + it('should load both R4 and STU3 versions of Questionnaire', () => { + const urlQ = 'urlQuestionnaire', + urlP = 'urlPackage', + dropdown = '/8352-7/1', + btn = 'qv-btn-load', + notes = 'qv-form-notes'; + + // r4 + cy.byId(urlQ) + .clear() + .type(Cypress.config().baseUrl + '/weightHeightQuestionnaire_r4.json'); + cy.byId(btn) + .click(); + cy.byId(dropdown) + .should('be.visible') + .click() + .type('{downArrow}') + .blur(); + cy.byId(dropdown) + .should('have.value', 'Underwear or less'); + cy.byId(notes) + .should('contain.text', '/weightHeightQuestionnaire_r4.json'); + + // stu3 + cy.byId(urlQ) + .clear() + .type(Cypress.config().baseUrl + '/weightHeightQuestionnaire_stu3.json'); + cy.byId(btn) + .click(); + cy.byId(dropdown) + .should('be.visible') + .click() + .type('{downArrow}') + .blur(); + cy.byId(dropdown) + .should('have.value', 'Underwear or less'); + cy.byId(notes) + .should('contain.text', '/weightHeightQuestionnaire_stu3.json'); + }); + + it('should load a Questionnaire with a resource package', () => { + const urlQ = 'urlQuestionnaire', + urlP = 'urlPackage', + firstItem = '/q1/1', + secondItem = '/q2/1', + thirdItem = '/q3/1', + btn = 'qv-btn-load', + notes = 'qv-form-notes'; + + cy.byId(urlQ) + .clear() + .type(Cypress.config().baseUrl + '/questionnaire-use-package.json'); + cy.byId(urlP) + .clear() + .type(Cypress.config().baseUrl + '/package.json.tgz'); + cy.byId(btn) + .click(); + + cy.byId(firstItem) + .should('be.visible') + .click() + .type('{downArrow}') + .blur(); + cy.byId(firstItem) + .should('have.value', 'Cholesterol [Moles/volume] in Serum or Plasma'); + + cy.byId(secondItem) + .click() + .type('{downArrow}') + .type('{downArrow}') + .blur(); + cy.byId(secondItem) + .should('have.value', 'Cholesterol/Triglyceride [Mass Ratio] in Serum or Plasma'); + + cy.byId(notes) + .should('contain.text', '/questionnaire-use-package.json') + .should('contain.text', '/package.json.tgz'); + }); + + it('should load a Questionnaire with a resource package that contains no .index.json', () => { + const urlQ = 'urlQuestionnaire', + urlP = 'urlPackage', + firstItem = '/q1/1', + secondItem = '/q2/1', + thirdItem = '/q3/1', + btn = 'qv-btn-load', + notes = 'qv-form-notes'; + + cy.byId(urlQ) + .clear() + .type(Cypress.config().baseUrl + '/questionnaire-use-package.json'); + cy.byId(urlP) + .clear() + .type(Cypress.config().baseUrl + '/package-no-index.json.tgz'); + cy.byId(btn) + .click(); + + cy.byId(firstItem) + .should('be.visible') + .click() + .type('{downArrow}') + .blur(); + cy.byId(firstItem) + .should('have.value', 'Cholesterol [Moles/volume] in Serum or Plasma'); + + cy.byId(secondItem) + .should('be.visible') + .click() + .type('{downArrow}') + .type('{downArrow}') + .blur(); + cy.byId(secondItem) + .should('have.value', 'Cholesterol/Triglyceride [Mass Ratio] in Serum or Plasma'); + + cy.byId(notes) + .should('contain.text', '/questionnaire-use-package.json') + .should('contain.text', '/package-no-index.json.tgz'); + }); + }); + + describe('URLs provided as url parameters', () => { + Cypress.on('uncaught:exception', (err, runnable) => { + // Returning false here prevents Cypress from + // failing the test from console errors of the app. + return false; + }); + + it('should load a Questionnaire without resource package', () => { + const notes = 'qv-form-notes'; + const url = Cypress.config().baseUrl + '/?q=' + Cypress.config().baseUrl + '/questionnaire-use-package.json'; + cy.visit(url); + + const firstItem = '/q1/1', + inputPanel = 'qv-form-input'; + + cy.byId(firstItem) + .should('be.visible') + .click() + .type('{downArrow}') + .blur(); + cy.byId(firstItem) + .should('have.value', ''); + + // input panel is not shown + cy.byId(inputPanel) + .should('not.be.visible'); + + cy.byId(notes) + .should('contain.text', '/questionnaire-use-package.json'); + }); + + it('should load both R4 and STU3 versions of Questionnaire', () => { + const dropdown = '/8352-7/1', + notes = 'qv-form-notes'; + + let url = Cypress.config().baseUrl + '/?q=' + Cypress.config().baseUrl + '/weightHeightQuestionnaire_r4.json'; + cy.visit(url); + + // r4 + cy.byId(dropdown) + .should('be.visible') + .click() + .type('{downArrow}') + .blur(); + cy.byId(dropdown) + .should('have.value', 'Underwear or less'); + cy.byId(notes) + .should('contain.text', '/weightHeightQuestionnaire_r4.json'); + + // stu3 + url = Cypress.config().baseUrl + '/?q=' + Cypress.config().baseUrl + '/weightHeightQuestionnaire_stu3.json'; + cy.visit(url); + cy.byId(dropdown) + .should('be.visible') + .click() + .type('{downArrow}') + .blur(); + cy.byId(dropdown) + .should('have.value', 'Underwear or less'); + cy.byId(notes) + .should('contain.text', '/weightHeightQuestionnaire_stu3.json'); + }); + + it('should load a Questionnaire with a resource package', () => { + const baseUrl = Cypress.config().baseUrl; + const url = baseUrl + '/?q=' + baseUrl + '/questionnaire-use-package.json' + '&p=' + baseUrl + '/package.json.tgz'; + cy.visit(url); + + const firstItem = '/q1/1', + secondItem = '/q2/1', + thirdItem = '/q3/1', + inputPanel = 'qv-form-input', + notes = 'qv-form-notes'; + + cy.byId(firstItem) + .should('be.visible') + .click() + .type('{downArrow}') + .blur(); + cy.byId(firstItem) + .should('have.value', 'Cholesterol [Moles/volume] in Serum or Plasma'); + + cy.byId(secondItem) + .click() + .type('{downArrow}') + .type('{downArrow}') + .blur(); + cy.byId(secondItem) + .should('have.value', 'Cholesterol/Triglyceride [Mass Ratio] in Serum or Plasma'); + + // input panel is not shown + cy.byId(inputPanel) + .should('not.be.visible'); + + cy.byId(notes) + .should('contain.text', '/questionnaire-use-package.json') + .should('contain.text', '/package.json.tgz'); + }); + + it('should load a Questionnaire with a resource package that contains no .index.json', () => { + const baseUrl = Cypress.config().baseUrl; + const url = baseUrl + '/?q=' + baseUrl + '/questionnaire-use-package.json' + '&p=' + baseUrl + '/package-no-index.json.tgz'; + cy.visit(url); + + const firstItem = '/q1/1', + secondItem = '/q2/1', + thirdItem = '/q3/1', + inputPanel = 'qv-form-input', + notes = 'qv-form-notes'; + + cy.byId(firstItem) + .should('be.visible') + .click() + .type('{downArrow}') + .blur(); + cy.byId(firstItem) + .should('have.value', 'Cholesterol [Moles/volume] in Serum or Plasma'); + + cy.byId(secondItem) + .click() + .type('{downArrow}') + .type('{downArrow}') + .blur(); + cy.byId(secondItem) + .should('have.value', 'Cholesterol/Triglyceride [Mass Ratio] in Serum or Plasma'); + + // input panel is not shown + cy.byId(inputPanel) + .should('not.be.visible'); + + cy.byId(notes) + .should('contain.text', '/questionnaire-use-package.json') + .should('contain.text', '/package-no-index.json.tgz'); + }); + }); +}); diff --git a/test/cypress/e2e/with_fhir_server.spec.js b/test/cypress/e2e/with_fhir_server.spec.js new file mode 100644 index 0000000..9920002 --- /dev/null +++ b/test/cypress/e2e/with_fhir_server.spec.js @@ -0,0 +1,301 @@ +const firstStatusListItem = 'Requires revalidation'; // for some reason this changed + +/** + * Wait for the Prefetch autocomplete filtered results to update, + * so the first result contains text typed in the autocomplete. + * @param text text typed in the autocomplete + */ +function waitForFirstResultToContain(text) { + cy.get('#searchResults li:first-child, #searchResults tr:first-child') + .should('contain.text', text); +} + +describe('FHIR Questionnaire Viewer with a specified FHIR server: ', () => { + describe('URLs provided on page', () => { + beforeEach(() => { + cy.visit('/'); + }); + + it('should load a Questionnaire without a FHIR server', () => { + const urlQ = 'urlQuestionnaire', + urlS = 'urlFhirServer', + radioFhirServer = 'radioFhirServer', + firstItem = 'listSelection/1', + secondItem = 'listViewFromURL/1', + thirdItem = 'listViewFromContext/1', + btn = 'qv-btn-load', + notes = 'qv-form-notes'; + + cy.byId(radioFhirServer) + .click(); + cy.byId(urlQ) + .clear() + .type(Cypress.config().baseUrl + '/x-fhir-query-test.R4.json'); + cy.byId(btn) + .click(); + + // 1st run + cy.byId(firstItem) + .should('be.visible') + .type('{downArrow}') + .type('{enter}'); + cy.byId(firstItem) + .should('have.value', 'verificationresult-status'); + cy.byId(secondItem) + .click(); + // Wait for the autocomplete results to settle down before typing "Requires". + // Otherwise, there were intermittent failures where the autocomplete ends up + // with the full list displayed AFTER "Requires" is typed in the field. + waitForFirstResultToContain('Attested'); + cy.byId(secondItem) + .type('Requires'); + waitForFirstResultToContain('Requires'); + cy.byId(secondItem) + .type('{downArrow}') + .type('{enter}'); + cy.byId(secondItem) + .should('have.value', firstStatusListItem); + cy.byId(thirdItem) + .type('{downArrow}') + .type('{enter}'); + cy.byId(thirdItem) + .should('have.value', ''); + + // 2nd run + cy.byId(firstItem) + .type('{downArrow}') + .type('{downArrow}') + .type('{enter}'); + cy.byId(firstItem) + .should('have.value', 'language-preference-type'); + cy.byId(secondItem) + .type('{downArrow}') + .type('{downArrow}') + .type('{enter}'); + cy.byId(secondItem) + .should('have.value', 'verbal'); + cy.byId(thirdItem) + .type('{downArrow}') + .type('{enter}'); + cy.byId(thirdItem) + .should('have.value', ''); + + cy.byId(notes) + .should('contain.text', '/x-fhir-query-test.R4.json'); + }); + + it('should load a Questionnaire with a FHIR server', () => { + const urlQ = 'urlQuestionnaire', + urlS = 'urlFhirServer', + radioFhirServer = 'radioFhirServer', + firstItem = 'listSelection/1', + secondItem = 'listViewFromURL/1', + thirdItem = 'listViewFromContext/1', + btn = 'qv-btn-load', + notes = 'qv-form-notes'; + + cy.byId(radioFhirServer) + .click(); + cy.byId(urlQ) + .clear() + .type(Cypress.config().baseUrl + '/x-fhir-query-test.R4.json'); + cy.byId(urlS) + .clear() + .type('https://lforms-fhir.nlm.nih.gov/baseR4'); + cy.byId(btn) + .click(); + + // 1st run + cy.byId(firstItem) + .should('be.visible') + .type('{downArrow}') + .type('{enter}'); + cy.byId(firstItem) + .should('have.value', 'verificationresult-status'); + cy.byId(secondItem) + .click(); + waitForFirstResultToContain('Attested'); + cy.byId(secondItem) + .type('Requires'); + waitForFirstResultToContain('Requires'); + cy.byId(secondItem) + .type('{downArrow}') + .type('{enter}'); + cy.byId(secondItem) + .should('have.value', firstStatusListItem); + cy.byId(thirdItem) + .click(); + waitForFirstResultToContain('Attested'); + cy.byId(thirdItem) + .type('Requires'); + waitForFirstResultToContain('Requires'); + cy.byId(thirdItem) + .type('{downArrow}') + .type('{enter}'); + cy.byId(thirdItem) + .should('have.value', firstStatusListItem); + + // 2nd run + cy.byId(firstItem) + .type('{downArrow}') + .type('{downArrow}') + .type('{enter}'); + cy.byId(firstItem) + .should('have.value', 'language-preference-type'); + cy.byId(secondItem) + .type('{downArrow}') + .type('{downArrow}') + .type('{enter}'); + cy.byId(secondItem) + .should('have.value', 'verbal'); + cy.byId(thirdItem) + .type('{downArrow}') + .type('{downArrow}') + .type('{enter}'); + cy.byId(thirdItem) + .should('have.value', 'verbal'); + + cy.byId(notes) + .should('contain.text', '/x-fhir-query-test.R4.json') + .should('contain.text', 'https://lforms-fhir.nlm.nih.gov/baseR4'); + }); + }); + + describe('URLs provided as url parameters', () => { + Cypress.on('uncaught:exception', (err, runnable) => { + // Returning false here prevents Cypress from + // failing the test from console errors of the app. + return false; + }); + + it('should load a Questionnaire without a FHIR server', () => { + const url = Cypress.config().baseUrl + '/?q=' + Cypress.config().baseUrl + '/x-fhir-query-test.R4.json'; + cy.visit(url); + + const firstItem = 'listSelection/1', + secondItem = 'listViewFromURL/1', + thirdItem = 'listViewFromContext/1', + notes = 'qv-form-notes', + inputPanel = 'qv-form-input'; + + // 1st run + cy.byId(firstItem) + .should('be.visible') + .type('{downArrow}') + .type('{enter}'); + cy.byId(firstItem) + .should('have.value', 'verificationresult-status'); + cy.byId(secondItem) + .click(); + waitForFirstResultToContain('Attested'); + cy.byId(secondItem) + .type('Requires'); + waitForFirstResultToContain('Requires'); + cy.byId(secondItem) + .type('{downArrow}') + .type('{enter}'); + cy.byId(secondItem) + .should('have.value', firstStatusListItem); + cy.byId(thirdItem) + .type('{downArrow}') + .type('{enter}'); + cy.byId(thirdItem) + .should('have.value', ''); + + // 2nd run + cy.byId(firstItem) + .type('{downArrow}') + .type('{downArrow}') + .type('{enter}'); + cy.byId(firstItem) + .should('have.value', 'language-preference-type'); + cy.byId(secondItem) + .type('{downArrow}') + .type('{downArrow}') + .type('{enter}'); + cy.byId(secondItem) + .should('have.value', 'verbal'); + cy.byId(thirdItem) + .type('{downArrow}') + .type('{enter}'); + cy.byId(thirdItem) + .should('have.value', ''); + + cy.byId(notes) + .should('contain.text', '/x-fhir-query-test.R4.json'); + + // input panel is not shown + cy.byId(inputPanel) + .should('not.be.visible'); + }); + + it('should load a Questionnaire with a FHIR server', () => { + const url = Cypress.config().baseUrl + '/?q=' + Cypress.config().baseUrl + '/x-fhir-query-test.R4.json' + '&s=https://lforms-fhir.nlm.nih.gov/baseR4'; + cy.visit(url); + + const firstItem = 'listSelection/1', + secondItem = 'listViewFromURL/1', + thirdItem = 'listViewFromContext/1', + inputPanel = 'qv-form-input', + notes = 'qv-form-notes'; + + // 1st run + cy.byId(firstItem) + .should('be.visible') + .type('{downArrow}') + .type('{enter}'); + cy.byId(firstItem) + .should('have.value', 'verificationresult-status'); + cy.byId(secondItem) + .click(); + waitForFirstResultToContain('Attested'); + cy.byId(secondItem) + .type('Requires'); + waitForFirstResultToContain('Requires'); + cy.byId(secondItem) + .type('{downArrow}') + .type('{enter}'); + cy.byId(secondItem) + .should('have.value', firstStatusListItem); + cy.byId(thirdItem) + .click(); + waitForFirstResultToContain('Attested'); + cy.byId(thirdItem) + .type('Requires'); + waitForFirstResultToContain('Requires'); + cy.byId(thirdItem) + .type('{downArrow}') + .type('{enter}'); + cy.byId(thirdItem) + .should('have.value', firstStatusListItem); + + // 2nd run + cy.byId(firstItem) + .type('{downArrow}') + .type('{downArrow}') + .type('{enter}'); + cy.byId(firstItem) + .should('have.value', 'language-preference-type'); + cy.byId(secondItem) + .type('{downArrow}') + .type('{downArrow}') + .type('{enter}'); + cy.byId(secondItem) + .should('have.value', 'verbal'); + cy.byId(thirdItem) + .type('{downArrow}') + .type('{downArrow}') + .type('{enter}'); + cy.byId(thirdItem) + .should('have.value', 'verbal'); + + cy.byId(notes) + .should('contain.text', '/x-fhir-query-test.R4.json') + .should('contain.text', 'https://lforms-fhir.nlm.nih.gov/baseR4'); + + // input panel is not shown + cy.byId(inputPanel) + .should('not.be.visible'); + }); + }); +}); diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js new file mode 100644 index 0000000..91ca7e2 --- /dev/null +++ b/test/cypress/support/commands.js @@ -0,0 +1,56 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) + +// Get one or more DOM elements by element's id where '/' and '.' is escaped +// and "#" is added if not already present. +Cypress.Commands.add( + 'byId', + { prevSubject: 'optional' }, + (subject, idSelector) => { + // escape the / and . in the id + const escapedSelector = idSelector.replace(/\//g,"\\/").replace(/\./g,"\\."); + const cySelector = escapedSelector[0] === "#" ? escapedSelector : "#" + escapedSelector; + if (subject) { + return cy.wrap(subject).get(cySelector); + } + else { + return cy.get(cySelector); + } + } +); + +// unhide the file input element, upload a file and hide the file input element +Cypress.Commands.add( + 'uploadFile', + { prevSubject: 'element' }, + (subject, filePathName) => { + // Temporarily unhide the file input element. + cy.get(subject).invoke('attr', 'class', ''); + cy.get(subject).selectFile(filePathName); + // Re-hide the file input element + cy.get(subject).invoke('attr', 'class', 'hide'); + } +); diff --git a/test/cypress/support/e2e.js b/test/cypress/support/e2e.js new file mode 100644 index 0000000..d1dd135 --- /dev/null +++ b/test/cypress/support/e2e.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/e2e.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') diff --git a/test/e2e/error_handling.spec.js b/test/e2e/error_handling.spec.js deleted file mode 100644 index edf373d..0000000 --- a/test/e2e/error_handling.spec.js +++ /dev/null @@ -1,337 +0,0 @@ -'use strict'; - -const { $, browser } = require("protractor"); - -const os = require("os"), - EC = protractor.ExpectedConditions; - -describe('FHIR Questionnaire Viewer', function() { - - describe('Error handling when URLs are provided on page', function() { - beforeAll(function () { - setAngularSite(false); - }); - - beforeEach(function () { - browser.get('/'); - - }); - - let error = element(by.id('qv-error')); - let info = element(by.id('qv-form-info')); - let warning = element(by.id('qv-form-warning')); - let btnWarning = element(by.id('qv-btn-show-warning')); - - function loadQuestionnaire(qFileName, pFileName) { - let urlQ = element(by.id('urlQuestionnaire')), - urlP = element(by.id('urlPackage')), - firstItem = element(by.id('/q1/1')), - btn = element(by.id('qv-btn-load')); - - urlQ.clear(); - urlQ.sendKeys(browser.baseUrl + '/' + qFileName); - - if (pFileName) { - urlP.clear(); - urlP.sendKeys(browser.baseUrl + '/' + pFileName) - } - btn.click(); - - } - - it('should show no errors initially', function () { - expect(error.isDisplayed()).toBeFalsy(); - expect(info.isDisplayed()).toBeFalsy(); - }); - - it('should show no errors when a Questionnaire is loaded', function () { - loadQuestionnaire("questionnaire-use-package.json") - expect(info.getText()).toContain("questionnaire-use-package.json") - expect(error.isDisplayed()).toBeFalsy(); - - }); - - it('should show no errors when a Questionnaire and a package file are loaded', function () { - loadQuestionnaire("questionnaire-use-package.json", "package.json.tgz") - expect(error.isDisplayed()).toBeFalsy(); - expect(info.getText()).toContain("The following Questionnaire was loaded from"); - expect(info.getText()).toContain("questionnaire-use-package.json") - expect(info.getText()).toContain("with resources from"); - expect(info.getText()).toContain("package.json.tgz"); - - }); - - - it('should show related errors when a Questionnaire URL is empty', function () { - let urlQ = element(by.id('urlQuestionnaire')), - btn = element(by.id('qv-btn-load')); - urlQ.clear(); - btn.click(); - expect(error.isDisplayed()).toBe(true); - expect(error.getText()).toContain("Please provide the URL of a FHIR Questionnaire") - - }); - - it('should show related errors when a Questionnaire failed to load', function () { - loadQuestionnaire("invalid_url.json") - expect(error.isDisplayed()).toBe(true); - expect(error.getText()).toContain("No data returned from") - expect(error.getText()).toContain("invalid_url.json") - - }); - - it('should show related errors when a url for Questionnaire returns a resource that is not a Questionnaire', function () { - loadQuestionnaire("questionnaire-use-package-invalid-not-questionnaire.json") - expect(error.isDisplayed()).toBe(true); - expect(error.getText()).toContain("No Questionnaire (JSON) returned from") - expect(error.getText()).toContain("questionnaire-use-package-invalid-not-questionnaire.json") - - }); - - it('should show related errors when a url for Questionnaire returns a resource that cannot be converted or displayed by LHC-Forms', function () { - loadQuestionnaire("questionnaire-use-package-invalid-cannot-be-imported.json") - expect(error.isDisplayed()).toBe(true); - expect(error.getText()).toContain("cannot be processed by LHC-Forms. Please check if the Questionnaire is valid or if it has features that LHC-Forms does not support yet") - expect(error.getText()).toContain("questionnaire-use-package-invalid-cannot-be-imported.json") - - }); - - it('should show related info message when Questionaire is fine, but the package cannot be fetched', function () { - loadQuestionnaire("questionnaire-use-package.json", "invalid-package-url") - expect(error.isDisplayed()).toBeFalsy(); - expect(info.getText()).toContain("The following Questionnaire was loaded from"); - expect(info.getText()).toContain("questionnaire-use-package.json") - expect(info.getText()).toContain("but failed to fetch the package file from"); - expect(info.getText()).toContain("invalid-package-url"); - - - }); - - it('should show related info message when Questionaire is fine, but the package file cannot be read', function () { - // don't know how to test it yet - }); - - it('should show related info message when Questionaire is fine, but the package file is a corrupted gzip file', function () { - loadQuestionnaire("questionnaire-use-package.json", "package.json.corrupted_gzip.tgz") - expect(error.isDisplayed()).toBeFalsy(); - expect(info.getText()).toContain("The following Questionnaire was loaded from"); - expect(info.getText()).toContain("questionnaire-use-package.json") - expect(info.getText()).toContain("but failed to unzip the package file from"); - expect(info.getText()).toContain("package.json.corrupted_gzip.tgz"); - - }); - - it('should show related info message when Questionaire is fine, but the package file contains a corrupted tar file', function () { - loadQuestionnaire("questionnaire-use-package.json", "package.json.corrupted_tar.tgz") - expect(error.isDisplayed()).toBeFalsy(); - expect(info.getText()).toContain("The following Questionnaire was loaded from"); - expect(info.getText()).toContain("questionnaire-use-package.json") - expect(info.getText()).toContain("but failed to untar the package file from"); - expect(info.getText()).toContain("package.json.corrupted_tar.tgz"); - - }); - - it('should show related info message when Questionaire is fine, but the package file cannot be processed', function () { - // no tests yet - }); - - it('should show warings when a Questionnaire is loaded but answer list are not loaded from urls', function () { - loadQuestionnaire("questionnaire-use-package.json") - expect(info.getText()).toContain("questionnaire-use-package.json") - expect(error.isDisplayed()).toBeFalsy(); - expect(btnWarning.isDisplayed()).toBe(true); - expect(warning.isDisplayed()).toBeFalsy(); - expect(btnWarning.getText()).toContain("Show Warning Messages"); - // show messages - btnWarning.click(); - expect(btnWarning.getText()).toContain("Hide Warning Messages"); - expect(warning.isDisplayed()).toBe(true); - expect(warning.getText()).toContain("http://hl7.org/fhir/ValueSet/example-expansion|20150622"); - expect(warning.getText()).toContain("http://hl7.org/fhir/ValueSet/example-expansion"); - - // hide messages - btnWarning.click(); - expect(btnWarning.getText()).toContain("Show Warning Messages"); - expect(warning.isDisplayed()).toBeFalsy(); - }); - - it('should not show warings when a Questionnaire is loaded with all answer lists', function () { - loadQuestionnaire("questionnaire-use-package.json", "package.json.tgz") - expect(error.isDisplayed()).toBeFalsy(); - expect(btnWarning.isDisplayed()).toBeFalsy(); - expect(warning.isDisplayed()).toBeFalsy(); - expect(info.getText()).toContain("questionnaire-use-package.json") - - }); - }); - - describe('Error handling when URLs are provided as url parameters', function() { - beforeAll(function () { - setAngularSite(false); - }); - - beforeEach(function () { - browser.get('/'); - - }); - - let error = element(by.id('qv-error')); - let info = element(by.id('qv-form-info')); - let inputs = element(by.id('qv-form-input-settings')); - let warning = element(by.id('qv-form-warning')); - let btnWarning = element(by.id('qv-btn-show-warning')); - - function loadQuestionnaire(qFileName, pFileName) { - - - let url = browser.baseUrl + '/?q=' + browser.baseUrl + '/' + qFileName; - if (pFileName) { - url += '&p=' + browser.baseUrl + '/' + pFileName; - } - browser.get(url); - - } - - - it('should show no errors and no inputs when a Questionnaire is loaded', function () { - loadQuestionnaire("questionnaire-use-package.json") - expect(info.getText()).toContain("questionnaire-use-package.json") - expect(error.isDisplayed()).toBeFalsy(); - expect(inputs.isDisplayed()).toBeFalsy(); - - }); - - it('should show no errors when a Questionnaire and a package file are loaded', function () { - loadQuestionnaire("questionnaire-use-package.json", "package.json.tgz") - expect(error.isDisplayed()).toBeFalsy(); - expect(info.getText()).toContain("The following Questionnaire was loaded from"); - expect(info.getText()).toContain("questionnaire-use-package.json") - expect(info.getText()).toContain("with resources from"); - expect(info.getText()).toContain("package.json.tgz"); - expect(inputs.isDisplayed()).toBeFalsy(); - - }); - - it('should show related errors when a Questionnaire failed to load', function () { - loadQuestionnaire("invalid_url.json") - expect(error.isDisplayed()).toBe(true); - expect(error.getText()).toContain("No data returned from") - expect(error.getText()).toContain("invalid_url.json") - expect(inputs.isDisplayed()).toBeFalsy(); - - }); - - it('should show related errors when a url for Questionnaire returns a resource that is not a Questionnaire', function () { - loadQuestionnaire("questionnaire-use-package-invalid-not-questionnaire.json") - expect(error.isDisplayed()).toBe(true); - expect(error.getText()).toContain("No Questionnaire (JSON) returned from") - expect(error.getText()).toContain("questionnaire-use-package-invalid-not-questionnaire.json") - expect(inputs.isDisplayed()).toBeFalsy(); - - }); - - it('should show related errors when a url for Questionnaire returns a resource that cannot be converted or displayed by LHC-Forms', function () { - loadQuestionnaire("questionnaire-use-package-invalid-cannot-be-imported.json") - expect(error.isDisplayed()).toBe(true); - expect(error.getText()).toContain("cannot be processed by LHC-Forms. Please check if the Questionnaire is valid or if it has features that LHC-Forms does not support yet") - expect(error.getText()).toContain("questionnaire-use-package-invalid-cannot-be-imported.json") - expect(inputs.isDisplayed()).toBeFalsy(); - - }); - - it('should show related info message when Questionaire is fine, but the package cannot be fetched', function () { - loadQuestionnaire("questionnaire-use-package.json", "invalid-package-url") - expect(error.isDisplayed()).toBeFalsy(); - expect(info.getText()).toContain("The following Questionnaire was loaded from"); - expect(info.getText()).toContain("questionnaire-use-package.json") - expect(info.getText()).toContain("but failed to fetch the package file from"); - expect(info.getText()).toContain("invalid-package-url"); - expect(inputs.isDisplayed()).toBeFalsy(); - - }); - - it('should show related info message when Questionaire is fine, but the package file cannot be read', function () { - // don't know how to test it yet - }); - - it('should show related info message when Questionaire is fine, but the package file is a corrupted gzip file', function () { - loadQuestionnaire("questionnaire-use-package.json", "package.json.corrupted_gzip.tgz") - expect(error.isDisplayed()).toBeFalsy(); - expect(info.getText()).toContain("The following Questionnaire was loaded from"); - expect(info.getText()).toContain("questionnaire-use-package.json") - expect(info.getText()).toContain("but failed to unzip the package file from"); - expect(info.getText()).toContain("package.json.corrupted_gzip.tgz"); - expect(inputs.isDisplayed()).toBeFalsy(); - - }); - - it('should show related info message when Questionaire is fine, but the package file contains a corrupted tar file', function () { - loadQuestionnaire("questionnaire-use-package.json", "package.json.corrupted_tar.tgz") - expect(error.isDisplayed()).toBeFalsy(); - expect(info.getText()).toContain("The following Questionnaire was loaded from"); - expect(info.getText()).toContain("questionnaire-use-package.json") - expect(info.getText()).toContain("but failed to untar the package file from"); - expect(info.getText()).toContain("package.json.corrupted_tar.tgz"); - expect(inputs.isDisplayed()).toBeFalsy(); - - }); - - it('should show related info message when Questionaire is fine, but the package file cannot be processed', function () { - // no tests yet - }); - - it('should show warings when a R4 Questionnaire is loaded but answer list are not loaded from urls', function () { - loadQuestionnaire("questionnaire-use-package.json") - expect(info.getText()).toContain("questionnaire-use-package.json") - expect(error.isDisplayed()).toBeFalsy(); - expect(btnWarning.isDisplayed()).toBe(true); - expect(warning.isDisplayed()).toBeFalsy(); - expect(btnWarning.getText()).toContain("Show Warning Messages"); - // show messages - btnWarning.click(); - expect(btnWarning.getText()).toContain("Hide Warning Messages"); - expect(warning.isDisplayed()).toBe(true); - expect(warning.getText()).toContain("http://hl7.org/fhir/ValueSet/example-expansion|20150622"); - expect(warning.getText()).toContain("http://hl7.org/fhir/ValueSet/example-expansion"); - - // hide messages - btnWarning.click(); - expect(btnWarning.getText()).toContain("Show Warning Messages"); - expect(warning.isDisplayed()).toBeFalsy(); - }); - - it('should show warings when a STU3 Questionnaire is loaded but answer list are not loaded from urls', function () { - loadQuestionnaire("4712701.json") - expect(info.getText()).toContain("4712701.json") - expect(error.isDisplayed()).toBeFalsy(); - expect(btnWarning.isDisplayed()).toBe(true); - expect(warning.isDisplayed()).toBeFalsy(); - expect(btnWarning.getText()).toContain("Show Warning Messages"); - // show messages - btnWarning.click(); - expect(btnWarning.getText()).toContain("Hide Warning Messages"); - expect(warning.isDisplayed()).toBe(true); - expect(warning.getText()).toContain("http://hl7.org/fhir/ValueSet/v3-ActEncounterCode"); // 1st message - expect(warning.getText()).toContain("http://uni-koeln.de/fhir/ValueSet/ecog"); // 2nd message - expect(warning.getText()).toContain("http://uni-koeln.de/fhir/ValueSet/icd-o-3-m-lunge"); // 3rd message - expect(warning.getText()).toContain("http://uni-koeln.de/fhir/ValueSet/uicc-lunge"); // 11th message - - // hide messages - btnWarning.click(); - expect(btnWarning.getText()).toContain("Show Warning Messages"); - expect(warning.isDisplayed()).toBeFalsy(); - }); - - it('should not show warings when a Questionnaire is loaded with all answer lists', function () { - loadQuestionnaire("questionnaire-use-package.json", "package.json.tgz") - expect(error.isDisplayed()).toBeFalsy(); - expect(error.isDisplayed()).toBeFalsy(); - expect(btnWarning.isDisplayed()).toBeFalsy(); - expect(warning.isDisplayed()).toBeFalsy(); - expect(info.getText()).toContain("questionnaire-use-package.json") - }); - - }); - -}); - diff --git a/test/e2e/main.spec.js b/test/e2e/main.spec.js deleted file mode 100644 index c923496..0000000 --- a/test/e2e/main.spec.js +++ /dev/null @@ -1,263 +0,0 @@ -'use strict'; - -const { $, browser } = require("protractor"); - -const os = require("os"), - EC = protractor.ExpectedConditions; - -describe('FHIR Questionnaire Viewer', function() { - - describe('URLs provided on page', function() { - beforeAll(function () { - setAngularSite(false); - }); - - beforeEach(function () { - browser.get('/'); - }); - - it('should load a Questionnaire without resource package', function () { - let urlQ = element(by.id('urlQuestionnaire')), - urlP = element(by.id('urlPackage')), - firstItem = element(by.id('/q1/1')), - btn = element(by.id('qv-btn-load')), - notes = element(by.id('qv-form-notes')); - - urlQ.clear(); - urlQ.sendKeys(browser.baseUrl + '/questionnaire-use-package.json'); - btn.click(); - browser.wait(EC.visibilityOf(firstItem)); - firstItem.click(); - // expect(firstItem.searchResults.isPresent()).toBeFalsy(); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.TAB); - expect(firstItem.getAttribute('value')).toBe(''); - - expect(notes.getText()).toContain('/questionnaire-use-package.json'); - - }); - - it('should load both R4 and STU3 versions of Questionnaire', function () { - let urlQ = element(by.id('urlQuestionnaire')), - urlP = element(by.id('urlPackage')), - dropdown = element(by.id('/8352-7/1')), - btn = element(by.id('qv-btn-load')), - notes = element(by.id('qv-form-notes')); - - // r4 - urlQ.clear(); - urlQ.sendKeys(browser.baseUrl + '/weightHeightQuestionnaire_r4.json'); - btn.click(); - browser.wait(EC.visibilityOf(dropdown)); - dropdown.click(); - dropdown.sendKeys(protractor.Key.ARROW_DOWN); - dropdown.sendKeys(protractor.Key.TAB); - expect(dropdown.getAttribute('value')).toBe('Underwear or less'); - expect(notes.getText()).toContain('/weightHeightQuestionnaire_r4.json'); - - // stu3 - urlQ.clear(); - urlQ.sendKeys(browser.baseUrl + '/weightHeightQuestionnaire_stu3.json'); - btn.click(); - browser.wait(EC.visibilityOf(dropdown)); - dropdown.click(); - dropdown.sendKeys(protractor.Key.ARROW_DOWN); - dropdown.sendKeys(protractor.Key.TAB); - expect(dropdown.getAttribute('value')).toBe('Underwear or less'); - expect(notes.getText()).toContain('/weightHeightQuestionnaire_stu3.json'); - }); - - - it('should load a Questionnaire with a resource package', function () { - let urlQ = element(by.id('urlQuestionnaire')), - urlP = element(by.id('urlPackage')), - firstItem = element(by.id('/q1/1')), - secondItem = element(by.id('/q2/1')), - thirdItem = element(by.id('/q3/1')), - btn = element(by.id('qv-btn-load')), - notes = element(by.id('qv-form-notes')); - - urlQ.clear(); - urlQ.sendKeys(browser.baseUrl + '/questionnaire-use-package.json'); - urlP.clear(); - urlP.sendKeys(browser.baseUrl + '/package.json.tgz'); - btn.click(); - browser.wait(EC.visibilityOf(firstItem)); - - firstItem.click(); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.TAB); - expect(firstItem.getAttribute('value')).toBe("Cholesterol [Moles/volume] in Serum or Plasma"); - - secondItem.click(); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.TAB); - expect(secondItem.getAttribute('value')).toBe("Cholesterol/Triglyceride [Mass Ratio] in Serum or Plasma"); - - expect(notes.getText()).toContain('/questionnaire-use-package.json'); - expect(notes.getText()).toContain('/package.json.tgz'); - }); - - it('should load a Questionnaire with a resource package that contains no .index.json', function () { - let urlQ = element(by.id('urlQuestionnaire')), - urlP = element(by.id('urlPackage')), - firstItem = element(by.id('/q1/1')), - secondItem = element(by.id('/q2/1')), - thirdItem = element(by.id('/q3/1')), - btn = element(by.id('qv-btn-load')), - notes = element(by.id('qv-form-notes')); - - urlQ.clear(); - urlQ.sendKeys(browser.baseUrl + '/questionnaire-use-package.json'); - urlP.clear(); - urlP.sendKeys(browser.baseUrl + '/package-no-index.json.tgz'); - btn.click(); - browser.wait(EC.visibilityOf(firstItem)); - - firstItem.click(); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.TAB); - expect(firstItem.getAttribute('value')).toBe("Cholesterol [Moles/volume] in Serum or Plasma"); - - secondItem.click(); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.TAB); - expect(secondItem.getAttribute('value')).toBe("Cholesterol/Triglyceride [Mass Ratio] in Serum or Plasma"); - - expect(notes.getText()).toContain('/questionnaire-use-package.json'); - expect(notes.getText()).toContain('/package-no-index.json.tgz'); - }); - }); - - - describe('URLs provided as url parameters', function() { - beforeAll(function () { - setAngularSite(false); - }); - - beforeEach(function () { - browser.get('/'); - }); - - - it('should load a Questionnaire without resource package', function () { - - let notes = element(by.id('qv-form-notes')); - - let url = browser.baseUrl + '/?q=' + browser.baseUrl + '/questionnaire-use-package.json'; - console.log(url); - browser.get(url); - - let firstItem = element(by.id('/q1/1')), - inputPanel = element(by.id('qv-form-input')); - - browser.wait(EC.visibilityOf(firstItem)); - firstItem.click(); - // expect(firstItem.searchResults.isPresent()).toBeFalsy(); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.TAB); - expect(firstItem.getAttribute('value')).toBe(''); - - // input panel is not shown - expect(inputPanel.isDisplayed()).toBeFalsy(); - - expect(notes.getText()).toContain('/questionnaire-use-package.json'); - - }); - - it('should load both R4 and STU3 versions of Questionnaire', function () { - let dropdown = element(by.id('/8352-7/1')), - notes = element(by.id('qv-form-notes')); - - let url = browser.baseUrl + '/?q=' + browser.baseUrl + '/weightHeightQuestionnaire_r4.json'; - browser.get(url); - - // r4 - browser.wait(EC.visibilityOf(dropdown)); - dropdown.click(); - dropdown.sendKeys(protractor.Key.ARROW_DOWN); - dropdown.sendKeys(protractor.Key.TAB); - expect(dropdown.getAttribute('value')).toBe('Underwear or less'); - expect(notes.getText()).toContain('/weightHeightQuestionnaire_r4.json'); - - // stu3 - url = browser.baseUrl + '/?q=' + browser.baseUrl + '/weightHeightQuestionnaire_stu3.json'; - browser.get(url); - - browser.wait(EC.visibilityOf(dropdown)); - dropdown.click(); - dropdown.sendKeys(protractor.Key.ARROW_DOWN); - dropdown.sendKeys(protractor.Key.TAB); - expect(dropdown.getAttribute('value')).toBe('Underwear or less'); - expect(notes.getText()).toContain('/weightHeightQuestionnaire_stu3.json'); - }); - - - - it('should load a Questionnaire with a resource package', function () { - let url = browser.baseUrl + '/?q=' + browser.baseUrl + '/questionnaire-use-package.json' + '&p=' + browser.baseUrl + '/package.json.tgz'; - console.log(url); - browser.get(url); - - let firstItem = element(by.id('/q1/1')), - secondItem = element(by.id('/q2/1')), - thirdItem = element(by.id('/q3/1')), - inputPanel = element(by.id('qv-form-input')), - notes = element(by.id('qv-form-notes')); - - browser.wait(EC.visibilityOf(firstItem)); - - firstItem.click(); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.TAB); - expect(firstItem.getAttribute('value')).toBe("Cholesterol [Moles/volume] in Serum or Plasma"); - - secondItem.click(); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.TAB); - expect(secondItem.getAttribute('value')).toBe("Cholesterol/Triglyceride [Mass Ratio] in Serum or Plasma"); - - // input panel is not shown - expect(inputPanel.isDisplayed()).toBeFalsy(); - - expect(notes.getText()).toContain('/questionnaire-use-package.json'); - expect(notes.getText()).toContain('/package.json.tgz'); - }); - - it('should load a Questionnaire with a resource package that contains no .index.json', function () { - let url = browser.baseUrl + '/?q=' + browser.baseUrl + '/questionnaire-use-package.json' + '&p=' + browser.baseUrl + '/package-no-index.json.tgz'; - console.log(url); - browser.get(url); - - let firstItem = element(by.id('/q1/1')), - secondItem = element(by.id('/q2/1')), - thirdItem = element(by.id('/q3/1')), - inputPanel = element(by.id('qv-form-input')), - notes = element(by.id('qv-form-notes')); - - browser.wait(EC.visibilityOf(firstItem)); - - firstItem.click(); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.TAB); - expect(firstItem.getAttribute('value')).toBe("Cholesterol [Moles/volume] in Serum or Plasma"); - - secondItem.click(); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.TAB); - expect(secondItem.getAttribute('value')).toBe("Cholesterol/Triglyceride [Mass Ratio] in Serum or Plasma"); - - // input panel is not shown - expect(inputPanel.isDisplayed()).toBeFalsy(); - - expect(notes.getText()).toContain('/questionnaire-use-package.json'); - expect(notes.getText()).toContain('/package-no-index.json.tgz'); - }); - }); - -}); - diff --git a/test/e2e/protractor.conf.js b/test/e2e/protractor.conf.js deleted file mode 100644 index 5e91eb0..0000000 --- a/test/e2e/protractor.conf.js +++ /dev/null @@ -1,116 +0,0 @@ -// Protractor configuration -// https://github.com/angular/protractor/blob/master/referenceConf.js - -'use strict'; - -const os = require("os"); - -exports.config = { - // The timeout for each script run on the browser. This should be longer - // than the maximum time your application needs to stabilize between tasks. - allScriptsTimeout: 110000, - - // A base URL for your application under test. Calls to protractor.get() - // with relative paths will be prepended with this. - baseUrl: 'http://localhost:4029', - - // If true, only chromedriver will be started, not a standalone selenium. - // Tests for browsers other than chrome will not run. - // directConnect: true, - - // list of files / patterns to load in the browser - specs: [ - './**/*.spec.js' // relative to this file - ], - - // Patterns to exclude. - exclude: [], - - // ----- Capabilities to be passed to the webdriver instance ---- - // - // For a full list of available capabilities, see - // https://github.com/SeleniumHQ/selenium/blob/master/javascript/webdriver/capabilities.js - capabilities: { - 'browserName': 'chrome', - 'chromeOptions': { - // Set download path and avoid prompting for download even though - // this is already the default on Chrome but for completeness - prefs: { - 'download': { - 'prompt_for_download': false, - 'default_directory': os.tmpdir(), - 'directory_upgrade': true - } - } - } - }, - - // Fix the port number so we can restrict access to it via iptables - seleniumPort: 4444, - - // ----- The test framework ----- - // - // Jasmine and Cucumber are fully supported as a test and assertion framework. - // Mocha has limited beta support. You will need to include your own - // assertion framework if working with mocha. - framework: 'jasmine2', - - // ----- Options to be passed to minijasminenode ----- - // - // See the full list at https://github.com/juliemr/minijasminenode - jasmineNodeOpts: { - defaultTimeoutInterval: 30000, - print: function() {} - }, - - onPrepare: function(){ - /** - * By default, protracotor expects it to be angular application. This is used - * to switch between angular and non angular sites. - * - * @param {Boolean} flag - * @returns {Void} - */ - global.setAngularSite = function(flag){ - browser.ignoreSynchronization = !flag; - }; - - // disable animation - // http://stackoverflow.com/questions/26584451/how-to-disable-animations-in-protractor-for-angular-js-appliction - var disableNgAnimate = function() { - angular - .module('disableNgAnimate', []) - .run(['$animate', function($animate) { - $animate.enabled(false); - }]); - }; - - var disableCssAnimate = function() { - angular - .module('disableCssAnimate', []) - .run(function() { - var style = document.createElement('style'); - style.type = 'text/css'; - style.innerHTML = '* {' + - '-webkit-transition: none !important;' + - '-moz-transition: none !important' + - '-o-transition: none !important' + - '-ms-transition: none !important' + - 'transition: none !important' + - '}'; - document.getElementsByTagName('head')[0].appendChild(style); - }); - }; - - // disable ng-animate during the testing - browser.addMockModule('disableNgAnimate', disableNgAnimate); - browser.addMockModule('disableCssAnimate', disableCssAnimate); - - // Replace default dot reporter with something better. - var SpecReporter = require('jasmine-spec-reporter').SpecReporter; - // add jasmine spec reporter - jasmine.getEnv().addReporter(new SpecReporter({summary:{displayStacktrace: true}})); - - } - -}; diff --git a/test/e2e/with_fhir_server.spec.js b/test/e2e/with_fhir_server.spec.js deleted file mode 100644 index 828902d..0000000 --- a/test/e2e/with_fhir_server.spec.js +++ /dev/null @@ -1,258 +0,0 @@ -'use strict'; - -const { $, browser } = require("protractor"); - -const os = require("os"), - EC = protractor.ExpectedConditions; - -const firstStatusListItem = 'Requires revalidation'; // for some reason this changed - -describe('FHIR Questionnaire Viewer with a specified FHIR server: ', function() { - - describe('URLs provided on page', function() { - beforeAll(function () { - setAngularSite(false); - }); - - beforeEach(function () { - browser.get('/'); - }); - - it('should load a Questionnaire without a FHIR server', function () { - let urlQ = element(by.id('urlQuestionnaire')), - urlS = element(by.id('urlFhirServer')), - radioFhirServer = element(by.id('radioFhirServer')), - firstItem = element(by.id('listSelection/1')), - secondItem = element(by.id('listViewFromURL/1')), - thirdItem = element(by.id('listViewFromContext/1')), - btn = element(by.id('qv-btn-load')), - notes = element(by.id('qv-form-notes')); - - radioFhirServer.click(); - urlQ.clear(); - urlQ.sendKeys(browser.baseUrl + '/x-fhir-query-test.R4.json'); - btn.click(); - - browser.wait(EC.visibilityOf(firstItem)); - - // 1st run - firstItem.click(); - // expect(firstItem.searchResults.isPresent()).toBeFalsy(); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.TAB); - expect(firstItem.getAttribute('value')).toBe('verificationresult-status'); - secondItem.click(); - secondItem.sendKeys("Requires") - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.TAB); - expect(secondItem.getAttribute('value')).toBe(firstStatusListItem); - thirdItem.click(); - thirdItem.sendKeys(protractor.Key.ARROW_DOWN); - thirdItem.sendKeys(protractor.Key.TAB); - expect(thirdItem.getAttribute('value')).toBe(''); - - // 2nd run - firstItem.click(); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.TAB); - expect(firstItem.getAttribute('value')).toBe('language-preference-type'); - secondItem.click(); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.TAB); - expect(secondItem.getAttribute('value')).toBe('verbal'); - thirdItem.click(); - thirdItem.sendKeys(protractor.Key.ARROW_DOWN); - thirdItem.sendKeys(protractor.Key.TAB); - expect(thirdItem.getAttribute('value')).toBe(''); - - - expect(notes.getText()).toContain('/x-fhir-query-test.R4.json'); - - }); - - - - it('should load a Questionnaire with a FHIR server', function () { - let urlQ = element(by.id('urlQuestionnaire')), - urlS = element(by.id('urlFhirServer')), - radioFhirServer = element(by.id('radioFhirServer')), - firstItem = element(by.id('listSelection/1')), - secondItem = element(by.id('listViewFromURL/1')), - thirdItem = element(by.id('listViewFromContext/1')), - - btn = element(by.id('qv-btn-load')), - notes = element(by.id('qv-form-notes')); - - radioFhirServer.click(); - urlQ.clear(); - urlQ.sendKeys(browser.baseUrl + '/x-fhir-query-test.R4.json'); - urlS.clear(); - urlS.sendKeys('https://lforms-fhir.nlm.nih.gov/baseR4'); - btn.click(); - -// browser.sleep(1000000) - browser.wait(EC.visibilityOf(firstItem)); - // 1st run - firstItem.click(); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.TAB); - expect(firstItem.getAttribute('value')).toBe('verificationresult-status'); - secondItem.click(); - secondItem.sendKeys("Requires") - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.TAB); - expect(secondItem.getAttribute('value')).toBe(firstStatusListItem); - thirdItem.click(); - thirdItem.sendKeys("Requires") - thirdItem.sendKeys(protractor.Key.ARROW_DOWN); - thirdItem.sendKeys(protractor.Key.TAB); - expect(thirdItem.getAttribute('value')).toBe(firstStatusListItem); - - // 2nd run - firstItem.click(); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.TAB); - expect(firstItem.getAttribute('value')).toBe('language-preference-type'); - secondItem.click(); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.TAB); - expect(secondItem.getAttribute('value')).toBe('verbal'); - thirdItem.click(); - thirdItem.sendKeys(protractor.Key.ARROW_DOWN); - thirdItem.sendKeys(protractor.Key.ARROW_DOWN); - thirdItem.sendKeys(protractor.Key.TAB); - expect(thirdItem.getAttribute('value')).toBe('verbal'); - - expect(notes.getText()).toContain('/x-fhir-query-test.R4.json'); - expect(notes.getText()).toContain('https://lforms-fhir.nlm.nih.gov/baseR4'); - }); - - }); - - describe('URLs provided as url parameters', function() { - beforeAll(function () { - setAngularSite(false); - }); - - beforeEach(function () { - browser.get('/'); - }); - - it('should load a Questionnaire without a FHIR server', function () { - - let url = browser.baseUrl + '/?q=' + browser.baseUrl + '/x-fhir-query-test.R4.json'; - console.log(url); - browser.get(url); - - let firstItem = element(by.id('listSelection/1')), - secondItem = element(by.id('listViewFromURL/1')), - thirdItem = element(by.id('listViewFromContext/1')), - notes = element(by.id('qv-form-notes')), - inputPanel = element(by.id('qv-form-input')); - - - browser.wait(EC.visibilityOf(firstItem)); - - // 1st run - firstItem.click(); - // expect(firstItem.searchResults.isPresent()).toBeFalsy(); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.TAB); - expect(firstItem.getAttribute('value')).toBe('verificationresult-status'); - secondItem.click(); - secondItem.sendKeys("Requires") - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.TAB); - expect(secondItem.getAttribute('value')).toBe(firstStatusListItem); - thirdItem.click(); - thirdItem.sendKeys(protractor.Key.ARROW_DOWN); - thirdItem.sendKeys(protractor.Key.TAB); - expect(thirdItem.getAttribute('value')).toBe(''); - - // 2nd run - firstItem.click(); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.TAB); - expect(firstItem.getAttribute('value')).toBe('language-preference-type'); - secondItem.click(); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.TAB); - expect(secondItem.getAttribute('value')).toBe('verbal'); - thirdItem.click(); - thirdItem.sendKeys(protractor.Key.ARROW_DOWN); - thirdItem.sendKeys(protractor.Key.TAB); - expect(thirdItem.getAttribute('value')).toBe(''); - - - expect(notes.getText()).toContain('/x-fhir-query-test.R4.json'); - - // input panel is not shown - expect(inputPanel.isDisplayed()).toBeFalsy(); - }); - - - - it('should load a Questionnaire with a FHIR server', function () { - let url = browser.baseUrl + '/?q=' + browser.baseUrl + '/x-fhir-query-test.R4.json' + '&s=https://lforms-fhir.nlm.nih.gov/baseR4'; - console.log(url); - browser.get(url); - - let firstItem = element(by.id('listSelection/1')), - secondItem = element(by.id('listViewFromURL/1')), - thirdItem = element(by.id('listViewFromContext/1')), - inputPanel = element(by.id('qv-form-input')), - notes = element(by.id('qv-form-notes')); - - browser.wait(EC.visibilityOf(firstItem)); - // 1st run - firstItem.click(); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.TAB); - expect(firstItem.getAttribute('value')).toBe('verificationresult-status'); - secondItem.click(); - secondItem.sendKeys("Requires") - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.TAB); - expect(secondItem.getAttribute('value')).toBe(firstStatusListItem); - thirdItem.click(); - thirdItem.sendKeys("Requires") - thirdItem.sendKeys(protractor.Key.ARROW_DOWN); - thirdItem.sendKeys(protractor.Key.TAB); - expect(thirdItem.getAttribute('value')).toBe(firstStatusListItem); - - // 2nd run - firstItem.click(); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.ARROW_DOWN); - firstItem.sendKeys(protractor.Key.TAB); - expect(firstItem.getAttribute('value')).toBe('language-preference-type'); - secondItem.click(); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.ARROW_DOWN); - secondItem.sendKeys(protractor.Key.TAB); - expect(secondItem.getAttribute('value')).toBe('verbal'); - thirdItem.click(); - thirdItem.sendKeys(protractor.Key.ARROW_DOWN); - thirdItem.sendKeys(protractor.Key.ARROW_DOWN); - thirdItem.sendKeys(protractor.Key.TAB); - expect(thirdItem.getAttribute('value')).toBe('verbal'); - - expect(notes.getText()).toContain('/x-fhir-query-test.R4.json'); - expect(notes.getText()).toContain('https://lforms-fhir.nlm.nih.gov/baseR4'); - - // input panel is not shown - expect(inputPanel.isDisplayed()).toBeFalsy(); - }); - - }); - - - -}); -