From 4271a0fc1eaaaa318ef874775544a1d2ce16ca7e Mon Sep 17 00:00:00 2001 From: Dan Bucholtz Date: Tue, 13 Feb 2018 01:28:39 -0600 Subject: [PATCH] feature(routing): create external router controller for reconciling state from router in re-useable fashion * external router controller * external router controller * gif it's working --- packages/angular/package-lock.json | 530 ++++++++---------- packages/angular/package.json | 2 +- packages/angular/src/router/outlet.ts | 111 +--- .../angular/src/router/route-event-handler.ts | 15 +- packages/angular/src/util/util.ts | 10 + packages/core/src/components.d.ts | 30 + .../external-router-controller.ts | 119 ++++ .../external-router-controller/readme.md | 28 + packages/core/src/components/tab/tab.tsx | 17 +- packages/core/src/components/tabs/tabs.tsx | 11 +- packages/core/src/utils/helpers.ts | 10 + 11 files changed, 464 insertions(+), 419 deletions(-) create mode 100644 packages/core/src/components/external-router-controller/external-router-controller.ts create mode 100644 packages/core/src/components/external-router-controller/readme.md diff --git a/packages/angular/package-lock.json b/packages/angular/package-lock.json index b20545273e..9b5edf81f3 100644 --- a/packages/angular/package-lock.json +++ b/packages/angular/package-lock.json @@ -5,27 +5,27 @@ "requires": true, "dependencies": { "@angular/common": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.3.tgz", - "integrity": "sha512-RwQ/IjmpDdMecTz/wwQlKpHgF4Crr8kyqV9FJ+c+cHR8Riqlu2DOXSU7LIfDdGoo6Mpixdxd1rtHYfs7l9YBSA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.4.tgz", + "integrity": "sha512-PNtg7lzCBUgYo5Rj+/j11EVKhLfrUkkh81ecBwexk6VcDJebmvBO1HdGppV5UPzEH/StL1mTwLc95dOI0hHSJA==", "dev": true, "requires": { "tslib": "1.9.0" } }, "@angular/compiler": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.3.tgz", - "integrity": "sha512-OynSzUdEHwajQMoV2JuYq5IdiR2dlTCTAHhTLzrym85wOihvTvovEQwVhYYHyKERu85JIoaF1sXA42KIjMGfkw==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.4.tgz", + "integrity": "sha512-KFaGcm/5OKJRxXIxrS53IYPtqta9u2xLLedrWspxIvI59ImfzeZGnLGPhfrI0pbK7wY0rJ5YdGYQnzq33dh01A==", "dev": true, "requires": { "tslib": "1.9.0" } }, "@angular/compiler-cli": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.3.tgz", - "integrity": "sha512-uoCxeyQSd8R/cwEbd0FIUXjnbPq0HXEsyu3WSu9Ek2jt52HL+x/gZQdFCRtjW/mvQNOqxrgrTtEkhJ398+VkXg==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.4.tgz", + "integrity": "sha512-nODdd7EuGzk1ME5UzpVa/lN1oKNypRt2oZoNYOkgNO2TQWD1jqOcozruit1eOEFHQhXO2JvPTzlt1dd6viHSCQ==", "dev": true, "requires": { "chokidar": "1.7.0", @@ -162,45 +162,45 @@ } }, "@angular/core": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.3.tgz", - "integrity": "sha512-tL9O8KA6KGjnlxqjuTytpC2OeKbxe/yHev0kmwo5CK0lDZU4UFetcItAzUXU1dyRuILTcBkbnFt9+nr1SZs/cQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.4.tgz", + "integrity": "sha512-GPnxUf7g8Mz0AUttKKcqaw0m2xZujwwzojkg3xUIvHrNFFF5/HH5549PfnE1jD7qkmnDFx5j3IPuNkwYHW6XvA==", "dev": true, "requires": { "tslib": "1.9.0" } }, "@angular/forms": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.3.tgz", - "integrity": "sha512-PsMGbj/Slvsxxyl61QSSSFDCGHN1XK6kNxVQTVmAlVhP1LlaYqBOIgQy4K9CYWUeHqU/YCdhVaFb5quzZLtPYA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.4.tgz", + "integrity": "sha512-0k6rs2k85wcBq0WPAjxNbtBu1wq/1fUSFaBLbpnrwwHeCLJI5aAjG2/f3jv/17a/ek7/WZ3lxXtHzNMMdaD/Iw==", "dev": true, "requires": { "tslib": "1.9.0" } }, "@angular/http": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.3.tgz", - "integrity": "sha512-3kAj7YYws8J2zRu46fEXk6lYrgSK9s5YA6O4REZkLox/suK0wb6TsDIIhoMzScGctSzZESVyuWsvYMrDYCflPA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.4.tgz", + "integrity": "sha512-WjZTNqHw9cT/mIRenIGKKlJRdm9ZdDl7IqnX+OnAdO/c6hmoQwy9fkSLRLmcXw4FBM+ASfjWu4ybodaZ8Tv6xQ==", "dev": true, "requires": { "tslib": "1.9.0" } }, "@angular/platform-browser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.3.tgz", - "integrity": "sha512-60LgA4KK3BufBR7vwwcn3zTYuLlfDG3jFip7bvdgsDpURrUB0j6/pL5cbGElww4jnnxZ72uJzJRzSiGEofjc3g==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.4.tgz", + "integrity": "sha512-chv6h2aHQ/QoVA4Y6rpPpSju7vyLg/iMh516GxpGYVk6bHEdrH9pHJPulPcrt/LTd7lMAAHE3YmvYWVU6aDsaQ==", "dev": true, "requires": { "tslib": "1.9.0" } }, "@angular/platform-browser-dynamic": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.3.tgz", - "integrity": "sha512-PheS+KJQJiyvQg1lr+eX0/1b/rjLnDjgI1qvzwikrvGYymb2JdZ+rjllHBs1iotzQ+tG+hRnlktvgdFN134x/g==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.4.tgz", + "integrity": "sha512-B3pv6FUTWA1daDYhx6b77FCFCzHQPuCyrsJQwMSSu6Xt+CYn2gc3dS0ph3B6cV6mnt1qIbEpML+Vp5Bi9x0Mkw==", "dev": true, "requires": { "tslib": "1.9.0" @@ -216,17 +216,17 @@ } }, "@ionic/core": { - "version": "0.0.2-59", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-0.0.2-59.tgz", - "integrity": "sha512-leAbEFIEYlfwMN1BIAbEIDtpQHlnJ/BXX4HfqAIjVkbEnUx2NO888+sCxXw+Ux8GeUwqdAEBXRPosCXMvuApJw==", + "version": "0.0.2-63", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-0.0.2-63.tgz", + "integrity": "sha512-2iYofRDGcEU/fhzoSwjCtZacG4B1cnlNb0Q2jRLw3pRq1le8/HZ2Dc4NvALErvLTAif7PBcDIIPOmrXOyG3Gng==", "dev": true }, "@stencil/core": { - "version": "0.3.0-5", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-0.3.0-5.tgz", - "integrity": "sha512-ADK2iPLtziVbGNd6L02W2ablcGPCKGpzhaMytDO2/S7meF7JXM7w8xx24AP6NQM9XD6Ax2lMNkgl8V4A/avLvQ==", + "version": "0.5.0-1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-0.5.0-1.tgz", + "integrity": "sha512-ETq4Pj6HyII5M1PzCYrbSZdsD4eVxwdxkneIfjc5fpUuq4YnGIXwML+95uwq0H4l3w36PO88BSSppJPaHZd0og==", "requires": { - "chokidar": "2.0.0", + "chokidar": "2.0.1", "jsdom": "11.5.1", "node-sass": "4.7.2", "rollup": "0.55.3", @@ -235,8 +235,8 @@ "rollup-plugin-node-globals": "1.1.0", "rollup-plugin-node-resolve": "3.0.2", "typescript": "2.7.1", - "uglify-es": "3.3.8", - "workbox-build": "3.0.0-alpha.3" + "uglify-es": "3.3.9", + "workbox-build": "3.0.0-alpha.6" }, "dependencies": { "typescript": { @@ -247,9 +247,9 @@ } }, "@types/node": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.0.tgz", - "integrity": "sha512-zkYho6/4wZyX6o9UQ8rd0ReEaiEYNNCqYFIAACe2Tf9DrYlgzWW27OigYHnnztnnZQwVRpwWmZKegFmDpinIsA==" + "version": "9.4.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.5.tgz", + "integrity": "sha512-DvC7bzO5797bkApgukxouHmkOdYN2D0yL5olw0RncDpXUa6n39qTVsUi/5g2QJjPgl8qn4zh+4h0sofNoWGLRg==" }, "abab": { "version": "1.0.4", @@ -335,7 +335,7 @@ "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "requires": { "delegates": "1.0.0", - "readable-stream": "2.3.3" + "readable-stream": "2.3.4" } }, "arr-diff": { @@ -447,7 +447,7 @@ "component-emitter": "1.2.1", "define-property": "1.0.0", "isobject": "3.0.1", - "mixin-deep": "1.3.0", + "mixin-deep": "1.3.1", "pascalcase": "0.1.1" } }, @@ -518,9 +518,9 @@ } }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -683,9 +683,9 @@ } }, "chokidar": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.0.tgz", - "integrity": "sha512-OgXCNv2U6TnG04D3tth0gsvdbV4zdbxFG3sYUqcoQMoEFVd1j1pZR6TZ8iknC45o9IJ6PeQI/J6wT/+cHcniAw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.1.tgz", + "integrity": "sha512-rv5iP8ENhpqvDWr677rAXcB+SMoPQ1urd4ch79+PhM4lQwbATdJUQK69t0lJIKNB+VXpqxt5V1gvqs59XEPKnw==", "requires": { "anymatch": "2.0.0", "async-each": "1.0.1", @@ -697,7 +697,8 @@ "is-glob": "4.0.0", "normalize-path": "2.1.1", "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "readdirp": "2.1.0", + "upath": "1.0.0" } }, "cipher-base": { @@ -824,9 +825,9 @@ } }, "commander": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.0.tgz", - "integrity": "sha512-okPpdvdJr6mUGi2XzupC+irQxzwGLVaBzacFC14hjLv8NColXEsxsU+QaeuSSXpQUak5g2K0vQ7WjA1e8svczg==" + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" }, "common-tags": { "version": "1.7.2", @@ -852,7 +853,7 @@ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "requires": { "inherits": "2.0.3", - "readable-stream": "2.3.3", + "readable-stream": "2.3.4", "typedarray": "0.0.6" } }, @@ -1411,14 +1412,12 @@ "dependencies": { "abbrev": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", - "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "bundled": true, "optional": true }, "ajv": { "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "bundled": true, "optional": true, "requires": { "co": "4.6.0", @@ -1427,19 +1426,16 @@ }, "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "bundled": true }, "aproba": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", - "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "bundled": true, "optional": true }, "are-we-there-yet": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "bundled": true, "optional": true, "requires": { "delegates": "1.0.0", @@ -1448,43 +1444,36 @@ }, "asn1": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "bundled": true, "optional": true }, "assert-plus": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "bundled": true, "optional": true }, "asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "bundled": true, "optional": true }, "aws-sign2": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "bundled": true, "optional": true }, "aws4": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "bundled": true, "optional": true }, "balanced-match": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + "bundled": true }, "bcrypt-pbkdf": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "bundled": true, "optional": true, "requires": { "tweetnacl": "0.14.5" @@ -1492,24 +1481,21 @@ }, "block-stream": { "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "bundled": true, "requires": { "inherits": "2.0.3" } }, "boom": { "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "bundled": true, "requires": { "hoek": "2.16.3" } }, "brace-expansion": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", - "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "bundled": true, "requires": { "balanced-match": "0.4.2", "concat-map": "0.0.1" @@ -1517,61 +1503,51 @@ }, "buffer-shims": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + "bundled": true }, "caseless": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "bundled": true, "optional": true }, "co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "bundled": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "bundled": true }, "combined-stream": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "bundled": true, "requires": { "delayed-stream": "1.0.0" } }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "bundled": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + "bundled": true }, "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "bundled": true }, "cryptiles": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "bundled": true, "requires": { "boom": "2.10.1" } }, "dashdash": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "bundled": true, "optional": true, "requires": { "assert-plus": "1.0.0" @@ -1579,16 +1555,14 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "optional": true } } }, "debug": { "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "bundled": true, "optional": true, "requires": { "ms": "2.0.0" @@ -1596,31 +1570,26 @@ }, "deep-extend": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "bundled": true, "optional": true }, "delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "bundled": true }, "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "bundled": true, "optional": true }, "detect-libc": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.2.tgz", - "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=", + "bundled": true, "optional": true }, "ecc-jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "bundled": true, "optional": true, "requires": { "jsbn": "0.1.1" @@ -1628,25 +1597,21 @@ }, "extend": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "bundled": true, "optional": true }, "extsprintf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" + "bundled": true }, "forever-agent": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "bundled": true, "optional": true }, "form-data": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "bundled": true, "optional": true, "requires": { "asynckit": "0.4.0", @@ -1656,13 +1621,11 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "bundled": true }, "fstream": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "bundled": true, "requires": { "graceful-fs": "4.1.11", "inherits": "2.0.3", @@ -1672,8 +1635,7 @@ }, "fstream-ignore": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "bundled": true, "optional": true, "requires": { "fstream": "1.0.11", @@ -1683,8 +1645,7 @@ }, "gauge": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "bundled": true, "optional": true, "requires": { "aproba": "1.1.1", @@ -1699,8 +1660,7 @@ }, "getpass": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "bundled": true, "optional": true, "requires": { "assert-plus": "1.0.0" @@ -1708,16 +1668,14 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "optional": true } } }, "glob": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "bundled": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -1729,19 +1687,16 @@ }, "graceful-fs": { "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "bundled": true }, "har-schema": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "bundled": true, "optional": true }, "har-validator": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "bundled": true, "optional": true, "requires": { "ajv": "4.11.8", @@ -1750,14 +1705,12 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "bundled": true, "optional": true }, "hawk": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "bundled": true, "requires": { "boom": "2.10.1", "cryptiles": "2.0.5", @@ -1767,13 +1720,11 @@ }, "hoek": { "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + "bundled": true }, "http-signature": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "bundled": true, "optional": true, "requires": { "assert-plus": "0.2.0", @@ -1783,8 +1734,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "bundled": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -1792,44 +1742,37 @@ }, "inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "bundled": true }, "ini": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "bundled": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "bundled": true, "requires": { "number-is-nan": "1.0.1" } }, "is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "bundled": true, "optional": true }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "bundled": true }, "isstream": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "bundled": true, "optional": true }, "jodid25519": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "bundled": true, "optional": true, "requires": { "jsbn": "0.1.1" @@ -1837,20 +1780,17 @@ }, "jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "bundled": true, "optional": true }, "json-schema": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "bundled": true, "optional": true }, "json-stable-stringify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "bundled": true, "optional": true, "requires": { "jsonify": "0.0.0" @@ -1858,20 +1798,17 @@ }, "json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "bundled": true, "optional": true }, "jsonify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "bundled": true, "optional": true }, "jsprim": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "bundled": true, "optional": true, "requires": { "assert-plus": "1.0.0", @@ -1882,56 +1819,48 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "optional": true } } }, "mime-db": { "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" + "bundled": true }, "mime-types": { "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "bundled": true, "requires": { "mime-db": "1.27.0" } }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "bundled": true, "requires": { "brace-expansion": "1.1.7" } }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "bundled": true }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "bundled": true, "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "bundled": true, "optional": true }, "node-pre-gyp": { "version": "0.6.39", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz", - "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==", + "bundled": true, "optional": true, "requires": { "detect-libc": "1.0.2", @@ -1949,8 +1878,7 @@ }, "nopt": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "bundled": true, "optional": true, "requires": { "abbrev": "1.1.0", @@ -1959,8 +1887,7 @@ }, "npmlog": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", - "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", + "bundled": true, "optional": true, "requires": { "are-we-there-yet": "1.1.4", @@ -1971,45 +1898,38 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "bundled": true }, "oauth-sign": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "bundled": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "bundled": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "bundled": true, "requires": { "wrappy": "1.0.2" } }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "bundled": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "bundled": true, "optional": true }, "osenv": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "bundled": true, "optional": true, "requires": { "os-homedir": "1.0.2", @@ -2018,36 +1938,30 @@ }, "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=" + "bundled": true }, "performance-now": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "bundled": true, "optional": true }, "process-nextick-args": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "bundled": true }, "punycode": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "bundled": true, "optional": true }, "qs": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "bundled": true, "optional": true }, "rc": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "bundled": true, "optional": true, "requires": { "deep-extend": "0.4.2", @@ -2058,16 +1972,14 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "bundled": true, "optional": true } } }, "readable-stream": { "version": "2.2.9", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "bundled": true, "requires": { "buffer-shims": "1.0.0", "core-util-is": "1.0.2", @@ -2080,8 +1992,7 @@ }, "request": { "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "bundled": true, "optional": true, "requires": { "aws-sign2": "0.6.0", @@ -2110,47 +2021,40 @@ }, "rimraf": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "bundled": true, "requires": { "glob": "7.1.2" } }, "safe-buffer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" + "bundled": true }, "semver": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "bundled": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "bundled": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "bundled": true, "optional": true }, "sntp": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "bundled": true, "requires": { "hoek": "2.16.3" } }, "sshpk": { "version": "1.13.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", - "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "bundled": true, "optional": true, "requires": { "asn1": "0.2.3", @@ -2166,16 +2070,14 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "optional": true } } }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "bundled": true, "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -2184,36 +2086,31 @@ }, "string_decoder": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", - "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "bundled": true, "requires": { "safe-buffer": "5.0.1" } }, "stringstream": { "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "bundled": true, "optional": true }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "bundled": true, "requires": { "ansi-regex": "2.1.1" } }, "strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "bundled": true, "optional": true }, "tar": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "bundled": true, "requires": { "block-stream": "0.0.9", "fstream": "1.0.11", @@ -2222,8 +2119,7 @@ }, "tar-pack": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", - "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "bundled": true, "optional": true, "requires": { "debug": "2.6.8", @@ -2238,8 +2134,7 @@ }, "tough-cookie": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "bundled": true, "optional": true, "requires": { "punycode": "1.4.1" @@ -2247,8 +2142,7 @@ }, "tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "bundled": true, "optional": true, "requires": { "safe-buffer": "5.0.1" @@ -2256,31 +2150,26 @@ }, "tweetnacl": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "bundled": true, "optional": true }, "uid-number": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "bundled": true, "optional": true }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "bundled": true }, "uuid": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", - "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "bundled": true, "optional": true }, "verror": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "bundled": true, "optional": true, "requires": { "extsprintf": "1.0.2" @@ -2288,8 +2177,7 @@ }, "wide-align": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "bundled": true, "optional": true, "requires": { "string-width": "1.0.2" @@ -2297,8 +2185,7 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "bundled": true } } }, @@ -2475,6 +2362,13 @@ "glob": "7.1.2", "lodash": "4.17.5", "minimatch": "3.0.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + } } }, "graceful-fs": { @@ -3207,9 +3101,9 @@ } }, "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" }, "lodash._reinterpolate": { "version": "3.0.0", @@ -3396,7 +3290,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -3405,9 +3299,9 @@ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "mixin-deep": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.0.tgz", - "integrity": "sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "requires": { "for-in": "1.0.2", "is-extendable": "1.0.1" @@ -3573,7 +3467,7 @@ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", "requires": { "chalk": "1.1.3", - "commander": "2.14.0", + "commander": "2.14.1", "is-my-json-valid": "2.17.1", "pinkie-promise": "2.0.1" } @@ -3909,7 +3803,7 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", "requires": { - "@types/node": "9.4.0" + "@types/node": "9.4.5" } }, "pascalcase": { @@ -4011,9 +3905,9 @@ "integrity": "sha1-xrs4n5qVH4K9TrFpYAEFvS/5x3g=" }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "prr": { "version": "1.0.1", @@ -4103,14 +3997,14 @@ } }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", + "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "1.0.7", + "process-nextick-args": "2.0.0", "safe-buffer": "5.1.1", "string_decoder": "1.0.3", "util-deprecate": "1.0.2" @@ -4123,7 +4017,7 @@ "requires": { "graceful-fs": "4.1.11", "minimatch": "3.0.4", - "readable-stream": "2.3.3", + "readable-stream": "2.3.4", "set-immediate-shim": "1.0.1" } }, @@ -4221,6 +4115,13 @@ "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", "requires": { "lodash": "4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + } } }, "request-promise-native": { @@ -4472,6 +4373,13 @@ "lodash": "4.17.5", "scss-tokenizer": "0.2.3", "yargs": "7.1.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + } } }, "sax": { @@ -4824,7 +4732,7 @@ "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", "requires": { - "readable-stream": "2.3.3" + "readable-stream": "2.3.4" } }, "stealthy-require": { @@ -5117,15 +5025,15 @@ "integrity": "sha1-m7i6DoQfs/TPH+fCRenz+opf6Zw=" }, "typescript": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz", - "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.1.tgz", + "integrity": "sha512-bqB1yS6o9TNA9ZC/MJxM0FZzPnZdtHj0xWK/IZ5khzVqdpGul/R/EIiHRgFXlwTD7PSIaYVnGKq1QgMCu2mnqw==", "dev": true }, "uglify-es": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.8.tgz", - "integrity": "sha512-j8li0jWcAN6yBuAVYFZEFyYINZAm4WEdMwkA6qXFi4TLrze3Mp0Le7QjW6LR9HQjQJ2zRa9VgnFLs3PatijWOw==", + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", "requires": { "commander": "2.13.0", "source-map": "0.6.1" @@ -5143,6 +5051,11 @@ } } }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=" + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -5208,6 +5121,15 @@ } } }, + "upath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.0.tgz", + "integrity": "sha1-tHBrlGHKhHOt+JEz0jVonKF/NlY=", + "requires": { + "lodash": "3.10.1", + "underscore.string": "2.3.3" + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -5384,9 +5306,9 @@ } }, "workbox-build": { - "version": "3.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-3.0.0-alpha.3.tgz", - "integrity": "sha512-/qXXoujDFXCXnnf1ZOJE7JNgoDsz8KI9EN/9B3IjTGHrfB8d9ecNRdiiyHYcy/i1h6ag+8BUrKgdQc7J/8I/wQ==", + "version": "3.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-3.0.0-alpha.6.tgz", + "integrity": "sha512-iOzD11LXbuZtzBAC3X1wpD5KLBKtt5suGxq36nT6gggOgwWI+xwTU+lL28QroRuD8oEf1cLo2K1wZzVQUqM89w==", "requires": { "babel-runtime": "6.26.0", "common-tags": "1.7.2", diff --git a/packages/angular/package.json b/packages/angular/package.json index 2519e32166..ee509bfa7c 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -47,7 +47,7 @@ "glob": "7.1.2", "ionicons": "~3.0.0", "rxjs": "5.5.2", - "typescript": "~2.5.2", + "typescript": "latest", "zone.js": "0.8.18" }, "dependencies": { diff --git a/packages/angular/src/router/outlet.ts b/packages/angular/src/router/outlet.ts index 6423459f92..c9f72a4758 100644 --- a/packages/angular/src/router/outlet.ts +++ b/packages/angular/src/router/outlet.ts @@ -28,6 +28,7 @@ import { OutletInjector } from './outlet-injector'; import { RouteEventHandler } from './route-event-handler'; import { AngularComponentMounter, AngularEscapeHatch } from '..'; +import { ensureExternalRounterController } from '../util/util'; let id = 0; @@ -108,7 +109,7 @@ export class RouterOutlet implements OnDestroy, OnInit, RouterDelegate { } activateWith(activatedRoute: ActivatedRoute, cfr: ComponentFactoryResolver): Promise { - this.routeEventHandler.externalNavStart(); + if (this.activationStatus !== NOT_ACTIVATED) { return Promise.resolve(); } @@ -122,10 +123,13 @@ export class RouterOutlet implements OnDestroy, OnInit, RouterDelegate { const injector = new OutletInjector(activatedRoute, childContexts, this.location.injector); const isTopLevel = !hasChildComponent(activatedRoute); - return activateRoute(this.elementRef.nativeElement, component, cfr, injector, isTopLevel).then(() => { - this.changeDetector.markForCheck(); - this.activateEvents.emit(null); - this.activationStatus = ACTIVATED; + + return this.routeEventHandler.externalNavStart().then(() => { + return activateRoute(this.elementRef.nativeElement, component, cfr, injector, isTopLevel).then(() => { + this.changeDetector.markForCheck(); + this.activateEvents.emit(null); + this.activationStatus = ACTIVATED; + }); }); } } @@ -133,103 +137,12 @@ export class RouterOutlet implements OnDestroy, OnInit, RouterDelegate { export function activateRoute(navElement: HTMLIonNavElement, component: Type, cfr: ComponentFactoryResolver, injector: Injector, isTopLevel: boolean): Promise { - return navElement.componentOnReady().then(() => { - - // check if the nav has an `` as a parent - if (isParentTab(navElement)) { - // check if the tab is selected - return updateTab(navElement, component, cfr, injector, isTopLevel); - } else { - return updateNav(navElement, component, cfr, injector, isTopLevel); - } + return ensureExternalRounterController().then((externalRouterController) => { + const escapeHatch = getEscapeHatch(cfr, injector); + return externalRouterController.reconcileNav(navElement, component, escapeHatch, isTopLevel); }); } - - -function isParentTab(navElement: HTMLIonNavElement) { - return navElement.parentElement.tagName.toLowerCase() === 'ion-tab'; -} - -function isTabSelected(tabsElement: HTMLIonTabsElement, tabElement: HTMLIonTabElement ): Promise { - const promises: Promise[] = []; - promises.push(tabsElement.componentOnReady()); - promises.push(tabElement.componentOnReady()); - return Promise.all(promises).then(() => { - return tabsElement.getSelected() === tabElement; - }); -} - -function getSelected(tabsElement: HTMLIonTabsElement) { - tabsElement.getSelected(); -} - -function updateTab(navElement: HTMLIonNavElement, - component: Type, cfr: ComponentFactoryResolver, injector: Injector, isTopLevel: boolean) { - - const tab = navElement.parentElement as HTMLIonTabElement; - // tab.externalNav = true; - - // (tab.parentElement as HTMLIonTabsElement).externalInitialize = true; - // yeah yeah, I know this is kind of ugly but oh well, I know the internal structure of - const tabs = tab.parentElement.parentElement as HTMLIonTabsElement; - // tabs.externalInitialize = true; - return isTabSelected(tabs, tab).then((isSelected: boolean) => { - if (!isSelected) { - const promise = updateNav(navElement, component, cfr, injector, isTopLevel); - (window as any).externalNavPromise = promise - // okay, the tab is not selected, so we need to do a "switch" transition - // basically, we should update the nav, and then swap the tabs - return promise.then(() => { - return tabs.select(tab); - }); - } - - // okay cool, the tab is already selected, so we want to see a transition - return updateNav(navElement, component, cfr, injector, isTopLevel); - }) -} - -function updateNav(navElement: HTMLIonNavElement, - component: Type, cfr: ComponentFactoryResolver, injector: Injector, isTopLevel: boolean): Promise { - - const escapeHatch = getEscapeHatch(cfr, injector); - - // check if the component is the top view - const activeViews = navElement.getViews(); - if (activeViews.length === 0) { - // there isn't a view in the stack, so push one - return navElement.setRoot(component, {}, {}, escapeHatch); - } - - const currentView = activeViews[activeViews.length - 1]; - if (currentView.component === component) { - // the top view is already the component being activated, so there is no change needed - return Promise.resolve(null); - } - - // check if the component is the previous view, if so, pop back to it - if (activeViews.length > 1) { - // there's at least two views in the stack - const previousView = activeViews[activeViews.length - 2]; - if (previousView.component === component) { - // cool, we match the previous view, so pop it - return navElement.pop(null, escapeHatch); - } - } - - // check if the component is already in the stack of views, in which case we pop back to it - for (const view of activeViews) { - if (view.component === component) { - // cool, we found the match, pop back to that bad boy - return navElement.popTo(view, null, escapeHatch); - } - } - - // it's the top level nav, and it's not one of those other behaviors, so do a push so the user gets a chill animation - return navElement.push(component, {}, { animate: isTopLevel }, escapeHatch); -} - export const NOT_ACTIVATED = 0; export const ACTIVATION_IN_PROGRESS = 1; export const ACTIVATED = 2; diff --git a/packages/angular/src/router/route-event-handler.ts b/packages/angular/src/router/route-event-handler.ts index 2ad4be81b9..af1beeeac9 100644 --- a/packages/angular/src/router/route-event-handler.ts +++ b/packages/angular/src/router/route-event-handler.ts @@ -2,26 +2,29 @@ import { Injectable } from '@angular/core'; import { Event, NavigationEnd, - NavigationStart, Router } from '@angular/router'; -let initialized = false; +import { ensureExternalRounterController } from '../util/util'; @Injectable() export class RouteEventHandler { constructor(private router: Router) { - (window as any).externalNav = false; router.events.subscribe((event: Event) => { if (event instanceof NavigationEnd) { - (window as any).externalNav = false; + ensureExternalRounterController().then((element) => { + element.updateExternalNavOccuring(false); + }); } }); } externalNavStart() { - (window as any).externalNav = true; + return ensureExternalRounterController().then((element) => { + element.updateExternalNavOccuring(true); + }); } -} \ No newline at end of file +} + diff --git a/packages/angular/src/util/util.ts b/packages/angular/src/util/util.ts index ab05e5817f..01917fdca5 100644 --- a/packages/angular/src/util/util.ts +++ b/packages/angular/src/util/util.ts @@ -25,3 +25,13 @@ export function removeAllNodeChildren(element: HTMLElement) { export function isString(something: any) { return typeof something === 'string' ? true : false; } + +export function ensureExternalRounterController(): Promise { + const element = document.querySelector('ion-external-router-controller'); + if (element) { + return (element as any).componentOnReady(); + } + const toCreate = document.createElement('ion-external-router-controller'); + document.body.appendChild(toCreate); + return (toCreate as any).componentOnReady(); +} \ No newline at end of file diff --git a/packages/core/src/components.d.ts b/packages/core/src/components.d.ts index 1692152644..5bfd2b2094 100644 --- a/packages/core/src/components.d.ts +++ b/packages/core/src/components.d.ts @@ -874,6 +874,36 @@ declare global { } +import { + ExternalRouterController as IonExternalRouterController +} from './components/external-router-controller/external-router-controller'; + +declare global { + interface HTMLIonExternalRouterControllerElement extends IonExternalRouterController, HTMLStencilElement { + } + var HTMLIonExternalRouterControllerElement: { + prototype: HTMLIonExternalRouterControllerElement; + new (): HTMLIonExternalRouterControllerElement; + }; + interface HTMLElementTagNameMap { + "ion-external-router-controller": HTMLIonExternalRouterControllerElement; + } + interface ElementTagNameMap { + "ion-external-router-controller": HTMLIonExternalRouterControllerElement; + } + namespace JSX { + interface IntrinsicElements { + "ion-external-router-controller": JSXElements.IonExternalRouterControllerAttributes; + } + } + namespace JSXElements { + export interface IonExternalRouterControllerAttributes extends HTMLAttributes { + + } + } +} + + import { FabButton as IonFabButton } from './components/fab-button/fab-button'; diff --git a/packages/core/src/components/external-router-controller/external-router-controller.ts b/packages/core/src/components/external-router-controller/external-router-controller.ts new file mode 100644 index 0000000000..0692f0a259 --- /dev/null +++ b/packages/core/src/components/external-router-controller/external-router-controller.ts @@ -0,0 +1,119 @@ +import { Component, Method } from '@stencil/core'; +import { EscapeHatch, NavResult } from '../../index'; + +@Component({ + tag: 'ion-external-router-controller' +}) +export class ExternalRouterController { + + externalNavPromise: void | Promise = null; + externalNavOccuring = false; + + @Method() + getExternalNavPromise(): void | Promise { + return this.externalNavPromise; + } + + @Method() + clearExternalNavPromise(): void { + this.externalNavPromise = null; + } + + @Method() + getExternalNavOccuring(): boolean { + return this.externalNavOccuring; + } + + @Method() + updateExternalNavOccuring(status: boolean) { + this.externalNavOccuring = status; + } + + @Method() + reconcileNav(nav: HTMLIonNavElement, component: any, escapeHatch: EscapeHatch, isTopLevel: boolean) { + return nav.componentOnReady().then(() => { + // check if the nav has an `` as a parent + if (isParentTab(nav)) { + // check if the tab is selected + return updateTab(this, nav, component, escapeHatch, isTopLevel); + } else { + return updateNav(nav, component, escapeHatch, isTopLevel); + } + }); + } +} + +function isParentTab(navElement: HTMLIonNavElement) { + return navElement.parentElement.tagName.toLowerCase() === 'ion-tab'; +} + +function updateTab(externalRouterController: ExternalRouterController, navElement: HTMLIonNavElement, component: any, escapeHatch: EscapeHatch, isTopLevel: boolean) { + + const tab = navElement.parentElement as HTMLIonTabElement; + + // yeah yeah, I know this is kind of ugly but oh well, I know the internal structure of + const tabs = tab.parentElement.parentElement as HTMLIonTabsElement; + + return isTabSelected(tabs, tab).then((isSelected: boolean) => { + if (!isSelected) { + const promise = updateNav(navElement, component, escapeHatch, isTopLevel); + externalRouterController.externalNavPromise = promise; + // okay, the tab is not selected, so we need to do a "switch" transition + // basically, we should update the nav, and then swap the tabs + return promise.then(() => { + return tabs.select(tab); + }); + } + + // okay cool, the tab is already selected, so we want to see a transition + return updateNav(navElement, component, escapeHatch, isTopLevel); + }); +} + +function isTabSelected(tabsElement: HTMLIonTabsElement, tabElement: HTMLIonTabElement ): Promise { + const promises: Promise[] = []; + promises.push(tabsElement.componentOnReady()); + promises.push(tabElement.componentOnReady()); + return Promise.all(promises).then(() => { + return tabsElement.getSelected() === tabElement; + }); +} + +function updateNav(navElement: HTMLIonNavElement, + component: any, escapeHatch: EscapeHatch, isTopLevel: boolean): Promise { + + + // check if the component is the top view + const activeViews = navElement.getViews(); + if (activeViews.length === 0) { + // there isn't a view in the stack, so push one + return navElement.setRoot(component, {}, {}, escapeHatch); + } + + const currentView = activeViews[activeViews.length - 1]; + if (currentView.component === component) { + // the top view is already the component being activated, so there is no change needed + return Promise.resolve(null); + } + + // check if the component is the previous view, if so, pop back to it + if (activeViews.length > 1) { + // there's at least two views in the stack + const previousView = activeViews[activeViews.length - 2]; + if (previousView.component === component) { + // cool, we match the previous view, so pop it + return navElement.pop(null, escapeHatch); + } + } + + // check if the component is already in the stack of views, in which case we pop back to it + for (const view of activeViews) { + if (view.component === component) { + // cool, we found the match, pop back to that bad boy + return navElement.popTo(view, null, escapeHatch); + } + } + + // it's the top level nav, and it's not one of those other behaviors, so do a push so the user gets a chill animation + return navElement.push(component, {}, { animate: isTopLevel }, escapeHatch); +} diff --git a/packages/core/src/components/external-router-controller/readme.md b/packages/core/src/components/external-router-controller/readme.md new file mode 100644 index 0000000000..7395772c2a --- /dev/null +++ b/packages/core/src/components/external-router-controller/readme.md @@ -0,0 +1,28 @@ +# ion-external-router-controller + + + + + + +## Methods + +#### clearExternalNavPromise() + + +#### getExternalNavOccuring() + + +#### getExternalNavPromise() + + +#### reconcileNav() + + +#### updateExternalNavOccuring() + + + +---------------------------------------------- + +*Built with [StencilJS](https://stenciljs.com/)* diff --git a/packages/core/src/components/tab/tab.tsx b/packages/core/src/components/tab/tab.tsx index 8612fdda50..4d30a915e5 100644 --- a/packages/core/src/components/tab/tab.tsx +++ b/packages/core/src/components/tab/tab.tsx @@ -1,5 +1,5 @@ import { Component, Element, Event, EventEmitter, Method, Prop, State, Watch } from '@stencil/core'; -import { getNavAsChildIfExists } from '../../utils/helpers'; +import { ensureExternalRounterController, getNavAsChildIfExists } from '../../utils/helpers'; import { FrameworkDelegate } from '../..'; @Component({ @@ -85,11 +85,14 @@ export class Tab { const nav = getNavAsChildIfExists(this.el); if (nav) { // the tab's nav has been initialized externally - if ((window as any).externalNavPromise) { - return (window as any).externalNavPromise.then(() => { - (window as any).externalNavPromise = null; - }); - } else { + + return ensureExternalRounterController().then((externalRouterController) => { + if (externalRouterController.getExternalNavPromise()) { + return (externalRouterController.getExternalNavPromise() as Promise).then(() => { + externalRouterController.clearExternalNavPromise(); + }); + } + // the tab's nav has not been initialized externally, so // check if we need to initiailize it return (nav as any).componentOnReady().then(() => { @@ -100,7 +103,7 @@ export class Tab { } return Promise.resolve(); }); - } + }); } } diff --git a/packages/core/src/components/tabs/tabs.tsx b/packages/core/src/components/tabs/tabs.tsx index 3a376c622c..961e7f0eed 100644 --- a/packages/core/src/components/tabs/tabs.tsx +++ b/packages/core/src/components/tabs/tabs.tsx @@ -1,6 +1,8 @@ import { Component, Element, Event, EventEmitter, Listen, Method, Prop, State } from '@stencil/core'; import { Config, NavEventDetail, NavOutlet } from '../../index'; +import { ensureExternalRounterController } from '../../utils/helpers'; + @Component({ tag: 'ion-tabs', @@ -71,8 +73,13 @@ export class Tabs implements NavOutlet { this.loadConfig('tabsLayout', 'icon-top'); this.loadConfig('tabsHighlight', true); - return this.initTabs().then(() => { - if (! (window as any).externalNav) { + const promises: Promise[] = []; + promises.push(this.initTabs()); + promises.push(ensureExternalRounterController()); + return Promise.all(promises).then(([_, externalRouterController]) => { + return (externalRouterController as HTMLIonExternalRouterControllerElement).getExternalNavOccuring(); + }).then((externalNavOccuring) => { + if (!externalNavOccuring) { return this.initSelect(); } return null; diff --git a/packages/core/src/utils/helpers.ts b/packages/core/src/utils/helpers.ts index 1394d0b913..2ead21431c 100644 --- a/packages/core/src/utils/helpers.ts +++ b/packages/core/src/utils/helpers.ts @@ -316,3 +316,13 @@ export function normalizeUrl(url: string) { } return url; } + +export function ensureExternalRounterController(): Promise { + const element = document.querySelector('ion-external-router-controller'); + if (element) { + return (element as any).componentOnReady(); + } + const toCreate = document.createElement('ion-external-router-controller'); + document.body.appendChild(toCreate); + return (toCreate as any).componentOnReady(); +}