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/accountExporter.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.validateOptions = validateOptions;
|
|
4
|
+
exports.serialExportUsers = serialExportUsers;
|
|
4
5
|
const os = require("os");
|
|
5
6
|
const path = require("path");
|
|
6
7
|
const apiv2_1 = require("./apiv2");
|
|
@@ -138,7 +139,6 @@ function validateOptions(options, fileName) {
|
|
|
138
139
|
}
|
|
139
140
|
return exportOptions;
|
|
140
141
|
}
|
|
141
|
-
exports.validateOptions = validateOptions;
|
|
142
142
|
function createWriteUsersToFile() {
|
|
143
143
|
let jsonSep = "";
|
|
144
144
|
return (userList, format, writeStream) => {
|
|
@@ -158,7 +158,6 @@ function createWriteUsersToFile() {
|
|
|
158
158
|
};
|
|
159
159
|
}
|
|
160
160
|
async function serialExportUsers(projectId, options) {
|
|
161
|
-
var _a;
|
|
162
161
|
if (!options.writeUsersToFile) {
|
|
163
162
|
options.writeUsersToFile = createWriteUsersToFile();
|
|
164
163
|
}
|
|
@@ -189,7 +188,7 @@ async function serialExportUsers(projectId, options) {
|
|
|
189
188
|
}
|
|
190
189
|
}
|
|
191
190
|
catch (err) {
|
|
192
|
-
if (
|
|
191
|
+
if (err.original?.code === "ETIMEDOUT") {
|
|
193
192
|
options.timeoutRetryCount++;
|
|
194
193
|
if (options.timeoutRetryCount > 5) {
|
|
195
194
|
return err;
|
|
@@ -204,4 +203,3 @@ async function serialExportUsers(projectId, options) {
|
|
|
204
203
|
}
|
|
205
204
|
}
|
|
206
205
|
}
|
|
207
|
-
exports.serialExportUsers = serialExportUsers;
|
package/lib/accountImporter.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.transArrayToUser = transArrayToUser;
|
|
4
|
+
exports.validateOptions = validateOptions;
|
|
5
|
+
exports.validateUserJson = validateUserJson;
|
|
6
|
+
exports.serialImportUsers = serialImportUsers;
|
|
4
7
|
const clc = require("colorette");
|
|
5
8
|
const apiv2_1 = require("./apiv2");
|
|
6
9
|
const api_1 = require("./api");
|
|
@@ -134,7 +137,6 @@ function transArrayToUser(arr) {
|
|
|
134
137
|
}
|
|
135
138
|
return user;
|
|
136
139
|
}
|
|
137
|
-
exports.transArrayToUser = transArrayToUser;
|
|
138
140
|
function validateOptions(options) {
|
|
139
141
|
const hashOptions = validateRequiredParameters(options);
|
|
140
142
|
if (!hashOptions.valid) {
|
|
@@ -152,7 +154,6 @@ function validateOptions(options) {
|
|
|
152
154
|
}
|
|
153
155
|
return hashOptions;
|
|
154
156
|
}
|
|
155
|
-
exports.validateOptions = validateOptions;
|
|
156
157
|
function validateRequiredParameters(options) {
|
|
157
158
|
if (!options.hashAlgo) {
|
|
158
159
|
utils.logWarning("No hash algorithm specified. Password users cannot be imported.");
|
|
@@ -271,7 +272,6 @@ function validateUserJson(userJson) {
|
|
|
271
272
|
}
|
|
272
273
|
return {};
|
|
273
274
|
}
|
|
274
|
-
exports.validateUserJson = validateUserJson;
|
|
275
275
|
async function sendRequest(projectId, userList, hashOptions) {
|
|
276
276
|
logger_1.logger.info("Starting importing " + userList.length + " account(s).");
|
|
277
277
|
const postData = genUploadAccountPostBody(projectId, userList, hashOptions);
|
|
@@ -302,4 +302,3 @@ function serialImportUsers(projectId, hashOptions, userListArr, index) {
|
|
|
302
302
|
}
|
|
303
303
|
});
|
|
304
304
|
}
|
|
305
|
-
exports.serialImportUsers = serialImportUsers;
|
package/lib/api.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.storageOrigin = exports.runtimeconfigOrigin = exports.rulesOrigin = exports.resourceManagerOrigin = exports.crashlyticsApiOrigin = exports.messagingApiOrigin = exports.remoteConfigApiOrigin = exports.rtdbMetadataOrigin = exports.rtdbManagementOrigin = exports.realtimeOrigin = exports.extensionsTOSOrigin = exports.extensionsPublisherOrigin = exports.extensionsOrigin = exports.iamOrigin = exports.identityOrigin = exports.hostingOrigin = exports.googleOrigin = exports.pubsubOrigin = exports.cloudTasksOrigin = exports.cloudschedulerOrigin = exports.cloudbuildOrigin = exports.functionsDefaultRegion = exports.runOrigin = exports.functionsV2Origin = exports.functionsOrigin = exports.firestoreOrigin = exports.firestoreOriginOrEmulator = exports.firedataOrigin = exports.firebaseExtensionsRegistryOrigin = exports.firebaseApiOrigin = exports.eventarcOrigin = exports.dynamicLinksKey = exports.dynamicLinksOrigin = exports.consoleOrigin = exports.authManagementOrigin = exports.authOrigin = exports.apphostingGitHubAppInstallationURL = exports.apphostingP4SADomain = exports.apphostingOrigin = exports.appDistributionOrigin = exports.artifactRegistryDomain = exports.developerConnectP4SADomain = exports.developerConnectOrigin = exports.containerRegistryDomain = exports.cloudMonitoringOrigin = exports.cloudloggingOrigin = exports.cloudbillingOrigin = exports.clientSecret = exports.clientId = exports.authProxyOrigin = void 0;
|
|
4
|
-
exports.
|
|
4
|
+
exports.cloudTestingOrigin = exports.appTestingOrigin = exports.cloudAiCompanionOrigin = exports.vertexAIOrigin = exports.cloudSQLAdminOrigin = exports.dataConnectLocalConnString = exports.dataconnectP4SADomain = exports.dataconnectOrigin = exports.githubClientSecret = exports.githubClientId = exports.computeOrigin = exports.secretManagerOrigin = exports.githubApiOrigin = exports.githubOrigin = exports.studioApiOrigin = exports.serviceUsageOrigin = exports.cloudRunApiOrigin = exports.hostingApiOrigin = exports.firebaseStorageOrigin = void 0;
|
|
5
|
+
exports.getScopes = getScopes;
|
|
6
|
+
exports.setScopes = setScopes;
|
|
5
7
|
const constants_1 = require("./emulator/constants");
|
|
6
8
|
const logger_1 = require("./logger");
|
|
7
9
|
const scopes = require("./scopes");
|
|
@@ -153,7 +155,6 @@ exports.cloudTestingOrigin = cloudTestingOrigin;
|
|
|
153
155
|
function getScopes() {
|
|
154
156
|
return Array.from(commandScopes);
|
|
155
157
|
}
|
|
156
|
-
exports.getScopes = getScopes;
|
|
157
158
|
function setScopes(sps = []) {
|
|
158
159
|
commandScopes = new Set([
|
|
159
160
|
scopes.EMAIL,
|
|
@@ -166,4 +167,3 @@ function setScopes(sps = []) {
|
|
|
166
167
|
}
|
|
167
168
|
logger_1.logger.debug("> command requires scopes:", Array.from(commandScopes));
|
|
168
169
|
}
|
|
169
|
-
exports.setScopes = setScopes;
|
package/lib/apiv2.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Client = exports.
|
|
3
|
+
exports.Client = exports.STANDARD_HEADERS = void 0;
|
|
4
|
+
exports.setRefreshToken = setRefreshToken;
|
|
5
|
+
exports.setAccessToken = setAccessToken;
|
|
6
|
+
exports.getAccessToken = getAccessToken;
|
|
4
7
|
const url_1 = require("url");
|
|
5
8
|
const stream_1 = require("stream");
|
|
6
9
|
const proxy_agent_1 = require("proxy-agent");
|
|
@@ -28,11 +31,9 @@ let refreshToken = "";
|
|
|
28
31
|
function setRefreshToken(token = "") {
|
|
29
32
|
refreshToken = token;
|
|
30
33
|
}
|
|
31
|
-
exports.setRefreshToken = setRefreshToken;
|
|
32
34
|
function setAccessToken(token = "") {
|
|
33
35
|
accessToken = token;
|
|
34
36
|
}
|
|
35
|
-
exports.setAccessToken = setAccessToken;
|
|
36
37
|
async function getAccessToken() {
|
|
37
38
|
const valid = auth.haveValidTokens(refreshToken, []);
|
|
38
39
|
const usingADC = !auth.loggedIn();
|
|
@@ -42,7 +43,6 @@ async function getAccessToken() {
|
|
|
42
43
|
const data = await auth.getAccessToken(refreshToken, []);
|
|
43
44
|
return data.access_token;
|
|
44
45
|
}
|
|
45
|
-
exports.getAccessToken = getAccessToken;
|
|
46
46
|
function proxyURIFromEnv() {
|
|
47
47
|
return (process.env.HTTPS_PROXY ||
|
|
48
48
|
process.env.https_proxy ||
|
|
@@ -176,7 +176,6 @@ class Client {
|
|
|
176
176
|
return `${this.opts.urlPrefix}${versionPath}${options.path}`;
|
|
177
177
|
}
|
|
178
178
|
async doRequest(options) {
|
|
179
|
-
var _a;
|
|
180
179
|
if (!options.path.startsWith("/")) {
|
|
181
180
|
options.path = "/" + options.path;
|
|
182
181
|
}
|
|
@@ -232,7 +231,7 @@ class Client {
|
|
|
232
231
|
fetchOptions.body = JSON.stringify(options.body);
|
|
233
232
|
}
|
|
234
233
|
const operationOptions = {
|
|
235
|
-
retries:
|
|
234
|
+
retries: options.retryCodes?.length ? 1 : 2,
|
|
236
235
|
minTimeout: 1 * 1000,
|
|
237
236
|
maxTimeout: 5 * 1000,
|
|
238
237
|
};
|
|
@@ -248,7 +247,6 @@ class Client {
|
|
|
248
247
|
const operation = retry.operation(operationOptions);
|
|
249
248
|
return await new Promise((resolve, reject) => {
|
|
250
249
|
operation.attempt(async (currentAttempt) => {
|
|
251
|
-
var _a;
|
|
252
250
|
let res;
|
|
253
251
|
let body;
|
|
254
252
|
try {
|
|
@@ -312,7 +310,7 @@ class Client {
|
|
|
312
310
|
setAccessToken();
|
|
313
311
|
setAccessToken(await getAccessToken());
|
|
314
312
|
}
|
|
315
|
-
if (
|
|
313
|
+
if (options.retryCodes?.includes(res.status)) {
|
|
316
314
|
const err = (0, responseToError_1.responseToError)({ statusCode: res.status }, body, fetchURL) || undefined;
|
|
317
315
|
if (operation.retry(err)) {
|
|
318
316
|
return;
|
|
@@ -331,11 +329,10 @@ class Client {
|
|
|
331
329
|
});
|
|
332
330
|
}
|
|
333
331
|
logRequest(options) {
|
|
334
|
-
var _a, _b;
|
|
335
332
|
let queryParamsLog = "[none]";
|
|
336
333
|
if (options.queryParams) {
|
|
337
334
|
queryParamsLog = "[omitted]";
|
|
338
|
-
if (!
|
|
335
|
+
if (!options.skipLog?.queryParams) {
|
|
339
336
|
queryParamsLog =
|
|
340
337
|
options.queryParams instanceof url_1.URLSearchParams
|
|
341
338
|
? options.queryParams.toString()
|
|
@@ -350,18 +347,17 @@ class Client {
|
|
|
350
347
|
}
|
|
351
348
|
if (options.body !== undefined) {
|
|
352
349
|
let logBody = "[omitted]";
|
|
353
|
-
if (!
|
|
350
|
+
if (!options.skipLog?.body) {
|
|
354
351
|
logBody = bodyToString(options.body);
|
|
355
352
|
}
|
|
356
353
|
logger_1.logger.debug(`>>> [apiv2][body] ${options.method} ${logURL} ${logBody}`);
|
|
357
354
|
}
|
|
358
355
|
}
|
|
359
356
|
logResponse(res, body, options) {
|
|
360
|
-
var _a;
|
|
361
357
|
const logURL = this.requestURL(options);
|
|
362
358
|
logger_1.logger.debug(`<<< [apiv2][status] ${options.method} ${logURL} ${res.status}`);
|
|
363
359
|
let logBody = "[omitted]";
|
|
364
|
-
if (!
|
|
360
|
+
if (!options.skipLog?.resBody) {
|
|
365
361
|
logBody = bodyToString(body);
|
|
366
362
|
}
|
|
367
363
|
logger_1.logger.debug(`<<< [apiv2][body] ${options.method} ${logURL} ${logBody}`);
|
package/lib/appUtils.js
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.Framework = exports.Platform = void 0;
|
|
4
|
+
exports.appDescription = appDescription;
|
|
5
|
+
exports.getPlatformsFromFolder = getPlatformsFromFolder;
|
|
6
|
+
exports.detectApps = detectApps;
|
|
7
|
+
exports.getAllDepsFromPackageJson = getAllDepsFromPackageJson;
|
|
8
|
+
exports.extractAppIdentifiersFlutter = extractAppIdentifiersFlutter;
|
|
9
|
+
exports.extractAppIdentifierIos = extractAppIdentifierIos;
|
|
10
|
+
exports.extractAppIdentifiersAndroid = extractAppIdentifiersAndroid;
|
|
11
|
+
exports.detectFiles = detectFiles;
|
|
4
12
|
const fs = require("fs-extra");
|
|
5
13
|
const path = require("path");
|
|
6
14
|
const glob_1 = require("glob");
|
|
@@ -11,21 +19,19 @@ var Platform;
|
|
|
11
19
|
Platform["IOS"] = "IOS";
|
|
12
20
|
Platform["FLUTTER"] = "FLUTTER";
|
|
13
21
|
Platform["ADMIN_NODE"] = "ADMIN_NODE";
|
|
14
|
-
})(Platform
|
|
22
|
+
})(Platform || (exports.Platform = Platform = {}));
|
|
15
23
|
var Framework;
|
|
16
24
|
(function (Framework) {
|
|
17
25
|
Framework["REACT"] = "react";
|
|
18
26
|
Framework["ANGULAR"] = "angular";
|
|
19
|
-
})(Framework
|
|
27
|
+
})(Framework || (exports.Framework = Framework = {}));
|
|
20
28
|
function appDescription(a) {
|
|
21
29
|
return `${a.directory} (${a.platform.toLowerCase()})`;
|
|
22
30
|
}
|
|
23
|
-
exports.appDescription = appDescription;
|
|
24
31
|
async function getPlatformsFromFolder(dirPath) {
|
|
25
32
|
const apps = await detectApps(dirPath);
|
|
26
33
|
return [...new Set(apps.map((app) => app.platform))];
|
|
27
34
|
}
|
|
28
|
-
exports.getPlatformsFromFolder = getPlatformsFromFolder;
|
|
29
35
|
async function detectApps(dirPath) {
|
|
30
36
|
const [packageJsonFiles, pubSpecYamlFiles, srcMainFolders, xCodeProjects] = await Promise.all([
|
|
31
37
|
detectFiles(dirPath, "package.json"),
|
|
@@ -43,7 +49,6 @@ async function detectApps(dirPath) {
|
|
|
43
49
|
const iosApps = iosAppsRaw.filter((a) => !flutterApps.some((f) => isPathInside(f.directory, a.directory)));
|
|
44
50
|
return [...flutterApps, ...androidApps, ...iosApps, ...adminAndWebApps];
|
|
45
51
|
}
|
|
46
|
-
exports.detectApps = detectApps;
|
|
47
52
|
async function processIosDir(dirPath, filePath) {
|
|
48
53
|
const iosDir = path.dirname(filePath);
|
|
49
54
|
const iosAppIds = await detectAppIdsForPlatform(dirPath, Platform.IOS);
|
|
@@ -109,13 +114,11 @@ function isPathInside(parent, child) {
|
|
|
109
114
|
return !relativePath.startsWith(`..`);
|
|
110
115
|
}
|
|
111
116
|
function getAllDepsFromPackageJson(packageJson) {
|
|
112
|
-
|
|
113
|
-
const
|
|
114
|
-
const dependencies = Object.keys((_b = packageJson.dependencies) !== null && _b !== void 0 ? _b : {});
|
|
117
|
+
const devDependencies = Object.keys(packageJson.devDependencies ?? {});
|
|
118
|
+
const dependencies = Object.keys(packageJson.dependencies ?? {});
|
|
115
119
|
const allDeps = Array.from(new Set([...devDependencies, ...dependencies]));
|
|
116
120
|
return allDeps;
|
|
117
121
|
}
|
|
118
|
-
exports.getAllDepsFromPackageJson = getAllDepsFromPackageJson;
|
|
119
122
|
async function packageJsonToAdminOrWebApp(dirPath, packageJsonFile) {
|
|
120
123
|
try {
|
|
121
124
|
const fullPath = path.join(dirPath, packageJsonFile);
|
|
@@ -185,43 +188,40 @@ function extractAppIdentifiersFlutter(fileContent) {
|
|
|
185
188
|
const optionsContent = match[1];
|
|
186
189
|
const appIdMatch = appIdRegex.exec(optionsContent);
|
|
187
190
|
const bundleIdMatch = bundleIdRegex.exec(optionsContent);
|
|
188
|
-
if (appIdMatch
|
|
191
|
+
if (appIdMatch?.[1]) {
|
|
189
192
|
identifiers.push({
|
|
190
193
|
appId: appIdMatch[1],
|
|
191
|
-
bundleId: bundleIdMatch
|
|
194
|
+
bundleId: bundleIdMatch?.[1],
|
|
192
195
|
});
|
|
193
196
|
}
|
|
194
197
|
}
|
|
195
198
|
return identifiers;
|
|
196
199
|
}
|
|
197
|
-
exports.extractAppIdentifiersFlutter = extractAppIdentifiersFlutter;
|
|
198
200
|
function extractAppIdentifierIos(fileContent) {
|
|
199
201
|
const appIdRegex = /<key>GOOGLE_APP_ID<\/key>\s*<string>([^<]*)<\/string>/;
|
|
200
202
|
const bundleIdRegex = /<key>BUNDLE_ID<\/key>\s*<string>([^<]*)<\/string>/;
|
|
201
203
|
const appIdMatch = fileContent.match(appIdRegex);
|
|
202
204
|
const bundleIdMatch = fileContent.match(bundleIdRegex);
|
|
203
|
-
if (appIdMatch
|
|
205
|
+
if (appIdMatch?.[1]) {
|
|
204
206
|
return [
|
|
205
207
|
{
|
|
206
208
|
appId: appIdMatch[1],
|
|
207
|
-
bundleId: bundleIdMatch
|
|
209
|
+
bundleId: bundleIdMatch?.[1],
|
|
208
210
|
},
|
|
209
211
|
];
|
|
210
212
|
}
|
|
211
213
|
return [];
|
|
212
214
|
}
|
|
213
|
-
exports.extractAppIdentifierIos = extractAppIdentifierIos;
|
|
214
215
|
function extractAppIdentifiersAndroid(fileContent) {
|
|
215
|
-
var _a, _b;
|
|
216
216
|
const identifiers = [];
|
|
217
217
|
try {
|
|
218
218
|
const config = JSON.parse(fileContent);
|
|
219
219
|
if (config.client && Array.isArray(config.client)) {
|
|
220
220
|
for (const client of config.client) {
|
|
221
|
-
if (
|
|
221
|
+
if (client.client_info?.mobilesdk_app_id) {
|
|
222
222
|
identifiers.push({
|
|
223
223
|
appId: client.client_info.mobilesdk_app_id,
|
|
224
|
-
bundleId:
|
|
224
|
+
bundleId: client.client_info.android_client_info?.package_name,
|
|
225
225
|
});
|
|
226
226
|
}
|
|
227
227
|
}
|
|
@@ -232,7 +232,6 @@ function extractAppIdentifiersAndroid(fileContent) {
|
|
|
232
232
|
}
|
|
233
233
|
return identifiers;
|
|
234
234
|
}
|
|
235
|
-
exports.extractAppIdentifiersAndroid = extractAppIdentifiersAndroid;
|
|
236
235
|
async function detectFiles(dirPath, filePattern) {
|
|
237
236
|
const options = {
|
|
238
237
|
cwd: dirPath,
|
|
@@ -250,4 +249,3 @@ async function detectFiles(dirPath, filePattern) {
|
|
|
250
249
|
};
|
|
251
250
|
return (0, glob_1.glob)(`**/${filePattern}`, options);
|
|
252
251
|
}
|
|
253
|
-
exports.detectFiles = detectFiles;
|
|
@@ -69,7 +69,6 @@ class AppDistributionClient {
|
|
|
69
69
|
utils.logSuccess("added release notes successfully");
|
|
70
70
|
}
|
|
71
71
|
async distribute(releaseName, testerEmails = [], groupAliases = []) {
|
|
72
|
-
var _a, _b, _c;
|
|
73
72
|
if (testerEmails.length === 0 && groupAliases.length === 0) {
|
|
74
73
|
utils.logWarning("no testers or groups specified, skipping");
|
|
75
74
|
return;
|
|
@@ -84,7 +83,7 @@ class AppDistributionClient {
|
|
|
84
83
|
}
|
|
85
84
|
catch (err) {
|
|
86
85
|
let errorMessage = (0, error_1.getErrMsg)(err);
|
|
87
|
-
const errorStatus =
|
|
86
|
+
const errorStatus = err?.context?.body?.error?.status;
|
|
88
87
|
if (errorStatus === "FAILED_PRECONDITION") {
|
|
89
88
|
errorMessage = "invalid testers";
|
|
90
89
|
}
|
|
@@ -98,7 +97,6 @@ class AppDistributionClient {
|
|
|
98
97
|
utils.logSuccess("distributed to testers/groups successfully");
|
|
99
98
|
}
|
|
100
99
|
async listTesters(projectName, groupName) {
|
|
101
|
-
var _a;
|
|
102
100
|
const testers = [];
|
|
103
101
|
const client = this.appDistroV1Client;
|
|
104
102
|
const filter = groupName ? `groups=${projectName}/groups/${groupName}` : null;
|
|
@@ -117,7 +115,7 @@ class AppDistributionClient {
|
|
|
117
115
|
catch (err) {
|
|
118
116
|
throw new error_1.FirebaseError(`Client request failed to list testers ${(0, error_1.getErrMsg)(err)}`);
|
|
119
117
|
}
|
|
120
|
-
for (const t of
|
|
118
|
+
for (const t of apiResponse.body.testers ?? []) {
|
|
121
119
|
testers.push({
|
|
122
120
|
name: t.name,
|
|
123
121
|
displayName: t.displayName,
|
|
@@ -157,7 +155,6 @@ class AppDistributionClient {
|
|
|
157
155
|
return apiResponse.body;
|
|
158
156
|
}
|
|
159
157
|
async listGroups(projectName) {
|
|
160
|
-
var _a;
|
|
161
158
|
const groups = [];
|
|
162
159
|
const client = this.appDistroV1Client;
|
|
163
160
|
let pageToken;
|
|
@@ -167,7 +164,7 @@ class AppDistributionClient {
|
|
|
167
164
|
const apiResponse = await client.get(`${projectName}/groups`, {
|
|
168
165
|
queryParams,
|
|
169
166
|
});
|
|
170
|
-
groups.push(...(
|
|
167
|
+
groups.push(...(apiResponse.body.groups ?? []));
|
|
171
168
|
pageToken = apiResponse.body.nextPageToken;
|
|
172
169
|
}
|
|
173
170
|
catch (err) {
|
|
@@ -251,7 +248,6 @@ class AppDistributionClient {
|
|
|
251
248
|
return response.body;
|
|
252
249
|
}
|
|
253
250
|
async listTestCases(appName) {
|
|
254
|
-
var _a;
|
|
255
251
|
const testCases = [];
|
|
256
252
|
const client = this.appDistroV1AlphaClient;
|
|
257
253
|
let pageToken;
|
|
@@ -261,7 +257,7 @@ class AppDistributionClient {
|
|
|
261
257
|
const apiResponse = await client.get(`${appName}/testCases`, {
|
|
262
258
|
queryParams,
|
|
263
259
|
});
|
|
264
|
-
testCases.push(...(
|
|
260
|
+
testCases.push(...(apiResponse.body.testCases ?? []));
|
|
265
261
|
pageToken = apiResponse.body.nextPageToken;
|
|
266
262
|
}
|
|
267
263
|
catch (err) {
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.Distribution = exports.DistributionFileType = void 0;
|
|
4
|
+
exports.upload = upload;
|
|
5
|
+
exports.awaitTestResults = awaitTestResults;
|
|
4
6
|
const fs = require("fs-extra");
|
|
5
7
|
const logger_1 = require("../logger");
|
|
6
8
|
const pathUtil = require("path");
|
|
@@ -14,7 +16,7 @@ var DistributionFileType;
|
|
|
14
16
|
DistributionFileType["IPA"] = "ipa";
|
|
15
17
|
DistributionFileType["APK"] = "apk";
|
|
16
18
|
DistributionFileType["AAB"] = "aab";
|
|
17
|
-
})(DistributionFileType
|
|
19
|
+
})(DistributionFileType || (exports.DistributionFileType = DistributionFileType = {}));
|
|
18
20
|
async function upload(requests, appName, distribution) {
|
|
19
21
|
utils.logBullet("uploading binary...");
|
|
20
22
|
try {
|
|
@@ -49,7 +51,6 @@ async function upload(requests, appName, distribution) {
|
|
|
49
51
|
throw new error_1.FirebaseError(`Failed to upload release. ${(0, error_1.getErrMsg)(err)}`, { exit: 1 });
|
|
50
52
|
}
|
|
51
53
|
}
|
|
52
|
-
exports.upload = upload;
|
|
53
54
|
class Distribution {
|
|
54
55
|
constructor(path) {
|
|
55
56
|
this.path = path;
|
|
@@ -125,7 +126,6 @@ async function awaitTestResults(releaseTests, requests) {
|
|
|
125
126
|
exit: 1,
|
|
126
127
|
});
|
|
127
128
|
}
|
|
128
|
-
exports.awaitTestResults = awaitTestResults;
|
|
129
129
|
function delay(ms) {
|
|
130
130
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
131
131
|
}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.parseIntoStringArray = parseIntoStringArray;
|
|
4
|
+
exports.getEmails = getEmails;
|
|
5
|
+
exports.ensureFileExists = ensureFileExists;
|
|
6
|
+
exports.getProjectName = getProjectName;
|
|
7
|
+
exports.getAppName = getAppName;
|
|
8
|
+
exports.toAppName = toAppName;
|
|
9
|
+
exports.parseTestDevices = parseTestDevices;
|
|
10
|
+
exports.getLoginCredential = getLoginCredential;
|
|
4
11
|
const fs = require("fs-extra");
|
|
5
12
|
const error_1 = require("../error");
|
|
6
13
|
const projectUtils_1 = require("../projectUtils");
|
|
@@ -14,7 +21,6 @@ function parseIntoStringArray(value, file = "") {
|
|
|
14
21
|
}
|
|
15
22
|
return [];
|
|
16
23
|
}
|
|
17
|
-
exports.parseIntoStringArray = parseIntoStringArray;
|
|
18
24
|
function getEmails(emails, file) {
|
|
19
25
|
if (emails.length === 0) {
|
|
20
26
|
ensureFileExists(file);
|
|
@@ -23,13 +29,11 @@ function getEmails(emails, file) {
|
|
|
23
29
|
}
|
|
24
30
|
return emails;
|
|
25
31
|
}
|
|
26
|
-
exports.getEmails = getEmails;
|
|
27
32
|
function ensureFileExists(file, message = "") {
|
|
28
33
|
if (!fs.existsSync(file)) {
|
|
29
34
|
throw new error_1.FirebaseError(`File ${file} does not exist: ${message}`);
|
|
30
35
|
}
|
|
31
36
|
}
|
|
32
|
-
exports.ensureFileExists = ensureFileExists;
|
|
33
37
|
function splitter(value) {
|
|
34
38
|
return value
|
|
35
39
|
.split(/[,\n]/)
|
|
@@ -40,18 +44,15 @@ async function getProjectName(options) {
|
|
|
40
44
|
const projectNumber = await (0, projectUtils_1.needProjectNumber)(options);
|
|
41
45
|
return `projects/${projectNumber}`;
|
|
42
46
|
}
|
|
43
|
-
exports.getProjectName = getProjectName;
|
|
44
47
|
function getAppName(options) {
|
|
45
48
|
if (!options.app) {
|
|
46
49
|
throw new error_1.FirebaseError("set the --app option to a valid Firebase app id and try again");
|
|
47
50
|
}
|
|
48
51
|
return toAppName(options.app);
|
|
49
52
|
}
|
|
50
|
-
exports.getAppName = getAppName;
|
|
51
53
|
function toAppName(appId) {
|
|
52
54
|
return `projects/${appId.split(":")[1]}/apps/${appId}`;
|
|
53
55
|
}
|
|
54
|
-
exports.toAppName = toAppName;
|
|
55
56
|
function parseTestDevices(value, file = "") {
|
|
56
57
|
if (!value && file) {
|
|
57
58
|
ensureFileExists(file);
|
|
@@ -66,7 +67,6 @@ function parseTestDevices(value, file = "") {
|
|
|
66
67
|
.filter((entry) => !!entry)
|
|
67
68
|
.map((str) => parseTestDevice(str));
|
|
68
69
|
}
|
|
69
|
-
exports.parseTestDevices = parseTestDevices;
|
|
70
70
|
function parseTestDevice(testDeviceString) {
|
|
71
71
|
const entries = testDeviceString.split(",");
|
|
72
72
|
const allowedKeys = new Set(["model", "version", "orientation", "locale"]);
|
|
@@ -127,7 +127,6 @@ function getLoginCredential(args) {
|
|
|
127
127
|
}
|
|
128
128
|
return loginCredential;
|
|
129
129
|
}
|
|
130
|
-
exports.getLoginCredential = getLoginCredential;
|
|
131
130
|
function isPresenceMismatched(value1, value2) {
|
|
132
131
|
return (value1 && !value2) || (!value1 && value2);
|
|
133
132
|
}
|
|
@@ -10,11 +10,11 @@ var IntegrationState;
|
|
|
10
10
|
IntegrationState["APP_NOT_PUBLISHED"] = "APP_NOT_PUBLISHED";
|
|
11
11
|
IntegrationState["AAB_STATE_UNAVAILABLE"] = "AAB_STATE_UNAVAILABLE";
|
|
12
12
|
IntegrationState["PLAY_IAS_TERMS_NOT_ACCEPTED"] = "PLAY_IAS_TERMS_NOT_ACCEPTED";
|
|
13
|
-
})(IntegrationState
|
|
13
|
+
})(IntegrationState || (exports.IntegrationState = IntegrationState = {}));
|
|
14
14
|
var UploadReleaseResult;
|
|
15
15
|
(function (UploadReleaseResult) {
|
|
16
16
|
UploadReleaseResult["UPLOAD_RELEASE_RESULT_UNSPECIFIED"] = "UPLOAD_RELEASE_RESULT_UNSPECIFIED";
|
|
17
17
|
UploadReleaseResult["RELEASE_CREATED"] = "RELEASE_CREATED";
|
|
18
18
|
UploadReleaseResult["RELEASE_UPDATED"] = "RELEASE_UPDATED";
|
|
19
19
|
UploadReleaseResult["RELEASE_UNMODIFIED"] = "RELEASE_UNMODIFIED";
|
|
20
|
-
})(UploadReleaseResult
|
|
20
|
+
})(UploadReleaseResult || (exports.UploadReleaseResult = UploadReleaseResult = {}));
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.toYaml = toYaml;
|
|
4
|
+
exports.fromYaml = fromYaml;
|
|
4
5
|
const jsYaml = require("js-yaml");
|
|
5
6
|
const error_1 = require("../error");
|
|
6
7
|
const ALLOWED_YAML_STEP_KEYS = new Set(["goal", "hint", "successCriteria"]);
|
|
@@ -11,18 +12,25 @@ const ALLOWED_YAML_TEST_CASE_KEYS = new Set([
|
|
|
11
12
|
"steps",
|
|
12
13
|
]);
|
|
13
14
|
function extractIdFromResourceName(name) {
|
|
14
|
-
|
|
15
|
-
return (_a = name.split("/").pop()) !== null && _a !== void 0 ? _a : "";
|
|
15
|
+
return name.split("/").pop() ?? "";
|
|
16
16
|
}
|
|
17
17
|
function toYamlTestCases(testCases) {
|
|
18
|
-
return testCases.map((testCase) => (
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
return testCases.map((testCase) => ({
|
|
19
|
+
displayName: testCase.displayName,
|
|
20
|
+
id: extractIdFromResourceName(testCase.name),
|
|
21
|
+
...(testCase.prerequisiteTestCase && {
|
|
22
|
+
prerequisiteTestCaseId: extractIdFromResourceName(testCase.prerequisiteTestCase),
|
|
23
|
+
}),
|
|
24
|
+
steps: testCase.aiInstructions.steps.map((step) => ({
|
|
25
|
+
goal: step.goal,
|
|
26
|
+
...(step.hint && { hint: step.hint }),
|
|
27
|
+
...(step.successCriteria && { successCriteria: step.successCriteria }),
|
|
28
|
+
})),
|
|
29
|
+
}));
|
|
21
30
|
}
|
|
22
31
|
function toYaml(testCases) {
|
|
23
32
|
return jsYaml.safeDump(toYamlTestCases(testCases));
|
|
24
33
|
}
|
|
25
|
-
exports.toYaml = toYaml;
|
|
26
34
|
function castExists(it, thing) {
|
|
27
35
|
if (it == null) {
|
|
28
36
|
throw new error_1.FirebaseError(`"${thing}" is required`);
|
|
@@ -39,18 +47,27 @@ function checkAllowedKeys(allowedKeys, o) {
|
|
|
39
47
|
function fromYamlTestCases(appName, yamlTestCases) {
|
|
40
48
|
return yamlTestCases.map((yamlTestCase) => {
|
|
41
49
|
checkAllowedKeys(ALLOWED_YAML_TEST_CASE_KEYS, yamlTestCase);
|
|
42
|
-
return
|
|
50
|
+
return {
|
|
51
|
+
displayName: castExists(yamlTestCase.displayName, "displayName"),
|
|
52
|
+
aiInstructions: {
|
|
43
53
|
steps: castExists(yamlTestCase.steps, "steps").map((yamlStep) => {
|
|
44
54
|
checkAllowedKeys(ALLOWED_YAML_STEP_KEYS, yamlStep);
|
|
45
|
-
return
|
|
46
|
-
|
|
47
|
-
|
|
55
|
+
return {
|
|
56
|
+
goal: castExists(yamlStep.goal, "goal"),
|
|
57
|
+
...(yamlStep.hint && { hint: yamlStep.hint }),
|
|
58
|
+
...(yamlStep.successCriteria && {
|
|
59
|
+
successCriteria: yamlStep.successCriteria,
|
|
60
|
+
}),
|
|
61
|
+
};
|
|
48
62
|
}),
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
63
|
+
},
|
|
64
|
+
...(yamlTestCase.id && {
|
|
65
|
+
name: `${appName}/testCases/${yamlTestCase.id}`,
|
|
66
|
+
}),
|
|
67
|
+
...(yamlTestCase.prerequisiteTestCaseId && {
|
|
68
|
+
prerequisiteTestCase: `${appName}/testCases/${yamlTestCase.prerequisiteTestCaseId}`,
|
|
69
|
+
}),
|
|
70
|
+
};
|
|
54
71
|
});
|
|
55
72
|
}
|
|
56
73
|
function fromYaml(appName, yaml) {
|
|
@@ -66,4 +83,3 @@ function fromYaml(appName, yaml) {
|
|
|
66
83
|
}
|
|
67
84
|
return fromYamlTestCases(appName, parsedYaml);
|
|
68
85
|
}
|
|
69
|
-
exports.fromYaml = fromYaml;
|
package/lib/apphosting/app.js
CHANGED
|
@@ -13,7 +13,6 @@ exports.webApps = {
|
|
|
13
13
|
generateWebAppName,
|
|
14
14
|
};
|
|
15
15
|
async function getOrCreateWebApp(projectId, firebaseWebAppId, backendId) {
|
|
16
|
-
var _a;
|
|
17
16
|
const webAppsInProject = await (0, apps_1.listFirebaseApps)(projectId, apps_1.AppPlatform.WEB);
|
|
18
17
|
if (firebaseWebAppId) {
|
|
19
18
|
const webApp = webAppsInProject.find((app) => app.appId === firebaseWebAppId);
|
|
@@ -21,7 +20,7 @@ async function getOrCreateWebApp(projectId, firebaseWebAppId, backendId) {
|
|
|
21
20
|
throw new error_1.FirebaseError(`The web app '${firebaseWebAppId}' does not exist in project ${projectId}`);
|
|
22
21
|
}
|
|
23
22
|
return {
|
|
24
|
-
name:
|
|
23
|
+
name: webApp.displayName ?? webApp.appId,
|
|
25
24
|
id: webApp.appId,
|
|
26
25
|
};
|
|
27
26
|
}
|
|
@@ -56,19 +55,15 @@ async function generateWebAppName(projectId, backendId) {
|
|
|
56
55
|
return webAppName;
|
|
57
56
|
}
|
|
58
57
|
function firebaseAppsToMap(apps) {
|
|
59
|
-
return new Map(apps.map((obj) =>
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
obj.appId,
|
|
64
|
-
];
|
|
65
|
-
}));
|
|
58
|
+
return new Map(apps.map((obj) => [
|
|
59
|
+
obj.displayName ?? obj.appId,
|
|
60
|
+
obj.appId,
|
|
61
|
+
]));
|
|
66
62
|
}
|
|
67
63
|
function isQuotaError(error) {
|
|
68
|
-
var _a, _b, _c, _d, _e;
|
|
69
64
|
const original = error.original;
|
|
70
|
-
const code =
|
|
71
|
-
|
|
72
|
-
|
|
65
|
+
const code = original?.status ||
|
|
66
|
+
original?.context?.response?.statusCode ||
|
|
67
|
+
original?.context?.body?.error?.code;
|
|
73
68
|
return code === 429;
|
|
74
69
|
}
|