From d608cf33791cceb5f330270da96b0b2805223208 Mon Sep 17 00:00:00 2001 From: Jan-Niklas W <6104311+niklas-wortmann@users.noreply.github.com> Date: Thu, 28 May 2020 17:23:03 +0200 Subject: [PATCH] Remove 'asDiagram' infrastructure (#5422) * test(marbles): change marble diagram tests to normal tests * docs(testing): hide internal testing document * docs(marbles): add swirly to generate marble diagrams * docs(marbles): inline marble svg * docs(marbles): inline marble svg * build(marbles): create node script to generate marbles based on swirly * build(docs): remove generated marbles from repo * build(docs): cleanup already pushed marble * lint(concatAll): remove trailing whitespace * build(docs-app): fix weird merge issues * docs(marbles): move marble scripts over to docs app * docs(marbles): explicitly specify swirly packages Co-authored-by: Jan-Niklas Wortmann <6104311+JWO719@users.noreply.github.com> --- .github/PULL_REQUEST_TEMPLATE.md | 1 - docs_app/.gitignore | 3 + docs_app/assets/images/svgs/.gitkeep | 0 docs_app/content/guide/operators.md | 2 +- docs_app/content/navigation.json | 90 +- docs_app/package-lock.json | 1006 +++++++++++++---- docs_app/package.json | 19 +- docs_app/tools/marbles/diagrams/concatAll.txt | 11 + docs_app/tools/marbles/scripts/index.ts | 41 + docs_app/tools/marbles/tsconfig.marbles.json | 7 + .../transforms/angular-api-package/index.js | 5 +- .../processors/post-process-html.js | 31 +- package-lock.json | 183 +-- package.json | 5 +- spec/Observable-spec.ts | 9 +- spec/helpers/testScheduler-ui.ts | 14 - spec/helpers/tests2png/diagram-test-runner.ts | 104 -- spec/helpers/tests2png/painter.ts | 421 ------- spec/helpers/tests2png/types.ts | 44 - spec/observables/defer-spec.ts | 5 +- spec/observables/empty-spec.ts | 3 +- spec/observables/forkJoin-spec.ts | 22 +- spec/observables/from-spec.ts | 4 +- spec/observables/fromEvent-spec.ts | 4 +- spec/observables/fromEventPattern-spec.ts | 4 +- spec/observables/generate-spec.ts | 10 +- spec/observables/interval-spec.ts | 3 +- spec/observables/never-spec.ts | 4 +- spec/observables/of-spec.ts | 3 +- spec/observables/pairs-spec.ts | 4 +- spec/observables/partition-spec.ts | 4 +- spec/observables/range-spec.ts | 4 +- spec/observables/throwError-spec.ts | 3 +- spec/observables/timer-spec.ts | 3 +- spec/operators/audit-spec.ts | 4 +- spec/operators/auditTime-spec.ts | 4 +- spec/operators/buffer-spec.ts | 4 +- spec/operators/bufferCount-spec.ts | 4 +- spec/operators/bufferTime-spec.ts | 4 +- spec/operators/bufferToggle-spec.ts | 4 +- spec/operators/bufferWhen-spec.ts | 4 +- spec/operators/catch-spec.ts | 4 +- spec/operators/combineAll-spec.ts | 3 +- spec/operators/combineLatest-legacy-spec.ts | 4 +- spec/operators/concat-spec.ts | 4 +- spec/operators/concatAll-spec.ts | 3 +- spec/operators/concatMap-spec.ts | 4 +- spec/operators/concatMapTo-spec.ts | 5 +- spec/operators/count-spec.ts | 4 +- spec/operators/debounce-spec.ts | 3 +- spec/operators/debounceTime-spec.ts | 4 +- spec/operators/defaultIfEmpty-spec.ts | 4 +- spec/operators/delay-spec.ts | 4 +- spec/operators/delayWhen-spec.ts | 4 +- spec/operators/dematerialize-spec.ts | 4 +- spec/operators/distinctUntilChanged-spec.ts | 4 +- .../operators/distinctUntilKeyChanged-spec.ts | 4 +- spec/operators/elementAt-spec.ts | 4 +- spec/operators/endWith-spec.ts | 4 +- spec/operators/every-spec.ts | 4 +- spec/operators/exhaust-spec.ts | 3 +- spec/operators/exhaustMap-spec.ts | 5 +- spec/operators/expand-spec.ts | 4 +- spec/operators/filter-spec.ts | 4 +- spec/operators/find-spec.ts | 4 +- spec/operators/findIndex-spec.ts | 4 +- spec/operators/first-spec.ts | 4 +- spec/operators/groupBy-spec.ts | 4 +- spec/operators/ignoreElements-spec.ts | 4 +- spec/operators/isEmpty-spec.ts | 4 +- spec/operators/last-spec.ts | 4 +- spec/operators/map-spec.ts | 4 +- spec/operators/mapTo-spec.ts | 4 +- spec/operators/materialize-spec.ts | 4 +- spec/operators/max-spec.ts | 4 +- spec/operators/mergeAll-spec.ts | 3 +- spec/operators/mergeMap-spec.ts | 3 +- spec/operators/mergeMapTo-spec.ts | 4 +- spec/operators/min-spec.ts | 4 +- spec/operators/multicast-spec.ts | 3 +- spec/operators/observeOn-spec.ts | 4 +- spec/operators/onErrorResumeNext-spec.ts | 4 +- spec/operators/pairwise-spec.ts | 4 +- spec/operators/pluck-spec.ts | 4 +- spec/operators/publish-spec.ts | 3 +- spec/operators/publishBehavior-spec.ts | 3 +- spec/operators/publishLast-spec.ts | 3 +- spec/operators/publishReplay-spec.ts | 3 +- spec/operators/reduce-spec.ts | 3 +- spec/operators/refCount-spec.ts | 4 +- spec/operators/repeat-spec.ts | 4 +- spec/operators/repeatWhen-spec.ts | 4 +- spec/operators/retry-spec.ts | 4 +- spec/operators/retryWhen-spec.ts | 4 +- spec/operators/sample-spec.ts | 4 +- spec/operators/sampleTime-spec.ts | 4 +- spec/operators/scan-spec.ts | 5 +- spec/operators/sequenceEqual-spec.ts | 4 +- spec/operators/share-spec.ts | 4 +- spec/operators/shareReplay-spec.ts | 1 - spec/operators/skip-spec.ts | 4 +- spec/operators/skipLast-spec.ts | 4 +- spec/operators/skipUntil-spec.ts | 4 +- spec/operators/skipWhile-spec.ts | 4 +- spec/operators/startWith-spec.ts | 4 +- spec/operators/subscribeOn-spec.ts | 4 +- spec/operators/switch-spec.ts | 3 +- spec/operators/switchMap-spec.ts | 5 +- spec/operators/switchMapTo-spec.ts | 5 +- spec/operators/takeUntil-spec.ts | 4 +- spec/operators/takeWhile-spec.ts | 4 +- spec/operators/tap-spec.ts | 5 +- spec/operators/throttle-spec.ts | 7 +- spec/operators/throttleTime-spec.ts | 8 +- spec/operators/throwIfEmpty-spec.ts | 4 +- spec/operators/timeInterval-spec.ts | 4 +- spec/operators/timeout-spec.ts | 3 +- spec/operators/timeoutWith-spec.ts | 3 +- spec/operators/timestamp-spec.ts | 4 +- spec/operators/toArray-spec.ts | 3 +- spec/operators/window-spec.ts | 3 +- spec/operators/windowCount-spec.ts | 8 +- spec/operators/windowToggle-spec.ts | 4 +- spec/operators/windowWhen-spec.ts | 8 +- spec/operators/withLatestFrom-spec.ts | 4 +- spec/operators/zipAll-spec.ts | 3 +- spec/support/tests2png.opts | 12 - src/internal/operators/concatAll.ts | 2 +- 128 files changed, 1155 insertions(+), 1303 deletions(-) create mode 100644 docs_app/assets/images/svgs/.gitkeep create mode 100644 docs_app/tools/marbles/diagrams/concatAll.txt create mode 100644 docs_app/tools/marbles/scripts/index.ts create mode 100644 docs_app/tools/marbles/tsconfig.marbles.json delete mode 100644 spec/helpers/tests2png/diagram-test-runner.ts delete mode 100644 spec/helpers/tests2png/painter.ts delete mode 100644 spec/helpers/tests2png/types.ts delete mode 100644 spec/support/tests2png.opts diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index e45f894288..f9e78c644f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -5,7 +5,6 @@ If your PR is the addition of a new operator, please make sure all these boxes a - [ ] Add the operator to Rx - [ ] It must have a `-spec.ts` tests file covering the canonical corner cases, with marble diagram tests -- [ ] If possible, write a `asDiagram` test case too, for PNG diagram generation purposes - [ ] The spec file should have a type definition test at the end of the spec to verify type definition for various use cases - [ ] The operator must be documented in JSDoc style in the implementation file, including also the PNG marble diagram image - [ ] The operator should be listed in `docs_app/content/guide/operators.md` in a category of operators diff --git a/docs_app/.gitignore b/docs_app/.gitignore index 4790f4f2f7..295b0f5d0c 100644 --- a/docs_app/.gitignore +++ b/docs_app/.gitignore @@ -47,3 +47,6 @@ Thumbs.db # copied dependencies src/assets/js/lunr* + +assets/images/svgs/* +!assets/images/svgs/.gitkeep \ No newline at end of file diff --git a/docs_app/assets/images/svgs/.gitkeep b/docs_app/assets/images/svgs/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs_app/content/guide/operators.md b/docs_app/content/guide/operators.md index 93f9596aca..73181853eb 100644 --- a/docs_app/content/guide/operators.md +++ b/docs_app/content/guide/operators.md @@ -111,7 +111,7 @@ To explain how operators work, textual descriptions are often not enough. Many o Below you can see the anatomy of a marble diagram. - + Throughout this documentation site, we extensively use marble diagrams to explain how operators work. They may be really useful in other contexts too, like on a whiteboard or even in our unit tests (as ASCII diagrams). diff --git a/docs_app/content/navigation.json b/docs_app/content/navigation.json index 498f3c8022..4768eef00b 100644 --- a/docs_app/content/navigation.json +++ b/docs_app/content/navigation.json @@ -1,24 +1,23 @@ { - "TopBar": [ - { - "url": "guide/overview", - "title": "Overview" - }, - { - "url": "api", - "title": "Reference" - }, - { - "url": "guide/v6/migration", - "title": "Migration" - }, - { - "url": "team", - "title": "Team" - } - ], - - "TopBarNarrow": [], + "TopBar": [ + { + "url": "guide/overview", + "title": "Overview" + }, + { + "url": "api", + "title": "Reference" + }, + { + "url": "guide/v6/migration", + "title": "Migration" + }, + { + "url": "team", + "title": "Team" + } + ], + "TopBarNarrow": [], "SideNav": [ { "url": "guide/overview", @@ -28,8 +27,8 @@ { "url": "guide/observable", "title": "Observables" - }, - { + }, + { "url": "guide/observer", "title": "Observer" }, @@ -41,26 +40,17 @@ "url": "guide/subscription", "title": "Subscription" }, - { + { "url": "guide/subject", "title": "Subjects" }, - { + { "url": "guide/scheduler", "title": "Scheduler" - }, + }, { - "title": "Testing", - "children": [ - { - "url": "guide/testing/marble-testing", - "title": "Marble Testing" - }, - { - "url": "guide/testing/internal-marble-tests", - "title": "Contribute tests to RxJS" - } - ] + "url": "guide/testing/marble-testing", + "title": "Marble Testing" } ] }, @@ -69,16 +59,16 @@ "title": "Installation", "tooltip": "Installation" }, - { - "url": "api", - "title": "Reference", - "tooltip": "RxJS Reference" - }, - { - "tooltip": "Operator Decision Tree", - "url": "operator-decision-tree", - "title": "Operator Decision Tree" - }, + { + "url": "api", + "title": "Reference", + "tooltip": "RxJS Reference" + }, + { + "tooltip": "Operator Decision Tree", + "url": "operator-decision-tree", + "title": "Operator Decision Tree" + }, { "title": "About Version 6", "children": [ @@ -98,9 +88,9 @@ ] }, { - "url": "resources", - "title": "External Resources", - "tooltip": "External Resources" + "url": "resources", + "title": "External Resources", + "tooltip": "External Resources" }, { "url": "code-of-conduct", @@ -109,4 +99,4 @@ } ], "docVersions": [] -} +} \ No newline at end of file diff --git a/docs_app/package-lock.json b/docs_app/package-lock.json index cee5a7f67c..d9beffae68 100644 --- a/docs_app/package-lock.json +++ b/docs_app/package-lock.json @@ -1,5 +1,5 @@ { - "name": "rxjs.io", + "name": "rxjs.dev", "version": "1.0.0", "lockfileVersion": 1, "requires": true, @@ -1767,23 +1767,79 @@ } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", + "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", + "dev": true + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/types": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", + "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@babel/helper-hoist-variables": { @@ -3618,6 +3674,76 @@ } } }, + "@jsdevtools/rehype-inline-svg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jsdevtools/rehype-inline-svg/-/rehype-inline-svg-1.1.1.tgz", + "integrity": "sha512-fEMItNDbftrDcO9Le5LAE7qEm7Gjyd2sEj+0fRGu1h3TK8EUjdW7RC5pyTEmBXYKRYpK7XXROW2LPiwEJ0be6A==", + "dev": true, + "requires": { + "rehype-parse": "^6.0.2", + "svgo": "^1.3.2", + "unified": "^8.4.2" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "unified": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", + "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", + "dev": true, + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.2" + } + }, + "vfile": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.1.1.tgz", + "integrity": "sha512-lRjkpyDGjVlBA7cDQhQ+gNcvB1BGaTHYuSOcY3S7OhDmBtnzX95FhtZZDecSTDm6aajFymyve6S5DN4ZHGezdQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } + } + }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -3795,6 +3921,12 @@ "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", "dev": true }, + "@types/svgo": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-1.3.3.tgz", + "integrity": "sha512-eDLVUvvTn+mol3NpP211DTH9JzSS6YKssRIhHNmXk5BiCl+gc4s+xQQjRFTSsGBohmka5qBsHX6qhL4x88Wkvg==", + "dev": true + }, "@types/unist": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", @@ -4359,9 +4491,9 @@ } }, "arg": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", - "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, "argparse": { @@ -5097,9 +5229,9 @@ } }, "browserstack": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.2.tgz", - "integrity": "sha512-+6AFt9HzhKykcPF79W6yjEUJcdvZOV0lIXdkORXMJftGrDl0OKWqRF4GHqpDNkxiceDT/uB7Fb/aDwktvXX7dg==", + "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" @@ -5415,18 +5547,26 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "catharsis": { - "version": "0.8.9", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz", - "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=", + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", + "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", "dev": true, "requires": { - "underscore-contrib": "~0.3.0" + "lodash": "^4.17.14" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "ccount": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.4.tgz", - "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", + "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==", "dev": true }, "chalk": { @@ -5557,6 +5697,23 @@ "lighthouse-logger": "^1.0.0", "mkdirp": "0.5.1", "rimraf": "^2.6.1" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + } } }, "chrome-trace-event": { @@ -6996,6 +7153,27 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "deep-rename-keys": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/deep-rename-keys/-/deep-rename-keys-0.2.1.tgz", + "integrity": "sha1-7eeFN9emaivmFRfir5Vtf1ij8dg=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "rename-keys": "^1.1.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "default-gateway": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", @@ -7246,9 +7424,9 @@ } }, "dgeni-packages": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/dgeni-packages/-/dgeni-packages-0.27.3.tgz", - "integrity": "sha512-wg4r0WjyaBaEl+VcyWq6oml8CVUe1aCCbsyMZ4xO9EqWrhULdWjh5bIiVyLzaea5LJvOHWBWpfjKuJZgX3ys8A==", + "version": "0.28.3", + "resolved": "https://registry.npmjs.org/dgeni-packages/-/dgeni-packages-0.28.3.tgz", + "integrity": "sha512-WyVzY3Q4ylfnc2677le5G7a7WqkF88rBSjU9IrAofqro71yzZeWLoEdr/gJY+lJZ0PrDyuRW05pFvIbvX8N0PQ==", "dev": true, "requires": { "canonical-path": "^1.0.0", @@ -7258,16 +7436,15 @@ "espree": "^2.2.3", "estraverse": "^4.1.0", "glob": "^7.0.5", + "htmlencode": "^0.0.4", "htmlparser2": "^3.7.3", - "lodash": "^4.13.1", - "marked": "^0.3.2", + "lodash": "^4.17.13", + "marked": "^0.7.0", "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "mkdirp-promise": "^5.0.0", - "node-html-encoder": "0.0.2", + "mkdirp": "^1.0.3", "nunjucks": "^3.1.6", + "rehype": "^8.0.0", "semver": "^5.2.0", - "shelljs": "^0.7.0", "source-map-support": "^0.4.15", "spdx-license-list": "^2.1.0", "stringmap": "^0.2.2", @@ -7275,35 +7452,41 @@ "urlencode": "^1.1.0" }, "dependencies": { - "canonical-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", - "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", - "dev": true - }, "espree": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/espree/-/espree-2.2.5.tgz", "integrity": "sha1-32kbkxCIlAKuspzAZnCMVmkLhUs=", "dev": true }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "rehype": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-8.0.0.tgz", + "integrity": "sha512-fqcYo/q4Xka0ZvS6abiHtZsN7/TauTzTZQfXqtWACo9Qz76Vv/8uzhOizAfDBjVPhbnDl3xPIMRArUdcV/xFaA==", "dev": true, "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" + "rehype-parse": "^6.0.0", + "rehype-stringify": "^6.0.0", + "unified": "^7.0.0" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -7334,9 +7517,9 @@ "dev": true }, "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "diffie-hellman": { @@ -10313,9 +10496,9 @@ } }, "hast-util-from-parse5": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.1.tgz", - "integrity": "sha512-UfPzdl6fbxGAxqGYNThRUhRlDYY7sXu6XU9nQeX4fFZtV+IHbyEJtd+DUuwOqNV4z3K05E/1rIkoVr/JHmeWWA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", + "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", "dev": true, "requires": { "ccount": "^1.0.3", @@ -10338,9 +10521,9 @@ "dev": true }, "hast-util-parse-selector": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.2.tgz", - "integrity": "sha512-jIMtnzrLTjzqgVEQqPEmwEZV+ea4zHRFTP8Z2Utw0I5HuBOXHzUPPQWr6ouJdJqDKLbFU/OEiYwZ79LalZkmmw==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.4.tgz", + "integrity": "sha512-gW3sxfynIvZApL4L07wryYF4+C9VvH3AUi7LAnVXV4MneGEgwOByXvFo18BgmTWnm7oHAe874jKbIB1YhHSIzA==", "dev": true }, "hast-util-sanitize": { @@ -10353,9 +10536,9 @@ } }, "hast-util-to-html": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-6.0.1.tgz", - "integrity": "sha512-9LjLAsO2gPO9H6N0VxZsK4sqNZY1A0lMNDfdpMseryV18Hri2++guFfPmjY58PzmtBlBvDflqktxjSm2I1o1yg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-6.1.0.tgz", + "integrity": "sha512-IlC+LG2HGv0Y8js3wqdhg9O2sO4iVpRDbHOPwXd7qgeagpGsnY49i8yyazwqS35RA35WCzrBQE/n0M6GG/ewxA==", "dev": true, "requires": { "ccount": "^1.0.0", @@ -10363,11 +10546,22 @@ "hast-util-is-element": "^1.0.0", "hast-util-whitespace": "^1.0.0", "html-void-elements": "^1.0.0", - "property-information": "^5.0.0", + "property-information": "^5.2.0", "space-separated-tokens": "^1.0.0", "stringify-entities": "^2.0.0", "unist-util-is": "^3.0.0", "xtend": "^4.0.1" + }, + "dependencies": { + "property-information": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.5.0.tgz", + "integrity": "sha512-RgEbCx2HLa1chNgvChcx+rrCWD0ctBmGSE0M7lVm1yyv4UbvbrWoXp/BkVLZefzjrRBGW8/Js6uh/BnlHXFyjA==", + "dev": true, + "requires": { + "xtend": "^4.0.0" + } + } } }, "hast-util-to-string": { @@ -10383,14 +10577,14 @@ "dev": true }, "hastscript": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.0.tgz", - "integrity": "sha512-7mOQX5VfVs/gmrOGlN8/EDfp1GqV6P3gTNVt+KnX4gbYhpASTM8bklFdFQCbFRAadURXAmw0R1QQdBdqp7jswQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", + "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", "dev": true, "requires": { "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.2.0", - "property-information": "^5.0.1", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0" } }, @@ -10508,6 +10702,12 @@ "integrity": "sha512-yMk3naGPLrfvUV9TdDbuYXngh/TpHbA6TrOw3HL9kS8yhwx7i309BReNg7CbAJXGE+UMJ6je5OqJ7lC63o6YuQ==", "dev": true }, + "htmlencode": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/htmlencode/-/htmlencode-0.0.4.tgz", + "integrity": "sha1-9+LWr74YqHp45jujMI51N2Z0Dj8=", + "dev": true + }, "htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", @@ -10523,9 +10723,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", - "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -11090,8 +11290,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { "version": "1.1.5", @@ -11395,9 +11594,9 @@ "dev": true }, "is-whitespace-character": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz", - "integrity": "sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", "dev": true }, "is-windows": { @@ -11407,9 +11606,9 @@ "dev": true }, "is-word-character": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.3.tgz", - "integrity": "sha512-0wfcrFgOOOBdgRNT9H33xe6Zi6yhX/uoc4U8NBZGeQQB0ctU1dnlNTyL9JM2646bHDTpsDm1Brb3VPoCIMrd/A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", "dev": true }, "is-wsl": { @@ -12620,6 +12819,21 @@ "pify": "^3.0.0" } }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, "opn": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", @@ -13159,9 +13373,9 @@ } }, "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "make-fetch-happen": { @@ -13308,9 +13522,9 @@ "dev": true }, "marked": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", - "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", + "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", "dev": true }, "marky": { @@ -13328,6 +13542,13 @@ "charenc": "~0.0.1", "crypt": "~0.0.1", "is-buffer": "~1.1.1" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } } }, "md5.js": { @@ -13745,31 +13966,22 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" }, "dependencies": { "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "dev": true, - "requires": { - "mkdirp": "*" - } - }, "morgan": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", @@ -13927,55 +14139,10 @@ "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", "dev": true }, - "node-html-encoder": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/node-html-encoder/-/node-html-encoder-0.0.2.tgz", - "integrity": "sha1-iXNhjXJ9pVJqgwtH0HwNgD4KFcY=", - "dev": true - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-releases": { - "version": "1.1.55", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.55.tgz", - "integrity": "sha512-H3R3YR/8TjT5WPin/wOoHOUPHgvj8leuU/Keta/rwelEQN9pA/S2Dx8/se4pZ2LBxSd0nAGzsNzhqwa77v7F1w==", + "node-releases": { + "version": "1.1.55", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.55.tgz", + "integrity": "sha512-H3R3YR/8TjT5WPin/wOoHOUPHgvj8leuU/Keta/rwelEQN9pA/S2Dx8/se4pZ2LBxSd0nAGzsNzhqwa77v7F1w==", "dev": true }, "nomnom": { @@ -14222,36 +14389,137 @@ "dev": true }, "nunjucks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.0.tgz", - "integrity": "sha512-YS/qEQ6N7qCnUdm6EoYRBfJUdWNT0PpKbbRnogV2XyXbBm2STIP1O6yrdZHgwMVK7fIYUx7i8+yatEixnXSB1w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.1.tgz", + "integrity": "sha512-LYlVuC1ZNSalQQkLNNPvcgPt2M9FTY9bs39mTCuFXtqh7jWbYzhDlmz2M6onPiXEhdZo+b9anRhc+uBGuJZ2bQ==", "dev": true, "requires": { "a-sync-waterfall": "^1.0.0", "asap": "^2.0.3", - "chokidar": "^2.0.0", - "yargs": "^3.32.0" + "chokidar": "^3.3.0", + "commander": "^3.0.2" }, "dependencies": { - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true, + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", "dev": true }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, + "optional": true, "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "optional": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" } } } @@ -14396,6 +14664,56 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, + "omit-deep": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/omit-deep/-/omit-deep-0.3.0.tgz", + "integrity": "sha1-IcivNJm8rdKWUaIyy8rLxSRF6+w=", + "dev": true, + "requires": { + "is-plain-object": "^2.0.1", + "unset-value": "^0.1.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "unset-value": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-0.1.2.tgz", + "integrity": "sha1-UGgQuGfyfCpabpsEgzYx9t5Y0xA=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + } + } + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -14696,9 +15014,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } @@ -14786,6 +15104,14 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, "npm-package-arg": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", @@ -14827,9 +15153,9 @@ } }, "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, "parallel-transform": { @@ -16197,6 +16523,12 @@ "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", "dev": true }, + "queue-microtask": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.1.2.tgz", + "integrity": "sha512-F9wwNePtXrzZenAB3ax0Y8TSKGvuB7Qw16J30hspEUTbfUM+H827XyN3rlpwhVmtm5wuZtbKIHjOnwDn7MUxWQ==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -16662,25 +16994,85 @@ } }, "rehype": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-8.0.0.tgz", - "integrity": "sha512-fqcYo/q4Xka0ZvS6abiHtZsN7/TauTzTZQfXqtWACo9Qz76Vv/8uzhOizAfDBjVPhbnDl3xPIMRArUdcV/xFaA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-10.0.0.tgz", + "integrity": "sha512-0W8M4Y91b2QuzDSTjkZgBOJo79bP089YbSQNPMqebuUVrp6iveoi+Ra6/H7fJwUxq8FCHGCGzkLaq3fvO9XnVg==", "dev": true, "requires": { "rehype-parse": "^6.0.0", "rehype-stringify": "^6.0.0", - "unified": "^7.0.0" + "unified": "^9.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "unified": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.0.0.tgz", + "integrity": "sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ==", + "dev": true, + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.2" + } + }, + "vfile": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.1.0.tgz", + "integrity": "sha512-BaTPalregj++64xbGK6uIlsurN3BCRNM/P2Pg8HezlGzKd1O9PrwIac6bd9Pdx2uTb0QHoioZ+rXKolbVXEgJg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } } }, "rehype-parse": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.0.tgz", - "integrity": "sha512-V2OjMD0xcSt39G4uRdMTqDXXm6HwkUbLMDayYKA/d037j8/OtVSQ+tqKwYWOuyBeoCs/3clXRe30VUjeMDTBSA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", + "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", "dev": true, "requires": { "hast-util-from-parse5": "^5.0.0", "parse5": "^5.0.0", - "xtend": "^4.0.1" + "xtend": "^4.0.0" } }, "rehype-slug": { @@ -16697,13 +17089,13 @@ } }, "rehype-stringify": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-6.0.0.tgz", - "integrity": "sha512-grV/hhA7z9GbUJZk0ILzprSE0YY9lvTmYuvgRjXdFXrrag5gNeqXBQIuG1m4zFW6PFm0YYnJ/qgf5y6yui4VsA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-6.0.1.tgz", + "integrity": "sha512-JfEPRDD4DiG7jet4md7sY07v6ACeb2x+9HWQtRPm2iA6/ic31hCv1SNBUtpolJASxQ/D8gicXiviW4TJKEMPKQ==", "dev": true, "requires": { "hast-util-to-html": "^6.0.0", - "xtend": "^4.0.1" + "xtend": "^4.0.0" } }, "remark": { @@ -16832,6 +17224,12 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, + "rename-keys": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rename-keys/-/rename-keys-1.2.0.tgz", + "integrity": "sha512-U7XpAktpbSgHTRSNRrjKSrjYkZKuhUukfoBlXWXUExCAqhzh1TU3BDRAfJmarcl5voKS+pbKU9MvyLWKZ4UEEg==", + "dev": true + }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -17101,6 +17499,12 @@ "aproba": "^1.1.1" } }, + "rusha": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.13.tgz", + "integrity": "sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo=", + "dev": true + }, "rx-lite": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", @@ -17551,6 +17955,16 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "simple-sha1": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/simple-sha1/-/simple-sha1-3.0.1.tgz", + "integrity": "sha512-q7ehqWfHc1VhOm7sW099YDZ4I0yYX7rqyhqqhHV1IYeUTjPOhHyD3mXvv8k2P+rO7+7c8R4/D+8ffzC9BE7Cqg==", + "dev": true, + "requires": { + "queue-microtask": "^1.1.2", + "rusha": "^0.8.1" + } + }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -18639,6 +19053,25 @@ "stable": "^0.1.8", "unquote": "~1.1.1", "util.promisify": "~1.0.0" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "svgson": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/svgson/-/svgson-4.1.0.tgz", + "integrity": "sha512-DodISxHtdLKUghDYA+PGK4Qq350+CbBAkdvGLkBFSmWd9WKSg4dijgjB1IiRPTmsUCd+a7KYe+ILHtklYgQyzQ==", + "dev": true, + "requires": { + "deep-rename-keys": "^0.2.1", + "omit-deep": "0.3.0", + "xml-reader": "2.4.3" } }, "swap-case": { @@ -18651,6 +19084,72 @@ "upper-case": "^1.1.1" } }, + "swirly-parser": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/swirly-parser/-/swirly-parser-0.13.6.tgz", + "integrity": "sha512-LhWLTmE1Afq/N5XaIU3BlH3/pi+NfJ3I74iM6kWew6M4D3ZjEDK7aPRg9H4yiRDw2oTvNkc+2jg4P4put02IkQ==", + "dev": true, + "requires": { + "swirly-parser-rxjs": "^0.13.6" + } + }, + "swirly-parser-rxjs": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/swirly-parser-rxjs/-/swirly-parser-rxjs-0.13.6.tgz", + "integrity": "sha512-vR7r37m61r//8tqTD8BDtuJQgTN56SQU4J/EN+2rSfX1eqjm4BPzbJeOXDYTMDoJUAemdy/pXUNNsyp6PSw54A==", + "dev": true + }, + "swirly-renderer": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/swirly-renderer/-/swirly-renderer-0.13.6.tgz", + "integrity": "sha512-tlLFvO4alm6mmXYFhc1c3b4GCJMAR9Wt6+Cf/xtoiO0RbQ/Fx7OuGtTlGJEcTOq7bMlwc2p21maYQ4eZzDDCUQ==", + "dev": true, + "requires": { + "simple-sha1": "^3.0.1", + "swirly-theme-default-light": "^0.13.6" + }, + "dependencies": { + "swirly-theme-default-base": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/swirly-theme-default-base/-/swirly-theme-default-base-0.13.6.tgz", + "integrity": "sha512-dzqLqAh2Vz+w+MAZFxkD/iV6+FCRPhW1U4ST4Pys12pc72zCtBhJXfL5UT2h1sGb1HlnEaI3JyK4LRhiRhenJg==", + "dev": true + }, + "swirly-theme-default-light": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/swirly-theme-default-light/-/swirly-theme-default-light-0.13.6.tgz", + "integrity": "sha512-pEbbrTEU917xASubOz+JMNdFb7fSuKpkXhwUYcMXLWM+EtYcltsdvIqEjPimo3snBvLVYeW6k10mNhKtoTesEQ==", + "dev": true, + "requires": { + "swirly-theme-default-base": "^0.13.6" + } + } + } + }, + "swirly-renderer-node": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/swirly-renderer-node/-/swirly-renderer-node-0.13.6.tgz", + "integrity": "sha512-7SLVRacSiEZ/x1VWoTeUjPjFiwsAxRBkPMsLbAa8Q7c4z+ZOUEKFOrQjNUEKG1qYEoYJI1PE6oWQVFVVfDcbcA==", + "dev": true, + "requires": { + "swirly-renderer": "^0.13.6", + "xmldom": "^0.3.0" + }, + "dependencies": { + "xmldom": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.3.0.tgz", + "integrity": "sha512-z9s6k3wxE+aZHgXYxSTpGDo7BYOUfJsIRyoZiX6HTjwpwfS2wpQBQKa2fD+ShLyPkqDYo5ud7KitmLZ2Cd6r0g==", + "dev": true + } + } + }, + "swirly-types": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/swirly-types/-/swirly-types-0.13.6.tgz", + "integrity": "sha512-97a0Vzp1E4OhcliUML+xuYUdKxTsDeFfsVgHBiscI9DgfsvxuZZv8dXEYP0oqQO4NwzAgyNJNhB4ggpgOx9xdQ==", + "dev": true + }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -19200,16 +19699,34 @@ "dev": true }, "ts-node": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.2.0.tgz", - "integrity": "sha512-m8XQwUurkbYqXrKqr3WHCW310utRNvV5OnRVeISeea7LoCWVcdfeB/Ntl8JYWFh+WRoUAdBgESrzKochQt7sMw==", + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.1.tgz", + "integrity": "sha512-bdNz1L4ekHiJul6SHtZWs1ujEKERJnHs4HxN7rjTyyVOFf3HaJ6sLqe6aPG62XTzAB/63pKRh5jTSWL0D7bsvw==", "dev": true, "requires": { "arg": "^4.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "^3.0.0" + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } } }, "tslib": { @@ -19382,15 +19899,6 @@ "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", "dev": true }, - "underscore-contrib": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", - "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=", - "dev": true, - "requires": { - "underscore": "1.6.0" - } - }, "unherit": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.2.tgz", @@ -20159,9 +20667,9 @@ "integrity": "sha512-TOMFWtQdxzjWp8qx4DAraTWTsdhxVSiWa6NkPFSaPtZ1diKUxTn4yTix73A1euG1WbSOMMPcY51cnjTIHrGtDA==" }, "web-namespaces": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.3.tgz", - "integrity": "sha512-r8sAtNmgR0WKOKOxzuSgk09JsHlpKlB+uHi937qypOu3PZ17UxPrierFKDye/uNHjNTTEshu5PId8rojIPj/tA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", "dev": true }, "webdriver-js-extender": { @@ -20277,6 +20785,43 @@ "path-is-absolute": "^1.0.0" } }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -20984,12 +21529,47 @@ "os-homedir": "^1.0.0" } }, + "xml-lexer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xml-lexer/-/xml-lexer-0.2.2.tgz", + "integrity": "sha1-UYGTpKozTVj8fSSLVJB5uJkH4EY=", + "dev": true, + "requires": { + "eventemitter3": "^2.0.0" + }, + "dependencies": { + "eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=", + "dev": true + } + } + }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "xml-reader": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/xml-reader/-/xml-reader-2.4.3.tgz", + "integrity": "sha1-n4EMr3xCWlqvuEixxFEDyecddTA=", + "dev": true, + "requires": { + "eventemitter3": "^2.0.0", + "xml-lexer": "^0.2.2" + }, + "dependencies": { + "eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=", + "dev": true + } + } + }, "xml2js": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", @@ -21223,9 +21803,9 @@ "dev": true }, "yn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz", - "integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, "zip-stream": { diff --git a/docs_app/package.json b/docs_app/package.json index b0589f814b..280b73d884 100644 --- a/docs_app/package.json +++ b/docs_app/package.json @@ -1,8 +1,8 @@ { - "name": "rxjs.io", + "name": "rxjs.dev", "version": "1.0.0", "main": "index.js", - "repository": "git@github.com:ReactiveX/ rxjs", + "repository": "git@github.com:ReactiveX/rxjs", "author": "RxJS", "license": "MIT", "scripts": { @@ -37,7 +37,8 @@ "build-ie-polyfills": "webpack-cli src/ie-polyfills.js -o src/generated/ie-polyfills.min.js --mode production", "update-webdriver": "webdriver-manager update --standalone false --gecko false $CHROMEDRIVER_VERSION_ARG", "~~build": "ng build --configuration=stable --prod --source-map", - "~~clean-generated": "node --eval \"require('shelljs').rm('-rf', 'src/generated')\"" + "~~clean-generated": "node --eval \"require('shelljs').rm('-rf', 'src/generated')\"", + "build:marbles": "ts-node -P ./tools/marbles/tsconfig.marbles.json ./tools/marbles/scripts/index.ts" }, "engines": { "node": ">=10.9" @@ -70,9 +71,11 @@ "@angular-devkit/build-angular": "~0.901.4", "@angular/cli": "^9.1.4", "@angular/compiler-cli": "^9.1.4", + "@jsdevtools/rehype-inline-svg": "^1.1.1", "@types/jasmine": "^3.3.13", "@types/jasminewd2": "^2.0.3", "@types/node": "^12.11.1", + "@types/svgo": "^1.3.3", "archiver": "^3.0.0", "canonical-path": "^1.0.0", "chalk": "^2.1.0", @@ -82,7 +85,8 @@ "cross-spawn": "^6.0.5", "css-selector-parser": "^1.3.0", "dgeni": "^0.4.12", - "dgeni-packages": "^0.27.3", + "dgeni-packages": "^0.28.3", + "ee-first": "^1.1.1", "entities": "^1.1.1", "eslint": "^5.16.0", "eslint-plugin-jasmine": "^2.2.0", @@ -112,13 +116,18 @@ "lunr": "^2.1.0", "mkdirp": "^0.5.1", "protractor": "^5.2.0", - "rehype": "^8.0.0", + "rehype": "^10.0.0", "rehype-slug": "^2.0.3", "remark": "^10.0.1", "remark-html": "^9.0.0", "rimraf": "^2.6.1", "semver": "^6.1.1", "shelljs": "^0.8.3", + "svgo": "^1.3.2", + "svgson": "^4.1.0", + "swirly-parser": "^0.13.6", + "swirly-renderer-node": "^0.13.6", + "swirly-types": "^0.13.6", "tree-kill": "^1.1.0", "ts-node": "^8.2.0", "tslint": "^5.17.0", diff --git a/docs_app/tools/marbles/diagrams/concatAll.txt b/docs_app/tools/marbles/diagrams/concatAll.txt new file mode 100644 index 0000000000..eddffb105e --- /dev/null +++ b/docs_app/tools/marbles/diagrams/concatAll.txt @@ -0,0 +1,11 @@ +x = ----a------b------| + +y = ---c-d---| + +z = ---e--f-| + +-x---y----z------| + +> concatAll + +-----a------b---------c-d------e--f-| \ No newline at end of file diff --git a/docs_app/tools/marbles/scripts/index.ts b/docs_app/tools/marbles/scripts/index.ts new file mode 100644 index 0000000000..73a469ca64 --- /dev/null +++ b/docs_app/tools/marbles/scripts/index.ts @@ -0,0 +1,41 @@ +import { renderMarbleDiagram } from 'swirly-renderer-node'; +import { readdir, readFileSync, writeFileSync } from 'fs'; +import { join } from 'path'; +import { parseMarbleDiagramSpec } from 'swirly-parser'; +import { DiagramStyles } from 'swirly-types'; +import * as SVGO from 'svgo'; + +const styles: DiagramStyles = { + frame_width: 20, + completion_height: 20, + higher_order_angle: 30, + arrow_fill_color: 'black', + background_color: 'rgba(255, 255, 255, 0.0)', + operator_fill_color: 'rgba(255, 255, 255, 0.0)' +}; + +const optimizeXml = async (unoptXml: string): Promise => { + const svgo = new SVGO({ plugins: [{ removeViewBox: false }] }); + const { data } = await svgo.optimize(unoptXml); + return data; +}; + +const renderMarble = (path: string, fileName: string): Promise => { + const file = readFileSync(join(path, fileName)); + const diagramSpec = parseMarbleDiagramSpec(file.toString()); + const { xml: unoptXml } = renderMarbleDiagram(diagramSpec, { styles }); + const optimizedSVGPromise = optimizeXml(unoptXml); + return optimizedSVGPromise.then((svgXML) => { + const svgFileName = fileName.split('.')[0] + '.svg'; + const svgPath = join(process.cwd(), 'assets', 'images', 'svgs', svgFileName); + writeFileSync(svgPath, svgXML, { encoding: 'utf-8', flag: 'w' }); + return true; + }); +}; + +const diagramsPath = join(process.cwd(), 'tools', 'marbles', 'diagrams'); +readdir(diagramsPath, (err, files) => { + Promise.all(files.map(fileName => renderMarble(diagramsPath, fileName))) + .then(_ => console.log('All SVGs created')) + .catch(e => console.error('generating SVGs failed', e)); +}); \ No newline at end of file diff --git a/docs_app/tools/marbles/tsconfig.marbles.json b/docs_app/tools/marbles/tsconfig.marbles.json new file mode 100644 index 0000000000..8708c163d8 --- /dev/null +++ b/docs_app/tools/marbles/tsconfig.marbles.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "module": "commonjs" + } + } + \ No newline at end of file diff --git a/docs_app/tools/transforms/angular-api-package/index.js b/docs_app/tools/transforms/angular-api-package/index.js index 5217bb65c7..f88940c3c3 100644 --- a/docs_app/tools/transforms/angular-api-package/index.js +++ b/docs_app/tools/transforms/angular-api-package/index.js @@ -195,7 +195,10 @@ module.exports = new Package('angular-api', [basePackage, typeScriptPackage]) .config(function(convertToJsonProcessor, postProcessHtml, API_DOC_TYPES_TO_RENDER, API_DOC_TYPES, autoLinkCode, embedMarbleDiagramsPostProcessor) { convertToJsonProcessor.docTypes = convertToJsonProcessor.docTypes.concat(API_DOC_TYPES_TO_RENDER); postProcessHtml.docTypes = convertToJsonProcessor.docTypes.concat(API_DOC_TYPES_TO_RENDER); - postProcessHtml.plugins = [embedMarbleDiagramsPostProcessor.process]; + postProcessHtml.plugins = [ + [embedMarbleDiagramsPostProcessor.process], + [require('@jsdevtools/rehype-inline-svg'), {maxImageSize: 12000}] + ]; autoLinkCode.docTypes = API_DOC_TYPES; autoLinkCode.codeElements = ['code', 'code-example', 'code-pane']; }); diff --git a/docs_app/tools/transforms/post-process-package/processors/post-process-html.js b/docs_app/tools/transforms/post-process-package/processors/post-process-html.js index d024a76f1a..d7b7e5da0a 100644 --- a/docs_app/tools/transforms/post-process-package/processors/post-process-html.js +++ b/docs_app/tools/transforms/post-process-package/processors/post-process-html.js @@ -17,7 +17,7 @@ const rehype = require('rehype'); * @property plugins {Function[]} the rehype plugins that will modify the HAST. * */ -module.exports = function postProcessHtml(log, createDocMessage) { +module.exports = function postProcessHtml() { return { $runAfter: ['docs-rendered'], $runBefore: ['writing-files'], @@ -25,12 +25,29 @@ module.exports = function postProcessHtml(log, createDocMessage) { plugins: [], $process(docs) { const engine = rehype() - .data('settings', { fragment: true }); - this.plugins.forEach(plugin => engine.use(plugin)); + .data('settings', { fragment: true }); + this.plugins.forEach(plugin => engine.use(...plugin)); - let vFile; + return Promise.all(docs + .filter(doc => this.docTypes.indexOf(doc.docType) !== -1) + .map(doc => { + doc.contents = doc.renderedContent; + return engine.process(doc).catch((e) => { + throw new Error(`processing markdown to html failed! ${e}`); + }); + }) + ).then(processedDocs => { + return processedDocs.map(doc => { + doc.renderedContent = doc.contents; + return doc; + }); + }); + } + }; +}; - docs +/** + * docs .filter(doc => this.docTypes.indexOf(doc.docType) !== -1) .forEach(doc => { try { @@ -44,6 +61,4 @@ module.exports = function postProcessHtml(log, createDocMessage) { throw new Error(createDocMessage(e.message, doc)); } }); - } - }; -}; + */ \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 755fdd2f4c..f1a03a5afd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -565,18 +565,6 @@ "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, - "array-parallel": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/array-parallel/-/array-parallel-0.1.3.tgz", - "integrity": "sha1-j3hTCJJu1apHjEfmTRszS2wMlH0=", - "dev": true - }, - "array-series": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/array-series/-/array-series-0.1.5.tgz", - "integrity": "sha1-3103v8XC7wdV4qpPkv6ufUtaly8=", - "dev": true - }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -763,8 +751,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -865,7 +852,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1534,8 +1520,7 @@ "commander": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" }, "commondir": { "version": "1.0.1", @@ -1552,8 +1537,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -2797,7 +2781,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -2819,8 +2802,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.12", @@ -3433,7 +3415,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3491,45 +3472,6 @@ } } }, - "gm": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/gm/-/gm-1.23.1.tgz", - "integrity": "sha1-Lt7rlYCE0PjqeYjl2ZWxx9/BR3c=", - "dev": true, - "requires": { - "array-parallel": "~0.1.3", - "array-series": "~0.1.5", - "cross-spawn": "^4.0.0", - "debug": "^3.1.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "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" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "google-closure-compiler-js": { "version": "20170218.0.0", "resolved": "https://registry.npmjs.org/google-closure-compiler-js/-/google-closure-compiler-js-20170218.0.0.tgz", @@ -3544,8 +3486,7 @@ "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, "growl": { "version": "1.10.3", @@ -3669,6 +3610,11 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, + "highlight.js": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.0.3.tgz", + "integrity": "sha512-9FG7SSzv9yOY5CGGxfI6NDm7xLYtMOjKtPBxw7Zff3t5UcRcUNTGEeS8lNjhceL34KeetLMoGMFTGoaa83HwyQ==" + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -3741,7 +3687,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -3750,8 +3695,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "inquirer": { "version": "6.5.0", @@ -3788,8 +3732,7 @@ "interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" }, "is-accessor-descriptor": { "version": "0.1.6", @@ -4153,7 +4096,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -4408,8 +4350,7 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash.debounce": { "version": "4.0.8", @@ -4496,6 +4437,11 @@ "yallist": "^2.1.2" } }, + "lunr": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.8.tgz", + "integrity": "sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg==" + }, "magic-string": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.16.0.tgz", @@ -4562,6 +4508,11 @@ "object-visit": "^1.0.0" } }, + "marked": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.0.0.tgz", + "integrity": "sha512-Wo+L1pWTVibfrSr+TTtMuiMfNzmZWiOPeO7rZsQUY5bgsxpHesBEcIWJloWVTFnrMXnf/TL30eTFSGJddmQAng==" + }, "matcher": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", @@ -4675,7 +4626,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4893,8 +4843,7 @@ "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" }, "nice-try": { "version": "1.0.5", @@ -5124,7 +5073,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -5318,8 +5266,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -5336,8 +5283,7 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-to-regexp": { "version": "1.7.0", @@ -5480,8 +5426,7 @@ "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise": { "version": "8.0.1", @@ -5740,7 +5685,6 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, "requires": { "resolve": "^1.1.6" } @@ -5846,7 +5790,6 @@ "version": "1.12.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, "requires": { "path-parse": "^1.0.6" } @@ -7170,6 +7113,70 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typedoc": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.17.6.tgz", + "integrity": "sha512-pQiYnhG3yJk7939cv2n8uFoTsSgy5Hfiw0dgOQYa9nT9Ya1013dMctQdAXMj8JbNu7KhcauQyq9Zql9D/TziLw==", + "requires": { + "fs-extra": "^8.1.0", + "handlebars": "^4.7.6", + "highlight.js": "^10.0.0", + "lodash": "^4.17.15", + "lunr": "^2.3.8", + "marked": "1.0.0", + "minimatch": "^3.0.0", + "progress": "^2.0.3", + "shelljs": "^0.8.4", + "typedoc-default-themes": "^0.10.1" + }, + "dependencies": { + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + } + } + }, + "typedoc-default-themes": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.10.1.tgz", + "integrity": "sha512-SuqAQI0CkwhqSJ2kaVTgl37cWs733uy9UGUqwtcds8pkFK8oRF4rZmCq+FXTGIb9hIUOu40rf5Kojg0Ha6akeg==", + "requires": { + "lunr": "^2.3.8" + } + }, "typescript": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.2.tgz", @@ -7180,7 +7187,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", - "dev": true, "optional": true, "requires": { "commander": "~2.20.0", @@ -7191,7 +7197,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "optional": true } } @@ -7229,8 +7234,7 @@ "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unset-value": { "version": "1.0.0", @@ -7601,8 +7605,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", diff --git a/package.json b/package.json index eeee15593a..34775b8642 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,6 @@ "test:systemjs": "node integration/systemjs/systemjs-compatibility-spec.js", "test:side-effects": "check-side-effects --test integration/side-effects/side-effects.json", "test:side-effects:update": "npm run test:side-effects -- --update", - "tests2png": "mkdirp docs_app/content/img && mocha --opts spec/support/tests2png.opts \"spec/**/*-spec.ts\"", "compile": "tsc -b ./src/tsconfig.cjs.json ./src/tsconfig.cjs.spec.json ./src/tsconfig.esm.json ./src/tsconfig.esm5.json ./src/tsconfig.esm5.rollup.json ./src/tsconfig.types.json ./spec/tsconfig.json", "build:clean": "shx rm -rf ./dist", "build:global": "node ./tools/make-umd-bundle.js && node ./tools/make-closure-core.js", @@ -94,7 +93,8 @@ }, "homepage": "https://github.com/ReactiveX/RxJS", "dependencies": { - "tslib": "^1.9.0" + "tslib": "^1.9.0", + "typedoc": "^0.17.6" }, "devDependencies": { "@angular-devkit/build-optimizer": "0.4.6", @@ -119,7 +119,6 @@ "eslint-plugin-jasmine": "^2.10.1", "fs-extra": "^8.1.0", "glob": "7.1.2", - "gm": "1.23.1", "google-closure-compiler-js": "20170218.0.0", "klaw-sync": "3.0.2", "lint-staged": "^8.1.6", diff --git a/spec/Observable-spec.ts b/spec/Observable-spec.ts index f5a3863aba..4e111024d5 100644 --- a/spec/Observable-spec.ts +++ b/spec/Observable-spec.ts @@ -5,7 +5,7 @@ import { cold, expectObservable, expectSubscriptions } from './helpers/marble-te import { Observable, config, Subscription, noop, Subscriber, Operator, NEVER, Subject, of, throwError, empty, interval } from 'rxjs'; import { map, multicast, refCount, filter, count, tap, combineLatest, concat, merge, race, zip, take, finalize } from 'rxjs/operators'; -declare const asDiagram: any, rxTestScheduler: any; +declare const rxTestScheduler: any; function expectFullObserver(val: any) { expect(val).to.be.a('object'); @@ -632,13 +632,6 @@ describe('Observable', () => { /** @test {Observable} */ describe('Observable.create', () => { - asDiagram('create(obs => { obs.next(1); })') - ('should create a cold observable that emits just 1', () => { - const e1 = Observable.create((obs: Observer) => { obs.next(1); }); - const expected = 'x'; - expectObservable(e1).toBe(expected, { x: 1 }); - }); - it('should create an Observable', () => { const result = Observable.create(() => { //noop diff --git a/spec/helpers/testScheduler-ui.ts b/spec/helpers/testScheduler-ui.ts index f4a53639c6..51941cd983 100644 --- a/spec/helpers/testScheduler-ui.ts +++ b/spec/helpers/testScheduler-ui.ts @@ -56,8 +56,6 @@ if (global && !(typeof window !== 'undefined')) { global.Test = global.mocha.Test; } -const diagramFunction = global.asDiagram; - //mocha creates own global context per each test suite, simple patching to global won't deliver its context into test cases. //this custom interface is just mimic of existing one amending test scheduler behavior previously test-helper does via global patching. module.exports = function(suite: any) { @@ -214,18 +212,6 @@ module.exports = function(suite: any) { return test; }; - /** - * Describe a specification or test-case - * to be represented as marble diagram png. - * It will still serve as normal test cases as well. - */ - context.asDiagram = function (label: any) { - if (diagramFunction) { - return diagramFunction(label, it); - } - return it; - }; - /** * Exclusive test-case. */ diff --git a/spec/helpers/tests2png/diagram-test-runner.ts b/spec/helpers/tests2png/diagram-test-runner.ts deleted file mode 100644 index bec2ada01f..0000000000 --- a/spec/helpers/tests2png/diagram-test-runner.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { painter } from './painter'; -import { TestScheduler } from 'rxjs/testing'; -import { TestMessage } from '../../../src/internal/testing/TestMessage'; -import { TestStream } from './types'; - -declare const global: any; - -export const rxTestScheduler: TestScheduler = global.rxTestScheduler; - -function getInputStreams(rxTestScheduler: TestScheduler): TestStream[] { - return Array.prototype.concat.call([], - rxTestScheduler.hotObservables - .map(function (hot) { - return { - messages: hot.messages, - subscription: {start: 0, end: '100%'}, - }; - }) - .slice(), - rxTestScheduler.coldObservables - .map(function (cold) { - return { - messages: cold.messages, - cold: cold, - }; - }) - .slice() - ); -} - -function updateInputStreamsPostFlush(inputStreams: TestStream[]) { - return inputStreams.map(function (singleInputStream) { - if (singleInputStream.cold && singleInputStream.cold.subscriptions.length) { - singleInputStream.subscription = { - start: singleInputStream.cold.subscriptions[0].subscribedFrame, - end: singleInputStream.cold.subscriptions[0].unsubscribedFrame, - }; - } - return singleInputStream; - }); -} - -function postProcessOutputMessage(msg: TestMessage) { - if (Array.isArray(msg.notification.value) - && msg.notification.value.length - && typeof msg.notification.value[0] === 'object') { - msg.notification.value = { - messages: msg.notification.value, - subscription: {start: msg.frame, end: '100%'}, - }; - let completionFrame = msg.notification.value.messages - .reduce(function (prev: number, x: TestMessage) { - if (x.notification && x.notification.kind === 'C' && x.frame > prev) { - return x.frame; - } else { - return prev; - } - }, -1); - if (completionFrame > -1) { - msg.notification.value.subscription.end = msg.frame + completionFrame; - } - } - return msg; -} - -function makeFilename(operatorLabel: string) { - return /^(\w+)/.exec(operatorLabel)![1] + '.png'; -} - -type glitFn = (description: string, fn: () => void ) => any; -type specFn = () => any; - -global.asDiagram = function asDiagram(operatorLabel: string, glit: glitFn) { - return function specFnWithPainter(description: string, specFn: specFn) { - if (specFn.length === 0) { - glit(description, function () { - let outputStreams: TestStream[] = []; - global.rxTestScheduler = new TestScheduler(function (actual: TestMessage[]) { - if (Array.isArray(actual) && actual.length > 0 && typeof actual[0].frame === 'number') { - outputStreams.push({ - messages: actual.map(postProcessOutputMessage), - subscription: {start: 0, end: '100%'} - }); - } else if (Array.isArray(actual) && actual.length === 0) { // is the never Observable - outputStreams.push({ - messages: [], - subscription: {start: 0, end: '100%'} - }); - } - return true; - }); - specFn(); - let inputStreams = getInputStreams(global.rxTestScheduler); - global.rxTestScheduler.flush(); - inputStreams = updateInputStreamsPostFlush(inputStreams); - let filename = './docs_app/content/img/' + makeFilename(operatorLabel); - painter(inputStreams, operatorLabel, outputStreams, filename); - console.log('Painted ' + filename); - }); - } else { - throw new Error('cannot generate PNG marble diagram for async test ' + description); - } - }; -}; diff --git a/spec/helpers/tests2png/painter.ts b/spec/helpers/tests2png/painter.ts deleted file mode 100644 index 9e90e0f5ea..0000000000 --- a/spec/helpers/tests2png/painter.ts +++ /dev/null @@ -1,421 +0,0 @@ -/*eslint-disable no-param-reassign, no-use-before-define*/ -// @ts-ignore: Could not find a declaration file for module -import * as gm from 'gm'; -// @ts-ignore: Could not find a declaration file for module -import * as Color from 'color'; -import { cloneDeep, isEqual} from 'lodash'; -import { TestMessage } from '../../../src/internal/testing/TestMessage'; -import { GMObject, MarbleContent, TestStream } from './types'; - -let canvasHeight: number | undefined; -const CANVAS_WIDTH: number = 1280; -const CANVAS_PADDING: number = 20; -const OBSERVABLE_HEIGHT: number = 200; -const OPERATOR_HEIGHT: number = 140; -const ARROW_HEAD_SIZE: number = 18; -const DEFAULT_MAX_FRAME: number = 10; -const OBSERVABLE_END_PADDING: number = 5 * ARROW_HEAD_SIZE; -const MARBLE_RADIUS: number = 32; -const COMPLETE_HEIGHT: number = MARBLE_RADIUS; -const TALLER_COMPLETE_HEIGHT: number = 1.8 * MARBLE_RADIUS; -const SIN_45: number = 0.707106; -const NESTED_STREAM_ANGLE: number = 18; // degrees -const TO_RAD: number = (Math.PI / 180); -const MESSAGES_WIDTH: number = (CANVAS_WIDTH - 2 * CANVAS_PADDING - OBSERVABLE_END_PADDING); -const BLACK_COLOR: string = '#101010'; -const COLORS: string[] = ['#3EA1CB', '#FFCB46', '#FF6946', '#82D736']; -const SPECIAL_COLOR: string = '#1010F0'; -const MESSAGE_OVERLAP_HEIGHT: number = TALLER_COMPLETE_HEIGHT; - -function colorToGhostColor(hex: string) { - const c = Color(hex).mix(Color('white')); - return c.toString(16); -} - -function getMaxFrame(allStreams: TestStream[]): number { - let allStreamsLen = allStreams.length; - let max = 0; - for (let i = 0; i < allStreamsLen; i++) { - let messagesLen = allStreams[i].messages.length; - for (let j = 0; j < messagesLen; j++) { - if (allStreams[i].messages[j].frame > max) { - max = allStreams[i].messages[j].frame; - } - } - } - return max; -} - -function stringToColor(str: string) { - let smallPrime1 = 59; - let smallPrime2 = 97; - let hash = str.split('') - .map(function (x) { return x.charCodeAt(0); }) - .reduce(function (x, y) { return (x * smallPrime1) + (y * smallPrime2); }, 1); - return COLORS[hash % COLORS.length]; -} - -function isNestedStreamData(message: TestMessage): boolean { - return message.notification.kind === 'N' && - message.notification.value && - message.notification.value.messages; -} - -function areEqualStreamData(leftStreamData: TestStream, rightStreamData: TestStream): boolean { - if (leftStreamData.messages.length !== rightStreamData.messages.length) { - return false; - } - for (let i = 0; i < leftStreamData.messages.length; i++) { - let left = leftStreamData.messages[i]; - let right = rightStreamData.messages[i]; - if (left.frame !== right.frame) { - return false; - } - if (left.notification.kind !== right.notification.kind) { - return false; - } - if (left.notification.value !== right.notification.value) { - return false; - } - } - return true; -} - -function measureObservableArrow(maxFrame: number, streamData: TestStream): { startX: number, endX: number } { - let startX = CANVAS_PADDING + - MESSAGES_WIDTH * (streamData.subscription!.start / maxFrame); - let MAX_MESSAGES_WIDTH = CANVAS_WIDTH - CANVAS_PADDING; - let lastMessageFrame = streamData.messages - .reduce(function (acc, msg) { - let frame = msg.frame; - return frame > acc ? frame : acc; - }, 0); - let subscriptionEndX = typeof streamData.subscription!.end === 'number' ? CANVAS_PADDING + - MESSAGES_WIDTH * (streamData.subscription!.end / maxFrame) + - OBSERVABLE_END_PADDING : undefined; - let streamEndX = startX + - MESSAGES_WIDTH * (lastMessageFrame / maxFrame) + - OBSERVABLE_END_PADDING; - let endX = (streamData.subscription!.end === '100%') ? - MAX_MESSAGES_WIDTH : - Math.max(streamEndX, subscriptionEndX!); - - return {startX: startX, endX: endX}; -} - -function measureInclination(startX: number, endX: number, angle: number): number { - let length = endX - startX; - let cotAngle = Math.cos(angle * TO_RAD) / Math.sin(angle * TO_RAD); - return (length / cotAngle); -} - -function measureNestedStreamHeight(maxFrame: number, streamData: TestStream): number { - let measurements = measureObservableArrow(maxFrame, streamData); - let startX = measurements.startX; - let endX = measurements.endX; - return measureInclination(startX, endX, NESTED_STREAM_ANGLE); -} - -function amountPriorOverlaps(message: TestMessage, messageIndex: number, otherMessages: TestMessage[]): number { - return otherMessages.reduce(function (acc: number, otherMessage: TestMessage, otherIndex) { - if (otherIndex < messageIndex - && otherMessage.frame === message.frame - && message.notification.kind === 'N' - && otherMessage.notification.kind === 'N') { - return acc + 1; - } - return acc; - }, 0); -} - -function measureStreamHeight(maxFrame: number): (streamData: TestStream) => number { - return function measureStreamHeightWithMaxFrame(streamData: TestStream): number { - let messages = streamData.messages; - let maxMessageHeight = messages - .map(function (msg: TestMessage, index) { - let height = isNestedStreamData(msg) ? - measureNestedStreamHeight(maxFrame, msg.notification.value) + OBSERVABLE_HEIGHT * 0.25 : - OBSERVABLE_HEIGHT * 0.5; - let overlapHeightBonus = amountPriorOverlaps(msg, index, messages) * MESSAGE_OVERLAP_HEIGHT; - return height + overlapHeightBonus; - }) - .reduce(function (acc, curr) { - return curr > acc ? curr : acc; - }, 0); - maxMessageHeight = Math.max(maxMessageHeight, OBSERVABLE_HEIGHT * 0.5); // to avoid zero - return OBSERVABLE_HEIGHT * 0.5 + maxMessageHeight; - }; -} - -function drawObservableArrow(out: GMObject, maxFrame: number, y: number, angle: number, streamData: TestStream, isSpecial: boolean): GMObject { - let measurements = measureObservableArrow(maxFrame, streamData); - let startX = measurements.startX; - let endX = measurements.endX; - - let outlineColor = BLACK_COLOR; - if (isSpecial) { - outlineColor = SPECIAL_COLOR; - } - if (streamData.isGhost) { - outlineColor = colorToGhostColor(outlineColor); - } - out = out.stroke(outlineColor, 3); - let inclination = measureInclination(startX, endX, angle); - out = out.drawLine(startX, y, endX, y + inclination); - out = out.draw( - 'translate', String(endX) + ',' + String(y + inclination), - 'rotate ' + String(angle), - 'line', - String(0) + ',' + String(0), - String(-ARROW_HEAD_SIZE * 2) + ',' + String(-ARROW_HEAD_SIZE), - 'line', - String(0) + ',' + String(0), - String(-ARROW_HEAD_SIZE * 2) + ',' + String(+ARROW_HEAD_SIZE)); - return out; -} - -function stringifyContent(content: MarbleContent): string { - let string = content; - if (Array.isArray(content)) { - string = '[' + content.join(',') + ']'; - } else if (typeof content === 'boolean') { - return content ? 'true' : 'false'; - } else if (typeof content === 'object') { - string = JSON.stringify(content).replace(/"/g, ''); - } - return String('"' + string + '"'); -} - -function drawMarble(out: GMObject, x: number, y: number, inclination: number, content: MarbleContent, isSpecial: boolean, isGhost: boolean) { - let fillColor = stringToColor(stringifyContent(content)); - let outlineColor = BLACK_COLOR; - if (isSpecial) { - outlineColor = SPECIAL_COLOR; - } - if (isGhost) { - outlineColor = colorToGhostColor(outlineColor); - fillColor = colorToGhostColor(fillColor); - } - out = out.stroke(outlineColor, 3); - out = out.fill(fillColor); - out = out.drawEllipse(x, y + inclination, MARBLE_RADIUS, MARBLE_RADIUS, 0, 360); - - out = out.strokeWidth(-1); - out = out.fill(outlineColor); - out = out.font('helvetica', 28); - out = out.draw( - 'translate ' + (x - CANVAS_WIDTH * 0.5) + ',' + (y + inclination - canvasHeight! * 0.5), - 'gravity Center', - 'text 0,0', - stringifyContent(content)); - return out; -} - -function drawError(out: GMObject, x: number, y: number, startX: number, angle: number, isSpecial: boolean, isGhost: boolean) { - let inclination = measureInclination(startX, x, angle); - let outlineColor = BLACK_COLOR; - if (isSpecial) { - outlineColor = SPECIAL_COLOR; - } - if (isGhost) { - outlineColor = colorToGhostColor(outlineColor); - } - out = out.stroke(outlineColor, 3); - out = out.draw( - 'translate', String(x) + ',' + String(y + inclination), - 'rotate ' + String(angle), - 'line', - String(-MARBLE_RADIUS * SIN_45) + ',' + String(-MARBLE_RADIUS * SIN_45), - String(+MARBLE_RADIUS * SIN_45) + ',' + String(+MARBLE_RADIUS * SIN_45), - 'line', - String(+MARBLE_RADIUS * SIN_45) + ',' + String(-MARBLE_RADIUS * SIN_45), - String(-MARBLE_RADIUS * SIN_45) + ',' + String(+MARBLE_RADIUS * SIN_45)); - return out; -} - -function drawComplete(out: GMObject, x: number, y: number, - maxFrame: number, angle: number, streamData: TestStream, - isSpecial: boolean, isGhost: boolean) { - let startX = CANVAS_PADDING + - MESSAGES_WIDTH * (streamData.subscription!.start / maxFrame); - let isOverlapping = streamData.messages.some(function (msg) { - if (msg.notification.kind !== 'N') { return false; } - let msgX = startX + MESSAGES_WIDTH * (msg.frame / maxFrame); - return Math.abs(msgX - x) < MARBLE_RADIUS; - }); - let outlineColor = BLACK_COLOR; - if (isSpecial) { - outlineColor = SPECIAL_COLOR; - } - if (isGhost) { - outlineColor = colorToGhostColor(outlineColor); - } - let inclination = measureInclination(startX, x, angle); - let radius = isOverlapping ? TALLER_COMPLETE_HEIGHT : COMPLETE_HEIGHT; - out = out.stroke(outlineColor, 3); - out = out.draw( - 'translate', String(x) + ',' + String(y + inclination), - 'rotate ' + String(angle), - 'line', - String(0) + ',' + String(-radius), - String(0) + ',' + String(+radius)); - return out; -} - -function drawNestedObservable(out: GMObject, maxFrame: number, y: number, streamData: TestStream): GMObject { - let angle = NESTED_STREAM_ANGLE; - out = drawObservableArrow(out, maxFrame, y, angle, streamData, false); - out = drawObservableMessages(out, maxFrame, y, angle, streamData, false); - return out; -} - -function drawObservableMessages(out: GMObject, maxFrame: number, baseY: number, angle: number, streamData: TestStream, isSpecial: boolean): GMObject { - let startX = CANVAS_PADDING + - MESSAGES_WIDTH * (streamData.subscription!.start / maxFrame); - let messages = streamData.messages; - - messages.slice().reverse().forEach(function (message: TestMessage, reversedIndex: number) { - if (message.frame < 0) { // ignore messages with negative frames - return; - } - let index = messages.length - reversedIndex - 1; - let x = startX + MESSAGES_WIDTH * (message.frame / maxFrame); - if (x - MARBLE_RADIUS < 0) { // out of screen, on the left - x += MARBLE_RADIUS; - } - let y = baseY + amountPriorOverlaps(message, index, messages) * MESSAGE_OVERLAP_HEIGHT; - let inclination = measureInclination(startX, x, angle); - switch (message.notification.kind) { - case 'N': - if (isNestedStreamData(message)) { - out = drawNestedObservable(out, maxFrame, y, message.notification.value); - } else { - out = drawMarble(out, x, y, inclination, message.notification.value, isSpecial, streamData.isGhost!); - } - break; - case 'E': out = drawError(out, x, y, startX, angle, isSpecial, streamData.isGhost!); break; - case 'C': out = drawComplete(out, x, y, maxFrame, angle, streamData, isSpecial, streamData.isGhost!); break; - default: break; - } - }); - return out; -} - -function drawObservable(out: GMObject, maxFrame: number, y: number, streamData: TestStream, isSpecial: boolean): GMObject { - let offsetY = OBSERVABLE_HEIGHT * 0.5; - let angle = 0; - out = drawObservableArrow(out, maxFrame, y + offsetY, angle, streamData, isSpecial); - out = drawObservableMessages(out, maxFrame, y + offsetY, angle, streamData, isSpecial); - return out; -} - -function drawOperator(out: GMObject, label: string, y: number): GMObject { - out = out.stroke(BLACK_COLOR, 3); - out = out.fill('#FFFFFF00'); - out = out.drawRectangle( - CANVAS_PADDING, y, - CANVAS_WIDTH - CANVAS_PADDING, y + OPERATOR_HEIGHT); - out = out.strokeWidth(-1); - out = out.fill(BLACK_COLOR); - out = out.font('helvetica', 54); - out = out.draw( - 'translate 0,' + (y + OPERATOR_HEIGHT * 0.5 - canvasHeight! * 0.5), - 'gravity Center', - 'text 0,0', - stringifyContent(label)); - return out; -} - -// Remove cold inputStreams which are already nested in some higher order stream -function removeDuplicateInputs(inputStreams: TestStream[], outputStreams: TestStream[]): TestStream[] { - return inputStreams.filter(function (inputStream) { - return !inputStreams.concat(outputStreams).some(function (otherStream: TestStream) { - return otherStream.messages.some(function (msg) { - let passes = isNestedStreamData(msg) && - inputStream.cold && - isEqual(msg.notification.value.messages, inputStream.cold.messages); - if (passes) { - if (inputStream.cold!.subscriptions.length) { - msg.notification.value.subscription = { - start: inputStream.cold!.subscriptions[0].subscribedFrame, - end: inputStream.cold!.subscriptions[0].unsubscribedFrame - }; - } - } - return passes; - }); - }); - }); -} - -// For every inner stream in a higher order stream, create its ghost version -// A ghost stream is a reference to an Observable that has not yet executed, -// and is painted as a semi-transparent stream. -function addGhostInnerInputs(inputStreams: TestStream[]): TestStream[] { - for (let i = 0; i < inputStreams.length; i++) { - let inputStream = inputStreams[i]; - for (let j = 0; j < inputStream.messages.length; j++) { - let message = inputStream.messages[j]; - if (isNestedStreamData(message) && typeof message.isGhost !== 'boolean') { - let referenceTime = message.frame; - if (!message.notification.value.subscription) { - // There was no subscription at all, so this nested Observable is ghost - message.isGhost = true; - message.notification.value.isGhost = true; - message.frame = referenceTime; - message.notification.value.subscription = { start: referenceTime, end: 0 }; - continue; - } - let subscriptionTime = message.notification.value.subscription.start; - if (referenceTime !== subscriptionTime) { - message.isGhost = false; - message.notification.value.isGhost = false; - message.frame = subscriptionTime; - - let ghost = cloneDeep(message); - ghost.isGhost = true; - ghost.notification.value.isGhost = true; - ghost.frame = referenceTime; - ghost.notification.value.subscription.start = referenceTime; - ghost.notification.value.subscription.end -= subscriptionTime - referenceTime; - inputStream.messages.push(ghost); - } - } - } - } - return inputStreams; -} - -function sanitizeHigherOrderInputStreams(inputStreams: TestStream[], outputStreams: TestStream[]): TestStream[] { - let newInputStreams = removeDuplicateInputs(inputStreams, outputStreams); - newInputStreams = addGhostInnerInputs(newInputStreams); - return newInputStreams; -} - -export function painter(inputStreams: TestStream[], operatorLabel: string, outputStreams: TestStream[], filename: string) { - inputStreams = sanitizeHigherOrderInputStreams(inputStreams, outputStreams); - const maxFrame = getMaxFrame(inputStreams.concat(outputStreams)) || DEFAULT_MAX_FRAME; - let allStreamsHeight = inputStreams.concat(outputStreams) - .map(measureStreamHeight(maxFrame)) - .reduce(function (x, y) { return x + y; }, 0); - canvasHeight = allStreamsHeight + OPERATOR_HEIGHT; - - let heightSoFar = 0; - let out: GMObject = gm(CANVAS_WIDTH, canvasHeight, '#ffffff'); - inputStreams.forEach(function (streamData) { - out = drawObservable(out, maxFrame, heightSoFar, streamData, false); - heightSoFar += measureStreamHeight(maxFrame)(streamData); - }); - out = drawOperator(out, operatorLabel, heightSoFar); - heightSoFar += OPERATOR_HEIGHT; - outputStreams.forEach(function (streamData) { - let isSpecial = inputStreams.length > 0 && areEqualStreamData(inputStreams[0], streamData); - out = drawObservable(out, maxFrame, heightSoFar, streamData, isSpecial); - heightSoFar += measureStreamHeight(maxFrame)(streamData); - }); - out.write(filename, function (err: Error) { - if (err) { - return console.error(arguments); - } - }); -} diff --git a/spec/helpers/tests2png/types.ts b/spec/helpers/tests2png/types.ts deleted file mode 100644 index 6c85dc7b50..0000000000 --- a/spec/helpers/tests2png/types.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { TestMessage } from '../../../src/internal/testing/TestMessage'; -import { ColdObservable } from '../../../src/internal/testing/ColdObservable'; - -export interface TestStream { - messages: TestMessage[]; - cold?: ColdObservable; - subscription?: { - start: number; - end: string | number; - }; - isGhost?: boolean; -} - -export type MarbleContent = string[] | boolean | string | object; - -export interface GMObject { - size: (cb: Function) => GMObject; - format: (cb: Function) => GMObject; - depth: (cb: Function) => GMObject; - color: (cb: Function) => GMObject; - res: (cb: Function) => GMObject; - filesize: (cb: Function) => GMObject; - identify: (cb: Function) => GMObject; - orientation: (cb: Function) => GMObject; - - draw: Function; - drawArc: Function; - drawBezier: Function; - drawCircle: Function; - drawEllipse: Function; - drawLine: Function; - drawPoint: Function; - drawPolygon: Function; - drawPolyline: Function; - drawRectangle: Function; - drawText: Function; - fill: Function; - font: Function; - fontSize: Function; - stroke: Function; - strokeWidth: Function; - setDraw: Function; - write: Function; -} \ No newline at end of file diff --git a/spec/observables/defer-spec.ts b/spec/observables/defer-spec.ts index 819fd573fd..ff7658af12 100644 --- a/spec/observables/defer-spec.ts +++ b/spec/observables/defer-spec.ts @@ -3,12 +3,9 @@ import { defer, of } from 'rxjs'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { mergeMap } from 'rxjs/operators'; -declare function asDiagram(arg: string): Function; - /** @test {defer} */ describe('defer', () => { - asDiagram('defer(() => Observable.of(a, b, c))') - ('should defer the creation of a simple Observable', () => { + it('should defer the creation of a simple Observable', () => { const expected = '-a--b--c--|'; const e1 = defer(() => cold('-a--b--c--|')); expectObservable(e1).toBe(expected); diff --git a/spec/observables/empty-spec.ts b/spec/observables/empty-spec.ts index 2961b8dae2..2bcbf144d4 100644 --- a/spec/observables/empty-spec.ts +++ b/spec/observables/empty-spec.ts @@ -3,12 +3,11 @@ import { expectObservable } from '../helpers/marble-testing'; import { empty, EMPTY } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; -declare const asDiagram: any; declare const rxTestScheduler: TestScheduler; /** @test {empty} */ describe('empty', () => { - asDiagram('empty')('should create a cold observable with only complete', () => { + it('should create a cold observable with only complete', () => { const expected = '|'; const e1 = empty(); expectObservable(e1).toBe(expected); diff --git a/spec/observables/forkJoin-spec.ts b/spec/observables/forkJoin-spec.ts index 054b07bfa0..426fedda5b 100644 --- a/spec/observables/forkJoin-spec.ts +++ b/spec/observables/forkJoin-spec.ts @@ -4,21 +4,19 @@ import { lowerCaseO } from '../helpers/test-helper'; import { hot, expectObservable, expectSubscriptions, cold } from '../helpers/marble-testing'; declare const type: Function; -declare const asDiagram: Function; /** @test {forkJoin} */ describe('forkJoin', () => { - asDiagram('forkJoin') - ('should join the last values of the provided observables into an array', () => { - const e1 = forkJoin([ - hot('-a--b-----c-d-e-|'), - hot('--------f--g-h-i--j-|'), - cold('--1--2-3-4---|'), - ]); - const expected = '--------------------(x|)'; - - expectObservable(e1).toBe(expected, {x: ['e', 'j', '4']}); - }); + it('should join the last values of the provided observables into an array', () => { + const e1 = forkJoin([ + hot('-a--b-----c-d-e-|'), + hot('--------f--g-h-i--j-|'), + cold('--1--2-3-4---|'), + ]); + const expected = '--------------------(x|)'; + + expectObservable(e1).toBe(expected, {x: ['e', 'j', '4']}); + }); it('should support the deprecated resultSelector with an Array of ObservableInputs', () => { const results: Array = []; diff --git a/spec/observables/from-spec.ts b/spec/observables/from-spec.ts index 18dd71ca20..79c4c4afa2 100644 --- a/spec/observables/from-spec.ts +++ b/spec/observables/from-spec.ts @@ -4,7 +4,6 @@ import { asyncScheduler, of, from, Observable, asapScheduler, Observer, observab import { first, concatMap, delay } from 'rxjs/operators'; // tslint:disable:no-any -declare const asDiagram: any; declare const expectObservable: any; declare const type: any; declare const rxTestScheduler: TestScheduler; @@ -16,8 +15,7 @@ function getArguments(...args: T[]) { /** @test {from} */ describe('from', () => { - asDiagram('from([10, 20, 30])') - ('should create an observable from an array', () => { + it('should create an observable from an array', () => { const e1 = from([10, 20, 30]).pipe( // for the purpose of making a nice diagram, spread out the synchronous emissions concatMap((x, i) => of(x).pipe( diff --git a/spec/observables/fromEvent-spec.ts b/spec/observables/fromEvent-spec.ts index 9806dcabfa..d92d5a44fb 100644 --- a/spec/observables/fromEvent-spec.ts +++ b/spec/observables/fromEvent-spec.ts @@ -7,13 +7,11 @@ import { TestScheduler } from 'rxjs/testing'; declare const type: Function; -declare function asDiagram(arg: string): Function; declare const rxTestScheduler: TestScheduler; /** @test {fromEvent} */ describe('fromEvent', () => { - asDiagram('fromEvent(element, \'click\')') - ('should create an observable of click on the element', () => { + it('should create an observable of click on the element', () => { const target = { addEventListener: (eventType: any, listener: any) => { timer(50, 20, rxTestScheduler) diff --git a/spec/observables/fromEventPattern-spec.ts b/spec/observables/fromEventPattern-spec.ts index bad94e8e72..571f6499ac 100644 --- a/spec/observables/fromEventPattern-spec.ts +++ b/spec/observables/fromEventPattern-spec.ts @@ -6,13 +6,11 @@ import { fromEventPattern, noop, NEVER, timer } from 'rxjs'; import { mapTo, take, concat } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; -declare function asDiagram(arg: string): Function; declare const rxTestScheduler: TestScheduler; /** @test {fromEventPattern} */ describe('fromEventPattern', () => { - asDiagram('fromEventPattern(addHandler, removeHandler)') - ('should create an observable from the handler API', () => { + it('should create an observable from the handler API', () => { function addHandler(h: any) { timer(50, 20, rxTestScheduler).pipe( mapTo('ev'), diff --git a/spec/observables/generate-spec.ts b/spec/observables/generate-spec.ts index 2a92f115ef..a378fdf9c2 100644 --- a/spec/observables/generate-spec.ts +++ b/spec/observables/generate-spec.ts @@ -4,7 +4,6 @@ import { expectObservable } from '../helpers/marble-testing'; import { generate, Subscriber } from 'rxjs'; import { take } from 'rxjs/operators'; -declare function asDiagram(arg: string): Function; declare const rxTestScheduler: TestScheduler; function err(): any { @@ -12,24 +11,21 @@ function err(): any { } describe('generate', () => { - asDiagram('generate(1, x => false, x => x + 1)') - ('should complete if condition does not meet', () => { + it('should complete if condition does not meet', () => { const source = generate(1, x => false, x => x + 1); const expected = '|'; expectObservable(source).toBe(expected); }); - asDiagram('generate(1, x => x == 1, x => x + 1)') - ('should produce first value immediately', () => { + it('should produce first value immediately', () => { const source = generate(1, x => x == 1, x => x + 1); const expected = '(1|)'; expectObservable(source).toBe(expected, { '1': 1 }); }); - asDiagram('generate(1, x => x < 3, x => x + 1)') - ('should produce all values synchronously', () => { + it('should produce all values synchronously', () => { const source = generate(1, x => x < 3, x => x + 1); const expected = '(12|)'; diff --git a/spec/observables/interval-spec.ts b/spec/observables/interval-spec.ts index 9fce8a68b9..7a209920c0 100644 --- a/spec/observables/interval-spec.ts +++ b/spec/observables/interval-spec.ts @@ -5,12 +5,11 @@ import { TestScheduler } from 'rxjs/testing'; import { take, concat } from 'rxjs/operators'; import * as sinon from 'sinon'; -declare const asDiagram: any; declare const rxTestScheduler: TestScheduler; /** @test {interval} */ describe('interval', () => { - asDiagram('interval(1000)')('should create an observable emitting periodically', () => { + it('should create an observable emitting periodically', () => { const e1 = interval(20, rxTestScheduler).pipe( take(6), // make it actually finite, so it can be rendered concat(NEVER) // but pretend it's infinite by not completing diff --git a/spec/observables/never-spec.ts b/spec/observables/never-spec.ts index b7fea66ddd..8b8da877e1 100644 --- a/spec/observables/never-spec.ts +++ b/spec/observables/never-spec.ts @@ -2,11 +2,9 @@ import { NEVER } from 'rxjs'; import { expect } from 'chai'; import { expectObservable } from '../helpers/marble-testing'; -declare const asDiagram: any; - /** @test {NEVER} */ describe('NEVER', () => { - asDiagram('NEVER')('should create a cold observable that never emits', () => { + it('should create a cold observable that never emits', () => { const expected = '-'; const e1 = NEVER; expectObservable(e1).toBe(expected); diff --git a/spec/observables/of-spec.ts b/spec/observables/of-spec.ts index 06e3a2664d..827ea66638 100644 --- a/spec/observables/of-spec.ts +++ b/spec/observables/of-spec.ts @@ -4,12 +4,11 @@ import { expectObservable } from '../helpers/marble-testing'; import { TestScheduler } from 'rxjs/testing'; import { concatMap, delay, concatAll } from 'rxjs/operators'; -declare const asDiagram: any; declare const rxTestScheduler: TestScheduler; /** @test {of} */ describe('of', () => { - asDiagram('of(1, 2, 3)')('should create a cold observable that emits 1, 2, 3', () => { + it('should create a cold observable that emits 1, 2, 3', () => { const e1 = of(1, 2, 3).pipe( // for the purpose of making a nice diagram, spread out the synchronous emissions concatMap((x, i) => of(x).pipe(delay(i === 0 ? 0 : 20, rxTestScheduler))) diff --git a/spec/observables/pairs-spec.ts b/spec/observables/pairs-spec.ts index 7e6e57b03b..644aefa7c8 100644 --- a/spec/observables/pairs-spec.ts +++ b/spec/observables/pairs-spec.ts @@ -3,12 +3,10 @@ import { expectObservable } from '../helpers/marble-testing'; import { TestScheduler } from 'rxjs/testing'; import { pairs } from 'rxjs'; -declare const asDiagram: any; - declare const rxTestScheduler: TestScheduler; describe('pairs', () => { - asDiagram('pairs({a: 1, b:2})')('should create an observable emits key-value pair', () => { + it('should create an observable emits key-value pair', () => { const e1 = pairs({a: 1, b: 2}, rxTestScheduler); const expected = '(ab|)'; const values = { diff --git a/spec/observables/partition-spec.ts b/spec/observables/partition-spec.ts index 58c27602bd..5b3a0019b4 100644 --- a/spec/observables/partition-spec.ts +++ b/spec/observables/partition-spec.ts @@ -3,8 +3,6 @@ import { Observable, partition, of } from 'rxjs'; import { mergeMap } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; -declare function asDiagram(arg: string): Function; - /** @test {partition} */ describe('Observable.prototype.partition', () => { function expectObservableArray(result: Observable[], expected: string[]) { @@ -13,7 +11,7 @@ describe('Observable.prototype.partition', () => { } } - asDiagram('partition(x => x % 2 === 1)')('should partition an observable of ' + + it('should partition an observable of ' + 'integers into even and odd', () => { const e1 = hot('--1-2---3------4--5---6--|'); const e1subs = '^ !'; diff --git a/spec/observables/range-spec.ts b/spec/observables/range-spec.ts index 439245604b..b20c86cb41 100644 --- a/spec/observables/range-spec.ts +++ b/spec/observables/range-spec.ts @@ -6,13 +6,11 @@ import { expectObservable } from '../helpers/marble-testing'; import { dispatch } from 'rxjs/internal/observable/range'; import { concatMap, delay } from 'rxjs/operators'; -declare const asDiagram: any; - declare const rxTestScheduler: TestScheduler; /** @test {range} */ describe('range', () => { - asDiagram('range(1, 10)')('should create an observable with numbers 1 to 10', () => { + it('should create an observable with numbers 1 to 10', () => { const e1 = range(1, 10) // for the purpose of making a nice diagram, spread out the synchronous emissions .pipe(concatMap((x, i) => of(x).pipe(delay(i === 0 ? 0 : 20, rxTestScheduler)))); diff --git a/spec/observables/throwError-spec.ts b/spec/observables/throwError-spec.ts index a74ac8850c..05cf24d2cc 100644 --- a/spec/observables/throwError-spec.ts +++ b/spec/observables/throwError-spec.ts @@ -3,12 +3,11 @@ import { TestScheduler } from 'rxjs/testing'; import { throwError } from 'rxjs'; import { expectObservable } from '../helpers/marble-testing'; -declare function asDiagram(arg: string): Function; declare const rxTestScheduler: TestScheduler; /** @test {throw} */ describe('throwError', () => { - asDiagram('throw(e)')('should create a cold observable that just emits an error', () => { + it('should create a cold observable that just emits an error', () => { const expected = '#'; const e1 = throwError('error'); expectObservable(e1).toBe(expected); diff --git a/spec/observables/timer-spec.ts b/spec/observables/timer-spec.ts index 15a7a63a99..4e432dbb03 100644 --- a/spec/observables/timer-spec.ts +++ b/spec/observables/timer-spec.ts @@ -3,12 +3,11 @@ import { timer, NEVER, merge } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; import { mergeMap, take, concat } from 'rxjs/operators'; -declare const asDiagram: any; declare const rxTestScheduler: TestScheduler; /** @test {timer} */ describe('timer', () => { - asDiagram('timer(3000, 1000)')('should create an observable emitting periodically', () => { + it('should create an observable emitting periodically', () => { const e1 = timer(60, 20, rxTestScheduler).pipe( take(4), // make it actually finite, so it can be rendered concat(NEVER) // but pretend it's infinite by not completing diff --git a/spec/operators/audit-spec.ts b/spec/operators/audit-spec.ts index 75d6889270..641a41bf50 100644 --- a/spec/operators/audit-spec.ts +++ b/spec/operators/audit-spec.ts @@ -4,8 +4,6 @@ import { of, interval, EMPTY } from 'rxjs'; import { audit, take, mergeMap } from 'rxjs/operators'; import { observableMatcher } from '../helpers/observableMatcher'; -declare function asDiagram(arg: string): Function; - /** @test {audit} */ describe('audit operator', () => { let testScheduler: TestScheduler; @@ -14,7 +12,7 @@ describe('audit operator', () => { testScheduler = new TestScheduler(observableMatcher); }); - asDiagram('audit')('should emit the last value in each time window', () => { + it('should emit the last value in each time window', () => { testScheduler.run(({ hot, cold, expectObservable, expectSubscriptions }) => { const e1 = hot(' -a-xy-----b--x--cxxx-|'); const e1subs = ' ^--------------------!'; diff --git a/spec/operators/auditTime-spec.ts b/spec/operators/auditTime-spec.ts index d035ad9b45..99eec7f7d0 100644 --- a/spec/operators/auditTime-spec.ts +++ b/spec/operators/auditTime-spec.ts @@ -4,8 +4,6 @@ import { auditTime, take, map, mergeMap } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { observableMatcher } from '../helpers/observableMatcher'; -declare function asDiagram(arg: string): Function; - /** @test {auditTime} */ describe('auditTime operator', () => { let testScheduler: TestScheduler; @@ -14,7 +12,7 @@ describe('auditTime operator', () => { testScheduler = new TestScheduler(observableMatcher); }); - asDiagram('auditTime(5)')('should emit the last value in each time window', () => { + it('should emit the last value in each time window', () => { testScheduler.run(({ hot, expectObservable, expectSubscriptions }) => { const e1 = hot(' -a-x-y----b---x-cx---|'); const subs = ' ^--------------------!'; diff --git a/spec/operators/buffer-spec.ts b/spec/operators/buffer-spec.ts index 6ce302ffb5..3cda51c918 100644 --- a/spec/operators/buffer-spec.ts +++ b/spec/operators/buffer-spec.ts @@ -3,8 +3,6 @@ import { EMPTY, NEVER, throwError, of } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; import { observableMatcher } from '../helpers/observableMatcher'; -declare function asDiagram(arg: string): Function; - /** @test {buffer} */ describe('Observable.prototype.buffer', () => { let testScheduler: TestScheduler; @@ -13,7 +11,7 @@ describe('Observable.prototype.buffer', () => { testScheduler = new TestScheduler(observableMatcher); }); - asDiagram('buffer')('should emit buffers that close and reopen', () => { + it('should emit buffers that close and reopen', () => { testScheduler.run(({ hot, expectObservable }) => { const a = hot(' -a-b-c-d-e-f-g-h-i-|'); const b = hot(' -----B-----B-----B-|'); diff --git a/spec/operators/bufferCount-spec.ts b/spec/operators/bufferCount-spec.ts index 3205e75d89..6cac72cb44 100644 --- a/spec/operators/bufferCount-spec.ts +++ b/spec/operators/bufferCount-spec.ts @@ -4,8 +4,6 @@ import { bufferCount, mergeMap } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { observableMatcher } from '../helpers/observableMatcher'; -declare function asDiagram(arg: string): Function; - /** @test {bufferCount} */ describe('bufferCount operator', () => { let testScheduler: TestScheduler; @@ -14,7 +12,7 @@ describe('bufferCount operator', () => { testScheduler = new TestScheduler(observableMatcher); }); - asDiagram('bufferCount(3,2)')('should emit buffers at intervals', () => { + it('should emit buffers at intervals', () => { testScheduler.run(({ hot, expectObservable }) => { const values = { v: ['a', 'b', 'c'], diff --git a/spec/operators/bufferTime-spec.ts b/spec/operators/bufferTime-spec.ts index 015473bb95..f7c8a3cbb5 100644 --- a/spec/operators/bufferTime-spec.ts +++ b/spec/operators/bufferTime-spec.ts @@ -3,8 +3,6 @@ import { bufferTime, mergeMap, take } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { observableMatcher } from '../helpers/observableMatcher'; -declare const asDiagram: Function; - /** @test {bufferTime} */ describe('bufferTime operator', () => { let testScheduler: TestScheduler; @@ -13,7 +11,7 @@ describe('bufferTime operator', () => { testScheduler = new TestScheduler(observableMatcher); }); - asDiagram('bufferTime(100)')('should emit buffers at intervals', () => { + it('should emit buffers at intervals', () => { testScheduler.run(({ hot, time, expectObservable, expectSubscriptions }) => { const e1 = hot(' ---a---b---c---d---e---f---g-----| '); const subs = ' ^--------------------------------! '; diff --git a/spec/operators/bufferToggle-spec.ts b/spec/operators/bufferToggle-spec.ts index b01e0ad189..f9933d8f43 100644 --- a/spec/operators/bufferToggle-spec.ts +++ b/spec/operators/bufferToggle-spec.ts @@ -4,8 +4,6 @@ import { bufferToggle, mergeMap, mapTo } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { observableMatcher } from '../helpers/observableMatcher'; -declare function asDiagram(arg: string): Function; - /** @test {bufferToggle} */ describe('bufferToggle operator', () => { let testScheduler: TestScheduler; @@ -14,7 +12,7 @@ describe('bufferToggle operator', () => { testScheduler = new TestScheduler(observableMatcher); }); - asDiagram('bufferToggle')('should emit buffers using hot openings and hot closings', () => { + it('should emit buffers using hot openings and hot closings', () => { testScheduler.run(({ hot, expectObservable }) => { const e1 = hot(' ---a---b---c---d---e---f---g---|'); const e2 = hot(' --o------------------o---------|'); diff --git a/spec/operators/bufferWhen-spec.ts b/spec/operators/bufferWhen-spec.ts index a33775ce25..4c98e89dd1 100644 --- a/spec/operators/bufferWhen-spec.ts +++ b/spec/operators/bufferWhen-spec.ts @@ -4,8 +4,6 @@ import { bufferWhen, mergeMap, takeWhile } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { observableMatcher } from '../helpers/observableMatcher'; -declare function asDiagram(arg: string): Function; - /** @test {bufferWhen} */ describe('bufferWhen operator', () => { let testScheduler: TestScheduler; @@ -14,7 +12,7 @@ describe('bufferWhen operator', () => { testScheduler = new TestScheduler(observableMatcher); }); - asDiagram('bufferWhen')('should emit buffers that close and reopen', () => { + it('should emit buffers that close and reopen', () => { testScheduler.run(({ hot, cold, expectObservable }) => { const e1 = hot('--a--^---b---c---d---e---f---g---------| '); const e2 = cold(' --------------(s|) '); diff --git a/spec/operators/catch-spec.ts b/spec/operators/catch-spec.ts index 17904b2b07..5902db3d22 100644 --- a/spec/operators/catch-spec.ts +++ b/spec/operators/catch-spec.ts @@ -7,8 +7,6 @@ import { TestScheduler } from 'rxjs/testing'; import { observableMatcher } from '../helpers/observableMatcher'; import { asInteropObservable } from '../helpers/interop-helper'; -declare function asDiagram(arg: string): Function; - /** @test {catch} */ describe('catchError operator', () => { let testScheduler: TestScheduler; @@ -17,7 +15,7 @@ describe('catchError operator', () => { testScheduler = new TestScheduler(observableMatcher); }); - asDiagram('catch')('should catch error and replace with a cold Observable', () => { + it('should catch error and replace with a cold Observable', () => { testScheduler.run(({ hot, cold, expectObservable }) => { const e1 = hot(' --a--b--# '); const e2 = cold(' -1-2-3-|'); diff --git a/spec/operators/combineAll-spec.ts b/spec/operators/combineAll-spec.ts index a79db20b9c..59da5d340c 100644 --- a/spec/operators/combineAll-spec.ts +++ b/spec/operators/combineAll-spec.ts @@ -4,7 +4,6 @@ import { combineAll, mergeMap } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { observableMatcher } from '../helpers/observableMatcher'; -declare function asDiagram(arg: string): Function; declare const type: Function; /** @test {combineAll} */ @@ -15,7 +14,7 @@ describe('combineAll operator', () => { testScheduler = new TestScheduler(observableMatcher); }); - asDiagram('combineAll')('should combine events from two observables', () => { + it('should combine events from two observables', () => { testScheduler.run(({ hot, cold, expectObservable }) => { const x = cold(' -a-----b---|'); const y = cold(' --1-2-| '); diff --git a/spec/operators/combineLatest-legacy-spec.ts b/spec/operators/combineLatest-legacy-spec.ts index 7440b09478..2b61b2848c 100644 --- a/spec/operators/combineLatest-legacy-spec.ts +++ b/spec/operators/combineLatest-legacy-spec.ts @@ -3,8 +3,6 @@ import { combineLatest, mergeMap, distinct, count } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { observableMatcher } from '../helpers/observableMatcher'; -declare function asDiagram(arg: string): Function; - /** @test {combineLatest} */ describe('combineLatest', () => { let testScheduler: TestScheduler; @@ -13,7 +11,7 @@ describe('combineLatest', () => { testScheduler = new TestScheduler(observableMatcher); }); - asDiagram('combineLatest')('should combine events from two cold observables', () => { + it('should combine events from two cold observables', () => { testScheduler.run(({ cold, expectObservable }) => { const e1 = cold(' -a--b-----c-d-e-|'); const e2 = cold(' --1--2-3-4---| '); diff --git a/spec/operators/concat-spec.ts b/spec/operators/concat-spec.ts index 44a99320fc..788cfcb8a1 100644 --- a/spec/operators/concat-spec.ts +++ b/spec/operators/concat-spec.ts @@ -4,8 +4,6 @@ import { concat, mergeMap } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { observableMatcher } from '../helpers/observableMatcher'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {concat} */ @@ -16,7 +14,7 @@ describe('concat operator', () => { testScheduler = new TestScheduler(observableMatcher); }); - asDiagram('concat')('should concatenate two cold observables', () => { + it('should concatenate two cold observables', () => { testScheduler.run(({ cold, expectObservable }) => { const e1 = cold(' --a--b-|'); const e2 = cold(' --x---y--|'); diff --git a/spec/operators/concatAll-spec.ts b/spec/operators/concatAll-spec.ts index b1a2e70dfa..b616db3805 100644 --- a/spec/operators/concatAll-spec.ts +++ b/spec/operators/concatAll-spec.ts @@ -4,7 +4,6 @@ import { concatAll, take, mergeMap } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { observableMatcher } from '../helpers/observableMatcher'; -declare function asDiagram(arg: string): Function; declare const type: Function; declare const rxTestScheduler: TestScheduler; @@ -16,7 +15,7 @@ describe('concatAll operator', () => { testScheduler = new TestScheduler(observableMatcher); }); - asDiagram('concatAll')('should concat an observable of observables', () => { + it('should concat an observable of observables', () => { testScheduler.run(({ cold, hot, expectObservable }) => { const x = cold(' ----a------b------| '); const y = cold(' ---c-d---| '); diff --git a/spec/operators/concatMap-spec.ts b/spec/operators/concatMap-spec.ts index c282ec4db6..1610d969fb 100644 --- a/spec/operators/concatMap-spec.ts +++ b/spec/operators/concatMap-spec.ts @@ -4,8 +4,6 @@ import { concatMap, mergeMap, map } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { observableMatcher } from '../helpers/observableMatcher'; -declare function asDiagram(arg: string): Function; - /** @test {concatMap} */ describe('Observable.prototype.concatMap', () => { let testScheduler: TestScheduler; @@ -14,7 +12,7 @@ describe('Observable.prototype.concatMap', () => { testScheduler = new TestScheduler(observableMatcher); }); - asDiagram('concatMap(i => 10*i\u2014\u201410*i\u2014\u201410*i\u2014| )')('should map-and-flatten each item to an Observable', () => { + it('should map-and-flatten each item to an Observable', () => { testScheduler.run(({ hot, cold, expectObservable, expectSubscriptions }) => { const e1 = hot(' --1-----3--5-------|'); const e1subs = ' ^------------------!'; diff --git a/spec/operators/concatMapTo-spec.ts b/spec/operators/concatMapTo-spec.ts index 06209e3fd9..e902903ab5 100644 --- a/spec/operators/concatMapTo-spec.ts +++ b/spec/operators/concatMapTo-spec.ts @@ -3,12 +3,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { of, from } from 'rxjs'; import { concatMapTo, mergeMap } from 'rxjs/operators'; -declare function asDiagram(arg: string): Function; - /** @test {concatMapTo} */ describe('Observable.prototype.concatMapTo', () => { - asDiagram('concatMapTo( 10\u2014\u201410\u2014\u201410\u2014| )') - ('should map-and-flatten each item to an Observable', () => { + it('should map-and-flatten each item to an Observable', () => { const e1 = hot('--1-----3--5-------|'); const e1subs = '^ !'; const e2 = cold('x-x-x| ', {x: 10}); diff --git a/spec/operators/count-spec.ts b/spec/operators/count-spec.ts index 3b67c256f5..efdae7e1df 100644 --- a/spec/operators/count-spec.ts +++ b/spec/operators/count-spec.ts @@ -3,11 +3,9 @@ import { of, range } from 'rxjs'; import { count, skip, take, mergeMap } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; -declare function asDiagram(arg: string): Function; - /** @test {count} */ describe('count operator', () => { - asDiagram('count')('should count the values of an observable', () => { + it('should count the values of an observable', () => { const source = hot('--a--b--c--|'); const subs = '^ !'; const expected = '-----------(x|)'; diff --git a/spec/operators/debounce-spec.ts b/spec/operators/debounce-spec.ts index 92532e60a7..fbb4f81acd 100644 --- a/spec/operators/debounce-spec.ts +++ b/spec/operators/debounce-spec.ts @@ -5,7 +5,6 @@ import { TestScheduler } from 'rxjs/testing'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; declare const type: Function; -declare function asDiagram(arg: string): Function; declare const rxTestScheduler: TestScheduler; @@ -15,7 +14,7 @@ describe('debounce operator', () => { return () => timer(x, rxTestScheduler); } - asDiagram('debounce')('should debounce values by a specified cold Observable', () => { + it('should debounce values by a specified cold Observable', () => { const e1 = hot('-a--bc--d---|'); const e2 = cold('--| '); const expected = '---a---c--d-|'; diff --git a/spec/operators/debounceTime-spec.ts b/spec/operators/debounceTime-spec.ts index f9ea8f21b0..a6528288f7 100644 --- a/spec/operators/debounceTime-spec.ts +++ b/spec/operators/debounceTime-spec.ts @@ -5,13 +5,11 @@ import { TestScheduler } from 'rxjs/testing'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { VirtualTimeScheduler } from '../../src/internal/scheduler/VirtualTimeScheduler'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {debounceTime} */ describe('debounceTime operator', () => { - asDiagram('debounceTime(20)')('should debounce values by 20 time units', () => { + it('should debounce values by 20 time units', () => { const e1 = hot('-a--bc--d---|'); const expected = '---a---c--d-|'; diff --git a/spec/operators/defaultIfEmpty-spec.ts b/spec/operators/defaultIfEmpty-spec.ts index a3f4f5b625..270455eb8f 100644 --- a/spec/operators/defaultIfEmpty-spec.ts +++ b/spec/operators/defaultIfEmpty-spec.ts @@ -2,11 +2,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { of } from 'rxjs'; import { defaultIfEmpty, mergeMap } from 'rxjs/operators'; -declare function asDiagram(arg: string): Function; - /** @test {defaultIfEmpty} */ describe('Observable.prototype.defaultIfEmpty', () => { - asDiagram('defaultIfEmpty(42)')('should return the Observable if not empty with a default value', () => { + it('should return the Observable if not empty with a default value', () => { const e1 = hot('--------|'); const expected = '--------(x|)'; diff --git a/spec/operators/delay-spec.ts b/spec/operators/delay-spec.ts index 0a398023c0..845d32a522 100644 --- a/spec/operators/delay-spec.ts +++ b/spec/operators/delay-spec.ts @@ -5,8 +5,6 @@ import * as sinon from 'sinon'; import { expect } from 'chai'; import { observableMatcher } from '../helpers/observableMatcher'; -declare const asDiagram: Function; - /** @test {delay} */ describe('delay operator', () => { let testScheduler: TestScheduler; @@ -15,7 +13,7 @@ describe('delay operator', () => { testScheduler = new TestScheduler(observableMatcher); }); - asDiagram('delay(20)')('should delay by specified timeframe', () => { + it('should delay by specified timeframe', () => { testScheduler.run(({ hot, expectObservable, expectSubscriptions }) => { const e1 = hot('---a--b--|'); const t = 2; // --| diff --git a/spec/operators/delayWhen-spec.ts b/spec/operators/delayWhen-spec.ts index 4426acc632..86139ad18d 100644 --- a/spec/operators/delayWhen-spec.ts +++ b/spec/operators/delayWhen-spec.ts @@ -4,13 +4,11 @@ import { TestScheduler } from 'rxjs/testing'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { expect } from 'chai'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {delayWhen} */ describe('delayWhen operator', () => { - asDiagram('delayWhen(durationSelector)')('should delay by duration selector', () => { + it('should delay by duration selector', () => { const e1 = hot('---a---b---c--|'); const expected = '-----a------c----(b|)'; const subs = '^ !'; diff --git a/spec/operators/dematerialize-spec.ts b/spec/operators/dematerialize-spec.ts index 0fc114200f..d4a4aecd5c 100644 --- a/spec/operators/dematerialize-spec.ts +++ b/spec/operators/dematerialize-spec.ts @@ -2,13 +2,11 @@ import { of, Notification } from 'rxjs'; import { dematerialize, map, mergeMap } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; -declare function asDiagram(arg: string): Function; - const NO_VALUES: { [key: string]: Notification } = {}; /** @test {dematerialize} */ describe('dematerialize operator', () => { - asDiagram('dematerialize')('should dematerialize an Observable', () => { + it('should dematerialize an Observable', () => { const values = { a: '{x}', b: '{y}', diff --git a/spec/operators/distinctUntilChanged-spec.ts b/spec/operators/distinctUntilChanged-spec.ts index fabfd87bf4..4fd32549e7 100644 --- a/spec/operators/distinctUntilChanged-spec.ts +++ b/spec/operators/distinctUntilChanged-spec.ts @@ -2,11 +2,9 @@ import { distinctUntilChanged, mergeMap } from 'rxjs/operators'; import { of } from 'rxjs'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; -declare function asDiagram(arg: string): Function; - /** @test {distinctUntilChanged} */ describe('distinctUntilChanged operator', () => { - asDiagram('distinctUntilChanged')('should distinguish between values', () => { + it('should distinguish between values', () => { const e1 = hot('-1--2-2----1-3-|'); const expected = '-1--2------1-3-|'; diff --git a/spec/operators/distinctUntilKeyChanged-spec.ts b/spec/operators/distinctUntilKeyChanged-spec.ts index 10674d0c94..af99926438 100644 --- a/spec/operators/distinctUntilKeyChanged-spec.ts +++ b/spec/operators/distinctUntilKeyChanged-spec.ts @@ -2,11 +2,9 @@ import { distinctUntilKeyChanged, mergeMap } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {distinctUntilKeyChanged} */ describe('distinctUntilKeyChanged operator', () => { - asDiagram('distinctUntilKeyChanged(\'k\')')('should distinguish between values', () => { + it('should distinguish between values', () => { const values = {a: {k: 1}, b: {k: 2}, c: {k: 3}}; const e1 = hot('-a--b-b----a-c-|', values); const expected = '-a--b------a-c-|'; diff --git a/spec/operators/elementAt-spec.ts b/spec/operators/elementAt-spec.ts index 93228b40d5..aa85e85b07 100644 --- a/spec/operators/elementAt-spec.ts +++ b/spec/operators/elementAt-spec.ts @@ -3,11 +3,9 @@ import { elementAt, mergeMap } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { ArgumentOutOfRangeError, of, range } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {elementAt} */ describe('elementAt operator', () => { - asDiagram('elementAt(2)')('should return last element by zero-based index', () => { + it('should return last element by zero-based index', () => { const source = hot('--a--b--c-d---|'); const subs = '^ ! '; const expected = '--------(c|) '; diff --git a/spec/operators/endWith-spec.ts b/spec/operators/endWith-spec.ts index f42d33bc65..325b0f579e 100644 --- a/spec/operators/endWith-spec.ts +++ b/spec/operators/endWith-spec.ts @@ -3,15 +3,13 @@ import { endWith, mergeMap } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {endWith} */ describe('endWith operator', () => { const defaultStartValue = 'x'; - asDiagram('endWith(s)')('should append to a cold Observable', () => { + it('should append to a cold Observable', () => { const e1 = cold('---a--b--c--|'); const e1subs = '^ !'; const expected = '---a--b--c--(s|)'; diff --git a/spec/operators/every-spec.ts b/spec/operators/every-spec.ts index 622b2371b8..ee357ddefa 100644 --- a/spec/operators/every-spec.ts +++ b/spec/operators/every-spec.ts @@ -3,8 +3,6 @@ import { every, mergeMap } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { of, Observable, Observer } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {every} */ describe('every operator', () => { function truePredicate(x: number | string) { @@ -15,7 +13,7 @@ describe('every operator', () => { return (+x) % 5 === 0; } - asDiagram('every(x => x % 5 === 0)')('should return false if only some of element matches with predicate', () => { + it('should return false if only some of element matches with predicate', () => { const source = hot('--a--b--c--d--e--|', {a: 5, b: 10, c: 15, d: 18, e: 20}); const sourceSubs = '^ ! '; const expected = '-----------(F|) '; diff --git a/spec/operators/exhaust-spec.ts b/spec/operators/exhaust-spec.ts index c5c7d32571..c5b0ff1b00 100644 --- a/spec/operators/exhaust-spec.ts +++ b/spec/operators/exhaust-spec.ts @@ -3,12 +3,11 @@ import { exhaust, mergeMap } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { of, Observable } from 'rxjs'; -declare function asDiagram(arg: string): Function; declare const type: Function; /** @test {exhaust} */ describe('exhaust operator', () => { - asDiagram('exhaust')('should handle a hot observable of hot observables', () => { + it('should handle a hot observable of hot observables', () => { const x = cold( '--a---b---c--| '); const y = cold( '---d--e---f---| '); const z = cold( '---g--h---i---|'); diff --git a/spec/operators/exhaustMap-spec.ts b/spec/operators/exhaustMap-spec.ts index 77f76e0523..75eb5d18af 100644 --- a/spec/operators/exhaustMap-spec.ts +++ b/spec/operators/exhaustMap-spec.ts @@ -4,12 +4,9 @@ import { exhaustMap, mergeMap, takeWhile, map } from 'rxjs/operators'; import { expect } from 'chai'; import { asInteropObservable } from '../helpers/interop-helper'; -declare function asDiagram(arg: string): Function; - /** @test {exhaustMap} */ describe('exhaustMap', () => { - asDiagram('exhaustMap(i => 10*i\u2014\u201410*i\u2014\u201410*i\u2014| )') - ('should map-and-flatten each item to an Observable', () => { + it('should map-and-flatten each item to an Observable', () => { const e1 = hot('--1-----3--5-------|'); const e1subs = '^ !'; const e2 = cold('x-x-x| ', {x: 10}); diff --git a/spec/operators/expand-spec.ts b/spec/operators/expand-spec.ts index 15b61a9430..925f4cefdc 100644 --- a/spec/operators/expand-spec.ts +++ b/spec/operators/expand-spec.ts @@ -4,15 +4,13 @@ import { TestScheduler } from 'rxjs/testing'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { Subscribable, EMPTY, Observable, of, Observer } from 'rxjs'; -declare function asDiagram(arg: string): Function; declare const type: Function; declare const rxTestScheduler: TestScheduler; /** @test {expand} */ describe('expand operator', () => { - asDiagram('expand(x => x === 8 ? empty : \u2014\u20142*x\u2014| )') - ('should recursively map-and-flatten each item to an Observable', () => { + it('should recursively map-and-flatten each item to an Observable', () => { const e1 = hot('--x----| ', {x: 1}); const e1subs = '^ ! '; const e2 = cold( '--c| ', {c: 2}); diff --git a/spec/operators/filter-spec.ts b/spec/operators/filter-spec.ts index 5ca1a72469..ba4658dc07 100644 --- a/spec/operators/filter-spec.ts +++ b/spec/operators/filter-spec.ts @@ -3,8 +3,6 @@ import { filter, tap, map, mergeMap } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { of, Observable, from } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {filter} */ describe('filter operator', () => { function oddFilter(x: number | string) { @@ -20,7 +18,7 @@ describe('filter operator', () => { return true; } - asDiagram('filter(x => x % 2 === 1)')('should filter out even values', () => { + it('should filter out even values', () => { const source = hot('--0--1--2--3--4--|'); const subs = '^ !'; const expected = '-----1-----3-----|'; diff --git a/spec/operators/find-spec.ts b/spec/operators/find-spec.ts index c1ec914356..bae2b7b8b9 100644 --- a/spec/operators/find-spec.ts +++ b/spec/operators/find-spec.ts @@ -4,8 +4,6 @@ import { TestScheduler } from 'rxjs/testing'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { of, Observable, from } from 'rxjs'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {find} */ @@ -14,7 +12,7 @@ describe('find operator', () => { return true; } - asDiagram('find(x => x % 5 === 0)')('should return matching element from source emits single element', () => { + it('should return matching element from source emits single element', () => { const values = {a: 3, b: 9, c: 15, d: 20}; const source = hot('---a--b--c--d---|', values); const subs = '^ ! '; diff --git a/spec/operators/findIndex-spec.ts b/spec/operators/findIndex-spec.ts index 1dd023bf4c..36b6d00abd 100644 --- a/spec/operators/findIndex-spec.ts +++ b/spec/operators/findIndex-spec.ts @@ -3,8 +3,6 @@ import { TestScheduler } from 'rxjs/testing'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {findIndex} */ @@ -13,7 +11,7 @@ describe('findIndex operator', () => { return true; } - asDiagram('findIndex(x => x % 5 === 0)')('should return matching element from source emits single element', () => { + it('should return matching element from source emits single element', () => { const values = {a: 3, b: 9, c: 15, d: 20}; const source = hot('---a--b--c--d---|', values); const subs = '^ ! '; diff --git a/spec/operators/first-spec.ts b/spec/operators/first-spec.ts index dea1931cb6..22b027f509 100644 --- a/spec/operators/first-spec.ts +++ b/spec/operators/first-spec.ts @@ -4,13 +4,11 @@ import { first, mergeMap, delay } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { of, from, Observable, Subject, EmptyError } from 'rxjs'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {first} */ describe('Observable.prototype.first', () => { - asDiagram('first')('should take the first value of an observable with many values', () => { + it('should take the first value of an observable with many values', () => { const e1 = hot('-----a--b--c---d---|'); const expected = '-----(a|) '; const sub = '^ ! '; diff --git a/spec/operators/groupBy-spec.ts b/spec/operators/groupBy-spec.ts index 92025bbc57..347d5d78d1 100644 --- a/spec/operators/groupBy-spec.ts +++ b/spec/operators/groupBy-spec.ts @@ -4,13 +4,11 @@ import { TestScheduler } from 'rxjs/testing'; import { ReplaySubject, of, GroupedObservable, Observable, Operator, Observer } from 'rxjs'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {groupBy} */ describe('groupBy operator', () => { - asDiagram('groupBy(i => i % 2)')('should group numbers by odd/even', () => { + it('should group numbers by odd/even', () => { const e1 = hot('--1---2---3---4---5---|'); const expected = '--x---y---------------|'; const x = cold( '1-------3-------5---|'); diff --git a/spec/operators/ignoreElements-spec.ts b/spec/operators/ignoreElements-spec.ts index 6171fd4521..6f75c8bcdc 100644 --- a/spec/operators/ignoreElements-spec.ts +++ b/spec/operators/ignoreElements-spec.ts @@ -2,11 +2,9 @@ import { ignoreElements, mergeMap } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {ignoreElements} */ describe('ignoreElements operator', () => { - asDiagram('ignoreElements')('should ignore all the elements of the source', () => { + it('should ignore all the elements of the source', () => { const source = hot('--a--b--c--d--|'); const subs = '^ !'; const expected = '--------------|'; diff --git a/spec/operators/isEmpty-spec.ts b/spec/operators/isEmpty-spec.ts index 4c50017390..88d864551a 100644 --- a/spec/operators/isEmpty-spec.ts +++ b/spec/operators/isEmpty-spec.ts @@ -2,11 +2,9 @@ import { isEmpty, mergeMap } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {isEmpty} */ describe('isEmpty operator', () => { - asDiagram('isEmpty')('should return true if source is empty', () => { + it('should return true if source is empty', () => { const source = hot('-----|'); const subs = '^ !'; const expected = '-----(T|)'; diff --git a/spec/operators/last-spec.ts b/spec/operators/last-spec.ts index 1cb84e72b9..d3a33acc6c 100644 --- a/spec/operators/last-spec.ts +++ b/spec/operators/last-spec.ts @@ -3,11 +3,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { last, mergeMap } from 'rxjs/operators'; import { EmptyError, of, from, Observable } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {last} */ describe('Observable.prototype.last', () => { - asDiagram('last')('should take the last value of an observable', () => { + it('should take the last value of an observable', () => { const e1 = hot('--a----b--c--|'); const e1subs = '^ !'; const expected = '-------------(c|)'; diff --git a/spec/operators/map-spec.ts b/spec/operators/map-spec.ts index f829ff10e1..b44611b3a1 100644 --- a/spec/operators/map-spec.ts +++ b/spec/operators/map-spec.ts @@ -3,15 +3,13 @@ import { map, tap, mergeMap } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - // function shortcuts const addDrama = function (x: number | string) { return x + '!'; }; const identity = function (x: T) { return x; }; /** @test {map} */ describe('map operator', () => { - asDiagram('map(x => 10 * x)')('should map multiple values', () => { + it('should map multiple values', () => { const a = cold('--1--2--3--|'); const asubs = '^ !'; const expected = '--x--y--z--|'; diff --git a/spec/operators/mapTo-spec.ts b/spec/operators/mapTo-spec.ts index 470ce498df..8c1d9a417d 100644 --- a/spec/operators/mapTo-spec.ts +++ b/spec/operators/mapTo-spec.ts @@ -3,11 +3,9 @@ import { mapTo, mergeMap } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {mapTo} */ describe('mapTo operator', () => { - asDiagram('mapTo(\'a\')')('should map multiple values', () => { + it('should map multiple values', () => { const a = cold('--1--2--3--|'); const asubs = '^ !'; const expected = '--a--a--a--|'; diff --git a/spec/operators/materialize-spec.ts b/spec/operators/materialize-spec.ts index babaf8db74..d41af948b1 100644 --- a/spec/operators/materialize-spec.ts +++ b/spec/operators/materialize-spec.ts @@ -2,11 +2,9 @@ import { materialize, map, mergeMap } from 'rxjs/operators'; import { Notification, of } from 'rxjs'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; -declare function asDiagram(arg: string): Function; - /** @test {materialize} */ describe('materialize operator', () => { - asDiagram('materialize')('should materialize an Observable', () => { + it('should materialize an Observable', () => { const e1 = hot('--x--y--z--|'); const expected = '--a--b--c--(d|)'; const values = { a: '{x}', b: '{y}', c: '{z}', d: '|' }; diff --git a/spec/operators/max-spec.ts b/spec/operators/max-spec.ts index cbc32f0968..984b048657 100644 --- a/spec/operators/max-spec.ts +++ b/spec/operators/max-spec.ts @@ -3,11 +3,9 @@ import { max, mergeMap, skip, take } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { of, range } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {max} */ describe('max operator', () => { - asDiagram('max')('should find the max of values of an observable', () => { + it('should find the max of values of an observable', () => { const e1 = hot('--a--b--c--|', { a: 42, b: -1, c: 3 }); const subs = '^ !'; const expected = '-----------(x|)'; diff --git a/spec/operators/mergeAll-spec.ts b/spec/operators/mergeAll-spec.ts index b618a26f35..17b8c61def 100644 --- a/spec/operators/mergeAll-spec.ts +++ b/spec/operators/mergeAll-spec.ts @@ -3,12 +3,11 @@ import { mergeAll, mergeMap, take } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { throwError, from, of, queueScheduler } from 'rxjs'; -declare function asDiagram(arg: string): Function; declare const type: Function; /** @test {mergeAll} */ describe('mergeAll oeprator', () => { - asDiagram('mergeAll')('should merge a hot observable of cold observables', () => { + it('should merge a hot observable of cold observables', () => { const x = cold( '--a---b--c---d--| '); const y = cold( '----e---f--g---|'); const e1 = hot( '--x------y-------| ', { x: x, y: y }); diff --git a/spec/operators/mergeMap-spec.ts b/spec/operators/mergeMap-spec.ts index 5fbf6d0c5b..4d36385921 100644 --- a/spec/operators/mergeMap-spec.ts +++ b/spec/operators/mergeMap-spec.ts @@ -17,8 +17,7 @@ describe('mergeMap', () => { rxTest = new TestScheduler(observableMatcher); }); - asDiagram('mergeMap(i => 10*i\u2014\u201410*i\u2014\u201410*i\u2014| )') - ('should map-and-flatten each item to an Observable', () => { + it('should map-and-flatten each item to an Observable', () => { const e1 = hot('--1-----3--5-------|'); const e1subs = '^ !'; const e2 = cold('x-x-x| ', {x: 10}); diff --git a/spec/operators/mergeMapTo-spec.ts b/spec/operators/mergeMapTo-spec.ts index f0fdc37761..e5e34d9275 100644 --- a/spec/operators/mergeMapTo-spec.ts +++ b/spec/operators/mergeMapTo-spec.ts @@ -4,12 +4,10 @@ import { mergeMapTo, map } from 'rxjs/operators'; import { from, of, Observable } from 'rxjs'; declare const type: Function; -declare const asDiagram: Function; /** @test {mergeMapTo} */ describe('mergeMapTo', () => { - asDiagram('mergeMapTo( 10\u2014\u201410\u2014\u201410\u2014| )') - ('should map-and-flatten each item to an Observable', () => { + it('should map-and-flatten each item to an Observable', () => { const e1 = hot('--1-----3--5-------|'); const e1subs = '^ !'; const e2 = cold('x-x-x| ', {x: 10}); diff --git a/spec/operators/min-spec.ts b/spec/operators/min-spec.ts index 37d324150d..24a162fd93 100644 --- a/spec/operators/min-spec.ts +++ b/spec/operators/min-spec.ts @@ -3,11 +3,9 @@ import { min, skip, take, mergeMap } from 'rxjs/operators'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { range, of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {min} */ describe('min operator', () => { - asDiagram('min')('should min the values of an observable', () => { + it('should min the values of an observable', () => { const source = hot('--a--b--c--|', { a: 42, b: -1, c: 3 }); const subs = '^ !'; const expected = '-----------(x|)'; diff --git a/spec/operators/multicast-spec.ts b/spec/operators/multicast-spec.ts index d94bfced61..5240e41586 100644 --- a/spec/operators/multicast-spec.ts +++ b/spec/operators/multicast-spec.ts @@ -5,13 +5,12 @@ import { TestScheduler } from 'rxjs/testing'; import { hot, cold, expectObservable, expectSubscriptions, time } from '../helpers/marble-testing'; declare const type: Function; -declare const asDiagram: Function; declare const rxTestScheduler: TestScheduler; /** @test {multicast} */ describe('multicast operator', () => { - asDiagram('multicast(() => new Subject())')('should mirror a simple source Observable', () => { + it('should mirror a simple source Observable', () => { const source = cold('--1-2---3-4--5-|'); const sourceSubs = '^ !'; const multicasted = source.pipe(multicast(() => new Subject())) as ConnectableObservable; diff --git a/spec/operators/observeOn-spec.ts b/spec/operators/observeOn-spec.ts index a0771ef08f..34720e41b7 100644 --- a/spec/operators/observeOn-spec.ts +++ b/spec/operators/observeOn-spec.ts @@ -4,13 +4,11 @@ import { expect } from 'chai'; import { hot, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { of, Observable, asapScheduler } from 'rxjs'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {observeOn} */ describe('observeOn operator', () => { - asDiagram('observeOn(scheduler)')('should observe on specified scheduler', () => { + it('should observe on specified scheduler', () => { const e1 = hot('--a--b--|'); const expected = '--a--b--|'; const sub = '^ !'; diff --git a/spec/operators/onErrorResumeNext-spec.ts b/spec/operators/onErrorResumeNext-spec.ts index e7dcd5c9a8..6de282717f 100644 --- a/spec/operators/onErrorResumeNext-spec.ts +++ b/spec/operators/onErrorResumeNext-spec.ts @@ -4,10 +4,8 @@ import { onErrorResumeNext, takeWhile } from 'rxjs/operators'; import { concat, defer, throwError, of } from 'rxjs'; import { asInteropObservable } from '../helpers/interop-helper'; -declare function asDiagram(arg: string): Function; - describe('onErrorResumeNext operator', () => { - asDiagram('onErrorResumeNext')('should continue observable sequence with next observable', () => { + it('should continue observable sequence with next observable', () => { const source = hot('--a--b--#'); const next = cold( '--c--d--|'); const subs = '^ !'; diff --git a/spec/operators/pairwise-spec.ts b/spec/operators/pairwise-spec.ts index 2d9fb18a06..2989e38b91 100644 --- a/spec/operators/pairwise-spec.ts +++ b/spec/operators/pairwise-spec.ts @@ -3,11 +3,9 @@ import { pairwise, take } from 'rxjs/operators'; import { Subject } from 'rxjs'; import { expect } from 'chai'; -declare function asDiagram(arg: string): Function; - /** @test {pairwise} */ describe('pairwise operator', () => { - asDiagram('pairwise')('should group consecutive emissions as arrays of two', () => { + it('should group consecutive emissions as arrays of two', () => { const e1 = hot('--a--b-c----d--e---|'); const expected = '-----u-v----w--x---|'; diff --git a/spec/operators/pluck-spec.ts b/spec/operators/pluck-spec.ts index 9ee8a017b6..616b2aae73 100644 --- a/spec/operators/pluck-spec.ts +++ b/spec/operators/pluck-spec.ts @@ -3,11 +3,9 @@ import { cold, expectObservable, expectSubscriptions } from '../helpers/marble-t import { pluck, map, tap, mergeMap } from 'rxjs/operators'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {pluck} */ describe('pluck operator', () => { - asDiagram('pluck(\'v\')')('should dematerialize an Observable', () => { + it('should dematerialize an Observable', () => { const values = { a: '{v:1}', b: '{v:2}', diff --git a/spec/operators/publish-spec.ts b/spec/operators/publish-spec.ts index ba198e6221..ef2edb1eba 100644 --- a/spec/operators/publish-spec.ts +++ b/spec/operators/publish-spec.ts @@ -3,12 +3,11 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { publish, zip, mergeMapTo, mergeMap, tap, refCount, retry, repeat, map } from 'rxjs/operators'; import { ConnectableObservable, of, Subscription, Observable } from 'rxjs'; -declare function asDiagram(arg: string): Function; declare const type: Function; /** @test {publish} */ describe('publish operator', () => { - asDiagram('publish')('should mirror a simple source Observable', () => { + it('should mirror a simple source Observable', () => { const source = cold('--1-2---3-4--5-|'); const sourceSubs = '^ !'; const published = source.pipe(publish()) as ConnectableObservable; diff --git a/spec/operators/publishBehavior-spec.ts b/spec/operators/publishBehavior-spec.ts index 67ee0e37bc..516cded978 100644 --- a/spec/operators/publishBehavior-spec.ts +++ b/spec/operators/publishBehavior-spec.ts @@ -3,12 +3,11 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { publishBehavior, mergeMapTo, tap, mergeMap, refCount, retry, repeat } from 'rxjs/operators'; import { ConnectableObservable, of, Subscription, Observable } from 'rxjs'; -declare function asDiagram(arg: string): Function; declare const type: Function; /** @test {publishBehavior} */ describe('publishBehavior operator', () => { - asDiagram('publishBehavior(0)')('should mirror a simple source Observable', () => { + it('should mirror a simple source Observable', () => { const source = cold('--1-2---3-4--5-|'); const sourceSubs = '^ !'; const published = source.pipe(publishBehavior('0')) as ConnectableObservable; diff --git a/spec/operators/publishLast-spec.ts b/spec/operators/publishLast-spec.ts index 437a793f45..cdf82b9c06 100644 --- a/spec/operators/publishLast-spec.ts +++ b/spec/operators/publishLast-spec.ts @@ -3,12 +3,11 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { publishLast, mergeMapTo, tap, mergeMap, refCount, retry } from 'rxjs/operators'; import { ConnectableObservable, of, Subscription, Observable } from 'rxjs'; -declare function asDiagram(arg: string): Function; declare const type: Function; /** @test {publishLast} */ describe('publishLast operator', () => { - asDiagram('publishLast')('should emit last notification of a simple source Observable', () => { + it('should emit last notification of a simple source Observable', () => { const source = cold('--1-2---3-4--5-|'); const sourceSubs = '^ !'; const published = source.pipe(publishLast()) as ConnectableObservable; diff --git a/spec/operators/publishReplay-spec.ts b/spec/operators/publishReplay-spec.ts index 1236a65ab6..9331eb8864 100644 --- a/spec/operators/publishReplay-spec.ts +++ b/spec/operators/publishReplay-spec.ts @@ -3,12 +3,11 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { throwError, ConnectableObservable, EMPTY, NEVER, of, Observable, Subscription } from 'rxjs'; import { publishReplay, mergeMapTo, tap, mergeMap, refCount, retry, repeat, map } from 'rxjs/operators'; -declare function asDiagram(arg: string): Function; declare const type: Function; /** @test {publishReplay} */ describe('publishReplay operator', () => { - asDiagram('publishReplay(1)')('should mirror a simple source Observable', () => { + it('should mirror a simple source Observable', () => { const source = cold('--1-2---3-4--5-|'); const sourceSubs = '^ !'; const published = source.pipe(publishReplay(1)) as ConnectableObservable; diff --git a/spec/operators/reduce-spec.ts b/spec/operators/reduce-spec.ts index 2aebde5ff8..c6fa3a5e85 100644 --- a/spec/operators/reduce-spec.ts +++ b/spec/operators/reduce-spec.ts @@ -4,11 +4,10 @@ import { reduce, mergeMap } from 'rxjs/operators'; import { range, of } from 'rxjs'; declare const type: Function; -declare const asDiagram: Function; /** @test {reduce} */ describe('reduce operator', () => { - asDiagram('reduce((acc, curr) => acc + curr, 0)')('should reduce', () => { + it('should reduce', () => { const values = { a: 1, b: 3, c: 5, x: 9 }; diff --git a/spec/operators/refCount-spec.ts b/spec/operators/refCount-spec.ts index e35730ff26..1d70673c21 100644 --- a/spec/operators/refCount-spec.ts +++ b/spec/operators/refCount-spec.ts @@ -3,11 +3,9 @@ import { cold, expectObservable, expectSubscriptions } from '../helpers/marble-t import { refCount, publish, publishReplay, first } from 'rxjs/operators'; import { NEVER, noop, Observable, Subject } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {refCount} */ describe('refCount', () => { - asDiagram('refCount')('should turn a multicasted Observable an automatically ' + + it('should turn a multicasted Observable an automatically ' + '(dis)connecting hot one', () => { const source = cold('--1-2---3-4--5-|'); const sourceSubs = '^ !'; diff --git a/spec/operators/repeat-spec.ts b/spec/operators/repeat-spec.ts index a298788e7f..7fcdaa159c 100644 --- a/spec/operators/repeat-spec.ts +++ b/spec/operators/repeat-spec.ts @@ -4,13 +4,11 @@ import { repeat, mergeMap, map, multicast, refCount } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { of, Subject } from 'rxjs'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {repeat} */ describe('repeat operator', () => { - asDiagram('repeat(3)')('should resubscribe count number of times', () => { + it('should resubscribe count number of times', () => { const e1 = cold('--a--b--| '); const subs = ['^ ! ', ' ^ ! ', diff --git a/spec/operators/repeatWhen-spec.ts b/spec/operators/repeatWhen-spec.ts index 37b0cd1cb9..51c1858081 100644 --- a/spec/operators/repeatWhen-spec.ts +++ b/spec/operators/repeatWhen-spec.ts @@ -3,11 +3,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { repeatWhen, map, mergeMap, takeUntil } from 'rxjs/operators'; import { of, EMPTY, Observable, Subscriber } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {repeatWhen} */ describe('repeatWhen operator', () => { - asDiagram('repeatWhen')('should handle a source with eventual complete using a hot notifier', () => { + it('should handle a source with eventual complete using a hot notifier', () => { const source = cold('-1--2--|'); const subs = ['^ ! ', ' ^ ! ', diff --git a/spec/operators/retry-spec.ts b/spec/operators/retry-spec.ts index 353d6f3f7c..48c907aef8 100644 --- a/spec/operators/retry-spec.ts +++ b/spec/operators/retry-spec.ts @@ -3,11 +3,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { retry, map, take, mergeMap, concat, multicast, refCount } from 'rxjs/operators'; import { Observable, Observer, defer, range, of, throwError, Subject } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {retry} */ describe('retry operator', () => { - asDiagram('retry(2)')('should handle a basic source that emits next then errors, count=3', () => { + it('should handle a basic source that emits next then errors, count=3', () => { const source = cold('--1-2-3-#'); const subs = ['^ ! ', ' ^ ! ', diff --git a/spec/operators/retryWhen-spec.ts b/spec/operators/retryWhen-spec.ts index 345f6379c5..d145d6e4c0 100644 --- a/spec/operators/retryWhen-spec.ts +++ b/spec/operators/retryWhen-spec.ts @@ -3,11 +3,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { retryWhen, map, mergeMap, takeUntil } from 'rxjs/operators'; import { of, EMPTY } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {retryWhen} */ describe('retryWhen operator', () => { - asDiagram('retryWhen')('should handle a source with eventual error using a hot notifier', () => { + it('should handle a source with eventual error using a hot notifier', () => { const source = cold('-1--2--#'); const subs = ['^ ! ', ' ^ ! ', diff --git a/spec/operators/sample-spec.ts b/spec/operators/sample-spec.ts index 72db23f0ca..00bff3a107 100644 --- a/spec/operators/sample-spec.ts +++ b/spec/operators/sample-spec.ts @@ -3,11 +3,9 @@ import { hot, expectObservable, expectSubscriptions } from '../helpers/marble-te import { sample, mergeMap } from 'rxjs/operators'; import { Subject, of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {sample} */ describe('sample operator', () => { - asDiagram('sample')('should get samples when the notifier emits', () => { + it('should get samples when the notifier emits', () => { const e1 = hot('---a----b---c----------d-----| '); const e1subs = '^ ! '; const e2 = hot('-----x----------x---x------x---|'); diff --git a/spec/operators/sampleTime-spec.ts b/spec/operators/sampleTime-spec.ts index 3106d751fa..8220b083b3 100644 --- a/spec/operators/sampleTime-spec.ts +++ b/spec/operators/sampleTime-spec.ts @@ -3,13 +3,11 @@ import { sampleTime, mergeMap } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {sampleTime} */ describe('sampleTime operator', () => { - asDiagram('sampleTime(70)')('should get samples on a delay', () => { + it('should get samples on a delay', () => { const e1 = hot('a---b-c---------d--e---f-g-h--|'); const e1subs = '^ !'; const expected = '-------c-------------e------h-|'; diff --git a/spec/operators/scan-spec.ts b/spec/operators/scan-spec.ts index aa02ea71b4..1a08b02816 100644 --- a/spec/operators/scan-spec.ts +++ b/spec/operators/scan-spec.ts @@ -3,12 +3,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { scan, mergeMap, finalize } from 'rxjs/operators'; import { of } from 'rxjs'; -declare const type: Function; -declare const asDiagram: Function; - /** @test {scan} */ describe('scan operator', () => { - asDiagram('scan((acc, curr) => acc + curr, 0)')('should scan', () => { + it('should scan', () => { const values = { a: 1, b: 3, c: 5, x: 1, y: 4, z: 9 diff --git a/spec/operators/sequenceEqual-spec.ts b/spec/operators/sequenceEqual-spec.ts index e0029d9d17..6081e6552f 100644 --- a/spec/operators/sequenceEqual-spec.ts +++ b/spec/operators/sequenceEqual-spec.ts @@ -3,14 +3,12 @@ import { hot, cold, expectObservable, expectSubscriptions, time } from '../helpe import { sequenceEqual } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; -declare const type: Function; -declare const asDiagram: Function; declare const rxTestScheduler: TestScheduler; const booleans = { T: true, F: false }; /** @test {sequenceEqual} */ describe('sequenceEqual operator', () => { - asDiagram('sequenceEqual(observable)')('should return true for two equal sequences', () => { + it('should return true for two equal sequences', () => { const s1 = hot('--a--^--b--c--d--e--f--g--|'); const s1subs = '^ !'; const s2 = hot('-----^-----b--c--d-e-f------g-|'); diff --git a/spec/operators/share-spec.ts b/spec/operators/share-spec.ts index a239634ed8..3140446461 100644 --- a/spec/operators/share-spec.ts +++ b/spec/operators/share-spec.ts @@ -3,11 +3,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { share, retry, mergeMapTo, mergeMap, tap, repeat } from 'rxjs/operators'; import { Observable, EMPTY, NEVER, of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {share} */ describe('share operator', () => { - asDiagram('share')('should mirror a simple source Observable', () => { + it('should mirror a simple source Observable', () => { const source = cold('--1-2---3-4--5-|'); const sourceSubs = '^ !'; const expected = '--1-2---3-4--5-|'; diff --git a/spec/operators/shareReplay-spec.ts b/spec/operators/shareReplay-spec.ts index 19be5f583a..beeddc77ab 100644 --- a/spec/operators/shareReplay-spec.ts +++ b/spec/operators/shareReplay-spec.ts @@ -5,7 +5,6 @@ import { shareReplay, mergeMapTo, retry } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { Observable, Operator, Observer, of } from 'rxjs'; -declare function asDiagram(arg: string): Function; declare const rxTestScheduler: TestScheduler; /** @test {shareReplay} */ diff --git a/spec/operators/skip-spec.ts b/spec/operators/skip-spec.ts index a4c43f5df7..e6109abc7a 100644 --- a/spec/operators/skip-spec.ts +++ b/spec/operators/skip-spec.ts @@ -2,11 +2,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { skip, mergeMap } from 'rxjs/operators'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {skip} */ describe('skip operator', () => { - asDiagram('skip(3)')('should skip values before a total', () => { + it('should skip values before a total', () => { const source = hot('--a--b--c--d--e--|'); const subs = '^ !'; const expected = '-----------d--e--|'; diff --git a/spec/operators/skipLast-spec.ts b/spec/operators/skipLast-spec.ts index b671dc713c..08d5d44242 100644 --- a/spec/operators/skipLast-spec.ts +++ b/spec/operators/skipLast-spec.ts @@ -3,11 +3,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { skipLast, mergeMap } from 'rxjs/operators'; import { range, ArgumentOutOfRangeError, of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {takeLast} */ describe('skipLast operator', () => { - asDiagram('skipLast(2)')('should skip two values of an observable with many values', () => { + it('should skip two values of an observable with many values', () => { const e1 = cold('--a-----b----c---d--|'); const e1subs = '^ !'; const expected = '-------------a---b--|'; diff --git a/spec/operators/skipUntil-spec.ts b/spec/operators/skipUntil-spec.ts index 3842f4e251..31cc85f751 100644 --- a/spec/operators/skipUntil-spec.ts +++ b/spec/operators/skipUntil-spec.ts @@ -4,11 +4,9 @@ import { concat, defer, of, Subject } from 'rxjs'; import { skipUntil, mergeMap } from 'rxjs/operators'; import { asInteropObservable } from '../helpers/interop-helper'; -declare function asDiagram(arg: string): Function; - /** @test {skipUntil} */ describe('skipUntil', () => { - asDiagram('skipUntil')('should skip values until another observable notifies', () => { + it('should skip values until another observable notifies', () => { const e1 = hot('--a--b--c--d--e----|'); const e1subs = '^ !'; const skip = hot('---------x------| '); diff --git a/spec/operators/skipWhile-spec.ts b/spec/operators/skipWhile-spec.ts index 22eee01320..75153ba7ae 100644 --- a/spec/operators/skipWhile-spec.ts +++ b/spec/operators/skipWhile-spec.ts @@ -3,11 +3,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { skipWhile, mergeMap, tap } from 'rxjs/operators'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {skipWhile} */ describe('skipWhile operator', () => { - asDiagram('skipWhile(x => x < 4)')('should skip all elements until predicate is false', () => { + it('should skip all elements until predicate is false', () => { const source = hot('-1-^2--3--4--5--6--|'); const sourceSubs = '^ !'; const expected = '-------4--5--6--|'; diff --git a/spec/operators/startWith-spec.ts b/spec/operators/startWith-spec.ts index 64a1b81559..c33be2e7f5 100644 --- a/spec/operators/startWith-spec.ts +++ b/spec/operators/startWith-spec.ts @@ -3,15 +3,13 @@ import { startWith, mergeMap } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {startWith} */ describe('startWith operator', () => { const defaultStartValue = 'x'; - asDiagram('startWith(s)')('should prepend to a cold Observable', () => { + it('should prepend to a cold Observable', () => { const e1 = cold('---a--b--c--|'); const e1subs = '^ !'; const expected = 's--a--b--c--|'; diff --git a/spec/operators/subscribeOn-spec.ts b/spec/operators/subscribeOn-spec.ts index 4ecfe3df8a..f1cc7fba98 100644 --- a/spec/operators/subscribeOn-spec.ts +++ b/spec/operators/subscribeOn-spec.ts @@ -3,13 +3,11 @@ import { subscribeOn, mergeMap } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {subscribeOn} */ describe('subscribeOn operator', () => { - asDiagram('subscribeOn(scheduler)')('should subscribe on specified scheduler', () => { + it('should subscribe on specified scheduler', () => { const e1 = hot('--a--b--|'); const expected = '--a--b--|'; const sub = '^ !'; diff --git a/spec/operators/switch-spec.ts b/spec/operators/switch-spec.ts index 0d6688d9d9..bfff1dbfa6 100644 --- a/spec/operators/switch-spec.ts +++ b/spec/operators/switch-spec.ts @@ -3,12 +3,11 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { Observable, of, NEVER, queueScheduler, Subject } from 'rxjs'; import { map, switchAll, mergeMap } from 'rxjs/operators'; -declare function asDiagram(arg: string): Function; declare const type: Function; /** @test {switch} */ describe('switchAll', () => { - asDiagram('switchAll')('should switch a hot observable of cold observables', () => { + it('should switch a hot observable of cold observables', () => { const x = cold( '--a---b--c---d--| '); const y = cold( '----e---f--g---|'); const e1 = hot( '--x------y-------| ', { x: x, y: y }); diff --git a/spec/operators/switchMap-spec.ts b/spec/operators/switchMap-spec.ts index 340a8c831a..b60c73df16 100644 --- a/spec/operators/switchMap-spec.ts +++ b/spec/operators/switchMap-spec.ts @@ -4,12 +4,9 @@ import { switchMap, mergeMap, map, takeWhile } from 'rxjs/operators'; import { concat, defer, of, Observable } from 'rxjs'; import { asInteropObservable } from '../helpers/interop-helper'; -declare function asDiagram(arg: string): Function; - /** @test {switchMap} */ describe('switchMap', () => { - asDiagram('switchMap(i => 10*i\u2014\u201410*i\u2014\u201410*i\u2014| )') - ('should map-and-flatten each item to an Observable', () => { + it('should map-and-flatten each item to an Observable', () => { const e1 = hot('--1-----3--5-------|'); const e1subs = '^ !'; const e2 = cold('x-x-x| ', {x: 10}); diff --git a/spec/operators/switchMapTo-spec.ts b/spec/operators/switchMapTo-spec.ts index bc8948a792..adace2fedb 100644 --- a/spec/operators/switchMapTo-spec.ts +++ b/spec/operators/switchMapTo-spec.ts @@ -3,12 +3,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { Observable, of } from 'rxjs'; import { switchMapTo, mergeMap } from 'rxjs/operators'; -declare function asDiagram(arg: string): Function; - /** @test {switchMapTo} */ describe('switchMapTo', () => { - asDiagram('switchMapTo( 10\u2014\u201410\u2014\u201410\u2014| )') - ('should map-and-flatten each item to an Observable', () => { + it('should map-and-flatten each item to an Observable', () => { const e1 = hot('--1-----3--5-------|'); const e1subs = '^ !'; const e2 = cold('x-x-x| ', {x: 10}); diff --git a/spec/operators/takeUntil-spec.ts b/spec/operators/takeUntil-spec.ts index 29754b3166..c86c6f5982 100644 --- a/spec/operators/takeUntil-spec.ts +++ b/spec/operators/takeUntil-spec.ts @@ -2,11 +2,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { takeUntil, mergeMap } from 'rxjs/operators'; import { of, EMPTY } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {takeUntil} */ describe('takeUntil operator', () => { - asDiagram('takeUntil')('should take values until notifier emits', () => { + it('should take values until notifier emits', () => { const e1 = hot('--a--b--c--d--e--f--g--|'); const e1subs = '^ ! '; const e2 = hot('-------------z--| '); diff --git a/spec/operators/takeWhile-spec.ts b/spec/operators/takeWhile-spec.ts index 452eb0b0a8..9053513ac1 100644 --- a/spec/operators/takeWhile-spec.ts +++ b/spec/operators/takeWhile-spec.ts @@ -3,11 +3,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { takeWhile, tap, mergeMap } from 'rxjs/operators'; import { of, Observable, from } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {takeWhile} */ describe('takeWhile operator', () => { - asDiagram('takeWhile(x => x < 4)')('should take all elements until predicate is false', () => { + it('should take all elements until predicate is false', () => { const source = hot('-1-^2--3--4--5--6--|'); const sourceSubs = '^ ! '; const expected = '-2--3--| '; diff --git a/spec/operators/tap-spec.ts b/spec/operators/tap-spec.ts index b6d1d3f6d5..09345c89a8 100644 --- a/spec/operators/tap-spec.ts +++ b/spec/operators/tap-spec.ts @@ -3,12 +3,9 @@ import { tap, mergeMap } from 'rxjs/operators'; import { Subject, of, throwError, Observer, EMPTY } from 'rxjs'; import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; -declare function asDiagram(arg: string): Function; - /** @test {tap} */ describe('tap operator', () => { - asDiagram('tap(x => console.log(x))') - ('should mirror multiple values and complete', () => { + it('should mirror multiple values and complete', () => { const e1 = cold('--1--2--3--|'); const e1subs = '^ !'; const expected = '--1--2--3--|'; diff --git a/spec/operators/throttle-spec.ts b/spec/operators/throttle-spec.ts index 6f82ce205c..096e294a82 100644 --- a/spec/operators/throttle-spec.ts +++ b/spec/operators/throttle-spec.ts @@ -4,11 +4,10 @@ import { throttle, mergeMap, mapTo } from 'rxjs/operators'; import { of, concat, timer, Observable } from 'rxjs'; declare const type: Function; -declare function asDiagram(arg: string): Function; /** @test {throttle} */ describe('throttle operator', () => { - asDiagram('throttle')('should immediately emit the first value in each time window', () => { + it('should immediately emit the first value in each time window', () => { const e1 = hot('-a-xy-----b--x--cxxx-|'); const e1subs = '^ !'; const e2 = cold( '----| '); @@ -348,7 +347,7 @@ describe('throttle operator', () => { }); describe('throttle(fn, { leading: true, trailing: true })', () => { - asDiagram('throttle(fn, { leading: true, trailing: true })')('should immediately emit the first value in each time window', () => { + it('should immediately emit the first value in each time window', () => { const e1 = hot('-a-xy-----b--x--cxxx------|'); const e1subs = '^ !'; const e2 = cold( '----| '); @@ -382,7 +381,7 @@ describe('throttle operator', () => { }); describe('throttle(fn, { leading: false, trailing: true })', () => { - asDiagram('throttle(fn, { leading: false, trailing: true })')('should immediately emit the first value in each time window', () => { + it('should immediately emit the first value in each time window', () => { const e1 = hot('-a-xy-----b--x--cxxx------|'); const e1subs = '^ !'; const e2 = cold( '----| '); diff --git a/spec/operators/throttleTime-spec.ts b/spec/operators/throttleTime-spec.ts index 4e65054ae8..fc48a92654 100644 --- a/spec/operators/throttleTime-spec.ts +++ b/spec/operators/throttleTime-spec.ts @@ -4,13 +4,11 @@ import { throttleTime, take, map, mergeMap } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { of, concat, timer } from 'rxjs'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {throttleTime} */ describe('throttleTime operator', () => { - asDiagram('throttleTime(50)')('should immediately emit the first value in each time window', () => { + it('should immediately emit the first value in each time window', () => { const e1 = hot('-a-x-y----b---x-cx---|'); const subs = '^ !'; const expected = '-a--------b-----c----|'; @@ -141,7 +139,7 @@ describe('throttleTime operator', () => { }); describe('throttleTime(fn, { leading: true, trailing: true })', () => { - asDiagram('throttleTime(fn, { leading: true, trailing: true })')('should immediately emit the first and last values in each time window', () => { + it('should immediately emit the first and last values in each time window', () => { const e1 = hot('-a-xy-----b--x--cxxx--|'); const e1subs = '^ !'; const t = time( '----| '); @@ -165,7 +163,7 @@ describe('throttleTime operator', () => { }); describe('throttleTime(fn, { leading: false, trailing: true })', () => { - asDiagram('throttleTime(fn, { leading: false, trailing: true })')('should immediately emit the last value in each time window', () => { + it('should immediately emit the last value in each time window', () => { const e1 = hot('-a-xy-----b--x--cxxx--|'); const e1subs = '^ !'; const t = time( '----| '); diff --git a/spec/operators/throwIfEmpty-spec.ts b/spec/operators/throwIfEmpty-spec.ts index f674fdb604..1a4b9caadc 100644 --- a/spec/operators/throwIfEmpty-spec.ts +++ b/spec/operators/throwIfEmpty-spec.ts @@ -3,12 +3,10 @@ import { cold, expectObservable, expectSubscriptions } from '../helpers/marble-t import { EMPTY, of, EmptyError, defer, throwError } from 'rxjs'; import { throwIfEmpty, mergeMap, retry } from 'rxjs/operators'; -declare function asDiagram(arg: string): Function; - /** @test {timeout} */ describe('throwIfEmpty', () => { describe('with errorFactory', () => { - asDiagram('throwIfEmpty')('should error when empty', () => { + it('should error when empty', () => { const source = cold('----|'); const expected = '----#'; expectObservable( diff --git a/spec/operators/timeInterval-spec.ts b/spec/operators/timeInterval-spec.ts index d221033b18..d835fd82e4 100644 --- a/spec/operators/timeInterval-spec.ts +++ b/spec/operators/timeInterval-spec.ts @@ -4,13 +4,11 @@ import { TestScheduler } from 'rxjs/testing'; import { of } from 'rxjs'; import { TimeInterval } from 'rxjs/internal/operators/timeInterval'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {timeInterval} */ describe('timeInterval operator', () => { - asDiagram('timeInterval')('should record the time interval between source elements', () => { + it('should record the time interval between source elements', () => { const e1 = hot('--a--^b-c-----d--e--|'); const e1subs = '^ !'; const expected = '-w-x-----y--z--|'; diff --git a/spec/operators/timeout-spec.ts b/spec/operators/timeout-spec.ts index c49c71c31c..2e7937c3bb 100644 --- a/spec/operators/timeout-spec.ts +++ b/spec/operators/timeout-spec.ts @@ -4,14 +4,13 @@ import { timeout, mergeMap } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { TimeoutError, of } from 'rxjs'; -declare function asDiagram(arg: string): Function; declare const rxTestScheduler: TestScheduler; /** @test {timeout} */ describe('timeout operator', () => { const defaultTimeoutError = new TimeoutError(); - asDiagram('timeout(50)')('should timeout after a specified timeout period', () => { + it('should timeout after a specified timeout period', () => { const e1 = cold('-------a--b--|'); const e1subs = '^ ! '; const expected = '-----# '; diff --git a/spec/operators/timeoutWith-spec.ts b/spec/operators/timeoutWith-spec.ts index 995b8eacfd..d0995260af 100644 --- a/spec/operators/timeoutWith-spec.ts +++ b/spec/operators/timeoutWith-spec.ts @@ -3,12 +3,11 @@ import { timeoutWith, mergeMap } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; declare const rxTestScheduler: TestScheduler; /** @test {timeoutWith} */ describe('timeoutWith operator', () => { - asDiagram('timeoutWith(50)')('should timeout after a specified period then subscribe to the passed observable', () => { + it('should timeout after a specified period then subscribe to the passed observable', () => { const e1 = cold('-------a--b--|'); const e1subs = '^ ! '; const e2 = cold('x-y-z-| '); diff --git a/spec/operators/timestamp-spec.ts b/spec/operators/timestamp-spec.ts index eea18f809b..9398e5557f 100644 --- a/spec/operators/timestamp-spec.ts +++ b/spec/operators/timestamp-spec.ts @@ -3,13 +3,11 @@ import { timestamp, map, mergeMap } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - declare const rxTestScheduler: TestScheduler; /** @test {timestamp} */ describe('timestamp operator', () => { - asDiagram('timestamp')('should record the time stamp per each source elements', () => { + it('should record the time stamp per each source elements', () => { const e1 = hot('-b-c-----d--e--|'); const e1subs = '^ !'; const expected = '-w-x-----y--z--|'; diff --git a/spec/operators/toArray-spec.ts b/spec/operators/toArray-spec.ts index 437ae6116e..94e1446ee1 100644 --- a/spec/operators/toArray-spec.ts +++ b/spec/operators/toArray-spec.ts @@ -3,11 +3,10 @@ import { toArray, mergeMap } from 'rxjs/operators'; import { of } from 'rxjs'; declare const type: Function; -declare const asDiagram: Function; /** @test {toArray} */ describe('toArray operator', () => { - asDiagram('toArray')('should reduce the values of an observable into an array', () => { + it('should reduce the values of an observable into an array', () => { const e1 = hot('---a--b--|'); const e1subs = '^ !'; const expected = '---------(w|)'; diff --git a/spec/operators/window-spec.ts b/spec/operators/window-spec.ts index b36b993a6c..7265c35077 100644 --- a/spec/operators/window-spec.ts +++ b/spec/operators/window-spec.ts @@ -4,13 +4,12 @@ import { TestScheduler } from 'rxjs/testing'; import { EMPTY, of, Observable } from 'rxjs'; declare const type: Function; -declare const asDiagram: Function; declare const rxTestScheduler: TestScheduler; /** @test {window} */ describe('window operator', () => { - asDiagram('window')('should emit windows that close and reopen', () => { + it('should emit windows that close and reopen', () => { const source = hot('---a---b---c---d---e---f---g---h---i---| '); const sourceSubs = '^ ! '; const closings = hot('-------------w------------w----------------|'); diff --git a/spec/operators/windowCount-spec.ts b/spec/operators/windowCount-spec.ts index 9bc107bea7..5c50113b8f 100644 --- a/spec/operators/windowCount-spec.ts +++ b/spec/operators/windowCount-spec.ts @@ -1,16 +1,10 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; import { windowCount, mergeMap } from 'rxjs/operators'; -import { TestScheduler } from 'rxjs/testing'; import { of, Observable } from 'rxjs'; -declare const type: Function; -declare const asDiagram: Function; - -declare const rxTestScheduler: TestScheduler; - /** @test {windowCount} */ describe('windowCount operator', () => { - asDiagram('windowCount(3)')('should emit windows with count 3, no skip specified', () => { + it('should emit windows with count 3, no skip specified', () => { const source = hot('---a---b---c---d---e---f---g---h---i---|'); const sourceSubs = '^ !'; const expected = 'x----------y-----------z-----------w---|'; diff --git a/spec/operators/windowToggle-spec.ts b/spec/operators/windowToggle-spec.ts index 4a79752397..4e0e3128ba 100644 --- a/spec/operators/windowToggle-spec.ts +++ b/spec/operators/windowToggle-spec.ts @@ -5,12 +5,10 @@ import { windowToggle, tap, mergeMap } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; declare const rxTestScheduler: TestScheduler; -declare const type: Function; -declare const asDiagram: Function; /** @test {windowToggle} */ describe('windowToggle', () => { - asDiagram('windowToggle')('should emit windows governed by openings and closings', () => { + it('should emit windows governed by openings and closings', () => { const source = hot('--1--2--^-a--b--c--d--e--f--g--h-|'); const subs = '^ !'; const e2 = cold( '----w--------w--------w--|'); diff --git a/spec/operators/windowWhen-spec.ts b/spec/operators/windowWhen-spec.ts index a74be6eb0a..874d3e572a 100644 --- a/spec/operators/windowWhen-spec.ts +++ b/spec/operators/windowWhen-spec.ts @@ -1,16 +1,10 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/marble-testing'; -import { TestScheduler } from 'rxjs/testing'; import { windowWhen, mergeMap } from 'rxjs/operators'; import { Observable, of } from 'rxjs'; -declare const type: Function; -declare const asDiagram: Function; - -declare const rxTestScheduler: TestScheduler; - /** @test {windowWhen} */ describe('windowWhen operator', () => { - asDiagram('windowWhen')('should emit windows that close and reopen', () => { + it('should emit windows that close and reopen', () => { const e1 = hot('--a--^--b--c--d--e--f--g--h--i--|'); const e1subs = '^ !'; const e2 = cold( '-----------| '); diff --git a/spec/operators/withLatestFrom-spec.ts b/spec/operators/withLatestFrom-spec.ts index e2f8a4c91b..208e40e768 100644 --- a/spec/operators/withLatestFrom-spec.ts +++ b/spec/operators/withLatestFrom-spec.ts @@ -4,11 +4,9 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { withLatestFrom, mergeMap, delay } from 'rxjs/operators'; import { of } from 'rxjs'; -declare function asDiagram(arg: string): Function; - /** @test {withLatestFrom} */ describe('withLatestFrom operator', () => { - asDiagram('withLatestFrom')('should combine events from cold observables', () => { + it('should combine events from cold observables', () => { const e1 = cold('-a--b-----c-d-e-|'); const e2 = cold('--1--2-3-4---| '); const expected = '----B-----C-D-E-|'; diff --git a/spec/operators/zipAll-spec.ts b/spec/operators/zipAll-spec.ts index 3121c182ae..5ac3a65911 100644 --- a/spec/operators/zipAll-spec.ts +++ b/spec/operators/zipAll-spec.ts @@ -3,12 +3,11 @@ import { hot, cold, expectObservable, expectSubscriptions } from '../helpers/mar import { zipAll, mergeMap } from 'rxjs/operators'; import { queueScheduler, of, zip, Observable } from 'rxjs'; -declare function asDiagram(arg: string): Function; declare const type: Function; /** @test {zipAll} */ describe('zipAll operator', () => { - asDiagram('zipAll')('should combine paired events from two observables', () => { + it('should combine paired events from two observables', () => { const x = cold( '-a-----b-|'); const y = cold( '--1-2-----'); const outer = hot('-x----y--------| ', { x: x, y: y }); diff --git a/spec/support/tests2png.opts b/spec/support/tests2png.opts deleted file mode 100644 index 28880d5ec5..0000000000 --- a/spec/support/tests2png.opts +++ /dev/null @@ -1,12 +0,0 @@ ---require ts-node/register ---require tsconfig-paths/register ---require spec/helpers/polyfills.ts ---require source-map-support/register ---require spec/helpers/tests2png/diagram-test-runner.ts ---require spec/helpers/testScheduler-ui.ts ---ui spec/helpers/testScheduler-ui.ts - ---reporter dot - ---recursive ---timeout 5000 diff --git a/src/internal/operators/concatAll.ts b/src/internal/operators/concatAll.ts index c3fc1960e1..959e35d4e9 100644 --- a/src/internal/operators/concatAll.ts +++ b/src/internal/operators/concatAll.ts @@ -12,7 +12,7 @@ export function concatAll(): OperatorFunction; * Flattens an Observable-of-Observables by putting one * inner Observable after the other. * - * ![](concatAll.png) + * ![](../../assets/images/svgs/concatAll.svg) * * Joins every Observable emitted by the source (a higher-order Observable), in * a serial fashion. It subscribes to each inner Observable only after the