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
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ensureDataConnectTriggerRegion =
|
|
3
|
+
exports.ensureDataConnectTriggerRegion = ensureDataConnectTriggerRegion;
|
|
4
|
+
exports.getDataConnectP4SA = getDataConnectP4SA;
|
|
5
|
+
const api_1 = require("../../../api");
|
|
4
6
|
const error_1 = require("../../../error");
|
|
7
|
+
const AUTOPUSH_DATACONNECT_SA_DOMAIN = "gcp-sa-autopush-dataconnect.iam.gserviceaccount.com";
|
|
8
|
+
const STAGING_DATACONNECT_SA_DOMAIN = "gcp-sa-staging-dataconnect.iam.gserviceaccount.com";
|
|
9
|
+
const PROD_DATACONNECT_SA_DOMAIN = "gcp-sa-firebasedataconnect.iam.gserviceaccount.com";
|
|
5
10
|
function ensureDataConnectTriggerRegion(endpoint) {
|
|
6
11
|
if (!endpoint.eventTrigger.region) {
|
|
7
12
|
endpoint.eventTrigger.region = endpoint.region;
|
|
@@ -11,4 +16,13 @@ function ensureDataConnectTriggerRegion(endpoint) {
|
|
|
11
16
|
}
|
|
12
17
|
return Promise.resolve();
|
|
13
18
|
}
|
|
14
|
-
|
|
19
|
+
function getDataConnectP4SA(projectNumber) {
|
|
20
|
+
const origin = (0, api_1.dataconnectOrigin)();
|
|
21
|
+
if (origin.includes("autopush")) {
|
|
22
|
+
return `service-${projectNumber}@${AUTOPUSH_DATACONNECT_SA_DOMAIN}`;
|
|
23
|
+
}
|
|
24
|
+
if (origin.includes("staging")) {
|
|
25
|
+
return `service-${projectNumber}@${STAGING_DATACONNECT_SA_DOMAIN}`;
|
|
26
|
+
}
|
|
27
|
+
return `service-${projectNumber}@${PROD_DATACONNECT_SA_DOMAIN}`;
|
|
28
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ensureFirebaseAlertsTriggerRegion =
|
|
3
|
+
exports.ensureFirebaseAlertsTriggerRegion = ensureFirebaseAlertsTriggerRegion;
|
|
4
4
|
const error_1 = require("../../../error");
|
|
5
5
|
function ensureFirebaseAlertsTriggerRegion(endpoint) {
|
|
6
6
|
if (!endpoint.eventTrigger.region) {
|
|
@@ -11,4 +11,3 @@ function ensureFirebaseAlertsTriggerRegion(endpoint) {
|
|
|
11
11
|
}
|
|
12
12
|
return Promise.resolve();
|
|
13
13
|
}
|
|
14
|
-
exports.ensureFirebaseAlertsTriggerRegion = ensureFirebaseAlertsTriggerRegion;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.clearCache = clearCache;
|
|
4
|
+
exports.ensureFirestoreTriggerRegion = ensureFirestoreTriggerRegion;
|
|
4
5
|
const firestore = require("../../../gcp/firestore");
|
|
5
6
|
const error_1 = require("../../../error");
|
|
6
7
|
const dbCache = new Map();
|
|
@@ -9,7 +10,6 @@ function clearCache() {
|
|
|
9
10
|
dbCache.clear();
|
|
10
11
|
dbPromiseCache.clear();
|
|
11
12
|
}
|
|
12
|
-
exports.clearCache = clearCache;
|
|
13
13
|
async function getDatabase(project, databaseId) {
|
|
14
14
|
const key = `${project}/${databaseId}`;
|
|
15
15
|
if (dbCache.has(key)) {
|
|
@@ -33,8 +33,7 @@ async function getDatabase(project, databaseId) {
|
|
|
33
33
|
return dbPromise;
|
|
34
34
|
}
|
|
35
35
|
async function ensureFirestoreTriggerRegion(endpoint) {
|
|
36
|
-
|
|
37
|
-
const db = await getDatabase(endpoint.project, ((_a = endpoint.eventTrigger.eventFilters) === null || _a === void 0 ? void 0 : _a.database) || "(default)");
|
|
36
|
+
const db = await getDatabase(endpoint.project, endpoint.eventTrigger.eventFilters?.database || "(default)");
|
|
38
37
|
const dbRegion = db.locationId;
|
|
39
38
|
if (!endpoint.eventTrigger.region) {
|
|
40
39
|
endpoint.eventTrigger.region = dbRegion;
|
|
@@ -43,4 +42,3 @@ async function ensureFirestoreTriggerRegion(endpoint) {
|
|
|
43
42
|
throw new error_1.FirebaseError("A firestore trigger location must match the firestore database region.");
|
|
44
43
|
}
|
|
45
44
|
}
|
|
46
|
-
exports.ensureFirestoreTriggerRegion = ensureFirestoreTriggerRegion;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.noopProjectBindings = exports.noop = void 0;
|
|
4
|
+
exports.serviceForEndpoint = serviceForEndpoint;
|
|
4
5
|
const backend = require("../backend");
|
|
5
6
|
const auth_1 = require("./auth");
|
|
6
7
|
const storage_1 = require("./storage");
|
|
@@ -131,4 +132,3 @@ function serviceForEndpoint(endpoint) {
|
|
|
131
132
|
}
|
|
132
133
|
return noOpService;
|
|
133
134
|
}
|
|
134
|
-
exports.serviceForEndpoint = serviceForEndpoint;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ensureRemoteConfigTriggerRegion =
|
|
3
|
+
exports.ensureRemoteConfigTriggerRegion = ensureRemoteConfigTriggerRegion;
|
|
4
4
|
const error_1 = require("../../../error");
|
|
5
5
|
function ensureRemoteConfigTriggerRegion(endpoint) {
|
|
6
6
|
if (!endpoint.eventTrigger.region) {
|
|
@@ -11,4 +11,3 @@ function ensureRemoteConfigTriggerRegion(endpoint) {
|
|
|
11
11
|
}
|
|
12
12
|
return Promise.resolve();
|
|
13
13
|
}
|
|
14
|
-
exports.ensureRemoteConfigTriggerRegion = ensureRemoteConfigTriggerRegion;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.obtainStorageBindings = obtainStorageBindings;
|
|
4
|
+
exports.ensureStorageTriggerRegion = ensureStorageTriggerRegion;
|
|
4
5
|
const storage = require("../../../gcp/storage");
|
|
5
6
|
const logger_1 = require("../../../logger");
|
|
6
7
|
const error_1 = require("../../../error");
|
|
@@ -15,13 +16,11 @@ async function obtainStorageBindings(projectNumber) {
|
|
|
15
16
|
};
|
|
16
17
|
return [pubsubPublisherBinding];
|
|
17
18
|
}
|
|
18
|
-
exports.obtainStorageBindings = obtainStorageBindings;
|
|
19
19
|
async function ensureStorageTriggerRegion(endpoint) {
|
|
20
|
-
var _a;
|
|
21
20
|
const { eventTrigger } = endpoint;
|
|
22
21
|
if (!eventTrigger.region) {
|
|
23
22
|
logger_1.logger.debug("Looking up bucket region for the storage event trigger");
|
|
24
|
-
if (!
|
|
23
|
+
if (!eventTrigger.eventFilters?.bucket) {
|
|
25
24
|
throw new error_1.FirebaseError("Error: storage event trigger is missing bucket filter: " +
|
|
26
25
|
JSON.stringify(eventTrigger, null, 2));
|
|
27
26
|
}
|
|
@@ -41,4 +40,3 @@ async function ensureStorageTriggerRegion(endpoint) {
|
|
|
41
40
|
throw new error_1.FirebaseError(`A function in region ${endpoint.region} cannot listen to a bucket in region ${eventTrigger.region}`);
|
|
42
41
|
}
|
|
43
42
|
}
|
|
44
|
-
exports.ensureStorageTriggerRegion = ensureStorageTriggerRegion;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ensureTestLabTriggerRegion =
|
|
3
|
+
exports.ensureTestLabTriggerRegion = ensureTestLabTriggerRegion;
|
|
4
4
|
const error_1 = require("../../../error");
|
|
5
5
|
function ensureTestLabTriggerRegion(endpoint) {
|
|
6
6
|
if (!endpoint.eventTrigger.region) {
|
|
@@ -11,4 +11,3 @@ function ensureTestLabTriggerRegion(endpoint) {
|
|
|
11
11
|
}
|
|
12
12
|
return Promise.resolve();
|
|
13
13
|
}
|
|
14
|
-
exports.ensureTestLabTriggerRegion = ensureTestLabTriggerRegion;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ensureTriggerRegions =
|
|
3
|
+
exports.ensureTriggerRegions = ensureTriggerRegions;
|
|
4
4
|
const backend = require("./backend");
|
|
5
5
|
const services_1 = require("./services");
|
|
6
6
|
async function ensureTriggerRegions(want) {
|
|
@@ -13,4 +13,3 @@ async function ensureTriggerRegions(want) {
|
|
|
13
13
|
}
|
|
14
14
|
await Promise.all(regionLookups);
|
|
15
15
|
}
|
|
16
|
-
exports.ensureTriggerRegions = ensureTriggerRegions;
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.MAX_V2_SCHEDULE_ATTEMPT_DEADLINE_SECONDS = exports.DEFAULT_V2_SCHEDULE_ATTEMPT_DEADLINE_SECONDS = void 0;
|
|
4
|
+
exports.endpointsAreValid = endpointsAreValid;
|
|
5
|
+
exports.cpuConfigIsValid = cpuConfigIsValid;
|
|
6
|
+
exports.validateTimeoutConfig = validateTimeoutConfig;
|
|
7
|
+
exports.endpointsAreUnique = endpointsAreUnique;
|
|
8
|
+
exports.functionsDirectoryExists = functionsDirectoryExists;
|
|
9
|
+
exports.functionIdsAreValid = functionIdsAreValid;
|
|
10
|
+
exports.secretsAreValid = secretsAreValid;
|
|
4
11
|
const path = require("path");
|
|
5
12
|
const clc = require("colorette");
|
|
6
13
|
const error_1 = require("../../error");
|
|
@@ -27,10 +34,9 @@ function matchingIds(endpoints, filter) {
|
|
|
27
34
|
}
|
|
28
35
|
const mem = (endpoint) => endpoint.availableMemoryMb || backend.DEFAULT_MEMORY;
|
|
29
36
|
const cpu = (endpoint) => {
|
|
30
|
-
var _a;
|
|
31
37
|
return endpoint.cpu === "gcf_gen1"
|
|
32
38
|
? backend.memoryToGen1Cpu(mem(endpoint))
|
|
33
|
-
:
|
|
39
|
+
: endpoint.cpu ?? backend.memoryToGen2Cpu(mem(endpoint));
|
|
34
40
|
};
|
|
35
41
|
function validateScheduledTimeout(ep) {
|
|
36
42
|
if (backend.isScheduleTriggered(ep) &&
|
|
@@ -69,7 +75,6 @@ function endpointsAreValid(wantBackend) {
|
|
|
69
75
|
}
|
|
70
76
|
cpuConfigIsValid(endpoints);
|
|
71
77
|
}
|
|
72
|
-
exports.endpointsAreValid = endpointsAreValid;
|
|
73
78
|
function cpuConfigIsValid(endpoints) {
|
|
74
79
|
const gcfV1WithCPU = matchingIds(endpoints, (endpoint) => endpoint.platform === "gcfv1" && typeof endpoint["cpu"] !== "undefined");
|
|
75
80
|
if (gcfV1WithCPU.length) {
|
|
@@ -122,7 +127,6 @@ function cpuConfigIsValid(endpoints) {
|
|
|
122
127
|
throw new error_1.FirebaseError(msg);
|
|
123
128
|
}
|
|
124
129
|
}
|
|
125
|
-
exports.cpuConfigIsValid = cpuConfigIsValid;
|
|
126
130
|
function validateTimeoutConfig(endpoints) {
|
|
127
131
|
const invalidEndpoints = [];
|
|
128
132
|
for (const ep of endpoints) {
|
|
@@ -143,7 +147,9 @@ function validateTimeoutConfig(endpoints) {
|
|
|
143
147
|
else if (backend.isTaskQueueTriggered(ep)) {
|
|
144
148
|
limit = MAX_V2_TASK_QUEUE_TIMEOUT_SECONDS;
|
|
145
149
|
}
|
|
146
|
-
else if (backend.isHttpsTriggered(ep) ||
|
|
150
|
+
else if (backend.isHttpsTriggered(ep) ||
|
|
151
|
+
backend.isCallableTriggered(ep) ||
|
|
152
|
+
backend.isDataConnectGraphqlTriggered(ep)) {
|
|
147
153
|
limit = MAX_V2_HTTP_TIMEOUT_SECONDS;
|
|
148
154
|
}
|
|
149
155
|
if (limit !== undefined && timeout > limit) {
|
|
@@ -162,7 +168,6 @@ function validateTimeoutConfig(endpoints) {
|
|
|
162
168
|
"\n\nFor more information, see https://firebase.google.com/docs/functions/quotas#time_limits";
|
|
163
169
|
throw new error_1.FirebaseError(msg);
|
|
164
170
|
}
|
|
165
|
-
exports.validateTimeoutConfig = validateTimeoutConfig;
|
|
166
171
|
function endpointsAreUnique(backends) {
|
|
167
172
|
const endpointToCodebases = {};
|
|
168
173
|
for (const [codebase, b] of Object.entries(backends)) {
|
|
@@ -185,7 +190,6 @@ function endpointsAreUnique(backends) {
|
|
|
185
190
|
const msgs = Object.entries(conflicts).map(([fn, codebases]) => `${fn}: ${codebases.join(",")}`);
|
|
186
191
|
throw new error_1.FirebaseError("More than one codebase claims following functions:\n\t" + `${msgs.join("\n\t")}`);
|
|
187
192
|
}
|
|
188
|
-
exports.endpointsAreUnique = endpointsAreUnique;
|
|
189
193
|
function functionsDirectoryExists(sourceDir, projectDir) {
|
|
190
194
|
if (!fsutils.dirExistsSync(sourceDir)) {
|
|
191
195
|
const sourceDirName = path.relative(projectDir, sourceDir);
|
|
@@ -194,7 +198,6 @@ function functionsDirectoryExists(sourceDir, projectDir) {
|
|
|
194
198
|
throw new error_1.FirebaseError(msg);
|
|
195
199
|
}
|
|
196
200
|
}
|
|
197
|
-
exports.functionsDirectoryExists = functionsDirectoryExists;
|
|
198
201
|
function functionIdsAreValid(functions) {
|
|
199
202
|
const functionName = /^[a-zA-Z][a-zA-Z0-9_-]{0,62}$/;
|
|
200
203
|
const invalidIds = functions.filter((fn) => !functionName.test(fn.id));
|
|
@@ -204,7 +207,6 @@ function functionIdsAreValid(functions) {
|
|
|
204
207
|
throw new error_1.FirebaseError(msg);
|
|
205
208
|
}
|
|
206
209
|
}
|
|
207
|
-
exports.functionIdsAreValid = functionIdsAreValid;
|
|
208
210
|
async function secretsAreValid(projectId, wantBackend) {
|
|
209
211
|
const endpoints = backend
|
|
210
212
|
.allEndpoints(wantBackend)
|
|
@@ -212,7 +214,6 @@ async function secretsAreValid(projectId, wantBackend) {
|
|
|
212
214
|
validatePlatformTargets(endpoints);
|
|
213
215
|
await validateSecretVersions(projectId, endpoints);
|
|
214
216
|
}
|
|
215
|
-
exports.secretsAreValid = secretsAreValid;
|
|
216
217
|
const secretsSupportedPlatforms = ["gcfv1", "gcfv2"];
|
|
217
218
|
function validatePlatformTargets(endpoints) {
|
|
218
219
|
const unsupported = endpoints.filter((e) => !secretsSupportedPlatforms.includes(e.platform));
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.findEndpointForRewrite = findEndpointForRewrite;
|
|
4
|
+
exports.convertConfig = convertConfig;
|
|
4
5
|
const error_1 = require("../../error");
|
|
5
6
|
const backend = require("../functions/backend");
|
|
6
7
|
const utils_1 = require("../../utils");
|
|
@@ -58,11 +59,9 @@ function findEndpointForRewrite(site, targetBackend, id, region) {
|
|
|
58
59
|
foundMatchingId: true,
|
|
59
60
|
};
|
|
60
61
|
}
|
|
61
|
-
exports.findEndpointForRewrite = findEndpointForRewrite;
|
|
62
62
|
async function convertConfig(context, functionsPayload, deploy) {
|
|
63
|
-
var _a, _b, _c, _d;
|
|
64
63
|
const config = {};
|
|
65
|
-
const hasBackends = !!
|
|
64
|
+
const hasBackends = !!deploy.config.rewrites?.some((r) => "function" in r || "run" in r);
|
|
66
65
|
const wantBackend = backend.merge(...Object.values(functionsPayload.functions || {}).map((c) => c.wantBackend));
|
|
67
66
|
let haveBackend = backend.empty();
|
|
68
67
|
if (hasBackends) {
|
|
@@ -80,11 +79,13 @@ async function convertConfig(context, functionsPayload, deploy) {
|
|
|
80
79
|
}
|
|
81
80
|
}
|
|
82
81
|
}
|
|
83
|
-
config.rewrites =
|
|
84
|
-
var _a;
|
|
82
|
+
config.rewrites = deploy.config.rewrites?.map((rewrite) => {
|
|
85
83
|
const target = extractPattern("rewrite", rewrite);
|
|
86
84
|
if ("destination" in rewrite) {
|
|
87
|
-
return
|
|
85
|
+
return {
|
|
86
|
+
...target,
|
|
87
|
+
path: rewrite.destination,
|
|
88
|
+
};
|
|
88
89
|
}
|
|
89
90
|
if ("function" in rewrite) {
|
|
90
91
|
if (typeof rewrite.function === "string") {
|
|
@@ -98,14 +99,14 @@ async function convertConfig(context, functionsPayload, deploy) {
|
|
|
98
99
|
: undefined;
|
|
99
100
|
const endpoint = deployingEndpointSearch.matchingEndpoint
|
|
100
101
|
? deployingEndpointSearch.matchingEndpoint
|
|
101
|
-
: existingEndpointSearch
|
|
102
|
+
: existingEndpointSearch?.matchingEndpoint;
|
|
102
103
|
if (!endpoint) {
|
|
103
|
-
if (deployingEndpointSearch.foundMatchingId ||
|
|
104
|
+
if (deployingEndpointSearch.foundMatchingId || existingEndpointSearch?.foundMatchingId) {
|
|
104
105
|
throw new error_1.FirebaseError(`Unable to find a valid endpoint for function. Functions matching the rewrite
|
|
105
106
|
are present but in the wrong region.`);
|
|
106
107
|
}
|
|
107
108
|
(0, utils_1.logLabeledWarning)(`hosting[${deploy.config.site}]`, `Unable to find a valid endpoint for function \`${id}\`, but still including it in the config`);
|
|
108
|
-
const apiRewrite =
|
|
109
|
+
const apiRewrite = { ...target, function: id };
|
|
109
110
|
if (region) {
|
|
110
111
|
apiRewrite.functionRegion = region;
|
|
111
112
|
}
|
|
@@ -118,12 +119,19 @@ async function convertConfig(context, functionsPayload, deploy) {
|
|
|
118
119
|
if (rewrite.function.pinTag) {
|
|
119
120
|
throw new error_1.FirebaseError(`Function ${endpoint.id} is a 1st gen function and therefore does not support the ${(0, colorette_1.bold)("pinTag")} option`);
|
|
120
121
|
}
|
|
121
|
-
return
|
|
122
|
+
return {
|
|
123
|
+
...target,
|
|
124
|
+
function: endpoint.id,
|
|
125
|
+
functionRegion: endpoint.region,
|
|
126
|
+
};
|
|
122
127
|
}
|
|
123
|
-
const apiRewrite =
|
|
124
|
-
|
|
128
|
+
const apiRewrite = {
|
|
129
|
+
...target,
|
|
130
|
+
run: {
|
|
131
|
+
serviceId: endpoint.runServiceId ?? endpoint.id,
|
|
125
132
|
region: endpoint.region,
|
|
126
|
-
}
|
|
133
|
+
},
|
|
134
|
+
};
|
|
127
135
|
if (rewrite.function.pinTag) {
|
|
128
136
|
if (endpoint.minInstances) {
|
|
129
137
|
throw new error_1.FirebaseError(`Function ${endpoint.id} has minInstances set and is in a rewrite ` +
|
|
@@ -139,13 +147,16 @@ async function convertConfig(context, functionsPayload, deploy) {
|
|
|
139
147
|
if (!rewrite.dynamicLinks) {
|
|
140
148
|
throw new error_1.FirebaseError("Can only set dynamicLinks to true in a rewrite");
|
|
141
149
|
}
|
|
142
|
-
return
|
|
150
|
+
return { ...target, dynamicLinks: true };
|
|
143
151
|
}
|
|
144
152
|
if ("run" in rewrite) {
|
|
145
|
-
const apiRewrite =
|
|
153
|
+
const apiRewrite = {
|
|
154
|
+
...target,
|
|
155
|
+
run: {
|
|
146
156
|
serviceId: rewrite.run.serviceId,
|
|
147
157
|
region: rewrite.run.region || "us-central1",
|
|
148
|
-
}
|
|
158
|
+
},
|
|
159
|
+
};
|
|
149
160
|
if (rewrite.run.pinTag) {
|
|
150
161
|
experiments.assertEnabled("pintags", "pin to a run service revision");
|
|
151
162
|
apiRewrite.run.tag = runTags.TODO_TAG_NAME;
|
|
@@ -164,23 +175,28 @@ async function convertConfig(context, functionsPayload, deploy) {
|
|
|
164
175
|
const versionId = (0, utils_1.last)(deploy.version.split("/"));
|
|
165
176
|
await runTags.setRewriteTags(config.rewrites, context.projectId, versionId);
|
|
166
177
|
}
|
|
167
|
-
config.redirects =
|
|
168
|
-
const apiRedirect =
|
|
178
|
+
config.redirects = deploy.config.redirects?.map((redirect) => {
|
|
179
|
+
const apiRedirect = {
|
|
180
|
+
...extractPattern("redirect", redirect),
|
|
181
|
+
location: redirect.destination,
|
|
182
|
+
};
|
|
169
183
|
if (redirect.type) {
|
|
170
184
|
apiRedirect.statusCode = redirect.type;
|
|
171
185
|
}
|
|
172
186
|
return apiRedirect;
|
|
173
187
|
});
|
|
174
|
-
config.headers =
|
|
188
|
+
config.headers = deploy.config.headers?.map((header) => {
|
|
175
189
|
const headers = {};
|
|
176
190
|
for (const { key, value } of header.headers || []) {
|
|
177
191
|
headers[key] = value;
|
|
178
192
|
}
|
|
179
|
-
return
|
|
193
|
+
return {
|
|
194
|
+
...extractPattern("header", header),
|
|
195
|
+
headers,
|
|
196
|
+
};
|
|
180
197
|
});
|
|
181
198
|
proto.copyIfPresent(config, deploy.config, "cleanUrls", "appAssociation", "i18n");
|
|
182
199
|
proto.convertIfPresent(config, deploy.config, "trailingSlashBehavior", "trailingSlash", (b) => b ? "ADD" : "REMOVE");
|
|
183
200
|
proto.pruneUndefiends(config);
|
|
184
201
|
return config;
|
|
185
202
|
}
|
|
186
|
-
exports.convertConfig = convertConfig;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.deploy =
|
|
3
|
+
exports.deploy = deploy;
|
|
4
4
|
const uploader_1 = require("./uploader");
|
|
5
5
|
const detectProjectRoot_1 = require("../../detectProjectRoot");
|
|
6
6
|
const listFiles_1 = require("../../listFiles");
|
|
@@ -11,8 +11,7 @@ const ora = require("ora");
|
|
|
11
11
|
const fsutils_1 = require("../../fsutils");
|
|
12
12
|
const error_1 = require("../../error");
|
|
13
13
|
async function deploy(context, options) {
|
|
14
|
-
|
|
15
|
-
if (!((_a = context.hosting) === null || _a === void 0 ? void 0 : _a.deploys)) {
|
|
14
|
+
if (!context.hosting?.deploys) {
|
|
16
15
|
return;
|
|
17
16
|
}
|
|
18
17
|
const spinner = ora();
|
|
@@ -25,12 +24,11 @@ async function deploy(context, options) {
|
|
|
25
24
|
}
|
|
26
25
|
}
|
|
27
26
|
async function runDeploys(deploys, debugging) {
|
|
28
|
-
var _a;
|
|
29
27
|
const deploy = deploys.shift();
|
|
30
28
|
if (!deploy) {
|
|
31
29
|
return;
|
|
32
30
|
}
|
|
33
|
-
if (!
|
|
31
|
+
if (!deploy.config?.public) {
|
|
34
32
|
(0, utils_1.logLabeledBullet)(`hosting[${deploy.config.site}]`, 'no "public" directory to upload, continuing with release');
|
|
35
33
|
return runDeploys(deploys, debugging);
|
|
36
34
|
}
|
|
@@ -79,7 +77,6 @@ async function deploy(context, options) {
|
|
|
79
77
|
return runDeploys(deploys, debugging);
|
|
80
78
|
}
|
|
81
79
|
const debugging = !!(options.debug || options.nonInteractive);
|
|
82
|
-
const deploys = [...(
|
|
80
|
+
const deploys = [...(context.hosting?.deploys || [])];
|
|
83
81
|
return runDeploys(deploys, debugging);
|
|
84
82
|
}
|
|
85
|
-
exports.deploy = deploy;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.load = load;
|
|
4
|
+
exports.dump = dump;
|
|
4
5
|
const fs = require("fs-extra");
|
|
5
6
|
const path = require("path");
|
|
6
7
|
const logger_1 = require("../../logger");
|
|
@@ -29,7 +30,6 @@ function load(cwd, name) {
|
|
|
29
30
|
return new Map();
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
|
-
exports.load = load;
|
|
33
33
|
function dump(cwd, name, data) {
|
|
34
34
|
let st = "";
|
|
35
35
|
let count = 0;
|
|
@@ -45,4 +45,3 @@ function dump(cwd, name, data) {
|
|
|
45
45
|
logger_1.logger.debug(`[hosting] unable to store hash cache [${name}]: ${e.stack}`);
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
exports.dump = dump;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.hasPinnedFunctions = hasPinnedFunctions;
|
|
4
|
+
exports.addPinnedFunctionsToOnlyString = addPinnedFunctionsToOnlyString;
|
|
5
|
+
exports.prepare = prepare;
|
|
6
|
+
exports.unsafePins = unsafePins;
|
|
4
7
|
const error_1 = require("../../error");
|
|
5
8
|
const api = require("../../hosting/api");
|
|
6
9
|
const config = require("../../hosting/config");
|
|
@@ -31,9 +34,7 @@ function hasPinnedFunctions(options) {
|
|
|
31
34
|
}
|
|
32
35
|
return false;
|
|
33
36
|
}
|
|
34
|
-
exports.hasPinnedFunctions = hasPinnedFunctions;
|
|
35
37
|
async function addPinnedFunctionsToOnlyString(context, options) {
|
|
36
|
-
var _a;
|
|
37
38
|
if (!options.only) {
|
|
38
39
|
return false;
|
|
39
40
|
}
|
|
@@ -45,7 +46,7 @@ async function addPinnedFunctionsToOnlyString(context, options) {
|
|
|
45
46
|
if (!("function" in r) || typeof r.function !== "object" || !r.function.pinTag) {
|
|
46
47
|
continue;
|
|
47
48
|
}
|
|
48
|
-
const endpoint = (
|
|
49
|
+
const endpoint = (await backend.existingBackend(context)).endpoints[r.function.region || "us-central1"]?.[r.function.functionId];
|
|
49
50
|
if (endpoint) {
|
|
50
51
|
options.only = (0, ensureTargeted_1.ensureTargeted)(options.only, endpoint.codebase || "default", endpoint.id);
|
|
51
52
|
}
|
|
@@ -66,7 +67,6 @@ async function addPinnedFunctionsToOnlyString(context, options) {
|
|
|
66
67
|
}
|
|
67
68
|
return addedFunctions.length !== 0;
|
|
68
69
|
}
|
|
69
|
-
exports.addPinnedFunctionsToOnlyString = addPinnedFunctionsToOnlyString;
|
|
70
70
|
async function prepare(context, options) {
|
|
71
71
|
handlePublicDirectoryFlag(options);
|
|
72
72
|
const configs = config.hostingConfig(options);
|
|
@@ -74,8 +74,9 @@ async function prepare(context, options) {
|
|
|
74
74
|
return Promise.resolve();
|
|
75
75
|
}
|
|
76
76
|
const versions = await Promise.all(configs.map(async (config) => {
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
const labels = {
|
|
78
|
+
...deploymentTool.labels(),
|
|
79
|
+
};
|
|
79
80
|
if (config.webFramework) {
|
|
80
81
|
labels["firebase-web-framework"] = config.webFramework;
|
|
81
82
|
}
|
|
@@ -88,8 +89,10 @@ async function prepare(context, options) {
|
|
|
88
89
|
utils.logLabeledError("Hosting", msg);
|
|
89
90
|
throw new Error(msg);
|
|
90
91
|
}
|
|
91
|
-
const runPins =
|
|
92
|
-
|
|
92
|
+
const runPins = config.rewrites
|
|
93
|
+
?.filter((r) => "run" in r && r.run.pinTag)
|
|
94
|
+
?.map((r) => r.run.serviceId);
|
|
95
|
+
if (runPins?.length) {
|
|
93
96
|
utils.logLabeledBullet("hosting", `The site ${clc.bold(config.site)} will pin rewrites to the current ` +
|
|
94
97
|
`latest revision of service(s) ${runPins.map(clc.bold).join(",")}`);
|
|
95
98
|
}
|
|
@@ -112,7 +115,6 @@ async function prepare(context, options) {
|
|
|
112
115
|
context.hosting.deploys.push({ config, version });
|
|
113
116
|
}
|
|
114
117
|
}
|
|
115
|
-
exports.prepare = prepare;
|
|
116
118
|
function rewriteTarget(source) {
|
|
117
119
|
if ("glob" in source) {
|
|
118
120
|
return source.glob;
|
|
@@ -128,7 +130,6 @@ function rewriteTarget(source) {
|
|
|
128
130
|
}
|
|
129
131
|
}
|
|
130
132
|
async function unsafePins(context, config) {
|
|
131
|
-
var _a, _b, _c, _d;
|
|
132
133
|
if ((context.hostingChannel || "live") === "live") {
|
|
133
134
|
return [];
|
|
134
135
|
}
|
|
@@ -140,7 +141,7 @@ async function unsafePins(context, config) {
|
|
|
140
141
|
}
|
|
141
142
|
if ("function" in rewrite && typeof rewrite.function === "object" && rewrite.function.pinTag) {
|
|
142
143
|
const region = rewrite.function.region || "us-central1";
|
|
143
|
-
const endpoint = (
|
|
144
|
+
const endpoint = (await backend.existingBackend(context)).endpoints[region]?.[rewrite.function.functionId];
|
|
144
145
|
if (!endpoint) {
|
|
145
146
|
continue;
|
|
146
147
|
}
|
|
@@ -152,7 +153,7 @@ async function unsafePins(context, config) {
|
|
|
152
153
|
}
|
|
153
154
|
const channelConfig = await api.getChannel(context.projectId, config.site, "live");
|
|
154
155
|
const existingUntaggedRewrites = {};
|
|
155
|
-
for (const rewrite of
|
|
156
|
+
for (const rewrite of channelConfig?.release?.version?.config?.rewrites || []) {
|
|
156
157
|
if ("run" in rewrite && !rewrite.run.tag) {
|
|
157
158
|
existingUntaggedRewrites[rewriteTarget(rewrite)] =
|
|
158
159
|
`${rewrite.run.region}/${rewrite.run.serviceId}`;
|
|
@@ -160,4 +161,3 @@ async function unsafePins(context, config) {
|
|
|
160
161
|
}
|
|
161
162
|
return Object.keys(targetTaggedRewrites).filter((target) => targetTaggedRewrites[target] === existingUntaggedRewrites[target]);
|
|
162
163
|
}
|
|
163
|
-
exports.unsafePins = unsafePins;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.release =
|
|
3
|
+
exports.release = release;
|
|
4
4
|
const api = require("../../hosting/api");
|
|
5
5
|
const logger_1 = require("../../logger");
|
|
6
6
|
const utils = require("../../utils");
|
|
@@ -37,4 +37,3 @@ async function release(context, options, functionsPayload) {
|
|
|
37
37
|
utils.logLabeledSuccess(`hosting[${deploy.config.site}]`, "release complete");
|
|
38
38
|
}));
|
|
39
39
|
}
|
|
40
|
-
exports.release = release;
|
package/lib/deploy/index.js
CHANGED
|
@@ -48,7 +48,7 @@ const isDeployingWebFramework = (options) => {
|
|
|
48
48
|
if (!config)
|
|
49
49
|
return false;
|
|
50
50
|
const normalizedConfig = Array.isArray(config) ? config : [config];
|
|
51
|
-
const webFrameworksInConfig = normalizedConfig.filter((c) => c
|
|
51
|
+
const webFrameworksInConfig = normalizedConfig.filter((c) => c?.source);
|
|
52
52
|
if (webFrameworksInConfig.length === 0)
|
|
53
53
|
return false;
|
|
54
54
|
if (!options.only)
|
|
@@ -64,7 +64,6 @@ const isDeployingWebFramework = (options) => {
|
|
|
64
64
|
};
|
|
65
65
|
exports.isDeployingWebFramework = isDeployingWebFramework;
|
|
66
66
|
const deploy = async function (targetNames, options, customContext = {}) {
|
|
67
|
-
var _a, _b, _c, _d;
|
|
68
67
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
69
68
|
const payload = {};
|
|
70
69
|
const context = Object.assign({ projectId }, customContext);
|
|
@@ -145,10 +144,10 @@ const deploy = async function (targetNames, options, customContext = {}) {
|
|
|
145
144
|
params[t] = "true";
|
|
146
145
|
}
|
|
147
146
|
void (0, track_1.trackGA4)("product_deploy", params, duration);
|
|
148
|
-
const stats =
|
|
147
|
+
const stats = context?.dataconnect?.deployStats;
|
|
149
148
|
if (stats) {
|
|
150
149
|
const fdcParams = (0, context_1.deployStatsParams)(stats);
|
|
151
|
-
void (0, track_1.trackGA4)("dataconnect_deploy",
|
|
150
|
+
void (0, track_1.trackGA4)("dataconnect_deploy", { ...fdcParams, ...baseParams }, duration);
|
|
152
151
|
}
|
|
153
152
|
}
|
|
154
153
|
const successMessage = options.dryRun ? "Dry run complete!" : "Deploy complete!";
|
|
@@ -156,13 +155,13 @@ const deploy = async function (targetNames, options, customContext = {}) {
|
|
|
156
155
|
(0, utils_1.logSuccess)((0, colorette_1.bold)((0, colorette_1.underline)(successMessage)));
|
|
157
156
|
logger_1.logger.info();
|
|
158
157
|
const deployedHosting = (0, lodash_1.includes)(targetNames, "hosting");
|
|
159
|
-
logger_1.logger.info((0, colorette_1.bold)("Project Console:"), (0, utils_1.consoleUrl)(
|
|
158
|
+
logger_1.logger.info((0, colorette_1.bold)("Project Console:"), (0, utils_1.consoleUrl)(options.project ?? "_", "/overview"));
|
|
160
159
|
if (deployedHosting) {
|
|
161
|
-
(0, lodash_1.each)(
|
|
160
|
+
(0, lodash_1.each)(context.hosting?.deploys, (deploy) => {
|
|
162
161
|
logger_1.logger.info((0, colorette_1.bold)("Hosting URL:"), (0, utils_1.addSubdomain)((0, api_1.hostingOrigin)(), deploy.config.site));
|
|
163
162
|
});
|
|
164
|
-
const versionNames =
|
|
165
|
-
return { hosting:
|
|
163
|
+
const versionNames = context.hosting?.deploys.map((deploy) => deploy.version);
|
|
164
|
+
return { hosting: versionNames?.length === 1 ? versionNames[0] : versionNames };
|
|
166
165
|
}
|
|
167
166
|
else {
|
|
168
167
|
return { hosting: undefined };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.lifecycleHooks =
|
|
3
|
+
exports.lifecycleHooks = lifecycleHooks;
|
|
4
4
|
const utils = require("../utils");
|
|
5
5
|
const clc = require("colorette");
|
|
6
6
|
const childProcess = require("child_process");
|
|
@@ -44,13 +44,12 @@ function runCommand(command, childOptions) {
|
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
function getChildEnvironment(target, overallOptions, config) {
|
|
47
|
-
var _a;
|
|
48
47
|
const projectId = needProjectId(overallOptions);
|
|
49
48
|
const projectDir = overallOptions.projectRoot;
|
|
50
49
|
let resourceDir;
|
|
51
50
|
switch (target) {
|
|
52
51
|
case "hosting":
|
|
53
|
-
resourceDir = overallOptions.config.path(
|
|
52
|
+
resourceDir = overallOptions.config.path(config.public ?? config.source);
|
|
54
53
|
break;
|
|
55
54
|
case "functions":
|
|
56
55
|
resourceDir = overallOptions.config.path(config.source);
|
|
@@ -120,7 +119,7 @@ function getReleventConfigs(target, options) {
|
|
|
120
119
|
});
|
|
121
120
|
if (target === "functions") {
|
|
122
121
|
let onlyConfigs = [];
|
|
123
|
-
const matched = onlyTargets.reduce((matched, target) => (
|
|
122
|
+
const matched = onlyTargets.reduce((matched, target) => ({ ...matched, [target]: false }), {});
|
|
124
123
|
for (const config of targetConfigs) {
|
|
125
124
|
if (!config.codebase) {
|
|
126
125
|
onlyConfigs.push(config);
|
|
@@ -153,4 +152,3 @@ function lifecycleHooks(target, hook) {
|
|
|
153
152
|
}, Promise.resolve());
|
|
154
153
|
};
|
|
155
154
|
}
|
|
156
|
-
exports.lifecycleHooks = lifecycleHooks;
|