firebase-tools 15.1.0 → 15.2.0

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 (523) hide show
  1. package/lib/accountExporter.js +3 -5
  2. package/lib/accountImporter.js +4 -5
  3. package/lib/api.js +3 -3
  4. package/lib/apiv2.js +9 -13
  5. package/lib/appUtils.js +19 -21
  6. package/lib/appdistribution/client.js +4 -8
  7. package/lib/appdistribution/distribution.js +4 -4
  8. package/lib/appdistribution/options-parser-util.js +8 -9
  9. package/lib/appdistribution/types.js +2 -2
  10. package/lib/appdistribution/yaml_helper.js +33 -17
  11. package/lib/apphosting/app.js +8 -13
  12. package/lib/apphosting/backend.js +34 -24
  13. package/lib/apphosting/config.js +14 -14
  14. package/lib/apphosting/githubConnections.js +38 -35
  15. package/lib/apphosting/localbuilds.js +4 -6
  16. package/lib/apphosting/repo.js +24 -20
  17. package/lib/apphosting/rollout.js +12 -5
  18. package/lib/apphosting/secrets/dialogs.js +9 -9
  19. package/lib/apphosting/secrets/index.js +9 -11
  20. package/lib/apphosting/utils.js +2 -3
  21. package/lib/apphosting/yaml.js +12 -11
  22. package/lib/apptesting/ensureProjectConfigured.js +1 -2
  23. package/lib/apptesting/invokeTests.js +2 -3
  24. package/lib/apptesting/parseTestFiles.js +5 -6
  25. package/lib/apptesting/types.js +2 -2
  26. package/lib/archiveDirectory.js +1 -2
  27. package/lib/auth.js +36 -40
  28. package/lib/bin/cli.js +2 -3
  29. package/lib/bin/mcp.js +1 -2
  30. package/lib/checkMinRequiredVersion.js +1 -2
  31. package/lib/checkValidTargetFilters.js +1 -2
  32. package/lib/command.js +6 -9
  33. package/lib/commands/appdistribution-testers-list.js +2 -3
  34. package/lib/commands/apphosting-backends-list.js +4 -6
  35. package/lib/commands/apphosting-builds-create.js +2 -3
  36. package/lib/commands/apphosting-builds-get.js +1 -2
  37. package/lib/commands/apphosting-rollouts-list.js +1 -2
  38. package/lib/commands/apps-init.js +1 -1
  39. package/lib/commands/{apptesting-execute.js → apptesting-wata.js} +3 -4
  40. package/lib/commands/crashlytics-symbols-upload.js +2 -2
  41. package/lib/commands/dataconnect-execute.js +4 -4
  42. package/lib/commands/dataconnect-sdk-generate.js +5 -6
  43. package/lib/commands/dataconnect-services-list.js +7 -8
  44. package/lib/commands/dataconnect-sql-diff.js +1 -2
  45. package/lib/commands/dataconnect-sql-migrate.js +4 -3
  46. package/lib/commands/dataconnect-sql-setup.js +2 -2
  47. package/lib/commands/dataconnect-sql-shell.js +5 -1
  48. package/lib/commands/emulators-start.js +1 -2
  49. package/lib/commands/ext-configure.js +6 -4
  50. package/lib/commands/ext-dev-list.js +2 -3
  51. package/lib/commands/ext-dev-upload.js +2 -2
  52. package/lib/commands/ext-export.js +1 -1
  53. package/lib/commands/ext-info.js +2 -3
  54. package/lib/commands/ext-install.js +5 -7
  55. package/lib/commands/firestore-backups-list.js +1 -2
  56. package/lib/commands/firestore-backups-schedules-list.js +1 -2
  57. package/lib/commands/firestore-indexes-list.js +1 -2
  58. package/lib/commands/firestore-utils.js +1 -2
  59. package/lib/commands/functions-artifacts-setpolicy.js +1 -2
  60. package/lib/commands/functions-config-export.js +2 -3
  61. package/lib/commands/hosting-channel-deploy.js +2 -2
  62. package/lib/commands/hosting-clone.js +2 -3
  63. package/lib/commands/hosting-sites-create.js +1 -1
  64. package/lib/commands/index.js +2 -3
  65. package/lib/commands/init.js +4 -5
  66. package/lib/commands/internaltesting-functions-discover.js +1 -1
  67. package/lib/commands/login.js +4 -5
  68. package/lib/commands/logout.js +3 -3
  69. package/lib/commands/projects-create.js +1 -1
  70. package/lib/commands/remoteconfig-experiments-list.js +2 -3
  71. package/lib/commands/remoteconfig-get.js +1 -1
  72. package/lib/commands/remoteconfig-rollback.js +1 -2
  73. package/lib/commands/remoteconfig-rollouts-list.js +2 -3
  74. package/lib/commands/remoteconfig-versions-list.js +3 -4
  75. package/lib/commands/use.js +3 -3
  76. package/lib/config.js +4 -5
  77. package/lib/crashlytics/buildToolsJarHelper.js +3 -5
  78. package/lib/crashlytics/events.js +4 -7
  79. package/lib/crashlytics/filters.js +10 -12
  80. package/lib/crashlytics/issues.js +2 -3
  81. package/lib/crashlytics/notes.js +3 -4
  82. package/lib/crashlytics/reports.js +21 -15
  83. package/lib/crashlytics/types.js +7 -7
  84. package/lib/crashlytics/utils.js +4 -4
  85. package/lib/database/api.js +2 -3
  86. package/lib/database/import.js +4 -4
  87. package/lib/database/metadata.js +5 -6
  88. package/lib/database/rulesConfig.js +2 -3
  89. package/lib/dataconnect/build.js +10 -13
  90. package/lib/dataconnect/checkIam.js +1 -2
  91. package/lib/dataconnect/client.js +15 -18
  92. package/lib/dataconnect/dataplaneClient.js +6 -6
  93. package/lib/dataconnect/ensureApis.js +2 -3
  94. package/lib/dataconnect/errors.js +8 -11
  95. package/lib/dataconnect/filters.js +2 -3
  96. package/lib/dataconnect/freeTrial.js +3 -4
  97. package/lib/dataconnect/graphqlError.js +5 -8
  98. package/lib/dataconnect/load.js +10 -11
  99. package/lib/dataconnect/names.js +14 -18
  100. package/lib/dataconnect/prompts.js +1 -2
  101. package/lib/dataconnect/provisionCloudSql.js +13 -17
  102. package/lib/dataconnect/schemaMigration.js +60 -27
  103. package/lib/dataconnect/types.js +10 -12
  104. package/lib/dataconnect/webhook.js +3 -3
  105. package/lib/defaultCredentials.js +3 -4
  106. package/lib/deploy/apphosting/deploy.js +2 -3
  107. package/lib/deploy/apphosting/prepare.js +3 -5
  108. package/lib/deploy/apphosting/release.js +1 -1
  109. package/lib/deploy/apphosting/util.js +1 -2
  110. package/lib/deploy/database/deploy.js +1 -2
  111. package/lib/deploy/database/prepare.js +1 -2
  112. package/lib/deploy/database/release.js +1 -2
  113. package/lib/deploy/dataconnect/context.js +15 -4
  114. package/lib/deploy/dataconnect/deploy.js +5 -6
  115. package/lib/deploy/dataconnect/prepare.js +7 -9
  116. package/lib/deploy/dataconnect/release.js +7 -10
  117. package/lib/deploy/extensions/deploy.js +7 -9
  118. package/lib/deploy/extensions/deploymentSummary.js +6 -7
  119. package/lib/deploy/extensions/planner.js +15 -18
  120. package/lib/deploy/extensions/prepare.js +9 -11
  121. package/lib/deploy/extensions/release.js +10 -12
  122. package/lib/deploy/extensions/secrets.js +8 -11
  123. package/lib/deploy/extensions/tasks.js +6 -8
  124. package/lib/deploy/extensions/v2FunctionHelper.js +2 -3
  125. package/lib/deploy/extensions/validate.js +1 -2
  126. package/lib/deploy/firestore/deploy.js +3 -5
  127. package/lib/deploy/firestore/prepare.js +2 -3
  128. package/lib/deploy/firestore/release.js +3 -4
  129. package/lib/deploy/functions/backend.js +52 -42
  130. package/lib/deploy/functions/build.js +41 -15
  131. package/lib/deploy/functions/cache/applyHash.js +3 -5
  132. package/lib/deploy/functions/cache/hash.js +4 -5
  133. package/lib/deploy/functions/cel.js +3 -3
  134. package/lib/deploy/functions/checkIam.js +8 -8
  135. package/lib/deploy/functions/containerCleaner.js +10 -6
  136. package/lib/deploy/functions/deploy.js +6 -8
  137. package/lib/deploy/functions/ensure.js +6 -9
  138. package/lib/deploy/functions/functionsDeployHelper.js +10 -11
  139. package/lib/deploy/functions/params.js +10 -10
  140. package/lib/deploy/functions/prepare.js +41 -36
  141. package/lib/deploy/functions/prepareFunctionsUpload.js +24 -10
  142. package/lib/deploy/functions/pricing.js +3 -3
  143. package/lib/deploy/functions/prompts.js +7 -10
  144. package/lib/deploy/functions/release/executor.js +5 -6
  145. package/lib/deploy/functions/release/fabricator.js +76 -29
  146. package/lib/deploy/functions/release/index.js +23 -14
  147. package/lib/deploy/functions/release/planner.js +15 -14
  148. package/lib/deploy/functions/release/reporter.js +20 -20
  149. package/lib/deploy/functions/release/sourceTokenScraper.js +4 -5
  150. package/lib/deploy/functions/remoteSource.js +3 -4
  151. package/lib/deploy/functions/runtimes/discovery/index.js +9 -12
  152. package/lib/deploy/functions/runtimes/discovery/parsing.js +2 -3
  153. package/lib/deploy/functions/runtimes/discovery/v1alpha1.js +29 -10
  154. package/lib/deploy/functions/runtimes/index.js +1 -2
  155. package/lib/deploy/functions/runtimes/node/index.js +18 -9
  156. package/lib/deploy/functions/runtimes/node/parseRuntimeAndValidateSDK.js +2 -2
  157. package/lib/deploy/functions/runtimes/node/validate.js +1 -2
  158. package/lib/deploy/functions/runtimes/node/versioning.js +6 -7
  159. package/lib/deploy/functions/runtimes/python/index.js +12 -12
  160. package/lib/deploy/functions/runtimes/supported/index.js +5 -6
  161. package/lib/deploy/functions/services/auth.js +49 -36
  162. package/lib/deploy/functions/services/database.js +1 -2
  163. package/lib/deploy/functions/services/dataconnect.js +16 -2
  164. package/lib/deploy/functions/services/firebaseAlerts.js +1 -2
  165. package/lib/deploy/functions/services/firestore.js +3 -5
  166. package/lib/deploy/functions/services/index.js +2 -2
  167. package/lib/deploy/functions/services/remoteConfig.js +1 -2
  168. package/lib/deploy/functions/services/storage.js +3 -5
  169. package/lib/deploy/functions/services/testLab.js +1 -2
  170. package/lib/deploy/functions/triggerRegionHelper.js +1 -2
  171. package/lib/deploy/functions/validate.js +12 -11
  172. package/lib/deploy/hosting/convertConfig.js +38 -22
  173. package/lib/deploy/hosting/deploy.js +4 -7
  174. package/lib/deploy/hosting/hashcache.js +2 -3
  175. package/lib/deploy/hosting/prepare.js +14 -14
  176. package/lib/deploy/hosting/release.js +1 -2
  177. package/lib/deploy/index.js +7 -8
  178. package/lib/deploy/lifecycleHooks.js +3 -5
  179. package/lib/deploy/remoteconfig/deploy.js +1 -1
  180. package/lib/deploy/remoteconfig/functions.js +5 -6
  181. package/lib/deploy/remoteconfig/prepare.js +2 -3
  182. package/lib/deploy/remoteconfig/release.js +2 -2
  183. package/lib/deploy/storage/deploy.js +1 -1
  184. package/lib/deploy/storage/prepare.js +1 -1
  185. package/lib/deploy/storage/release.js +1 -1
  186. package/lib/deploymentTool.js +5 -6
  187. package/lib/detectProjectRoot.js +1 -2
  188. package/lib/downloadUtils.js +2 -3
  189. package/lib/emulator/adminSdkConfig.js +2 -3
  190. package/lib/emulator/apphosting/config.js +1 -2
  191. package/lib/emulator/apphosting/developmentServer.js +3 -3
  192. package/lib/emulator/apphosting/serve.js +20 -14
  193. package/lib/emulator/auth/cloudFunctions.js +2 -3
  194. package/lib/emulator/auth/errors.js +2 -2
  195. package/lib/emulator/auth/handlers.js +3 -4
  196. package/lib/emulator/auth/index.js +6 -6
  197. package/lib/emulator/auth/operations.js +171 -129
  198. package/lib/emulator/auth/server.js +30 -22
  199. package/lib/emulator/auth/state.js +26 -36
  200. package/lib/emulator/auth/utils.js +12 -13
  201. package/lib/emulator/commandUtils.js +20 -20
  202. package/lib/emulator/controller.js +32 -29
  203. package/lib/emulator/databaseEmulator.js +1 -2
  204. package/lib/emulator/dataconnect/pgliteServer.js +48 -104
  205. package/lib/emulator/dataconnectEmulator.js +6 -9
  206. package/lib/emulator/download.js +2 -3
  207. package/lib/emulator/downloadableEmulatorInfo.json +7 -7
  208. package/lib/emulator/downloadableEmulators.js +49 -24
  209. package/lib/emulator/emulatorLogger.js +19 -4
  210. package/lib/emulator/env.js +6 -8
  211. package/lib/emulator/eventarcEmulator.js +2 -3
  212. package/lib/emulator/eventarcEmulatorUtils.js +3 -6
  213. package/lib/emulator/extensions/postinstall.js +1 -2
  214. package/lib/emulator/extensions/validation.js +4 -7
  215. package/lib/emulator/extensionsEmulator.js +6 -9
  216. package/lib/emulator/functionsEmulator.js +89 -46
  217. package/lib/emulator/functionsEmulatorRuntime.js +1 -1
  218. package/lib/emulator/functionsEmulatorShared.js +30 -30
  219. package/lib/emulator/functionsEmulatorShell.js +4 -6
  220. package/lib/emulator/functionsEmulatorUtils.js +8 -9
  221. package/lib/emulator/functionsRuntimeWorker.js +18 -9
  222. package/lib/emulator/hub.js +41 -34
  223. package/lib/emulator/hubClient.js +1 -1
  224. package/lib/emulator/initEmulators.js +2 -3
  225. package/lib/emulator/loggingEmulator.js +2 -2
  226. package/lib/emulator/portUtils.js +4 -5
  227. package/lib/emulator/registry.js +10 -4
  228. package/lib/emulator/shared/request.js +1 -2
  229. package/lib/emulator/storage/apis/firebase.js +16 -20
  230. package/lib/emulator/storage/apis/gcloud.js +6 -9
  231. package/lib/emulator/storage/apis/shared.js +1 -2
  232. package/lib/emulator/storage/crc.js +2 -3
  233. package/lib/emulator/storage/files.js +18 -41
  234. package/lib/emulator/storage/metadata.js +10 -4
  235. package/lib/emulator/storage/multipart.js +1 -2
  236. package/lib/emulator/storage/rfc.js +1 -2
  237. package/lib/emulator/storage/rules/config.js +1 -2
  238. package/lib/emulator/storage/rules/manager.js +3 -5
  239. package/lib/emulator/storage/rules/runtime.js +15 -13
  240. package/lib/emulator/storage/rules/types.js +2 -2
  241. package/lib/emulator/storage/rules/utils.js +5 -6
  242. package/lib/emulator/storage/server.js +1 -2
  243. package/lib/emulator/storage/upload.js +3 -4
  244. package/lib/emulator/taskQueue.js +11 -4
  245. package/lib/emulator/tasksEmulator.js +11 -12
  246. package/lib/emulator/types.js +6 -6
  247. package/lib/emulator/ui.js +6 -1
  248. package/lib/ensureApiEnabled.js +7 -9
  249. package/lib/env.js +2 -3
  250. package/lib/error.js +11 -13
  251. package/lib/errorOut.js +1 -2
  252. package/lib/experiments.js +15 -18
  253. package/lib/extensions/askUserForEventsConfig.js +12 -13
  254. package/lib/extensions/askUserForParam.js +11 -12
  255. package/lib/extensions/change-log.js +4 -5
  256. package/lib/extensions/checkProjectBilling.js +1 -2
  257. package/lib/extensions/diagnose.js +1 -2
  258. package/lib/extensions/displayExtensionInfo.js +25 -32
  259. package/lib/extensions/emulator/optionsHelper.js +6 -8
  260. package/lib/extensions/emulator/specHelper.js +15 -16
  261. package/lib/extensions/emulator/triggerHelper.js +3 -5
  262. package/lib/extensions/etags.js +2 -3
  263. package/lib/extensions/export.js +7 -9
  264. package/lib/extensions/extensionsApi.js +23 -29
  265. package/lib/extensions/extensionsHelper.js +52 -80
  266. package/lib/extensions/listExtensions.js +3 -5
  267. package/lib/extensions/localHelper.js +5 -5
  268. package/lib/extensions/manifest.js +15 -16
  269. package/lib/extensions/metricsUtils.js +3 -4
  270. package/lib/extensions/paramHelper.js +21 -18
  271. package/lib/extensions/provisioningHelper.js +17 -21
  272. package/lib/extensions/publishHelpers.js +1 -2
  273. package/lib/extensions/publisherApi.js +11 -13
  274. package/lib/extensions/refs.js +6 -7
  275. package/lib/extensions/runtimes/common.js +18 -19
  276. package/lib/extensions/runtimes/node.js +5 -6
  277. package/lib/extensions/secretsUtils.js +8 -8
  278. package/lib/extensions/tos.js +7 -8
  279. package/lib/extensions/types.js +3 -3
  280. package/lib/extensions/updateHelper.js +6 -7
  281. package/lib/extensions/utils.js +6 -8
  282. package/lib/extensions/versionHelper.js +1 -2
  283. package/lib/extensions/warnings.js +6 -8
  284. package/lib/fetchMOTD.js +1 -2
  285. package/lib/fetchWebSetup.js +3 -4
  286. package/lib/filterTargets.js +1 -2
  287. package/lib/firebaseConfigValidate.js +2 -3
  288. package/lib/firestore/api-sort.js +8 -9
  289. package/lib/firestore/api-types.js +15 -15
  290. package/lib/firestore/api.js +15 -13
  291. package/lib/firestore/backupUtils.js +3 -3
  292. package/lib/firestore/checkDatabaseType.js +1 -2
  293. package/lib/firestore/delete.js +1 -2
  294. package/lib/firestore/encodeFirestoreValue.js +1 -2
  295. package/lib/firestore/fsConfig.js +1 -2
  296. package/lib/firestore/options.js +1 -1
  297. package/lib/firestore/util.js +5 -6
  298. package/lib/firestore/validator.js +4 -5
  299. package/lib/frameworks/angular/index.js +14 -15
  300. package/lib/frameworks/angular/utils.js +21 -23
  301. package/lib/frameworks/astro/index.js +7 -7
  302. package/lib/frameworks/astro/utils.js +4 -6
  303. package/lib/frameworks/compose/discover/filesystem.js +3 -3
  304. package/lib/frameworks/compose/discover/frameworkMatcher.js +4 -5
  305. package/lib/frameworks/compose/discover/index.js +1 -2
  306. package/lib/frameworks/compose/discover/runtime/node.js +8 -11
  307. package/lib/frameworks/compose/driver/docker.js +3 -5
  308. package/lib/frameworks/compose/driver/hooks.js +2 -2
  309. package/lib/frameworks/compose/driver/index.js +2 -2
  310. package/lib/frameworks/compose/driver/local.js +2 -3
  311. package/lib/frameworks/compose/index.js +5 -7
  312. package/lib/frameworks/constants.js +3 -3
  313. package/lib/frameworks/express/index.js +7 -8
  314. package/lib/frameworks/flutter/index.js +6 -7
  315. package/lib/frameworks/flutter/utils.js +4 -5
  316. package/lib/frameworks/index.js +21 -22
  317. package/lib/frameworks/next/constants.js +5 -2
  318. package/lib/frameworks/next/index.js +34 -32
  319. package/lib/frameworks/next/utils.js +40 -39
  320. package/lib/frameworks/nuxt/index.js +9 -9
  321. package/lib/frameworks/nuxt/utils.js +4 -6
  322. package/lib/frameworks/nuxt2/index.js +7 -7
  323. package/lib/frameworks/sveltekit/index.js +6 -8
  324. package/lib/frameworks/utils.js +26 -24
  325. package/lib/frameworks/vite/index.js +8 -9
  326. package/lib/fsAsync.js +1 -2
  327. package/lib/fsutils.js +5 -6
  328. package/lib/functional.js +11 -11
  329. package/lib/functions/artifacts.js +25 -22
  330. package/lib/functions/ensureTargeted.js +1 -2
  331. package/lib/functions/env.js +13 -14
  332. package/lib/functions/functionslog.js +2 -3
  333. package/lib/functions/projectConfig.js +29 -33
  334. package/lib/functions/python.js +10 -4
  335. package/lib/functions/secrets.js +32 -18
  336. package/lib/functionsConfig.js +14 -14
  337. package/lib/functionsConfigClone.js +1 -2
  338. package/lib/functionsShellCommandAction.js +2 -3
  339. package/lib/gcp/apphosting.js +43 -28
  340. package/lib/gcp/apptesting.js +2 -2
  341. package/lib/gcp/artifactregistry.js +5 -5
  342. package/lib/gcp/auth.js +11 -13
  343. package/lib/gcp/cloudbilling.js +4 -5
  344. package/lib/gcp/cloudbuild.js +10 -11
  345. package/lib/gcp/cloudfunctions.js +61 -45
  346. package/lib/gcp/cloudfunctionsv2.js +81 -43
  347. package/lib/gcp/cloudlogging.js +2 -4
  348. package/lib/gcp/cloudmonitoring.js +7 -7
  349. package/lib/gcp/cloudscheduler.js +12 -14
  350. package/lib/gcp/cloudsql/cloudsqladmin.js +18 -20
  351. package/lib/gcp/cloudsql/connect.js +14 -9
  352. package/lib/gcp/cloudsql/fbToolsAuthClient.js +5 -3
  353. package/lib/gcp/cloudsql/interactive.js +2 -3
  354. package/lib/gcp/cloudsql/permissions.js +8 -8
  355. package/lib/gcp/cloudsql/permissionsSetup.js +9 -9
  356. package/lib/gcp/cloudtasks.js +19 -18
  357. package/lib/gcp/computeEngine.js +1 -2
  358. package/lib/gcp/devConnect.js +32 -29
  359. package/lib/gcp/docker.js +2 -4
  360. package/lib/gcp/eventarc.js +5 -5
  361. package/lib/gcp/firedata.js +4 -4
  362. package/lib/gcp/firestore.js +16 -16
  363. package/lib/gcp/iam.js +11 -12
  364. package/lib/gcp/identityPlatform.js +4 -5
  365. package/lib/gcp/k8s.js +1 -2
  366. package/lib/gcp/location.js +2 -2
  367. package/lib/gcp/proto.js +10 -11
  368. package/lib/gcp/pubsub.js +4 -5
  369. package/lib/gcp/resourceManager.js +5 -5
  370. package/lib/gcp/rules.js +13 -14
  371. package/lib/gcp/run.js +24 -31
  372. package/lib/gcp/runv2.js +39 -27
  373. package/lib/gcp/secretManager.js +60 -39
  374. package/lib/gcp/serviceusage.js +8 -4
  375. package/lib/gcp/storage.js +22 -20
  376. package/lib/gemini/fdcExperience.js +5 -5
  377. package/lib/getDefaultDatabaseInstance.js +2 -4
  378. package/lib/getDefaultHostingSite.js +3 -4
  379. package/lib/getProjectNumber.js +1 -2
  380. package/lib/hosting/api.js +32 -36
  381. package/lib/hosting/cloudRunProxy.js +2 -3
  382. package/lib/hosting/config.js +17 -17
  383. package/lib/hosting/expireUtils.js +3 -3
  384. package/lib/hosting/functionsProxy.js +1 -2
  385. package/lib/hosting/implicitInit.js +1 -2
  386. package/lib/hosting/initMiddleware.js +1 -2
  387. package/lib/hosting/interactive.js +1 -2
  388. package/lib/hosting/proxy.js +3 -5
  389. package/lib/hosting/runTags.js +8 -11
  390. package/lib/init/features/account.js +1 -2
  391. package/lib/init/features/ailogic/index.js +3 -5
  392. package/lib/init/features/ailogic/utils.js +6 -8
  393. package/lib/init/features/aitools/claude.js +1 -2
  394. package/lib/init/features/aitools/cursor.js +1 -2
  395. package/lib/init/features/aitools/gemini.js +1 -1
  396. package/lib/init/features/aitools/promptUpdater.js +10 -12
  397. package/lib/init/features/aitools.js +1 -2
  398. package/lib/init/features/apphosting.js +3 -4
  399. package/lib/init/features/apptesting/index.js +9 -9
  400. package/lib/init/features/database.js +4 -5
  401. package/lib/init/features/dataconnect/create_app.js +3 -4
  402. package/lib/init/features/dataconnect/index.js +25 -22
  403. package/lib/init/features/dataconnect/resolver.js +6 -10
  404. package/lib/init/features/dataconnect/sdk.js +31 -24
  405. package/lib/init/features/emulators.js +7 -6
  406. package/lib/init/features/extensions/index.js +3 -5
  407. package/lib/init/features/firestore/index.js +7 -9
  408. package/lib/init/features/firestore/indexes.js +2 -2
  409. package/lib/init/features/firestore/rules.js +3 -3
  410. package/lib/init/features/functions/index.js +3 -5
  411. package/lib/init/features/functions/javascript.js +1 -2
  412. package/lib/init/features/functions/npm-dependencies.js +1 -2
  413. package/lib/init/features/functions/python.js +1 -2
  414. package/lib/init/features/functions/typescript.js +1 -2
  415. package/lib/init/features/genkit/index.js +44 -18
  416. package/lib/init/features/hosting/github.js +6 -8
  417. package/lib/init/features/hosting/index.js +10 -13
  418. package/lib/init/features/project.js +4 -7
  419. package/lib/init/features/remoteconfig.js +1 -2
  420. package/lib/init/features/storage.js +3 -5
  421. package/lib/init/index.js +4 -7
  422. package/lib/init/spawn.js +7 -9
  423. package/lib/listFiles.js +1 -2
  424. package/lib/loadCJSON.js +1 -2
  425. package/lib/localFunction.js +14 -15
  426. package/lib/logError.js +1 -2
  427. package/lib/logger.js +7 -7
  428. package/lib/management/apps.js +22 -22
  429. package/lib/management/database.js +11 -12
  430. package/lib/management/projects.js +57 -56
  431. package/lib/management/provisioning/errorHandler.js +3 -5
  432. package/lib/management/provisioning/provision.js +15 -9
  433. package/lib/management/studio.js +2 -3
  434. package/lib/mcp/errors.js +4 -4
  435. package/lib/mcp/index.js +16 -23
  436. package/lib/mcp/prompt.js +1 -2
  437. package/lib/mcp/prompts/core/consult.js +2 -3
  438. package/lib/mcp/prompts/crashlytics/connect.js +15 -122
  439. package/lib/mcp/prompts/dataconnect/schema.js +3 -3
  440. package/lib/mcp/prompts/index.js +8 -10
  441. package/lib/mcp/resource.js +3 -15
  442. package/lib/mcp/resources/guides/app_id.js +39 -0
  443. package/lib/mcp/resources/guides/crashlytics_connect.js +51 -0
  444. package/lib/mcp/resources/guides/crashlytics_investigations.js +51 -0
  445. package/lib/mcp/resources/guides/crashlytics_issues.js +42 -0
  446. package/lib/mcp/resources/guides/crashlytics_reports.js +112 -0
  447. package/lib/mcp/resources/index.js +11 -3
  448. package/lib/mcp/tool.js +3 -15
  449. package/lib/mcp/tools/apphosting/fetch_logs.js +3 -4
  450. package/lib/mcp/tools/apphosting/list_backends.js +1 -1
  451. package/lib/mcp/tools/auth/get_users.js +5 -16
  452. package/lib/mcp/tools/core/create_android_sha.js +4 -1
  453. package/lib/mcp/tools/core/get_environment.js +3 -3
  454. package/lib/mcp/tools/core/get_sdk_config.js +4 -5
  455. package/lib/mcp/tools/core/get_security_rules.js +1 -2
  456. package/lib/mcp/tools/core/init.js +2 -2
  457. package/lib/mcp/tools/core/logout.js +1 -1
  458. package/lib/mcp/tools/core/read_resources.js +2 -2
  459. package/lib/mcp/tools/core/validate_security_rules.js +1 -2
  460. package/lib/mcp/tools/crashlytics/events.js +43 -19
  461. package/lib/mcp/tools/crashlytics/index.js +1 -6
  462. package/lib/mcp/tools/crashlytics/issues.js +33 -12
  463. package/lib/mcp/tools/crashlytics/reports.js +66 -117
  464. package/lib/mcp/tools/dataconnect/list_services.js +2 -3
  465. package/lib/mcp/tools/firestore/converter.js +3 -5
  466. package/lib/mcp/tools/firestore/delete_document.js +1 -1
  467. package/lib/mcp/tools/functions/get_logs.js +14 -12
  468. package/lib/mcp/tools/functions/list_functions.js +1 -1
  469. package/lib/mcp/tools/index.js +17 -9
  470. package/lib/mcp/util/apptesting/availability.js +1 -2
  471. package/lib/mcp/util/availability.js +1 -2
  472. package/lib/mcp/util/crashlytics/availability.js +1 -2
  473. package/lib/mcp/util/dataconnect/compile.js +7 -6
  474. package/lib/mcp/util/dataconnect/converter.js +7 -10
  475. package/lib/mcp/util/dataconnect/emulator.js +1 -2
  476. package/lib/mcp/util.js +9 -11
  477. package/lib/messaging/sendMessage.js +1 -2
  478. package/lib/metaprogramming.js +1 -2
  479. package/lib/operation-poller.js +2 -2
  480. package/lib/profileReport.js +6 -6
  481. package/lib/profiler.js +1 -2
  482. package/lib/projectPath.js +1 -2
  483. package/lib/projectUtils.js +5 -6
  484. package/lib/prompt.js +22 -13
  485. package/lib/rc.js +5 -7
  486. package/lib/remoteconfig/deleteExperiment.js +1 -2
  487. package/lib/remoteconfig/deleteRollout.js +1 -2
  488. package/lib/remoteconfig/get.js +2 -3
  489. package/lib/remoteconfig/getExperiment.js +2 -2
  490. package/lib/remoteconfig/getRollout.js +2 -2
  491. package/lib/remoteconfig/interfaces.js +1 -1
  492. package/lib/remoteconfig/listExperiments.js +2 -2
  493. package/lib/remoteconfig/listRollouts.js +2 -2
  494. package/lib/remoteconfig/publish.js +1 -2
  495. package/lib/remoteconfig/rollback.js +1 -2
  496. package/lib/remoteconfig/versionslist.js +1 -2
  497. package/lib/requireAuth.js +4 -6
  498. package/lib/requireConfig.js +5 -8
  499. package/lib/requireDatabaseInstance.js +2 -2
  500. package/lib/requireHostingSite.js +1 -2
  501. package/lib/requireInteractive.js +1 -1
  502. package/lib/requirePermissions.js +1 -2
  503. package/lib/requireTosAcceptance.js +1 -2
  504. package/lib/responseToError.js +1 -2
  505. package/lib/rtdb.js +2 -3
  506. package/lib/rulesDeploy.js +3 -4
  507. package/lib/serve/functions.js +9 -1
  508. package/lib/serve/hosting.js +4 -5
  509. package/lib/serve/index.js +1 -2
  510. package/lib/shortenUrl.js +1 -2
  511. package/lib/templates.js +3 -4
  512. package/lib/throttler/throttler.js +3 -3
  513. package/lib/timeout.js +2 -3
  514. package/lib/track.js +23 -14
  515. package/lib/tsconfig.publish.tsbuildinfo +1 -0
  516. package/lib/unzip.js +2 -3
  517. package/lib/utils.js +62 -63
  518. package/lib/vsCodeUtils.js +2 -3
  519. package/package.json +6 -6
  520. package/templates/extensions/typescript/index.ts +1 -1
  521. package/templates/extensions/typescript/package.lint.json +1 -1
  522. package/templates/extensions/typescript/package.nolint.json +1 -1
  523. package/templates/extensions/typescript/tsconfig.json +2 -1
