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
|
@@ -17,7 +17,6 @@ exports.command = new command_1.Command("dataconnect:services:list")
|
|
|
17
17
|
"dataconnect.connectors.list",
|
|
18
18
|
])
|
|
19
19
|
.action(async (options) => {
|
|
20
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
21
20
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
22
21
|
await (0, ensureApis_1.ensureApis)(projectId);
|
|
23
22
|
const services = await client.listAllServices(projectId);
|
|
@@ -34,23 +33,23 @@ exports.command = new command_1.Command("dataconnect:services:list")
|
|
|
34
33
|
});
|
|
35
34
|
const jsonOutput = { services: [] };
|
|
36
35
|
for (const service of services) {
|
|
37
|
-
const schema = (
|
|
36
|
+
const schema = (await client.getSchema(service.name)) ?? {
|
|
38
37
|
name: "",
|
|
39
38
|
datasources: [{}],
|
|
40
39
|
source: { files: [] },
|
|
41
40
|
};
|
|
42
41
|
const connectors = await client.listConnectors(service.name);
|
|
43
42
|
const serviceName = names.parseServiceName(service.name);
|
|
44
|
-
const postgresDatasource = schema
|
|
45
|
-
const instanceName =
|
|
43
|
+
const postgresDatasource = schema?.datasources.find((d) => d.postgresql);
|
|
44
|
+
const instanceName = postgresDatasource?.postgresql?.cloudSql?.instance ?? "";
|
|
46
45
|
const instanceId = instanceName.split("/").pop();
|
|
47
|
-
const dbId =
|
|
46
|
+
const dbId = postgresDatasource?.postgresql?.database ?? "";
|
|
48
47
|
const dbName = `CloudSQL Instance: ${instanceId}\nDatabase: ${dbId}`;
|
|
49
48
|
table.push([
|
|
50
49
|
serviceName.serviceId,
|
|
51
50
|
serviceName.location,
|
|
52
51
|
dbName,
|
|
53
|
-
|
|
52
|
+
schema?.updateTime ?? "",
|
|
54
53
|
"",
|
|
55
54
|
"",
|
|
56
55
|
]);
|
|
@@ -58,7 +57,7 @@ exports.command = new command_1.Command("dataconnect:services:list")
|
|
|
58
57
|
serviceId: serviceName.serviceId,
|
|
59
58
|
location: serviceName.location,
|
|
60
59
|
datasource: dbName,
|
|
61
|
-
schemaUpdateTime: schema
|
|
60
|
+
schemaUpdateTime: schema?.updateTime,
|
|
62
61
|
connectors: [],
|
|
63
62
|
};
|
|
64
63
|
for (const conn of connectors) {
|
|
@@ -66,7 +65,7 @@ exports.command = new command_1.Command("dataconnect:services:list")
|
|
|
66
65
|
table.push(["", "", "", "", connectorName.connectorId, conn.updateTime]);
|
|
67
66
|
serviceJson.connectors.push({
|
|
68
67
|
connectorId: connectorName.connectorId,
|
|
69
|
-
connectorLastUpdated:
|
|
68
|
+
connectorLastUpdated: conn.updateTime ?? "",
|
|
70
69
|
});
|
|
71
70
|
}
|
|
72
71
|
jsonOutput.services.push(serviceJson);
|
|
@@ -20,10 +20,9 @@ exports.command = new command_1.Command("dataconnect:sql:diff")
|
|
|
20
20
|
])
|
|
21
21
|
.before(requireAuth_1.requireAuth)
|
|
22
22
|
.action(async (options) => {
|
|
23
|
-
var _a;
|
|
24
23
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
25
24
|
await (0, ensureApis_1.ensureApis)(projectId);
|
|
26
25
|
const serviceInfo = await (0, load_1.pickOneService)(projectId, options.config, options.service, options.location);
|
|
27
|
-
const diffs = await (0, schemaMigration_1.diffSchema)(options, (0, types_1.mainSchema)(serviceInfo.schemas), (
|
|
26
|
+
const diffs = await (0, schemaMigration_1.diffSchema)(options, (0, types_1.mainSchema)(serviceInfo.schemas), (0, types_1.mainSchemaYaml)(serviceInfo.dataConnectYaml).datasource.postgresql?.schemaValidation);
|
|
28
27
|
return { projectId, diffs };
|
|
29
28
|
});
|
|
@@ -24,11 +24,11 @@ exports.command = new command_1.Command("dataconnect:sql:migrate")
|
|
|
24
24
|
.before(requireAuth_1.requireAuth)
|
|
25
25
|
.withForce("execute any required database changes without prompting")
|
|
26
26
|
.action(async (options) => {
|
|
27
|
-
var _a, _b;
|
|
28
27
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
29
28
|
await (0, ensureApis_1.ensureApis)(projectId);
|
|
30
29
|
const serviceInfo = await (0, load_1.pickOneService)(projectId, options.config, options.service, options.location);
|
|
31
|
-
const instanceId = (
|
|
30
|
+
const instanceId = (0, types_1.mainSchemaYaml)(serviceInfo.dataConnectYaml).datasource.postgresql?.cloudSql
|
|
31
|
+
.instanceId;
|
|
32
32
|
if (!instanceId) {
|
|
33
33
|
throw new error_1.FirebaseError("dataconnect.yaml is missing field schema.datasource.postgresql.cloudsql.instanceId");
|
|
34
34
|
}
|
|
@@ -36,7 +36,8 @@ exports.command = new command_1.Command("dataconnect:sql:migrate")
|
|
|
36
36
|
options,
|
|
37
37
|
schema: (0, types_1.mainSchema)(serviceInfo.schemas),
|
|
38
38
|
validateOnly: true,
|
|
39
|
-
schemaValidation: (
|
|
39
|
+
schemaValidation: (0, types_1.mainSchemaYaml)(serviceInfo.dataConnectYaml).datasource.postgresql
|
|
40
|
+
?.schemaValidation,
|
|
40
41
|
});
|
|
41
42
|
if (diffs.length) {
|
|
42
43
|
(0, utils_1.logLabeledSuccess)("dataconnect", `Database schema sucessfully migrated! Run 'firebase deploy' to deploy your new schema to your Data Connect service.`);
|
|
@@ -25,11 +25,11 @@ exports.command = new command_1.Command("dataconnect:sql:setup")
|
|
|
25
25
|
])
|
|
26
26
|
.before(requireAuth_1.requireAuth)
|
|
27
27
|
.action(async (options) => {
|
|
28
|
-
var _a;
|
|
29
28
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
30
29
|
await (0, ensureApis_1.ensureApis)(projectId);
|
|
31
30
|
const serviceInfo = await (0, load_1.pickOneService)(projectId, options.config, options.service, options.location);
|
|
32
|
-
const instanceId = (
|
|
31
|
+
const instanceId = (0, types_1.mainSchemaYaml)(serviceInfo.dataConnectYaml).datasource.postgresql?.cloudSql
|
|
32
|
+
.instanceId;
|
|
33
33
|
if (!instanceId) {
|
|
34
34
|
throw new error_1.FirebaseError("dataconnect.yaml is missing field schema.datasource.postgresql.cloudsql.instanceId");
|
|
35
35
|
}
|
|
@@ -98,7 +98,11 @@ exports.command = new command_1.Command("dataconnect:sql:shell")
|
|
|
98
98
|
ipType: cloud_sql_connector_1.IpAddressTypes.PUBLIC,
|
|
99
99
|
authType: cloud_sql_connector_1.AuthTypes.IAM,
|
|
100
100
|
});
|
|
101
|
-
const pool = new pg.Pool(
|
|
101
|
+
const pool = new pg.Pool({
|
|
102
|
+
...clientOpts,
|
|
103
|
+
user: username,
|
|
104
|
+
database: databaseId,
|
|
105
|
+
});
|
|
102
106
|
const conn = await pool.connect();
|
|
103
107
|
logger_1.logger.info(`Logged in as ${username}`);
|
|
104
108
|
logger_1.logger.info(clc.cyan("Welcome to Data Connect Cloud SQL Shell"));
|
|
@@ -55,8 +55,7 @@ function printEmulatorOverview(options) {
|
|
|
55
55
|
reservedPorts.push(info.port);
|
|
56
56
|
}
|
|
57
57
|
controller.filterEmulatorTargets(options).forEach((emulator) => {
|
|
58
|
-
|
|
59
|
-
reservedPorts.push(...(((_a = registry_1.EmulatorRegistry.getInfo(emulator)) === null || _a === void 0 ? void 0 : _a.reservedPorts) || []));
|
|
58
|
+
reservedPorts.push(...(registry_1.EmulatorRegistry.getInfo(emulator)?.reservedPorts || []));
|
|
60
59
|
});
|
|
61
60
|
}
|
|
62
61
|
const reservedPortsString = reservedPorts.length > 0 ? reservedPorts.join(", ") : "None";
|
|
@@ -28,7 +28,6 @@ exports.command = new command_1.Command("ext:configure <extensionInstanceId>")
|
|
|
28
28
|
.before(checkMinRequiredVersion_1.checkMinRequiredVersion, "extMinVersion")
|
|
29
29
|
.before(extensionsHelper_1.diagnoseAndFixProject)
|
|
30
30
|
.action(async (instanceId, options) => {
|
|
31
|
-
var _a, _b;
|
|
32
31
|
const projectId = (0, projectUtils_1.getProjectId)(options);
|
|
33
32
|
if (options.nonInteractive) {
|
|
34
33
|
throw new error_1.FirebaseError(`Command not supported in non-interactive mode, edit ./extensions/${instanceId}.env directly instead. ` +
|
|
@@ -53,8 +52,8 @@ exports.command = new command_1.Command("ext:configure <extensionInstanceId>")
|
|
|
53
52
|
instanceId,
|
|
54
53
|
projectDir: config.projectDir,
|
|
55
54
|
});
|
|
56
|
-
const params = (
|
|
57
|
-
const [immutableParams, tbdParams] = (0, functional_1.partition)(params, (param) =>
|
|
55
|
+
const params = (spec.params ?? []).concat(spec.systemParams ?? []);
|
|
56
|
+
const [immutableParams, tbdParams] = (0, functional_1.partition)(params, (param) => (param.immutable && !!oldParamValues[param.param]) ?? false);
|
|
58
57
|
infoImmutableParams(immutableParams, oldParamValues);
|
|
59
58
|
paramHelper.setNewDefaults(tbdParams, oldParamValues);
|
|
60
59
|
const mutableParamsBindingOptions = await paramHelper.getParams({
|
|
@@ -73,7 +72,10 @@ exports.command = new command_1.Command("ext:configure <extensionInstanceId>")
|
|
|
73
72
|
baseValue: eventsConfig.allowedEventTypes.join(","),
|
|
74
73
|
};
|
|
75
74
|
}
|
|
76
|
-
const newParamOptions =
|
|
75
|
+
const newParamOptions = {
|
|
76
|
+
...(0, paramHelper_1.buildBindingOptionsWithBaseValue)(oldParamValues),
|
|
77
|
+
...mutableParamsBindingOptions,
|
|
78
|
+
};
|
|
77
79
|
await manifest.writeToManifest([
|
|
78
80
|
{
|
|
79
81
|
instanceId,
|
|
@@ -33,12 +33,11 @@ exports.command = new command_1.Command("ext:dev:list <publisherId>")
|
|
|
33
33
|
});
|
|
34
34
|
const sorted = extensions.sort((a, b) => a.ref.localeCompare(b.ref));
|
|
35
35
|
sorted.forEach((extension) => {
|
|
36
|
-
var _a, _b;
|
|
37
36
|
table.push([
|
|
38
37
|
(0, utils_1.last)(extension.ref.split("/")),
|
|
39
38
|
(0, extensionsHelper_1.unpackExtensionState)(extension),
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
extension.latestVersion ?? "-",
|
|
40
|
+
extension.latestApprovedVersion ?? "-",
|
|
42
41
|
]);
|
|
43
42
|
});
|
|
44
43
|
(0, utils_1.logLabeledBullet)(extensionsHelper_1.logPrefix, `list of uploaded extensions for publisher ${clc.bold(publisherId)}:`);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.command = void 0;
|
|
4
|
+
exports.uploadExtensionAction = uploadExtensionAction;
|
|
4
5
|
const clc = require("colorette");
|
|
5
6
|
const marked_1 = require("marked");
|
|
6
7
|
const marked_terminal_1 = require("marked-terminal");
|
|
@@ -83,4 +84,3 @@ async function uploadExtensionAction(extensionRef, options) {
|
|
|
83
84
|
}
|
|
84
85
|
return res;
|
|
85
86
|
}
|
|
86
|
-
exports.uploadExtensionAction = uploadExtensionAction;
|
|
@@ -45,7 +45,7 @@ exports.command = new command_1.Command("ext:export")
|
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
47
47
|
const manifestSpecs = withRefSubbed.map((spec) => {
|
|
48
|
-
const paramCopy =
|
|
48
|
+
const paramCopy = { ...spec.params, ...spec.systemParams };
|
|
49
49
|
if (spec.eventarcChannel) {
|
|
50
50
|
paramCopy.EVENTARC_CHANNEL = spec.eventarcChannel;
|
|
51
51
|
}
|
package/lib/commands/ext-info.js
CHANGED
|
@@ -18,7 +18,6 @@ exports.command = new command_1.Command("ext:info <extensionName>")
|
|
|
18
18
|
.option("--markdown", "output info in Markdown suitable for constructing a README file")
|
|
19
19
|
.before(checkMinRequiredVersion_1.checkMinRequiredVersion, "extMinVersion")
|
|
20
20
|
.action(async (extensionName, options) => {
|
|
21
|
-
var _a, _b;
|
|
22
21
|
let spec;
|
|
23
22
|
if ((0, localHelper_1.isLocalExtension)(extensionName)) {
|
|
24
23
|
if (!options.markdown) {
|
|
@@ -53,8 +52,8 @@ exports.command = new command_1.Command("ext:info <extensionName>")
|
|
|
53
52
|
else {
|
|
54
53
|
lines.push(`**Name**: ${spec.displayName}`);
|
|
55
54
|
}
|
|
56
|
-
const authorName =
|
|
57
|
-
const url =
|
|
55
|
+
const authorName = spec.author?.authorName;
|
|
56
|
+
const url = spec.author?.url;
|
|
58
57
|
const urlMarkdown = url ? `(**[${url}](${url})**)` : "";
|
|
59
58
|
lines.push(`**Author**: ${authorName} ${urlMarkdown}`);
|
|
60
59
|
if (spec.description) {
|
|
@@ -32,7 +32,6 @@ exports.command = new command_1.Command("ext:install [extensionRefOrLocalPath]")
|
|
|
32
32
|
.before(checkMinRequiredVersion_1.checkMinRequiredVersion, "extMinVersion")
|
|
33
33
|
.before(extensionsHelper_1.diagnoseAndFixProject)
|
|
34
34
|
.action(async (extensionRef, options) => {
|
|
35
|
-
var _a, _b;
|
|
36
35
|
if (options.local) {
|
|
37
36
|
utils.logLabeledWarning(extensionsHelper_1.logPrefix, "As of firebase-tools@11.0.0, the `--local` flag is no longer required, as it is the default behavior.");
|
|
38
37
|
}
|
|
@@ -82,7 +81,7 @@ exports.command = new command_1.Command("ext:install [extensionRefOrLocalPath]")
|
|
|
82
81
|
}))) {
|
|
83
82
|
return;
|
|
84
83
|
}
|
|
85
|
-
const spec =
|
|
84
|
+
const spec = source?.spec ?? extensionVersion?.spec;
|
|
86
85
|
if (!spec) {
|
|
87
86
|
throw new error_1.FirebaseError(`Could not find the extension.yaml for extension '${clc.bold(extensionRef)}'. Please make sure this is a valid extension and try again.`);
|
|
88
87
|
}
|
|
@@ -94,7 +93,7 @@ exports.command = new command_1.Command("ext:install [extensionRefOrLocalPath]")
|
|
|
94
93
|
}
|
|
95
94
|
else if (extensionVersion) {
|
|
96
95
|
void (0, track_1.trackGA4)("extension_added_to_manifest", {
|
|
97
|
-
published:
|
|
96
|
+
published: extensionVersion.listing?.state === "APPROVED" ? "published" : "uploaded",
|
|
98
97
|
interactive: options.nonInteractive ? "false" : "true",
|
|
99
98
|
});
|
|
100
99
|
}
|
|
@@ -118,10 +117,9 @@ exports.command = new command_1.Command("ext:install [extensionRefOrLocalPath]")
|
|
|
118
117
|
}
|
|
119
118
|
});
|
|
120
119
|
async function installToManifest(options) {
|
|
121
|
-
var _a, _b, _c;
|
|
122
120
|
const { projectId, extensionRef, extVersion, source, nonInteractive, force } = options;
|
|
123
121
|
const isLocalSource = (0, extensionsHelper_1.isLocalPath)(extensionRef);
|
|
124
|
-
const spec =
|
|
122
|
+
const spec = extVersion?.spec ?? source?.spec;
|
|
125
123
|
if (!spec) {
|
|
126
124
|
throw new error_1.FirebaseError(`Could not find the extension.yaml for ${extensionRef}. Please make sure this is a valid extension and try again.`);
|
|
127
125
|
}
|
|
@@ -135,7 +133,7 @@ async function installToManifest(options) {
|
|
|
135
133
|
}
|
|
136
134
|
const paramBindingOptions = await paramHelper.getParams({
|
|
137
135
|
projectId,
|
|
138
|
-
paramSpecs: (
|
|
136
|
+
paramSpecs: (spec.params ?? []).concat(spec.systemParams ?? []),
|
|
139
137
|
nonInteractive,
|
|
140
138
|
instanceId,
|
|
141
139
|
});
|
|
@@ -157,6 +155,6 @@ async function installToManifest(options) {
|
|
|
157
155
|
params: paramBindingOptions,
|
|
158
156
|
extensionSpec: spec,
|
|
159
157
|
},
|
|
160
|
-
], config, { nonInteractive, force: force
|
|
158
|
+
], config, { nonInteractive, force: force ?? false });
|
|
161
159
|
(0, tos_1.displayDeveloperTOSWarning)();
|
|
162
160
|
}
|
|
@@ -14,9 +14,8 @@ exports.command = new command_1.Command("firestore:backups:list")
|
|
|
14
14
|
.before(requirePermissions_1.requirePermissions, ["datastore.backups.list"])
|
|
15
15
|
.before(commandUtils_1.warnEmulatorNotSupported, types_1.Emulators.FIRESTORE)
|
|
16
16
|
.action(async (options) => {
|
|
17
|
-
var _a;
|
|
18
17
|
const printer = new pretty_print_1.PrettyPrint();
|
|
19
|
-
const location =
|
|
18
|
+
const location = options.location ?? "-";
|
|
20
19
|
const listBackupsResponse = await (0, firestore_1.listBackups)(options.project, location);
|
|
21
20
|
const backups = listBackupsResponse.backups || [];
|
|
22
21
|
printer.prettyPrintBackups(backups);
|
|
@@ -13,9 +13,8 @@ exports.command = new command_1.Command("firestore:backups:schedules:list")
|
|
|
13
13
|
.before(requirePermissions_1.requirePermissions, ["datastore.backupSchedules.list"])
|
|
14
14
|
.before(commandUtils_1.warnEmulatorNotSupported, types_1.Emulators.FIRESTORE)
|
|
15
15
|
.action(async (options) => {
|
|
16
|
-
var _a;
|
|
17
16
|
const printer = new pretty_print_1.PrettyPrint();
|
|
18
|
-
const databaseId =
|
|
17
|
+
const databaseId = options.database ?? "(default)";
|
|
19
18
|
const backupSchedules = await (0, firestore_1.listBackupSchedules)(options.project, databaseId);
|
|
20
19
|
printer.prettyPrintBackupSchedules(backupSchedules, databaseId);
|
|
21
20
|
return backupSchedules;
|
|
@@ -18,10 +18,9 @@ exports.command = new command_1.Command("firestore:indexes")
|
|
|
18
18
|
.before(requirePermissions_1.requirePermissions, ["datastore.indexes.list"])
|
|
19
19
|
.before(commandUtils_1.warnEmulatorNotSupported, types_1.Emulators.FIRESTORE)
|
|
20
20
|
.action(async (options) => {
|
|
21
|
-
var _a;
|
|
22
21
|
const indexApi = new fsi.FirestoreApi();
|
|
23
22
|
const printer = new pretty_print_1.PrettyPrint();
|
|
24
|
-
const databaseId =
|
|
23
|
+
const databaseId = options.database ?? "(default)";
|
|
25
24
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
26
25
|
const indexes = await indexApi.listIndexes(projectId, databaseId);
|
|
27
26
|
const fieldOverrides = await indexApi.listFieldOverrides(projectId, databaseId);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getShortOperationName =
|
|
3
|
+
exports.getShortOperationName = getShortOperationName;
|
|
4
4
|
const error_1 = require("../error");
|
|
5
5
|
function getShortOperationName(operationName) {
|
|
6
6
|
let opName = operationName;
|
|
@@ -12,4 +12,3 @@ function getShortOperationName(operationName) {
|
|
|
12
12
|
}
|
|
13
13
|
return opName;
|
|
14
14
|
}
|
|
15
|
-
exports.getShortOperationName = getShortOperationName;
|
|
@@ -29,7 +29,6 @@ exports.command = new command_1.Command("functions:artifacts:setpolicy")
|
|
|
29
29
|
"artifactregistry.versions.delete",
|
|
30
30
|
])
|
|
31
31
|
.action(async (options) => {
|
|
32
|
-
var _a;
|
|
33
32
|
if (options.days && options.none) {
|
|
34
33
|
throw new error_1.FirebaseError("Cannot specify both --days and --none options.");
|
|
35
34
|
}
|
|
@@ -98,7 +97,7 @@ exports.command = new command_1.Command("functions:artifacts:setpolicy")
|
|
|
98
97
|
(0, utils_1.logBullet)("This helps reduce storage costs by removing old container images that are no longer needed");
|
|
99
98
|
const existingPolicy = artifacts.findExistingPolicy(repository);
|
|
100
99
|
let isUpdate = false;
|
|
101
|
-
if (existingPolicy &&
|
|
100
|
+
if (existingPolicy && existingPolicy.condition?.olderThan) {
|
|
102
101
|
const existingDays = artifacts.parseDaysFromPolicy(existingPolicy.condition.olderThan);
|
|
103
102
|
if (existingDays) {
|
|
104
103
|
isUpdate = true;
|
|
@@ -48,7 +48,6 @@ exports.command = new command_1.Command("functions:config:export")
|
|
|
48
48
|
.before(requirePermissions_1.requirePermissions, [...RUNTIME_CONFIG_PERMISSIONS, ...SECRET_MANAGER_PERMISSIONS])
|
|
49
49
|
.before(requireConfig_1.requireConfig)
|
|
50
50
|
.action(async (options) => {
|
|
51
|
-
var _a;
|
|
52
51
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
53
52
|
(0, utils_1.logBullet)("This command retrieves your Runtime Config values (accessed via " +
|
|
54
53
|
clc.bold("functions.config()") +
|
|
@@ -145,8 +144,8 @@ exports.command = new command_1.Command("functions:config:export")
|
|
|
145
144
|
try {
|
|
146
145
|
const functionsConfig = options.config.get("functions");
|
|
147
146
|
const source = Array.isArray(functionsConfig)
|
|
148
|
-
?
|
|
149
|
-
: functionsConfig
|
|
147
|
+
? functionsConfig[0]?.source
|
|
148
|
+
: functionsConfig?.source;
|
|
150
149
|
if (source) {
|
|
151
150
|
const sourceDir = options.config.path(source);
|
|
152
151
|
sdkVersion = (0, versioning_1.getFunctionsSDKVersion)(sourceDir);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.command = void 0;
|
|
4
|
+
exports.hostingChannelDeployAction = hostingChannelDeployAction;
|
|
4
5
|
const colorette_1 = require("colorette");
|
|
5
6
|
const command_1 = require("../command");
|
|
6
7
|
const error_1 = require("../error");
|
|
@@ -124,7 +125,6 @@ async function hostingChannelDeployAction(channelId, options) {
|
|
|
124
125
|
});
|
|
125
126
|
return deploys;
|
|
126
127
|
}
|
|
127
|
-
exports.hostingChannelDeployAction = hostingChannelDeployAction;
|
|
128
128
|
async function syncAuthState(projectId, sites) {
|
|
129
129
|
const siteNames = sites.map((d) => d.site);
|
|
130
130
|
const urlNames = sites.map((d) => d.url);
|
|
@@ -18,7 +18,6 @@ For example, to copy the content for a site \`my-site\` from a preview channel \
|
|
|
18
18
|
firebase hosting:clone my-site:foo my-site:live`)
|
|
19
19
|
.before(requireAuth_1.requireAuth)
|
|
20
20
|
.action(async (source = "", targetChannel = "") => {
|
|
21
|
-
var _a, _b, _c, _d;
|
|
22
21
|
let sourceVersionName;
|
|
23
22
|
let sourceVersion;
|
|
24
23
|
let [sourceSiteId, sourceChannelId] = source.split(":");
|
|
@@ -47,7 +46,7 @@ For example, to copy the content for a site \`my-site\` from a preview channel \
|
|
|
47
46
|
if (!sChannel) {
|
|
48
47
|
throw new error_1.FirebaseError(`Could not find the channel ${(0, colorette_1.bold)(sourceChannelId)} for site ${(0, colorette_1.bold)(sourceSiteId)}.`);
|
|
49
48
|
}
|
|
50
|
-
sourceVersionName =
|
|
49
|
+
sourceVersionName = sChannel.release?.version?.name;
|
|
51
50
|
if (!sourceVersionName) {
|
|
52
51
|
throw new error_1.FirebaseError(`Could not find a version on the channel ${(0, colorette_1.bold)(sourceChannelId)} for site ${(0, colorette_1.bold)(sourceSiteId)}.`);
|
|
53
52
|
}
|
|
@@ -71,7 +70,7 @@ For example, to copy the content for a site \`my-site\` from a preview channel \
|
|
|
71
70
|
logger_1.logger.debug("[hosting] unable to add auth domain", e);
|
|
72
71
|
}
|
|
73
72
|
}
|
|
74
|
-
const currentTargetVersionName =
|
|
73
|
+
const currentTargetVersionName = tChannel.release?.version?.name;
|
|
75
74
|
if (equalSiteIds && sourceVersionName === currentTargetVersionName) {
|
|
76
75
|
utils.logSuccess(`Channels ${(0, colorette_1.bold)(sourceChannelId)} and ${(0, colorette_1.bold)(targetChannel)} are serving identical versions. No need to clone.`);
|
|
77
76
|
return;
|
|
@@ -21,7 +21,7 @@ exports.command = new command_1.Command("hosting:sites:create [siteId]")
|
|
|
21
21
|
if (options.nonInteractive && !siteId) {
|
|
22
22
|
throw new error_1.FirebaseError(`${(0, colorette_1.bold)("siteId")} is required in a non-interactive environment`);
|
|
23
23
|
}
|
|
24
|
-
siteId = await (0, interactive_1.pickHostingSiteName)(siteId
|
|
24
|
+
siteId = await (0, interactive_1.pickHostingSiteName)(siteId ?? "", options);
|
|
25
25
|
const site = await (0, api_1.createSite)(projectId, siteId, appId);
|
|
26
26
|
logger_1.logger.info();
|
|
27
27
|
(0, utils_1.logLabeledSuccess)(LOG_TAG, `Site ${(0, colorette_1.bold)(siteId)} has been created in project ${(0, colorette_1.bold)(projectId)}.`);
|
package/lib/commands/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.load =
|
|
3
|
+
exports.load = load;
|
|
4
4
|
const experiments = require("../experiments");
|
|
5
5
|
function load(client) {
|
|
6
6
|
function loadCommand(name) {
|
|
@@ -253,7 +253,7 @@ function load(client) {
|
|
|
253
253
|
client.use = loadCommand("use");
|
|
254
254
|
if (experiments.isEnabled("apptesting")) {
|
|
255
255
|
client.apptesting = {};
|
|
256
|
-
client.apptesting.
|
|
256
|
+
client.apptesting.wata = loadCommand("apptesting-wata");
|
|
257
257
|
}
|
|
258
258
|
const t1 = process.hrtime.bigint();
|
|
259
259
|
const diffMS = (t1 - t0) / BigInt(1e6);
|
|
@@ -261,4 +261,3 @@ function load(client) {
|
|
|
261
261
|
}
|
|
262
262
|
return client;
|
|
263
263
|
}
|
|
264
|
-
exports.load = load;
|
package/lib/commands/init.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.command = void 0;
|
|
4
|
+
exports.initAction = initAction;
|
|
5
|
+
exports.postInitSaves = postInitSaves;
|
|
4
6
|
const clc = require("colorette");
|
|
5
7
|
const os = require("os");
|
|
6
8
|
const path = require("path");
|
|
@@ -139,7 +141,6 @@ exports.command = new command_1.Command("init [feature]")
|
|
|
139
141
|
.help(HELP)
|
|
140
142
|
.action(initAction);
|
|
141
143
|
async function initAction(feature, options) {
|
|
142
|
-
var _a;
|
|
143
144
|
if (feature && !featureNames.includes(feature)) {
|
|
144
145
|
return utils.reject(clc.bold(feature) +
|
|
145
146
|
" is not a supported feature; must be one of " +
|
|
@@ -205,7 +206,7 @@ async function initAction(feature, options) {
|
|
|
205
206
|
},
|
|
206
207
|
});
|
|
207
208
|
}
|
|
208
|
-
if (!setup.features ||
|
|
209
|
+
if (!setup.features || setup.features?.length === 0) {
|
|
209
210
|
throw new error_1.FirebaseError("Must select at least one feature. Use " +
|
|
210
211
|
clc.bold(clc.underline("SPACEBAR")) +
|
|
211
212
|
" to select features, or specify a feature by running " +
|
|
@@ -231,7 +232,6 @@ async function initAction(feature, options) {
|
|
|
231
232
|
}
|
|
232
233
|
}
|
|
233
234
|
}
|
|
234
|
-
exports.initAction = initAction;
|
|
235
235
|
async function postInitSaves(setup, config) {
|
|
236
236
|
logger_1.logger.info();
|
|
237
237
|
config.writeProjectFile("firebase.json", setup.config);
|
|
@@ -242,4 +242,3 @@ async function postInitSaves(setup, config) {
|
|
|
242
242
|
logger_1.logger.info();
|
|
243
243
|
utils.logSuccess("Firebase initialization complete!");
|
|
244
244
|
}
|
|
245
|
-
exports.postInitSaves = postInitSaves;
|
|
@@ -25,7 +25,7 @@ exports.command = new command_1.Command("internaltesting:functions:discover")
|
|
|
25
25
|
try {
|
|
26
26
|
const runtimeConfigApiEnabled = await ensureApiEnabled.check(projectId, (0, api_1.runtimeconfigOrigin)(), "runtimeconfig", true);
|
|
27
27
|
if (runtimeConfigApiEnabled) {
|
|
28
|
-
runtimeConfig =
|
|
28
|
+
runtimeConfig = { ...runtimeConfig, ...(await (0, prepareFunctionsUpload_1.getFunctionsConfig)(projectId)) };
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
catch (err) {
|
package/lib/commands/login.js
CHANGED
|
@@ -15,7 +15,6 @@ exports.command = new command_1.Command("login")
|
|
|
15
15
|
.option("--no-localhost", "login from a device without an accessible localhost")
|
|
16
16
|
.option("--reauth", "force reauthentication even if already logged in")
|
|
17
17
|
.action(async (options) => {
|
|
18
|
-
var _a, _b, _c, _d;
|
|
19
18
|
if (options.nonInteractive && !options.prototyperLogin) {
|
|
20
19
|
throw new error_1.FirebaseError("Cannot run login in non-interactive mode. See " +
|
|
21
20
|
clc.bold("login:ci") +
|
|
@@ -23,13 +22,13 @@ exports.command = new command_1.Command("login")
|
|
|
23
22
|
}
|
|
24
23
|
const user = options.user;
|
|
25
24
|
const tokens = options.tokens;
|
|
26
|
-
if (user &&
|
|
25
|
+
if (user && tokens?.refresh_token && !options.reauth) {
|
|
27
26
|
logger_1.logger.info("Already logged in as", clc.bold(user.email));
|
|
28
27
|
return user;
|
|
29
28
|
}
|
|
30
29
|
if (options.consent) {
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
options.consent?.metrics ?? configstore_1.configstore.set("usage", options.consent.metrics);
|
|
31
|
+
options.consent?.gemini ?? configstore_1.configstore.set("gemini", options.consent.gemini);
|
|
33
32
|
}
|
|
34
33
|
else if (!options.reauth && !options.prototyperLogin) {
|
|
35
34
|
utils.logBullet("The Firebase CLI’s MCP server feature can optionally make use of Gemini in Firebase. " +
|
|
@@ -49,7 +48,7 @@ exports.command = new command_1.Command("login")
|
|
|
49
48
|
return auth.loginPrototyper();
|
|
50
49
|
}
|
|
51
50
|
const useLocalhost = !(0, utils_1.isCloudEnvironment)() && !!options.localhost;
|
|
52
|
-
const result = await auth.loginGoogle(useLocalhost, user
|
|
51
|
+
const result = await auth.loginGoogle(useLocalhost, user?.email);
|
|
53
52
|
auth.recordCredentials(result);
|
|
54
53
|
logger_1.logger.info();
|
|
55
54
|
if (typeof result.user !== "string") {
|
package/lib/commands/logout.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.command = void 0;
|
|
4
|
+
exports.logoutAction = logoutAction;
|
|
4
5
|
const command_1 = require("../command");
|
|
5
6
|
const logger_1 = require("../logger");
|
|
6
7
|
const clc = require("colorette");
|
|
@@ -25,7 +26,7 @@ async function logoutAction(email, options) {
|
|
|
25
26
|
utils.logWarning(`No account matches ${email}, can't log out.`);
|
|
26
27
|
return;
|
|
27
28
|
}
|
|
28
|
-
const logoutDefault = email ===
|
|
29
|
+
const logoutDefault = email === defaultAccount?.user.email;
|
|
29
30
|
let newDefaultAccount = undefined;
|
|
30
31
|
if (logoutDefault && additionalAccounts.length > 0) {
|
|
31
32
|
if (additionalAccounts.length === 1) {
|
|
@@ -72,4 +73,3 @@ async function logoutAction(email, options) {
|
|
|
72
73
|
(0, auth_1.setGlobalDefaultAccount)(newDefaultAccount);
|
|
73
74
|
}
|
|
74
75
|
}
|
|
75
|
-
exports.logoutAction = logoutAction;
|
|
@@ -17,7 +17,7 @@ exports.command = new command_1.Command("projects:create [projectId]")
|
|
|
17
17
|
throw new error_1.FirebaseError("Invalid argument, please provide only one type of project parent (organization or folder)");
|
|
18
18
|
}
|
|
19
19
|
if (!options.nonInteractive) {
|
|
20
|
-
options =
|
|
20
|
+
options = { ...options, ...(await (0, projects_1.promptProjectCreation)(options)) };
|
|
21
21
|
}
|
|
22
22
|
if (!options.projectId) {
|
|
23
23
|
throw new error_1.FirebaseError("Project ID cannot be empty");
|
|
@@ -19,15 +19,14 @@ exports.command = new command_1.Command("remoteconfig:experiments:list")
|
|
|
19
19
|
"firebaseanalytics.resources.googleAnalyticsReadAndAnalyze",
|
|
20
20
|
])
|
|
21
21
|
.action(async (options) => {
|
|
22
|
-
var _a;
|
|
23
22
|
const projectNumber = await (0, projectUtils_1.needProjectNumber)(options);
|
|
24
23
|
const listExperimentOptions = {
|
|
25
|
-
pageSize:
|
|
24
|
+
pageSize: options.pageSize ?? interfaces_1.DEFAULT_PAGE_SIZE,
|
|
26
25
|
pageToken: options.pageToken,
|
|
27
26
|
filter: options.filter,
|
|
28
27
|
};
|
|
29
28
|
const { experiments, nextPageToken } = await rcExperiment.listExperiments(projectNumber, interfaces_1.NAMESPACE_FIREBASE, listExperimentOptions);
|
|
30
|
-
logger_1.logger.info(rcExperiment.parseExperimentList(experiments
|
|
29
|
+
logger_1.logger.info(rcExperiment.parseExperimentList(experiments ?? []));
|
|
31
30
|
if (nextPageToken) {
|
|
32
31
|
logger_1.logger.info(`\nNext Page Token: \x1b[32m${nextPageToken}\x1b[0m\n`);
|
|
33
32
|
}
|
|
@@ -57,7 +57,7 @@ exports.command = new command_1.Command("remoteconfig:get")
|
|
|
57
57
|
utils.assertIsString(options.output);
|
|
58
58
|
filename = options.output;
|
|
59
59
|
}
|
|
60
|
-
const outTemplate =
|
|
60
|
+
const outTemplate = { ...template };
|
|
61
61
|
delete outTemplate.version;
|
|
62
62
|
fs.writeFileSync(filename, JSON.stringify(outTemplate, null, 2));
|
|
63
63
|
}
|
|
@@ -16,14 +16,13 @@ exports.command = new command_1.Command("remoteconfig:rollback")
|
|
|
16
16
|
.option("-v, --version-number <versionNumber>", "rollback to the specified version of the template")
|
|
17
17
|
.withForce()
|
|
18
18
|
.action(async (options) => {
|
|
19
|
-
var _a;
|
|
20
19
|
const templateVersion = await (0, versionslist_1.getVersions)((0, projectUtils_1.needProjectId)(options), 1);
|
|
21
20
|
let targetVersion = 0;
|
|
22
21
|
if (options.versionNumber) {
|
|
23
22
|
targetVersion = options.versionNumber;
|
|
24
23
|
}
|
|
25
24
|
else {
|
|
26
|
-
if (
|
|
25
|
+
if (templateVersion?.versions[0]?.versionNumber) {
|
|
27
26
|
const latestVersion = templateVersion.versions[0].versionNumber.toString();
|
|
28
27
|
const previousVersion = parseInt(latestVersion) - 1;
|
|
29
28
|
targetVersion = previousVersion;
|
|
@@ -19,15 +19,14 @@ exports.command = new command_1.Command("remoteconfig:rollouts:list")
|
|
|
19
19
|
"firebaseanalytics.resources.googleAnalyticsReadAndAnalyze",
|
|
20
20
|
])
|
|
21
21
|
.action(async (options) => {
|
|
22
|
-
var _a;
|
|
23
22
|
const projectNumber = await (0, projectUtils_1.needProjectNumber)(options);
|
|
24
23
|
const listRolloutOptions = {
|
|
25
|
-
pageSize:
|
|
24
|
+
pageSize: options.pageSize ?? interfaces_1.DEFAULT_PAGE_SIZE,
|
|
26
25
|
pageToken: options.pageToken,
|
|
27
26
|
filter: options.filter,
|
|
28
27
|
};
|
|
29
28
|
const { rollouts, nextPageToken } = await rcRollout.listRollouts(projectNumber, interfaces_1.NAMESPACE_FIREBASE, listRolloutOptions);
|
|
30
|
-
logger_1.logger.info(rcRollout.parseRolloutList(rollouts
|
|
29
|
+
logger_1.logger.info(rcRollout.parseRolloutList(rollouts ?? []));
|
|
31
30
|
if (nextPageToken) {
|
|
32
31
|
logger_1.logger.info(`\nNext Page Token: \x1b[32m${nextPageToken}\x1b[0m\n`);
|
|
33
32
|
}
|