firebase-tools 11.0.1 → 11.2.1

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 (214) hide show
  1. package/lib/accountExporter.js +11 -4
  2. package/lib/accountImporter.js +93 -95
  3. package/lib/api.js +77 -218
  4. package/lib/apiv2.js +5 -4
  5. package/lib/appdistribution/client.js +7 -9
  6. package/lib/auth.js +72 -52
  7. package/lib/bin/firebase.js +42 -47
  8. package/lib/checkValidTargetFilters.js +36 -25
  9. package/lib/commands/appdistribution-distribute.js +2 -1
  10. package/lib/commands/appdistribution-testers-add.js +2 -1
  11. package/lib/commands/appdistribution-testers-remove.js +2 -1
  12. package/lib/commands/apps-android-sha-create.js +2 -1
  13. package/lib/commands/apps-android-sha-delete.js +2 -1
  14. package/lib/commands/apps-android-sha-list.js +2 -1
  15. package/lib/commands/apps-create.js +2 -1
  16. package/lib/commands/apps-list.js +2 -1
  17. package/lib/commands/apps-sdkconfig.js +2 -1
  18. package/lib/commands/auth-export.js +2 -1
  19. package/lib/commands/auth-import.js +7 -10
  20. package/lib/commands/crashlytics-symbols-upload.js +2 -1
  21. package/lib/commands/database-get.js +4 -3
  22. package/lib/commands/database-instances-create.js +2 -1
  23. package/lib/commands/database-instances-list.js +3 -3
  24. package/lib/commands/database-profile.js +4 -4
  25. package/lib/commands/database-push.js +4 -4
  26. package/lib/commands/database-remove.js +3 -3
  27. package/lib/commands/database-rules-canary.js +2 -1
  28. package/lib/commands/database-rules-get.js +2 -1
  29. package/lib/commands/database-rules-list.js +2 -1
  30. package/lib/commands/database-rules-release.js +2 -1
  31. package/lib/commands/database-rules-stage.js +2 -1
  32. package/lib/commands/database-set.js +3 -3
  33. package/lib/commands/database-settings-get.js +2 -1
  34. package/lib/commands/database-settings-set.js +2 -1
  35. package/lib/commands/database-update.js +2 -1
  36. package/lib/commands/deploy.js +26 -25
  37. package/lib/commands/emulators-exec.js +2 -1
  38. package/lib/commands/emulators-export.js +2 -1
  39. package/lib/commands/emulators-start.js +2 -1
  40. package/lib/commands/experimental-functions-shell.js +10 -8
  41. package/lib/commands/ext-configure.js +2 -1
  42. package/lib/commands/ext-dev-deprecate.js +2 -1
  43. package/lib/commands/ext-dev-emulators-exec.js +3 -2
  44. package/lib/commands/ext-dev-emulators-start.js +3 -2
  45. package/lib/commands/ext-dev-extension-delete.js +2 -1
  46. package/lib/commands/ext-dev-init.js +2 -1
  47. package/lib/commands/ext-dev-list.js +8 -8
  48. package/lib/commands/ext-dev-publish.js +2 -1
  49. package/lib/commands/ext-dev-register.js +2 -1
  50. package/lib/commands/ext-dev-undeprecate.js +2 -1
  51. package/lib/commands/ext-dev-unpublish.js +2 -1
  52. package/lib/commands/ext-dev-usage.js +2 -1
  53. package/lib/commands/ext-export.js +2 -1
  54. package/lib/commands/ext-info.js +14 -14
  55. package/lib/commands/ext-install.js +2 -1
  56. package/lib/commands/ext-list.js +2 -1
  57. package/lib/commands/ext-sources-create.js +2 -1
  58. package/lib/commands/ext-uninstall.js +2 -1
  59. package/lib/commands/ext-update.js +2 -1
  60. package/lib/commands/ext.js +4 -4
  61. package/lib/commands/firestore-delete.js +2 -1
  62. package/lib/commands/firestore-indexes-list.js +2 -1
  63. package/lib/commands/functions-config-clone.js +4 -3
  64. package/lib/commands/functions-config-export.js +2 -1
  65. package/lib/commands/functions-config-get.js +2 -1
  66. package/lib/commands/functions-config-set.js +2 -1
  67. package/lib/commands/functions-config-unset.js +2 -1
  68. package/lib/commands/functions-delete.js +3 -8
  69. package/lib/commands/functions-deletegcfartifacts.js +2 -1
  70. package/lib/commands/functions-list.js +2 -1
  71. package/lib/commands/functions-log.js +2 -1
  72. package/lib/commands/functions-secrets-access.js +2 -1
  73. package/lib/commands/functions-secrets-destroy.js +2 -1
  74. package/lib/commands/functions-secrets-get.js +2 -1
  75. package/lib/commands/functions-secrets-prune.js +2 -1
  76. package/lib/commands/functions-secrets-set.js +2 -1
  77. package/lib/commands/functions-shell.js +12 -10
  78. package/lib/commands/help.js +2 -1
  79. package/lib/commands/hosting-channel-create.js +2 -1
  80. package/lib/commands/hosting-channel-delete.js +2 -1
  81. package/lib/commands/hosting-channel-deploy.js +2 -1
  82. package/lib/commands/hosting-channel-list.js +2 -1
  83. package/lib/commands/hosting-channel-open.js +2 -1
  84. package/lib/commands/hosting-clone.js +2 -1
  85. package/lib/commands/hosting-disable.js +2 -1
  86. package/lib/commands/hosting-sites-create.js +2 -1
  87. package/lib/commands/hosting-sites-delete.js +2 -1
  88. package/lib/commands/hosting-sites-get.js +2 -1
  89. package/lib/commands/hosting-sites-list.js +2 -1
  90. package/lib/commands/index.js +23 -13
  91. package/lib/commands/init.js +47 -43
  92. package/lib/commands/login-add.js +2 -1
  93. package/lib/commands/login-ci.js +2 -1
  94. package/lib/commands/login-list.js +2 -1
  95. package/lib/commands/login-use.js +2 -1
  96. package/lib/commands/login.js +2 -1
  97. package/lib/commands/logout.js +2 -1
  98. package/lib/commands/open.js +7 -7
  99. package/lib/commands/projects-addfirebase.js +2 -1
  100. package/lib/commands/projects-create.js +2 -1
  101. package/lib/commands/projects-list.js +2 -1
  102. package/lib/commands/remoteconfig-get.js +2 -1
  103. package/lib/commands/remoteconfig-rollback.js +2 -1
  104. package/lib/commands/remoteconfig-versions-list.js +2 -1
  105. package/lib/commands/serve.js +30 -30
  106. package/lib/commands/setup-emulators-database.js +2 -1
  107. package/lib/commands/setup-emulators-firestore.js +2 -1
  108. package/lib/commands/setup-emulators-pubsub.js +2 -1
  109. package/lib/commands/setup-emulators-storage.js +2 -1
  110. package/lib/commands/setup-emulators-ui.js +2 -1
  111. package/lib/commands/target-apply.js +2 -1
  112. package/lib/commands/target-clear.js +2 -1
  113. package/lib/commands/target-remove.js +2 -1
  114. package/lib/commands/target.js +2 -1
  115. package/lib/commands/use.js +54 -53
  116. package/lib/config.js +7 -6
  117. package/lib/deploy/database/deploy.js +3 -2
  118. package/lib/deploy/database/index.js +8 -5
  119. package/lib/deploy/database/prepare.js +22 -20
  120. package/lib/deploy/database/release.js +12 -9
  121. package/lib/deploy/extensions/secrets.js +3 -3
  122. package/lib/deploy/firestore/prepare.js +2 -2
  123. package/lib/deploy/functions/build.js +33 -20
  124. package/lib/deploy/functions/ensure.js +1 -11
  125. package/lib/deploy/functions/prepare.js +3 -13
  126. package/lib/deploy/functions/prepareFunctionsUpload.js +2 -3
  127. package/lib/deploy/functions/release/fabricator.js +0 -1
  128. package/lib/deploy/functions/release/index.js +1 -5
  129. package/lib/deploy/functions/runtimes/discovery/index.js +18 -3
  130. package/lib/deploy/functions/runtimes/discovery/v1alpha1.js +188 -54
  131. package/lib/deploy/functions/runtimes/golang/index.js +2 -22
  132. package/lib/deploy/functions/runtimes/node/index.js +3 -7
  133. package/lib/deploy/functions/runtimes/node/parseTriggers.js +16 -4
  134. package/lib/deploy/functions/services/database.js +14 -0
  135. package/lib/deploy/functions/services/index.js +14 -0
  136. package/lib/deploy/index.js +3 -3
  137. package/lib/deploy/lifecycleHooks.js +27 -27
  138. package/lib/deploy/remoteconfig/prepare.js +2 -2
  139. package/lib/deploy/storage/prepare.js +1 -1
  140. package/lib/emulator/auth/apiSpec.js +14 -46
  141. package/lib/emulator/auth/index.js +1 -1
  142. package/lib/emulator/auth/operations.js +342 -93
  143. package/lib/emulator/auth/server.js +2 -2
  144. package/lib/emulator/auth/state.js +34 -32
  145. package/lib/emulator/commandUtils.js +1 -1
  146. package/lib/emulator/constants.js +1 -1
  147. package/lib/emulator/controller.js +7 -6
  148. package/lib/emulator/databaseEmulator.js +4 -4
  149. package/lib/emulator/download.js +1 -1
  150. package/lib/emulator/downloadableEmulators.js +5 -5
  151. package/lib/emulator/events/types.js +2 -3
  152. package/lib/emulator/firestoreEmulator.js +2 -2
  153. package/lib/emulator/functionsEmulator.js +31 -45
  154. package/lib/emulator/functionsEmulatorRuntime.js +12 -16
  155. package/lib/emulator/functionsEmulatorShared.js +7 -5
  156. package/lib/emulator/functionsRuntimeWorker.js +0 -6
  157. package/lib/emulator/hostingEmulator.js +1 -1
  158. package/lib/emulator/hub.js +1 -1
  159. package/lib/emulator/loggingEmulator.js +1 -1
  160. package/lib/emulator/pubsubEmulator.js +1 -1
  161. package/lib/emulator/storage/crc.js +4 -4
  162. package/lib/emulator/storage/index.js +1 -1
  163. package/lib/emulator/types.js +1 -1
  164. package/lib/errorOut.js +2 -2
  165. package/lib/extensions/askUserForConsent.js +1 -2
  166. package/lib/extensions/askUserForParam.js +15 -18
  167. package/lib/extensions/emulator/optionsHelper.js +4 -4
  168. package/lib/extensions/extensionsApi.js +1 -22
  169. package/lib/extensions/extensionsHelper.js +6 -6
  170. package/lib/extensions/listExtensions.js +9 -10
  171. package/lib/extensions/manifest.js +2 -2
  172. package/lib/extensions/resolveSource.js +11 -7
  173. package/lib/extensions/secretsUtils.js +3 -3
  174. package/lib/extensions/types.js +24 -0
  175. package/lib/extensions/updateHelper.js +1 -1
  176. package/lib/extensions/utils.js +1 -2
  177. package/lib/extensions/warnings.js +3 -3
  178. package/lib/firestore/encodeFirestoreValue.js +11 -8
  179. package/lib/fsAsync.js +3 -3
  180. package/lib/functions/events/v2.js +7 -1
  181. package/lib/functionsConfig.js +17 -14
  182. package/lib/functionsConfigClone.js +46 -46
  183. package/lib/gcp/cloudfunctions.js +2 -15
  184. package/lib/gcp/cloudfunctionsv2.js +17 -2
  185. package/lib/gcp/iam.js +1 -1
  186. package/lib/gcp/index.js +10 -10
  187. package/lib/gcp/rules.js +1 -1
  188. package/lib/gcp/runtimeconfig.js +45 -47
  189. package/lib/hosting/proxy.js +1 -1
  190. package/lib/index.js +29 -28
  191. package/lib/init/features/database.js +10 -2
  192. package/lib/init/features/functions/index.js +1 -1
  193. package/lib/init/features/functions/javascript.js +23 -20
  194. package/lib/init/features/functions/npm-dependencies.js +17 -14
  195. package/lib/init/features/functions/typescript.js +27 -24
  196. package/lib/init/features/hosting/github.js +6 -5
  197. package/lib/init/features/hosting/index.js +2 -2
  198. package/lib/loadCJSON.js +9 -6
  199. package/lib/localFunction.js +4 -4
  200. package/lib/logError.js +15 -12
  201. package/lib/parseBoltRules.js +15 -14
  202. package/lib/previews.js +1 -1
  203. package/lib/profileReport.js +504 -512
  204. package/lib/profiler.js +4 -4
  205. package/lib/prompt.js +1 -2
  206. package/lib/rc.js +1 -1
  207. package/lib/requireAuth.js +0 -1
  208. package/lib/responseToError.js +8 -5
  209. package/lib/rulesDeploy.js +2 -2
  210. package/lib/scopes.js +9 -9
  211. package/lib/serve/index.js +4 -5
  212. package/lib/utils.js +30 -6
  213. package/npm-shrinkwrap.json +537 -193
  214. package/package.json +17 -14
