firebase-tools 11.3.0 → 11.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +8 -15
  2. package/lib/apiv2.js +5 -0
  3. package/lib/checkValidTargetFilters.js +3 -2
  4. package/lib/command.js +1 -0
  5. package/lib/commands/hosting-clone.js +5 -0
  6. package/lib/commands/login-ci.js +2 -0
  7. package/lib/database/rulesConfig.js +35 -8
  8. package/lib/deploy/functions/backend.js +6 -4
  9. package/lib/deploy/functions/build.js +107 -95
  10. package/lib/deploy/functions/ensure.js +1 -1
  11. package/lib/deploy/functions/params.js +5 -2
  12. package/lib/deploy/functions/prepare.js +3 -3
  13. package/lib/deploy/functions/pricing.js +3 -2
  14. package/lib/deploy/functions/prompts.js +1 -1
  15. package/lib/deploy/functions/release/fabricator.js +8 -7
  16. package/lib/deploy/functions/release/index.js +4 -0
  17. package/lib/deploy/functions/runtimes/discovery/parsing.js +19 -8
  18. package/lib/deploy/functions/runtimes/discovery/v1alpha1.js +115 -107
  19. package/lib/deploy/functions/runtimes/node/parseTriggers.js +53 -21
  20. package/lib/deploy/functions/services/storage.js +6 -0
  21. package/lib/deploy/hosting/convertConfig.js +87 -16
  22. package/lib/deploy/hosting/deploy.js +1 -1
  23. package/lib/deploy/index.js +1 -1
  24. package/lib/deploy/storage/prepare.js +29 -6
  25. package/lib/emulator/controller.js +0 -1
  26. package/lib/emulator/functionsEmulator.js +3 -0
  27. package/lib/emulator/functionsEmulatorRuntime.js +1 -1
  28. package/lib/emulator/functionsEmulatorShared.js +6 -11
  29. package/lib/emulator/storage/files.js +19 -22
  30. package/lib/emulator/storage/metadata.js +6 -6
  31. package/lib/emulator/storage/persistence.js +26 -12
  32. package/lib/extensions/displayExtensionInfo.js +1 -101
  33. package/lib/extensions/emulator/triggerHelper.js +2 -2
  34. package/lib/extensions/updateHelper.js +1 -7
  35. package/lib/functional.js +16 -1
  36. package/lib/functions/env.js +47 -2
  37. package/lib/gcp/cloudfunctions.js +21 -8
  38. package/lib/gcp/cloudfunctionsv2.js +43 -19
  39. package/lib/gcp/cloudscheduler.js +25 -13
  40. package/lib/gcp/cloudtasks.js +4 -3
  41. package/lib/gcp/iam.js +20 -17
  42. package/lib/gcp/proto.js +18 -6
  43. package/lib/gcp/resourceManager.js +25 -3
  44. package/lib/index.js +1 -1
  45. package/lib/previews.js +1 -1
  46. package/lib/rc.js +3 -9
  47. package/lib/requireAuth.js +4 -0
  48. package/lib/rulesDeploy.js +40 -3
  49. package/npm-shrinkwrap.json +48 -37
  50. package/package.json +7 -4
@@ -3,15 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RulesDeploy = exports.RulesetServiceType = void 0;
4
4
  const _ = require("lodash");
5
5
  const clc = require("cli-color");
6
- const fs = require("fs");
6
+ const fs = require("fs-extra");
7
7
  const gcp = require("./gcp");
8
8
  const logger_1 = require("./logger");
9
9
  const error_1 = require("./error");
10
10
  const utils = require("./utils");
11
11
  const prompt_1 = require("./prompt");
12
+ const getProjectNumber_1 = require("./getProjectNumber");
13
+ const resourceManager_1 = require("./gcp/resourceManager");
14
+ const previews_1 = require("./previews");
12
15
  const QUOTA_EXCEEDED_STATUS_CODE = 429;
13
16
  const RULESET_COUNT_LIMIT = 1000;
14
17
  const RULESETS_TO_GC = 10;
