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
package/lib/auth.js
CHANGED
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getGlobalDefaultAccount = getGlobalDefaultAccount;
|
|
4
|
+
exports.getProjectDefaultAccount = getProjectDefaultAccount;
|
|
5
|
+
exports.getAdditionalAccounts = getAdditionalAccounts;
|
|
6
|
+
exports.getAllAccounts = getAllAccounts;
|
|
7
|
+
exports.assertAccount = assertAccount;
|
|
8
|
+
exports.setActiveAccount = setActiveAccount;
|
|
9
|
+
exports.setRefreshToken = setRefreshToken;
|
|
10
|
+
exports.selectAccount = selectAccount;
|
|
11
|
+
exports.loginAdditionalAccount = loginAdditionalAccount;
|
|
12
|
+
exports.setProjectAccount = setProjectAccount;
|
|
13
|
+
exports.setGlobalDefaultAccount = setGlobalDefaultAccount;
|
|
14
|
+
exports.loginPrototyper = loginPrototyper;
|
|
15
|
+
exports.recordCredentials = recordCredentials;
|
|
16
|
+
exports.loginGoogle = loginGoogle;
|
|
17
|
+
exports.loginGithub = loginGithub;
|
|
18
|
+
exports.findAccountByEmail = findAccountByEmail;
|
|
19
|
+
exports.loggedIn = loggedIn;
|
|
20
|
+
exports.isExpired = isExpired;
|
|
21
|
+
exports.haveValidTokens = haveValidTokens;
|
|
22
|
+
exports.getAccessToken = getAccessToken;
|
|
23
|
+
exports.logout = logout;
|
|
24
|
+
exports.addAdditionalAccount = addAdditionalAccount;
|
|
4
25
|
const clc = require("colorette");
|
|
5
26
|
const FormData = require("form-data");
|
|
6
27
|
const http = require("http");
|
|
@@ -34,7 +55,6 @@ function getGlobalDefaultAccount() {
|
|
|
34
55
|
tokens,
|
|
35
56
|
};
|
|
36
57
|
}
|
|
37
|
-
exports.getGlobalDefaultAccount = getGlobalDefaultAccount;
|
|
38
58
|
function getProjectDefaultAccount(projectDir) {
|
|
39
59
|
if (!projectDir) {
|
|
40
60
|
return getGlobalDefaultAccount();
|
|
@@ -47,11 +67,9 @@ function getProjectDefaultAccount(projectDir) {
|
|
|
47
67
|
const allAccounts = getAllAccounts();
|
|
48
68
|
return allAccounts.find((a) => a.user.email === email);
|
|
49
69
|
}
|
|
50
|
-
exports.getProjectDefaultAccount = getProjectDefaultAccount;
|
|
51
70
|
function getAdditionalAccounts() {
|
|
52
71
|
return configstore_1.configstore.get("additionalAccounts") || [];
|
|
53
72
|
}
|
|
54
|
-
exports.getAdditionalAccounts = getAdditionalAccounts;
|
|
55
73
|
function getAllAccounts() {
|
|
56
74
|
const res = [];
|
|
57
75
|
const defaultUser = getGlobalDefaultAccount();
|
|
@@ -61,17 +79,15 @@ function getAllAccounts() {
|
|
|
61
79
|
res.push(...getAdditionalAccounts());
|
|
62
80
|
return res;
|
|
63
81
|
}
|
|
64
|
-
exports.getAllAccounts = getAllAccounts;
|
|
65
82
|
function assertAccount(email, options) {
|
|
66
83
|
const allAccounts = getAllAccounts();
|
|
67
84
|
const accountExists = allAccounts.some((a) => a.user.email === email);
|
|
68
85
|
if (!accountExists) {
|
|
69
|
-
throw new error_1.FirebaseError(`Account ${email} does not exist, ${
|
|
86
|
+
throw new error_1.FirebaseError(`Account ${email} does not exist, ${options?.mcp
|
|
70
87
|
? `use the 'firebase_get_environment' tool to see available accounts or instruct the user to use the 'firebase login:add' terminal command to add a new account.`
|
|
71
88
|
: `run "${clc.bold("firebase login:list")} to see valid accounts`}`);
|
|
72
89
|
}
|
|
73
90
|
}
|
|
74
|
-
exports.assertAccount = assertAccount;
|
|
75
91
|
function setActiveAccount(options, account) {
|
|
76
92
|
if (account.tokens.refresh_token) {
|
|
77
93
|
setRefreshToken(account.tokens.refresh_token);
|
|
@@ -79,11 +95,9 @@ function setActiveAccount(options, account) {
|
|
|
79
95
|
options.user = account.user;
|
|
80
96
|
options.tokens = account.tokens;
|
|
81
97
|
}
|
|
82
|
-
exports.setActiveAccount = setActiveAccount;
|
|
83
98
|
function setRefreshToken(token) {
|
|
84
99
|
apiv2.setRefreshToken(token);
|
|
85
100
|
}
|
|
86
|
-
exports.setRefreshToken = setRefreshToken;
|
|
87
101
|
function selectAccount(account, projectRoot) {
|
|
88
102
|
const defaultUser = getProjectDefaultAccount(projectRoot);
|
|
89
103
|
if (!account) {
|
|
@@ -98,7 +112,6 @@ function selectAccount(account, projectRoot) {
|
|
|
98
112
|
}
|
|
99
113
|
throw new error_1.FirebaseError(`Account ${account} not found, run "firebase login:list" to see existing accounts or "firebase login:add" to add a new one`);
|
|
100
114
|
}
|
|
101
|
-
exports.selectAccount = selectAccount;
|
|
102
115
|
async function loginAdditionalAccount(useLocalhost, email) {
|
|
103
116
|
const result = await loginGoogle(useLocalhost, email);
|
|
104
117
|
if (typeof result.user === "string") {
|
|
@@ -123,14 +136,12 @@ async function loginAdditionalAccount(useLocalhost, email) {
|
|
|
123
136
|
}
|
|
124
137
|
return newAccount;
|
|
125
138
|
}
|
|
126
|
-
exports.loginAdditionalAccount = loginAdditionalAccount;
|
|
127
139
|
function setProjectAccount(projectDir, email) {
|
|
128
140
|
logger_1.logger.debug(`setProjectAccount(${projectDir}, ${email})`);
|
|
129
141
|
const activeAccounts = configstore_1.configstore.get("activeAccounts") || {};
|
|
130
142
|
activeAccounts[projectDir] = email;
|
|
131
143
|
configstore_1.configstore.set("activeAccounts", activeAccounts);
|
|
132
144
|
}
|
|
133
|
-
exports.setProjectAccount = setProjectAccount;
|
|
134
145
|
function setGlobalDefaultAccount(accountOrEmail) {
|
|
135
146
|
let account;
|
|
136
147
|
if (typeof accountOrEmail === "string") {
|
|
@@ -151,7 +162,6 @@ function setGlobalDefaultAccount(accountOrEmail) {
|
|
|
151
162
|
configstore_1.configstore.set("additionalAccounts", additionalAccounts);
|
|
152
163
|
}
|
|
153
164
|
}
|
|
154
|
-
exports.setGlobalDefaultAccount = setGlobalDefaultAccount;
|
|
155
165
|
function open(url) {
|
|
156
166
|
opn(url).catch((err) => {
|
|
157
167
|
logger_1.logger.debug("Unable to open URL: " + err.stack);
|
|
@@ -294,7 +304,6 @@ function urlsafeBase64(base64string) {
|
|
|
294
304
|
return base64string.replace(/\+/g, "-").replace(/=+$/, "").replace(/\//g, "_");
|
|
295
305
|
}
|
|
296
306
|
async function loginPrototyper() {
|
|
297
|
-
var _a;
|
|
298
307
|
const authProxyClient = new apiv2.Client({
|
|
299
308
|
urlPrefix: (0, api_1.authProxyOrigin)(),
|
|
300
309
|
auth: false,
|
|
@@ -302,9 +311,9 @@ async function loginPrototyper() {
|
|
|
302
311
|
const sessionId = (0, uuid_1.v4)();
|
|
303
312
|
const codeVerifier = (0, crypto_1.randomBytes)(32).toString("hex");
|
|
304
313
|
const codeChallenge = urlsafeBase64((0, crypto_1.createHash)("sha256").update(codeVerifier).digest("base64"));
|
|
305
|
-
const attestToken = (
|
|
314
|
+
const attestToken = (await authProxyClient.post("/attest", {
|
|
306
315
|
session_id: sessionId,
|
|
307
|
-
})).body
|
|
316
|
+
})).body?.token;
|
|
308
317
|
const loginUrl = `${(0, api_1.authProxyOrigin)()}/login?code_challenge=${codeChallenge}&session=${sessionId}&attest=${attestToken}&studio_prototyper=true}`;
|
|
309
318
|
return {
|
|
310
319
|
uri: loginUrl,
|
|
@@ -321,14 +330,12 @@ async function loginPrototyper() {
|
|
|
321
330
|
},
|
|
322
331
|
};
|
|
323
332
|
}
|
|
324
|
-
exports.loginPrototyper = loginPrototyper;
|
|
325
333
|
function recordCredentials(creds) {
|
|
326
334
|
configstore_1.configstore.set("user", creds.user);
|
|
327
335
|
configstore_1.configstore.set("tokens", creds.tokens);
|
|
328
336
|
configstore_1.configstore.set("loginScopes", creds.scopes);
|
|
329
337
|
configstore_1.configstore.delete("session");
|
|
330
338
|
}
|
|
331
|
-
exports.recordCredentials = recordCredentials;
|
|
332
339
|
async function loginRemotely() {
|
|
333
340
|
const authProxyClient = new apiv2.Client({
|
|
334
341
|
urlPrefix: (0, api_1.authProxyOrigin)(),
|
|
@@ -433,26 +440,22 @@ async function loginGoogle(localhost, userHint) {
|
|
|
433
440
|
const port = await getPort();
|
|
434
441
|
return await loginWithLocalhostGoogle(port, userHint);
|
|
435
442
|
}
|
|
436
|
-
catch
|
|
443
|
+
catch {
|
|
437
444
|
return await loginRemotely();
|
|
438
445
|
}
|
|
439
446
|
}
|
|
440
447
|
return await loginRemotely();
|
|
441
448
|
}
|
|
442
|
-
exports.loginGoogle = loginGoogle;
|
|
443
449
|
async function loginGithub() {
|
|
444
450
|
const port = await getPort();
|
|
445
451
|
return loginWithLocalhostGitHub(port);
|
|
446
452
|
}
|
|
447
|
-
exports.loginGithub = loginGithub;
|
|
448
453
|
function findAccountByEmail(email) {
|
|
449
454
|
return getAllAccounts().find((a) => a.user.email === email);
|
|
450
455
|
}
|
|
451
|
-
exports.findAccountByEmail = findAccountByEmail;
|
|
452
456
|
function loggedIn() {
|
|
453
457
|
return !!lastAccessToken;
|
|
454
458
|
}
|
|
455
|
-
exports.loggedIn = loggedIn;
|
|
456
459
|
function isExpired(tokens) {
|
|
457
460
|
const hasExpiration = (p) => !!p.expires_at;
|
|
458
461
|
if (hasExpiration(tokens)) {
|
|
@@ -462,33 +465,30 @@ function isExpired(tokens) {
|
|
|
462
465
|
return !tokens;
|
|
463
466
|
}
|
|
464
467
|
}
|
|
465
|
-
exports.isExpired = isExpired;
|
|
466
468
|
function haveValidTokens(refreshToken, authScopes) {
|
|
467
|
-
|
|
468
|
-
if (!(lastAccessToken === null || lastAccessToken === void 0 ? void 0 : lastAccessToken.access_token)) {
|
|
469
|
+
if (!lastAccessToken?.access_token) {
|
|
469
470
|
const tokens = configstore_1.configstore.get("tokens");
|
|
470
|
-
if (refreshToken ===
|
|
471
|
+
if (refreshToken === tokens?.refresh_token) {
|
|
471
472
|
lastAccessToken = tokens;
|
|
472
473
|
}
|
|
473
474
|
}
|
|
474
|
-
const hasTokens = !!
|
|
475
|
-
const oldScopesJSON = JSON.stringify(
|
|
475
|
+
const hasTokens = !!lastAccessToken?.access_token;
|
|
476
|
+
const oldScopesJSON = JSON.stringify(lastAccessToken?.scopes?.sort() || []);
|
|
476
477
|
const newScopesJSON = JSON.stringify(authScopes.sort());
|
|
477
478
|
const hasSameScopes = oldScopesJSON === newScopesJSON;
|
|
478
|
-
const expired = (
|
|
479
|
+
const expired = (lastAccessToken?.expires_at || 0) < Date.now() + FIFTEEN_MINUTES_IN_MS;
|
|
479
480
|
const valid = hasTokens && hasSameScopes && !expired;
|
|
480
481
|
if (hasTokens) {
|
|
481
|
-
logger_1.logger.debug(`Checked if tokens are valid: ${valid}, expires at: ${lastAccessToken
|
|
482
|
+
logger_1.logger.debug(`Checked if tokens are valid: ${valid}, expires at: ${lastAccessToken?.expires_at}`);
|
|
482
483
|
}
|
|
483
484
|
else {
|
|
484
485
|
logger_1.logger.debug("No OAuth tokens found");
|
|
485
486
|
}
|
|
486
487
|
return valid;
|
|
487
488
|
}
|
|
488
|
-
exports.haveValidTokens = haveValidTokens;
|
|
489
489
|
function deleteAccount(account) {
|
|
490
490
|
const defaultAccount = getGlobalDefaultAccount();
|
|
491
|
-
if (account.user.email ===
|
|
491
|
+
if (account.user.email === defaultAccount?.user.email) {
|
|
492
492
|
configstore_1.configstore.delete("user");
|
|
493
493
|
configstore_1.configstore.delete("tokens");
|
|
494
494
|
configstore_1.configstore.delete("usage");
|
|
@@ -507,7 +507,7 @@ function deleteAccount(account) {
|
|
|
507
507
|
}
|
|
508
508
|
function updateAccount(account) {
|
|
509
509
|
const defaultAccount = getGlobalDefaultAccount();
|
|
510
|
-
if (account.user.email ===
|
|
510
|
+
if (account.user.email === defaultAccount?.user.email) {
|
|
511
511
|
configstore_1.configstore.set("user", account.user);
|
|
512
512
|
configstore_1.configstore.set("tokens", account.tokens);
|
|
513
513
|
}
|
|
@@ -530,7 +530,6 @@ function logoutCurrentSession(refreshToken) {
|
|
|
530
530
|
deleteAccount(account);
|
|
531
531
|
}
|
|
532
532
|
async function refreshTokens(refreshToken, authScopes) {
|
|
533
|
-
var _a, _b;
|
|
534
533
|
logger_1.logger.debug("> refreshing access token with scopes:", JSON.stringify(authScopes));
|
|
535
534
|
try {
|
|
536
535
|
const client = new apiv2.Client({ urlPrefix: (0, api_1.googleOrigin)(), auth: false });
|
|
@@ -581,7 +580,7 @@ async function refreshTokens(refreshToken, authScopes) {
|
|
|
581
580
|
return lastAccessToken;
|
|
582
581
|
}
|
|
583
582
|
catch (err) {
|
|
584
|
-
if (
|
|
583
|
+
if (err?.context?.body?.error === "invalid_scope") {
|
|
585
584
|
throw new error_1.FirebaseError("This command requires new authorization scopes not granted to your current session. Please run " +
|
|
586
585
|
clc.bold("firebase login --reauth") +
|
|
587
586
|
"\n\n" +
|
|
@@ -608,9 +607,8 @@ async function getAccessToken(refreshToken, authScopes) {
|
|
|
608
607
|
throw new error_1.FirebaseError("Unable to getAccessToken");
|
|
609
608
|
}
|
|
610
609
|
}
|
|
611
|
-
exports.getAccessToken = getAccessToken;
|
|
612
610
|
async function logout(refreshToken) {
|
|
613
|
-
if (
|
|
611
|
+
if (lastAccessToken?.refresh_token === refreshToken) {
|
|
614
612
|
lastAccessToken = undefined;
|
|
615
613
|
}
|
|
616
614
|
logoutCurrentSession(refreshToken);
|
|
@@ -626,10 +624,8 @@ async function logout(refreshToken) {
|
|
|
626
624
|
});
|
|
627
625
|
}
|
|
628
626
|
}
|
|
629
|
-
exports.logout = logout;
|
|
630
627
|
function addAdditionalAccount(account) {
|
|
631
628
|
const additionalAccounts = getAdditionalAccounts();
|
|
632
629
|
additionalAccounts.push(account);
|
|
633
630
|
configstore_1.configstore.set("additionalAccounts", additionalAccounts);
|
|
634
631
|
}
|
|
635
|
-
exports.addAdditionalAccount = addAdditionalAccount;
|
package/lib/bin/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.cli =
|
|
3
|
+
exports.cli = cli;
|
|
4
4
|
const updateNotifierPkg = require("update-notifier-cjs");
|
|
5
5
|
const clc = require("colorette");
|
|
6
6
|
const marked_terminal_1 = require("marked-terminal");
|
|
@@ -39,7 +39,7 @@ function cli(pkg) {
|
|
|
39
39
|
(0, experiments_1.enableExperimentsFromCliEnvVariable)();
|
|
40
40
|
(0, fetchMOTD_1.fetchMOTD)();
|
|
41
41
|
process.on("exit", (code) => {
|
|
42
|
-
code = process.exitCode
|
|
42
|
+
code = typeof process.exitCode === "number" ? process.exitCode : code;
|
|
43
43
|
if (!process.env.DEBUG && code < 2 && fsutils.fileExistsSync(logFilename)) {
|
|
44
44
|
fs.unlinkSync(logFilename);
|
|
45
45
|
}
|
|
@@ -123,4 +123,3 @@ function cli(pkg) {
|
|
|
123
123
|
cmd = client.cli.parse(process.argv);
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
-
exports.cli = cli;
|
package/lib/bin/mcp.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.mcp =
|
|
4
|
+
exports.mcp = mcp;
|
|
5
5
|
const path_1 = require("path");
|
|
6
6
|
const util_1 = require("util");
|
|
7
7
|
const logger_1 = require("../logger");
|
|
@@ -99,4 +99,3 @@ async function mcp() {
|
|
|
99
99
|
if (process.stdin.isTTY)
|
|
100
100
|
process.stderr.write(STARTUP_MESSAGE);
|
|
101
101
|
}
|
|
102
|
-
exports.mcp = mcp;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.checkMinRequiredVersion =
|
|
3
|
+
exports.checkMinRequiredVersion = checkMinRequiredVersion;
|
|
4
4
|
const semver = require("semver");
|
|
5
5
|
const configstore_1 = require("./configstore");
|
|
6
6
|
const error_1 = require("./error");
|
|
@@ -11,4 +11,3 @@ function checkMinRequiredVersion(options, key) {
|
|
|
11
11
|
throw new error_1.FirebaseError(`This command requires at least version ${minVersion} of the CLI to use. To update to the latest version using npm, run \`npm install -g firebase-tools\`. For other CLI management options, see https://firebase.google.com/docs/cli#update-cli`);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
exports.checkMinRequiredVersion = checkMinRequiredVersion;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.checkValidTargetFilters =
|
|
3
|
+
exports.checkValidTargetFilters = checkValidTargetFilters;
|
|
4
4
|
const deploy_1 = require("./commands/deploy");
|
|
5
5
|
const error_1 = require("./error");
|
|
6
6
|
function targetsForTypes(only, ...types) {
|
|
@@ -51,4 +51,3 @@ async function checkValidTargetFilters(options) {
|
|
|
51
51
|
return resolve();
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
|
-
exports.checkValidTargetFilters = checkValidTargetFilters;
|
package/lib/command.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.isCommandModule = isCommandModule;
|
|
5
|
+
exports.validateProjectId = validateProjectId;
|
|
4
6
|
const clc = require("colorette");
|
|
5
7
|
const path = require("node:path");
|
|
6
8
|
const lodash_1 = require("lodash");
|
|
@@ -20,7 +22,6 @@ const env_1 = require("./env");
|
|
|
20
22
|
function isCommandModule(value) {
|
|
21
23
|
return typeof value === "function" && typeof value.load === "function";
|
|
22
24
|
}
|
|
23
|
-
exports.isCommandModule = isCommandModule;
|
|
24
25
|
class Command {
|
|
25
26
|
constructor(cmd) {
|
|
26
27
|
this.cmd = cmd;
|
|
@@ -195,7 +196,6 @@ class Command {
|
|
|
195
196
|
}
|
|
196
197
|
}
|
|
197
198
|
async applyRC(options) {
|
|
198
|
-
var _a;
|
|
199
199
|
const rc = (0, rc_1.loadRC)(options);
|
|
200
200
|
options.rc = rc;
|
|
201
201
|
let activeProject = this.configstoreProject(options.projectRoot || process.cwd());
|
|
@@ -203,7 +203,7 @@ class Command {
|
|
|
203
203
|
if ((0, env_1.isFirebaseStudio)() && !options.project && !isUseCommand) {
|
|
204
204
|
activeProject = await (0, studio_1.reconcileStudioFirebaseProject)(options, activeProject);
|
|
205
205
|
}
|
|
206
|
-
options.project =
|
|
206
|
+
options.project = options.project ?? activeProject;
|
|
207
207
|
if (options.config && !options.project) {
|
|
208
208
|
options.project = options.config.defaults.project;
|
|
209
209
|
}
|
|
@@ -223,8 +223,7 @@ class Command {
|
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
225
|
configstoreProject(dir) {
|
|
226
|
-
|
|
227
|
-
const projectMap = (_a = configstore_1.configstore.get("activeProjects")) !== null && _a !== void 0 ? _a : {};
|
|
226
|
+
const projectMap = configstore_1.configstore.get("activeProjects") ?? {};
|
|
228
227
|
let currentDir = path.resolve(dir);
|
|
229
228
|
while (true) {
|
|
230
229
|
if (projectMap[currentDir]) {
|
|
@@ -238,8 +237,7 @@ class Command {
|
|
|
238
237
|
}
|
|
239
238
|
}
|
|
240
239
|
async resolveProjectIdentifiers(options) {
|
|
241
|
-
|
|
242
|
-
if ((_a = options.project) === null || _a === void 0 ? void 0 : _a.match(/^\d+$/)) {
|
|
240
|
+
if (options.project?.match(/^\d+$/)) {
|
|
243
241
|
await (0, requireAuth_1.requireAuth)(options);
|
|
244
242
|
const { projectId, projectNumber } = await (0, projects_1.getProject)(options.project);
|
|
245
243
|
options.projectId = projectId;
|
|
@@ -284,4 +282,3 @@ function validateProjectId(project) {
|
|
|
284
282
|
throw new error_1.FirebaseError(invalidMessage);
|
|
285
283
|
}
|
|
286
284
|
}
|
|
287
|
-
exports.validateProjectId = validateProjectId;
|
|
@@ -34,7 +34,6 @@ exports.command = new command_1.Command("appdistribution:testers:list [group]")
|
|
|
34
34
|
return { testers };
|
|
35
35
|
});
|
|
36
36
|
function printTestersTable(testers) {
|
|
37
|
-
var _a, _b;
|
|
38
37
|
const tableHead = ["Name", "Display Name", "Last Activity Time", "Groups"];
|
|
39
38
|
const table = new Table({
|
|
40
39
|
head: tableHead,
|
|
@@ -42,11 +41,11 @@ function printTestersTable(testers) {
|
|
|
42
41
|
});
|
|
43
42
|
for (const tester of testers) {
|
|
44
43
|
const name = tester.name.split("/").pop();
|
|
45
|
-
const groups = (
|
|
44
|
+
const groups = (tester.groups ?? [])
|
|
46
45
|
.map((grp) => grp.split("/").pop())
|
|
47
46
|
.sort()
|
|
48
47
|
.join(";");
|
|
49
|
-
table.push([name,
|
|
48
|
+
table.push([name, tester.displayName ?? "", tester.lastActivityTime.toString(), groups]);
|
|
50
49
|
}
|
|
51
50
|
logger_1.logger.info(table.toString());
|
|
52
51
|
}
|
|
@@ -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.printBackendsTable = printBackendsTable;
|
|
4
5
|
const command_1 = require("../command");
|
|
5
6
|
const utils_1 = require("../utils");
|
|
6
7
|
const error_1 = require("../error");
|
|
@@ -15,7 +16,6 @@ exports.command = new command_1.Command("apphosting:backends:list")
|
|
|
15
16
|
.before(requireAuth_1.requireAuth)
|
|
16
17
|
.before(apphosting.ensureApiEnabled)
|
|
17
18
|
.action(async (options) => {
|
|
18
|
-
var _a;
|
|
19
19
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
20
20
|
let backendRes;
|
|
21
21
|
try {
|
|
@@ -24,12 +24,11 @@ exports.command = new command_1.Command("apphosting:backends:list")
|
|
|
24
24
|
catch (err) {
|
|
25
25
|
throw new error_1.FirebaseError(`Unable to list backends present for project: ${projectId}. Please check the parameters you have provided.`, { original: err });
|
|
26
26
|
}
|
|
27
|
-
const backends =
|
|
27
|
+
const backends = backendRes.backends ?? [];
|
|
28
28
|
printBackendsTable(backends);
|
|
29
29
|
return backends;
|
|
30
30
|
});
|
|
31
31
|
function printBackendsTable(backends) {
|
|
32
|
-
var _a, _b, _c;
|
|
33
32
|
const table = new Table({
|
|
34
33
|
head: TABLE_HEAD,
|
|
35
34
|
style: { head: ["green"] },
|
|
@@ -38,7 +37,7 @@ function printBackendsTable(backends) {
|
|
|
38
37
|
const { location, id } = apphosting.parseBackendName(backend.name);
|
|
39
38
|
table.push([
|
|
40
39
|
id,
|
|
41
|
-
|
|
40
|
+
backend.codebase?.repository?.split("/").pop() ?? "",
|
|
42
41
|
backend.uri.startsWith("https:") ? backend.uri : "https://" + backend.uri,
|
|
43
42
|
location,
|
|
44
43
|
(0, utils_1.datetimeString)(new Date(backend.updateTime)),
|
|
@@ -46,4 +45,3 @@ function printBackendsTable(backends) {
|
|
|
46
45
|
}
|
|
47
46
|
logger_1.logger.info(table.toString());
|
|
48
47
|
}
|
|
49
|
-
exports.printBackendsTable = printBackendsTable;
|
|
@@ -15,15 +15,14 @@ exports.command = new command_1.Command("apphosting:builds:create <backendId>")
|
|
|
15
15
|
.before(requireAuth_1.requireAuth)
|
|
16
16
|
.before(apphosting.ensureApiEnabled)
|
|
17
17
|
.action(async (backendId, options) => {
|
|
18
|
-
var _a, _b;
|
|
19
18
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
20
19
|
if (options.location !== undefined) {
|
|
21
20
|
(0, utils_1.logWarning)("--location is being removed in the next major release.");
|
|
22
21
|
}
|
|
23
|
-
const location =
|
|
22
|
+
const location = options.location ?? "us-central1";
|
|
24
23
|
const buildId = options.buildId ||
|
|
25
24
|
(await apphosting.getNextRolloutId(projectId, location, backendId));
|
|
26
|
-
const branch =
|
|
25
|
+
const branch = options.branch ?? "main";
|
|
27
26
|
const op = await apphosting.createBuild(projectId, location, backendId, buildId, {
|
|
28
27
|
source: {
|
|
29
28
|
codebase: {
|
|
@@ -13,11 +13,10 @@ exports.command = new command_1.Command("apphosting:builds:get <backendId> <buil
|
|
|
13
13
|
.before(requireAuth_1.requireAuth)
|
|
14
14
|
.before(apphosting.ensureApiEnabled)
|
|
15
15
|
.action(async (backendId, buildId, options) => {
|
|
16
|
-
var _a;
|
|
17
16
|
if (options.location !== undefined) {
|
|
18
17
|
(0, utils_1.logWarning)("--location is being removed in the next major release.");
|
|
19
18
|
}
|
|
20
|
-
options.location =
|
|
19
|
+
options.location = options.location ?? "us-central";
|
|
21
20
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
22
21
|
const location = options.location;
|
|
23
22
|
const build = await apphosting.getBuild(projectId, location, backendId, buildId);
|
|
@@ -13,12 +13,11 @@ exports.command = new command_1.Command("apphosting:rollouts:list <backendId>")
|
|
|
13
13
|
.before(requireAuth_1.requireAuth)
|
|
14
14
|
.before(apphosting.ensureApiEnabled)
|
|
15
15
|
.action(async (backendId, options) => {
|
|
16
|
-
var _a;
|
|
17
16
|
if (options.location !== undefined) {
|
|
18
17
|
(0, utils_1.logWarning)("--location is being removed in the next major release.");
|
|
19
18
|
}
|
|
20
19
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
21
|
-
const location =
|
|
20
|
+
const location = options.location ?? "-";
|
|
22
21
|
const rollouts = await apphosting.listRollouts(projectId, location, backendId);
|
|
23
22
|
if (rollouts.unreachable) {
|
|
24
23
|
logger_1.logger.error(`WARNING: the following locations were unreachable: ${rollouts.unreachable.join(", ")}`);
|
|
@@ -71,7 +71,7 @@ exports.command = new command_1.Command("apps:init [platform] [appId]")
|
|
|
71
71
|
catch (e) {
|
|
72
72
|
if (e.message.includes("associated with this Firebase project")) {
|
|
73
73
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
74
|
-
await (0, apps_1.sdkInit)(detectedPlatform,
|
|
74
|
+
await (0, apps_1.sdkInit)(detectedPlatform, { ...options, project: projectId });
|
|
75
75
|
}
|
|
76
76
|
else {
|
|
77
77
|
throw e;
|
|
@@ -14,7 +14,7 @@ const marked_1 = require("marked");
|
|
|
14
14
|
const projectUtils_1 = require("../projectUtils");
|
|
15
15
|
const utils_1 = require("../utils");
|
|
16
16
|
const apps_1 = require("../management/apps");
|
|
17
|
-
exports.command = new command_1.Command("apptesting:
|
|
17
|
+
exports.command = new command_1.Command("apptesting:wata <target>")
|
|
18
18
|
.description("Run automated tests written in natural language driven by AI")
|
|
19
19
|
.option("--app <app_id>", "The app id of your Firebase web app. Optional if the project contains exactly one web app.")
|
|
20
20
|
.option("--test-file-pattern <pattern>", "Test file pattern. Only tests contained in files that match this pattern will be executed.")
|
|
@@ -23,7 +23,6 @@ exports.command = new command_1.Command("apptesting:execute <target>")
|
|
|
23
23
|
.before(requireAuth_1.requireAuth)
|
|
24
24
|
.before(requireConfig_1.requireConfig)
|
|
25
25
|
.action(async (target, options) => {
|
|
26
|
-
var _a, _b;
|
|
27
26
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
28
27
|
const apps = await (0, apps_1.listFirebaseApps)(projectId, apps_1.AppPlatform.WEB);
|
|
29
28
|
(0, apps_1.checkForApps)(apps, apps_1.AppPlatform.WEB);
|
|
@@ -39,7 +38,7 @@ exports.command = new command_1.Command("apptesting:execute <target>")
|
|
|
39
38
|
throw new error_1.FirebaseError(`Project ${projectId} has multiple apps, must specify a web app id with '--app', you can list available apps with 'firebase apps:list'.`);
|
|
40
39
|
}
|
|
41
40
|
}
|
|
42
|
-
const testDir =
|
|
41
|
+
const testDir = options.config.src.apptesting?.testDir || "tests";
|
|
43
42
|
const tests = await (0, parseTestFiles_1.parseTestFiles)(testDir, target, options.testFilePattern, options.testNamePattern);
|
|
44
43
|
if (!tests.length) {
|
|
45
44
|
throw new error_1.FirebaseError("No tests found");
|
|
@@ -57,7 +56,7 @@ exports.command = new command_1.Command("apptesting:execute <target>")
|
|
|
57
56
|
throw ex;
|
|
58
57
|
}
|
|
59
58
|
logger_1.logger.info(clc.bold(`\n${clc.white("===")} Running ${pluralizeTests(tests.length)}`));
|
|
60
|
-
const invocationId =
|
|
59
|
+
const invocationId = invocationOperation.name?.split("/").pop();
|
|
61
60
|
const appWebId = app.webId;
|
|
62
61
|
const url = (0, utils_1.consoleUrl)(projectId, `/apptesting/app/web:${appWebId}/invocations/${invocationId}`);
|
|
63
62
|
logger_1.logger.info(await (0, marked_1.marked)(`**Invocation ID:** ${invocationId}`));
|
|
@@ -34,7 +34,7 @@ exports.command = new command_1.Command("crashlytics:symbols:upload <symbolFiles
|
|
|
34
34
|
};
|
|
35
35
|
for (const symbolFile of symbolFiles) {
|
|
36
36
|
utils.logBullet(`Generating symbols for ${symbolFile}`);
|
|
37
|
-
const generateArgs = buildArgs(
|
|
37
|
+
const generateArgs = buildArgs({ ...jarOptions, symbolFile });
|
|
38
38
|
(0, buildToolsJarHelper_1.runBuildtoolsCommand)(jarFile, generateArgs, debug);
|
|
39
39
|
utils.logBullet(`Generated symbols for ${symbolFile}`);
|
|
40
40
|
utils.logBullet(`Output Path: ${jarOptions.cachePath}`);
|
|
@@ -44,7 +44,7 @@ exports.command = new command_1.Command("crashlytics:symbols:upload <symbolFiles
|
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
46
46
|
utils.logBullet(`Uploading all generated symbols...`);
|
|
47
|
-
const uploadArgs = buildArgs(
|
|
47
|
+
const uploadArgs = buildArgs({ ...jarOptions, generate: false });
|
|
48
48
|
(0, buildToolsJarHelper_1.runBuildtoolsCommand)(jarFile, uploadArgs, debug);
|
|
49
49
|
utils.logBullet("Successfully uploaded all symbols");
|
|
50
50
|
});
|
|
@@ -56,12 +56,12 @@ exports.command = new command_1.Command("dataconnect:execute [file] [operationNa
|
|
|
56
56
|
}
|
|
57
57
|
else {
|
|
58
58
|
const stat = (0, node_fs_1.statSync)(file, { throwIfNoEntry: false });
|
|
59
|
-
if (stat
|
|
59
|
+
if (stat?.isFile()) {
|
|
60
60
|
const opDisplay = operationName ? clc.bold(operationName) : "operation";
|
|
61
61
|
process.stderr.write(`${clc.cyan(`Executing ${opDisplay} in ${clc.bold(file)}`)}${node_os_1.EOL}`);
|
|
62
62
|
query = await (0, promises_1.readFile)(file, "utf-8");
|
|
63
63
|
}
|
|
64
|
-
else if (stat
|
|
64
|
+
else if (stat?.isDirectory()) {
|
|
65
65
|
query = await readQueryFromDir(file);
|
|
66
66
|
}
|
|
67
67
|
else {
|
|
@@ -119,7 +119,7 @@ exports.command = new command_1.Command("dataconnect:execute [file] [operationNa
|
|
|
119
119
|
});
|
|
120
120
|
}
|
|
121
121
|
if (status === "INVALID_ARGUMENT" && message.includes("operationName is required")) {
|
|
122
|
-
throw new error_1.FirebaseError(err.message + `\nHint: Append <operationName> as an argument to disambiguate.`,
|
|
122
|
+
throw new error_1.FirebaseError(err.message + `\nHint: Append <operationName> as an argument to disambiguate.`, { ...err, original: err });
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
125
|
if (err) {
|
|
@@ -171,7 +171,7 @@ exports.command = new command_1.Command("dataconnect:execute [file] [operationNa
|
|
|
171
171
|
}
|
|
172
172
|
if (!serviceId) {
|
|
173
173
|
e = new error_1.FirebaseError(e.message +
|
|
174
|
-
`\nHint: Try specifying the ${clc.yellow("--service <serviceId>")} option.`,
|
|
174
|
+
`\nHint: Try specifying the ${clc.yellow("--service <serviceId>")} option.`, { ...e, original: e });
|
|
175
175
|
}
|
|
176
176
|
return Promise.reject(e);
|
|
177
177
|
});
|
|
@@ -74,12 +74,11 @@ exports.command = new command_1.Command("dataconnect:sdk:generate")
|
|
|
74
74
|
async function loadAllWithSDKs(projectId, config, options) {
|
|
75
75
|
const serviceInfos = await (0, load_1.pickServices)(projectId || hub_1.EmulatorHub.MISSING_PROJECT_PLACEHOLDER, config, options.service, options.location);
|
|
76
76
|
return serviceInfos.filter((serviceInfo) => serviceInfo.connectorInfo.some((c) => {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
((_e = c.connectorYaml.generate) === null || _e === void 0 ? void 0 : _e.adminNodeSdk));
|
|
77
|
+
return (c.connectorYaml.generate?.javascriptSdk ||
|
|
78
|
+
c.connectorYaml.generate?.kotlinSdk ||
|
|
79
|
+
c.connectorYaml.generate?.swiftSdk ||
|
|
80
|
+
c.connectorYaml.generate?.dartSdk ||
|
|
81
|
+
c.connectorYaml.generate?.adminNodeSdk);
|
|
83
82
|
}));
|
|
84
83
|
}
|
|
85
84
|
async function generateSDKsInAll(options, serviceInfosWithSDKs, justRanInit) {
|