package/lib/fsAsync.js CHANGED
@@ -8,7 +8,7 @@ const minimatch = require("minimatch");
8
8
  async function readdirRecursiveHelper(options) {
9
9
  const dirContents = (0, fs_extra_1.readdirSync)(options.path);
10
10
  const fullPaths = dirContents.map((n) => (0, path_1.join)(options.path, n));
11
- const filteredPaths = _.reject(fullPaths, options.filter);
11
+ const filteredPaths = fullPaths.filter((p) => !options.filter(p));
12
12
  const filePromises = [];
13
13
  for (const p of filteredPaths) {
14
14
  const fstat = (0, fs_extra_1.statSync)(p);
@@ -22,12 +22,12 @@ async function readdirRecursiveHelper(options) {
22
22
  }
23
23
  const files = await Promise.all(filePromises);
24
24
  let flatFiles = _.flattenDeep(files);
25
- flatFiles = _.reject(flatFiles, (f) => _.isNull(f));
25
+ flatFiles = flatFiles.filter((f) => f !== null);
26
26
  return flatFiles;
27
27
  }
28
28
  async function readdirRecursive(options) {
29
29
  const mmopts = { matchBase: true, dot: true };
30
- const rules = _.map(options.ignore || [], (glob) => {
30
+ const rules = (options.ignore || []).map((glob) => {
31
31
  return (p) => minimatch(p, glob, mmopts);
32
32
  });
33
33
  const filter = (t) => {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FIREBASE_ALERTS_PUBLISH_EVENT = exports.STORAGE_EVENTS = exports.PUBSUB_PUBLISH_EVENT = void 0;
3
+ exports.DATABASE_EVENTS = exports.FIREBASE_ALERTS_PUBLISH_EVENT = exports.STORAGE_EVENTS = exports.PUBSUB_PUBLISH_EVENT = void 0;
4
4
  exports.PUBSUB_PUBLISH_EVENT = "google.cloud.pubsub.topic.v1.messagePublished";
5
5
  exports.STORAGE_EVENTS = [
6
6
  "google.cloud.storage.object.v1.finalized",
@@ -9,3 +9,9 @@ exports.STORAGE_EVENTS = [
9
9
  "google.cloud.storage.object.v1.metadataUpdated",
10
10
  ];
11
11
  exports.FIREBASE_ALERTS_PUBLISH_EVENT = "google.firebase.firebasealerts.alerts.v1.published";
12
+ exports.DATABASE_EVENTS = [
13
+ "google.firebase.database.ref.v1.written",
14
+ "google.firebase.database.ref.v1.created",
15
+ "google.firebase.database.ref.v1.updated",
16
+ "google.firebase.database.ref.v1.deleted",
17
+ ];
@@ -27,7 +27,7 @@ function setVariable(projectId, configId, varPath, val) {
27
27
  return runtimeconfig.variables.set(projectId, configId, varPath, val);
28
28
  }
29
29
  function isReservedNamespace(id) {
30
- return _.some(exports.RESERVED_NAMESPACES, (reserved) => {
30
+ return exports.RESERVED_NAMESPACES.some((reserved) => {
31
31
  return id.config.toLowerCase().startsWith(reserved);
32
32
  });
33
33
  }
@@ -44,7 +44,7 @@ function varNameToIds(varName) {
44
44
  }
45
45
  exports.varNameToIds = varNameToIds;
46
46
  function idsToVarName(projectId, configId, varId) {
47
- return _.join(["projects", projectId, "configs", configId, "variables", varId], "/");
47
+ return ["projects", projectId, "configs", configId, "variables", varId].join("/");
48
48
  }
49
49
  exports.idsToVarName = idsToVarName;
50
50
  function getAppEngineLocation(config) {
@@ -63,7 +63,7 @@ async function getFirebaseConfig(options) {
63
63
  exports.getFirebaseConfig = getFirebaseConfig;
64
64
  async function setVariablesRecursive(projectId, configId, varPath, val) {
65
65
  let parsed = val;
66
- if (_.isString(val)) {
66
+ if (typeof val === "string") {
67
67
  try {
68
68
  parsed = JSON.parse(val);
69
69
  }
@@ -71,8 +71,8 @@ async function setVariablesRecursive(projectId, configId, varPath, val) {
71
71
  }
72
72
  }
73
73
  if (_.isPlainObject(parsed)) {
74
- return Promise.all(_.map(parsed, (item, key) => {
75
- const newVarPath = varPath ? _.join([varPath, key], "/") : key;
74
+ return Promise.all(Object.entries(parsed).map(([key, item]) => {
75
+ const newVarPath = varPath ? [varPath, key].join("/") : key;
76
76
  return setVariablesRecursive(projectId, configId, newVarPath, item);
77
77
  }));
78
78
  }
@@ -87,7 +87,7 @@ async function materializeConfig(configName, output) {
87
87
  _.set(output, key, variable.text);
88
88
  };
89
89
  const traverseVariables = async function (variables) {
90
- return Promise.all(_.map(variables, (variable) => {
90
+ return Promise.all(variables.map((variable) => {
91
91
  return materializeVariable(variable.name);
92
92
  }));
93
93
  };
@@ -99,7 +99,10 @@ exports.materializeConfig = materializeConfig;
99
99
  async function materializeAll(projectId) {
100
100
  const output = {};
101
101
  const configs = await runtimeconfig.configs.list(projectId);
102
- await Promise.all(_.map(configs, (config) => {
102
+ if (!Array.isArray(configs) || !configs.length) {
103
+ return output;
104
+ }
105
+ await Promise.all(configs.map((config) => {
103
106
  if (config.name.match(new RegExp("configs/firebase"))) {
104
107
  return;
105
108
  }
@@ -110,7 +113,7 @@ async function materializeAll(projectId) {
110
113
  exports.materializeAll = materializeAll;
111
114
  function parseSetArgs(args) {
112
115
  const parsed = [];
113
- _.forEach(args, (arg) => {
116
+ for (const arg of args) {
114
117
  const parts = arg.split("=");
115
118
  const key = parts[0];
116
119
  if (parts.length < 2) {
@@ -129,17 +132,17 @@ function parseSetArgs(args) {
129
132
  varId: id.variable,
130
133
  val: val,
131
134
  });
132
- });
135
+ }
133
136
  return parsed;
134
137
  }
135
138
  exports.parseSetArgs = parseSetArgs;
136
139
  function parseUnsetArgs(args) {
137
140
  const parsed = [];
138
141
  let splitArgs = [];
139
- _.forEach(args, (arg) => {
140
- splitArgs = _.union(splitArgs, arg.split(","));
141
- });
142
- _.forEach(splitArgs, (key) => {
142
+ for (const arg of args) {
143
+ splitArgs = Array.from(new Set([...splitArgs, ...arg.split(",")]));
144
+ }
145
+ for (const key of splitArgs) {
143
146
  const id = keyToIds(key);
144
147
  if (isReservedNamespace(id)) {
145
148
  throw new error_1.FirebaseError("Cannot unset reserved namespace " + clc.bold(id.config));
@@ -148,7 +151,7 @@ function parseUnsetArgs(args) {
148
151
  configId: id.config,
149
152
  varId: id.variable,
150
153
  });
151
- });
154
+ }
152
155
  return parsed;
153
156
  }
154
157
  exports.parseUnsetArgs = parseUnsetArgs;
@@ -1,68 +1,68 @@
1
1
  "use strict";
2
- var _ = require("lodash");
3
- var clc = require("cli-color");
4
- var { FirebaseError } = require("./error");
5
- var functionsConfig = require("./functionsConfig");
6
- var runtimeconfig = require("./gcp/runtimeconfig");
7
- var _matchPrefix = function (short, long) {
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.functionsConfigClone = void 0;
4
+ const _ = require("lodash");
5
+ const clc = require("cli-color");
6
+ const error_1 = require("./error");
7
+ const functionsConfig = require("./functionsConfig");
8
+ const runtimeconfig = require("./gcp/runtimeconfig");
9
+ function matchPrefix(short, long) {
8
10
  if (short.length > long.length) {
9
11
  return false;
10
12
  }
11
- return _.reduce(short, function (accum, x, i) {
12
- return accum && x === long[i];
13
- }, true);
14
- };
15
- var _applyExcept = function (json, except) {
16
- _.forEach(except, function (key) {
13
+ return short.reduce((accum, x, i) => accum && x === long[i], true);
14
+ }
15
+ function applyExcept(json, except) {
16
+ for (const key of except) {
17
17
  _.unset(json, key);
18
- });
19
- };
20
- var _cloneVariable = function (varName, toProject) {
21
- return runtimeconfig.variables.get(varName).then(function (variable) {
22
- var id = functionsConfig.varNameToIds(variable.name);
18
+ }
19
+ }
20
+ function cloneVariable(varName, toProject) {
21
+ return runtimeconfig.variables.get(varName).then((variable) => {
22
+ const id = functionsConfig.varNameToIds(variable.name);
23
23
  return runtimeconfig.variables.set(toProject, id.config, id.variable, variable.text);
24
24
  });
25
- };
26
- var _cloneConfig = function (configName, toProject) {
27
- return runtimeconfig.variables.list(configName).then(function (variables) {
28
- return Promise.all(_.map(variables, function (variable) {
29
- return _cloneVariable(variable.name, toProject);
25
+ }
26
+ function cloneConfig(configName, toProject) {
27
+ return runtimeconfig.variables.list(configName).then((variables) => {
28
+ return Promise.all(variables.map((variable) => {
29
+ return cloneVariable(variable.name, toProject);
30
30
  }));
31
31
  });
32
- };
33
- var _cloneConfigOrVariable = function (key, fromProject, toProject) {
34
- var parts = key.split(".");
35
- if (_.includes(functionsConfig.RESERVED_NAMESPACES, parts[0])) {
36
- throw new FirebaseError("Cannot clone reserved namespace " + clc.bold(parts[0]));
32
+ }
33
+ async function cloneConfigOrVariable(key, fromProject, toProject) {
34
+ const parts = key.split(".");
35
+ if (functionsConfig.RESERVED_NAMESPACES.includes(parts[0])) {
36
+ throw new error_1.FirebaseError("Cannot clone reserved namespace " + clc.bold(parts[0]));
37
37
  }
38
- var configName = _.join(["projects", fromProject, "configs", parts[0]], "/");
38
+ const configName = ["projects", fromProject, "configs", parts[0]].join("/");
39
39
  if (parts.length === 1) {
40
- return _cloneConfig(configName, toProject);
40
+ return cloneConfig(configName, toProject);
41
41
  }
42
- return runtimeconfig.variables.list(configName).then(function (variables) {
43
- var promises = [];
44
- _.forEach(variables, function (variable) {
45
- var varId = functionsConfig.varNameToIds(variable.name).variable;
46
- var variablePrefixFilter = parts.slice(1);
47
- if (_matchPrefix(variablePrefixFilter, varId.split("/"))) {
48
- promises.push(_cloneVariable(variable.name, toProject));
42
+ return runtimeconfig.variables.list(configName).then((variables) => {
43
+ const promises = [];
44
+ for (const variable of variables) {
45
+ const varId = functionsConfig.varNameToIds(variable.name).variable;
46
+ const variablePrefixFilter = parts.slice(1);
47
+ if (matchPrefix(variablePrefixFilter, varId.split("/"))) {
48
+ promises.push(cloneVariable(variable.name, toProject));
49
49
  }
50
- });
50
+ }
51
51
  return Promise.all(promises);
52
52
  });
53
- };
54
- module.exports = function (fromProject, toProject, only, except) {
55
- except = except || [];
53
+ }
54
+ async function functionsConfigClone(fromProject, toProject, only, except = []) {
56
55
  if (only) {
57
- return Promise.all(_.map(only, function (key) {
58
- return _cloneConfigOrVariable(key, fromProject, toProject);
56
+ return Promise.all(only.map((key) => {
57
+ return cloneConfigOrVariable(key, fromProject, toProject);
59
58
  }));
60
59
  }
61
- return functionsConfig.materializeAll(fromProject).then(function (toClone) {
60
+ return functionsConfig.materializeAll(fromProject).then((toClone) => {
62
61
  _.unset(toClone, "firebase");
63
- _applyExcept(toClone, except);
64
- return Promise.all(_.map(toClone, function (val, configId) {
62
+ applyExcept(toClone, except);
63
+ return Promise.all(Object.entries(toClone).map(([configId, val]) => {
65
64
  return functionsConfig.setVariablesRecursive(toProject, configId, "", val);
66
65
  }));
67
66
  });
68
- };
67
+ }
68
+ exports.functionsConfigClone = functionsConfigClone;
@@ -4,7 +4,6 @@ exports.functionFromEndpoint = exports.endpointFromFunction = exports.listAllFun
4
4
  const clc = require("cli-color");
5
5
  const error_1 = require("../error");
6
6
  const logger_1 = require("../logger");
7
- const previews_1 = require("../previews");
8
7
  const backend = require("../deploy/functions/backend");
9
8
  const utils = require("../utils");
10
9
  const proto = require("./proto");
@@ -24,10 +23,6 @@ const BLOCKING_EVENT_TO_LABEL_KEY = {
24
23
  "providers/cloud.auth/eventTypes/user.beforeCreate": "before-create",
25
24
  "providers/cloud.auth/eventTypes/user.beforeSignIn": "before-sign-in",
26
25
  };
27
- function validateFunction(func) {
28
- proto.assertOneOf("Cloud Function", func, "sourceCode", "sourceArchiveUrl", "sourceRepository", "sourceUploadUrl");
29
- proto.assertOneOf("Cloud Function", func, "trigger", "httpsTrigger", "eventTrigger");
30
- }
31
26
  function functionsOpLogReject(funcName, type, err) {
32
27
  var _a, _b;
33
28
  if (((_b = (_a = err === null || err === void 0 ? void 0 : err.context) === null || _a === void 0 ? void 0 : _a.response) === null || _b === void 0 ? void 0 : _b.statusCode) === 429) {
@@ -58,11 +53,7 @@ async function createFunction(cloudFunction) {
58
53
  const apiPath = cloudFunction.name.substring(0, cloudFunction.name.lastIndexOf("/"));
59
54
  const endpoint = `/${apiPath}`;
60
55
  try {
61
- const headers = {};
62
- if (previews_1.previews.artifactregistry) {
63
- headers["X-Firebase-Artifact-Registry"] = "optin";
64
- }
65
- const res = await client.post(endpoint, cloudFunction, { headers });
56
+ const res = await client.post(endpoint, cloudFunction);
66
57
  return {
67
58
  name: res.body.name,
68
59
  type: "create",
@@ -147,12 +138,7 @@ async function updateFunction(cloudFunction) {
147
138
  const endpoint = `/${cloudFunction.name}`;
148
139
  const fieldMasks = proto.fieldMasks(cloudFunction, "labels", "environmentVariables", "secretEnvironmentVariables");
149
140
  try {
150
- const headers = {};
151
- if (previews_1.previews.artifactregistry) {
152
- headers["X-Firebase-Artifact-Registry"] = "optin";
153
- }
154
141
  const res = await client.patch(endpoint, cloudFunction, {
155
- headers,
156
142
  queryParams: {
157
143
  updateMask: fieldMasks.join(","),
158
144
  },
@@ -293,6 +279,7 @@ function functionFromEndpoint(endpoint, sourceUploadUrl) {
293
279
  sourceUploadUrl: sourceUploadUrl,
294
280
  entryPoint: endpoint.entryPoint,
295
281
  runtime: endpoint.runtime,
282
+ dockerRegistry: "ARTIFACT_REGISTRY",
296
283
  };
297
284
  proto.copyIfPresent(gcfFunction, endpoint, "labels");
298
285
  if (backend.isEventTriggered(endpoint)) {
@@ -209,6 +209,13 @@ function functionFromEndpoint(endpoint, source) {
209
209
  for (const [attribute, value] of Object.entries(endpoint.eventTrigger.eventFilters)) {
210
210
  gcfFunction.eventTrigger.eventFilters.push({ attribute, value });
211
211
  }
212
+ for (const [attribute, value] of Object.entries(endpoint.eventTrigger.eventFilterPathPatterns || {})) {
213
+ gcfFunction.eventTrigger.eventFilters.push({
214
+ attribute,
215
+ value,
216
+ operator: "match-path-pattern",
217
+ });
218
+ }
212
219
  }
213
220
  proto.renameIfPresent(gcfFunction.eventTrigger, endpoint.eventTrigger, "triggerRegion", "region");
214
221
  proto.copyIfPresent(gcfFunction.eventTrigger, endpoint.eventTrigger, "channel");
@@ -277,8 +284,16 @@ function endpointFromFunction(gcfFunction) {
277
284
  trigger.eventTrigger.eventFilters.topic = gcfFunction.eventTrigger.pubsubTopic;
278
285
  }
279
286
  else {
280
- for (const { attribute, value } of gcfFunction.eventTrigger.eventFilters || []) {
281
- trigger.eventTrigger.eventFilters[attribute] = value;
287
+ for (const eventFilter of gcfFunction.eventTrigger.eventFilters || []) {
288
+ if (eventFilter.operator === "match-path-pattern") {
289
+ if (!trigger.eventTrigger.eventFilterPathPatterns) {
290
+ trigger.eventTrigger.eventFilterPathPatterns = {};
291
+ }
292
+ trigger.eventTrigger.eventFilterPathPatterns[eventFilter.attribute] = eventFilter.value;
293
+ }
294
+ else {
295
+ trigger.eventTrigger.eventFilters[eventFilter.attribute] = eventFilter.value;
296
+ }
282
297
  }
283
298
  }
284
299
  proto.copyIfPresent(trigger.eventTrigger, gcfFunction.eventTrigger, "channel");
package/lib/gcp/iam.js CHANGED
@@ -14,7 +14,7 @@ async function createServiceAccount(projectId, accountId, description, displayNa
14
14
  displayName,
15
15
  description,
16
16
  },
17
- });
17
+ }, { skipLog: { resBody: true } });
18
18
  return response.body;
19
19
  }
20
20
  exports.createServiceAccount = createServiceAccount;
package/lib/gcp/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
- module.exports = {
3
- cloudbilling: require("./cloudbilling"),
4
- cloudfunctions: require("./cloudfunctions"),
5
- cloudscheduler: require("./cloudscheduler"),
6
- cloudlogging: require("./cloudlogging"),
7
- iam: require("./iam"),
8
- pubsub: require("./pubsub"),
9
- storage: require("./storage"),
10
- rules: require("./rules"),
11
- };
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rules = exports.storage = exports.pubsub = exports.iam = exports.cloudlogging = exports.cloudscheduler = exports.cloudfunctions = exports.cloudbilling = void 0;
4
+ exports.cloudbilling = require("./cloudbilling");
5
+ exports.cloudfunctions = require("./cloudfunctions");
6
+ exports.cloudscheduler = require("./cloudscheduler");
7
+ exports.cloudlogging = require("./cloudlogging");
8
+ exports.iam = require("./iam");
9
+ exports.pubsub = require("./pubsub");
10
+ exports.storage = require("./storage");
11
+ exports.rules = require("./rules");
package/lib/gcp/rules.js CHANGED
@@ -20,7 +20,7 @@ function _handleErrorResponse(response) {
20
20
  async function getLatestRulesetName(projectId, service) {
21
21
  const releases = await listAllReleases(projectId);
22
22
  const prefix = `projects/${projectId}/releases/${service}`;
23
- const release = _.find(releases, (r) => r.name.startsWith(prefix));
23
+ const release = releases.find((r) => r.name.startsWith(prefix));
24
24
  if (!release) {
25
25
  return null;
26
26
  }
@@ -1,66 +1,66 @@
1
1
  "use strict";
2
- const { runtimeconfigOrigin } = require("../api");
3
- const { Client } = require("../apiv2");
4
- const { logger } = require("../logger");
5
- var _ = require("lodash");
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.variables = exports.configs = void 0;
4
+ const _ = require("lodash");
5
+ const api_1 = require("../api");
6
+ const apiv2_1 = require("../apiv2");
7
+ const logger_1 = require("../logger");
6
8
  const API_VERSION = "v1beta1";
7
- const apiClient = new Client({ urlPrefix: runtimeconfigOrigin, apiVersion: API_VERSION });
8
- function _listConfigs(projectId) {
9
+ const apiClient = new apiv2_1.Client({ urlPrefix: api_1.runtimeconfigOrigin, apiVersion: API_VERSION });
10
+ function listConfigs(projectId) {
9
11
  return apiClient
10
12
  .get(`/projects/${projectId}/configs`, {
11
13
  retryCodes: [500, 503],
12
14
  })
13
- .then(function (resp) {
14
- return resp.body.configs;
15
- });
15
+ .then((resp) => resp.body.configs);
16
16
  }
17
- function _createConfig(projectId, configId) {
18
- var path = _.join(["projects", projectId, "configs"], "/");
17
+ function createConfig(projectId, configId) {
18
+ const path = ["projects", projectId, "configs"].join("/");
19
19
  return apiClient
20
20
  .post(`/projects/${projectId}/configs`, {
21
21
  name: path + "/" + configId,
22
22
  }, {
23
23
  retryCodes: [500, 503],
24
24
  })
25
- .catch(function (err) {
25
+ .catch((err) => {
26
26
  if (_.get(err, "context.response.statusCode") === 409) {
27
27
  return Promise.resolve();
28
28
  }
29
29
  return Promise.reject(err);
30
30
  });
31
31
  }
32
- function _deleteConfig(projectId, configId) {
32
+ function deleteConfig(projectId, configId) {
33
33
  return apiClient
34
34
  .delete(`/projects/${projectId}/configs/${configId}`, {
35
35
  retryCodes: [500, 503],
36
36
  })
37
- .catch(function (err) {
37
+ .catch((err) => {
38
38
  if (_.get(err, "context.response.statusCode") === 404) {
39
- logger.debug("Config already deleted.");
39
+ logger_1.logger.debug("Config already deleted.");
40
40
  return Promise.resolve();
41
41
  }
42
- return Promise.reject(err);
42
+ throw err;
43
43
  });
44
44
  }
45
- function _listVariables(configPath) {
45
+ function listVariables(configPath) {
46
46
  return apiClient
47
47
  .get(`${configPath}/variables`, {
48
48
  retryCodes: [500, 503],
49
49
  })
50
- .then(function (resp) {
50
+ .then((resp) => {
51
51
  return Promise.resolve(resp.body.variables);
52
52
  });
53
53
  }
54
- function _getVariable(varPath) {
54
+ function getVariable(varPath) {
55
55
  return apiClient
56
56
  .get(varPath, {
57
57
  retryCodes: [500, 503],
58
58
  })
59
- .then(function (resp) {
59
+ .then((resp) => {
60
60
  return Promise.resolve(resp.body);
61
61
  });
62
62
  }
63
- function _createVariable(projectId, configId, varId, value) {
63
+ function createVariable(projectId, configId, varId, value) {
64
64
  const path = `/projects/${projectId}/configs/${configId}/variables`;
65
65
  return apiClient
66
66
  .post(path, {
@@ -69,16 +69,16 @@ function _createVariable(projectId, configId, varId, value) {
69
69
  }, {
70
70
  retryCodes: [500, 503],
71
71
  })
72
- .catch(function (err) {
72
+ .catch((err) => {
73
73
  if (_.get(err, "context.response.statusCode") === 404) {
74
- return _createConfig(projectId, configId).then(function () {
75
- return _createVariable(projectId, configId, varId, value);
74
+ return createConfig(projectId, configId).then(() => {
75
+ return createVariable(projectId, configId, varId, value);
76
76
  });
77
77
  }
78
78
  return Promise.reject(err);
79
79
  });
80
80
  }
81
- function _updateVariable(projectId, configId, varId, value) {
81
+ function updateVariable(projectId, configId, varId, value) {
82
82
  const path = `/projects/${projectId}/configs/${configId}/variables/${varId}`;
83
83
  return apiClient.put(path, {
84
84
  name: path,
@@ -87,43 +87,41 @@ function _updateVariable(projectId, configId, varId, value) {
87
87
  retryCodes: [500, 503],
88
88
  });
89
89
  }
90
- function _setVariable(projectId, configId, varId, value) {
91
- var path = _.join(["projects", projectId, "configs", configId, "variables", varId], "/");
92
- return _getVariable(path)
93
- .then(function () {
94
- return _updateVariable(projectId, configId, varId, value);
90
+ function setVariable(projectId, configId, varId, value) {
91
+ const path = ["projects", projectId, "configs", configId, "variables", varId].join("/");
92
+ return getVariable(path)
93
+ .then(() => {
94
+ return updateVariable(projectId, configId, varId, value);
95
95
  })
96
- .catch(function (err) {
96
+ .catch((err) => {
97
97
  if (_.get(err, "context.response.statusCode") === 404) {
98
- return _createVariable(projectId, configId, varId, value);
98
+ return createVariable(projectId, configId, varId, value);
99
99
  }
100
100
  return Promise.reject(err);
101
101
  });
102
102
  }
103
- function _deleteVariable(projectId, configId, varId) {
103
+ function deleteVariable(projectId, configId, varId) {
104
104
  return apiClient
105
105
  .delete(`/projects/${projectId}/configs/${configId}/variables/${varId}`, {
106
106
  retryCodes: [500, 503],
107
107
  queryParams: { recursive: "true" },
108
108
  })
109
- .catch(function (err) {
109
+ .catch((err) => {
110
110
  if (_.get(err, "context.response.statusCode") === 404) {
111
- logger.debug("Variable already deleted.");
111
+ logger_1.logger.debug("Variable already deleted.");
112
112
  return Promise.resolve();
113
113
  }
114
114
  return Promise.reject(err);
115
115
  });
116
116
  }
117
- module.exports = {
118
- configs: {
119
- list: _listConfigs,
120
- create: _createConfig,
121
- delete: _deleteConfig,
122
- },
123
- variables: {
124
- list: _listVariables,
125
- get: _getVariable,
126
- set: _setVariable,
127
- delete: _deleteVariable,
128
- },
117
+ exports.configs = {
118
+ list: listConfigs,
119
+ create: createConfig,
120
+ delete: deleteConfig,
121
+ };
122
+ exports.variables = {
123
+ list: listVariables,
124
+ get: getVariable,
125
+ set: setVariable,
126
+ delete: deleteVariable,
129
127
  };
@@ -133,7 +133,7 @@ function proxyRequestHandler(url, rewriteIdentifier) {
133
133
  }
134
134
  exports.proxyRequestHandler = proxyRequestHandler;
135
135
  function errorRequestHandler(error) {
136
- return (req, res, next) => {
136
+ return (req, res) => {
137
137
  res.statusCode = 500;
138
138
  const out = `A problem occurred while trying to handle a proxied rewrite: ${error}`;
139
139
  logger_1.logger.error(out);