@@ -96,7 +96,7 @@ class FunctionsEmulator {
96
96
  this.args.disabledRuntimeFeatures.timeout = true;
97
97
  this.debugMode = true;
98
98
  }
99
- this.adminSdkConfig = Object.assign(Object.assign({}, this.args.adminSdkConfig), { projectId: this.args.projectId });
99
+ this.adminSdkConfig = { ...this.args.adminSdkConfig, projectId: this.args.projectId };
100
100
  const mode = this.debugMode ? types_1.FunctionsExecutionMode.SEQUENTIAL : types_1.FunctionsExecutionMode.AUTO;
101
101
  this.workerPools = {};
102
102
  for (const backend of this.staticBackends) {
@@ -113,7 +113,7 @@ class FunctionsEmulator {
113
113
  const mode = this.debugMode ? types_1.FunctionsExecutionMode.SEQUENTIAL : types_1.FunctionsExecutionMode.AUTO;
114
114
  const credentialEnv = await (0, env_1.getCredentialsEnvironment)(this.args.account, this.logger, "functions");
115
115
  for (const backend of this.dynamicBackends) {
116
- backend.env = Object.assign(Object.assign({}, credentialEnv), backend.env);
116
+ backend.env = { ...credentialEnv, ...backend.env };
117
117
  if (this.workerPools[backend.codebase]) {
118
118
  if (this.debugMode) {
119
119
  this.workerPools[backend.codebase].exit();
@@ -156,12 +156,11 @@ class FunctionsEmulator {
156
156
  this.workQueue.submit(work);
157
157
  };
158
158
  const multicastHandler = (req, res) => {
159
- var _a;
160
159
  const projectId = req.params.project_id;
161
160
  const rawBody = req.rawBody;
162
161
  const event = JSON.parse(rawBody.toString());
163
162
  let triggerKey;
164
- if ((_a = req.headers["content-type"]) === null || _a === void 0 ? void 0 : _a.includes("cloudevent")) {
163
+ if (req.headers["content-type"]?.includes("cloudevent")) {
165
164
  triggerKey = `${this.args.projectId}:${event.type}`;
166
165
  }
167
166
  else {
@@ -231,7 +230,11 @@ class FunctionsEmulator {
231
230
  "Content-Length": `${reqBody.length}`,
232
231
  };
233
232
  return new Promise((resolve, reject) => {
234
- const req = http.request(Object.assign(Object.assign({}, worker.runtime.conn.httpReqOpts()), { path: `/`, headers: headers }), resolve);
233
+ const req = http.request({
234
+ ...worker.runtime.conn.httpReqOpts(),
235
+ path: `/`,
236
+ headers: headers,
237
+ }, resolve);
235
238
  req.on("error", reject);
236
239
  req.write(reqBody);
237
240
  req.end();
@@ -240,7 +243,7 @@ class FunctionsEmulator {
240
243
  async start() {
241
244
  const credentialEnv = await (0, env_1.getCredentialsEnvironment)(this.args.account, this.logger, "functions");
242
245
  for (const e of this.staticBackends) {
243
- e.env = Object.assign(Object.assign({}, credentialEnv), e.env);
246
+ e.env = { ...credentialEnv, ...e.env };
244
247
  }
245
248
  if (Object.keys(this.adminSdkConfig || {}).length <= 1) {
246
249
  const adminSdkConfig = await (0, adminSdkConfig_1.getProjectAdminSdkConfigOrCached)(this.args.projectId);
@@ -259,7 +262,6 @@ class FunctionsEmulator {
259
262
  return Promise.resolve();
260
263
  }
261
264
  async connect() {
262
- var _a, _b;
263
265
  for (const backend of this.staticBackends) {
264
266
  this.logger.logLabeled("BULLET", "functions", `Watching "${backend.functionsDir}" for Cloud Functions...`);
265
267
  const watcher = chokidar.watch(backend.functionsDir, {
@@ -268,7 +270,7 @@ class FunctionsEmulator {
268
270
  /(^|[\/\\])\../,
269
271
  /.+\.log/,
270
272
  /.+?[\\\/]venv[\\\/].+?/,
271
- ...((_b = (_a = backend.ignore) === null || _a === void 0 ? void 0 : _a.map((i) => `**/${i}`)) !== null && _b !== void 0 ? _b : []),
273
+ ...(backend.ignore?.map((i) => `**/${i}`) ?? []),
272
274
  ],
273
275
  persistent: true,
274
276
  });
@@ -322,7 +324,12 @@ class FunctionsEmulator {
322
324
  emulatableBackend.runtime = runtimeDelegate.runtime;
323
325
  emulatableBackend.bin = runtimeDelegate.bin;
324
326
  const firebaseConfig = this.getFirebaseConfig();
325
- const environment = Object.assign(Object.assign(Object.assign(Object.assign({}, this.getSystemEnvs()), this.getEmulatorEnvs()), { FIREBASE_CONFIG: firebaseConfig }), emulatableBackend.env);
327
+ const environment = {
328
+ ...this.getSystemEnvs(),
329
+ ...this.getEmulatorEnvs(),
330
+ FIREBASE_CONFIG: firebaseConfig,
331
+ ...emulatableBackend.env,
332
+ };
326
333
  const userEnvOpt = {
327
334
  functionsSource: emulatableBackend.functionsDir,
328
335
  projectId: this.args.projectId,
@@ -355,7 +362,6 @@ class FunctionsEmulator {
355
362
  }
356
363
  }
357
364
  async loadTriggers(emulatableBackend, force = false) {
358
- var _a;
359
365
  let triggerDefinitions = [];
360
366
  try {
361
367
  triggerDefinitions = await this.discoverTriggers(emulatableBackend);
@@ -401,7 +407,7 @@ class FunctionsEmulator {
401
407
  });
402
408
  for (const definition of toSetup) {
403
409
  try {
404
- (0, validate_1.functionIdsAreValid)([Object.assign(Object.assign({}, definition), { id: definition.name })]);
410
+ (0, validate_1.functionIdsAreValid)([{ ...definition, id: definition.name }]);
405
411
  }
406
412
  catch (e) {
407
413
  throw new error_1.FirebaseError(`functions[${definition.id}]: Invalid function id: ${e.message}`);
@@ -470,7 +476,7 @@ class FunctionsEmulator {
470
476
  }
471
477
  }
472
478
  if (this.debugMode) {
473
- if (!((_a = emulatableBackend.runtime) === null || _a === void 0 ? void 0 : _a.startsWith("node"))) {
479
+ if (!emulatableBackend.runtime?.startsWith("node")) {
474
480
  this.logger.log("WARN", "--inspect-functions only supported for Node.js runtimes.");
475
481
  }
476
482
  else {
@@ -513,7 +519,10 @@ class FunctionsEmulator {
513
519
  return false;
514
520
  }
515
521
  const bundle = {
516
- eventTrigger: Object.assign(Object.assign({}, eventTrigger), { service: "eventarc.googleapis.com" }),
522
+ eventTrigger: {
523
+ ...eventTrigger,
524
+ service: "eventarc.googleapis.com",
525
+ },
517
526
  };
518
527
  logger_1.logger.debug(`addEventarcTrigger`, JSON.stringify(bundle));
519
528
  try {
@@ -530,7 +539,10 @@ class FunctionsEmulator {
530
539
  return Promise.resolve(false);
531
540
  }
532
541
  const bundle = {
533
- eventTrigger: Object.assign(Object.assign({}, eventTrigger), { service: "eventarc.googleapis.com" }),
542
+ eventTrigger: {
543
+ ...eventTrigger,
544
+ service: "eventarc.googleapis.com",
545
+ },
534
546
  };
535
547
  logger_1.logger.debug(`removeEventarcTrigger`, JSON.stringify(bundle));
536
548
  try {
@@ -547,7 +559,10 @@ class FunctionsEmulator {
547
559
  return false;
548
560
  }
549
561
  const bundle = {
550
- eventTrigger: Object.assign(Object.assign({}, eventTrigger), { service: "firebasealerts.googleapis.com" }),
562
+ eventTrigger: {
563
+ ...eventTrigger,
564
+ service: "firebasealerts.googleapis.com",
565
+ },
551
566
  };
552
567
  logger_1.logger.debug(`addFirealertsTrigger`, JSON.stringify(bundle));
553
568
  try {
@@ -564,7 +579,10 @@ class FunctionsEmulator {
564
579
  return false;
565
580
  }
566
581
  const bundle = {
567
- eventTrigger: Object.assign(Object.assign({}, eventTrigger), { service: "firebasealerts.googleapis.com" }),
582
+ eventTrigger: {
583
+ ...eventTrigger,
584
+ service: "firebasealerts.googleapis.com",
585
+ },
568
586
  };
569
587
  logger_1.logger.debug(`removeFirealertsTrigger`, JSON.stringify(bundle));
570
588
  try {
@@ -619,12 +637,11 @@ class FunctionsEmulator {
619
637
  return { bundle, apiPath, instance };
620
638
  }
621
639
  getV2DatabaseApiAttributes(projectId, id, key, eventTrigger, region) {
622
- var _a, _b, _c;
623
- const instance = ((_a = eventTrigger.eventFilters) === null || _a === void 0 ? void 0 : _a.instance) || ((_b = eventTrigger.eventFilterPathPatterns) === null || _b === void 0 ? void 0 : _b.instance);
640
+ const instance = eventTrigger.eventFilters?.instance || eventTrigger.eventFilterPathPatterns?.instance;
624
641
  if (!instance) {
625
642
  throw new error_1.FirebaseError("A database instance must be supplied.");
626
643
  }
627
- const ref = (_c = eventTrigger.eventFilterPathPatterns) === null || _c === void 0 ? void 0 : _c.ref;
644
+ const ref = eventTrigger.eventFilterPathPatterns?.ref;
628
645
  if (!ref) {
629
646
  throw new error_1.FirebaseError("A database reference must be supplied.");
630
647
  }
@@ -661,30 +678,32 @@ class FunctionsEmulator {
661
678
  }
662
679
  getV1FirestoreAttributes(projectId, key, eventTrigger) {
663
680
  const bundle = JSON.stringify({
664
- eventTrigger: Object.assign(Object.assign({}, eventTrigger), { service: "firestore.googleapis.com" }),
681
+ eventTrigger: {
682
+ ...eventTrigger,
683
+ service: "firestore.googleapis.com",
684
+ },
665
685
  });
666
686
  const path = `/emulator/v1/projects/${projectId}/triggers/${key}`;
667
687
  return { bundle, path };
668
688
  }
669
689
  getV2FirestoreAttributes(projectId, key, eventTrigger) {
670
- var _a, _b, _c, _d, _e, _f;
671
690
  logger_1.logger.debug("Found a v2 firestore trigger.");
672
- const database = (_a = eventTrigger.eventFilters) === null || _a === void 0 ? void 0 : _a.database;
691
+ const database = eventTrigger.eventFilters?.database;
673
692
  if (!database) {
674
693
  throw new error_1.FirebaseError(`A database must be supplied for event trigger ${key}`);
675
694
  }
676
- const namespace = (_b = eventTrigger.eventFilters) === null || _b === void 0 ? void 0 : _b.namespace;
695
+ const namespace = eventTrigger.eventFilters?.namespace;
677
696
  if (!namespace) {
678
697
  throw new error_1.FirebaseError(`A namespace must be supplied for event trigger ${key}`);
679
698
  }
680
699
  let doc;
681
700
  let match;
682
- if ((_c = eventTrigger.eventFilters) === null || _c === void 0 ? void 0 : _c.document) {
683
- doc = (_d = eventTrigger.eventFilters) === null || _d === void 0 ? void 0 : _d.document;
701
+ if (eventTrigger.eventFilters?.document) {
702
+ doc = eventTrigger.eventFilters?.document;
684
703
  match = "EXACT";
685
704
  }
686
- if ((_e = eventTrigger.eventFilterPathPatterns) === null || _e === void 0 ? void 0 : _e.document) {
687
- doc = (_f = eventTrigger.eventFilterPathPatterns) === null || _f === void 0 ? void 0 : _f.document;
705
+ if (eventTrigger.eventFilterPathPatterns?.document) {
706
+ doc = eventTrigger.eventFilterPathPatterns?.document;
688
707
  match = "PATH_PATTERN";
689
708
  }
690
709
  if (!doc) {
@@ -769,14 +788,20 @@ class FunctionsEmulator {
769
788
  return false;
770
789
  }
771
790
  if (blockingTrigger.eventType === v1_1.BEFORE_CREATE_EVENT) {
772
- this.blockingFunctionsConfig.triggers = Object.assign(Object.assign({}, this.blockingFunctionsConfig.triggers), { beforeCreate: {
791
+ this.blockingFunctionsConfig.triggers = {
792
+ ...this.blockingFunctionsConfig.triggers,
793
+ beforeCreate: {
773
794
  functionUri: url,
774
- } });
795
+ },
796
+ };
775
797
  }
776
798
  else {
777
- this.blockingFunctionsConfig.triggers = Object.assign(Object.assign({}, this.blockingFunctionsConfig.triggers), { beforeSignIn: {
799
+ this.blockingFunctionsConfig.triggers = {
800
+ ...this.blockingFunctionsConfig.triggers,
801
+ beforeSignIn: {
778
802
  functionUri: url,
779
- } });
803
+ },
804
+ };
780
805
  }
781
806
  this.blockingFunctionsConfig.forwardInboundCredentials = {
782
807
  accessToken: !!blockingTrigger.options.accessToken,
@@ -791,7 +816,10 @@ class FunctionsEmulator {
791
816
  logger_1.logger.debug(`addTaskQueueTrigger`, "TQ not running");
792
817
  return Promise.resolve(false);
793
818
  }
794
- const bundle = Object.assign(Object.assign({}, taskQueueTrigger), { defaultUri });
819
+ const bundle = {
820
+ ...taskQueueTrigger,
821
+ defaultUri,
822
+ };
795
823
  try {
796
824
  await registry_1.EmulatorRegistry.client(types_1.Emulators.TASKS).post(`/projects/${projectId}/locations/${location}/queues/${entryPoint}`, bundle);
797
825
  return true;
@@ -945,7 +973,13 @@ class FunctionsEmulator {
945
973
  });
946
974
  }
947
975
  getRuntimeEnvs(backend, trigger) {
948
- return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, this.getUserEnvs(backend)), this.getSystemEnvs(trigger)), this.getEmulatorEnvs()), { FIREBASE_CONFIG: this.getFirebaseConfig() }), backend.env);
976
+ return {
977
+ ...this.getUserEnvs(backend),
978
+ ...this.getSystemEnvs(trigger),
979
+ ...this.getEmulatorEnvs(),
980
+ FIREBASE_CONFIG: this.getFirebaseConfig(),
981
+ ...backend.env,
982
+ };
949
983
  }
950
984
  async resolveSecretEnvs(backend, trigger) {
951
985
  let secretEnvs = {};
@@ -959,13 +993,12 @@ class FunctionsEmulator {
959
993
  this.logger.logLabeled("ERROR", "functions", `Failed to read local secrets file ${secretPath}: ${e.message}`);
960
994
  }
961
995
  }
962
- const secrets = (trigger === null || trigger === void 0 ? void 0 : trigger.secretEnvironmentVariables) || backend.secretEnv;
996
+ const secrets = trigger?.secretEnvironmentVariables || backend.secretEnv;
963
997
  const accesses = secrets
964
998
  .filter((s) => !secretEnvs[s.key])
965
999
  .map(async (s) => {
966
- var _a;
967
1000
  this.logger.logLabeled("INFO", "functions", `Trying to access secret ${s.secret}@latest`);
968
- const value = await (0, secretManager_1.accessSecretVersion)(this.getProjectId(), s.secret, (_a = s.version) !== null && _a !== void 0 ? _a : "latest");
1001
+ const value = await (0, secretManager_1.accessSecretVersion)(this.getProjectId(), s.secret, s.version ?? "latest");
969
1002
  return [s.key, value];
970
1003
  });
971
1004
  const accessResults = await (0, utils_1.allSettled)(accesses);
@@ -1026,7 +1059,13 @@ class FunctionsEmulator {
1026
1059
  const socketPath = (0, functionsEmulatorShared_1.getTemporarySocketPath)();
1027
1060
  const childProcess = spawn(bin, args, {
1028
1061
  cwd: backend.functionsDir,
1029
- env: Object.assign(Object.assign(Object.assign({ node: backend.bin, METADATA_SERVER_DETECTION: "none" }, process.env), envs), { PORT: socketPath }),
1062
+ env: {
1063
+ node: backend.bin,
1064
+ METADATA_SERVER_DETECTION: "none",
1065
+ ...process.env,
1066
+ ...envs,
1067
+ PORT: socketPath,
1068
+ },
1030
1069
  stdio: ["pipe", "pipe", "pipe", "ipc"],
1031
1070
  });
1032
1071
  return Promise.resolve({
@@ -1044,7 +1083,14 @@ class FunctionsEmulator {
1044
1083
  const port = await portfinder.getPortPromise({
1045
1084
  port: 8081 + (0, utils_1.randomInt)(0, 1000),
1046
1085
  });
1047
- const childProcess = (0, python_1.runWithVirtualEnv)(args, backend.functionsDir, Object.assign(Object.assign(Object.assign({}, process.env), envs), { PYTHONUNBUFFERED: "1", DEBUG: "False", HOST: "127.0.0.1", PORT: port.toString() }));
1086
+ const childProcess = (0, python_1.runWithVirtualEnv)(args, backend.functionsDir, {
1087
+ ...process.env,
1088
+ ...envs,
1089
+ PYTHONUNBUFFERED: "1",
1090
+ DEBUG: "False",
1091
+ HOST: "127.0.0.1",
1092
+ PORT: port.toString(),
1093
+ });
1048
1094
  return {
1049
1095
  process: childProcess,
1050
1096
  events: new events_1.EventEmitter(),
@@ -1053,19 +1099,18 @@ class FunctionsEmulator {
1053
1099
  };
1054
1100
  }
1055
1101
  async startRuntime(backend, trigger) {
1056
- var _a;
1057
1102
  const runtimeEnv = this.getRuntimeEnvs(backend, trigger);
1058
1103
  const secretEnvs = await this.resolveSecretEnvs(backend, trigger);
1059
1104
  let runtime;
1060
1105
  if (backend.runtime.startsWith("python")) {
1061
- runtime = await this.startPython(backend, Object.assign(Object.assign({}, runtimeEnv), secretEnvs));
1106
+ runtime = await this.startPython(backend, { ...runtimeEnv, ...secretEnvs });
1062
1107
  }
1063
1108
  else {
1064
- runtime = await this.startNode(backend, Object.assign(Object.assign({}, runtimeEnv), secretEnvs));
1109
+ runtime = await this.startNode(backend, { ...runtimeEnv, ...secretEnvs });
1065
1110
  }
1066
1111
  const extensionLogInfo = {
1067
1112
  instanceId: backend.extensionInstanceId,
1068
- ref: (_a = backend.extensionVersion) === null || _a === void 0 ? void 0 : _a.ref,
1113
+ ref: backend.extensionVersion?.ref,
1069
1114
  };
1070
1115
  const pool = this.workerPools[backend.codebase];
1071
1116
  const worker = pool.addWorker(trigger, runtime, extensionLogInfo);
@@ -1091,14 +1136,12 @@ class FunctionsEmulator {
1091
1136
  return;
1092
1137
  }
1093
1138
  getEmulatorInfo(emulator) {
1094
- var _a;
1095
- if ((_a = this.args.remoteEmulators) === null || _a === void 0 ? void 0 : _a[emulator]) {
1139
+ if (this.args.remoteEmulators?.[emulator]) {
1096
1140
  return this.args.remoteEmulators[emulator];
1097
1141
  }
1098
1142
  return registry_1.EmulatorRegistry.getInfo(emulator);
1099
1143
  }
1100
1144
  async handleHttpsTrigger(req, res) {
1101
- var _a;
1102
1145
  const method = req.method;
1103
1146
  let triggerId = req.params.trigger_name;
1104
1147
  if (req.params.region) {
@@ -1119,7 +1162,7 @@ class FunctionsEmulator {
1119
1162
  logger_1.logger.debug(`Accepted request ${method} ${req.url} --> ${triggerId}`);
1120
1163
  let reqBody = req.rawBody;
1121
1164
  if ((0, functionsEmulatorShared_1.getSignatureType)(trigger) === "cloudevent") {
1122
- if ((_a = req.headers["content-type"]) === null || _a === void 0 ? void 0 : _a.includes("application/protobuf")) {
1165
+ if (req.headers["content-type"]?.includes("application/protobuf")) {
1123
1166
  reqBody = Uint8Array.from(atob(reqBody.toString()), (c) => c.charCodeAt(0));
1124
1167
  req.headers["content-length"] = reqBody.length.toString();
1125
1168
  }
@@ -561,7 +561,7 @@ async function main() {
561
561
  app.all(`/*`, async (req, res) => {
562
562
  try {
563
563
  const trigger = FUNCTION_TARGET_NAME.split(".").reduce((mod, functionTargetPart) => {
564
- return mod === null || mod === void 0 ? void 0 : mod[functionTargetPart];
564
+ return mod?.[functionTargetPart];
565
565
  }, functionModule);
566
566
  if (!trigger) {
567
567
  throw new Error(`Failed to find function ${FUNCTION_TARGET_NAME} in the loaded module`);
@@ -1,6 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toBackendInfo = exports.getSecretLocalPath = exports.getSignatureType = exports.formatHost = exports.findModuleRoot = exports.waitForBody = exports.getServiceFromEventType = exports.getFunctionService = exports.getTemporarySocketPath = exports.getEmulatedTriggersFromDefinitions = exports.emulatedFunctionsByRegion = exports.emulatedFunctionsFromEndpoints = exports.prepareEndpoints = exports.eventServiceImplemented = exports.EmulatedTrigger = exports.EVENTARC_SOURCE_ENV = void 0;
3
+ exports.EmulatedTrigger = exports.EVENTARC_SOURCE_ENV = void 0;
4
+ exports.eventServiceImplemented = eventServiceImplemented;
5
+ exports.prepareEndpoints = prepareEndpoints;
6
+ exports.emulatedFunctionsFromEndpoints = emulatedFunctionsFromEndpoints;
7
+ exports.emulatedFunctionsByRegion = emulatedFunctionsByRegion;
8
+ exports.getEmulatedTriggersFromDefinitions = getEmulatedTriggersFromDefinitions;
9
+ exports.getTemporarySocketPath = getTemporarySocketPath;
10
+ exports.getFunctionService = getFunctionService;
11
+ exports.getServiceFromEventType = getServiceFromEventType;
12
+ exports.waitForBody = waitForBody;
13
+ exports.findModuleRoot = findModuleRoot;
14
+ exports.formatHost = formatHost;
15
+ exports.getSignatureType = getSignatureType;
16
+ exports.getSecretLocalPath = getSecretLocalPath;
17
+ exports.toBackendInfo = toBackendInfo;
4
18
  const os = require("os");
5
19
  const path = require("path");
6
20
  const fs = require("fs");
@@ -46,7 +60,6 @@ exports.EmulatedTrigger = EmulatedTrigger;
46
60
  function eventServiceImplemented(eventType) {
47
61
  return V2_EVENTS.includes(eventType);
48
62
  }
49
- exports.eventServiceImplemented = eventServiceImplemented;
50
63
  function prepareEndpoints(endpoints) {
51
64
  const bkend = backend.of(...endpoints);
52
65
  for (const ep of endpoints) {
@@ -54,9 +67,7 @@ function prepareEndpoints(endpoints) {
54
67
  }
55
68
  (0, prepare_1.inferBlockingDetails)(bkend);
56
69
  }
57
- exports.prepareEndpoints = prepareEndpoints;
58
70
  function emulatedFunctionsFromEndpoints(endpoints) {
59
- var _a, _b, _c, _d, _e, _f, _g;
60
71
  const regionDefinitions = [];
61
72
  for (const endpoint of endpoints) {
62
73
  if (!endpoint.region) {
@@ -88,9 +99,12 @@ function emulatedFunctionsFromEndpoints(endpoints) {
88
99
  if (backend.isHttpsTriggered(endpoint)) {
89
100
  def.httpsTrigger = endpoint.httpsTrigger;
90
101
  }
102
+ else if (backend.isDataConnectGraphqlTriggered(endpoint)) {
103
+ def.httpsTrigger = endpoint.dataConnectGraphqlTrigger;
104
+ }
91
105
  else if (backend.isCallableTriggered(endpoint)) {
92
106
  def.httpsTrigger = {};
93
- def.labels = Object.assign(Object.assign({}, def.labels), { "deployment-callable": "true" });
107
+ def.labels = { ...def.labels, "deployment-callable": "true" };
94
108
  }
95
109
  else if (backend.isEventTriggered(endpoint)) {
96
110
  const eventTrigger = endpoint.eventTrigger;
@@ -129,15 +143,15 @@ function emulatedFunctionsFromEndpoints(endpoints) {
129
143
  def.httpsTrigger = {};
130
144
  def.taskQueueTrigger = {
131
145
  retryConfig: {
132
- maxAttempts: (_a = endpoint.taskQueueTrigger.retryConfig) === null || _a === void 0 ? void 0 : _a.maxAttempts,
133
- maxRetrySeconds: (_b = endpoint.taskQueueTrigger.retryConfig) === null || _b === void 0 ? void 0 : _b.maxRetrySeconds,
134
- maxBackoffSeconds: (_c = endpoint.taskQueueTrigger.retryConfig) === null || _c === void 0 ? void 0 : _c.maxBackoffSeconds,
135
- maxDoublings: (_d = endpoint.taskQueueTrigger.retryConfig) === null || _d === void 0 ? void 0 : _d.maxDoublings,
136
- minBackoffSeconds: (_e = endpoint.taskQueueTrigger.retryConfig) === null || _e === void 0 ? void 0 : _e.minBackoffSeconds,
146
+ maxAttempts: endpoint.taskQueueTrigger.retryConfig?.maxAttempts,
147
+ maxRetrySeconds: endpoint.taskQueueTrigger.retryConfig?.maxRetrySeconds,
148
+ maxBackoffSeconds: endpoint.taskQueueTrigger.retryConfig?.maxBackoffSeconds,
149
+ maxDoublings: endpoint.taskQueueTrigger.retryConfig?.maxDoublings,
150
+ minBackoffSeconds: endpoint.taskQueueTrigger.retryConfig?.minBackoffSeconds,
137
151
  },
138
152
  rateLimits: {
139
- maxConcurrentDispatches: (_f = endpoint.taskQueueTrigger.rateLimits) === null || _f === void 0 ? void 0 : _f.maxConcurrentDispatches,
140
- maxDispatchesPerSecond: (_g = endpoint.taskQueueTrigger.rateLimits) === null || _g === void 0 ? void 0 : _g.maxDispatchesPerSecond,
153
+ maxConcurrentDispatches: endpoint.taskQueueTrigger.rateLimits?.maxConcurrentDispatches,
154
+ maxDispatchesPerSecond: endpoint.taskQueueTrigger.rateLimits?.maxDispatchesPerSecond,
141
155
  },
142
156
  };
143
157
  }
@@ -147,7 +161,6 @@ function emulatedFunctionsFromEndpoints(endpoints) {
147
161
  }
148
162
  return regionDefinitions;
149
163
  }
150
- exports.emulatedFunctionsFromEndpoints = emulatedFunctionsFromEndpoints;
151
164
  function emulatedFunctionsByRegion(definitions, secretEnvVariables = []) {
152
165
  const regionDefinitions = [];
153
166
  for (const def of definitions) {
@@ -166,14 +179,12 @@ function emulatedFunctionsByRegion(definitions, secretEnvVariables = []) {
166
179
  }
167
180
  return regionDefinitions;
168
181
  }
169
- exports.emulatedFunctionsByRegion = emulatedFunctionsByRegion;
170
182
  function getEmulatedTriggersFromDefinitions(definitions, module) {
171
183
  return definitions.reduce((obj, definition) => {
172
184
  obj[definition.id] = new EmulatedTrigger(definition, module);
173
185
  return obj;
174
186
  }, {});
175
187
  }
176
- exports.getEmulatedTriggersFromDefinitions = getEmulatedTriggersFromDefinitions;
177
188
  function getTemporarySocketPath() {
178
189
  const rand = (0, crypto_1.randomBytes)(8).toString("hex");
179
190
  if (process.platform === "win32") {
@@ -183,14 +194,12 @@ function getTemporarySocketPath() {
183
194
  return path.join(os.tmpdir(), `fire_emu_${rand}.sock`);
184
195
  }
185
196
  }
186
- exports.getTemporarySocketPath = getTemporarySocketPath;
187
197
  function getFunctionService(def) {
188
- var _a;
189
198
  if (def.eventTrigger) {
190
199
  if (def.eventTrigger.channel) {
191
200
  return constants_1.Constants.SERVICE_EVENTARC;
192
201
  }
193
- return (_a = def.eventTrigger.service) !== null && _a !== void 0 ? _a : getServiceFromEventType(def.eventTrigger.eventType);
202
+ return def.eventTrigger.service ?? getServiceFromEventType(def.eventTrigger.eventType);
194
203
  }
195
204
  if (def.blockingTrigger) {
196
205
  return def.blockingTrigger.eventType;
@@ -203,7 +212,6 @@ function getFunctionService(def) {
203
212
  }
204
213
  return "unknown";
205
214
  }
206
- exports.getFunctionService = getFunctionService;
207
215
  function getServiceFromEventType(eventType) {
208
216
  if (eventType.includes("firestore")) {
209
217
  return constants_1.Constants.SERVICE_FIRESTORE;
@@ -237,7 +245,6 @@ function getServiceFromEventType(eventType) {
237
245
  }
238
246
  return "";
239
247
  }
240
- exports.getServiceFromEventType = getServiceFromEventType;
241
248
  function waitForBody(req) {
242
249
  let data = "";
243
250
  return new Promise((resolve) => {
@@ -249,7 +256,6 @@ function waitForBody(req) {
249
256
  });
250
257
  });
251
258
  }
252
- exports.waitForBody = waitForBody;
253
259
  function findModuleRoot(moduleName, filepath) {
254
260
  const hierarchy = filepath.split(path.sep);
255
261
  for (let i = 0; i < hierarchy.length; i++) {
@@ -273,7 +279,6 @@ function findModuleRoot(moduleName, filepath) {
273
279
  }
274
280
  return "";
275
281
  }
276
- exports.findModuleRoot = findModuleRoot;
277
282
  function formatHost(info) {
278
283
  const host = (0, utils_1.connectableHostname)(info.host);
279
284
  if (host.includes(":")) {
@@ -283,7 +288,6 @@ function formatHost(info) {
283
288
  return `${host}:${info.port}`;
284
289
  }
285
290
  }
286
- exports.formatHost = formatHost;
287
291
  function getSignatureType(def) {
288
292
  if (def.httpsTrigger || def.blockingTrigger) {
289
293
  return "http";
@@ -293,7 +297,6 @@ function getSignatureType(def) {
293
297
  }
294
298
  return def.platform === "gcfv2" ? "cloudevent" : "event";
295
299
  }
296
- exports.getSignatureType = getSignatureType;
297
300
  const LOCAL_SECRETS_FILE = ".secret.local";
298
301
  function getSecretLocalPath(backend, projectDir) {
299
302
  const secretsFile = backend.extensionInstanceId
@@ -304,9 +307,7 @@ function getSecretLocalPath(backend, projectDir) {
304
307
  : backend.functionsDir;
305
308
  return path.join(secretDirectory, secretsFile);
306
309
  }
307
- exports.getSecretLocalPath = getSecretLocalPath;
308
310
  function toBackendInfo(e, cf3Triggers, labels) {
309
- var _a, _b;
310
311
  const envWithSecrets = Object.assign({}, e.env);
311
312
  for (const s of e.secretEnv) {
312
313
  envWithSecrets[s.key] = backend.secretVersionName(s);
@@ -314,14 +315,14 @@ function toBackendInfo(e, cf3Triggers, labels) {
314
315
  let extensionVersion = e.extensionVersion;
315
316
  if (extensionVersion) {
316
317
  extensionVersion = (0, extensionsHelper_1.substituteParams)(extensionVersion, e.env);
317
- if ((_a = extensionVersion.spec) === null || _a === void 0 ? void 0 : _a.postinstallContent) {
318
+ if (extensionVersion.spec?.postinstallContent) {
318
319
  extensionVersion.spec.postinstallContent = (0, postinstall_1.replaceConsoleLinks)(extensionVersion.spec.postinstallContent);
319
320
  }
320
321
  }
321
322
  let extensionSpec = e.extensionSpec;
322
323
  if (extensionSpec) {
323
324
  extensionSpec = (0, extensionsHelper_1.substituteParams)(extensionSpec, e.env);
324
- if (extensionSpec === null || extensionSpec === void 0 ? void 0 : extensionSpec.postinstallContent) {
325
+ if (extensionSpec?.postinstallContent) {
325
326
  extensionSpec.postinstallContent = (0, postinstall_1.replaceConsoleLinks)(extensionSpec.postinstallContent);
326
327
  }
327
328
  }
@@ -333,7 +334,6 @@ function toBackendInfo(e, cf3Triggers, labels) {
333
334
  extensionVersion: extensionVersion,
334
335
  extensionSpec: extensionSpec,
335
336
  labels,
336
- functionTriggers: (_b = e.predefinedTriggers) !== null && _b !== void 0 ? _b : cf3Triggers.filter((t) => t.codebase === e.codebase),
337
+ functionTriggers: e.predefinedTriggers ?? cf3Triggers.filter((t) => t.codebase === e.codebase),
337
338
  }));
338
339
  }
339
- exports.toBackendInfo = toBackendInfo;
@@ -21,7 +21,6 @@ class FunctionsEmulatorShell {
21
21
  }
22
22
  }
23
23
  createLegacyEvent(eventTrigger, data, opts) {
24
- var _a, _b;
25
24
  let resource = opts.resource;
26
25
  if (typeof resource === "object" && resource.name) {
27
26
  resource = resource.name;
@@ -32,12 +31,11 @@ class FunctionsEmulatorShell {
32
31
  eventType: eventTrigger.eventType,
33
32
  resource: resource,
34
33
  params: opts.params,
35
- auth: { admin: ((_a = opts.auth) === null || _a === void 0 ? void 0 : _a.admin) || false, variable: (_b = opts.auth) === null || _b === void 0 ? void 0 : _b.variable },
34
+ auth: { admin: opts.auth?.admin || false, variable: opts.auth?.variable },
36
35
  data,
37
36
  };
38
37
  }
39
38
  createCloudEvent(eventTrigger, data, opts) {
40
- var _a, _b;
41
39
  const ce = {
42
40
  specversion: "1.0",
43
41
  datacontenttype: "application/json",
@@ -48,11 +46,11 @@ class FunctionsEmulatorShell {
48
46
  data,
49
47
  };
50
48
  if (eventTrigger.eventType.startsWith("google.cloud.storage")) {
51
- ce.source = `projects/_/buckets/${(_a = eventTrigger.eventFilters) === null || _a === void 0 ? void 0 : _a.bucket}`;
49
+ ce.source = `projects/_/buckets/${eventTrigger.eventFilters?.bucket}`;
52
50
  }
53
51
  else if (eventTrigger.eventType.startsWith("google.cloud.pubsub")) {
54
52
  ce.source = eventTrigger.eventFilters.topic;
55
- data = Object.assign(Object.assign({}, data), { messageId: uuid.v4() });
53
+ data = { ...data, messageId: uuid.v4() };
56
54
  }
57
55
  else if (eventTrigger.eventType.startsWith("google.cloud.firestore")) {
58
56
  ce.source = `projects/_/databases/(default)`;
@@ -61,7 +59,7 @@ class FunctionsEmulatorShell {
61
59
  }
62
60
  }
63
61
  else if (eventTrigger.eventType.startsWith("google.firebase.database")) {
64
- ce.source = `projects/_/locations/_/instances/${(_b = eventTrigger.eventFilterPathPatterns) === null || _b === void 0 ? void 0 : _b.instance}`;
62
+ ce.source = `projects/_/locations/_/instances/${eventTrigger.eventFilterPathPatterns?.instance}`;
65
63
  if (opts.resource) {
66
64
  ce.ref = opts.resource;
67
65
  }
@@ -1,6 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isLocalHost = exports.compareVersionStrings = exports.parseVersionString = exports.parseRuntimeVersion = exports.removePathSegments = exports.trimSlashes = exports.isValidWildcardMatch = exports.extractParamsFromPath = void 0;
3
+ exports.extractParamsFromPath = extractParamsFromPath;
4
+ exports.isValidWildcardMatch = isValidWildcardMatch;
5
+ exports.trimSlashes = trimSlashes;
6
+ exports.removePathSegments = removePathSegments;
7
+ exports.parseRuntimeVersion = parseRuntimeVersion;
8
+ exports.parseVersionString = parseVersionString;
9
+ exports.compareVersionStrings = compareVersionStrings;
10
+ exports.isLocalHost = isLocalHost;
4
11
  const wildcardRegex = new RegExp("{[^/{}]*}");
5
12
  const wildcardKeyRegex = new RegExp("^{(.+)}$");
6
13
  function extractParamsFromPath(wildcardPath, snapshotPath) {
@@ -23,7 +30,6 @@ function extractParamsFromPath(wildcardPath, snapshotPath) {
23
30
  return params;
24
31
  }, {});
25
32
  }
26
- exports.extractParamsFromPath = extractParamsFromPath;
27
33
  function isValidWildcardMatch(wildcardPath, snapshotPath) {
28
34
  const wildcardChunks = trimSlashes(wildcardPath).split("/");
29
35
  const snapshotChunks = trimSlashes(snapshotPath).split("/");
@@ -35,18 +41,15 @@ function isValidWildcardMatch(wildcardPath, snapshotPath) {
35
41
  });
36
42
  return mismatchedChunks.length === 0;
37
43
  }
38
- exports.isValidWildcardMatch = isValidWildcardMatch;
39
44
  function trimSlashes(str) {
40
45
  return str
41
46
  .split("/")
42
47
  .filter((c) => c)
43
48
  .join("/");
44
49
  }
45
- exports.trimSlashes = trimSlashes;
46
50
  function removePathSegments(path, count) {
47
51
  return trimSlashes(path).split("/").slice(count).join("/");
48
52
  }
49
- exports.removePathSegments = removePathSegments;
50
53
  function parseRuntimeVersion(runtime) {
51
54
  if (!runtime) {
52
55
  return undefined;
@@ -58,7 +61,6 @@ function parseRuntimeVersion(runtime) {
58
61
  }
59
62
  return undefined;
60
63
  }
61
- exports.parseRuntimeVersion = parseRuntimeVersion;
62
64
  function parseVersionString(version) {
63
65
  const parts = (version || "0").split(".");
64
66
  parts.push("0");
@@ -69,7 +71,6 @@ function parseVersionString(version) {
69
71
  patch: parseInt(parts[2], 10),
70
72
  };
71
73
  }
72
- exports.parseVersionString = parseVersionString;
73
74
  function compareVersionStrings(a, b) {
74
75
  const versionA = parseVersionString(a);
75
76
  const versionB = parseVersionString(b);
@@ -84,8 +85,6 @@ function compareVersionStrings(a, b) {
84
85
  }
85
86
  return 0;
86
87
  }
87
- exports.compareVersionStrings = compareVersionStrings;
88
88
  function isLocalHost(href) {
89
89
  return !!href.match(/^(http(s)?:\/\/)?(localhost|127.0.0.1|\[::1])/);
90
90
  }
91
- exports.isLocalHost = isLocalHost;