firebase-tools 15.0.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 +33 -36
- 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 +47 -10
- 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 +31 -31
- 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 +19 -21
- 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 +47 -45
- 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 +7 -4
- 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 +67 -50
- 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
package/lib/apphosting/repo.js
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.parseConnectionName = parseConnectionName;
|
|
4
|
+
exports.linkGitHubRepository = linkGitHubRepository;
|
|
5
|
+
exports.getOrCreateOauthConnection = getOrCreateOauthConnection;
|
|
6
|
+
exports.createConnection = createConnection;
|
|
7
|
+
exports.getOrCreateConnection = getOrCreateConnection;
|
|
8
|
+
exports.getOrCreateRepository = getOrCreateRepository;
|
|
9
|
+
exports.listAppHostingConnections = listAppHostingConnections;
|
|
10
|
+
exports.fetchAllRepositories = fetchAllRepositories;
|
|
4
11
|
const clc = require("colorette");
|
|
5
12
|
const gcb = require("../gcp/cloudbuild");
|
|
6
13
|
const rm = require("../gcp/resourceManager");
|
|
@@ -16,7 +23,7 @@ const APPHOSTING_OAUTH_CONN_NAME = "apphosting-github-oauth";
|
|
|
16
23
|
const CONNECTION_NAME_REGEX = /^projects\/(?<projectId>[^\/]+)\/locations\/(?<location>[^\/]+)\/connections\/(?<id>[^\/]+)$/;
|
|
17
24
|
function parseConnectionName(name) {
|
|
18
25
|
const match = CONNECTION_NAME_REGEX.exec(name);
|
|
19
|
-
if (!match || typeof match.groups === undefined) {
|
|
26
|
+
if (!match || typeof match.groups === "undefined") {
|
|
20
27
|
return;
|
|
21
28
|
}
|
|
22
29
|
const { projectId, location, id } = match.groups;
|
|
@@ -26,7 +33,6 @@ function parseConnectionName(name) {
|
|
|
26
33
|
id,
|
|
27
34
|
};
|
|
28
35
|
}
|
|
29
|
-
exports.parseConnectionName = parseConnectionName;
|
|
30
36
|
const gcbPollerOptions = {
|
|
31
37
|
apiOrigin: (0, api_1.cloudbuildOrigin)(),
|
|
32
38
|
apiVersion: "v2",
|
|
@@ -41,8 +47,7 @@ function extractRepoSlugFromUri(remoteUri) {
|
|
|
41
47
|
return match[1];
|
|
42
48
|
}
|
|
43
49
|
function generateRepositoryId(remoteUri) {
|
|
44
|
-
|
|
45
|
-
return (_a = extractRepoSlugFromUri(remoteUri)) === null || _a === void 0 ? void 0 : _a.replaceAll("/", "-");
|
|
50
|
+
return extractRepoSlugFromUri(remoteUri)?.replaceAll("/", "-");
|
|
46
51
|
}
|
|
47
52
|
function generateConnectionId() {
|
|
48
53
|
const randomHash = Math.random().toString(36).slice(6);
|
|
@@ -50,7 +55,6 @@ function generateConnectionId() {
|
|
|
50
55
|
}
|
|
51
56
|
const ADD_CONN_CHOICE = "@ADD_CONN";
|
|
52
57
|
async function linkGitHubRepository(projectId, location) {
|
|
53
|
-
var _a, _b;
|
|
54
58
|
utils.logBullet(clc.bold(`${clc.yellow("===")} Import a GitHub repository`));
|
|
55
59
|
const oauthConn = await getOrCreateOauthConnection(projectId, location);
|
|
56
60
|
const existingConns = await listAppHostingConnections(projectId);
|
|
@@ -69,19 +73,17 @@ async function linkGitHubRepository(projectId, location) {
|
|
|
69
73
|
} while (repoRemoteUri === ADD_CONN_CHOICE);
|
|
70
74
|
const { id: connectionId } = parseConnectionName(connection.name);
|
|
71
75
|
await getOrCreateConnection(projectId, location, connectionId, {
|
|
72
|
-
authorizerCredential:
|
|
73
|
-
appInstallationId:
|
|
76
|
+
authorizerCredential: connection.githubConfig?.authorizerCredential,
|
|
77
|
+
appInstallationId: connection.githubConfig?.appInstallationId,
|
|
74
78
|
});
|
|
75
79
|
const repo = await getOrCreateRepository(projectId, location, connectionId, repoRemoteUri);
|
|
76
80
|
utils.logSuccess(`Successfully linked GitHub repository at remote URI`);
|
|
77
81
|
utils.logSuccess(`\t${repoRemoteUri}`);
|
|
78
82
|
return repo;
|
|
79
83
|
}
|
|
80
|
-
exports.linkGitHubRepository = linkGitHubRepository;
|
|
81
84
|
async function createFullyInstalledConnection(projectId, location, connectionId, oauthConn) {
|
|
82
|
-
var _a;
|
|
83
85
|
let conn = await createConnection(projectId, location, connectionId, {
|
|
84
|
-
authorizerCredential:
|
|
86
|
+
authorizerCredential: oauthConn.githubConfig?.authorizerCredential,
|
|
85
87
|
});
|
|
86
88
|
while (conn.installationState.stage !== "COMPLETE") {
|
|
87
89
|
utils.logBullet("Install the Cloud Build GitHub app to enable access to GitHub repositories");
|
|
@@ -119,7 +121,6 @@ async function getOrCreateOauthConnection(projectId, location) {
|
|
|
119
121
|
}
|
|
120
122
|
return conn;
|
|
121
123
|
}
|
|
122
|
-
exports.getOrCreateOauthConnection = getOrCreateOauthConnection;
|
|
123
124
|
async function promptRepositoryUri(projectId, connections) {
|
|
124
125
|
const { repos, remoteUriToConnection } = await fetchAllRepositories(projectId, connections);
|
|
125
126
|
const remoteUri = await (0, prompt_1.search)({
|
|
@@ -132,7 +133,7 @@ async function promptRepositoryUri(projectId, connections) {
|
|
|
132
133
|
},
|
|
133
134
|
new prompt_1.Separator(),
|
|
134
135
|
...fuzzy
|
|
135
|
-
.filter(input
|
|
136
|
+
.filter(input ?? "", repos, {
|
|
136
137
|
extract: (repo) => extractRepoSlugFromUri(repo.remoteUri) || "",
|
|
137
138
|
})
|
|
138
139
|
.map((result) => {
|
|
@@ -167,10 +168,13 @@ async function ensureSecretManagerAdminGrant(projectId) {
|
|
|
167
168
|
}
|
|
168
169
|
async function createConnection(projectId, location, connectionId, githubConfig) {
|
|
169
170
|
const op = await gcb.createConnection(projectId, location, connectionId, githubConfig);
|
|
170
|
-
const conn = await poller.pollOperation(
|
|
171
|
+
const conn = await poller.pollOperation({
|
|
172
|
+
...gcbPollerOptions,
|
|
173
|
+
pollerName: `create-${location}-${connectionId}`,
|
|
174
|
+
operationResourceName: op.name,
|
|
175
|
+
});
|
|
171
176
|
return conn;
|
|
172
177
|
}
|
|
173
|
-
exports.createConnection = createConnection;
|
|
174
178
|
async function getOrCreateConnection(projectId, location, connectionId, githubConfig) {
|
|
175
179
|
let conn;
|
|
176
180
|
try {
|
|
@@ -186,7 +190,6 @@ async function getOrCreateConnection(projectId, location, connectionId, githubCo
|
|
|
186
190
|
}
|
|
187
191
|
return conn;
|
|
188
192
|
}
|
|
189
|
-
exports.getOrCreateConnection = getOrCreateConnection;
|
|
190
193
|
async function getOrCreateRepository(projectId, location, connectionId, remoteUri) {
|
|
191
194
|
const repositoryId = generateRepositoryId(remoteUri);
|
|
192
195
|
if (!repositoryId) {
|
|
@@ -199,7 +202,11 @@ async function getOrCreateRepository(projectId, location, connectionId, remoteUr
|
|
|
199
202
|
catch (err) {
|
|
200
203
|
if (err.status === 404) {
|
|
201
204
|
const op = await gcb.createRepository(projectId, location, connectionId, repositoryId, remoteUri);
|
|
202
|
-
repo = await poller.pollOperation(
|
|
205
|
+
repo = await poller.pollOperation({
|
|
206
|
+
...gcbPollerOptions,
|
|
207
|
+
pollerName: `create-${location}-${connectionId}-${repositoryId}`,
|
|
208
|
+
operationResourceName: op.name,
|
|
209
|
+
});
|
|
203
210
|
}
|
|
204
211
|
else {
|
|
205
212
|
throw err;
|
|
@@ -207,14 +214,12 @@ async function getOrCreateRepository(projectId, location, connectionId, remoteUr
|
|
|
207
214
|
}
|
|
208
215
|
return repo;
|
|
209
216
|
}
|
|
210
|
-
exports.getOrCreateRepository = getOrCreateRepository;
|
|
211
217
|
async function listAppHostingConnections(projectId) {
|
|
212
218
|
const conns = await gcb.listConnections(projectId, "-");
|
|
213
219
|
return conns.filter((conn) => APPHOSTING_CONN_PATTERN.test(conn.name) &&
|
|
214
220
|
conn.installationState.stage === "COMPLETE" &&
|
|
215
221
|
!conn.disabled);
|
|
216
222
|
}
|
|
217
|
-
exports.listAppHostingConnections = listAppHostingConnections;
|
|
218
223
|
async function fetchAllRepositories(projectId, connections) {
|
|
219
224
|
const repos = [];
|
|
220
225
|
const remoteUriToConnection = {};
|
|
@@ -236,4 +241,3 @@ async function fetchAllRepositories(projectId, connections) {
|
|
|
236
241
|
}
|
|
237
242
|
return { repos, remoteUriToConnection };
|
|
238
243
|
}
|
|
239
|
-
exports.fetchAllRepositories = fetchAllRepositories;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.createRollout = createRollout;
|
|
4
|
+
exports.orchestrateRollout = orchestrateRollout;
|
|
4
5
|
const apphosting = require("../gcp/apphosting");
|
|
5
6
|
const error_1 = require("../error");
|
|
6
7
|
const ora = require("ora");
|
|
@@ -79,7 +80,6 @@ async function createRollout(backendId, projectId, branch, commit, force) {
|
|
|
79
80
|
}
|
|
80
81
|
createRolloutSpinner.succeed("Successfully created a new rollout!");
|
|
81
82
|
}
|
|
82
|
-
exports.createRollout = createRollout;
|
|
83
83
|
async function orchestrateRollout(args) {
|
|
84
84
|
const { projectId, location, backendId, buildInput, isFirstRollout } = args;
|
|
85
85
|
const buildId = await apphosting.getNextRolloutId(projectId, location, backendId, isFirstRollout ? 1 : undefined);
|
|
@@ -109,8 +109,16 @@ async function orchestrateRollout(args) {
|
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
111
|
const rolloutOp = await apphosting.createRollout(projectId, location, backendId, buildId, rolloutBody);
|
|
112
|
-
const rolloutPoll = poller.pollOperation(
|
|
113
|
-
|
|
112
|
+
const rolloutPoll = poller.pollOperation({
|
|
113
|
+
...apphostingPollerOptions,
|
|
114
|
+
pollerName: `create-${projectId}-${location}-backend-${backendId}-rollout-${buildId}`,
|
|
115
|
+
operationResourceName: rolloutOp.name,
|
|
116
|
+
});
|
|
117
|
+
const buildPoll = poller.pollOperation({
|
|
118
|
+
...apphostingPollerOptions,
|
|
119
|
+
pollerName: `create-${projectId}-${location}-backend-${backendId}-build-${buildId}`,
|
|
120
|
+
operationResourceName: buildOp.name,
|
|
121
|
+
});
|
|
114
122
|
const [rollout, build] = await Promise.all([rolloutPoll, buildPoll]);
|
|
115
123
|
if (build.state !== "READY") {
|
|
116
124
|
if (!build.buildLogsUri) {
|
|
@@ -121,4 +129,3 @@ async function orchestrateRollout(args) {
|
|
|
121
129
|
}
|
|
122
130
|
return { rollout, build };
|
|
123
131
|
}
|
|
124
|
-
exports.orchestrateRollout = orchestrateRollout;
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.GRANT_ACCESS_IN_FUTURE = exports.WARN_NO_BACKENDS = void 0;
|
|
4
|
+
exports.toMetadata = toMetadata;
|
|
5
|
+
exports.serviceAccountDisplay = serviceAccountDisplay;
|
|
6
|
+
exports.tableForBackends = tableForBackends;
|
|
7
|
+
exports.selectFromMetadata = selectFromMetadata;
|
|
8
|
+
exports.selectBackendServiceAccounts = selectBackendServiceAccounts;
|
|
9
|
+
exports.envVarForSecret = envVarForSecret;
|
|
4
10
|
const clc = require("colorette");
|
|
5
11
|
const Table = require("cli-table3");
|
|
6
12
|
const _1 = require(".");
|
|
@@ -13,7 +19,7 @@ async function toMetadata(projectNumber, backends) {
|
|
|
13
19
|
const metadata = [];
|
|
14
20
|
for (const backend of backends) {
|
|
15
21
|
const [, , , location, , id] = backend.name.split("/");
|
|
16
|
-
metadata.push(
|
|
22
|
+
metadata.push({ location, id, ...(await (0, _1.serviceAccountsForBackend)(projectNumber, backend)) });
|
|
17
23
|
}
|
|
18
24
|
return metadata.sort((left, right) => {
|
|
19
25
|
const cmplocation = left.location.localeCompare(right.location);
|
|
@@ -23,14 +29,12 @@ async function toMetadata(projectNumber, backends) {
|
|
|
23
29
|
return left.id.localeCompare(right.id);
|
|
24
30
|
});
|
|
25
31
|
}
|
|
26
|
-
exports.toMetadata = toMetadata;
|
|
27
32
|
function serviceAccountDisplay(metadata) {
|
|
28
33
|
if (sameServiceAccount(metadata)) {
|
|
29
34
|
return metadata.runServiceAccount;
|
|
30
35
|
}
|
|
31
36
|
return `${metadata.buildServiceAccount}, ${metadata.runServiceAccount}`;
|
|
32
37
|
}
|
|
33
|
-
exports.serviceAccountDisplay = serviceAccountDisplay;
|
|
34
38
|
function sameServiceAccount(metadata) {
|
|
35
39
|
return metadata.buildServiceAccount === metadata.runServiceAccount;
|
|
36
40
|
}
|
|
@@ -47,7 +51,6 @@ function tableForBackends(metadata) {
|
|
|
47
51
|
const rows = metadata.map((m) => [m.location, m.id, serviceAccountDisplay(m)]);
|
|
48
52
|
return [headers, rows];
|
|
49
53
|
}
|
|
50
|
-
exports.tableForBackends = tableForBackends;
|
|
51
54
|
function selectFromMetadata(input, selected) {
|
|
52
55
|
const buildAccounts = new Set();
|
|
53
56
|
const runAccounts = new Set();
|
|
@@ -64,7 +67,6 @@ function selectFromMetadata(input, selected) {
|
|
|
64
67
|
runServiceAccounts: [...runAccounts],
|
|
65
68
|
};
|
|
66
69
|
}
|
|
67
|
-
exports.selectFromMetadata = selectFromMetadata;
|
|
68
70
|
exports.WARN_NO_BACKENDS = "To use this secret, your backend's service account must be granted access." +
|
|
69
71
|
"It does not look like you have a backend yet. After creating a backend, grant access with " +
|
|
70
72
|
clc.bold("firebase apphosting:secrets:grantaccess");
|
|
@@ -135,7 +137,6 @@ async function selectBackendServiceAccounts(projectNumber, projectId, options) {
|
|
|
135
137
|
}
|
|
136
138
|
return selectFromMetadata(metadata, chosen);
|
|
137
139
|
}
|
|
138
|
-
exports.selectBackendServiceAccounts = selectBackendServiceAccounts;
|
|
139
140
|
function toUpperSnakeCase(key) {
|
|
140
141
|
return key
|
|
141
142
|
.replace(/[.-]/g, "_")
|
|
@@ -152,7 +153,7 @@ async function envVarForSecret(secret, trimTestPrefix = false) {
|
|
|
152
153
|
env.validateKey(secret);
|
|
153
154
|
return secret;
|
|
154
155
|
}
|
|
155
|
-
catch
|
|
156
|
+
catch {
|
|
156
157
|
}
|
|
157
158
|
}
|
|
158
159
|
do {
|
|
@@ -169,4 +170,3 @@ async function envVarForSecret(secret, trimTestPrefix = false) {
|
|
|
169
170
|
}
|
|
170
171
|
} while (true);
|
|
171
172
|
}
|
|
172
|
-
exports.envVarForSecret = envVarForSecret;
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.toMulti = toMulti;
|
|
4
|
+
exports.serviceAccountsForBackend = serviceAccountsForBackend;
|
|
5
|
+
exports.grantSecretAccess = grantSecretAccess;
|
|
6
|
+
exports.grantEmailsSecretAccess = grantEmailsSecretAccess;
|
|
7
|
+
exports.upsertSecret = upsertSecret;
|
|
8
|
+
exports.fetchSecrets = fetchSecrets;
|
|
9
|
+
exports.getSecretNameParts = getSecretNameParts;
|
|
4
10
|
const error_1 = require("../../error");
|
|
5
11
|
const gcsm = require("../../gcp/secretManager");
|
|
6
12
|
const gcb = require("../../gcp/cloudbuild");
|
|
@@ -20,7 +26,6 @@ function toMulti(accounts) {
|
|
|
20
26
|
}
|
|
21
27
|
return m;
|
|
22
28
|
}
|
|
23
|
-
exports.toMulti = toMulti;
|
|
24
29
|
async function serviceAccountsForBackend(projectNumber, backend) {
|
|
25
30
|
if (backend.serviceAccount) {
|
|
26
31
|
return {
|
|
@@ -33,7 +38,6 @@ async function serviceAccountsForBackend(projectNumber, backend) {
|
|
|
33
38
|
runServiceAccount: await gce.getDefaultServiceAccount(projectNumber),
|
|
34
39
|
};
|
|
35
40
|
}
|
|
36
|
-
exports.serviceAccountsForBackend = serviceAccountsForBackend;
|
|
37
41
|
async function grantSecretAccess(projectId, projectNumber, secretName, accounts) {
|
|
38
42
|
const p4saEmail = apphosting.serviceAgentEmail(projectNumber);
|
|
39
43
|
const newBindings = [
|
|
@@ -67,7 +71,6 @@ async function grantSecretAccess(projectId, projectNumber, secretName, accounts)
|
|
|
67
71
|
}
|
|
68
72
|
utils.logSuccess(`Successfully set IAM bindings on secret ${secretName}.\n`);
|
|
69
73
|
}
|
|
70
|
-
exports.grantSecretAccess = grantSecretAccess;
|
|
71
74
|
async function grantEmailsSecretAccess(projectId, secretNames, emails) {
|
|
72
75
|
const typeGuesses = Object.fromEntries(emails.map((email) => [email, "user"]));
|
|
73
76
|
for (const secretName of secretNames) {
|
|
@@ -108,9 +111,7 @@ async function grantEmailsSecretAccess(projectId, secretNames, emails) {
|
|
|
108
111
|
utils.logSuccess(`Successfully set IAM bindings on secret ${secretName}.\n`);
|
|
109
112
|
}
|
|
110
113
|
}
|
|
111
|
-
exports.grantEmailsSecretAccess = grantEmailsSecretAccess;
|
|
112
114
|
async function upsertSecret(project, secret, location) {
|
|
113
|
-
var _a, _b, _c, _d;
|
|
114
115
|
let existing;
|
|
115
116
|
try {
|
|
116
117
|
existing = await gcsm.getSecret(project, secret);
|
|
@@ -122,9 +123,9 @@ async function upsertSecret(project, secret, location) {
|
|
|
122
123
|
await gcsm.createSecret(project, secret, gcsm.labels("apphosting"), location);
|
|
123
124
|
return true;
|
|
124
125
|
}
|
|
125
|
-
const replication =
|
|
126
|
+
const replication = existing.replication?.userManaged;
|
|
126
127
|
if (location &&
|
|
127
|
-
(
|
|
128
|
+
(replication?.replicas?.length !== 1 || replication?.replicas?.[0]?.location !== location)) {
|
|
128
129
|
utils.logLabeledError("apphosting", "Secret replication policies cannot be changed after creation");
|
|
129
130
|
return null;
|
|
130
131
|
}
|
|
@@ -143,7 +144,6 @@ async function upsertSecret(project, secret, location) {
|
|
|
143
144
|
}
|
|
144
145
|
return false;
|
|
145
146
|
}
|
|
146
|
-
exports.upsertSecret = upsertSecret;
|
|
147
147
|
async function fetchSecrets(projectId, secrets) {
|
|
148
148
|
let secretsKeyValuePairs;
|
|
149
149
|
try {
|
|
@@ -162,7 +162,6 @@ async function fetchSecrets(projectId, secrets) {
|
|
|
162
162
|
}
|
|
163
163
|
return secretsKeyValuePairs;
|
|
164
164
|
}
|
|
165
|
-
exports.fetchSecrets = fetchSecrets;
|
|
166
165
|
function getSecretNameParts(secret) {
|
|
167
166
|
let [name, version] = secret.split("@");
|
|
168
167
|
if (!version) {
|
|
@@ -170,4 +169,3 @@ function getSecretNameParts(secret) {
|
|
|
170
169
|
}
|
|
171
170
|
return [name, version];
|
|
172
171
|
}
|
|
173
|
-
exports.getSecretNameParts = getSecretNameParts;
|
package/lib/apphosting/utils.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getEnvironmentName = getEnvironmentName;
|
|
4
|
+
exports.promptForAppHostingYaml = promptForAppHostingYaml;
|
|
4
5
|
const error_1 = require("../error");
|
|
5
6
|
const config_1 = require("./config");
|
|
6
7
|
const prompt = require("../prompt");
|
|
@@ -11,7 +12,6 @@ function getEnvironmentName(apphostingYamlFileName) {
|
|
|
11
12
|
}
|
|
12
13
|
return found[1].replaceAll(".", "");
|
|
13
14
|
}
|
|
14
|
-
exports.getEnvironmentName = getEnvironmentName;
|
|
15
15
|
async function promptForAppHostingYaml(apphostingFileNameToPathMap, promptMessage = "Please select an App Hosting config:") {
|
|
16
16
|
const fileNames = Array.from(apphostingFileNameToPathMap.keys());
|
|
17
17
|
const baseFilePath = apphostingFileNameToPathMap.get(config_1.APPHOSTING_BASE_YAML_FILE);
|
|
@@ -36,4 +36,3 @@ async function promptForAppHostingYaml(apphostingFileNameToPathMap, promptMessag
|
|
|
36
36
|
});
|
|
37
37
|
return fileToExportPath;
|
|
38
38
|
}
|
|
39
|
-
exports.promptForAppHostingYaml = promptForAppHostingYaml;
|
package/lib/apphosting/yaml.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.AppHostingYamlConfig = void 0;
|
|
4
|
+
exports.toEnvMap = toEnvMap;
|
|
5
|
+
exports.toEnvList = toEnvList;
|
|
4
6
|
const path_1 = require("path");
|
|
5
7
|
const utils_1 = require("../utils");
|
|
6
8
|
const config_1 = require("./config");
|
|
@@ -14,14 +16,13 @@ class AppHostingYamlConfig {
|
|
|
14
16
|
this.env = {};
|
|
15
17
|
}
|
|
16
18
|
static async loadFromFile(filePath) {
|
|
17
|
-
var _a;
|
|
18
19
|
if (!(0, fsutils_1.fileExistsSync)(filePath)) {
|
|
19
20
|
throw new error_1.FirebaseError(`Cannot load ${filePath} from given path, it doesn't exist`);
|
|
20
21
|
}
|
|
21
22
|
const config = new AppHostingYamlConfig();
|
|
22
23
|
const file = await (0, utils_1.readFileFromDirectory)((0, path_1.dirname)(filePath), (0, path_1.basename)(filePath));
|
|
23
24
|
config.filename = path.basename(filePath);
|
|
24
|
-
const loadedAppHostingYaml = (
|
|
25
|
+
const loadedAppHostingYaml = (await (0, utils_1.wrappedSafeLoad)(file.source)) ?? {};
|
|
25
26
|
if (loadedAppHostingYaml.env) {
|
|
26
27
|
config.env = toEnvMap(loadedAppHostingYaml.env);
|
|
27
28
|
}
|
|
@@ -31,16 +32,18 @@ class AppHostingYamlConfig {
|
|
|
31
32
|
return new AppHostingYamlConfig();
|
|
32
33
|
}
|
|
33
34
|
merge(other, allowSecretsToBecomePlaintext = true) {
|
|
34
|
-
var _a;
|
|
35
35
|
if (!allowSecretsToBecomePlaintext) {
|
|
36
36
|
const wereSecrets = Object.entries(this.env)
|
|
37
37
|
.filter(([, env]) => env.secret)
|
|
38
38
|
.map(([key]) => key);
|
|
39
|
-
if (wereSecrets.some((key) =>
|
|
40
|
-
throw new error_1.FirebaseError(`Cannot convert secret to plaintext in ${
|
|
39
|
+
if (wereSecrets.some((key) => other.env[key]?.value)) {
|
|
40
|
+
throw new error_1.FirebaseError(`Cannot convert secret to plaintext in ${other.filename ?? "apphosting yaml"}`);
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
-
this.env =
|
|
43
|
+
this.env = {
|
|
44
|
+
...this.env,
|
|
45
|
+
...other.env,
|
|
46
|
+
};
|
|
44
47
|
}
|
|
45
48
|
async upsertFile(filePath) {
|
|
46
49
|
let yamlConfigToWrite = {};
|
|
@@ -56,15 +59,13 @@ exports.AppHostingYamlConfig = AppHostingYamlConfig;
|
|
|
56
59
|
function toEnvMap(envs) {
|
|
57
60
|
return Object.fromEntries(envs.map((env) => {
|
|
58
61
|
const variable = env.variable;
|
|
59
|
-
const tmp =
|
|
62
|
+
const tmp = { ...env };
|
|
60
63
|
delete env.variable;
|
|
61
64
|
return [variable, tmp];
|
|
62
65
|
}));
|
|
63
66
|
}
|
|
64
|
-
exports.toEnvMap = toEnvMap;
|
|
65
67
|
function toEnvList(envs) {
|
|
66
68
|
return Object.entries(envs).map(([variable, env]) => {
|
|
67
|
-
return
|
|
69
|
+
return { ...env, variable };
|
|
68
70
|
});
|
|
69
71
|
}
|
|
70
|
-
exports.toEnvList = toEnvList;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ensureProjectConfigured =
|
|
3
|
+
exports.ensureProjectConfigured = ensureProjectConfigured;
|
|
4
4
|
const resourceManager_1 = require("../gcp/resourceManager");
|
|
5
5
|
const ensureApiEnabled_1 = require("../ensureApiEnabled");
|
|
6
6
|
const api_1 = require("../api");
|
|
@@ -29,7 +29,6 @@ async function ensureProjectConfigured(projectId) {
|
|
|
29
29
|
await provisionServiceAccount(projectId, serviceAccount);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
-
exports.ensureProjectConfigured = ensureProjectConfigured;
|
|
33
32
|
async function provisionServiceAccount(projectId, serviceAccount) {
|
|
34
33
|
try {
|
|
35
34
|
await iam.createServiceAccount(projectId, TEST_RUNNER_SERVICE_ACCOUNT_NAME, "Service Account used in Cloud Run, responsible for running tests", "Firebase App Testing Test Runner");
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.invokeTests = invokeTests;
|
|
4
|
+
exports.pollInvocationStatus = pollInvocationStatus;
|
|
4
5
|
const apiv2_1 = require("../apiv2");
|
|
5
6
|
const api_1 = require("../api");
|
|
6
7
|
const operationPoller = require("../operation-poller");
|
|
@@ -16,7 +17,6 @@ async function invokeTests(appId, startUri, testDefs) {
|
|
|
16
17
|
throw new error_1.FirebaseError("Test invocation failed", { original: (0, error_1.getError)(err) });
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
|
-
exports.invokeTests = invokeTests;
|
|
20
20
|
function buildInvokeTestCasesRequest(testCaseInvocations) {
|
|
21
21
|
return {
|
|
22
22
|
resource: {
|
|
@@ -37,4 +37,3 @@ async function pollInvocationStatus(operationName, onPoll, backoff = 30 * 1000)
|
|
|
37
37
|
onPoll,
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
|
-
exports.pollInvocationStatus = pollInvocationStatus;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseTestFiles =
|
|
3
|
+
exports.parseTestFiles = parseTestFiles;
|
|
4
4
|
const fsutils_1 = require("../fsutils");
|
|
5
5
|
const path_1 = require("path");
|
|
6
6
|
const logger_1 = require("../logger");
|
|
@@ -58,12 +58,11 @@ async function parseTestFiles(dir, targetUri, filePattern, namePattern) {
|
|
|
58
58
|
}
|
|
59
59
|
return parseTestFilesRecursive(dir);
|
|
60
60
|
}
|
|
61
|
-
exports.parseTestFiles = parseTestFiles;
|
|
62
61
|
function toTestDef(testDef, targetUri, defaultConfig) {
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
const
|
|
66
|
-
|
|
62
|
+
const steps = testDef.steps ?? [];
|
|
63
|
+
const route = testDef.testConfig?.route ?? defaultConfig?.route ?? "";
|
|
64
|
+
const browsers = testDef.testConfig?.browsers ??
|
|
65
|
+
defaultConfig?.browsers ?? [types_1.Browser.CHROME];
|
|
67
66
|
return {
|
|
68
67
|
testCase: {
|
|
69
68
|
startUri: targetUri + route,
|
package/lib/apptesting/types.js
CHANGED
|
@@ -5,7 +5,7 @@ var Browser;
|
|
|
5
5
|
(function (Browser) {
|
|
6
6
|
Browser["BROWSER_UNSPECIFIED"] = "BROWSER_UNSPECIFIED";
|
|
7
7
|
Browser["CHROME"] = "CHROME";
|
|
8
|
-
})(Browser
|
|
8
|
+
})(Browser || (exports.Browser = Browser = {}));
|
|
9
9
|
var CompletionReason;
|
|
10
10
|
(function (CompletionReason) {
|
|
11
11
|
CompletionReason[CompletionReason["COMPLETION_REASON_UNSPECIFIED"] = 0] = "COMPLETION_REASON_UNSPECIFIED";
|
|
@@ -15,4 +15,4 @@ var CompletionReason;
|
|
|
15
15
|
CompletionReason[CompletionReason["GOAL_INCONCLUSIVE"] = 4] = "GOAL_INCONCLUSIVE";
|
|
16
16
|
CompletionReason[CompletionReason["TEST_CANCELLED"] = 5] = "TEST_CANCELLED";
|
|
17
17
|
CompletionReason[CompletionReason["GOAL_SUCCEEDED"] = 6] = "GOAL_SUCCEEDED";
|
|
18
|
-
})(CompletionReason
|
|
18
|
+
})(CompletionReason || (exports.CompletionReason = CompletionReason = {}));
|
package/lib/archiveDirectory.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.archiveDirectory =
|
|
3
|
+
exports.archiveDirectory = archiveDirectory;
|
|
4
4
|
const archiver = require("archiver");
|
|
5
5
|
const filesize = require("filesize");
|
|
6
6
|
const fs = require("fs");
|
|
@@ -31,7 +31,6 @@ async function archiveDirectory(sourceDirectory, options = {}) {
|
|
|
31
31
|
throw new error_1.FirebaseError("Failed to create archive.", { original: (0, error_1.getError)(err) });
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
|
-
exports.archiveDirectory = archiveDirectory;
|
|
35
34
|
async function zipDirectory(sourceDirectory, tempFile, options) {
|
|
36
35
|
const archiveFileStream = fs.createWriteStream(tempFile.name, {
|
|
37
36
|
flags: "w",
|