diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7c49d56619..667cd3558d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: strategy: matrix: - node-version: [12.x, 14.x] + node-version: [14.x] steps: - uses: actions/checkout@v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 29681b50dc..813136e4ee 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,7 +47,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v1 with: - node-version: 12.x + node-version: 14.x - name: Install and build run: | @@ -116,7 +116,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v1 with: - node-version: 12.x + node-version: 14.x - name: Publish preflight check id: preflight diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a3ad29f277..4f80791cea 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -87,9 +87,9 @@ information on using pull requests. ### Prerequisites -1. Node.js 10.13.0 or higher. -2. NPM 5 or higher (NPM 6 recommended). -3. Google Cloud SDK ([`gcloud`](https://cloud.google.com/sdk/downloads) utility) +1. Node.js 14 or higher. +2. `npm` 6 or higher. +3. Google Cloud SDK ([`gcloud`](https://cloud.google.com/sdk/downloads) utility). ### Initial Setup diff --git a/README.md b/README.md index 944b23734a..6a1d293bee 100644 --- a/README.md +++ b/README.md @@ -59,8 +59,7 @@ requests, code review feedback, and also pull requests. ## Supported Environments -We support Node.js 12 and higher. However, Node.js 12 support is deprecated. We strongly encourage -you to use Node.js 14 or higher as we will drop support for Node.js 12 in the next major version. +We support Node.js 14 and higher. Please also note that the Admin SDK should only be used in server-side/back-end environments controlled by the app developer. diff --git a/etc/firebase-admin.api.md b/etc/firebase-admin.api.md index 33c8664d29..e5a20b8d66 100644 --- a/etc/firebase-admin.api.md +++ b/etc/firebase-admin.api.md @@ -274,6 +274,14 @@ export namespace firestore { import WhereFilterOp = _firestore.WhereFilterOp; import WriteBatch = _firestore.WriteBatch; import WriteResult = _firestore.WriteResult; + import PartialWithFieldValue = _firestore.PartialWithFieldValue; + import WithFieldValue = _firestore.WithFieldValue; + import Primitive = _firestore.Primitive; + import NestedUpdateFields = _firestore.NestedUpdateFields; + import ChildUpdateFields = _firestore.ChildUpdateFields; + import AddPrefixToKeys = _firestore.AddPrefixToKeys; + import UnionToIntersection = _firestore.UnionToIntersection; + import ReadOnlyTransactionOptions = _firestore.ReadOnlyTransactionOptions; import setLogFunction = _firestore.setLogFunction; } diff --git a/etc/firebase-admin.firestore.api.md b/etc/firebase-admin.firestore.api.md index 5a9bdd35df..0e957df024 100644 --- a/etc/firebase-admin.firestore.api.md +++ b/etc/firebase-admin.firestore.api.md @@ -6,10 +6,12 @@ /// +import { AddPrefixToKeys } from '@google-cloud/firestore'; import { Agent } from 'http'; import { BulkWriter } from '@google-cloud/firestore'; import { BulkWriterOptions } from '@google-cloud/firestore'; import { BundleBuilder } from '@google-cloud/firestore'; +import { ChildUpdateFields } from '@google-cloud/firestore'; import { CollectionGroup } from '@google-cloud/firestore'; import { CollectionReference } from '@google-cloud/firestore'; import { DocumentChange } from '@google-cloud/firestore'; @@ -23,30 +25,40 @@ import { Firestore } from '@google-cloud/firestore'; import { FirestoreDataConverter } from '@google-cloud/firestore'; import { GeoPoint } from '@google-cloud/firestore'; import { GrpcStatus } from '@google-cloud/firestore'; +import { NestedUpdateFields } from '@google-cloud/firestore'; import { OrderByDirection } from '@google-cloud/firestore'; +import { PartialWithFieldValue } from '@google-cloud/firestore'; import { Precondition } from '@google-cloud/firestore'; +import { Primitive } from '@google-cloud/firestore'; import { Query } from '@google-cloud/firestore'; import { QueryDocumentSnapshot } from '@google-cloud/firestore'; import { QueryPartition } from '@google-cloud/firestore'; import { QuerySnapshot } from '@google-cloud/firestore'; +import { ReadOnlyTransactionOptions } from '@google-cloud/firestore'; import { ReadOptions } from '@google-cloud/firestore'; import { setLogFunction } from '@google-cloud/firestore'; import { SetOptions } from '@google-cloud/firestore'; import { Settings } from '@google-cloud/firestore'; import { Timestamp } from '@google-cloud/firestore'; import { Transaction } from '@google-cloud/firestore'; +import { UnionToIntersection } from '@google-cloud/firestore'; import { UpdateData } from '@google-cloud/firestore'; import { v1 } from '@google-cloud/firestore'; import { WhereFilterOp } from '@google-cloud/firestore'; +import { WithFieldValue } from '@google-cloud/firestore'; import { WriteBatch } from '@google-cloud/firestore'; import { WriteResult } from '@google-cloud/firestore'; +export { AddPrefixToKeys } + export { BulkWriter } export { BulkWriterOptions } export { BundleBuilder } +export { ChildUpdateFields } + export { CollectionGroup } export { CollectionReference } @@ -78,10 +90,16 @@ export function getFirestore(app?: App): Firestore; export { GrpcStatus } +export { NestedUpdateFields } + export { OrderByDirection } +export { PartialWithFieldValue } + export { Precondition } +export { Primitive } + export { Query } export { QueryDocumentSnapshot } @@ -90,6 +108,8 @@ export { QueryPartition } export { QuerySnapshot } +export { ReadOnlyTransactionOptions } + export { ReadOptions } export { setLogFunction } @@ -102,12 +122,16 @@ export { Timestamp } export { Transaction } +export { UnionToIntersection } + export { UpdateData } export { v1 } export { WhereFilterOp } +export { WithFieldValue } + export { WriteBatch } export { WriteResult } diff --git a/package-lock.json b/package-lock.json index d1b3823166..b4e8d52cb7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "firebase-admin", - "version": "10.2.0", + "version": "10.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -50,6 +50,14 @@ "gensync": "^1.0.0-beta.2", "json5": "^2.2.1", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/generator": { @@ -86,6 +94,14 @@ "@babel/helper-validator-option": "^7.16.7", "browserslist": "^4.20.2", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/helper-environment-visitor": { @@ -512,9 +528,9 @@ } }, "@google-cloud/firestore": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.15.1.tgz", - "integrity": "sha512-2PWsCkEF1W02QbghSeRsNdYKN1qavrHBP3m72gPDMHQSYrGULOaTi7fSJquQmAtc4iPVB2/x6h80rdLHTATQtA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-5.0.2.tgz", + "integrity": "sha512-xlGcNYaW0nvUMzNn2+pLfbEBVt6oysVqtM89faMgZWkWfEtvIQGS0h5PRdLlcqufNzRCX3yIGv29Pb+03ys+VA==", "optional": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -540,40 +556,89 @@ "optional": true }, "@google-cloud/promisify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.4.tgz", - "integrity": "sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.0.tgz", + "integrity": "sha512-91ArYvRgXWb73YvEOBMmOcJc0bDRs5yiVHnqkwoG0f3nm7nZuipllz6e7BvFESBvjkDTBC0zMD8QxedUwNLc1A==", "optional": true }, "@google-cloud/storage": { - "version": "5.20.5", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.20.5.tgz", - "integrity": "sha512-lOs/dCyveVF8TkVFnFSF7IGd0CJrTm91qiK6JLu+Z8qiT+7Ag0RyVhxZIWkhiACqwABo7kSHDm8FdH8p2wxSSw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-6.1.0.tgz", + "integrity": "sha512-zqZwzpRWCJuPne7x9Vc2H79zANl0uh9bNPGis0xAuC88ZEvBXfQqYCAVyiL1YIxi7rf51l8wy9vBr1pONMfxxA==", "optional": true, "requires": { "@google-cloud/paginator": "^3.0.7", "@google-cloud/projectify": "^2.0.0", - "@google-cloud/promisify": "^2.0.0", + "@google-cloud/promisify": "^3.0.0", "abort-controller": "^3.0.0", "arrify": "^2.0.0", "async-retry": "^1.3.3", "compressible": "^2.0.12", - "configstore": "^5.0.0", "duplexify": "^4.0.0", "ent": "^2.2.0", "extend": "^3.0.2", - "gaxios": "^4.0.0", - "google-auth-library": "^7.14.1", - "hash-stream-validation": "^0.2.2", + "gaxios": "^5.0.0", + "google-auth-library": "^8.0.1", "mime": "^3.0.0", "mime-types": "^2.0.8", "p-limit": "^3.0.1", "pumpify": "^2.0.0", - "retry-request": "^4.2.2", + "retry-request": "^5.0.0", "stream-events": "^1.0.4", - "teeny-request": "^7.1.3", - "uuid": "^8.0.0", - "xdg-basedir": "^4.0.0" + "teeny-request": "^8.0.0", + "uuid": "^8.0.0" + }, + "dependencies": { + "gaxios": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.0.0.tgz", + "integrity": "sha512-VD/yc5ln6XU8Ch1hyYY6kRMBE0Yc2np3fPyeJeYHhrPs1i8rgnsApPMWyrugkl7LLoSqpOJVBWlQIa87OAvt8Q==", + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.7" + } + }, + "gcp-metadata": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.0.0.tgz", + "integrity": "sha512-gfwuX3yA3nNsHSWUL4KG90UulNiq922Ukj3wLTrcnX33BB7PwB1o0ubR8KVvXu9nJH+P5w1j2SQSNNqto+H0DA==", + "optional": true, + "requires": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + } + }, + "google-auth-library": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.0.2.tgz", + "integrity": "sha512-HoG+nWFAThLovKpvcbYzxgn+nBJPTfAwtq0GxPN821nOO+21+8oP7MoEHfd1sbDulUFFGfcjJr2CnJ4YssHcyg==", + "optional": true, + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.0.0", + "gtoken": "^5.3.2", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + } + }, + "retry-request": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.0.tgz", + "integrity": "sha512-vBZdBxUordje9253imlmGtppC5gdcwZmNz7JnU2ui+KKFPk25keR+0c020AVV20oesYxIFOI0Kh3HE88/59ieg==", + "optional": true, + "requires": { + "debug": "^4.1.1", + "extend": "^3.0.2" + } + } } }, "@grpc/grpc-js": { @@ -2761,20 +2826,6 @@ "source-map": "^0.6.1" } }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "optional": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -2862,12 +2913,6 @@ } } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "optional": true - }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -3077,15 +3122,6 @@ "esutils": "^2.0.2" } }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "optional": true, - "requires": { - "is-obj": "^2.0.0" - } - }, "duplexify": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", @@ -4472,7 +4508,8 @@ "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true }, "gtoken": { "version": "5.3.2", @@ -4831,12 +4868,6 @@ } } }, - "hash-stream-validation": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", - "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==", - "optional": true - }, "hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", @@ -4974,7 +5005,8 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true }, "indent-string": { "version": "4.0.0", @@ -5212,12 +5244,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "optional": true - }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -5305,7 +5331,8 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, "is-unc-path": { "version": "1.0.0", @@ -5398,6 +5425,14 @@ "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "istanbul-lib-processinfo": { @@ -5615,11 +5650,6 @@ "jwa": "^1.4.1", "safe-buffer": "^5.0.1" } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -6035,8 +6065,17 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "requires": { "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "make-error": { @@ -6691,14 +6730,6 @@ "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } } }, "normalize-path": { @@ -6847,12 +6878,6 @@ "path-type": "^3.0.0" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -8247,7 +8272,7 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true } } @@ -8284,9 +8309,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "semver-greatest-satisfied-range": { "version": "1.1.0", @@ -8376,7 +8401,8 @@ "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "sinon": { "version": "14.0.0", @@ -8818,7 +8844,7 @@ "sver-compat": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "integrity": "sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==", "dev": true, "requires": { "es6-iterator": "^2.0.1", @@ -8840,9 +8866,9 @@ } }, "teeny-request": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.2.0.tgz", - "integrity": "sha512-SyY0pek1zWsi0LRVAALem+avzMLc33MKW/JLLakdP4s9+D7+jHcy5x6P+h94g2QNZsAqQNfX5lsbd3WSeJXrrw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.0.tgz", + "integrity": "sha512-6KEYxXI4lQPSDkXzXpPmJPNmo7oqduFFbhOEHf8sfsLbXyCsb+umUjBtMGAKhaSToD8JNCtQutTRefu29K64JA==", "optional": true, "requires": { "http-proxy-agent": "^5.0.0", @@ -9149,14 +9175,15 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, "requires": { "is-typedarray": "^1.0.0" } }, "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz", + "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", "dev": true }, "unbox-primitive": { @@ -9231,15 +9258,6 @@ "through2-filter": "^3.0.0" } }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "optional": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -9612,6 +9630,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, "requires": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -9620,17 +9639,11 @@ } }, "ws": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", - "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", "dev": true }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "optional": true - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 76b5c51300..d84bde18d8 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "license": "Apache-2.0", "homepage": "https://firebase.google.com/", "engines": { - "node": ">=12.7.0" + "node": ">=14" }, "scripts": { "build": "gulp build", @@ -198,8 +198,8 @@ "uuid": "^8.3.2" }, "optionalDependencies": { - "@google-cloud/firestore": "^4.15.1", - "@google-cloud/storage": "^5.18.3" + "@google-cloud/firestore": "^5.0.2", + "@google-cloud/storage": "^6.1.0" }, "devDependencies": { "@firebase/api-documenter": "^0.1.2", @@ -250,7 +250,7 @@ "sinon": "^14.0.0", "sinon-chai": "^3.0.0", "ts-node": "^10.2.0", - "typescript": "^3.7.3", + "typescript": "^4.6.4", "yargs": "^17.0.1" } } diff --git a/src/firestore/firestore-namespace.ts b/src/firestore/firestore-namespace.ts index 8fcdc43b00..a6ccc5c1d7 100644 --- a/src/firestore/firestore-namespace.ts +++ b/src/firestore/firestore-namespace.ts @@ -57,6 +57,14 @@ export namespace firestore { export import WhereFilterOp = _firestore.WhereFilterOp; export import WriteBatch = _firestore.WriteBatch; export import WriteResult = _firestore.WriteResult; + export import PartialWithFieldValue = _firestore.PartialWithFieldValue; + export import WithFieldValue = _firestore.WithFieldValue; + export import Primitive = _firestore.Primitive; + export import NestedUpdateFields = _firestore.NestedUpdateFields; + export import ChildUpdateFields = _firestore.ChildUpdateFields; + export import AddPrefixToKeys = _firestore.AddPrefixToKeys; + export import UnionToIntersection = _firestore.UnionToIntersection; + export import ReadOnlyTransactionOptions = _firestore.ReadOnlyTransactionOptions; export import setLogFunction = _firestore.setLogFunction; } diff --git a/src/firestore/index.ts b/src/firestore/index.ts index 305f5f9da8..0f5dfc4ecd 100644 --- a/src/firestore/index.ts +++ b/src/firestore/index.ts @@ -26,9 +26,11 @@ import { FirebaseApp } from '../app/firebase-app'; import { FirestoreService } from './firestore-internal'; export { + AddPrefixToKeys, BulkWriter, BulkWriterOptions, BundleBuilder, + ChildUpdateFields, CollectionGroup, CollectionReference, DocumentChange, @@ -42,19 +44,25 @@ export { FirestoreDataConverter, GeoPoint, GrpcStatus, + NestedUpdateFields, OrderByDirection, + PartialWithFieldValue, Precondition, + Primitive, Query, QueryDocumentSnapshot, QueryPartition, QuerySnapshot, ReadOptions, + ReadOnlyTransactionOptions, Settings, SetOptions, Timestamp, Transaction, UpdateData, + UnionToIntersection, WhereFilterOp, + WithFieldValue, WriteBatch, WriteResult, v1, diff --git a/test/integration/auth.spec.ts b/test/integration/auth.spec.ts index e1005d9c4a..afd905a48d 100644 --- a/test/integration/auth.spec.ts +++ b/test/integration/auth.spec.ts @@ -1285,7 +1285,7 @@ describe('admin.auth', () => { const actualTenantObj = actualTenant.toJSON(); if (authEmulatorHost) { // Not supported in Auth Emulator - delete (actualTenantObj as {testPhoneNumbers: Record}).testPhoneNumbers; + delete (actualTenantObj as {testPhoneNumbers?: Record}).testPhoneNumbers; delete expectedCreatedTenant.testPhoneNumbers; } expect(actualTenantObj).to.deep.equal(expectedCreatedTenant); @@ -1643,7 +1643,7 @@ describe('admin.auth', () => { const actualTenantObj = actualTenant.toJSON(); if (authEmulatorHost) { // Not supported in Auth Emulator - delete (actualTenantObj as {testPhoneNumbers: Record}).testPhoneNumbers; + delete (actualTenantObj as {testPhoneNumbers?: Record}).testPhoneNumbers; delete expectedCreatedTenant.testPhoneNumbers; } expect(actualTenantObj).to.deep.equal(expectedCreatedTenant); @@ -1675,7 +1675,7 @@ describe('admin.auth', () => { .then((actualTenant) => { const actualTenantObj = actualTenant.toJSON(); // Not supported in Auth Emulator - delete (actualTenantObj as {testPhoneNumbers: Record}).testPhoneNumbers; + delete (actualTenantObj as {testPhoneNumbers?: Record}).testPhoneNumbers; delete expectedUpdatedTenant.testPhoneNumbers; expect(actualTenantObj).to.deep.equal(expectedUpdatedTenant); return getAuth().tenantManager().updateTenant(createdTenantId, updatedOptions2); @@ -1683,7 +1683,7 @@ describe('admin.auth', () => { .then((actualTenant) => { const actualTenantObj = actualTenant.toJSON(); // Not supported in Auth Emulator - delete (actualTenantObj as {testPhoneNumbers: Record}).testPhoneNumbers; + delete (actualTenantObj as {testPhoneNumbers?: Record}).testPhoneNumbers; delete expectedUpdatedTenant2.testPhoneNumbers; expect(actualTenantObj).to.deep.equal(expectedUpdatedTenant2); }); @@ -2176,8 +2176,8 @@ describe('admin.auth', () => { // Not supported in ID token, delete decodedIdToken.nonce; // exp and iat may vary depending on network connection latency. - delete decodedIdToken.exp; - delete decodedIdToken.iat; + delete (decodedIdToken as any).exp; + delete (decodedIdToken as any).iat; expect(decodedIdToken).to.deep.equal(payloadClaims); }); }); diff --git a/test/integration/postcheck/package.json b/test/integration/postcheck/package.json index 854c355a68..2b7f8ac6f0 100644 --- a/test/integration/postcheck/package.json +++ b/test/integration/postcheck/package.json @@ -10,10 +10,10 @@ "devDependencies": { "@types/chai": "^4.0.0", "@types/mocha": "^2.2.48", - "@types/node": ">=12.12.47", + "@types/node": ">=14.0.0", "chai": "^4.2.0", "mocha": "^8.0.0", - "ts-node": "^9.0.0", - "typescript": "^3.7.3" + "ts-node": "^10.8.1", + "typescript": "^4.6.4" } } diff --git a/test/integration/postcheck/tsconfig.json b/test/integration/postcheck/tsconfig.json index 85001669ec..c67333ffa1 100644 --- a/test/integration/postcheck/tsconfig.json +++ b/test/integration/postcheck/tsconfig.json @@ -2,9 +2,9 @@ "compilerOptions": { "module": "commonjs", "moduleResolution": "node", - "target": "es5", + "target": "es2020", "noImplicitAny": false, - "lib": ["es2018"], + "lib": ["es2020"], "outDir": "lib", "typeRoots": [ "node_modules/@types" diff --git a/test/unit/auth/tenant.spec.ts b/test/unit/auth/tenant.spec.ts index 0f14856faa..3843a41bb7 100644 --- a/test/unit/auth/tenant.spec.ts +++ b/test/unit/auth/tenant.spec.ts @@ -86,7 +86,7 @@ describe('Tenant', () => { it('should return the expected server request without multi-factor and phone config', () => { const tenantOptionsClientRequest = deepCopy(clientRequestWithoutMfa); const tenantOptionsServerRequest = deepCopy(serverRequestWithoutMfa); - delete tenantOptionsServerRequest.name; + delete (tenantOptionsServerRequest as any).name; expect(Tenant.buildServerRequest(tenantOptionsClientRequest, !createRequest)) .to.deep.equal(tenantOptionsServerRequest); }); @@ -94,7 +94,7 @@ describe('Tenant', () => { it('should return the expected server request with multi-factor and phone config', () => { const tenantOptionsClientRequest = deepCopy(clientRequest); const tenantOptionsServerRequest = deepCopy(serverRequest); - delete tenantOptionsServerRequest.name; + delete (tenantOptionsServerRequest as any).name; expect(Tenant.buildServerRequest(tenantOptionsClientRequest, !createRequest)) .to.deep.equal(tenantOptionsServerRequest); }); @@ -134,7 +134,7 @@ describe('Tenant', () => { const tenantOptionsClientRequest = deepCopy(clientRequest); const tenantOptionsServerRequest = deepCopy(serverRequest); tenantOptionsClientRequest.testPhoneNumbers = null; - delete tenantOptionsServerRequest.name; + delete (tenantOptionsServerRequest as any).name; tenantOptionsServerRequest.testPhoneNumbers = {}; expect(Tenant.buildServerRequest(tenantOptionsClientRequest, !createRequest)) @@ -181,7 +181,7 @@ describe('Tenant', () => { it('should return the expected server request without multi-factor and phone config', () => { const tenantOptionsClientRequest: CreateTenantRequest = deepCopy(clientRequestWithoutMfa); const tenantOptionsServerRequest: TenantServerResponse = deepCopy(serverRequestWithoutMfa); - delete tenantOptionsServerRequest.name; + delete (tenantOptionsServerRequest as any).name; expect(Tenant.buildServerRequest(tenantOptionsClientRequest, createRequest)) .to.deep.equal(tenantOptionsServerRequest); @@ -190,7 +190,7 @@ describe('Tenant', () => { it('should return the expected server request with multi-factor and phone config', () => { const tenantOptionsClientRequest: CreateTenantRequest = deepCopy(clientRequest); const tenantOptionsServerRequest: TenantServerResponse = deepCopy(serverRequest); - delete tenantOptionsServerRequest.name; + delete (tenantOptionsServerRequest as any).name; expect(Tenant.buildServerRequest(tenantOptionsClientRequest, createRequest)) .to.deep.equal(tenantOptionsServerRequest); @@ -224,7 +224,7 @@ describe('Tenant', () => { const tenantOptionsClientRequest = deepCopy(clientRequest); const tenantOptionsServerRequest = deepCopy(serverRequest); tenantOptionsClientRequest.testPhoneNumbers = null; - delete tenantOptionsServerRequest.name; + delete (tenantOptionsServerRequest as any).name; tenantOptionsServerRequest.testPhoneNumbers = {}; expect(() => { diff --git a/test/unit/security-rules/security-rules.spec.ts b/test/unit/security-rules/security-rules.spec.ts index 70611d7db5..380583d4cd 100644 --- a/test/unit/security-rules/security-rules.spec.ts +++ b/test/unit/security-rules/security-rules.spec.ts @@ -825,7 +825,7 @@ describe('SecurityRules', () => { it('should resolve with RulesetMetadataList when the response contains no page token', () => { const response = deepCopy(LIST_RULESETS_RESPONSE); - delete response.nextPageToken; + delete (response as any).nextPageToken; const stub = sinon .stub(SecurityRulesApiClient.prototype, 'listRulesets') .resolves(response); diff --git a/tsconfig.json b/tsconfig.json index f70690c510..1b21a0e365 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "module": "commonjs", - "target": "es5", + "target": "es2020", "declaration": true, "sourceMap": true, "noImplicitAny": true, @@ -13,7 +13,7 @@ "strictNullChecks": true, "strictFunctionTypes": true, //"strictPropertyInitialization": true, - "lib": ["es2018"], + "lib": ["es2020"], "outDir": "lib", "stripInternal": true, "rootDir": "."