From bc8890d75e77430b4b140f7ae91da8d447474b37 Mon Sep 17 00:00:00 2001 From: Jacques Rowe Date: Thu, 9 Aug 2018 11:52:17 +0200 Subject: [PATCH 01/12] Update package(-lock).json with npm-check-updates ncu -u & npm i on latest lts version of node --- package-lock.json | 2116 +++++++++++++++++++++++---------------------- package.json | 8 +- 2 files changed, 1070 insertions(+), 1054 deletions(-) diff --git a/package-lock.json b/package-lock.json index 82b721c..7266b76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "requires": { "@firebase/app-types": "0.1.2", "@firebase/util": "0.1.10", - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "@firebase/app-types": { @@ -28,7 +28,7 @@ "@firebase/logger": "0.1.0", "@firebase/util": "0.1.10", "faye-websocket": "0.11.1", - "tslib": "1.9.0" + "tslib": "^1.9.0" }, "dependencies": { "faye-websocket": { @@ -36,7 +36,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "requires": { - "websocket-driver": "0.7.0" + "websocket-driver": ">=0.5.1" } } } @@ -56,7 +56,7 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.1.10.tgz", "integrity": "sha512-XEogRfUQBZ4T37TMq/3ZbuiTdRAKX8hF3TgJglUZNCJf/6QnQ+jlupCuMAXBqCGfw2Mw0m2matoCUBWpsyevOA==", "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "@google-cloud/common": { @@ -64,24 +64,24 @@ "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.16.2.tgz", "integrity": "sha512-GrkaFoj0/oO36pNs4yLmaYhTujuA3i21FdQik99Fd/APix1uhf01VlpJY4lAteTDFLRNkRx6ydEh7OVvmeUHng==", "requires": { - "array-uniq": "1.0.3", - "arrify": "1.0.1", - "concat-stream": "1.6.2", - "create-error-class": "3.0.2", - "duplexify": "3.5.4", - "ent": "2.2.0", - "extend": "3.0.1", - "google-auto-auth": "0.9.7", - "is": "3.2.1", + "array-uniq": "^1.0.3", + "arrify": "^1.0.1", + "concat-stream": "^1.6.0", + "create-error-class": "^3.0.2", + "duplexify": "^3.5.0", + "ent": "^2.2.0", + "extend": "^3.0.1", + "google-auto-auth": "^0.9.0", + "is": "^3.2.0", "log-driver": "1.2.7", - "methmeth": "1.1.0", - "modelo": "4.2.3", - "request": "2.85.0", - "retry-request": "3.3.1", - "split-array-stream": "1.0.3", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1", - "through2": "2.0.3" + "methmeth": "^1.1.0", + "modelo": "^4.2.0", + "request": "^2.79.0", + "retry-request": "^3.0.0", + "split-array-stream": "^1.0.0", + "stream-events": "^1.0.1", + "string-format-obj": "^1.1.0", + "through2": "^2.0.3" } }, "@google-cloud/common-grpc": { @@ -89,15 +89,15 @@ "resolved": "https://registry.npmjs.org/@google-cloud/common-grpc/-/common-grpc-0.6.1.tgz", "integrity": "sha512-pspOZVfmrCTP0svTNwFE8nYJsQp5rTUaeUpJwpgslDk5tDWFbYT3dZkANbiURcTSq0mo6hZmd+M5rPIzWMVUmA==", "requires": { - "@google-cloud/common": "0.17.0", - "dot-prop": "4.2.0", - "duplexify": "3.5.4", - "extend": "3.0.1", - "grpc": "1.10.0", - "is": "3.2.1", - "modelo": "4.2.3", - "retry-request": "3.3.1", - "through2": "2.0.3" + "@google-cloud/common": "^0.17.0", + "dot-prop": "^4.2.0", + "duplexify": "^3.5.1", + "extend": "^3.0.1", + "grpc": "^1.10.0", + "is": "^3.2.0", + "modelo": "^4.2.0", + "retry-request": "^3.3.1", + "through2": "^2.0.3" }, "dependencies": { "@google-cloud/common": { @@ -105,24 +105,24 @@ "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.17.0.tgz", "integrity": "sha512-HRZLSU762E6HaKoGfJGa8W95yRjb9rY7LePhjaHK9ILAnFacMuUGVamDbTHu1csZomm1g3tZTtXfX/aAhtie/Q==", "requires": { - "array-uniq": "1.0.3", - "arrify": "1.0.1", - "concat-stream": "1.6.2", - "create-error-class": "3.0.2", - "duplexify": "3.5.4", - "ent": "2.2.0", - "extend": "3.0.1", - "google-auto-auth": "0.10.0", - "is": "3.2.1", + "array-uniq": "^1.0.3", + "arrify": "^1.0.1", + "concat-stream": "^1.6.0", + "create-error-class": "^3.0.2", + "duplexify": "^3.5.0", + "ent": "^2.2.0", + "extend": "^3.0.1", + "google-auto-auth": "^0.10.0", + "is": "^3.2.0", "log-driver": "1.2.7", - "methmeth": "1.1.0", - "modelo": "4.2.3", - "request": "2.85.0", - "retry-request": "3.3.1", - "split-array-stream": "1.0.3", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1", - "through2": "2.0.3" + "methmeth": "^1.1.0", + "modelo": "^4.2.0", + "request": "^2.79.0", + "retry-request": "^3.0.0", + "split-array-stream": "^1.0.0", + "stream-events": "^1.0.1", + "string-format-obj": "^1.1.0", + "through2": "^2.0.3" } }, "google-auto-auth": { @@ -130,10 +130,10 @@ "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.10.0.tgz", "integrity": "sha512-R6m473OqgZacPvlidJ0aownTlUWyLy654ugjKSXyi1ffIicXlXg3wMfse9T9zxqG6w01q6K1iG+b7dImMkVJ2Q==", "requires": { - "async": "2.6.0", - "gcp-metadata": "0.6.3", - "google-auth-library": "1.3.2", - "request": "2.85.0" + "async": "^2.3.0", + "gcp-metadata": "^0.6.1", + "google-auth-library": "^1.3.1", + "request": "^2.79.0" } } } @@ -143,16 +143,16 @@ "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-0.13.0.tgz", "integrity": "sha512-9Aak9O/NBwdhAJWn2ooaHJT0uyU6IN6oHegW4GcAzLwJKwx8nw+c/GwFufSS6PRMLTiXdpV0I/rvdz4nSgO1HA==", "requires": { - "@google-cloud/common": "0.16.2", - "@google-cloud/common-grpc": "0.6.1", - "bun": "0.0.12", - "deep-equal": "1.0.1", - "extend": "3.0.1", - "functional-red-black-tree": "1.0.1", - "google-gax": "0.15.0", - "is": "3.2.1", - "safe-buffer": "5.1.1", - "through2": "2.0.3" + "@google-cloud/common": "^0.16.0", + "@google-cloud/common-grpc": "^0.6.0", + "bun": "^0.0.12", + "deep-equal": "^1.0.1", + "extend": "^3.0.1", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^0.15.0", + "is": "^3.2.1", + "safe-buffer": "^5.1.1", + "through2": "^2.0.3" } }, "@google-cloud/storage": { @@ -160,27 +160,27 @@ "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.6.0.tgz", "integrity": "sha512-yQ63bJYoiwY220gn/KdTLPoHppAPwFHfG7VFLPwJ+1R5U1eqUN5XV2a7uPj1szGF8/gxlKm2UbE8DgoJJ76DFw==", "requires": { - "@google-cloud/common": "0.16.2", - "arrify": "1.0.1", - "async": "2.6.0", - "compressible": "2.0.13", - "concat-stream": "1.6.2", - "create-error-class": "3.0.2", - "duplexify": "3.5.4", - "extend": "3.0.1", - "gcs-resumable-upload": "0.9.0", - "hash-stream-validation": "0.2.1", - "is": "3.2.1", - "mime": "2.2.0", - "mime-types": "2.1.18", - "once": "1.4.0", - "pumpify": "1.4.0", - "request": "2.85.0", - "safe-buffer": "5.1.1", - "snakeize": "0.1.0", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1", - "through2": "2.0.3" + "@google-cloud/common": "^0.16.1", + "arrify": "^1.0.0", + "async": "^2.0.1", + "compressible": "^2.0.12", + "concat-stream": "^1.5.0", + "create-error-class": "^3.0.2", + "duplexify": "^3.5.0", + "extend": "^3.0.0", + "gcs-resumable-upload": "^0.9.0", + "hash-stream-validation": "^0.2.1", + "is": "^3.0.1", + "mime": "^2.2.0", + "mime-types": "^2.0.8", + "once": "^1.3.1", + "pumpify": "^1.3.3", + "request": "^2.83.0", + "safe-buffer": "^5.1.1", + "snakeize": "^0.1.0", + "stream-events": "^1.0.1", + "string-format-obj": "^1.0.0", + "through2": "^2.0.0" } }, "@mrmlnc/readdir-enhanced": { @@ -188,8 +188,8 @@ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "requires": { - "call-me-maybe": "1.0.1", - "glob-to-regexp": "0.3.0" + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" } }, "@protobufjs/aspromise": { @@ -217,8 +217,8 @@ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/inquire": "1.1.0" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, "@protobufjs/float": { @@ -252,7 +252,15 @@ "integrity": "sha512-REZcfXN1h2JLoSc066GAdUKP2OpNiG3mIpgyjZWB5RKhBOZc5xmAZwavbP6O7vKMZ+jYTqbwUNucMBl7dw68JA==", "dev": true, "requires": { - "@types/node": "9.6.0" + "@types/node": "*" + }, + "dependencies": { + "@types/node": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.0.tgz", + "integrity": "sha512-h3YZbOq2+ZoDFI1z8Zx0Ck/xRWkOESVaLdgLdd/c25mMQ1Y2CAkILu9ny5A15S5f32gGcQdaUIZ2jzYr8D7IFg==", + "dev": true + } } }, "@types/fs-extra": { @@ -261,7 +269,15 @@ "integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==", "dev": true, "requires": { - "@types/node": "9.6.0" + "@types/node": "*" + }, + "dependencies": { + "@types/node": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.0.tgz", + "integrity": "sha512-h3YZbOq2+ZoDFI1z8Zx0Ck/xRWkOESVaLdgLdd/c25mMQ1Y2CAkILu9ny5A15S5f32gGcQdaUIZ2jzYr8D7IFg==", + "dev": true + } } }, "@types/google-cloud__storage": { @@ -269,7 +285,7 @@ "resolved": "https://registry.npmjs.org/@types/google-cloud__storage/-/google-cloud__storage-1.1.7.tgz", "integrity": "sha512-010Llp+5ze+XWWmZuLDxs0pZgFjOgtJQVt9icJ0Ed67ZFLq7PnXkYx8x/k9nwDojR5/X4XoLPNqB1F627TScdQ==", "requires": { - "@types/node": "9.6.0" + "@types/node": "*" } }, "@types/lodash": { @@ -284,9 +300,9 @@ "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" }, "@types/node": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.0.tgz", - "integrity": "sha512-h3YZbOq2+ZoDFI1z8Zx0Ck/xRWkOESVaLdgLdd/c25mMQ1Y2CAkILu9ny5A15S5f32gGcQdaUIZ2jzYr8D7IFg==" + "version": "10.5.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.7.tgz", + "integrity": "sha512-VkKcfuitP+Nc/TaTFH0B8qNmn+6NbI6crLkQonbedViVz7O2w8QV/GERPlkJ4bg42VGHiEWa31CoTOPs1q6z1w==" }, "abbrev": { "version": "1.1.1", @@ -308,10 +324,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ansi-regex": { @@ -329,8 +345,8 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.5" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "arr-diff": { @@ -358,7 +374,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -381,8 +397,8 @@ "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", "requires": { - "colour": "0.7.1", - "optjs": "3.2.2" + "colour": "~0.7.1", + "optjs": "~3.2.2" } }, "asn1": { @@ -405,7 +421,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { - "lodash": "4.17.5" + "lodash": "^4.14.0" } }, "asynckit": { @@ -433,8 +449,8 @@ "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", "requires": { - "follow-redirects": "1.4.1", - "is-buffer": "1.1.6" + "follow-redirects": "^1.3.0", + "is-buffer": "^1.1.5" } }, "balanced-match": { @@ -447,13 +463,13 @@ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -461,7 +477,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } } } @@ -477,7 +493,7 @@ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "binary": { @@ -485,8 +501,8 @@ "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", "requires": { - "buffers": "0.1.1", - "chainsaw": "0.1.0" + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" } }, "bindings": { @@ -499,15 +515,20 @@ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, "boom": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "brace-expansion": { @@ -515,7 +536,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -524,18 +545,18 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "kind-of": "6.0.2", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "kind-of": "^6.0.2", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -543,7 +564,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -551,7 +572,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -581,7 +602,7 @@ "resolved": "https://registry.npmjs.org/bun/-/bun-0.0.12.tgz", "integrity": "sha512-Toms18J9DqnT+IfWkwxVTB2EaBprHvjlMWrTIsfX4xbu3ZBqVBwrERU0em1IgtRe04wT+wJxMlKHZok24hrcSQ==", "requires": { - "readable-stream": "1.0.34" + "readable-stream": "~1.0.32" }, "dependencies": { "isarray": { @@ -594,10 +615,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -612,7 +633,7 @@ "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", "requires": { - "long": "3.2.0" + "long": "~3" } }, "cache-base": { @@ -620,15 +641,15 @@ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, "call-me-maybe": { @@ -661,7 +682,7 @@ "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", "requires": { - "traverse": "0.3.9" + "traverse": ">=0.3.0 <0.4" }, "dependencies": { "traverse": { @@ -676,10 +697,10 @@ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -687,7 +708,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { @@ -695,7 +716,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -703,7 +724,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -713,7 +734,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -721,7 +742,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -731,9 +752,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -748,9 +769,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "co": { @@ -768,8 +789,8 @@ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "colour": { @@ -782,7 +803,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -800,7 +821,7 @@ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", "requires": { - "mime-db": "1.33.0" + "mime-db": ">= 1.33.0 < 2" } }, "concat-map": { @@ -813,10 +834,10 @@ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { - "buffer-from": "1.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "configstore": { @@ -824,12 +845,12 @@ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.2.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, "console-control-strings": { @@ -857,7 +878,7 @@ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "requires": { - "capture-stack-trace": "1.0.0" + "capture-stack-trace": "^1.0.0" } }, "cryptiles": { @@ -865,7 +886,7 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { @@ -873,7 +894,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } } } @@ -884,12 +905,13 @@ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, "csvtojson": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/csvtojson/-/csvtojson-1.1.9.tgz", - "integrity": "sha1-5kGucve8L6P5qvEn4CH8iUR8HNE=", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/csvtojson/-/csvtojson-2.0.8.tgz", + "integrity": "sha512-DC6YFtsJiA7t/Yz+KjzT6GXuKtU/5gRbbl7HJqvDVVir+dxdw2/1EgwfgJdnsvUT7lOnON5DvGftKuYWX1nMOQ==", "requires": { - "lodash": "4.17.5", - "strip-bom": "1.0.0" + "bluebird": "^3.5.1", + "lodash": "^4.17.3", + "strip-bom": "^2.0.0" } }, "dashdash": { @@ -897,7 +919,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "debug": { @@ -933,8 +955,8 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "foreach": "^2.0.5", + "object-keys": "^1.0.8" } }, "define-property": { @@ -942,8 +964,8 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" } }, "delayed-stream": { @@ -971,8 +993,8 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "requires": { - "arrify": "1.0.1", - "path-type": "3.0.0" + "arrify": "^1.0.1", + "path-type": "^3.0.0" } }, "dot-prop": { @@ -980,7 +1002,7 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "duplexify": { @@ -988,10 +1010,10 @@ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "stream-shift": "1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, "eastasianwidth": { @@ -1005,7 +1027,7 @@ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "ecdsa-sig-formatter": { @@ -1013,8 +1035,8 @@ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", "requires": { - "base64url": "2.0.0", - "safe-buffer": "5.1.1" + "base64url": "^2.0.0", + "safe-buffer": "^5.0.1" } }, "empower": { @@ -1022,8 +1044,8 @@ "resolved": "https://registry.npmjs.org/empower/-/empower-1.2.3.tgz", "integrity": "sha1-bw2nNEf07dg4/sXGAxOoi6XLhSs=", "requires": { - "core-js": "2.5.3", - "empower-core": "0.6.2" + "core-js": "^2.0.0", + "empower-core": "^0.6.2" } }, "empower-core": { @@ -1032,7 +1054,7 @@ "integrity": "sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ=", "requires": { "call-signature": "0.0.2", - "core-js": "2.5.3" + "core-js": "^2.0.0" } }, "end-of-stream": { @@ -1040,7 +1062,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "ent": { @@ -1053,7 +1075,7 @@ "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz", "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=", "requires": { - "core-js": "2.5.3" + "core-js": "^2.0.0" } }, "estraverse": { @@ -1066,9 +1088,9 @@ "resolved": "https://registry.npmjs.org/excel/-/excel-0.1.7.tgz", "integrity": "sha1-AKiOb+1fwG9EpKr2+I9l+FqTwLw=", "requires": { - "libxmljs": "0.18.7", - "node-promise": "0.5.12", - "underscore": "1.3.3", + "libxmljs": "~0.18.0", + "node-promise": "~0.5.3", + "underscore": "~1.3.3", "unzip2": "0.2.5" } }, @@ -1085,13 +1107,13 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "debug": { @@ -1107,7 +1129,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -1115,7 +1137,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -1123,7 +1145,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -1131,7 +1153,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1141,7 +1163,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -1149,7 +1171,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1159,9 +1181,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -1181,8 +1203,8 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -1190,7 +1212,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -1200,14 +1222,14 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -1215,7 +1237,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -1223,7 +1245,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -1243,11 +1265,11 @@ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.0.tgz", "integrity": "sha512-4F75PTznkNtSKs2pbhtBwRkw8sRwa7LfXx5XaQJOe4IQ6yTjceLDTwM5gj1s80R2t/5WeDC1gVfm3jLE+l39Tw==", "requires": { - "@mrmlnc/readdir-enhanced": "2.2.1", - "glob-parent": "3.1.0", - "is-glob": "4.0.0", - "merge2": "1.2.1", - "micromatch": "3.1.10" + "@mrmlnc/readdir-enhanced": "^2.2.1", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.1", + "micromatch": "^3.1.8" } }, "fast-json-stable-stringify": { @@ -1260,7 +1282,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz", "integrity": "sha1-SCpQWw3wrmJrlphm0710DNuWLoM=", "requires": { - "websocket-driver": "0.7.0" + "websocket-driver": ">=0.5.1" } }, "fill-range": { @@ -1268,10 +1290,10 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -1279,7 +1301,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -1289,12 +1311,12 @@ "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-5.11.0.tgz", "integrity": "sha1-D9Aj/kbJt7Cb3lwF5rY+eNY/Lg0=", "requires": { - "@firebase/app": "0.1.10", - "@firebase/database": "0.2.1", - "@google-cloud/firestore": "0.13.0", - "@google-cloud/storage": "1.6.0", - "@types/google-cloud__storage": "1.1.7", - "@types/node": "8.10.0", + "@firebase/app": "^0.1.10", + "@firebase/database": "^0.2.0", + "@google-cloud/firestore": "^0.13.0", + "@google-cloud/storage": "^1.6.0", + "@types/google-cloud__storage": "^1.1.7", + "@types/node": "^8.0.53", "faye-websocket": "0.9.3", "jsonwebtoken": "8.1.0", "node-forge": "0.7.1" @@ -1307,17 +1329,12 @@ } } }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" - }, "follow-redirects": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", "requires": { - "debug": "3.1.0" + "debug": "^3.1.0" } }, "for-in": { @@ -1340,9 +1357,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "mime-types": "^2.1.12" } }, "fragment-cache": { @@ -1350,17 +1367,17 @@ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", + "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "fs.realpath": { @@ -1373,10 +1390,10 @@ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "fstream-ignore": { @@ -1384,9 +1401,9 @@ "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" } }, "functional-red-black-tree": { @@ -1399,14 +1416,14 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "gcp-metadata": { @@ -1414,8 +1431,8 @@ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", "integrity": "sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==", "requires": { - "axios": "0.18.0", - "extend": "3.0.1", + "axios": "^0.18.0", + "extend": "^3.0.1", "retry-axios": "0.3.2" } }, @@ -1424,13 +1441,13 @@ "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.9.0.tgz", "integrity": "sha512-+Zrmr0JKO2y/2mg953TW6JLu+NAMHqQsKzqCm7CIT24gMQakolPJCMzDleVpVjXAqB7ZCD276tcUq2ebOfqTug==", "requires": { - "buffer-equal": "1.0.0", - "configstore": "3.1.1", - "google-auto-auth": "0.9.7", - "pumpify": "1.4.0", - "request": "2.85.0", - "stream-events": "1.0.2", - "through2": "2.0.3" + "buffer-equal": "^1.0.0", + "configstore": "^3.0.0", + "google-auto-auth": "^0.9.0", + "pumpify": "^1.3.3", + "request": "^2.81.0", + "stream-events": "^1.0.1", + "through2": "^2.0.0" } }, "get-value": { @@ -1443,7 +1460,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -1451,12 +1468,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-parent": { @@ -1464,8 +1481,8 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -1473,7 +1490,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -1488,13 +1505,13 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "fast-glob": "2.2.0", - "glob": "7.1.2", - "ignore": "3.3.7", - "pify": "3.0.0", - "slash": "1.0.0" + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" } }, "google-auth-library": { @@ -1502,13 +1519,13 @@ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.3.2.tgz", "integrity": "sha512-aRz0om4Bs85uyR2Ousk3Gb8Nffx2Sr2RoKts1smg1MhRwrehE1aD1HC4RmprNt1HVJ88IDnQ8biJQ/aXjiIxlQ==", "requires": { - "axios": "0.18.0", - "gcp-metadata": "0.6.3", - "gtoken": "2.2.0", - "jws": "3.1.4", - "lodash.isstring": "4.0.1", - "lru-cache": "4.1.2", - "retry-axios": "0.3.2" + "axios": "^0.18.0", + "gcp-metadata": "^0.6.2", + "gtoken": "^2.1.1", + "jws": "^3.1.4", + "lodash.isstring": "^4.0.1", + "lru-cache": "^4.1.2", + "retry-axios": "^0.3.2" } }, "google-auto-auth": { @@ -1516,10 +1533,10 @@ "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.7.tgz", "integrity": "sha512-Nro7aIFrL2NP0G7PoGrJqXGMZj8AjdBOcbZXRRm/8T3w08NUHIiNN3dxpuUYzDsZizslH+c8e+7HXL8vh3JXTQ==", "requires": { - "async": "2.6.0", - "gcp-metadata": "0.6.3", - "google-auth-library": "1.3.2", - "request": "2.85.0" + "async": "^2.3.0", + "gcp-metadata": "^0.6.1", + "google-auth-library": "^1.3.1", + "request": "^2.79.0" } }, "google-gax": { @@ -1527,16 +1544,16 @@ "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.15.0.tgz", "integrity": "sha512-a+WBi3oiV3jQ0eLCIM0GAFe8vYQ10yYuXRnjhEEXFKSNd8nW6XSQ7YWqMLIod2Xnyu6JiSSymMBwCr5YSwQyRQ==", "requires": { - "extend": "3.0.1", - "globby": "8.0.1", - "google-auto-auth": "0.9.7", - "google-proto-files": "0.15.1", - "grpc": "1.9.1", - "is-stream-ended": "0.1.3", - "lodash": "4.17.5", - "protobufjs": "6.8.6", - "readable-stream": "2.3.5", - "through2": "2.0.3" + "extend": "^3.0.0", + "globby": "^8.0.0", + "google-auto-auth": "^0.9.0", + "google-proto-files": "^0.15.0", + "grpc": "~1.9.1", + "is-stream-ended": "^0.1.0", + "lodash": "^4.17.2", + "protobufjs": "^6.8.0", + "readable-stream": "^2.2.2", + "through2": "^2.0.3" }, "dependencies": { "grpc": { @@ -1544,10 +1561,10 @@ "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.9.1.tgz", "integrity": "sha512-WNW3MWMuAoo63AwIlzFE3T0KzzvNBSvOkg67Hm8WhvHNkXFBlIk1QyJRE3Ocm0O5eIwS7JU8Ssota53QR1zllg==", "requires": { - "lodash": "4.17.5", - "nan": "2.10.0", - "node-pre-gyp": "0.6.39", - "protobufjs": "5.0.2" + "lodash": "^4.15.0", + "nan": "^2.0.0", + "node-pre-gyp": "^0.6.39", + "protobufjs": "^5.0.0" }, "dependencies": { "abbrev": { @@ -1558,8 +1575,8 @@ "version": "4.11.8", "bundled": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ansi-regex": { @@ -1574,8 +1591,8 @@ "version": "1.1.4", "bundled": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "asn1": { @@ -1607,28 +1624,28 @@ "bundled": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "block-stream": { "version": "0.0.9", "bundled": true, "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "boom": { "version": "2.10.1", "bundled": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "brace-expansion": { "version": "1.1.8", "bundled": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1648,7 +1665,7 @@ "version": "1.0.5", "bundled": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "concat-map": { @@ -1667,14 +1684,14 @@ "version": "2.0.5", "bundled": true, "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "dashdash": { "version": "1.14.1", "bundled": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -1711,7 +1728,7 @@ "bundled": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "extend": { @@ -1730,9 +1747,9 @@ "version": "2.1.4", "bundled": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "fs.realpath": { @@ -1743,40 +1760,40 @@ "version": "1.0.11", "bundled": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "fstream-ignore": { "version": "1.0.5", "bundled": true, "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" } }, "gauge": { "version": "2.7.4", "bundled": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "getpass": { "version": "0.1.7", "bundled": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -1789,12 +1806,12 @@ "version": "7.1.2", "bundled": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "graceful-fs": { @@ -1809,8 +1826,8 @@ "version": "4.2.1", "bundled": true, "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "ajv": "^4.9.1", + "har-schema": "^1.0.5" } }, "has-unicode": { @@ -1821,10 +1838,10 @@ "version": "3.1.3", "bundled": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "hoek": { @@ -1835,17 +1852,17 @@ "version": "1.1.1", "bundled": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "inflight": { "version": "1.0.6", "bundled": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -1860,7 +1877,7 @@ "version": "1.0.0", "bundled": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-typedarray": { @@ -1888,7 +1905,7 @@ "version": "1.0.1", "bundled": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -1923,14 +1940,14 @@ "version": "2.1.17", "bundled": true, "requires": { - "mime-db": "1.30.0" + "mime-db": "~1.30.0" } }, "minimatch": { "version": "3.0.4", "bundled": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -1952,35 +1969,35 @@ "version": "0.6.39", "bundled": true, "requires": { - "detect-libc": "1.0.3", + "detect-libc": "^1.0.2", "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.2", - "rc": "1.2.4", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "2.2.1", - "tar-pack": "3.4.1" + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" } }, "nopt": { "version": "4.0.1", "bundled": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.4" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npmlog": { "version": "4.1.2", "bundled": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -1999,7 +2016,7 @@ "version": "1.4.0", "bundled": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -2014,8 +2031,8 @@ "version": "0.1.4", "bundled": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -2035,10 +2052,10 @@ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", "requires": { - "ascli": "1.0.1", - "bytebuffer": "5.0.1", - "glob": "7.1.2", - "yargs": "3.32.0" + "ascli": "~1", + "bytebuffer": "~5", + "glob": "^7.0.5", + "yargs": "^3.10.0" } }, "punycode": { @@ -2053,10 +2070,10 @@ "version": "1.2.4", "bundled": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -2069,48 +2086,48 @@ "version": "2.3.3", "bundled": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "request": { "version": "2.81.0", "bundled": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" } }, "rimraf": { "version": "2.6.2", "bundled": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -2133,21 +2150,21 @@ "version": "1.0.9", "bundled": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "sshpk": { "version": "1.13.1", "bundled": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { @@ -2160,16 +2177,16 @@ "version": "1.0.2", "bundled": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { "version": "1.0.3", "bundled": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "stringstream": { @@ -2180,7 +2197,7 @@ "version": "3.0.1", "bundled": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -2191,37 +2208,37 @@ "version": "2.2.1", "bundled": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "tar-pack": { "version": "3.4.1", "bundled": true, "requires": { - "debug": "2.6.9", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.3.3", - "rimraf": "2.6.2", - "tar": "2.2.1", - "uid-number": "0.0.6" + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" } }, "tough-cookie": { "version": "2.3.3", "bundled": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tunnel-agent": { "version": "0.6.0", "bundled": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -2245,9 +2262,9 @@ "version": "1.10.0", "bundled": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" }, "dependencies": { "assert-plus": { @@ -2260,7 +2277,7 @@ "version": "1.1.2", "bundled": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { @@ -2279,19 +2296,19 @@ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.10.0", - "long": "4.0.0" + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^3.0.32", + "@types/node": "^8.9.4", + "long": "^4.0.0" }, "dependencies": { "@types/node": { @@ -2308,8 +2325,8 @@ "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.2.tgz", "integrity": "sha512-+EuKr4CLlGsnXx4XIJIVkcKYrsa2xkAmCvxRhX2HsazJzUBAJ35wARGeApHUn4nNfPD03Vl057FskNr20VaCyg==", "requires": { - "node-forge": "0.7.4", - "pify": "3.0.0" + "node-forge": "^0.7.4", + "pify": "^3.0.0" }, "dependencies": { "node-forge": { @@ -2324,9 +2341,9 @@ "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.15.1.tgz", "integrity": "sha512-ebtmWgi/ooR5Nl63qRVZZ6VLM6JOb5zTNxTT/ZAU8yfMOdcauoOZNNMOVg0pCmTjqWXeuuVbgPP0CwO5UHHzBQ==", "requires": { - "globby": "7.1.1", - "power-assert": "1.4.4", - "protobufjs": "6.8.6" + "globby": "^7.1.1", + "power-assert": "^1.4.4", + "protobufjs": "^6.8.0" }, "dependencies": { "globby": { @@ -2334,12 +2351,12 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "glob": "7.1.2", - "ignore": "3.3.7", - "pify": "3.0.0", - "slash": "1.0.0" + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" } }, "long": { @@ -2352,19 +2369,19 @@ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.6.tgz", "integrity": "sha512-eH2OTP9s55vojr3b7NBaF9i4WhWPkv/nq55nznWNp/FomKrLViprUcqnBjHph2tFQ+7KciGPTPsVWGz0SOhL0Q==", "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.10.0", - "long": "4.0.0" + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^3.0.32", + "@types/node": "^8.9.4", + "long": "^4.0.0" }, "dependencies": { "@types/node": { @@ -2386,10 +2403,10 @@ "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.10.0.tgz", "integrity": "sha512-g6Na2dgNusGvSM1ud4hwDaajNP4VSPQhGHnRXzbGNbQJIqGpJhRl7GRgYxTP8rYozqCx2NaT74UL37o8nb0GKA==", "requires": { - "lodash": "4.17.5", - "nan": "2.10.0", - "node-pre-gyp": "0.6.39", - "protobufjs": "5.0.2" + "lodash": "^4.15.0", + "nan": "^2.0.0", + "node-pre-gyp": "^0.6.39", + "protobufjs": "^5.0.0" }, "dependencies": { "abbrev": { @@ -2400,8 +2417,8 @@ "version": "4.11.8", "bundled": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ansi-regex": { @@ -2416,8 +2433,8 @@ "version": "1.1.4", "bundled": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "asn1": { @@ -2449,28 +2466,28 @@ "bundled": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "block-stream": { "version": "0.0.9", "bundled": true, "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "boom": { "version": "2.10.1", "bundled": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "brace-expansion": { "version": "1.1.8", "bundled": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -2490,7 +2507,7 @@ "version": "1.0.5", "bundled": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "concat-map": { @@ -2509,14 +2526,14 @@ "version": "2.0.5", "bundled": true, "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "dashdash": { "version": "1.14.1", "bundled": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2553,7 +2570,7 @@ "bundled": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "extend": { @@ -2572,9 +2589,9 @@ "version": "2.1.4", "bundled": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "fs.realpath": { @@ -2585,40 +2602,40 @@ "version": "1.0.11", "bundled": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "fstream-ignore": { "version": "1.0.5", "bundled": true, "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" } }, "gauge": { "version": "2.7.4", "bundled": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "getpass": { "version": "0.1.7", "bundled": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2631,12 +2648,12 @@ "version": "7.1.2", "bundled": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "graceful-fs": { @@ -2651,8 +2668,8 @@ "version": "4.2.1", "bundled": true, "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "ajv": "^4.9.1", + "har-schema": "^1.0.5" } }, "has-unicode": { @@ -2663,10 +2680,10 @@ "version": "3.1.3", "bundled": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "hoek": { @@ -2677,17 +2694,17 @@ "version": "1.1.1", "bundled": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "inflight": { "version": "1.0.6", "bundled": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -2702,7 +2719,7 @@ "version": "1.0.0", "bundled": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-typedarray": { @@ -2730,7 +2747,7 @@ "version": "1.0.1", "bundled": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -2765,14 +2782,14 @@ "version": "2.1.17", "bundled": true, "requires": { - "mime-db": "1.30.0" + "mime-db": "~1.30.0" } }, "minimatch": { "version": "3.0.4", "bundled": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "mkdirp": { @@ -2796,35 +2813,35 @@ "version": "0.6.39", "bundled": true, "requires": { - "detect-libc": "1.0.3", + "detect-libc": "^1.0.2", "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.2", - "rc": "1.2.4", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "2.2.1", - "tar-pack": "3.4.1" + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" } }, "nopt": { "version": "4.0.1", "bundled": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.4" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npmlog": { "version": "4.1.2", "bundled": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -2843,7 +2860,7 @@ "version": "1.4.0", "bundled": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -2858,8 +2875,8 @@ "version": "0.1.4", "bundled": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -2886,10 +2903,10 @@ "version": "1.2.4", "bundled": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -2902,48 +2919,48 @@ "version": "2.3.3", "bundled": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "request": { "version": "2.81.0", "bundled": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" } }, "rimraf": { "version": "2.6.2", "bundled": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -2966,21 +2983,21 @@ "version": "1.0.9", "bundled": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "sshpk": { "version": "1.13.1", "bundled": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { @@ -2993,16 +3010,16 @@ "version": "1.0.2", "bundled": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { "version": "1.0.3", "bundled": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "stringstream": { @@ -3013,7 +3030,7 @@ "version": "3.0.1", "bundled": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -3024,37 +3041,37 @@ "version": "2.2.1", "bundled": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "tar-pack": { "version": "3.4.1", "bundled": true, "requires": { - "debug": "2.6.9", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.3.3", - "rimraf": "2.6.2", - "tar": "2.2.1", - "uid-number": "0.0.6" + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" } }, "tough-cookie": { "version": "2.3.3", "bundled": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tunnel-agent": { "version": "0.6.0", "bundled": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -3078,9 +3095,9 @@ "version": "1.10.0", "bundled": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" }, "dependencies": { "assert-plus": { @@ -3093,7 +3110,7 @@ "version": "1.1.2", "bundled": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { @@ -3107,11 +3124,11 @@ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.2.0.tgz", "integrity": "sha512-tvQs8B1z5+I1FzMPZnq/OCuxTWFOkvy7cUJcpNdBOK2L7yEtPZTVCPtZU181sSDF+isUPebSqFTNTkIejFASAQ==", "requires": { - "axios": "0.18.0", - "google-p12-pem": "1.0.2", - "jws": "3.1.4", - "mime": "2.2.0", - "pify": "3.0.0" + "axios": "^0.18.0", + "google-p12-pem": "^1.0.0", + "jws": "^3.1.4", + "mime": "^2.2.0", + "pify": "^3.0.0" } }, "har-schema": { @@ -3124,8 +3141,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has-unicode": { @@ -3138,9 +3155,9 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { @@ -3148,8 +3165,8 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { @@ -3157,7 +3174,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3167,7 +3184,7 @@ "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz", "integrity": "sha1-7Mm5l7IYvluzEphii7gHhptz3NE=", "requires": { - "through2": "2.0.3" + "through2": "^2.0.0" } }, "hawk": { @@ -3175,10 +3192,10 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" } }, "hoek": { @@ -3196,9 +3213,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "ignore": { @@ -3221,8 +3238,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3250,7 +3267,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-buffer": { @@ -3263,7 +3280,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -3271,9 +3288,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-extendable": { @@ -3291,7 +3308,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -3299,7 +3316,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -3307,7 +3324,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3315,7 +3332,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3330,7 +3347,7 @@ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "requires": { - "is-number": "4.0.0" + "is-number": "^4.0.0" }, "dependencies": { "is-number": { @@ -3345,7 +3362,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "is-stream-ended": { @@ -3404,7 +3421,7 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -3417,7 +3434,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonify": { @@ -3430,16 +3447,16 @@ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.0.tgz", "integrity": "sha1-xjl80uX9WD1lwAeoPce7eOaYK4M=", "requires": { - "jws": "3.1.4", - "lodash.includes": "4.3.0", - "lodash.isboolean": "3.0.3", - "lodash.isinteger": "4.0.4", - "lodash.isnumber": "3.0.3", - "lodash.isplainobject": "4.0.6", - "lodash.isstring": "4.0.1", - "lodash.once": "4.1.1", - "ms": "2.0.0", - "xtend": "4.0.1" + "jws": "^3.1.4", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.0.0", + "xtend": "^4.0.1" } }, "jsprim": { @@ -3461,7 +3478,7 @@ "base64url": "2.0.0", "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.9", - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "jws": { @@ -3469,9 +3486,9 @@ "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", "requires": { - "base64url": "2.0.0", - "jwa": "1.1.5", - "safe-buffer": "5.1.1" + "base64url": "^2.0.0", + "jwa": "^1.1.4", + "safe-buffer": "^5.0.1" } }, "kind-of": { @@ -3484,7 +3501,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "libxmljs": { @@ -3493,8 +3510,8 @@ "integrity": "sha1-NnPrF8dMuv/e+fM8uD3dgqJQVbc=", "requires": { "bindings": "1.2.1", - "nan": "2.5.1", - "node-pre-gyp": "0.6.39" + "nan": "~2.5.0", + "node-pre-gyp": "~0.6.32" }, "dependencies": { "nan": { @@ -3559,8 +3576,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "make-dir": { @@ -3568,7 +3585,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "map-cache": { @@ -3581,7 +3598,7 @@ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "match-stream": { @@ -3589,8 +3606,8 @@ "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", "integrity": "sha1-mesFAJOzTf+t5CG5rAtBCpz6F88=", "requires": { - "buffers": "0.1.1", - "readable-stream": "1.0.34" + "buffers": "~0.1.1", + "readable-stream": "~1.0.0" }, "dependencies": { "isarray": { @@ -3603,10 +3620,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -3631,19 +3648,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.1", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "mime": { @@ -3661,7 +3678,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "minimatch": { @@ -3669,7 +3686,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -3682,8 +3699,8 @@ "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" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -3691,7 +3708,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -3724,18 +3741,18 @@ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" } }, "natives": { @@ -3753,17 +3770,17 @@ "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz", "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==", "requires": { - "detect-libc": "1.0.3", + "detect-libc": "^1.0.2", "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.2", - "rc": "1.2.6", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "2.2.1", - "tar-pack": "3.4.1" + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" }, "dependencies": { "ajv": { @@ -3771,8 +3788,8 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "assert-plus": { @@ -3790,7 +3807,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "cryptiles": { @@ -3798,7 +3815,7 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "form-data": { @@ -3806,9 +3823,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "har-schema": { @@ -3821,8 +3838,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "ajv": "^4.9.1", + "har-schema": "^1.0.5" } }, "hawk": { @@ -3830,10 +3847,10 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "hoek": { @@ -3846,9 +3863,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "performance-now": { @@ -3866,28 +3883,28 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" } }, "sntp": { @@ -3895,7 +3912,7 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } } } @@ -3910,8 +3927,8 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npmlog": { @@ -3919,10 +3936,10 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -3945,9 +3962,9 @@ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -3955,7 +3972,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { @@ -3963,7 +3980,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-data-descriptor": { @@ -3971,7 +3988,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-descriptor": { @@ -3979,9 +3996,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -3996,7 +4013,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4011,7 +4028,7 @@ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" } }, "object.pick": { @@ -4019,7 +4036,7 @@ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "once": { @@ -4027,7 +4044,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "optjs": { @@ -4045,7 +4062,7 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "lcid": "1.0.0" + "lcid": "^1.0.0" } }, "os-tmpdir": { @@ -4058,8 +4075,8 @@ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "over": { @@ -4087,7 +4104,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "performance-now": { @@ -4110,11 +4127,11 @@ "resolved": "https://registry.npmjs.org/power-assert/-/power-assert-1.4.4.tgz", "integrity": "sha1-kpXqdDcZb1pgH95CDwQmMRhtdRc=", "requires": { - "define-properties": "1.1.2", - "empower": "1.2.3", - "power-assert-formatter": "1.4.1", - "universal-deep-strict-equal": "1.2.2", - "xtend": "4.0.1" + "define-properties": "^1.1.2", + "empower": "^1.2.3", + "power-assert-formatter": "^1.3.1", + "universal-deep-strict-equal": "^1.2.1", + "xtend": "^4.0.0" } }, "power-assert-context-formatter": { @@ -4122,8 +4139,8 @@ "resolved": "https://registry.npmjs.org/power-assert-context-formatter/-/power-assert-context-formatter-1.1.1.tgz", "integrity": "sha1-7bo1LT7YpgMRTWZyZazOYNaJzN8=", "requires": { - "core-js": "2.5.3", - "power-assert-context-traversal": "1.1.1" + "core-js": "^2.0.0", + "power-assert-context-traversal": "^1.1.1" } }, "power-assert-context-reducer-ast": { @@ -4131,11 +4148,11 @@ "resolved": "https://registry.npmjs.org/power-assert-context-reducer-ast/-/power-assert-context-reducer-ast-1.1.2.tgz", "integrity": "sha1-SEqZ4m9Jc/+IMuXFzHVnAuYJQXQ=", "requires": { - "acorn": "4.0.13", - "acorn-es7-plugin": "1.1.7", - "core-js": "2.5.3", - "espurify": "1.7.0", - "estraverse": "4.2.0" + "acorn": "^4.0.0", + "acorn-es7-plugin": "^1.0.12", + "core-js": "^2.0.0", + "espurify": "^1.6.0", + "estraverse": "^4.2.0" } }, "power-assert-context-traversal": { @@ -4143,8 +4160,8 @@ "resolved": "https://registry.npmjs.org/power-assert-context-traversal/-/power-assert-context-traversal-1.1.1.tgz", "integrity": "sha1-iMq8oNE7Y1nwfT0+ivppkmRXftk=", "requires": { - "core-js": "2.5.3", - "estraverse": "4.2.0" + "core-js": "^2.0.0", + "estraverse": "^4.1.0" } }, "power-assert-formatter": { @@ -4152,13 +4169,13 @@ "resolved": "https://registry.npmjs.org/power-assert-formatter/-/power-assert-formatter-1.4.1.tgz", "integrity": "sha1-XcEl7VCj37HdomwZNH879Y7CiEo=", "requires": { - "core-js": "2.5.3", - "power-assert-context-formatter": "1.1.1", - "power-assert-context-reducer-ast": "1.1.2", - "power-assert-renderer-assertion": "1.1.1", - "power-assert-renderer-comparison": "1.1.1", - "power-assert-renderer-diagram": "1.1.2", - "power-assert-renderer-file": "1.1.1" + "core-js": "^2.0.0", + "power-assert-context-formatter": "^1.0.7", + "power-assert-context-reducer-ast": "^1.0.7", + "power-assert-renderer-assertion": "^1.0.7", + "power-assert-renderer-comparison": "^1.0.7", + "power-assert-renderer-diagram": "^1.0.7", + "power-assert-renderer-file": "^1.0.7" } }, "power-assert-renderer-assertion": { @@ -4166,8 +4183,8 @@ "resolved": "https://registry.npmjs.org/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.1.1.tgz", "integrity": "sha1-y/wOd+AIao+Wrz8djme57n4ozpg=", "requires": { - "power-assert-renderer-base": "1.1.1", - "power-assert-util-string-width": "1.1.1" + "power-assert-renderer-base": "^1.1.1", + "power-assert-util-string-width": "^1.1.1" } }, "power-assert-renderer-base": { @@ -4180,11 +4197,11 @@ "resolved": "https://registry.npmjs.org/power-assert-renderer-comparison/-/power-assert-renderer-comparison-1.1.1.tgz", "integrity": "sha1-10Odl9hRVr5OMKAPL7WnJRTOPAg=", "requires": { - "core-js": "2.5.3", - "diff-match-patch": "1.0.0", - "power-assert-renderer-base": "1.1.1", - "stringifier": "1.3.0", - "type-name": "2.0.2" + "core-js": "^2.0.0", + "diff-match-patch": "^1.0.0", + "power-assert-renderer-base": "^1.1.1", + "stringifier": "^1.3.0", + "type-name": "^2.0.1" } }, "power-assert-renderer-diagram": { @@ -4192,10 +4209,10 @@ "resolved": "https://registry.npmjs.org/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.1.2.tgz", "integrity": "sha1-ZV+PcRk1qbbVQbhjJ2VHF8Y3qYY=", "requires": { - "core-js": "2.5.3", - "power-assert-renderer-base": "1.1.1", - "power-assert-util-string-width": "1.1.1", - "stringifier": "1.3.0" + "core-js": "^2.0.0", + "power-assert-renderer-base": "^1.1.1", + "power-assert-util-string-width": "^1.1.1", + "stringifier": "^1.3.0" } }, "power-assert-renderer-file": { @@ -4203,7 +4220,7 @@ "resolved": "https://registry.npmjs.org/power-assert-renderer-file/-/power-assert-renderer-file-1.1.1.tgz", "integrity": "sha1-o34rvReMys0E5427eckv40kzxec=", "requires": { - "power-assert-renderer-base": "1.1.1" + "power-assert-renderer-base": "^1.1.1" } }, "power-assert-util-string-width": { @@ -4211,7 +4228,7 @@ "resolved": "https://registry.npmjs.org/power-assert-util-string-width/-/power-assert-util-string-width-1.1.1.tgz", "integrity": "sha1-vmWet5N/3S5smncmjar2S9W3xZI=", "requires": { - "eastasianwidth": "0.1.1" + "eastasianwidth": "^0.1.1" } }, "process-nextick-args": { @@ -4224,10 +4241,10 @@ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", "requires": { - "ascli": "1.0.1", - "bytebuffer": "5.0.1", - "glob": "7.1.2", - "yargs": "3.32.0" + "ascli": "~1", + "bytebuffer": "~5", + "glob": "^7.0.5", + "yargs": "^3.10.0" } }, "pseudomap": { @@ -4240,10 +4257,10 @@ "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", "integrity": "sha1-1vs79a7Wl+gxFQ6xACwlo/iuExQ=", "requires": { - "over": "0.0.5", - "readable-stream": "1.0.34", - "setimmediate": "1.0.5", - "slice-stream": "1.0.0" + "over": ">= 0.0.5 < 1", + "readable-stream": "~1.0.31", + "setimmediate": ">= 1.0.2 < 2", + "slice-stream": ">= 1.0.0 < 2" }, "dependencies": { "isarray": { @@ -4256,10 +4273,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -4274,8 +4291,8 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "pumpify": { @@ -4283,9 +4300,9 @@ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", "requires": { - "duplexify": "3.5.4", - "inherits": "2.0.3", - "pump": "2.0.1" + "duplexify": "^3.5.3", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, "punycode": { @@ -4303,10 +4320,10 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -4321,13 +4338,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "regex-not": { @@ -4335,8 +4352,8 @@ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "repeat-element": { @@ -4354,28 +4371,28 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" } }, "resolve-url": { @@ -4398,8 +4415,8 @@ "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.1.tgz", "integrity": "sha512-PjAmtWIxjNj4Co/6FRtBl8afRP3CxrrIAnUzb1dzydfROd+6xt7xAebFeskgQgkfFf8NmzrXIoaB3HxmswXyxw==", "requires": { - "request": "2.85.0", - "through2": "2.0.3" + "request": "^2.81.0", + "through2": "^2.0.0" } }, "rimraf": { @@ -4407,7 +4424,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -4420,7 +4437,7 @@ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "semver": { @@ -4438,10 +4455,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -4449,7 +4466,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -4474,7 +4491,7 @@ "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", "integrity": "sha1-WzO9ZvATsaf4ZGCwPUY97DmtPqA=", "requires": { - "readable-stream": "1.0.34" + "readable-stream": "~1.0.31" }, "dependencies": { "isarray": { @@ -4487,10 +4504,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -4510,14 +4527,14 @@ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "debug": { @@ -4533,7 +4550,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -4541,7 +4558,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -4549,7 +4566,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -4557,7 +4574,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4567,7 +4584,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -4575,7 +4592,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4585,9 +4602,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -4602,9 +4619,9 @@ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -4612,7 +4629,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } } } @@ -4622,7 +4639,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" }, "dependencies": { "kind-of": { @@ -4630,7 +4647,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4640,7 +4657,7 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "source-map": { @@ -4653,11 +4670,11 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", "requires": { - "atob": "2.0.3", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.0.0", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-url": { @@ -4670,8 +4687,8 @@ "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-1.0.3.tgz", "integrity": "sha1-0rdajl4Ngk1S/eyLgiWDncLjXfo=", "requires": { - "async": "2.6.0", - "is-stream-ended": "0.1.3" + "async": "^2.4.0", + "is-stream-ended": "^0.1.0" } }, "split-string": { @@ -4679,7 +4696,7 @@ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sshpk": { @@ -4687,14 +4704,14 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" } }, "static-extend": { @@ -4702,8 +4719,8 @@ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -4711,7 +4728,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { @@ -4719,7 +4736,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -4727,7 +4744,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4737,7 +4754,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -4745,7 +4762,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4755,9 +4772,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -4772,7 +4789,7 @@ "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.2.tgz", "integrity": "sha1-q/OfZsCJCk63lbyNXoWbJhW1kLI=", "requires": { - "stubs": "3.0.0" + "stubs": "^3.0.0" } }, "stream-shift": { @@ -4790,9 +4807,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -4800,7 +4817,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "stringifier": { @@ -4808,9 +4825,9 @@ "resolved": "https://registry.npmjs.org/stringifier/-/stringifier-1.3.0.tgz", "integrity": "sha1-3vGDQvaTPbDy2/yaoCF1tEjBeVk=", "requires": { - "core-js": "2.5.3", - "traverse": "0.6.6", - "type-name": "2.0.2" + "core-js": "^2.0.0", + "traverse": "^0.6.6", + "type-name": "^2.0.1" } }, "stringstream": { @@ -4823,16 +4840,15 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "requires": { - "first-chunk-stream": "1.0.0", - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-json-comments": { @@ -4850,9 +4866,9 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "tar-pack": { @@ -4860,14 +4876,14 @@ "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz", "integrity": "sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg==", "requires": { - "debug": "2.6.9", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.3.5", - "rimraf": "2.6.2", - "tar": "2.2.1", - "uid-number": "0.0.6" + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" }, "dependencies": { "debug": { @@ -4885,8 +4901,8 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "requires": { - "readable-stream": "2.3.5", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, "to-object-path": { @@ -4894,7 +4910,7 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -4902,7 +4918,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4912,10 +4928,10 @@ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -4923,8 +4939,8 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "tough-cookie": { @@ -4932,7 +4948,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "traverse": { @@ -4950,7 +4966,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -4970,9 +4986,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", - "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.1.tgz", + "integrity": "sha512-zQIMOmC+372pC/CCVLqnQ0zSBiY7HHodU7mpQdjiZddek4GMj31I3dUJ7gAs9o65X7mnRma6OokOkc6f9jjfBg==", "dev": true }, "uid-number": { @@ -4990,10 +5006,10 @@ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -5001,7 +5017,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -5009,10 +5025,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } @@ -5022,7 +5038,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { - "crypto-random-string": "1.0.0" + "crypto-random-string": "^1.0.0" } }, "universal-deep-strict-equal": { @@ -5030,23 +5046,23 @@ "resolved": "https://registry.npmjs.org/universal-deep-strict-equal/-/universal-deep-strict-equal-1.2.2.tgz", "integrity": "sha1-DaSsL3PP95JMgfpN4BjKViyisKc=", "requires": { - "array-filter": "1.0.0", + "array-filter": "^1.0.0", "indexof": "0.0.1", - "object-keys": "1.0.11" + "object-keys": "^1.0.0" } }, "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -5054,9 +5070,9 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -5081,12 +5097,12 @@ "resolved": "https://registry.npmjs.org/unzip2/-/unzip2-0.2.5.tgz", "integrity": "sha1-TveleaeMFcUfVQ9qBT2xlBSciZI=", "requires": { - "binary": "0.3.0", - "fstream": "0.1.31", - "match-stream": "0.0.2", - "pullstream": "0.4.1", - "readable-stream": "1.0.34", - "setimmediate": "1.0.5" + "binary": "~0.3.0", + "fstream": "~0.1.21", + "match-stream": "~0.0.2", + "pullstream": "~0.4.0", + "readable-stream": "~1.0.0", + "setimmediate": "~1.0.1" }, "dependencies": { "fstream": { @@ -5094,10 +5110,10 @@ "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", "integrity": "sha1-czfwWPu7vvqMn1YaKMqwhJICyYg=", "requires": { - "graceful-fs": "3.0.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" + "graceful-fs": "~3.0.2", + "inherits": "~2.0.0", + "mkdirp": "0.5", + "rimraf": "2" } }, "graceful-fs": { @@ -5105,7 +5121,7 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", "requires": { - "natives": "1.1.2" + "natives": "^1.1.0" } }, "isarray": { @@ -5118,10 +5134,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -5141,7 +5157,7 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" } }, "util-deprecate": { @@ -5159,9 +5175,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "websocket-driver": { @@ -5169,8 +5185,8 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "requires": { - "http-parser-js": "0.4.11", - "websocket-extensions": "0.1.3" + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { @@ -5183,7 +5199,7 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "window-size": { @@ -5196,8 +5212,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, "wrappy": { @@ -5210,9 +5226,9 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "xdg-basedir": { @@ -5240,13 +5256,13 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "requires": { - "camelcase": "2.1.1", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "os-locale": "1.4.0", - "string-width": "1.0.2", - "window-size": "0.1.4", - "y18n": "3.2.1" + "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" } } } diff --git a/package.json b/package.json index cc6a837..4ef07e0 100644 --- a/package.json +++ b/package.json @@ -13,15 +13,15 @@ "@types/csvtojson": "^1.1.5", "@types/fs-extra": "^5.0.1", "@types/lodash": "^4.14.106", - "@types/node": "^9.6.0", - "typescript": "^2.7.2" + "@types/node": "^10.5.7", + "typescript": "^3.0.1" }, "dependencies": { "commander": "^2.15.1", - "csvtojson": "^1.1.9", + "csvtojson": "^2.0.8", "excel-as-json": "^2.0.1", "firebase-admin": "^5.11.0", - "fs-extra": "^5.0.0", + "fs-extra": "^7.0.0", "lodash": "^4.17.5" }, "bin": { From 88a461ed1385075f23f5ab91e832bc8454077d17 Mon Sep 17 00:00:00 2001 From: Jacques Rowe Date: Thu, 9 Aug 2018 12:38:49 +0200 Subject: [PATCH 02/12] Fix Issue#10, exported sub-collections now correctly placed within parent document --- src/exportCollection/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/exportCollection/index.ts b/src/exportCollection/index.ts index 878d85c..d8eca47 100644 --- a/src/exportCollection/index.ts +++ b/src/exportCollection/index.ts @@ -59,10 +59,10 @@ function getCollection(path): Promise { const subCollPaths = await snap.ref.getCollections().then(colls => colls.map(coll => coll.path)); if (subCollPaths.length) { const subCollections = await getCollections(subCollPaths); - _.assign(doc, subCollections); + _.assign(doc[snap.id], subCollections); } } - + _.assign(collection, doc); } }).then(() =>{ From f3db90754452354713617cf6ad179b622457961c Mon Sep 17 00:00:00 2001 From: Jacques Rowe Date: Fri, 10 Aug 2018 22:54:44 +0200 Subject: [PATCH 03/12] Add ability to export collections to XLSX/CSV using SheetJS' xlsx --- package-lock.json | 102 +++++++++++++++++++++++ package.json | 8 +- src/exportCollection/index.ts | 151 +++++++++++++++++++++++++++++++++- src/index.ts | 6 +- 4 files changed, 260 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7266b76..53075bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -319,6 +319,15 @@ "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz", "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s=" }, + "adler-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz", + "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", @@ -677,6 +686,15 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "cfb": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.0.8.tgz", + "integrity": "sha1-d/ITST1pfXVP2cD1UR6rWtctAs8=", + "requires": { + "commander": "^2.14.1", + "printj": "~1.1.2" + } + }, "chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", @@ -784,6 +802,22 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, + "codepage": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz", + "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=", + "requires": { + "commander": "~2.14.1", + "exit-on-epipe": "~1.0.1" + }, + "dependencies": { + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" + } + } + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -873,6 +907,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "requires": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" + } + }, "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", @@ -997,6 +1040,15 @@ "path-type": "^3.0.0" } }, + "dot-object": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-1.7.0.tgz", + "integrity": "sha512-X91KaxzQmhQvfokXCdM8EkJVDHe5HlffhT4eaS6CsLk8Nhs9ChA6KWmrt8kgCz5rmLKzoOEP2tmRK/kBvomFwg==", + "requires": { + "commander": "^2.10.0", + "glob": "^7.1.2" + } + }, "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", @@ -1102,6 +1154,11 @@ "excel": "0.1.7" } }, + "exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -1362,6 +1419,11 @@ "mime-types": "^2.1.12" } }, + "frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==" + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -3736,6 +3798,11 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" }, + "nanoid": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-1.1.1.tgz", + "integrity": "sha512-tIMrzc7X0rCP4WK5+FB5jtZXWWazqQkvA1wxg4ZYo5OWDADR0QPFm+ITN2tv2RWnhXXsryinICcO2qQSG3SGGw==" + }, "nanomatch": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", @@ -4231,6 +4298,11 @@ "eastasianwidth": "^0.1.1" } }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" + }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", @@ -4476,6 +4548,14 @@ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, + "shortid": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.12.tgz", + "integrity": "sha512-sw0knB/ioTu/jVYgJz1IP1b5uhPZtZYwQ9ir/EqXZHI4+Jh8rzzGLM3LKptGHBKoDsgTBDfr4yCRNUX7hEIksQ==", + "requires": { + "nanoid": "^1.0.7" + } + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -4699,6 +4779,14 @@ "extend-shallow": "^3.0.0" } }, + "ssf": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.10.2.tgz", + "integrity": "sha512-rDhAPm9WyIsY8eZEKyE8Qsotb3j/wBdvMWBUsOhJdfhKGLfQidRjiBUV0y/MkyCLiXQ38FG6LWW/VYUtqlIDZQ==", + "requires": { + "frac": "~1.1.2" + } + }, "sshpk": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", @@ -5236,6 +5324,20 @@ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, + "xlsx": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.13.3.tgz", + "integrity": "sha512-Uk9tc66kNJFJ6CycdRgRJDvFct0GrZMLVF/QCOZiLVBOw3ic1Ud2pUHUe039huM/a+uApNtSXlceJtj0KrcDcg==", + "requires": { + "adler-32": "~1.2.0", + "cfb": "~1.0.8", + "codepage": "~1.14.0", + "commander": "~2.15.1", + "crc-32": "~1.2.0", + "exit-on-epipe": "~1.0.1", + "ssf": "~0.10.2" + } + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/package.json b/package.json index 4ef07e0..6e4852c 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "description": "", "main": "index.js", "scripts": { - "build": "tsc && npm link", + "build": "tsc", + "build-link": "tsc && npm link", "migrate": "node dist/index.js" }, "author": "", @@ -19,10 +20,13 @@ "dependencies": { "commander": "^2.15.1", "csvtojson": "^2.0.8", + "dot-object": "^1.7.0", "excel-as-json": "^2.0.1", "firebase-admin": "^5.11.0", "fs-extra": "^7.0.0", - "lodash": "^4.17.5" + "lodash": "^4.17.5", + "shortid": "^2.2.12", + "xlsx": "^0.13.3" }, "bin": { "fire-migrate": "dist/index.js" diff --git a/src/exportCollection/index.ts b/src/exportCollection/index.ts index d8eca47..f1c062c 100644 --- a/src/exportCollection/index.ts +++ b/src/exportCollection/index.ts @@ -1,6 +1,9 @@ import * as admin from 'firebase-admin'; import * as fs from 'fs-extra'; import * as _ from 'lodash'; +import * as XLSX from 'xlsx'; +import * as shortid from 'shortid'; +import * as dot from 'dot-object'; const db = admin.firestore(); let args; @@ -17,11 +20,28 @@ export const execute = async (file: string, collectionPaths: string[], options) // Get selected collections getCollections(collectionPaths) - .then(collections => { - return fs.writeJson(file, collections); + .then(collections => { + + if (file.endsWith('.xlsx')) { + console.log('Writing to Excel:', file); + + const book = json2book(collections); + XLSX.writeFile(book, file); + + } else if (file.endsWith('.csv')) { + console.log('Writing to CSV:', file); + + const book = json2book(collections); + bookWriteCSV(book, file); + + } else { + console.log('Writing to JSON:', file); + + return fs.writeJson(file, collections); + } }) .then(() => { - console.log('JSON file written. Download was a success!'); + console.log('Download was a success!'); }) .catch(err => { console.log('Failure: ', err); @@ -47,6 +67,10 @@ function getCollections(paths): Promise { function getCollection(path): Promise { let collection = {}; + const labelFieldTypes = { + 'geopoint' : admin.firestore.GeoPoint + }; + return db.collection(path).get().then( async snaps => { for (let snap of snaps.docs) { let doc = { [snap.id]: snap.data() }; @@ -54,6 +78,19 @@ function getCollection(path): Promise { // log if requested args.verbose && console.log(snap.ref.path); + // label special field types + const relabelFields = {}; + _.forEach(doc[snap.id], (fieldValue, fieldName) => _.forEach(labelFieldTypes, (fieldType, fieldLabel) => { + if (fieldValue instanceof fieldType) { + relabelFields[fieldName] = fieldLabel; + } + })); + _.forEach(relabelFields, (prefix, oldFieldName) => { + const newFieldName = `${prefix}:${oldFieldName}`; + doc[snap.id][newFieldName] = doc[snap.id][oldFieldName]; + delete(doc[snap.id][oldFieldName]); + }); + // process sub-collections if (args.subcolls) { const subCollPaths = await snap.ref.getCollections().then(colls => colls.map(coll => coll.path)); @@ -63,6 +100,7 @@ function getCollection(path): Promise { } } + // doc to collection _.assign(collection, doc); } }).then(() =>{ @@ -70,4 +108,109 @@ function getCollection(path): Promise { const collPath = `${args.collPrefix}:${collId}`; return ({[collPath]: collection }); }); -} \ No newline at end of file +} + +function bookWriteCSV(book: XLSX.WorkBook, file: string) { + const fileParts = file.split('.'); + const indexSheet = book.Sheets['INDEX']; + const indexJson = XLSX.utils.sheet_to_json(indexSheet); + + // If only one collection, write single file + const single = book.SheetNames.length === 2; + if (single) { + const sheet = book.Sheets[indexJson[0]['Sheet Name']]; + XLSX.writeFile(book, file, { bookType: 'csv' }); + return; + } + // Otherwise write an index file and csv per collection + + // write index file + const filename = [...fileParts]; + filename.splice(-1, 0, 'INDEX'); + XLSX.writeFile(book, filename.join('.'), { bookType: 'csv', sheet: 'INDEX' }); + + // write collection files + indexJson.forEach(index => { + const sheetName = index['Sheet Name']; + const sheet = book.Sheets[sheetName]; + const filename = [...fileParts]; + filename.splice(-1, 0, sheetName ); + XLSX.writeFile(book, filename.join('.'), { bookType: 'csv', sheet: sheetName }); + }); +} + +function json2book(json): XLSX.WorkBook { + let book = XLSX.utils.book_new(); + const collPrefixSliceLength = (args.collPrefix).length + 1; + const collectionIndex = []; + + book.Props = { + ...book.Props, + Title: 'FireStore Export', + Author: 'firestore-migrator', + CreatedDate: new Date() + } + + const addCollection = (coll, path:string) => { + const sheetName = shortid.generate(); + const docs = []; + + // Turn key'd document objects into an array of flat documents objects, each with a document id + _.forEach(coll, (doc, id:string) => { + // process any sub-collections + const subCollFields = Object.keys(doc).filter(key => key.startsWith(args.collPrefix+':')); + subCollFields.forEach(name => { + addCollection(doc[name], [path, id, name.slice(collPrefixSliceLength)].join(args.separator)); + delete(doc[name]); + }); + + // flatten objects + const flatDoc = dot.dot(doc); + + docs.push({ [args.idField]: id, ...flatDoc }); + }); + + // add collection sheet to book + const sheet = XLSX.utils.json_to_sheet(docs); + XLSX.utils.book_append_sheet(book, sheet, sheetName); + + // add an index entry + collectionIndex.push({ + sheetName, + path, + depth: path.split(args.separator).length + }); + + }; + + // process collections + _.forEach(json, (coll, key) => { + addCollection(coll, key.slice(collPrefixSliceLength)); + }); + + // index sheet + const indexSheet = XLSX.utils.aoa_to_sheet([ + ['Sheet Name', 'Path', 'Depth', 'Link'] + ]); + const f1 = 'depth'; + const f2 = 'path'; + collectionIndex.sort((a, b) => { + return a[f1] > b[f1] ? 1 + : a[f1] < b[f1] ? -1 + : a[f2] > b[f2] ? 1 + : a[f2] < b[f2] ? -1 + : 0; + }); + collectionIndex.forEach((coll, index) => { + const n = index + 2; + indexSheet['!ref'] = `A1:D${n}`; + indexSheet[`A${n}`] = { t: 's', v: coll.sheetName }; + indexSheet[`B${n}`] = { t: 's', v: coll.path }; + indexSheet[`C${n}`] = { t: 'n', v: +coll.depth }; + indexSheet[`D${n}`] = { t: 's', v: 'link', l: { Target: `#${coll.sheetName}!A1` }}; + }); + XLSX.utils.book_append_sheet(book, indexSheet, 'INDEX'); + + + return book; +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index cf7dd9e..f2c58ca 100644 --- a/src/index.ts +++ b/src/index.ts @@ -97,9 +97,13 @@ args.command('import') // Export options args.command('export [collections...]') .alias('e') - .description('Export Firestore collection(s) to a JSON file') + .description('Export Firestore collection(s) to a JSON/XLSX/CSV file') .option('-s, --subcolls', 'Include sub-collections.') .option('-p, --coll-prefix [prefix]', 'Collection prefix', 'collection') + .option('') + .option('-x, --separator [@]', 'XLSX sheet/collection name separator', '@' ) + .option('-i, --id-field [id]', 'Field name to use for document IDs', 'id') + .option('') .option('-v, --verbose', 'Output traversed document paths') .action((file, collections, options) => { exportCollection.execute(file, collections, options); From 31bcbd94146197fb3f43761d34fdf396c229a742 Mon Sep 17 00:00:00 2001 From: Jacques Rowe Date: Mon, 13 Aug 2018 01:56:52 +0200 Subject: [PATCH 04/12] New test files --- test-obj-subcoll.json | 57 ---------------------------------- test-obj.json | 22 ------------- test.csv | 3 -- test.json | 21 ------------- test.xlsx | Bin 26753 -> 0 bytes testFiles/test.7aM3oA2Vey.csv | 3 ++ testFiles/test.INDEX.csv | 9 ++++++ testFiles/test.WrZcYDcSEK.csv | 2 ++ testFiles/test.ZAeXu3t9C1.csv | 2 ++ testFiles/test.bqXnVStK7.csv | 4 +++ testFiles/test.iIuPVhg34y.csv | 5 +++ testFiles/test.json | 1 + testFiles/test.pdLpX1tVHd.csv | 2 ++ testFiles/test.tCyFRILto0.csv | 5 +++ testFiles/test.wba2gQC7m-.csv | 2 ++ testFiles/test.xlsx | Bin 0 -> 29738 bytes 16 files changed, 35 insertions(+), 103 deletions(-) delete mode 100644 test-obj-subcoll.json delete mode 100644 test-obj.json delete mode 100644 test.csv delete mode 100644 test.json delete mode 100644 test.xlsx create mode 100644 testFiles/test.7aM3oA2Vey.csv create mode 100644 testFiles/test.INDEX.csv create mode 100644 testFiles/test.WrZcYDcSEK.csv create mode 100644 testFiles/test.ZAeXu3t9C1.csv create mode 100644 testFiles/test.bqXnVStK7.csv create mode 100644 testFiles/test.iIuPVhg34y.csv create mode 100644 testFiles/test.json create mode 100644 testFiles/test.pdLpX1tVHd.csv create mode 100644 testFiles/test.tCyFRILto0.csv create mode 100644 testFiles/test.wba2gQC7m-.csv create mode 100644 testFiles/test.xlsx diff --git a/test-obj-subcoll.json b/test-obj-subcoll.json deleted file mode 100644 index d6523f1..0000000 --- a/test-obj-subcoll.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "11111":{ - "first_name":"Wendy", - "last_name":"Phisher", - "age":22, - "posts":[ - { - "timestamp":"2018-03-30T14:01:03.652Z", - "text":"hello" - }, - { - "timestamp":"2018-03-30T14:01:03.652Z", - "text":"goodbye" - } - ] - }, - "22222":{ - "first_name":"Magen", - "last_name":"Bagelson", - "age":27, - "collection:posts":[ - { - "timestamp":"2018-03-30T14:01:03.652Z", - "text":"hello", - "collection:replies": [ - { - "timestamp": "018-03-30T14:01:03.652Z", - "text": "hi" - } - ] - }, - { - "timestamp":"2018-03-30T14:01:03.652Z", - "text":"goodbye" - } - ], - "collection:friends":[ - { "id": "11111" }, - { "id": "33333" } - ] - }, - "33333":{ - "first_name":"Doug", - "last_name":"Muffty", - "age":55, - "collection:posts":{ - "aaaa":{ - "timestamp":"2018-03-30T14:01:03.652Z", - "text":"hello" - }, - "bbbb":{ - "timestamp":"2018-03-30T14:01:03.652Z", - "text":"goodbye" - } - } - } -} \ No newline at end of file diff --git a/test-obj.json b/test-obj.json deleted file mode 100644 index 3f6b007..0000000 --- a/test-obj.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "11111": { - "first_name": "Wendy", - "last_name": "Phisher", - "age": 22 - }, - "22222": { - "first_name": "Magen", - "last_name": "Bagelson", - "age": 27 - }, - "33333": { - "first_name": "Doug", - "last_name": "Muffty", - "age": 55 - }, - "44444": { - "first_name": "Bob", - "last_name": "Jones", - "age": 31 - } -} \ No newline at end of file diff --git a/test.csv b/test.csv deleted file mode 100644 index dbf9f47..0000000 --- a/test.csv +++ /dev/null @@ -1,3 +0,0 @@ -Name,Price,SKU,Color -Lamp,23.34,2123m12mxi,Blue -Rug,99.98,n232ej23m,Orange \ No newline at end of file diff --git a/test.json b/test.json deleted file mode 100644 index 161464e..0000000 --- a/test.json +++ /dev/null @@ -1,21 +0,0 @@ -[{ - "id": 11111, - "first_name": "Wendy", - "last_name": "Phisher", - "age": 22 - }, { - "id": 22222, - "first_name": "Magen", - "last_name": "Bagelson", - "age": 27 - }, { - "id": 33333, - "first_name": "Doug", - "last_name": "Muffty", - "age": 55 - }, { - "id": 44444, - "first_name": "Bob", - "last_name": "Jones", - "age": 31 - }] \ No newline at end of file diff --git a/test.xlsx b/test.xlsx deleted file mode 100644 index d9e20cd151f2f9a2fdf3cf0f05cc037bc8aea4b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26753 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 AHvj+t diff --git a/testFiles/test.7aM3oA2Vey.csv b/testFiles/test.7aM3oA2Vey.csv new file mode 100644 index 0000000..65c3673 --- /dev/null +++ b/testFiles/test.7aM3oA2Vey.csv @@ -0,0 +1,3 @@ +doc_id,timestamp,text +aaaa,2018-03-30T14:01:03.652Z,hello +bbbb,2018-03-30T14:01:03.652Z,goodbye diff --git a/testFiles/test.INDEX.csv b/testFiles/test.INDEX.csv new file mode 100644 index 0000000..3ddd855 --- /dev/null +++ b/testFiles/test.INDEX.csv @@ -0,0 +1,9 @@ +Sheet Name,Collection,Depth,Documents,Link +bqXnVStK7,test4,1,3,link +WrZcYDcSEK,test5,1,1,link +iIuPVhg34y,test4/22222/friends,3,4,link +tCyFRILto0,test4/22222/posts,3,4,link +7aM3oA2Vey,test4/33333/posts,3,2,link +pdLpX1tVHd,test5/t5d1/subcolHere,3,1,link +ZAeXu3t9C1,test4/22222/posts/1X8WqVY2NTw96Dzsazyi/replies,5,1,link +wba2gQC7m-,test4/22222/posts/ITy7d47LrYE5FDQUwyyv/replies,5,1,link diff --git a/testFiles/test.WrZcYDcSEK.csv b/testFiles/test.WrZcYDcSEK.csv new file mode 100644 index 0000000..a9e341b --- /dev/null +++ b/testFiles/test.WrZcYDcSEK.csv @@ -0,0 +1,2 @@ +doc_id,a.0,a.1,a.2.arr.0,a.2.arr.1.obj.msg,a.2.arr.1.obj.things.0,a.2.num,a.2.obj.str,a.3,ref,b,s,n,o.ts,o.n,o.s2,gp,meNull,ts +t5d1,String 1 in Array,"{""type"":""number"",""data"":12}",nested here,Look down here,"{""type"":""geopoint"",""data"":{""_latitude"":45,""_longitude"":23}}","{""type"":""number"",""data"":13}",123,"{""type"":""geopoint"",""data"":{""_latitude"":14,""_longitude"":15}}","{""type"":""ref"",""data"":""test5/t5d2""}","{""type"":""bool"",""data"":true}",This is a string,"{""type"":""number"",""data"":99.956}","{""type"":""timestamp"",""data"":""2018-08-01T21:59:59.000Z""}","{""type"":""number"",""data"":567}",String in Object,"{""type"":""geopoint"",""data"":{""_latitude"":20,""_longitude"":21}}","{""type"":""null""}","{""type"":""timestamp"",""data"":""2018-08-16T09:12:13.000Z""}" diff --git a/testFiles/test.ZAeXu3t9C1.csv b/testFiles/test.ZAeXu3t9C1.csv new file mode 100644 index 0000000..f5cc2b7 --- /dev/null +++ b/testFiles/test.ZAeXu3t9C1.csv @@ -0,0 +1,2 @@ +doc_id,text,timestamp +qQELC2QgHbD31ohBSo46,hi,018-03-30T14:01:03.652Z diff --git a/testFiles/test.bqXnVStK7.csv b/testFiles/test.bqXnVStK7.csv new file mode 100644 index 0000000..183af3f --- /dev/null +++ b/testFiles/test.bqXnVStK7.csv @@ -0,0 +1,4 @@ +doc_id,posts.0.timestamp,posts.0.text,posts.1.text,posts.1.timestamp,last_name,age,first_name +11111,"{""type"":""timestamp"",""data"":""2018-06-30T22:00:00.000Z""}",hello,goodbye,"{""type"":""timestamp"",""data"":""2018-03-30T12:01:03.000Z""}",Phisher,"{""type"":""number"",""data"":22}",Wendy +22222,,,,,Bagelson,"{""type"":""number"",""data"":27}",Magen +33333,,,,,Muffty,"{""type"":""number"",""data"":55}",Doug diff --git a/testFiles/test.iIuPVhg34y.csv b/testFiles/test.iIuPVhg34y.csv new file mode 100644 index 0000000..e8e753d --- /dev/null +++ b/testFiles/test.iIuPVhg34y.csv @@ -0,0 +1,5 @@ +doc_id,id +46xcZVeiqnQCWgBVZUrJ,33333 +OOpXHouoR4MjyareCxC4,11111 +WvRtxN1cSOnYbHkWi7Pc,11111 +ilf0GLsxKRncW1PjiFjI,33333 diff --git a/testFiles/test.json b/testFiles/test.json new file mode 100644 index 0000000..c490ff3 --- /dev/null +++ b/testFiles/test.json @@ -0,0 +1 @@ +{"collection:test4":{"11111":{"posts":[{"text":"hello","timestamp":"{\"type\":\"timestamp\",\"data\":\"2018-06-30T22:00:00.000Z\"}"},{"timestamp":"{\"type\":\"timestamp\",\"data\":\"2018-03-30T12:01:03.000Z\"}","text":"goodbye"}],"last_name":"Phisher","age":"{\"type\":\"number\",\"data\":22}","first_name":"Wendy"},"22222":{"last_name":"Bagelson","age":"{\"type\":\"number\",\"data\":27}","first_name":"Magen","collection:friends":{"46xcZVeiqnQCWgBVZUrJ":{"id":"33333"},"OOpXHouoR4MjyareCxC4":{"id":"11111"},"WvRtxN1cSOnYbHkWi7Pc":{"id":"11111"},"ilf0GLsxKRncW1PjiFjI":{"id":"33333"}},"collection:posts":{"1X8WqVY2NTw96Dzsazyi":{"text":"hello","timestamp":"2018-03-30T14:01:03.652Z","collection:replies":{"qQELC2QgHbD31ohBSo46":{"timestamp":"018-03-30T14:01:03.652Z","text":"hi"}}},"Acc56NmfZqn4QczPllCE":{"timestamp":"2018-03-30T14:01:03.652Z","text":"goodbye"},"C1buCBxe6MttJnKfKCIm":{"text":"goodbye","timestamp":"2018-03-30T14:01:03.652Z"},"ITy7d47LrYE5FDQUwyyv":{"text":"hello","timestamp":"2018-03-30T14:01:03.652Z","collection:replies":{"GXkDFRSeMIhcEuMZ9GTH":{"timestamp":"018-03-30T14:01:03.652Z","text":"hi"}}}}},"33333":{"last_name":"Muffty","age":"{\"type\":\"number\",\"data\":55}","first_name":"Doug","collection:posts":{"aaaa":{"text":"hello","timestamp":"2018-03-30T14:01:03.652Z"},"bbbb":{"text":"goodbye","timestamp":"2018-03-30T14:01:03.652Z"}}}},"collection:test5":{"t5d1":{"gp":"{\"type\":\"geopoint\",\"data\":{\"_latitude\":20,\"_longitude\":21}}","meNull":"{\"type\":\"null\"}","ts":"{\"type\":\"timestamp\",\"data\":\"2018-08-16T09:12:13.000Z\"}","a":["String 1 in Array","{\"type\":\"number\",\"data\":12}",{"obj":{"str":"123"},"arr":["nested here",{"obj":{"msg":"Look down here","things":["{\"type\":\"geopoint\",\"data\":{\"_latitude\":45,\"_longitude\":23}}"]}}],"num":"{\"type\":\"number\",\"data\":13}"},"{\"type\":\"geopoint\",\"data\":{\"_latitude\":14,\"_longitude\":15}}"],"ref":"{\"type\":\"ref\",\"data\":\"test5/t5d2\"}","b":"{\"type\":\"bool\",\"data\":true}","s":"This is a string","n":"{\"type\":\"number\",\"data\":99.956}","o":{"s2":"String in Object","ts":"{\"type\":\"timestamp\",\"data\":\"2018-08-01T21:59:59.000Z\"}","n":"{\"type\":\"number\",\"data\":567}"},"collection:subcolHere":{"subDoc1":{"gp":"{\"type\":\"geopoint\",\"data\":{\"_latitude\":90,\"_longitude\":180}}"}}}}} diff --git a/testFiles/test.pdLpX1tVHd.csv b/testFiles/test.pdLpX1tVHd.csv new file mode 100644 index 0000000..160d12d --- /dev/null +++ b/testFiles/test.pdLpX1tVHd.csv @@ -0,0 +1,2 @@ +doc_id,gp +subDoc1,"{""type"":""geopoint"",""data"":{""_latitude"":90,""_longitude"":180}}" diff --git a/testFiles/test.tCyFRILto0.csv b/testFiles/test.tCyFRILto0.csv new file mode 100644 index 0000000..81faf00 --- /dev/null +++ b/testFiles/test.tCyFRILto0.csv @@ -0,0 +1,5 @@ +doc_id,timestamp,text +1X8WqVY2NTw96Dzsazyi,2018-03-30T14:01:03.652Z,hello +Acc56NmfZqn4QczPllCE,2018-03-30T14:01:03.652Z,goodbye +C1buCBxe6MttJnKfKCIm,2018-03-30T14:01:03.652Z,goodbye +ITy7d47LrYE5FDQUwyyv,2018-03-30T14:01:03.652Z,hello diff --git a/testFiles/test.wba2gQC7m-.csv b/testFiles/test.wba2gQC7m-.csv new file mode 100644 index 0000000..b9baec2 --- /dev/null +++ b/testFiles/test.wba2gQC7m-.csv @@ -0,0 +1,2 @@ +doc_id,timestamp,text +GXkDFRSeMIhcEuMZ9GTH,018-03-30T14:01:03.652Z,hi diff --git a/testFiles/test.xlsx b/testFiles/test.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bb63fc937110b3260c7cb1bab506ee519bdd999a GIT binary patch literal 29738 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 literal 0 HcmV?d00001 From 35d74d4431427f58d76ad1cb1fbd23cd7cee2cdb Mon Sep 17 00:00:00 2001 From: Jacques Rowe Date: Mon, 13 Aug 2018 01:58:19 +0200 Subject: [PATCH 05/12] Removed deprecated dependencies. --- package-lock.json | 679 ---------------------------------------------- package.json | 2 - 2 files changed, 681 deletions(-) diff --git a/package-lock.json b/package-lock.json index 53075bb..9020a23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -304,11 +304,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.7.tgz", "integrity": "sha512-VkKcfuitP+Nc/TaTFH0B8qNmn+6NbI6crLkQonbedViVz7O2w8QV/GERPlkJ4bg42VGHiEWa31CoTOPs1q6z1w==" }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "acorn": { "version": "4.0.13", "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", @@ -344,20 +339,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "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=", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -505,33 +486,6 @@ "tweetnacl": "^0.14.3" } }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - } - }, - "bindings": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", - "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" - }, - "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=", - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, "boom": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", @@ -601,11 +555,6 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==" }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" - }, "bun": { "version": "0.0.12", "resolved": "https://registry.npmjs.org/bun/-/bun-0.0.12.tgz", @@ -695,21 +644,6 @@ "printj": "~1.1.2" } }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "requires": { - "traverse": ">=0.3.0 <0.4" - }, - "dependencies": { - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" - } - } - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -887,11 +821,6 @@ "xdg-basedir": "^3.0.0" } }, - "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=" - }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -947,16 +876,6 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, - "csvtojson": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/csvtojson/-/csvtojson-2.0.8.tgz", - "integrity": "sha512-DC6YFtsJiA7t/Yz+KjzT6GXuKtU/5gRbbl7HJqvDVVir+dxdw2/1EgwfgJdnsvUT7lOnON5DvGftKuYWX1nMOQ==", - "requires": { - "bluebird": "^3.5.1", - "lodash": "^4.17.3", - "strip-bom": "^2.0.0" - } - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -988,11 +907,6 @@ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, "define-properties": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", @@ -1016,16 +930,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, "diff-match-patch": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.0.tgz", @@ -1135,25 +1039,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" }, - "excel": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/excel/-/excel-0.1.7.tgz", - "integrity": "sha1-AKiOb+1fwG9EpKr2+I9l+FqTwLw=", - "requires": { - "libxmljs": "~0.18.0", - "node-promise": "~0.5.3", - "underscore": "~1.3.3", - "unzip2": "0.2.5" - } - }, - "excel-as-json": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/excel-as-json/-/excel-as-json-2.0.1.tgz", - "integrity": "sha1-ExUFo5x3y7Zoy+j+mZU3WnLcUhg=", - "requires": { - "excel": "0.1.7" - } - }, "exit-on-epipe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", @@ -1447,47 +1332,11 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", - "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" - } - }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, "gcp-metadata": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz", @@ -3207,11 +3056,6 @@ "har-schema": "^2.0.0" } }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -3309,11 +3153,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", @@ -3437,11 +3276,6 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -3478,14 +3312,6 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, - "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=", - "requires": { - "jsonify": "~0.0.0" - } - }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -3499,11 +3325,6 @@ "graceful-fs": "^4.1.6" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, "jsonwebtoken": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.0.tgz", @@ -3566,23 +3387,6 @@ "invert-kv": "^1.0.0" } }, - "libxmljs": { - "version": "0.18.7", - "resolved": "https://registry.npmjs.org/libxmljs/-/libxmljs-0.18.7.tgz", - "integrity": "sha1-NnPrF8dMuv/e+fM8uD3dgqJQVbc=", - "requires": { - "bindings": "1.2.1", - "nan": "~2.5.0", - "node-pre-gyp": "~0.6.32" - }, - "dependencies": { - "nan": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.5.1.tgz", - "integrity": "sha1-1bAWkSUzJql6K77p5hxV2NYDUeI=" - } - } - }, "lodash": { "version": "4.17.5", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", @@ -3663,38 +3467,6 @@ "object-visit": "^1.0.0" } }, - "match-stream": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", - "integrity": "sha1-mesFAJOzTf+t5CG5rAtBCpz6F88=", - "requires": { - "buffers": "~0.1.1", - "readable-stream": "~1.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, "merge2": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz", @@ -3751,11 +3523,6 @@ "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=" - }, "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", @@ -3775,14 +3542,6 @@ } } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, "modelo": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/modelo/-/modelo-4.2.3.tgz", @@ -3822,193 +3581,11 @@ "to-regex": "^3.0.1" } }, - "natives": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.2.tgz", - "integrity": "sha512-5bRASydE1gu6zPOenLN043++J8xj1Ob7ArkfdYO3JN4DF5rDmG7bMoiybkTyD+GnXQEMixVeDHMzuqm6kpBmiA==" - }, "node-forge": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=" }, - "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==", - "requires": { - "detect-libc": "^1.0.2", - "hawk": "3.1.3", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "request": "2.81.0", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^2.2.1", - "tar-pack": "^3.4.0" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "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=" - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.x.x" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.x.x" - } - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "requires": { - "hoek": "2.x.x" - } - } - } - }, - "node-promise": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/node-promise/-/node-promise-0.5.12.tgz", - "integrity": "sha1-sKz5vCIpp2QHwHe5JlkvmbO04fE=" - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -4019,11 +3596,6 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -4119,11 +3691,6 @@ "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, "os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", @@ -4132,25 +3699,6 @@ "lcid": "^1.0.0" } }, - "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=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "over": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz", - "integrity": "sha1-8phS5w/X4l82DgE6jsRMgq7bVwg=" - }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -4324,40 +3872,6 @@ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, - "pullstream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", - "integrity": "sha1-1vs79a7Wl+gxFQ6xACwlo/iuExQ=", - "requires": { - "over": ">= 0.0.5 < 1", - "readable-stream": "~1.0.31", - "setimmediate": ">= 1.0.2 < 2", - "slice-stream": ">= 1.0.0 < 2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, "pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", @@ -4387,24 +3901,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, - "rc": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", - "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", - "requires": { - "deep-extend": "~0.4.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, "readable-stream": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", @@ -4491,14 +3987,6 @@ "through2": "^2.0.0" } }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "^7.0.5" - } - }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -4512,16 +4000,6 @@ "ret": "~0.1.10" } }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", @@ -4543,11 +4021,6 @@ } } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, "shortid": { "version": "2.2.12", "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.12.tgz", @@ -4566,37 +4039,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, - "slice-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", - "integrity": "sha1-WzO9ZvATsaf4ZGCwPUY97DmtPqA=", - "requires": { - "readable-stream": "~1.0.31" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, "snakeize": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", @@ -4931,59 +4373,11 @@ "ansi-regex": "^2.0.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "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=" - }, "stubs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "tar-pack": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz", - "integrity": "sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg==", - "requires": { - "debug": "^2.2.0", - "fstream": "^1.0.10", - "fstream-ignore": "^1.0.5", - "once": "^1.3.3", - "readable-stream": "^2.1.4", - "rimraf": "^2.5.1", - "tar": "^2.2.1", - "uid-number": "^0.0.6" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } - } - }, "through2": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", @@ -5079,16 +4473,6 @@ "integrity": "sha512-zQIMOmC+372pC/CCVLqnQ0zSBiY7HHodU7mpQdjiZddek4GMj31I3dUJ7gAs9o65X7mnRma6OokOkc6f9jjfBg==", "dev": true }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" - }, - "underscore": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.3.3.tgz", - "integrity": "sha1-R6xTaD2vgyv6lS4XdEF9pHgXrkI=" - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -5180,61 +4564,6 @@ } } }, - "unzip2": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/unzip2/-/unzip2-0.2.5.tgz", - "integrity": "sha1-TveleaeMFcUfVQ9qBT2xlBSciZI=", - "requires": { - "binary": "~0.3.0", - "fstream": "~0.1.21", - "match-stream": "~0.0.2", - "pullstream": "~0.4.0", - "readable-stream": "~1.0.0", - "setimmediate": "~1.0.1" - }, - "dependencies": { - "fstream": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", - "integrity": "sha1-czfwWPu7vvqMn1YaKMqwhJICyYg=", - "requires": { - "graceful-fs": "~3.0.2", - "inherits": "~2.0.0", - "mkdirp": "0.5", - "rimraf": "2" - } - }, - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "requires": { - "natives": "^1.1.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -5282,14 +4611,6 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" }, - "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==", - "requires": { - "string-width": "^1.0.2" - } - }, "window-size": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", diff --git a/package.json b/package.json index 6e4852c..bc8ca0f 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,7 @@ }, "dependencies": { "commander": "^2.15.1", - "csvtojson": "^2.0.8", "dot-object": "^1.7.0", - "excel-as-json": "^2.0.1", "firebase-admin": "^5.11.0", "fs-extra": "^7.0.0", "lodash": "^4.17.5", From ef30fa077947c6e5e9ff5e5246d92821667a7e4b Mon Sep 17 00:00:00 2001 From: Jacques Rowe Date: Mon, 13 Aug 2018 02:04:07 +0200 Subject: [PATCH 06/12] Moved to SheetJS. Allow import/export of CSV, XLSX & JSON. --- src/exportCollection/index.ts | 109 +++++++------- src/importCollection/index.ts | 276 +++++++++++++++++++++++++++++----- src/index.ts | 26 ++-- src/shared.ts | 245 ++++++++++++++++++++++++++++++ 4 files changed, 545 insertions(+), 111 deletions(-) create mode 100644 src/shared.ts diff --git a/src/exportCollection/index.ts b/src/exportCollection/index.ts index f1c062c..b080b7e 100644 --- a/src/exportCollection/index.ts +++ b/src/exportCollection/index.ts @@ -5,6 +5,8 @@ import * as XLSX from 'xlsx'; import * as shortid from 'shortid'; import * as dot from 'dot-object'; +import { sortByKeysFn, decodeDoc } from '../shared'; + const db = admin.firestore(); let args; @@ -14,11 +16,11 @@ export const execute = async (file: string, collectionPaths: string[], options) // If no collection arguments, select all root collections if (collectionPaths.length === 0) { - console.log('Fetching root collections...'); + console.log('Selecting root collections...'); collectionPaths = await db.getCollections().then(colls => colls.map(coll => coll.path)); } - - // Get selected collections + + console.log('Getting selected collections...'); getCollections(collectionPaths) .then(collections => { @@ -53,61 +55,61 @@ function getCollections(paths): Promise { return new Promise(async (resolve, reject) =>{ let collections = {}; - // A heavily nested sub-collection-tree will cause a parallel promise explosion, - // so we rather request them sequentially. Might be worth allowing parallel - // recursion upon user request, for smaller trees and faster execution. - for (const path of paths) { - const collection = await getCollection(path); - _.assign(collections, collection); - } + try { + // A heavily nested sub-collection-tree will cause a parallel promise explosion, + // so we rather request them sequentially. Might be worth allowing parallel + // recursion upon user request, for smaller trees and faster execution. + for (const path of paths) { + const collection = await getCollection(path); + _.assign(collections, collection); + } - resolve(collections); + resolve(collections); + } catch (err) { + reject(err); + } }); } function getCollection(path): Promise { let collection = {}; - const labelFieldTypes = { - 'geopoint' : admin.firestore.GeoPoint - }; return db.collection(path).get().then( async snaps => { - for (let snap of snaps.docs) { - let doc = { [snap.id]: snap.data() }; + // try { - // log if requested - args.verbose && console.log(snap.ref.path); + if (snaps.size === 0) { + throw `No ducuments in collection: ${path}`; + }; - // label special field types - const relabelFields = {}; - _.forEach(doc[snap.id], (fieldValue, fieldName) => _.forEach(labelFieldTypes, (fieldType, fieldLabel) => { - if (fieldValue instanceof fieldType) { - relabelFields[fieldName] = fieldLabel; - } - })); - _.forEach(relabelFields, (prefix, oldFieldName) => { - const newFieldName = `${prefix}:${oldFieldName}`; - doc[snap.id][newFieldName] = doc[snap.id][oldFieldName]; - delete(doc[snap.id][oldFieldName]); - }); + for (let snap of snaps.docs) { + let doc = { [snap.id]: snap.data() }; + + // log if requested + args.verbose && console.log(snap.ref.path); - // process sub-collections - if (args.subcolls) { - const subCollPaths = await snap.ref.getCollections().then(colls => colls.map(coll => coll.path)); - if (subCollPaths.length) { - const subCollections = await getCollections(subCollPaths); - _.assign(doc[snap.id], subCollections); + // Decode Doc + decodeDoc(doc[snap.id]); + + // process sub-collections + if (args.subcolls) { + const subCollPaths = await snap.ref.getCollections().then(colls => colls.map(coll => coll.path)); + if (subCollPaths.length) { + const subCollections = await getCollections(subCollPaths); + _.assign(doc[snap.id], subCollections); + } } + + // doc to collection + _.assign(collection, doc); } - - // doc to collection - _.assign(collection, doc); - } + // } catch (error) { + // console.log(error); + // } }).then(() =>{ const collId = path.split('/').pop(); const collPath = `${args.collPrefix}:${collId}`; return ({[collPath]: collection }); - }); + }); } function bookWriteCSV(book: XLSX.WorkBook, file: string) { @@ -160,7 +162,7 @@ function json2book(json): XLSX.WorkBook { // process any sub-collections const subCollFields = Object.keys(doc).filter(key => key.startsWith(args.collPrefix+':')); subCollFields.forEach(name => { - addCollection(doc[name], [path, id, name.slice(collPrefixSliceLength)].join(args.separator)); + addCollection(doc[name], [path, id, name.slice(collPrefixSliceLength)].join('/')); delete(doc[name]); }); @@ -178,7 +180,8 @@ function json2book(json): XLSX.WorkBook { collectionIndex.push({ sheetName, path, - depth: path.split(args.separator).length + depth: path.split('/').length, + count: docs.length }); }; @@ -190,27 +193,21 @@ function json2book(json): XLSX.WorkBook { // index sheet const indexSheet = XLSX.utils.aoa_to_sheet([ - ['Sheet Name', 'Path', 'Depth', 'Link'] + ['Sheet Name', 'Collection', 'Depth', 'Documents', 'Link'] ]); - const f1 = 'depth'; - const f2 = 'path'; - collectionIndex.sort((a, b) => { - return a[f1] > b[f1] ? 1 - : a[f1] < b[f1] ? -1 - : a[f2] > b[f2] ? 1 - : a[f2] < b[f2] ? -1 - : 0; - }); + collectionIndex.sort(sortByKeysFn(['depth', 'path'])); collectionIndex.forEach((coll, index) => { const n = index + 2; - indexSheet['!ref'] = `A1:D${n}`; + indexSheet['!ref'] = `A1:E${n}`; indexSheet[`A${n}`] = { t: 's', v: coll.sheetName }; indexSheet[`B${n}`] = { t: 's', v: coll.path }; indexSheet[`C${n}`] = { t: 'n', v: +coll.depth }; - indexSheet[`D${n}`] = { t: 's', v: 'link', l: { Target: `#${coll.sheetName}!A1` }}; + indexSheet[`D${n}`] = { t: 'n', v: +coll.count }; + indexSheet[`E${n}`] = { t: 's', v: 'link', l: { Target: `#${coll.sheetName}!A1` }}; }); XLSX.utils.book_append_sheet(book, indexSheet, 'INDEX'); return book; -} \ No newline at end of file +} + diff --git a/src/importCollection/index.ts b/src/importCollection/index.ts index ef3fba9..d8e1e81 100644 --- a/src/importCollection/index.ts +++ b/src/importCollection/index.ts @@ -1,8 +1,10 @@ import * as admin from 'firebase-admin'; import * as fs from 'fs-extra'; import * as _ from 'lodash'; -import * as csv from 'csvtojson'; -import { processFile as processXlsx } from 'excel-as-json'; +import * as XLSX from 'xlsx'; +import * as dot from 'dot-object'; + +import { encodeDoc, cleanCollectionPath, isCollectionPath, isDocumentPath } from '../shared'; const db = admin.firestore(); @@ -12,30 +14,42 @@ let totalSetCount = 0; let args; -export const execute = async (file, collection, options) => { +export const execute = async (file: string, collections: string[], options) => { args = options; if( args.dryRun ) args.verbose = true; - try { + + if( collections.length === 0 ) { + // root if no paths + collections = ['/']; + } else { + // clean all collection paths + collections.map(cleanCollectionPath); + // root overrides all other selections + if (collections.includes('/')) { + collections = ['/']; + } + } - let data; + let data = {}; if (file.endsWith(".json")) { - data = await fs.readJSON(file); + // data[collection] = await fs.readJSON(file); + data = await readJSON(file, collections); } - else if (file.endsWith(".csv")) { - data = await readCSV(file); + else if (file.endsWith('.xlsx')) { + data = await readXLSXBook(file, collections); } - else if (file.endsWith(".xlsx")) { - data = await readXLSX(file); + else if (file.endsWith(".csv")) { + data = await readCSV(file, collections); } else { throw "Unknown file extension. Supports .json, .csv or .xlsx!"; } - - await writeCollection(data, collection); + + await writeCollections(data); // Final Batch commit and completion message. await batchCommit(false); @@ -46,12 +60,142 @@ export const execute = async (file, collection, options) => { console.log(`Total documents: ${totalSetCount}`); } catch (error) { - console.log("Import failed!", error); + console.log("Import failed: ", error); } } +function dataFromJSON(json) { + _.forEach(json, row => { + dot.object(row); + // encodeDoc(row); + }); + return json; +} + +function dataFromSheet(sheet) { + const json = XLSX.utils.sheet_to_json(sheet); + return dataFromJSON(json); +} + +function JSONfromCSV(file:string) { + const book = XLSX.readFile(file); + const sheet = book.Sheets['Sheet1']; + return XLSX.utils.sheet_to_json(sheet); +} + +function datafromCSV(file:string) { + const json = JSONfromCSV(file); + return dataFromJSON(json); +} + +function readJSON(path: string, collections: string[]): Promise { + return new Promise(async (resolve, reject) => { + const json = await fs.readJSON(path); + const data = {}; + + // Selected Collections and Subcols; + if (collections[0] !== '/') { + collections.forEach(collection => { + if (isDocumentPath(collection)) { + reject(`Invalid collection path for single collection: ${collection}`); + return; + }; + + const labelledPath = collection.split('/').map((segment, index) => { + return (index % 2 === 0) ? args.collPrefix + ':' + segment : segment; + }).join('.'); + + const coll = dot.pick(labelledPath, json); + if (!coll) { + reject(`Invalid collection path for single collection: ${collection}`); + return; + } + + data[collection] = coll; + }); + resolve(data); + return; + } + + // All Collections from JSON file + if (collections[0] === '/') { + _.forEach(json, (coll, key: string) => { + const path = key.substr(args.collPrefix.length + 1); + data[path] = coll; + }); + resolve(data); + return; + } + + // Import options exhausted + reject(`Invalid collections`); + }); +} + +function readXLSXBook(path, collections: string[]): Promise { + + return new Promise((resolve, reject) => { + const book = XLSX.readFile(path); + const sheetCount = book.SheetNames.length; + const indexSheet = book.Sheets['INDEX']; + let data = {}; + + // Single Sheet as Collection from Non-Indexed Workbook + if (!indexSheet) { + const collection = collections[0]; + if(isDocumentPath(collection)) { + reject(`Invalid collection path for single collection: ${collection}`); + return; + } + const sheetName = book.SheetNames[+args.sheet - 1]; + const sheet = book.Sheets[sheetName]; + data[collection] = dataFromSheet(sheet); + resolve(data); + return; + } + + const index = XLSX.utils.sheet_to_json(indexSheet); + + // Selected Collections and Sub Colls from Indexed Workbook + if (collections[0] !== '/') { + collections.forEach(collection => { + const colls = index.filter(coll => (coll['Collection'] + '/').startsWith(collection + '/')); + if (colls.length) { + colls.forEach(coll => { + const colPath = coll['Collection']; + const sheetName = coll['Sheet Name']; + const sheet = book.Sheets[sheetName]; + data[colPath] = dataFromSheet(sheet); + }); + } else { + reject(`INDEX contains no paths matching: ${collection}`); + return; + } + }); + resolve(data); + return; + } + + // All Collections from Indexed Workbook + if (collections[0] === '/') { + const collection = collections[0]; + _.forEach(index, coll => { + const sheetName = coll['Sheet Name']; + const path = cleanCollectionPath([collection, coll['Collection']]); + const sheet = book.Sheets[sheetName]; + data[path] = dataFromSheet(sheet); + }); + resolve(data); + return; + } + + // Import options exhausted + reject(`Invalid collections`); + }); +} + async function batchSet(ref: FirebaseFirestore.DocumentReference, item, options) { // Log if requested args.verbose && console.log(ref.path); @@ -85,6 +229,16 @@ async function batchCommit(recycle:boolean = true) { } } +function writeCollections(data): Promise { + const promises = []; + _.forEach(data, (docs, coll) => { + promises.push( + writeCollection(docs, coll) + ); + }); + return Promise.all(promises); +} + function writeCollection(data:JSON, path: string): Promise { return new Promise(async (resolve, reject) => { const colRef = db.collection(path); @@ -92,7 +246,15 @@ function writeCollection(data:JSON, path: string): Promise { for ( let [id, item] of Object.entries(data)) { // doc-id preference: object key, invoked --id option, auto-id - id = (mode === 'object') ? id : (args.id && _.hasIn(item, args.id)) ? item[args.id].toString() : colRef.doc().id; + // id = (mode === 'object') ? id: (args.id && _.hasIn(item, args.id)) ? item[args.id].toString() : colRef.doc().id; + if (_.hasIn(item, args.id)) { + id = item[args.id].toString(); + delete(item[args.id]); + } + if (!id || (id.toLowerCase() === args.autoId.toLowerCase())) { + id = colRef.doc().id; + } + // Look for and process sub-collections const subColKeys = Object.keys(item).filter(k => k.startsWith(args.collPrefix+':')); @@ -102,6 +264,9 @@ function writeCollection(data:JSON, path: string): Promise { delete item[key]; } + // Encode item to Firestore + encodeDoc(item); + // set document data into path/id const docRef = colRef.doc(id); await batchSet(docRef, item, { merge: !!(args.merge) }); @@ -112,36 +277,69 @@ function writeCollection(data:JSON, path: string): Promise { }); } -function readCSV(path): Promise { + +function readCSV(file: string, collections: string[]): Promise { return new Promise((resolve, reject) => { let lineCount = 0; + let data = {}; + + // Single Mode CSV, single collection + if (!file.endsWith('INDEX.csv')) { + if (collections.length > 1) { + reject('Multiple collection import from CSV requires an *.INDEX.csv file.'); + return; + } + const collection = collections[0]; + if (collection === '/') { + reject('You have to specify an import collection for single mode CSV import.'); + return; + } + data[collection] = datafromCSV(file); + resolve(data); + return; + } - csv() - .fromFile(path) - .on("json", data => { - // fired on every row read - lineCount++; - }) - .on("end_parsed", data => { - console.info(`CSV read complete. ${lineCount} rows parsed.`); - resolve(data); - }) - .on("error", err => reject(err)); - }); -} + const index = JSONfromCSV(file); -function readXLSX(path): Promise { - return new Promise((resolve, reject) => { - const options = { - sheet: args.sheet, - isColOriented: args.colOriented ? true : false, - omitEmtpyFields: args.omitEmptyFields ? true : false + // Indexed Mode CSV, selected collections and sub-cols + if (collections[0] !== '/') { + collections.forEach(collection => { + const colls = index.filter(coll => (coll['Collection'] + '/').startsWith(collection + '/')); + if (colls.length) { + colls.forEach(coll => { + const colPath = coll['Collection']; + const sheetName = coll['Sheet Name']; + const fileParts = file.split('.'); + fileParts.splice(-2,1,sheetName); + const fileName = fileParts.join('.'); + data[colPath] = datafromCSV(fileName); + }); + } else { + reject(`INDEX contains no paths matching: ${collection}`); + return; + } + }); + resolve(data); + return; } - console.log('Reading XLSX with options', options); - processXlsx(path, null, options, (err,data) => { - if (err) reject(err); - console.info('XLSX read complete.'); + + // Indexed Mode CSV, all collections + if (collections[0] === '/') { + const collection = collections[0]; + _.forEach(index, coll => { + const colPath = coll['Collection']; + const sheetName = coll['Sheet Name']; + const fileParts = file.split('.'); + fileParts.splice(-2,1,sheetName); + const fileName = fileParts.join('.'); + data[colPath] = datafromCSV(fileName); + }); resolve(data); - }) + return; + } + + // Import options exhausted + reject(`Invalid collections or CSV`); + }); } diff --git a/src/index.ts b/src/index.ts index f2c58ca..5789076 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,8 @@ #!/usr/bin/env node import * as admin from 'firebase-admin'; -import * as fs from 'fs-extra'; import * as args from 'commander'; -import * as csv from 'csvtojson'; import * as _ from 'lodash'; -import { processFile as processXlsx } from 'excel-as-json'; // Firebase App Initialization var serviceAccount = require("../credentials.json"); @@ -75,20 +72,17 @@ args.version('0.1.0') args.command('import') .alias('i') .description(importDescription) - .arguments(' ') - .option('-i, --id [field]', 'Field to use for document ID') - .option('-m, --merge', 'Merge Firestore documents. Default is replace.') + .arguments(' [collections...]') + .option('-i, --id [field]', 'Field to use for Document IDs', 'doc_id') + .option('-a, --auto-id [str]', 'Document ID token specifying auto generated Document ID', 'Auto-ID') + .option('-m, --merge', 'Merge Firestore documents. Default is Replace.') .option('-k, --chunk [size]', 'Split upload into batches. Max 500 by Firestore constraints.', parseChunk, 500 ) .option('-p, --coll-prefix [prefix]', '(Sub-)Collection prefix', 'collection') .option('') - .option('-c, --col-oriented', 'XLSX column orientation. Default is row orientation') - .option('-o, --omit-empty-fields', 'XLSX omit empty fields') - .option('-s, --sheet [#]', 'XLSX Sheet # to import', '1') - .option('') .option('-d, --dry-run', 'Perform a dry run, without committing data. Implies --verbose.') .option('-v, --verbose', 'Output document insert paths') - .action((file, collection, options) => { - importCollection.execute(file, collection, options); + .action((file, collections, options) => { + importCollection.execute(file, collections, options); }).on('--help', () => { console.log(importHelp); }); @@ -98,11 +92,11 @@ args.command('import') args.command('export [collections...]') .alias('e') .description('Export Firestore collection(s) to a JSON/XLSX/CSV file') - .option('-s, --subcolls', 'Include sub-collections.') + .option('-n, --no-subcolls', 'Do not export sub-collections.') .option('-p, --coll-prefix [prefix]', 'Collection prefix', 'collection') - .option('') - .option('-x, --separator [@]', 'XLSX sheet/collection name separator', '@' ) - .option('-i, --id-field [id]', 'Field name to use for document IDs', 'id') + .option('-i, --id-field [id]', 'Field name to use for document IDs', 'doc_id') + // .option('') + // .option('-x, --separator [/]', 'Collection/Document path separator', '/' ) .option('') .option('-v, --verbose', 'Output traversed document paths') .action((file, collections, options) => { diff --git a/src/shared.ts b/src/shared.ts new file mode 100644 index 0000000..257c696 --- /dev/null +++ b/src/shared.ts @@ -0,0 +1,245 @@ +import * as admin from 'firebase-admin'; +import * as _ from 'lodash'; +import { DocumentReference } from '@google-cloud/firestore'; +import { isNull } from 'util'; + +const db = admin.firestore(); + + + +const toType = function(obj) { + return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase(); +} + +const arrayOrObject = function(test) { + return ((test instanceof Array) || (toType(test) === 'object')); +} + + + +export const cleanCollectionPath = (path:string | string[]): string => { + if (typeof path === 'string') { + const p = ('/' + path + '/').replace(/\/{2,}/,'/').split('/').filter(v=>!!v).join('/'); + return p || '/'; + } else { + return cleanCollectionPath(path.join('/')); + } +} + +export const isCollectionPath = (path: string | string[]): boolean => { + const sections = cleanCollectionPath(path).split('/').length; + return sections % 2 === 1; +} + +export const isDocumentPath = (path: string | string[]): boolean => { + const sections = cleanCollectionPath(path).split('/').length; + return sections % 2 === 0; +} + + +// Field Handlers, en/decoders, etc + +class FieldHandler { + + constructor(protected prefix: string = 'prefix') {} + + + public isDecodeType = (key: string, val, doc): boolean => { + return false; + }; + protected decodeFn = (key: string, val, doc) => { + return val; + }; + public decode = (key: string, val, doc) => { + return JSON.stringify({ type: this.prefix, data: this.decodeFn(key, val, doc) }); + }; + + + public isEncodeType = (key: string, val, doc): boolean => { + if (typeof val !== 'string') return false; + return val.startsWith(`{"type":"${this.prefix}"`); + }; + protected encodeFn = (key: string, val, doc) => { + const {type, data} = val; + return data; + + }; + public encode = (key: string, val, doc) => { + return this.encodeFn(key, JSON.parse(val), doc); + } +} + +class GeoPointFH extends FieldHandler { + isDecodeType = (key: string, val, doc) => { + return (val instanceof admin.firestore.GeoPoint); + }; + encodeFn = (key: string, val, doc) => { + const {data} = val; + return new admin.firestore.GeoPoint(data._latitude, data._longitude); + } +} + +class BooleanFH extends FieldHandler { + isDecodeType = (key, val, doc) => { + return (typeof val === 'boolean'); + }; + encodeFn = (key: string, val, doc) => { + const {data} = val; + return data; + }; +} + +class TimeStampFH extends FieldHandler { + isDecodeType = (key, val, doc) => { + return (val instanceof Date); + }; + encodeFn = (key: string, val, doc) => { + const {data} = val; + return new Date(data); + }; +} + +class NumberFH extends FieldHandler { + isDecodeType = (key, val, doc) => { + return (typeof val === 'number'); + }; +} + +class ReferenceFH extends FieldHandler { + isDecodeType = (key: string, val, doc) => { + return (val instanceof admin.firestore.DocumentReference); + }; + decodeFn = (key: string, val:DocumentReference, doc) => { + return val.path; + }; + encodeFn = (key: string, val, doc) => { + const {data} = val; + return db.doc(data); + } +} + +class NullFH extends FieldHandler { + isDecodeType = (key: string, val, doc) => { + return isNull(val); + }; + decode = (key: string, val, doc) => { + return JSON.stringify({ type: this.prefix }); + }; + encode = (key: string, val, doc) => { + return null; + } +} + + +class ArrayOrObjectFH extends FieldHandler { + isDecodeType = (key: string, val, doc) => { + return arrayOrObject(val); + }; + decode = (key: string, val, doc) => { + decodeDoc(val); + return val; + }; + isEncodeType = (key: string, val, doc): boolean => { + return arrayOrObject(val); + }; + encode = (key: string, val, doc) => { + encodeDoc(val); + return val; + }; +} + +class TestFH extends FieldHandler { + isDecodeType = (key, val, doc) => { + if (['_a'].includes(key)) { + // if (1) { + console.log(`Test isDecode on ${key} = ${toType(val)}`); + console.log('typeof', typeof val); + console.log('instanceof', val instanceof Object); + console.log('isNull', isNull(val)); + console.log('val', val); + } + return false; + }; + isEncodeType = (key, val, doc) => { + if (key==='o') { + console.log(`Test isEncode on ${key} = ${toType(val)}`); + console.log('typeof', typeof val); + console.log('instanceof', val instanceof Object); + console.log('val', val); + } + return false; + } +} + +// decodeDoc() and encodeDoc() traverses specialFieldTypes[] in order of appearance for every field (and nested fields) +// of every document of every collection, and uses only the first matched handler per field. +// So list FieldHandlers by descending order of your typical field type use. But always keep ArrayOrObjectFH last, since matching +// objects is tricky and will result in a false positives if moved up the chain. +const specialFieldTypes: FieldHandler[] = [ + // new TestFH('test'), + new GeoPointFH('geopoint'), + new BooleanFH('bool'), + new TimeStampFH('timestamp'), + new NumberFH('number'), + new ReferenceFH('ref'), + new NullFH('null'), + new ArrayOrObjectFH() +]; + +// Decode from Firestore field +export function decodeDoc(doc) { + _.forEach(doc, (fieldValue, fieldName) => { + const fieldHandler = specialFieldTypes.find(fieldHandler => fieldHandler.isDecodeType(fieldName, fieldValue, doc)); + if (!fieldHandler) return; + doc[fieldName] = fieldHandler.decode(fieldName, fieldValue, doc); + }); +} + +// Encode to Firestore field +export function encodeDoc(doc) { + _.forEach(doc, (fieldValue, fieldName) => { + const fieldHandler = specialFieldTypes.find(fieldHandler => fieldHandler.isEncodeType(fieldName, fieldValue, doc)); + if (!fieldHandler) return; + doc[fieldName] = fieldHandler.encode(fieldName, fieldValue, doc); + }); +} + + + + + +// Sorting utils + +export interface SortTuple { + [key: string]: 'ASC' | 'DSC'; +} + +export function sortByKeysFn(keys: string | (string | SortTuple)[] ): (a:any, b:any) => number { + const sortTuples: SortTuple[] = []; + const dir = 'ASC'; + + if (typeof keys === 'string') { + sortTuples.push({ [keys]: dir }); + } else { + _.forEach(keys, key => sortTuples.push( typeof key === 'string' ? {[key]: dir} : key )); + } + + return (a, b) => { + let sort = 0; + for(let tuple of sortTuples) { + if (sort !== 0) break; + for(let key in tuple) { + if (tuple[key] === 'ASC') { + sort= a[key] > b[key] ? 1 + : a[key] < b[key] ? -1 + : 0; + } else { + sort= a[key] > b[key] ? -1 + : a[key] < b[key] ? 1 + : 0; + } + } + } + return sort; + }; +} \ No newline at end of file From 9b9413f1e0e1a493b6d2260925ab32ab4855310f Mon Sep 17 00:00:00 2001 From: Jacques Rowe Date: Mon, 13 Aug 2018 02:30:09 +0200 Subject: [PATCH 07/12] Updated examples and readme --- README.md | 32 ++++++++++++++++++-------------- src/index.ts | 8 ++++---- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 5a4f239..cb35818 100644 --- a/README.md +++ b/README.md @@ -15,23 +15,22 @@ Watch the [screencast](https://angularfirebase.com/lessons/import-csv-json-or-ex ## Import Data to Firestore -Push your local data to the Firestore database. +- Push your local data to the Firestore database. +- Omitting [collections...] will import all collections from source file. +- Properly encodes to Firestore data types such GeoPoint, Reference, Timestamp, etc. ``` -import|i [options] +import|i [options] [collections...] ``` Options: ``` --i, --id [field] Field to use for document ID --m, --merge Merge Firestore documents. Default is replace. +-i, --id [field] Field to use for Document IDs (default: doc_id) +-a, --auto-id [str] Document ID token specifying auto generated Document ID (default: Auto-ID) +-m, --merge Merge Firestore documents. Default is Replace. -k, --chunk [size] Split upload into batches. Max 500 by Firestore constraints. (default: 500) -p, --coll-prefix [prefix] (Sub-)Collection prefix (default: collection) --c, --col-oriented XLSX column orientation. Default is row orientation --o, --omit-empty-fields XLSX omit empty fields --s, --sheet [#] XLSX Sheet # to import (default: 1) - -d, --dry-run Perform a dry run, without committing data. Implies --verbose. -v, --verbose Output document insert paths -h, --help output usage information @@ -40,13 +39,15 @@ Options: Examples: ``` fire-migrate import --dry-run test.json myCollection -fire-migrate import --merge test.csv myCollection -fire-migrate i -m --id docid --sheet 3 test.xlsx myCollection +fire-migrate import --merge test.INDEX.csv myCollection +fire-migrate i -m --id docid test.xlsx ``` ## Export Data from Firestore -Pull data from Firestore to a JSON file. +- Pull data from Firestore to a JSON, CSV or XLSX file. +- Exports Sub-Collections by default, optionally disabled. +- Splits CSV/XLSX collections into separate files/sheets with an INDEX. ``` export|e [options] [collections...] @@ -54,15 +55,18 @@ export|e [options] [collections...] Options: ``` --s, --subcolls Include sub-collections. + +-n, --no-subcolls Do not export sub-collections. -p, --coll-prefix [prefix] Collection prefix (default: collection) +-i, --id-field [id] Field name to use for document IDs (default: doc_id) + -v, --verbose Output traversed document paths -h, --help output usage information ``` Examples: ``` -fire-migrate export --verbose --subcolls myCollection.json myCollection +fire-migrate export --verbose --no-subcolls myRootCollection.json myCollection fire-migrate export users-posts.json users posts -fire-migrate e -sv firestore-dump.json +fire-migrate e -s firestore-dump.json ``` \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 5789076..10b0b01 100644 --- a/src/index.ts +++ b/src/index.ts @@ -36,8 +36,8 @@ const importDescription = [ const importHelp = [ '','Examples:','', ' fire-migrate import --dry-run test.json myCollection', - ' fire-migrate import --merge test.csv myCollection', - ' fire-migrate i -m --id docid --sheet 3 test.xlsx myCollection', + ' fire-migrate import --merge test.INDEX.csv myCollection', + ' fire-migrate i -m --id docid test.xlsx myCollection', '' ].join('\n').replace(/^/gm, ' '); @@ -46,9 +46,9 @@ const exportDescription = const exportHelp = [ '','Examples:','', - ' fire-migrate export --verbose --subcolls myCollection.json myCollection', + ' fire-migrate export --verbose --no-subcolls myCollectionRootLevel.json myCollection', ' fire-migrate export users-posts.json users posts', - ' fire-migrate e -sv firestore-dump.json', + ' fire-migrate e -v firestore-dump.xlsx', '' ].join('\n').replace(/^/gm, ' '); From f0b8dfc13deced15e19dbb6c885615d6efcbb989 Mon Sep 17 00:00:00 2001 From: stildalf Date: Wed, 15 Aug 2018 09:12:53 +0200 Subject: [PATCH 08/12] Fix to allow auto-ids on JSON document array import. --- src/importCollection/index.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/importCollection/index.ts b/src/importCollection/index.ts index d8e1e81..ec7d759 100644 --- a/src/importCollection/index.ts +++ b/src/importCollection/index.ts @@ -245,13 +245,12 @@ function writeCollection(data:JSON, path: string): Promise { const mode = (data instanceof Array) ? 'array' : 'object'; for ( let [id, item] of Object.entries(data)) { - // doc-id preference: object key, invoked --id option, auto-id - // id = (mode === 'object') ? id: (args.id && _.hasIn(item, args.id)) ? item[args.id].toString() : colRef.doc().id; + // doc-id preference: object key, invoked --id field, auto-id if (_.hasIn(item, args.id)) { id = item[args.id].toString(); delete(item[args.id]); } - if (!id || (id.toLowerCase() === args.autoId.toLowerCase())) { + if (!id || mode === 'array' || (id.toLowerCase() === args.autoId.toLowerCase()) ) { id = colRef.doc().id; } From 85ba45be2b0a79b97f15f2c609446a57d22f15d5 Mon Sep 17 00:00:00 2001 From: stildalf Date: Wed, 15 Aug 2018 10:22:48 +0200 Subject: [PATCH 09/12] Bring back deleted test files. Reorganised test files into samples folder. --- .../csv-indexed}/test.7aM3oA2Vey.csv | 0 .../csv-indexed}/test.INDEX.csv | 0 .../csv-indexed}/test.WrZcYDcSEK.csv | 0 .../csv-indexed}/test.ZAeXu3t9C1.csv | 0 .../csv-indexed}/test.bqXnVStK7.csv | 0 .../csv-indexed}/test.iIuPVhg34y.csv | 0 .../csv-indexed}/test.pdLpX1tVHd.csv | 0 .../csv-indexed}/test.tCyFRILto0.csv | 0 .../csv-indexed}/test.wba2gQC7m-.csv | 0 samples/test-obj-subcoll.json | 57 ++++++++++++++++++ samples/test-obj.json | 22 +++++++ samples/test.csv | 3 + .../test.xlsx => samples/test.indexed.xlsx | Bin samples/test.json | 21 +++++++ samples/test.simple.xlsx | Bin 0 -> 26753 bytes testFiles/test.json | 1 - 16 files changed, 103 insertions(+), 1 deletion(-) rename {testFiles => samples/csv-indexed}/test.7aM3oA2Vey.csv (100%) rename {testFiles => samples/csv-indexed}/test.INDEX.csv (100%) rename {testFiles => samples/csv-indexed}/test.WrZcYDcSEK.csv (100%) rename {testFiles => samples/csv-indexed}/test.ZAeXu3t9C1.csv (100%) rename {testFiles => samples/csv-indexed}/test.bqXnVStK7.csv (100%) rename {testFiles => samples/csv-indexed}/test.iIuPVhg34y.csv (100%) rename {testFiles => samples/csv-indexed}/test.pdLpX1tVHd.csv (100%) rename {testFiles => samples/csv-indexed}/test.tCyFRILto0.csv (100%) rename {testFiles => samples/csv-indexed}/test.wba2gQC7m-.csv (100%) create mode 100644 samples/test-obj-subcoll.json create mode 100644 samples/test-obj.json create mode 100644 samples/test.csv rename testFiles/test.xlsx => samples/test.indexed.xlsx (100%) create mode 100644 samples/test.json create mode 100644 samples/test.simple.xlsx delete mode 100644 testFiles/test.json diff --git a/testFiles/test.7aM3oA2Vey.csv b/samples/csv-indexed/test.7aM3oA2Vey.csv similarity index 100% rename from testFiles/test.7aM3oA2Vey.csv rename to samples/csv-indexed/test.7aM3oA2Vey.csv diff --git a/testFiles/test.INDEX.csv b/samples/csv-indexed/test.INDEX.csv similarity index 100% rename from testFiles/test.INDEX.csv rename to samples/csv-indexed/test.INDEX.csv diff --git a/testFiles/test.WrZcYDcSEK.csv b/samples/csv-indexed/test.WrZcYDcSEK.csv similarity index 100% rename from testFiles/test.WrZcYDcSEK.csv rename to samples/csv-indexed/test.WrZcYDcSEK.csv diff --git a/testFiles/test.ZAeXu3t9C1.csv b/samples/csv-indexed/test.ZAeXu3t9C1.csv similarity index 100% rename from testFiles/test.ZAeXu3t9C1.csv rename to samples/csv-indexed/test.ZAeXu3t9C1.csv diff --git a/testFiles/test.bqXnVStK7.csv b/samples/csv-indexed/test.bqXnVStK7.csv similarity index 100% rename from testFiles/test.bqXnVStK7.csv rename to samples/csv-indexed/test.bqXnVStK7.csv diff --git a/testFiles/test.iIuPVhg34y.csv b/samples/csv-indexed/test.iIuPVhg34y.csv similarity index 100% rename from testFiles/test.iIuPVhg34y.csv rename to samples/csv-indexed/test.iIuPVhg34y.csv diff --git a/testFiles/test.pdLpX1tVHd.csv b/samples/csv-indexed/test.pdLpX1tVHd.csv similarity index 100% rename from testFiles/test.pdLpX1tVHd.csv rename to samples/csv-indexed/test.pdLpX1tVHd.csv diff --git a/testFiles/test.tCyFRILto0.csv b/samples/csv-indexed/test.tCyFRILto0.csv similarity index 100% rename from testFiles/test.tCyFRILto0.csv rename to samples/csv-indexed/test.tCyFRILto0.csv diff --git a/testFiles/test.wba2gQC7m-.csv b/samples/csv-indexed/test.wba2gQC7m-.csv similarity index 100% rename from testFiles/test.wba2gQC7m-.csv rename to samples/csv-indexed/test.wba2gQC7m-.csv diff --git a/samples/test-obj-subcoll.json b/samples/test-obj-subcoll.json new file mode 100644 index 0000000..d6523f1 --- /dev/null +++ b/samples/test-obj-subcoll.json @@ -0,0 +1,57 @@ +{ + "11111":{ + "first_name":"Wendy", + "last_name":"Phisher", + "age":22, + "posts":[ + { + "timestamp":"2018-03-30T14:01:03.652Z", + "text":"hello" + }, + { + "timestamp":"2018-03-30T14:01:03.652Z", + "text":"goodbye" + } + ] + }, + "22222":{ + "first_name":"Magen", + "last_name":"Bagelson", + "age":27, + "collection:posts":[ + { + "timestamp":"2018-03-30T14:01:03.652Z", + "text":"hello", + "collection:replies": [ + { + "timestamp": "018-03-30T14:01:03.652Z", + "text": "hi" + } + ] + }, + { + "timestamp":"2018-03-30T14:01:03.652Z", + "text":"goodbye" + } + ], + "collection:friends":[ + { "id": "11111" }, + { "id": "33333" } + ] + }, + "33333":{ + "first_name":"Doug", + "last_name":"Muffty", + "age":55, + "collection:posts":{ + "aaaa":{ + "timestamp":"2018-03-30T14:01:03.652Z", + "text":"hello" + }, + "bbbb":{ + "timestamp":"2018-03-30T14:01:03.652Z", + "text":"goodbye" + } + } + } +} \ No newline at end of file diff --git a/samples/test-obj.json b/samples/test-obj.json new file mode 100644 index 0000000..3f6b007 --- /dev/null +++ b/samples/test-obj.json @@ -0,0 +1,22 @@ +{ + "11111": { + "first_name": "Wendy", + "last_name": "Phisher", + "age": 22 + }, + "22222": { + "first_name": "Magen", + "last_name": "Bagelson", + "age": 27 + }, + "33333": { + "first_name": "Doug", + "last_name": "Muffty", + "age": 55 + }, + "44444": { + "first_name": "Bob", + "last_name": "Jones", + "age": 31 + } +} \ No newline at end of file diff --git a/samples/test.csv b/samples/test.csv new file mode 100644 index 0000000..dbf9f47 --- /dev/null +++ b/samples/test.csv @@ -0,0 +1,3 @@ +Name,Price,SKU,Color +Lamp,23.34,2123m12mxi,Blue +Rug,99.98,n232ej23m,Orange \ No newline at end of file diff --git a/testFiles/test.xlsx b/samples/test.indexed.xlsx similarity index 100% rename from testFiles/test.xlsx rename to samples/test.indexed.xlsx diff --git a/samples/test.json b/samples/test.json new file mode 100644 index 0000000..161464e --- /dev/null +++ b/samples/test.json @@ -0,0 +1,21 @@ +[{ + "id": 11111, + "first_name": "Wendy", + "last_name": "Phisher", + "age": 22 + }, { + "id": 22222, + "first_name": "Magen", + "last_name": "Bagelson", + "age": 27 + }, { + "id": 33333, + "first_name": "Doug", + "last_name": "Muffty", + "age": 55 + }, { + "id": 44444, + "first_name": "Bob", + "last_name": "Jones", + "age": 31 + }] \ No newline at end of file diff --git a/samples/test.simple.xlsx b/samples/test.simple.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d9e20cd151f2f9a2fdf3cf0f05cc037bc8aea4b1 GIT binary patch literal 26753 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 AHvj+t literal 0 HcmV?d00001 diff --git a/testFiles/test.json b/testFiles/test.json deleted file mode 100644 index c490ff3..0000000 --- a/testFiles/test.json +++ /dev/null @@ -1 +0,0 @@ -{"collection:test4":{"11111":{"posts":[{"text":"hello","timestamp":"{\"type\":\"timestamp\",\"data\":\"2018-06-30T22:00:00.000Z\"}"},{"timestamp":"{\"type\":\"timestamp\",\"data\":\"2018-03-30T12:01:03.000Z\"}","text":"goodbye"}],"last_name":"Phisher","age":"{\"type\":\"number\",\"data\":22}","first_name":"Wendy"},"22222":{"last_name":"Bagelson","age":"{\"type\":\"number\",\"data\":27}","first_name":"Magen","collection:friends":{"46xcZVeiqnQCWgBVZUrJ":{"id":"33333"},"OOpXHouoR4MjyareCxC4":{"id":"11111"},"WvRtxN1cSOnYbHkWi7Pc":{"id":"11111"},"ilf0GLsxKRncW1PjiFjI":{"id":"33333"}},"collection:posts":{"1X8WqVY2NTw96Dzsazyi":{"text":"hello","timestamp":"2018-03-30T14:01:03.652Z","collection:replies":{"qQELC2QgHbD31ohBSo46":{"timestamp":"018-03-30T14:01:03.652Z","text":"hi"}}},"Acc56NmfZqn4QczPllCE":{"timestamp":"2018-03-30T14:01:03.652Z","text":"goodbye"},"C1buCBxe6MttJnKfKCIm":{"text":"goodbye","timestamp":"2018-03-30T14:01:03.652Z"},"ITy7d47LrYE5FDQUwyyv":{"text":"hello","timestamp":"2018-03-30T14:01:03.652Z","collection:replies":{"GXkDFRSeMIhcEuMZ9GTH":{"timestamp":"018-03-30T14:01:03.652Z","text":"hi"}}}}},"33333":{"last_name":"Muffty","age":"{\"type\":\"number\",\"data\":55}","first_name":"Doug","collection:posts":{"aaaa":{"text":"hello","timestamp":"2018-03-30T14:01:03.652Z"},"bbbb":{"text":"goodbye","timestamp":"2018-03-30T14:01:03.652Z"}}}},"collection:test5":{"t5d1":{"gp":"{\"type\":\"geopoint\",\"data\":{\"_latitude\":20,\"_longitude\":21}}","meNull":"{\"type\":\"null\"}","ts":"{\"type\":\"timestamp\",\"data\":\"2018-08-16T09:12:13.000Z\"}","a":["String 1 in Array","{\"type\":\"number\",\"data\":12}",{"obj":{"str":"123"},"arr":["nested here",{"obj":{"msg":"Look down here","things":["{\"type\":\"geopoint\",\"data\":{\"_latitude\":45,\"_longitude\":23}}"]}}],"num":"{\"type\":\"number\",\"data\":13}"},"{\"type\":\"geopoint\",\"data\":{\"_latitude\":14,\"_longitude\":15}}"],"ref":"{\"type\":\"ref\",\"data\":\"test5/t5d2\"}","b":"{\"type\":\"bool\",\"data\":true}","s":"This is a string","n":"{\"type\":\"number\",\"data\":99.956}","o":{"s2":"String in Object","ts":"{\"type\":\"timestamp\",\"data\":\"2018-08-01T21:59:59.000Z\"}","n":"{\"type\":\"number\",\"data\":567}"},"collection:subcolHere":{"subDoc1":{"gp":"{\"type\":\"geopoint\",\"data\":{\"_latitude\":90,\"_longitude\":180}}"}}}}} From df536dbd49a103d88208cff2abb10e0b653a4447 Mon Sep 17 00:00:00 2001 From: stildalf Date: Wed, 15 Aug 2018 11:45:26 +0200 Subject: [PATCH 10/12] Add whole DB json sample file --- samples/test-db.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 samples/test-db.json diff --git a/samples/test-db.json b/samples/test-db.json new file mode 100644 index 0000000..b8a1a81 --- /dev/null +++ b/samples/test-db.json @@ -0,0 +1 @@ +{"collection:test-csv":{"88pKzZ7jn3g4OQrRP7eQ":{"Name":"Rug","Price":"99.98","SKU":"n232ej23m","Color":"Orange"},"SsUczOfBOlCyUD7UBCvf":{"Price":"23.34","SKU":"2123m12mxi","Color":"Blue","Name":"Lamp"}},"collection:test-json":{"7HilQv0zeat1Z1KhXCxX":{"last_name":"Phisher","age":"{\"type\":\"number\",\"data\":22}","first_name":"Wendy","id":"{\"type\":\"number\",\"data\":11111}"},"dP6PcSziRVf2IlOVExdH":{"last_name":"Bagelson","age":"{\"type\":\"number\",\"data\":27}","first_name":"Magen","id":"{\"type\":\"number\",\"data\":22222}"},"rvu5fUpFa410ie9W6efF":{"last_name":"Muffty","age":"{\"type\":\"number\",\"data\":55}","first_name":"Doug","id":"{\"type\":\"number\",\"data\":33333}"},"viCuQP0c0iRQAisxy5js":{"last_name":"Jones","age":"{\"type\":\"number\",\"data\":31}","first_name":"Bob","id":"{\"type\":\"number\",\"data\":44444}"}},"collection:test-obj-json":{"11111":{"last_name":"Phisher","age":"{\"type\":\"number\",\"data\":22}","first_name":"Wendy"},"22222":{"last_name":"Bagelson","age":"{\"type\":\"number\",\"data\":27}","first_name":"Magen"},"33333":{"age":"{\"type\":\"number\",\"data\":55}","first_name":"Doug","last_name":"Muffty"},"44444":{"last_name":"Jones","age":"{\"type\":\"number\",\"data\":31}","first_name":"Bob"}},"collection:test-obj-subcoll-json":{"11111":{"last_name":"Phisher","age":"{\"type\":\"number\",\"data\":22}","first_name":"Wendy","posts":[{"timestamp":"2018-03-30T14:01:03.652Z","text":"hello"},{"text":"goodbye","timestamp":"2018-03-30T14:01:03.652Z"}]},"22222":{"last_name":"Bagelson","age":"{\"type\":\"number\",\"data\":27}","first_name":"Magen","collection:friends":{"1kifmmEHtiuNjbrkPBG5":{"id":"11111"},"TAV2ZLfcF9jzLKucjH2N":{"id":"33333"}},"collection:posts":{"Ma4lB7YZH4AWfO4RFzWM":{"timestamp":"2018-03-30T14:01:03.652Z","text":"goodbye"},"WETWHci2Pj203tGUYEwL":{"text":"hello","timestamp":"2018-03-30T14:01:03.652Z","collection:replies":{"z8STAygJkesu1gKRS3FF":{"timestamp":"018-03-30T14:01:03.652Z","text":"hi"}}}}},"33333":{"last_name":"Muffty","age":"{\"type\":\"number\",\"data\":55}","first_name":"Doug","collection:posts":{"aaaa":{"text":"hello","timestamp":"2018-03-30T14:01:03.652Z"},"bbbb":{"timestamp":"2018-03-30T14:01:03.652Z","text":"goodbye"}}}},"collection:test4":{"11111":{"posts":[{"text":"hello","timestamp":"{\"type\":\"timestamp\",\"data\":\"2018-06-30T22:00:00.000Z\"}"},{"timestamp":"{\"type\":\"timestamp\",\"data\":\"2018-03-30T12:01:03.000Z\"}","text":"goodbye"}],"last_name":"Phisher","age":"{\"type\":\"number\",\"data\":22}","first_name":"Wendy"},"22222":{"last_name":"Bagelson","age":"{\"type\":\"number\",\"data\":27}","first_name":"Magen","collection:friends":{"46xcZVeiqnQCWgBVZUrJ":{"id":"33333"},"OOpXHouoR4MjyareCxC4":{"id":"11111"},"WvRtxN1cSOnYbHkWi7Pc":{"id":"11111"},"ilf0GLsxKRncW1PjiFjI":{"id":"33333"}},"collection:posts":{"1X8WqVY2NTw96Dzsazyi":{"timestamp":"3/30/18","text":"hello","collection:replies":{"qQELC2QgHbD31ohBSo46":{"timestamp":"018-03-30T14:01:03.652Z","text":"hi"}}},"Acc56NmfZqn4QczPllCE":{"text":"goodbye","timestamp":"3/30/18"},"C1buCBxe6MttJnKfKCIm":{"text":"goodbye","timestamp":"3/30/18"},"ITy7d47LrYE5FDQUwyyv":{"text":"hello","timestamp":"3/30/18","collection:replies":{"GXkDFRSeMIhcEuMZ9GTH":{"text":"hi","timestamp":"018-03-30T14:01:03.652Z"}}}}},"33333":{"last_name":"Muffty","age":"{\"type\":\"number\",\"data\":55}","first_name":"Doug","collection:posts":{"aaaa":{"text":"hello","timestamp":"3/30/18"},"bbbb":{"text":"goodbye","timestamp":"3/30/18"}}}},"collection:test5":{"t5d1":{"a":["String 1 in Array","{\"type\":\"number\",\"data\":12}",{"obj":{"str":"123"},"arr":["nested here",{"obj":{"msg":"Look down here","things":["{\"type\":\"geopoint\",\"data\":{\"_latitude\":45,\"_longitude\":23}}"]}}],"num":"{\"type\":\"number\",\"data\":13}"},"{\"type\":\"geopoint\",\"data\":{\"_latitude\":14,\"_longitude\":15}}"],"ref":"{\"type\":\"ref\",\"data\":\"test5/t5d2\"}","b":"{\"type\":\"bool\",\"data\":true}","s":"This is a string","n":"{\"type\":\"number\",\"data\":99.956}","o":{"ts":"{\"type\":\"timestamp\",\"data\":\"2018-08-01T21:59:59.000Z\"}","n":"{\"type\":\"number\",\"data\":567}","s2":"String in Object"},"gp":"{\"type\":\"geopoint\",\"data\":{\"_latitude\":20,\"_longitude\":21}}","meNull":"{\"type\":\"null\"}","ts":"{\"type\":\"timestamp\",\"data\":\"2018-08-16T09:12:13.000Z\"}","collection:subcolHere":{"subDoc1":{"gp":"{\"type\":\"geopoint\",\"data\":{\"_latitude\":90,\"_longitude\":180}}"}}}}} From df81a0347d73ab42933273e1b204f0b72a3d379a Mon Sep 17 00:00:00 2001 From: stildalf Date: Wed, 15 Aug 2018 11:46:40 +0200 Subject: [PATCH 11/12] Fix issues with legacy json files. Reorganise import code snippets. --- src/importCollection/index.ts | 300 +++++++++++++++++++--------------- 1 file changed, 170 insertions(+), 130 deletions(-) diff --git a/src/importCollection/index.ts b/src/importCollection/index.ts index ec7d759..674fbfd 100644 --- a/src/importCollection/index.ts +++ b/src/importCollection/index.ts @@ -32,8 +32,8 @@ export const execute = async (file: string, collections: string[], options) => { } let data = {}; + if (file.endsWith(".json")) { - // data[collection] = await fs.readJSON(file); data = await readJSON(file, collections); } @@ -66,135 +66,8 @@ export const execute = async (file: string, collections: string[], options) => { } -function dataFromJSON(json) { - _.forEach(json, row => { - dot.object(row); - // encodeDoc(row); - }); - return json; -} - -function dataFromSheet(sheet) { - const json = XLSX.utils.sheet_to_json(sheet); - return dataFromJSON(json); -} - -function JSONfromCSV(file:string) { - const book = XLSX.readFile(file); - const sheet = book.Sheets['Sheet1']; - return XLSX.utils.sheet_to_json(sheet); -} - -function datafromCSV(file:string) { - const json = JSONfromCSV(file); - return dataFromJSON(json); -} - -function readJSON(path: string, collections: string[]): Promise { - return new Promise(async (resolve, reject) => { - const json = await fs.readJSON(path); - const data = {}; - - // Selected Collections and Subcols; - if (collections[0] !== '/') { - collections.forEach(collection => { - if (isDocumentPath(collection)) { - reject(`Invalid collection path for single collection: ${collection}`); - return; - }; - - const labelledPath = collection.split('/').map((segment, index) => { - return (index % 2 === 0) ? args.collPrefix + ':' + segment : segment; - }).join('.'); - - const coll = dot.pick(labelledPath, json); - if (!coll) { - reject(`Invalid collection path for single collection: ${collection}`); - return; - } - - data[collection] = coll; - }); - resolve(data); - return; - } - - // All Collections from JSON file - if (collections[0] === '/') { - _.forEach(json, (coll, key: string) => { - const path = key.substr(args.collPrefix.length + 1); - data[path] = coll; - }); - resolve(data); - return; - } - - // Import options exhausted - reject(`Invalid collections`); - }); -} - -function readXLSXBook(path, collections: string[]): Promise { - - return new Promise((resolve, reject) => { - const book = XLSX.readFile(path); - const sheetCount = book.SheetNames.length; - const indexSheet = book.Sheets['INDEX']; - let data = {}; - - // Single Sheet as Collection from Non-Indexed Workbook - if (!indexSheet) { - const collection = collections[0]; - if(isDocumentPath(collection)) { - reject(`Invalid collection path for single collection: ${collection}`); - return; - } - const sheetName = book.SheetNames[+args.sheet - 1]; - const sheet = book.Sheets[sheetName]; - data[collection] = dataFromSheet(sheet); - resolve(data); - return; - } - - const index = XLSX.utils.sheet_to_json(indexSheet); - - // Selected Collections and Sub Colls from Indexed Workbook - if (collections[0] !== '/') { - collections.forEach(collection => { - const colls = index.filter(coll => (coll['Collection'] + '/').startsWith(collection + '/')); - if (colls.length) { - colls.forEach(coll => { - const colPath = coll['Collection']; - const sheetName = coll['Sheet Name']; - const sheet = book.Sheets[sheetName]; - data[colPath] = dataFromSheet(sheet); - }); - } else { - reject(`INDEX contains no paths matching: ${collection}`); - return; - } - }); - resolve(data); - return; - } - - // All Collections from Indexed Workbook - if (collections[0] === '/') { - const collection = collections[0]; - _.forEach(index, coll => { - const sheetName = coll['Sheet Name']; - const path = cleanCollectionPath([collection, coll['Collection']]); - const sheet = book.Sheets[sheetName]; - data[path] = dataFromSheet(sheet); - }); - resolve(data); - return; - } - // Import options exhausted - reject(`Invalid collections`); - }); -} +// Firestore Write/Batch Handlers async function batchSet(ref: FirebaseFirestore.DocumentReference, item, options) { // Log if requested @@ -277,6 +150,110 @@ function writeCollection(data:JSON, path: string): Promise { } +// File Handling Helpers + +function dataFromJSON(json) { + _.forEach(json, row => { + dot.object(row); + }); + return json; +} + +function dataFromSheet(sheet) { + const json = XLSX.utils.sheet_to_json(sheet); + return dataFromJSON(json); +} + +function JSONfromCSV(file:string) { + const book = XLSX.readFile(file); + const sheet = book.Sheets['Sheet1']; + return XLSX.utils.sheet_to_json(sheet); +} + +function datafromCSV(file:string) { + const json = JSONfromCSV(file); + return dataFromJSON(json); +} + + + +// File Handlers + +function readJSON(path: string, collections: string[]): Promise { + return new Promise(async (resolve, reject) => { + const json = await fs.readJSON(path); + const data = {}; + + const mode = (json instanceof Array) ? 'array' : 'object'; + + // Array of Docs, Single Anonymous Collection; + if (mode === 'array') { + const coll = collections[0]; + if (coll === '/' || collections.length > 1 || isDocumentPath(coll)) { + reject('Specify single target collection path for import of JSON array of documents.'); + return; + } + data[coll] = json; + resolve(data); + return; + } + + const rootJsonCollections = Object.keys(json).filter(k => k.startsWith(args.collPrefix + ':')); + + // Docs of Keyed Objects, Single Anonymous Collection; + if (rootJsonCollections.length === 0) { + const coll = collections[0]; + if (coll === '/' || collections.length > 1 || isDocumentPath(coll)) { + reject('Specify single target collection path for import of JSON keyed object documents.'); + return; + } + + data[collections[0]] = json; + resolve(data); + return; + } + + // Selected Collections; + if (collections[0] !== '/') { + collections.forEach(collection => { + if (isDocumentPath(collection)) { + console.log('ISDOC'); + reject(`Invalid collection path: ${collection}`); + return; + }; + + const labelledPath = collection.split('/').map((segment, index) => { + return (index % 2 === 0) ? args.collPrefix + ':' + segment : segment; + }).join('.'); + + const coll = dot.pick(labelledPath, json); + if (!coll) { + reject(`Source JSON file contains no collection named: ${collection}`); + return; + } + + data[collection] = coll; + }); + resolve(data); + return; + } + + // All Collections from JSON file + if (collections[0] === '/') { + rootJsonCollections.forEach(coll => { + const path = coll.substr(args.collPrefix.length + 1); + data[path] = json[coll]; + }) + resolve(data); + return; + } + + // Import options exhausted + reject(`Invalid import options`); + }); +} + + function readCSV(file: string, collections: string[]): Promise { return new Promise((resolve, reject) => { let lineCount = 0; @@ -290,7 +267,7 @@ function readCSV(file: string, collections: string[]): Promise { } const collection = collections[0]; if (collection === '/') { - reject('You have to specify an import collection for single mode CSV import.'); + reject('Specify a collection for single mode CSV import.'); return; } data[collection] = datafromCSV(file); @@ -342,3 +319,66 @@ function readCSV(file: string, collections: string[]): Promise { }); } + + +function readXLSXBook(path, collections: string[]): Promise { + + return new Promise((resolve, reject) => { + const book = XLSX.readFile(path); + const sheetCount = book.SheetNames.length; + const indexSheet = book.Sheets['INDEX']; + let data = {}; + + // Single Sheet as Collection from Non-Indexed Workbook + if (!indexSheet) { + const collection = collections[0]; + if(isDocumentPath(collection)) { + reject(`Invalid collection path for single collection: ${collection}`); + return; + } + const sheetName = book.SheetNames[+args.sheet - 1]; + const sheet = book.Sheets[sheetName]; + data[collection] = dataFromSheet(sheet); + resolve(data); + return; + } + + const index = XLSX.utils.sheet_to_json(indexSheet); + + // Selected Collections and Sub Colls from Indexed Workbook + if (collections[0] !== '/') { + collections.forEach(collection => { + const colls = index.filter(coll => (coll['Collection'] + '/').startsWith(collection + '/')); + if (colls.length) { + colls.forEach(coll => { + const colPath = coll['Collection']; + const sheetName = coll['Sheet Name']; + const sheet = book.Sheets[sheetName]; + data[colPath] = dataFromSheet(sheet); + }); + } else { + reject(`INDEX contains no paths matching: ${collection}`); + return; + } + }); + resolve(data); + return; + } + + // All Collections from Indexed Workbook + if (collections[0] === '/') { + const collection = collections[0]; + _.forEach(index, coll => { + const sheetName = coll['Sheet Name']; + const path = cleanCollectionPath([collection, coll['Collection']]); + const sheet = book.Sheets[sheetName]; + data[path] = dataFromSheet(sheet); + }); + resolve(data); + return; + } + + // Import options exhausted + reject(`Invalid collections`); + }); +} From a7095ca7fbfd001aaaf728820b85dc8399202a3a Mon Sep 17 00:00:00 2001 From: stildalf Date: Wed, 15 Aug 2018 12:04:40 +0200 Subject: [PATCH 12/12] Update readme with explanations and examples --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index cb35818..9adce6d 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ CLI tool for moving data in-n-out of [Cloud Firestore](https://firebase.google.com/docs/firestore/). -- Import a CSV, Excel, or JSON file to Firestore -- Export Firestore data to JSON +- Import/Export CSV, Excel, or JSON files to/from Firestore. +- Encode/Decode Firestore data types such as GeoPoint, Reference, Timestamp, etc. Watch the [screencast](https://angularfirebase.com/lessons/import-csv-json-or-excel-to-firestore/) @@ -16,8 +16,8 @@ Watch the [screencast](https://angularfirebase.com/lessons/import-csv-json-or-ex ## Import Data to Firestore - Push your local data to the Firestore database. -- Omitting [collections...] will import all collections from source file. -- Properly encodes to Firestore data types such GeoPoint, Reference, Timestamp, etc. +- Selectively import [collections...] from source file to Firestore. +- Omitting [collections...], or specifying root "/" will import all collections. ``` import|i [options] [collections...] @@ -40,12 +40,14 @@ Examples: ``` fire-migrate import --dry-run test.json myCollection fire-migrate import --merge test.INDEX.csv myCollection -fire-migrate i -m --id docid test.xlsx +fire-migrate i -m --id myDocIdField test.xlsx users posts +fire-migrate i -v firestore-dump.json ``` ## Export Data from Firestore -- Pull data from Firestore to a JSON, CSV or XLSX file. +- Pull data from Firestore to a JSON, CSV or XLSX file. +- Selectively export [collections...], or entire database with root "/". - Exports Sub-Collections by default, optionally disabled. - Splits CSV/XLSX collections into separate files/sheets with an INDEX. @@ -68,5 +70,6 @@ Examples: ``` fire-migrate export --verbose --no-subcolls myRootCollection.json myCollection fire-migrate export users-posts.json users posts -fire-migrate e -s firestore-dump.json +fire-migrate export path/to/indexed-csv/db.csv +fire-migrate e -v firestore-dump.json ``` \ No newline at end of file