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": "."