18
+ const CROSS_SERVICE_FUNCTIONS = /firestore\.(get|exists)/;
19
+ const CROSS_SERVICE_RULES_ROLE = "roles/firebaserules.firestoreServiceAgent";
15
20
  var RulesetServiceType;
16
21
  (function (RulesetServiceType) {
17
22
  RulesetServiceType["CLOUD_FIRESTORE"] = "cloud.firestore";
@@ -54,17 +59,49 @@ class RulesDeploy {
54
59
  }
55
60
  return { latestName, latestContent };
56
61
  }
62
+ async checkStorageRulesIamPermissions(rulesContent) {
63
+ if ((rulesContent === null || rulesContent === void 0 ? void 0 : rulesContent.match(CROSS_SERVICE_FUNCTIONS)) === null) {
64
+ return;
65
+ }
66
+ if (this.options.nonInteractive) {
67
+ return;
68
+ }
69
+ const projectNumber = await (0, getProjectNumber_1.getProjectNumber)(this.options);
70
+ const saEmail = `service-${projectNumber}@gcp-sa-firebasestorage.iam.gserviceaccount.com`;
71
+ try {
72
+ if (await (0, resourceManager_1.serviceAccountHasRoles)(projectNumber, saEmail, [CROSS_SERVICE_RULES_ROLE], true)) {
73
+ return;
74
+ }
75
+ const addRole = await (0, prompt_1.promptOnce)({
76
+ type: "confirm",
77
+ name: "rulesRole",
78
+ message: `Cloud Storage for Firebase needs an IAM Role to use cross-service rules. Grant the new role?`,
79
+ default: true,
80
+ }, this.options);
81
+ if (addRole) {
82
+ await (0, resourceManager_1.addServiceAccountToRoles)(projectNumber, saEmail, [CROSS_SERVICE_RULES_ROLE], true);
83
+ utils.logBullet(`${clc.bold.cyan(RulesetType[this.type] + ":")} updated service account for cross-service rules...`);
84
+ }
85
+ }
86
+ catch (e) {
87
+ logger_1.logger.warn("[rules] Error checking or updating Cloud Storage for Firebase service account permissions.");
88
+ logger_1.logger.warn("[rules] Cross-service Storage rules may not function properly", e.message);
89
+ }
90
+ }
57
91
  async createRulesets(service) {
92
+ var _a;
58
93
  const createdRulesetNames = [];
59
94
  const { latestName: latestRulesetName, latestContent: latestRulesetContent } = await this.getCurrentRules(service);
60
95
  const newRulesetsByFilename = new Map();
61
- for (const filename of Object.keys(this.rulesFiles)) {
62
- const files = this.rulesFiles[filename];
96
+ for (const [filename, files] of Object.entries(this.rulesFiles)) {
63
97
  if (latestRulesetName && _.isEqual(files, latestRulesetContent)) {
64
98
  utils.logBullet(`${clc.bold.cyan(RulesetType[this.type] + ":")} latest version of ${clc.bold(filename)} already up to date, skipping upload...`);
65
99
  this.rulesetNames[filename] = latestRulesetName;
66
100
  continue;
67
101
  }
102
+ if (previews_1.previews.crossservicerules && service === RulesetServiceType.FIREBASE_STORAGE) {
103
+ await this.checkStorageRulesIamPermissions((_a = files[0]) === null || _a === void 0 ? void 0 : _a.content);
104
+ }
68
105
  utils.logBullet(`${clc.bold.cyan(RulesetType[this.type] + ":")} uploading rules ${clc.bold(filename)}...`);
69
106
  newRulesetsByFilename.set(filename, gcp.rules.createRuleset(this.options.project, files));
70
107
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "firebase-tools",
3
- "version": "11.3.0",
3
+ "version": "11.4.2",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "firebase-tools",
9
- "version": "11.3.0",
9
+ "version": "11.4.2",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@google-cloud/pubsub": "^3.0.1",
@@ -16,7 +16,7 @@
16
16
  "body-parser": "^1.19.0",
17
17
  "chokidar": "^3.0.2",
18
18
  "cjson": "^0.3.1",
19
- "cli-color": "^2.0.2",
19
+ "cli-color": "2.0.1",
20
20
  "cli-table": "0.3.11",
21
21
  "commander": "^4.0.1",
22
22
  "configstore": "^5.0.1",
@@ -24,6 +24,7 @@
24
24
  "cross-env": "^5.1.3",
25
25
  "cross-spawn": "^7.0.1",
26
26
  "csv-parse": "^5.0.4",
27
+ "es5-ext": "0.10.53",
27
28
  "exegesis": "^4.1.0",
28
29
  "exegesis-express": "^4.0.0",
29
30
  "express": "^4.16.4",
@@ -130,7 +131,7 @@
130
131
  "eslint-plugin-prettier": "^4.0.0",
131
132
  "firebase": "^7.24.0",
132
133
  "firebase-admin": "^9.4.2",
133
- "firebase-functions": "^3.15.0",
134
+ "firebase-functions": "^3.22.0",
134
135
  "google-discovery-to-swagger": "^2.1.0",
135
136
  "mocha": "^9.1.3",
136
137
  "nock": "^13.0.5",
@@ -4205,12 +4206,12 @@
4205
4206
  }
4206
4207
  },
4207
4208
  "node_modules/cli-color": {
4208
- "version": "2.0.2",
4209
- "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.2.tgz",
4210
- "integrity": "sha512-g4JYjrTW9MGtCziFNjkqp3IMpGhnJyeB0lOtRPjQkYhXzKYr6tYnXKyEVnMzITxhpbahsEW9KsxOYIDKwcsIBw==",
4209
+ "version": "2.0.1",
4210
+ "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.1.tgz",
4211
+ "integrity": "sha512-eBbxZF6fqPUNnf7CLAFOersUnyYzv83tHFLSlts+OAHsNendaqv2tHCq+/MO+b3Y+9JeoUlIvobyxG/Z8GNeOg==",
4211
4212
  "dependencies": {
4212
4213
  "d": "^1.0.1",
4213
- "es5-ext": "^0.10.59",
4214
+ "es5-ext": "^0.10.53",
4214
4215
  "es6-iterator": "^2.0.3",
4215
4216
  "memoizee": "^0.4.15",
4216
4217
  "timers-ext": "^0.1.7"
@@ -5176,19 +5177,20 @@
5176
5177
  }
5177
5178
  },
5178
5179
  "node_modules/es5-ext": {
5179
- "version": "0.10.61",
5180
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz",
5181
- "integrity": "sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==",
5182
- "hasInstallScript": true,
5180
+ "version": "0.10.53",
5181
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
5182
+ "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
5183
5183
  "dependencies": {
5184
- "es6-iterator": "^2.0.3",
5185
- "es6-symbol": "^3.1.3",
5186
- "next-tick": "^1.1.0"
5187
- },
5188
- "engines": {
5189
- "node": ">=0.10"
5184
+ "es6-iterator": "~2.0.3",
5185
+ "es6-symbol": "~3.1.3",
5186
+ "next-tick": "~1.0.0"
5190
5187
  }
5191
5188
  },
5189
+ "node_modules/es5-ext/node_modules/next-tick": {
5190
+ "version": "1.0.0",
5191
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
5192
+ "integrity": "sha512-mc/caHeUcdjnC/boPWJefDr4KUIWQNv+tlnFnJd38QMou86QtxQzBJfxgGRzvx8jazYRqrVlaHarfO72uNxPOg=="
5193
+ },
5192
5194
  "node_modules/es6-error": {
5193
5195
  "version": "4.1.1",
5194
5196
  "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
@@ -6426,16 +6428,17 @@
6426
6428
  "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
6427
6429
  },
6428
6430
  "node_modules/firebase-functions": {
6429
- "version": "3.18.1",
6430
- "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.18.1.tgz",
6431
- "integrity": "sha512-sPYZc9U/o0MjrpL3yz0pmoviJ1SkDoMV54X1rT/O2g0JTbV9eoQZsZuRoIUeaY3gmWFcMnN5TbJsPQUVh+omtw==",
6431
+ "version": "3.22.0",
6432
+ "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.22.0.tgz",
6433
+ "integrity": "sha512-d1BxBpT95MhvVqXkpLWDvWbyuX7e2l69cFAiqG3U1XQDaMV88bM9S+Zg7H8i9pitEGFr+76ErjKgrY0n+g3ZDA==",
6432
6434
  "dev": true,
6433
6435
  "dependencies": {
6434
6436
  "@types/cors": "^2.8.5",
6435
6437
  "@types/express": "4.17.3",
6436
6438
  "cors": "^2.8.5",
6437
6439
  "express": "^4.17.1",
6438
- "lodash": "^4.17.14"
6440
+ "lodash": "^4.17.14",
6441
+ "node-fetch": "^2.6.7"
6439
6442
  },
6440
6443
  "bin": {
6441
6444
  "firebase-functions": "lib/bin/firebase-functions.js"
@@ -6444,7 +6447,7 @@
6444
6447
  "node": "^8.13.0 || >=10.10.0"
6445
6448
  },
6446
6449
  "peerDependencies": {
6447
- "firebase-admin": "^8.0.0 || ^9.0.0 || ^10.0.0"
6450
+ "firebase-admin": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0"
6448
6451
  }
6449
6452
  },
6450
6453
  "node_modules/firebase-functions/node_modules/@types/express": {
@@ -17474,12 +17477,12 @@
17474
17477
  "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw=="
17475
17478
  },
17476
17479
  "cli-color": {
17477
- "version": "2.0.2",
17478
- "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.2.tgz",
17479
- "integrity": "sha512-g4JYjrTW9MGtCziFNjkqp3IMpGhnJyeB0lOtRPjQkYhXzKYr6tYnXKyEVnMzITxhpbahsEW9KsxOYIDKwcsIBw==",
17480
+ "version": "2.0.1",
17481
+ "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.1.tgz",
17482
+ "integrity": "sha512-eBbxZF6fqPUNnf7CLAFOersUnyYzv83tHFLSlts+OAHsNendaqv2tHCq+/MO+b3Y+9JeoUlIvobyxG/Z8GNeOg==",
17480
17483
  "requires": {
17481
17484
  "d": "^1.0.1",
17482
- "es5-ext": "^0.10.59",
17485
+ "es5-ext": "^0.10.53",
17483
17486
  "es6-iterator": "^2.0.3",
17484
17487
  "memoizee": "^0.4.15",
17485
17488
  "timers-ext": "^0.1.7"
@@ -18264,13 +18267,20 @@
18264
18267
  }
18265
18268
  },
18266
18269
  "es5-ext": {
18267
- "version": "0.10.61",
18268
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz",
18269
- "integrity": "sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==",
18270
+ "version": "0.10.53",
18271
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
18272
+ "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
18270
18273
  "requires": {
18271
- "es6-iterator": "^2.0.3",
18272
- "es6-symbol": "^3.1.3",
18273
- "next-tick": "^1.1.0"
18274
+ "es6-iterator": "~2.0.3",
18275
+ "es6-symbol": "~3.1.3",
18276
+ "next-tick": "~1.0.0"
18277
+ },
18278
+ "dependencies": {
18279
+ "next-tick": {
18280
+ "version": "1.0.0",
18281
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
18282
+ "integrity": "sha512-mc/caHeUcdjnC/boPWJefDr4KUIWQNv+tlnFnJd38QMou86QtxQzBJfxgGRzvx8jazYRqrVlaHarfO72uNxPOg=="
18283
+ }
18274
18284
  }
18275
18285
  },
18276
18286
  "es6-error": {
@@ -19223,16 +19233,17 @@
19223
19233
  }
19224
19234
  },
19225
19235
  "firebase-functions": {
19226
- "version": "3.18.1",
19227
- "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.18.1.tgz",
19228
- "integrity": "sha512-sPYZc9U/o0MjrpL3yz0pmoviJ1SkDoMV54X1rT/O2g0JTbV9eoQZsZuRoIUeaY3gmWFcMnN5TbJsPQUVh+omtw==",
19236
+ "version": "3.22.0",
19237
+ "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.22.0.tgz",
19238
+ "integrity": "sha512-d1BxBpT95MhvVqXkpLWDvWbyuX7e2l69cFAiqG3U1XQDaMV88bM9S+Zg7H8i9pitEGFr+76ErjKgrY0n+g3ZDA==",
19229
19239
  "dev": true,
19230
19240
  "requires": {
19231
19241
  "@types/cors": "^2.8.5",
19232
19242
  "@types/express": "4.17.3",
19233
19243
  "cors": "^2.8.5",
19234
19244
  "express": "^4.17.1",
19235
- "lodash": "^4.17.14"
19245
+ "lodash": "^4.17.14",
19246
+ "node-fetch": "^2.6.7"
19236
19247
  },
19237
19248
  "dependencies": {
19238
19249
  "@types/express": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "firebase-tools",
3
- "version": "11.3.0",
3
+ "version": "11.4.2",
4
4
  "description": "Command-Line Interface for Firebase",
5
5
  "main": "./lib/index.js",
6
6
  "bin": {
@@ -26,10 +26,12 @@
26
26
  "test:client-integration": "bash ./scripts/client-integration-tests/run.sh",
27
27
  "test:compile": "tsc --project tsconfig.compile.json",
28
28
  "test:emulator": "bash ./scripts/emulator-tests/run.sh",
29
- "test:import-export": "bash ./scripts/emulator-import-export-tests/run.sh",
30
29
  "test:extensions-deploy": "bash ./scripts/extensions-deploy-tests/run.sh",
31
30
  "test:extensions-emulator": "bash ./scripts/extensions-emulator-tests/run.sh",
31
+ "test:functions-deploy": "bash ./scripts/functions-deploy-tests/run.sh",
32
32
  "test:hosting": "bash ./scripts/hosting-tests/run.sh",
33
+ "test:hosting-rewrites": "bash ./scripts/hosting-tests/rewrites-tests/run.sh",
34
+ "test:import-export": "bash ./scripts/emulator-import-export-tests/run.sh",
33
35
  "test:triggers-end-to-end": "bash ./scripts/triggers-end-to-end-tests/run.sh",
34
36
  "test:storage-deploy": "bash ./scripts/storage-deploy-tests/run.sh",
35
37
  "test:storage-emulator-integration": "bash ./scripts/storage-emulator-integration/run.sh"
@@ -93,7 +95,7 @@
93
95
  "body-parser": "^1.19.0",
94
96
  "chokidar": "^3.0.2",
95
97
  "cjson": "^0.3.1",
96
- "cli-color": "^2.0.2",
98
+ "cli-color": "2.0.1",
97
99
  "cli-table": "0.3.11",
98
100
  "commander": "^4.0.1",
99
101
  "configstore": "^5.0.1",
@@ -101,6 +103,7 @@
101
103
  "cross-env": "^5.1.3",
102
104
  "cross-spawn": "^7.0.1",
103
105
  "csv-parse": "^5.0.4",
106
+ "es5-ext": "0.10.53",
104
107
  "exegesis": "^4.1.0",
105
108
  "exegesis-express": "^4.0.0",
106
109
  "express": "^4.16.4",
@@ -204,7 +207,7 @@
204
207
  "eslint-plugin-prettier": "^4.0.0",
205
208
  "firebase": "^7.24.0",
206
209
  "firebase-admin": "^9.4.2",
207
- "firebase-functions": "^3.15.0",
210
+ "firebase-functions": "^3.22.0",
208
211
  "google-discovery-to-swagger": "^2.1.0",
209
212
  "mocha": "^9.1.3",
210
213
  "nock": "^13.0.5",