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.
- package/lib/accountExporter.js +3 -5
- package/lib/accountImporter.js +4 -5
- package/lib/api.js +3 -3
- package/lib/apiv2.js +9 -13
- package/lib/appUtils.js +19 -21
- package/lib/appdistribution/client.js +4 -8
- package/lib/appdistribution/distribution.js +4 -4
- package/lib/appdistribution/options-parser-util.js +8 -9
- package/lib/appdistribution/types.js +2 -2
- package/lib/appdistribution/yaml_helper.js +33 -17
- package/lib/apphosting/app.js +8 -13
- package/lib/apphosting/backend.js +34 -24
- package/lib/apphosting/config.js +14 -14
- package/lib/apphosting/githubConnections.js +38 -35
- package/lib/apphosting/localbuilds.js +4 -6
- package/lib/apphosting/repo.js +24 -20
- package/lib/apphosting/rollout.js +12 -5
- package/lib/apphosting/secrets/dialogs.js +9 -9
- package/lib/apphosting/secrets/index.js +9 -11
- package/lib/apphosting/utils.js +2 -3
- package/lib/apphosting/yaml.js +12 -11
- package/lib/apptesting/ensureProjectConfigured.js +1 -2
- package/lib/apptesting/invokeTests.js +2 -3
- package/lib/apptesting/parseTestFiles.js +5 -6
- package/lib/apptesting/types.js +2 -2
- package/lib/archiveDirectory.js +1 -2
- package/lib/auth.js +36 -40
- package/lib/bin/cli.js +2 -3
- package/lib/bin/mcp.js +1 -2
- package/lib/checkMinRequiredVersion.js +1 -2
- package/lib/checkValidTargetFilters.js +1 -2
- package/lib/command.js +6 -9
- package/lib/commands/appdistribution-testers-list.js +2 -3
- package/lib/commands/apphosting-backends-list.js +4 -6
- package/lib/commands/apphosting-builds-create.js +2 -3
- package/lib/commands/apphosting-builds-get.js +1 -2
- package/lib/commands/apphosting-rollouts-list.js +1 -2
- package/lib/commands/apps-init.js +1 -1
- package/lib/commands/{apptesting-execute.js → apptesting-wata.js} +3 -4
- package/lib/commands/crashlytics-symbols-upload.js +2 -2
- package/lib/commands/dataconnect-execute.js +4 -4
- package/lib/commands/dataconnect-sdk-generate.js +5 -6
- package/lib/commands/dataconnect-services-list.js +7 -8
- package/lib/commands/dataconnect-sql-diff.js +1 -2
- package/lib/commands/dataconnect-sql-migrate.js +4 -3
- package/lib/commands/dataconnect-sql-setup.js +2 -2
- package/lib/commands/dataconnect-sql-shell.js +5 -1
- package/lib/commands/emulators-start.js +1 -2
- package/lib/commands/ext-configure.js +6 -4
- package/lib/commands/ext-dev-list.js +2 -3
- package/lib/commands/ext-dev-upload.js +2 -2
- package/lib/commands/ext-export.js +1 -1
- package/lib/commands/ext-info.js +2 -3
- package/lib/commands/ext-install.js +5 -7
- package/lib/commands/firestore-backups-list.js +1 -2
- package/lib/commands/firestore-backups-schedules-list.js +1 -2
- package/lib/commands/firestore-indexes-list.js +1 -2
- package/lib/commands/firestore-utils.js +1 -2
- package/lib/commands/functions-artifacts-setpolicy.js +1 -2
- package/lib/commands/functions-config-export.js +2 -3
- package/lib/commands/hosting-channel-deploy.js +2 -2
- package/lib/commands/hosting-clone.js +2 -3
- package/lib/commands/hosting-sites-create.js +1 -1
- package/lib/commands/index.js +2 -3
- package/lib/commands/init.js +4 -5
- package/lib/commands/internaltesting-functions-discover.js +1 -1
- package/lib/commands/login.js +4 -5
- package/lib/commands/logout.js +3 -3
- package/lib/commands/projects-create.js +1 -1
- package/lib/commands/remoteconfig-experiments-list.js +2 -3
- package/lib/commands/remoteconfig-get.js +1 -1
- package/lib/commands/remoteconfig-rollback.js +1 -2
- package/lib/commands/remoteconfig-rollouts-list.js +2 -3
- package/lib/commands/remoteconfig-versions-list.js +3 -4
- package/lib/commands/use.js +3 -3
- package/lib/config.js +4 -5
- package/lib/crashlytics/buildToolsJarHelper.js +3 -5
- package/lib/crashlytics/events.js +4 -7
- package/lib/crashlytics/filters.js +10 -12
- package/lib/crashlytics/issues.js +2 -3
- package/lib/crashlytics/notes.js +3 -4
- package/lib/crashlytics/reports.js +21 -15
- package/lib/crashlytics/types.js +7 -7
- package/lib/crashlytics/utils.js +4 -4
- package/lib/database/api.js +2 -3
- package/lib/database/import.js +4 -4
- package/lib/database/metadata.js +5 -6
- package/lib/database/rulesConfig.js +2 -3
- package/lib/dataconnect/build.js +10 -13
- package/lib/dataconnect/checkIam.js +1 -2
- package/lib/dataconnect/client.js +15 -18
- package/lib/dataconnect/dataplaneClient.js +6 -6
- package/lib/dataconnect/ensureApis.js +2 -3
- package/lib/dataconnect/errors.js +8 -11
- package/lib/dataconnect/filters.js +2 -3
- package/lib/dataconnect/freeTrial.js +3 -4
- package/lib/dataconnect/graphqlError.js +5 -8
- package/lib/dataconnect/load.js +10 -11
- package/lib/dataconnect/names.js +14 -18
- package/lib/dataconnect/prompts.js +1 -2
- package/lib/dataconnect/provisionCloudSql.js +13 -17
- package/lib/dataconnect/schemaMigration.js +60 -27
- package/lib/dataconnect/types.js +10 -12
- package/lib/dataconnect/webhook.js +3 -3
- package/lib/defaultCredentials.js +3 -4
- package/lib/deploy/apphosting/deploy.js +2 -3
- package/lib/deploy/apphosting/prepare.js +3 -5
- package/lib/deploy/apphosting/release.js +1 -1
- package/lib/deploy/apphosting/util.js +1 -2
- package/lib/deploy/database/deploy.js +1 -2
- package/lib/deploy/database/prepare.js +1 -2
- package/lib/deploy/database/release.js +1 -2
- package/lib/deploy/dataconnect/context.js +15 -4
- package/lib/deploy/dataconnect/deploy.js +5 -6
- package/lib/deploy/dataconnect/prepare.js +7 -9
- package/lib/deploy/dataconnect/release.js +7 -10
- package/lib/deploy/extensions/deploy.js +7 -9
- package/lib/deploy/extensions/deploymentSummary.js +6 -7
- package/lib/deploy/extensions/planner.js +15 -18
- package/lib/deploy/extensions/prepare.js +9 -11
- package/lib/deploy/extensions/release.js +10 -12
- package/lib/deploy/extensions/secrets.js +8 -11
- package/lib/deploy/extensions/tasks.js +6 -8
- package/lib/deploy/extensions/v2FunctionHelper.js +2 -3
- package/lib/deploy/extensions/validate.js +1 -2
- package/lib/deploy/firestore/deploy.js +3 -5
- package/lib/deploy/firestore/prepare.js +2 -3
- package/lib/deploy/firestore/release.js +3 -4
- package/lib/deploy/functions/backend.js +52 -42
- package/lib/deploy/functions/build.js +41 -15
- package/lib/deploy/functions/cache/applyHash.js +3 -5
- package/lib/deploy/functions/cache/hash.js +4 -5
- package/lib/deploy/functions/cel.js +3 -3
- package/lib/deploy/functions/checkIam.js +8 -8
- package/lib/deploy/functions/containerCleaner.js +10 -6
- package/lib/deploy/functions/deploy.js +6 -8
- package/lib/deploy/functions/ensure.js +6 -9
- package/lib/deploy/functions/functionsDeployHelper.js +10 -11
- package/lib/deploy/functions/params.js +10 -10
- package/lib/deploy/functions/prepare.js +41 -36
- package/lib/deploy/functions/prepareFunctionsUpload.js +24 -10
- package/lib/deploy/functions/pricing.js +3 -3
- package/lib/deploy/functions/prompts.js +7 -10
- package/lib/deploy/functions/release/executor.js +5 -6
- package/lib/deploy/functions/release/fabricator.js +76 -29
- package/lib/deploy/functions/release/index.js +23 -14
- package/lib/deploy/functions/release/planner.js +15 -14
- package/lib/deploy/functions/release/reporter.js +20 -20
- package/lib/deploy/functions/release/sourceTokenScraper.js +4 -5
- package/lib/deploy/functions/remoteSource.js +3 -4
- package/lib/deploy/functions/runtimes/discovery/index.js +9 -12
- package/lib/deploy/functions/runtimes/discovery/parsing.js +2 -3
- package/lib/deploy/functions/runtimes/discovery/v1alpha1.js +29 -10
- package/lib/deploy/functions/runtimes/index.js +1 -2
- package/lib/deploy/functions/runtimes/node/index.js +18 -9
- package/lib/deploy/functions/runtimes/node/parseRuntimeAndValidateSDK.js +2 -2
- package/lib/deploy/functions/runtimes/node/validate.js +1 -2
- package/lib/deploy/functions/runtimes/node/versioning.js +6 -7
- package/lib/deploy/functions/runtimes/python/index.js +12 -12
- package/lib/deploy/functions/runtimes/supported/index.js +5 -6
- package/lib/deploy/functions/services/auth.js +49 -36
- package/lib/deploy/functions/services/database.js +1 -2
- package/lib/deploy/functions/services/dataconnect.js +16 -2
- package/lib/deploy/functions/services/firebaseAlerts.js +1 -2
- package/lib/deploy/functions/services/firestore.js +3 -5
- package/lib/deploy/functions/services/index.js +2 -2
- package/lib/deploy/functions/services/remoteConfig.js +1 -2
- package/lib/deploy/functions/services/storage.js +3 -5
- package/lib/deploy/functions/services/testLab.js +1 -2
- package/lib/deploy/functions/triggerRegionHelper.js +1 -2
- package/lib/deploy/functions/validate.js +12 -11
- package/lib/deploy/hosting/convertConfig.js +38 -22
- package/lib/deploy/hosting/deploy.js +4 -7
- package/lib/deploy/hosting/hashcache.js +2 -3
- package/lib/deploy/hosting/prepare.js +14 -14
- package/lib/deploy/hosting/release.js +1 -2
- package/lib/deploy/index.js +7 -8
- package/lib/deploy/lifecycleHooks.js +3 -5
- package/lib/deploy/remoteconfig/deploy.js +1 -1
- package/lib/deploy/remoteconfig/functions.js +5 -6
- package/lib/deploy/remoteconfig/prepare.js +2 -3
- package/lib/deploy/remoteconfig/release.js +2 -2
- package/lib/deploy/storage/deploy.js +1 -1
- package/lib/deploy/storage/prepare.js +1 -1
- package/lib/deploy/storage/release.js +1 -1
- package/lib/deploymentTool.js +5 -6
- package/lib/detectProjectRoot.js +1 -2
- package/lib/downloadUtils.js +2 -3
- package/lib/emulator/adminSdkConfig.js +2 -3
- package/lib/emulator/apphosting/config.js +1 -2
- package/lib/emulator/apphosting/developmentServer.js +3 -3
- package/lib/emulator/apphosting/serve.js +20 -14
- package/lib/emulator/auth/cloudFunctions.js +2 -3
- package/lib/emulator/auth/errors.js +2 -2
- package/lib/emulator/auth/handlers.js +3 -4
- package/lib/emulator/auth/index.js +6 -6
- package/lib/emulator/auth/operations.js +171 -129
- package/lib/emulator/auth/server.js +30 -22
- package/lib/emulator/auth/state.js +26 -36
- package/lib/emulator/auth/utils.js +12 -13
- package/lib/emulator/commandUtils.js +20 -20
- package/lib/emulator/controller.js +32 -29
- package/lib/emulator/databaseEmulator.js +1 -2
- package/lib/emulator/dataconnect/pgliteServer.js +48 -104
- package/lib/emulator/dataconnectEmulator.js +6 -9
- package/lib/emulator/download.js +2 -3
- package/lib/emulator/downloadableEmulatorInfo.json +7 -7
- package/lib/emulator/downloadableEmulators.js +49 -24
- package/lib/emulator/emulatorLogger.js +19 -4
- package/lib/emulator/env.js +6 -8
- package/lib/emulator/eventarcEmulator.js +2 -3
- package/lib/emulator/eventarcEmulatorUtils.js +3 -6
- package/lib/emulator/extensions/postinstall.js +1 -2
- package/lib/emulator/extensions/validation.js +4 -7
- package/lib/emulator/extensionsEmulator.js +6 -9
- package/lib/emulator/functionsEmulator.js +89 -46
- package/lib/emulator/functionsEmulatorRuntime.js +1 -1
- package/lib/emulator/functionsEmulatorShared.js +30 -30
- package/lib/emulator/functionsEmulatorShell.js +4 -6
- package/lib/emulator/functionsEmulatorUtils.js +8 -9
- package/lib/emulator/functionsRuntimeWorker.js +18 -9
- package/lib/emulator/hub.js +41 -34
- package/lib/emulator/hubClient.js +1 -1
- package/lib/emulator/initEmulators.js +2 -3
- package/lib/emulator/loggingEmulator.js +2 -2
- package/lib/emulator/portUtils.js +4 -5
- package/lib/emulator/registry.js +10 -4
- package/lib/emulator/shared/request.js +1 -2
- package/lib/emulator/storage/apis/firebase.js +16 -20
- package/lib/emulator/storage/apis/gcloud.js +6 -9
- package/lib/emulator/storage/apis/shared.js +1 -2
- package/lib/emulator/storage/crc.js +2 -3
- package/lib/emulator/storage/files.js +18 -41
- package/lib/emulator/storage/metadata.js +10 -4
- package/lib/emulator/storage/multipart.js +1 -2
- package/lib/emulator/storage/rfc.js +1 -2
- package/lib/emulator/storage/rules/config.js +1 -2
- package/lib/emulator/storage/rules/manager.js +3 -5
- package/lib/emulator/storage/rules/runtime.js +15 -13
- package/lib/emulator/storage/rules/types.js +2 -2
- package/lib/emulator/storage/rules/utils.js +5 -6
- package/lib/emulator/storage/server.js +1 -2
- package/lib/emulator/storage/upload.js +3 -4
- package/lib/emulator/taskQueue.js +11 -4
- package/lib/emulator/tasksEmulator.js +11 -12
- package/lib/emulator/types.js +6 -6
- package/lib/emulator/ui.js +6 -1
- package/lib/ensureApiEnabled.js +7 -9
- package/lib/env.js +2 -3
- package/lib/error.js +11 -13
- package/lib/errorOut.js +1 -2
- package/lib/experiments.js +15 -18
- package/lib/extensions/askUserForEventsConfig.js +12 -13
- package/lib/extensions/askUserForParam.js +11 -12
- package/lib/extensions/change-log.js +4 -5
- package/lib/extensions/checkProjectBilling.js +1 -2
- package/lib/extensions/diagnose.js +1 -2
- package/lib/extensions/displayExtensionInfo.js +25 -32
- package/lib/extensions/emulator/optionsHelper.js +6 -8
- package/lib/extensions/emulator/specHelper.js +15 -16
- package/lib/extensions/emulator/triggerHelper.js +3 -5
- package/lib/extensions/etags.js +2 -3
- package/lib/extensions/export.js +7 -9
- package/lib/extensions/extensionsApi.js +23 -29
- package/lib/extensions/extensionsHelper.js +52 -80
- package/lib/extensions/listExtensions.js +3 -5
- package/lib/extensions/localHelper.js +5 -5
- package/lib/extensions/manifest.js +15 -16
- package/lib/extensions/metricsUtils.js +3 -4
- package/lib/extensions/paramHelper.js +21 -18
- package/lib/extensions/provisioningHelper.js +17 -21
- package/lib/extensions/publishHelpers.js +1 -2
- package/lib/extensions/publisherApi.js +11 -13
- package/lib/extensions/refs.js +6 -7
- package/lib/extensions/runtimes/common.js +18 -19
- package/lib/extensions/runtimes/node.js +5 -6
- package/lib/extensions/secretsUtils.js +8 -8
- package/lib/extensions/tos.js +7 -8
- package/lib/extensions/types.js +3 -3
- package/lib/extensions/updateHelper.js +6 -7
- package/lib/extensions/utils.js +6 -8
- package/lib/extensions/versionHelper.js +1 -2
- package/lib/extensions/warnings.js +6 -8
- package/lib/fetchMOTD.js +1 -2
- package/lib/fetchWebSetup.js +3 -4
- package/lib/filterTargets.js +1 -2
- package/lib/firebaseConfigValidate.js +2 -3
- package/lib/firestore/api-sort.js +8 -9
- package/lib/firestore/api-types.js +15 -15
- package/lib/firestore/api.js +15 -13
- package/lib/firestore/backupUtils.js +3 -3
- package/lib/firestore/checkDatabaseType.js +1 -2
- package/lib/firestore/delete.js +1 -2
- package/lib/firestore/encodeFirestoreValue.js +1 -2
- package/lib/firestore/fsConfig.js +1 -2
- package/lib/firestore/options.js +1 -1
- package/lib/firestore/util.js +5 -6
- package/lib/firestore/validator.js +4 -5
- package/lib/frameworks/angular/index.js +14 -15
- package/lib/frameworks/angular/utils.js +21 -23
- package/lib/frameworks/astro/index.js +7 -7
- package/lib/frameworks/astro/utils.js +4 -6
- package/lib/frameworks/compose/discover/filesystem.js +3 -3
- package/lib/frameworks/compose/discover/frameworkMatcher.js +4 -5
- package/lib/frameworks/compose/discover/index.js +1 -2
- package/lib/frameworks/compose/discover/runtime/node.js +8 -11
- package/lib/frameworks/compose/driver/docker.js +3 -5
- package/lib/frameworks/compose/driver/hooks.js +2 -2
- package/lib/frameworks/compose/driver/index.js +2 -2
- package/lib/frameworks/compose/driver/local.js +2 -3
- package/lib/frameworks/compose/index.js +5 -7
- package/lib/frameworks/constants.js +3 -3
- package/lib/frameworks/express/index.js +7 -8
- package/lib/frameworks/flutter/index.js +6 -7
- package/lib/frameworks/flutter/utils.js +4 -5
- package/lib/frameworks/index.js +21 -22
- package/lib/frameworks/next/constants.js +5 -2
- package/lib/frameworks/next/index.js +34 -32
- package/lib/frameworks/next/utils.js +40 -39
- package/lib/frameworks/nuxt/index.js +9 -9
- package/lib/frameworks/nuxt/utils.js +4 -6
- package/lib/frameworks/nuxt2/index.js +7 -7
- package/lib/frameworks/sveltekit/index.js +6 -8
- package/lib/frameworks/utils.js +26 -24
- package/lib/frameworks/vite/index.js +8 -9
- package/lib/fsAsync.js +1 -2
- package/lib/fsutils.js +5 -6
- package/lib/functional.js +11 -11
- package/lib/functions/artifacts.js +25 -22
- package/lib/functions/ensureTargeted.js +1 -2
- package/lib/functions/env.js +13 -14
- package/lib/functions/functionslog.js +2 -3
- package/lib/functions/projectConfig.js +29 -33
- package/lib/functions/python.js +10 -4
- package/lib/functions/secrets.js +32 -18
- package/lib/functionsConfig.js +14 -14
- package/lib/functionsConfigClone.js +1 -2
- package/lib/functionsShellCommandAction.js +2 -3
- package/lib/gcp/apphosting.js +43 -28
- package/lib/gcp/apptesting.js +2 -2
- package/lib/gcp/artifactregistry.js +5 -5
- package/lib/gcp/auth.js +11 -13
- package/lib/gcp/cloudbilling.js +4 -5
- package/lib/gcp/cloudbuild.js +10 -11
- package/lib/gcp/cloudfunctions.js +61 -45
- package/lib/gcp/cloudfunctionsv2.js +81 -43
- package/lib/gcp/cloudlogging.js +2 -4
- package/lib/gcp/cloudmonitoring.js +7 -7
- package/lib/gcp/cloudscheduler.js +12 -14
- package/lib/gcp/cloudsql/cloudsqladmin.js +18 -20
- package/lib/gcp/cloudsql/connect.js +14 -9
- package/lib/gcp/cloudsql/fbToolsAuthClient.js +5 -3
- package/lib/gcp/cloudsql/interactive.js +2 -3
- package/lib/gcp/cloudsql/permissions.js +8 -8
- package/lib/gcp/cloudsql/permissionsSetup.js +9 -9
- package/lib/gcp/cloudtasks.js +19 -18
- package/lib/gcp/computeEngine.js +1 -2
- package/lib/gcp/devConnect.js +32 -29
- package/lib/gcp/docker.js +2 -4
- package/lib/gcp/eventarc.js +5 -5
- package/lib/gcp/firedata.js +4 -4
- package/lib/gcp/firestore.js +16 -16
- package/lib/gcp/iam.js +11 -12
- package/lib/gcp/identityPlatform.js +4 -5
- package/lib/gcp/k8s.js +1 -2
- package/lib/gcp/location.js +2 -2
- package/lib/gcp/proto.js +10 -11
- package/lib/gcp/pubsub.js +4 -5
- package/lib/gcp/resourceManager.js +5 -5
- package/lib/gcp/rules.js +13 -14
- package/lib/gcp/run.js +24 -31
- package/lib/gcp/runv2.js +39 -27
- package/lib/gcp/secretManager.js +60 -39
- package/lib/gcp/serviceusage.js +8 -4
- package/lib/gcp/storage.js +22 -20
- package/lib/gemini/fdcExperience.js +5 -5
- package/lib/getDefaultDatabaseInstance.js +2 -4
- package/lib/getDefaultHostingSite.js +3 -4
- package/lib/getProjectNumber.js +1 -2
- package/lib/hosting/api.js +32 -36
- package/lib/hosting/cloudRunProxy.js +2 -3
- package/lib/hosting/config.js +17 -17
- package/lib/hosting/expireUtils.js +3 -3
- package/lib/hosting/functionsProxy.js +1 -2
- package/lib/hosting/implicitInit.js +1 -2
- package/lib/hosting/initMiddleware.js +1 -2
- package/lib/hosting/interactive.js +1 -2
- package/lib/hosting/proxy.js +3 -5
- package/lib/hosting/runTags.js +8 -11
- package/lib/init/features/account.js +1 -2
- package/lib/init/features/ailogic/index.js +3 -5
- package/lib/init/features/ailogic/utils.js +6 -8
- package/lib/init/features/aitools/claude.js +1 -2
- package/lib/init/features/aitools/cursor.js +1 -2
- package/lib/init/features/aitools/gemini.js +1 -1
- package/lib/init/features/aitools/promptUpdater.js +10 -12
- package/lib/init/features/aitools.js +1 -2
- package/lib/init/features/apphosting.js +3 -4
- package/lib/init/features/apptesting/index.js +9 -9
- package/lib/init/features/database.js +4 -5
- package/lib/init/features/dataconnect/create_app.js +3 -4
- package/lib/init/features/dataconnect/index.js +25 -22
- package/lib/init/features/dataconnect/resolver.js +6 -10
- package/lib/init/features/dataconnect/sdk.js +31 -24
- package/lib/init/features/emulators.js +7 -6
- package/lib/init/features/extensions/index.js +3 -5
- package/lib/init/features/firestore/index.js +7 -9
- package/lib/init/features/firestore/indexes.js +2 -2
- package/lib/init/features/firestore/rules.js +3 -3
- package/lib/init/features/functions/index.js +3 -5
- package/lib/init/features/functions/javascript.js +1 -2
- package/lib/init/features/functions/npm-dependencies.js +1 -2
- package/lib/init/features/functions/python.js +1 -2
- package/lib/init/features/functions/typescript.js +1 -2
- package/lib/init/features/genkit/index.js +44 -18
- package/lib/init/features/hosting/github.js +6 -8
- package/lib/init/features/hosting/index.js +10 -13
- package/lib/init/features/project.js +4 -7
- package/lib/init/features/remoteconfig.js +1 -2
- package/lib/init/features/storage.js +3 -5
- package/lib/init/index.js +4 -7
- package/lib/init/spawn.js +7 -9
- package/lib/listFiles.js +1 -2
- package/lib/loadCJSON.js +1 -2
- package/lib/localFunction.js +14 -15
- package/lib/logError.js +1 -2
- package/lib/logger.js +7 -7
- package/lib/management/apps.js +22 -22
- package/lib/management/database.js +11 -12
- package/lib/management/projects.js +57 -56
- package/lib/management/provisioning/errorHandler.js +3 -5
- package/lib/management/provisioning/provision.js +15 -9
- package/lib/management/studio.js +2 -3
- package/lib/mcp/errors.js +4 -4
- package/lib/mcp/index.js +16 -23
- package/lib/mcp/prompt.js +1 -2
- package/lib/mcp/prompts/core/consult.js +2 -3
- package/lib/mcp/prompts/crashlytics/connect.js +15 -122
- package/lib/mcp/prompts/dataconnect/schema.js +3 -3
- package/lib/mcp/prompts/index.js +8 -10
- package/lib/mcp/resource.js +3 -15
- package/lib/mcp/resources/guides/app_id.js +39 -0
- package/lib/mcp/resources/guides/crashlytics_connect.js +51 -0
- package/lib/mcp/resources/guides/crashlytics_investigations.js +51 -0
- package/lib/mcp/resources/guides/crashlytics_issues.js +42 -0
- package/lib/mcp/resources/guides/crashlytics_reports.js +112 -0
- package/lib/mcp/resources/index.js +11 -3
- package/lib/mcp/tool.js +3 -15
- package/lib/mcp/tools/apphosting/fetch_logs.js +3 -4
- package/lib/mcp/tools/apphosting/list_backends.js +1 -1
- package/lib/mcp/tools/auth/get_users.js +5 -16
- package/lib/mcp/tools/core/create_android_sha.js +4 -1
- package/lib/mcp/tools/core/get_environment.js +3 -3
- package/lib/mcp/tools/core/get_sdk_config.js +4 -5
- package/lib/mcp/tools/core/get_security_rules.js +1 -2
- package/lib/mcp/tools/core/init.js +2 -2
- package/lib/mcp/tools/core/logout.js +1 -1
- package/lib/mcp/tools/core/read_resources.js +2 -2
- package/lib/mcp/tools/core/validate_security_rules.js +1 -2
- package/lib/mcp/tools/crashlytics/events.js +43 -19
- package/lib/mcp/tools/crashlytics/index.js +1 -6
- package/lib/mcp/tools/crashlytics/issues.js +33 -12
- package/lib/mcp/tools/crashlytics/reports.js +66 -117
- package/lib/mcp/tools/dataconnect/list_services.js +2 -3
- package/lib/mcp/tools/firestore/converter.js +3 -5
- package/lib/mcp/tools/firestore/delete_document.js +1 -1
- package/lib/mcp/tools/functions/get_logs.js +14 -12
- package/lib/mcp/tools/functions/list_functions.js +1 -1
- package/lib/mcp/tools/index.js +17 -9
- package/lib/mcp/util/apptesting/availability.js +1 -2
- package/lib/mcp/util/availability.js +1 -2
- package/lib/mcp/util/crashlytics/availability.js +1 -2
- package/lib/mcp/util/dataconnect/compile.js +7 -6
- package/lib/mcp/util/dataconnect/converter.js +7 -10
- package/lib/mcp/util/dataconnect/emulator.js +1 -2
- package/lib/mcp/util.js +9 -11
- package/lib/messaging/sendMessage.js +1 -2
- package/lib/metaprogramming.js +1 -2
- package/lib/operation-poller.js +2 -2
- package/lib/profileReport.js +6 -6
- package/lib/profiler.js +1 -2
- package/lib/projectPath.js +1 -2
- package/lib/projectUtils.js +5 -6
- package/lib/prompt.js +22 -13
- package/lib/rc.js +5 -7
- package/lib/remoteconfig/deleteExperiment.js +1 -2
- package/lib/remoteconfig/deleteRollout.js +1 -2
- package/lib/remoteconfig/get.js +2 -3
- package/lib/remoteconfig/getExperiment.js +2 -2
- package/lib/remoteconfig/getRollout.js +2 -2
- package/lib/remoteconfig/interfaces.js +1 -1
- package/lib/remoteconfig/listExperiments.js +2 -2
- package/lib/remoteconfig/listRollouts.js +2 -2
- package/lib/remoteconfig/publish.js +1 -2
- package/lib/remoteconfig/rollback.js +1 -2
- package/lib/remoteconfig/versionslist.js +1 -2
- package/lib/requireAuth.js +4 -6
- package/lib/requireConfig.js +5 -8
- package/lib/requireDatabaseInstance.js +2 -2
- package/lib/requireHostingSite.js +1 -2
- package/lib/requireInteractive.js +1 -1
- package/lib/requirePermissions.js +1 -2
- package/lib/requireTosAcceptance.js +1 -2
- package/lib/responseToError.js +1 -2
- package/lib/rtdb.js +2 -3
- package/lib/rulesDeploy.js +3 -4
- package/lib/serve/functions.js +9 -1
- package/lib/serve/hosting.js +4 -5
- package/lib/serve/index.js +1 -2
- package/lib/shortenUrl.js +1 -2
- package/lib/templates.js +3 -4
- package/lib/throttler/throttler.js +3 -3
- package/lib/timeout.js +2 -3
- package/lib/track.js +23 -14
- package/lib/tsconfig.publish.tsbuildinfo +1 -0
- package/lib/unzip.js +2 -3
- package/lib/utils.js +62 -63
- package/lib/vsCodeUtils.js +2 -3
- package/package.json +6 -6
- package/templates/extensions/typescript/index.ts +1 -1
- package/templates/extensions/typescript/package.lint.json +1 -1
- package/templates/extensions/typescript/package.nolint.json +1 -1
- 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 =
|
|
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 =
|
|
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 (
|
|
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(
|
|
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 =
|
|
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
|
-
...(
|
|
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 =
|
|
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)([
|
|
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 (!
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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 =
|
|
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:
|
|
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 =
|
|
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 =
|
|
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 (
|
|
683
|
-
doc =
|
|
701
|
+
if (eventTrigger.eventFilters?.document) {
|
|
702
|
+
doc = eventTrigger.eventFilters?.document;
|
|
684
703
|
match = "EXACT";
|
|
685
704
|
}
|
|
686
|
-
if (
|
|
687
|
-
doc =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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,
|
|
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:
|
|
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,
|
|
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,
|
|
1106
|
+
runtime = await this.startPython(backend, { ...runtimeEnv, ...secretEnvs });
|
|
1062
1107
|
}
|
|
1063
1108
|
else {
|
|
1064
|
-
runtime = await this.startNode(backend,
|
|
1109
|
+
runtime = await this.startNode(backend, { ...runtimeEnv, ...secretEnvs });
|
|
1065
1110
|
}
|
|
1066
1111
|
const extensionLogInfo = {
|
|
1067
1112
|
instanceId: backend.extensionInstanceId,
|
|
1068
|
-
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
|
-
|
|
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 (
|
|
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
|
|
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.
|
|
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 =
|
|
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:
|
|
133
|
-
maxRetrySeconds:
|
|
134
|
-
maxBackoffSeconds:
|
|
135
|
-
maxDoublings:
|
|
136
|
-
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:
|
|
140
|
-
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
|
|
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 (
|
|
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
|
|
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:
|
|
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:
|
|
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/${
|
|
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 =
|
|
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/${
|
|
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.
|
|
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;
|