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
|
@@ -15,7 +15,7 @@ var RuntimeWorkerState;
|
|
|
15
15
|
RuntimeWorkerState["BUSY"] = "BUSY";
|
|
16
16
|
RuntimeWorkerState["FINISHING"] = "FINISHING";
|
|
17
17
|
RuntimeWorkerState["FINISHED"] = "FINISHED";
|
|
18
|
-
})(RuntimeWorkerState
|
|
18
|
+
})(RuntimeWorkerState || (exports.RuntimeWorkerState = RuntimeWorkerState = {}));
|
|
19
19
|
const FREE_WORKER_KEY = "~free~";
|
|
20
20
|
class RuntimeWorker {
|
|
21
21
|
constructor(triggerId, runtime, extensionLogInfo, timeoutSeconds) {
|
|
@@ -105,7 +105,12 @@ class RuntimeWorker {
|
|
|
105
105
|
}
|
|
106
106
|
};
|
|
107
107
|
return new Promise((resolve) => {
|
|
108
|
-
const reqOpts =
|
|
108
|
+
const reqOpts = {
|
|
109
|
+
...this.runtime.conn.httpReqOpts(),
|
|
110
|
+
method: req.method,
|
|
111
|
+
path: req.path,
|
|
112
|
+
headers: req.headers,
|
|
113
|
+
};
|
|
109
114
|
if (this.timeoutSeconds) {
|
|
110
115
|
reqOpts.timeout = this.timeoutSeconds * 1000;
|
|
111
116
|
}
|
|
@@ -173,7 +178,11 @@ class RuntimeWorker {
|
|
|
173
178
|
}
|
|
174
179
|
isSocketReady() {
|
|
175
180
|
return new Promise((resolve, reject) => {
|
|
176
|
-
const req = http.request(
|
|
181
|
+
const req = http.request({
|
|
182
|
+
...this.runtime.conn.httpReqOpts(),
|
|
183
|
+
method: "GET",
|
|
184
|
+
path: "/__/health",
|
|
185
|
+
}, () => {
|
|
177
186
|
this.readyForWork();
|
|
178
187
|
resolve();
|
|
179
188
|
});
|
|
@@ -196,7 +205,7 @@ class RuntimeWorker {
|
|
|
196
205
|
break;
|
|
197
206
|
}
|
|
198
207
|
catch (err) {
|
|
199
|
-
if (["ECONNREFUSED", "ENOENT"].includes(err
|
|
208
|
+
if (["ECONNREFUSED", "ENOENT"].includes(err?.code)) {
|
|
200
209
|
await sleep(100);
|
|
201
210
|
continue;
|
|
202
211
|
}
|
|
@@ -282,12 +291,12 @@ class RuntimeWorkerPool {
|
|
|
282
291
|
return;
|
|
283
292
|
}
|
|
284
293
|
addWorker(trigger, runtime, extensionLogInfo) {
|
|
285
|
-
this.log(`addWorker(${this.getKey(trigger
|
|
286
|
-
const disableTimeout = !
|
|
287
|
-
const worker = new RuntimeWorker(trigger
|
|
288
|
-
const keyWorkers = this.getTriggerWorkers(trigger
|
|
294
|
+
this.log(`addWorker(${this.getKey(trigger?.id)})`);
|
|
295
|
+
const disableTimeout = !trigger?.id || this.mode === types_1.FunctionsExecutionMode.SEQUENTIAL;
|
|
296
|
+
const worker = new RuntimeWorker(trigger?.id, runtime, extensionLogInfo, disableTimeout ? undefined : trigger?.timeoutSeconds);
|
|
297
|
+
const keyWorkers = this.getTriggerWorkers(trigger?.id);
|
|
289
298
|
keyWorkers.push(worker);
|
|
290
|
-
this.setTriggerWorkers(trigger
|
|
299
|
+
this.setTriggerWorkers(trigger?.id, keyWorkers);
|
|
291
300
|
this.log(`Adding worker with key ${worker.triggerKey}, total=${keyWorkers.length}`);
|
|
292
301
|
return worker;
|
|
293
302
|
}
|
package/lib/emulator/hub.js
CHANGED
|
@@ -19,9 +19,7 @@ class EmulatorHub extends ExpressBasedEmulator_1.ExpressBasedEmulator {
|
|
|
19
19
|
}
|
|
20
20
|
const data = fs.readFileSync(locatorPath, "utf8").toString();
|
|
21
21
|
const locator = JSON.parse(data);
|
|
22
|
-
|
|
23
|
-
logger_1.logger.debug(`Found emulator locator with different version: ${JSON.stringify(locator)}, CLI_VERSION: ${this.CLI_VERSION}`);
|
|
24
|
-
}
|
|
22
|
+
logger_1.logger.debug(`Found emulator hub locator: ${JSON.stringify(locator)}`);
|
|
25
23
|
return locator;
|
|
26
24
|
}
|
|
27
25
|
static getLocatorFilePath(projectId) {
|
|
@@ -31,7 +29,6 @@ class EmulatorHub extends ExpressBasedEmulator_1.ExpressBasedEmulator {
|
|
|
31
29
|
}
|
|
32
30
|
const filename = `hub-${projectId}.json`;
|
|
33
31
|
const locatorPath = path.join(dir, filename);
|
|
34
|
-
logger_1.logger.debug(`Emulator locator file path: ${locatorPath}`);
|
|
35
32
|
return locatorPath;
|
|
36
33
|
}
|
|
37
34
|
constructor(args) {
|
|
@@ -47,14 +44,21 @@ class EmulatorHub extends ExpressBasedEmulator_1.ExpressBasedEmulator {
|
|
|
47
44
|
getRunningEmulatorsMapping() {
|
|
48
45
|
const emulators = {};
|
|
49
46
|
for (const info of registry_1.EmulatorRegistry.listRunningWithInfo()) {
|
|
50
|
-
emulators[info.name] =
|
|
47
|
+
emulators[info.name] = {
|
|
48
|
+
listen: this.args.listenForEmulator[info.name],
|
|
49
|
+
...info,
|
|
50
|
+
};
|
|
51
51
|
}
|
|
52
52
|
return emulators;
|
|
53
53
|
}
|
|
54
54
|
async createExpressApp() {
|
|
55
55
|
const app = await super.createExpressApp();
|
|
56
56
|
app.get("/", (req, res) => {
|
|
57
|
-
res.json(
|
|
57
|
+
res.json({
|
|
58
|
+
...this.buildLocator(),
|
|
59
|
+
host: utils.connectableHostname(this.args.listen[0].address),
|
|
60
|
+
port: this.args.listen[0].port,
|
|
61
|
+
});
|
|
58
62
|
});
|
|
59
63
|
app.get(EmulatorHub.PATH_EMULATORS, (req, res) => {
|
|
60
64
|
res.json(this.getRunningEmulatorsMapping());
|
|
@@ -127,12 +131,11 @@ class EmulatorHub extends ExpressBasedEmulator_1.ExpressBasedEmulator {
|
|
|
127
131
|
}
|
|
128
132
|
async stop() {
|
|
129
133
|
await super.stop();
|
|
130
|
-
await this.deleteLocatorFile();
|
|
131
134
|
}
|
|
132
135
|
getName() {
|
|
133
136
|
return types_1.Emulators.HUB;
|
|
134
137
|
}
|
|
135
|
-
|
|
138
|
+
buildLocator() {
|
|
136
139
|
const version = pkg.version;
|
|
137
140
|
const origins = [];
|
|
138
141
|
for (const spec of this.args.listen) {
|
|
@@ -146,39 +149,34 @@ class EmulatorHub extends ExpressBasedEmulator_1.ExpressBasedEmulator {
|
|
|
146
149
|
return {
|
|
147
150
|
version,
|
|
148
151
|
origins,
|
|
152
|
+
pid: process.pid,
|
|
149
153
|
};
|
|
150
154
|
}
|
|
151
155
|
async writeLocatorFile() {
|
|
152
156
|
const projectId = this.args.projectId;
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
if (fs.existsSync(locatorPath)) {
|
|
157
|
+
const prevLocator = EmulatorHub.readLocatorFile(projectId);
|
|
158
|
+
if (prevLocator && prevLocator.pid && isProcessLive(prevLocator.pid)) {
|
|
156
159
|
utils.logLabeledWarning("emulators", `It seems that you are running multiple instances of the emulator suite for project ${projectId}. This may result in unexpected behavior.`);
|
|
160
|
+
return;
|
|
157
161
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
async deleteLocatorFile() {
|
|
171
|
-
const locatorPath = EmulatorHub.getLocatorFilePath(this.args.projectId);
|
|
172
|
-
return new Promise((resolve, reject) => {
|
|
173
|
-
fs.unlink(locatorPath, (e) => {
|
|
174
|
-
if (e && e.code !== "ENOENT") {
|
|
175
|
-
reject(e);
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
resolve();
|
|
162
|
+
const locatorPath = EmulatorHub.getLocatorFilePath(projectId);
|
|
163
|
+
logger_1.logger.debug(`Write emulator hub locator at ${locatorPath}`);
|
|
164
|
+
fs.writeFileSync(locatorPath, JSON.stringify(this.buildLocator()));
|
|
165
|
+
const cleanup = () => {
|
|
166
|
+
try {
|
|
167
|
+
const curLocator = EmulatorHub.readLocatorFile(projectId);
|
|
168
|
+
if (curLocator && curLocator.pid === process.pid) {
|
|
169
|
+
fs.unlinkSync(locatorPath);
|
|
170
|
+
logger_1.logger.debug(`Delete emulator hub locator file: ${locatorPath}`);
|
|
179
171
|
}
|
|
180
|
-
}
|
|
181
|
-
|
|
172
|
+
}
|
|
173
|
+
catch (e) {
|
|
174
|
+
logger_1.logger.debug(`Cannot delete emulator hub locator file`, e);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
process.on("SIGINT", cleanup);
|
|
178
|
+
process.on("SIGTERM", cleanup);
|
|
179
|
+
process.on("exit", cleanup);
|
|
182
180
|
}
|
|
183
181
|
}
|
|
184
182
|
exports.EmulatorHub = EmulatorHub;
|
|
@@ -189,3 +187,12 @@ EmulatorHub.PATH_DISABLE_FUNCTIONS = "/functions/disableBackgroundTriggers";
|
|
|
189
187
|
EmulatorHub.PATH_ENABLE_FUNCTIONS = "/functions/enableBackgroundTriggers";
|
|
190
188
|
EmulatorHub.PATH_EMULATORS = "/emulators";
|
|
191
189
|
EmulatorHub.PATH_CLEAR_DATA_CONNECT = "/dataconnect/clearData";
|
|
190
|
+
function isProcessLive(pid) {
|
|
191
|
+
try {
|
|
192
|
+
process.kill(pid, 0);
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
return error.code === "EPERM";
|
|
197
|
+
}
|
|
198
|
+
}
|
|
@@ -32,7 +32,7 @@ class EmulatorHubClient {
|
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
-
throw err
|
|
35
|
+
throw err ?? new Error("Cannot find working hub origin. Tried:" + origins.join(" "));
|
|
36
36
|
}
|
|
37
37
|
async getEmulators() {
|
|
38
38
|
const res = await this.tryOrigins((client) => client.get(hub_1.EmulatorHub.PATH_EMULATORS));
|
|
@@ -12,7 +12,6 @@ const projectUtils_1 = require("../projectUtils");
|
|
|
12
12
|
const secrets_1 = require("../apphosting/secrets");
|
|
13
13
|
exports.AdditionalInitFns = {
|
|
14
14
|
[types_1.Emulators.APPHOSTING]: async (config) => {
|
|
15
|
-
var _a;
|
|
16
15
|
const cwd = process.cwd();
|
|
17
16
|
const additionalConfigs = new Map();
|
|
18
17
|
const logger = emulatorLogger_1.EmulatorLogger.forEmulator(types_1.Emulators.APPHOSTING);
|
|
@@ -38,8 +37,8 @@ exports.AdditionalInitFns = {
|
|
|
38
37
|
catch (e) {
|
|
39
38
|
logger.log("WARN", "failed to export app hosting configs");
|
|
40
39
|
}
|
|
41
|
-
const secretIds =
|
|
42
|
-
if (secretIds
|
|
40
|
+
const secretIds = env?.filter((e) => "secret" in e)?.map((e) => e.secret);
|
|
41
|
+
if (secretIds?.length) {
|
|
43
42
|
if (!projectId) {
|
|
44
43
|
logger.log("WARN", "Cannot grant developers access to secrets for local development without knowing what project the secret is in. " +
|
|
45
44
|
`Run ${clc.bold(`firebase apphosting:secrets:grantaccess ${secretIds.join(",")} --project [project] --emails [email list]`)}`);
|
|
@@ -84,7 +84,7 @@ class WebSocketTransport extends TransportStream {
|
|
|
84
84
|
.map((value) => {
|
|
85
85
|
if (typeof value === "string") {
|
|
86
86
|
try {
|
|
87
|
-
bundle.data =
|
|
87
|
+
bundle.data = { ...bundle.data, ...JSON.parse(value) };
|
|
88
88
|
return null;
|
|
89
89
|
}
|
|
90
90
|
catch (err) {
|
|
@@ -92,7 +92,7 @@ class WebSocketTransport extends TransportStream {
|
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
else {
|
|
95
|
-
bundle.data =
|
|
95
|
+
bundle.data = { ...bundle.data, ...value };
|
|
96
96
|
}
|
|
97
97
|
})
|
|
98
98
|
.filter((v) => v);
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.checkListenable = checkListenable;
|
|
4
|
+
exports.waitForPortUsed = waitForPortUsed;
|
|
5
|
+
exports.resolveHostAndAssignPorts = resolveHostAndAssignPorts;
|
|
6
|
+
exports.listenSpecsToString = listenSpecsToString;
|
|
4
7
|
const clc = require("colorette");
|
|
5
8
|
const tcpport = require("tcp-port-used");
|
|
6
9
|
const node_net_1 = require("node:net");
|
|
@@ -130,7 +133,6 @@ async function checkListenable(arg1, port) {
|
|
|
130
133
|
dummyServer.listen({ host: addr.address, port: addr.port, ipv6Only: addr.family === "IPv6" });
|
|
131
134
|
});
|
|
132
135
|
}
|
|
133
|
-
exports.checkListenable = checkListenable;
|
|
134
136
|
async function waitForPortUsed(port, host, timeout = 60000) {
|
|
135
137
|
const interval = 200;
|
|
136
138
|
try {
|
|
@@ -140,7 +142,6 @@ async function waitForPortUsed(port, host, timeout = 60000) {
|
|
|
140
142
|
throw new error_1.FirebaseError(`TIMEOUT: Port ${port} on ${host} was not active within ${timeout}ms`);
|
|
141
143
|
}
|
|
142
144
|
}
|
|
143
|
-
exports.waitForPortUsed = waitForPortUsed;
|
|
144
145
|
const EMULATOR_CAN_LISTEN_ON_PRIMARY_ONLY = {
|
|
145
146
|
database: true,
|
|
146
147
|
firestore: true,
|
|
@@ -273,7 +274,6 @@ async function resolveHostAndAssignPorts(listenConfig) {
|
|
|
273
274
|
await Promise.all(tasks);
|
|
274
275
|
return result;
|
|
275
276
|
}
|
|
276
|
-
exports.resolveHostAndAssignPorts = resolveHostAndAssignPorts;
|
|
277
277
|
function portDescription(name) {
|
|
278
278
|
return name === "firestore.websocket"
|
|
279
279
|
? `websocket server for ${types_1.Emulators.FIRESTORE}`
|
|
@@ -338,4 +338,3 @@ function listenSpecsToString(specs) {
|
|
|
338
338
|
})
|
|
339
339
|
.join(",");
|
|
340
340
|
}
|
|
341
|
-
exports.listenSpecsToString = listenSpecsToString;
|
package/lib/emulator/registry.js
CHANGED
|
@@ -80,12 +80,14 @@ class EmulatorRegistry {
|
|
|
80
80
|
return this.INSTANCES.get(emulator);
|
|
81
81
|
}
|
|
82
82
|
static getInfo(emulator) {
|
|
83
|
-
|
|
84
|
-
const info = (_a = EmulatorRegistry.get(emulator)) === null || _a === void 0 ? void 0 : _a.getInfo();
|
|
83
|
+
const info = EmulatorRegistry.get(emulator)?.getInfo();
|
|
85
84
|
if (!info) {
|
|
86
85
|
return undefined;
|
|
87
86
|
}
|
|
88
|
-
return
|
|
87
|
+
return {
|
|
88
|
+
...info,
|
|
89
|
+
host: (0, utils_1.connectableHostname)(info.host),
|
|
90
|
+
};
|
|
89
91
|
}
|
|
90
92
|
static getDetails(emulator) {
|
|
91
93
|
return (0, downloadableEmulators_1.get)(emulator);
|
|
@@ -116,7 +118,11 @@ class EmulatorRegistry {
|
|
|
116
118
|
return url;
|
|
117
119
|
}
|
|
118
120
|
static client(emulator, options = {}) {
|
|
119
|
-
return new apiv2_1.Client(
|
|
121
|
+
return new apiv2_1.Client({
|
|
122
|
+
urlPrefix: EmulatorRegistry.url(emulator).toString(),
|
|
123
|
+
auth: false,
|
|
124
|
+
...options,
|
|
125
|
+
});
|
|
120
126
|
}
|
|
121
127
|
static set(emulator, instance) {
|
|
122
128
|
this.INSTANCES.set(emulator, instance);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.reqBodyToBuffer =
|
|
3
|
+
exports.reqBodyToBuffer = reqBodyToBuffer;
|
|
4
4
|
async function reqBodyToBuffer(req) {
|
|
5
5
|
if (req.body instanceof Buffer) {
|
|
6
6
|
return Buffer.from(req.body);
|
|
@@ -16,4 +16,3 @@ async function reqBodyToBuffer(req) {
|
|
|
16
16
|
});
|
|
17
17
|
return Buffer.concat(bufs);
|
|
18
18
|
}
|
|
19
|
-
exports.reqBodyToBuffer = reqBodyToBuffer;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createFirebaseEndpoints =
|
|
3
|
+
exports.createFirebaseEndpoints = createFirebaseEndpoints;
|
|
4
4
|
const emulatorLogger_1 = require("../../emulatorLogger");
|
|
5
5
|
const types_1 = require("../../types");
|
|
6
6
|
const uuid = require("uuid");
|
|
@@ -69,7 +69,6 @@ function createFirebaseEndpoints(emulator) {
|
|
|
69
69
|
next();
|
|
70
70
|
});
|
|
71
71
|
firebaseStorageAPI.get("/b/:bucketId/o/:objectId", async (req, res) => {
|
|
72
|
-
var _a;
|
|
73
72
|
let metadata;
|
|
74
73
|
let data;
|
|
75
74
|
try {
|
|
@@ -77,7 +76,7 @@ function createFirebaseEndpoints(emulator) {
|
|
|
77
76
|
bucketId: req.params.bucketId,
|
|
78
77
|
decodedObjectId: decodeURIComponent(req.params.objectId),
|
|
79
78
|
authorization: req.header("authorization"),
|
|
80
|
-
downloadToken:
|
|
79
|
+
downloadToken: req.query.token?.toString(),
|
|
81
80
|
}));
|
|
82
81
|
}
|
|
83
82
|
catch (err) {
|
|
@@ -103,8 +102,7 @@ function createFirebaseEndpoints(emulator) {
|
|
|
103
102
|
return res.json(new metadata_1.OutgoingFirebaseMetadata(metadata));
|
|
104
103
|
});
|
|
105
104
|
firebaseStorageAPI.get("/b/:bucketId/o", async (req, res) => {
|
|
106
|
-
|
|
107
|
-
const maxResults = (_a = req.query.maxResults) === null || _a === void 0 ? void 0 : _a.toString();
|
|
105
|
+
const maxResults = req.query.maxResults?.toString();
|
|
108
106
|
let listResponse;
|
|
109
107
|
let prefix = "";
|
|
110
108
|
if (req.query.prefix) {
|
|
@@ -123,7 +121,7 @@ function createFirebaseEndpoints(emulator) {
|
|
|
123
121
|
bucketId: req.params.bucketId,
|
|
124
122
|
prefix: prefix,
|
|
125
123
|
delimiter: req.query.delimiter ? req.query.delimiter.toString() : "",
|
|
126
|
-
pageToken:
|
|
124
|
+
pageToken: req.query.pageToken?.toString(),
|
|
127
125
|
maxResults: maxResults ? +maxResults : undefined,
|
|
128
126
|
authorization: req.header("authorization"),
|
|
129
127
|
});
|
|
@@ -141,8 +139,8 @@ function createFirebaseEndpoints(emulator) {
|
|
|
141
139
|
}
|
|
142
140
|
return res.status(200).json({
|
|
143
141
|
nextPageToken: listResponse.nextPageToken,
|
|
144
|
-
prefixes: (
|
|
145
|
-
items: (
|
|
142
|
+
prefixes: (listResponse.prefixes ?? []).filter(isValidPrefix),
|
|
143
|
+
items: (listResponse.items ?? [])
|
|
146
144
|
.filter((item) => isValidNonEncodedPathString(item.name))
|
|
147
145
|
.map((item) => {
|
|
148
146
|
return { name: item.name, bucket: item.bucket };
|
|
@@ -150,17 +148,18 @@ function createFirebaseEndpoints(emulator) {
|
|
|
150
148
|
});
|
|
151
149
|
});
|
|
152
150
|
const handleUpload = async (req, res) => {
|
|
153
|
-
var _a, _b;
|
|
154
151
|
const bucketId = req.params.bucketId;
|
|
155
152
|
const objectId = req.params.objectId
|
|
156
153
|
? decodeURIComponent(req.params.objectId)
|
|
157
|
-
:
|
|
158
|
-
const uploadType =
|
|
154
|
+
: req.query.name?.toString() || null;
|
|
155
|
+
const uploadType = req.header("x-goog-upload-protocol")?.toString();
|
|
159
156
|
async function finalizeOneShotUpload(upload) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
157
|
+
if (!upload.metadata?.metadata?.firebaseStorageDownloadTokens) {
|
|
158
|
+
const customMetadata = {
|
|
159
|
+
...(upload.metadata?.metadata || {}),
|
|
160
|
+
firebaseStorageDownloadTokens: uuid.v4(),
|
|
161
|
+
};
|
|
162
|
+
upload.metadata = { ...(upload.metadata || {}), metadata: customMetadata };
|
|
164
163
|
}
|
|
165
164
|
let metadata;
|
|
166
165
|
try {
|
|
@@ -329,7 +328,6 @@ function createFirebaseEndpoints(emulator) {
|
|
|
329
328
|
return await finalizeOneShotUpload(upload);
|
|
330
329
|
};
|
|
331
330
|
const handleTokenRequest = (req, res) => {
|
|
332
|
-
var _a, _b;
|
|
333
331
|
if (!req.query.create_token && !req.query.delete_token) {
|
|
334
332
|
return res.sendStatus(400);
|
|
335
333
|
}
|
|
@@ -368,7 +366,7 @@ function createFirebaseEndpoints(emulator) {
|
|
|
368
366
|
metadata = storageLayer.deleteDownloadToken({
|
|
369
367
|
bucketId,
|
|
370
368
|
decodedObjectId,
|
|
371
|
-
token:
|
|
369
|
+
token: req.query["delete_token"]?.toString() ?? "",
|
|
372
370
|
authorization,
|
|
373
371
|
});
|
|
374
372
|
}
|
|
@@ -425,8 +423,7 @@ function createFirebaseEndpoints(emulator) {
|
|
|
425
423
|
};
|
|
426
424
|
firebaseStorageAPI.patch("/b/:bucketId/o/:objectId", handleMetadataUpdate);
|
|
427
425
|
firebaseStorageAPI.put("/b/:bucketId/o/:objectId?", async (req, res) => {
|
|
428
|
-
|
|
429
|
-
switch ((_a = req.header("x-http-method-override")) === null || _a === void 0 ? void 0 : _a.toLowerCase()) {
|
|
426
|
+
switch (req.header("x-http-method-override")?.toLowerCase()) {
|
|
430
427
|
case "patch":
|
|
431
428
|
return handleMetadataUpdate(req, res);
|
|
432
429
|
default:
|
|
@@ -463,7 +460,6 @@ function createFirebaseEndpoints(emulator) {
|
|
|
463
460
|
});
|
|
464
461
|
return firebaseStorageAPI;
|
|
465
462
|
}
|
|
466
|
-
exports.createFirebaseEndpoints = createFirebaseEndpoints;
|
|
467
463
|
function setObjectHeaders(res, metadata) {
|
|
468
464
|
if (metadata.contentDisposition) {
|
|
469
465
|
res.setHeader("Content-Disposition", metadata.contentDisposition);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createCloudEndpoints =
|
|
3
|
+
exports.createCloudEndpoints = createCloudEndpoints;
|
|
4
4
|
const express_1 = require("express");
|
|
5
5
|
const types_1 = require("../../types");
|
|
6
6
|
const metadata_1 = require("../metadata");
|
|
@@ -110,7 +110,6 @@ function createCloudEndpoints(emulator) {
|
|
|
110
110
|
return res.json(new metadata_1.CloudStorageObjectMetadata(updatedMetadata));
|
|
111
111
|
});
|
|
112
112
|
gcloudStorageAPI.get(["/b/:bucketId/o", "/storage/v1/b/:bucketId/o"], async (req, res) => {
|
|
113
|
-
var _a;
|
|
114
113
|
let listResponse;
|
|
115
114
|
try {
|
|
116
115
|
listResponse = await adminStorageLayer.listObjects({
|
|
@@ -132,7 +131,7 @@ function createCloudEndpoints(emulator) {
|
|
|
132
131
|
kind: "storage#objects",
|
|
133
132
|
nextPageToken: listResponse.nextPageToken,
|
|
134
133
|
prefixes: listResponse.prefixes,
|
|
135
|
-
items:
|
|
134
|
+
items: listResponse.items?.map((item) => new metadata_1.CloudStorageObjectMetadata(item)),
|
|
136
135
|
});
|
|
137
136
|
});
|
|
138
137
|
gcloudStorageAPI.delete(["/b/:bucketId/o/:objectId", "/storage/v1/b/:bucketId/o/:objectId"], async (req, res) => {
|
|
@@ -231,7 +230,7 @@ function createCloudEndpoints(emulator) {
|
|
|
231
230
|
const upload = uploadService.startResumableUpload({
|
|
232
231
|
bucketId: req.params.bucketId,
|
|
233
232
|
objectId: name,
|
|
234
|
-
metadata:
|
|
233
|
+
metadata: { contentType, ...req.body },
|
|
235
234
|
authorization: req.header("authorization"),
|
|
236
235
|
});
|
|
237
236
|
const uploadUrl = registry_1.EmulatorRegistry.url(types_1.Emulators.STORAGE, req);
|
|
@@ -284,7 +283,7 @@ function createCloudEndpoints(emulator) {
|
|
|
284
283
|
const upload = uploadService.multipartUpload({
|
|
285
284
|
bucketId: req.params.bucketId,
|
|
286
285
|
objectId: name,
|
|
287
|
-
metadata:
|
|
286
|
+
metadata: { contentType, ...JSON.parse(metadataRaw) },
|
|
288
287
|
dataRaw: dataRaw,
|
|
289
288
|
authorization: req.header("authorization"),
|
|
290
289
|
});
|
|
@@ -375,7 +374,6 @@ function createCloudEndpoints(emulator) {
|
|
|
375
374
|
});
|
|
376
375
|
return gcloudStorageAPI;
|
|
377
376
|
}
|
|
378
|
-
exports.createCloudEndpoints = createCloudEndpoints;
|
|
379
377
|
function sendObjectNotFound(req, res) {
|
|
380
378
|
res.status(404);
|
|
381
379
|
const message = `No such object: ${req.params.bucketId}/${req.params.objectId}`;
|
|
@@ -399,7 +397,6 @@ function sendObjectNotFound(req, res) {
|
|
|
399
397
|
}
|
|
400
398
|
}
|
|
401
399
|
function getIncomingFileNameFromRequest(query, metadata) {
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
return (name === null || name === void 0 ? void 0 : name.startsWith("/")) ? name.slice(1) : name;
|
|
400
|
+
const name = query?.name?.toString() || metadata?.name;
|
|
401
|
+
return name?.startsWith("/") ? name.slice(1) : name;
|
|
405
402
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.sendFileBytes =
|
|
3
|
+
exports.sendFileBytes = sendFileBytes;
|
|
4
4
|
const zlib_1 = require("zlib");
|
|
5
5
|
const crc_1 = require("../crc");
|
|
6
6
|
const rfc_1 = require("../rfc");
|
|
@@ -42,4 +42,3 @@ function sendFileBytes(md, data, req, res) {
|
|
|
42
42
|
}
|
|
43
43
|
res.end(data);
|
|
44
44
|
}
|
|
45
|
-
exports.sendFileBytes = sendFileBytes;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.crc32c = crc32c;
|
|
4
|
+
exports.crc32cToString = crc32cToString;
|
|
4
5
|
function makeCRCTable(poly) {
|
|
5
6
|
let c;
|
|
6
7
|
const crcTable = [];
|
|
@@ -23,11 +24,9 @@ function crc32c(bytes) {
|
|
|
23
24
|
}
|
|
24
25
|
return (crc ^ -1) >>> 0;
|
|
25
26
|
}
|
|
26
|
-
exports.crc32c = crc32c;
|
|
27
27
|
function crc32cToString(crc32cValue) {
|
|
28
28
|
const value = typeof crc32cValue === "string" ? Number.parseInt(crc32cValue) : crc32cValue;
|
|
29
29
|
const buffer = Buffer.alloc(4);
|
|
30
30
|
buffer.writeUint32BE(value);
|
|
31
31
|
return buffer.toString("base64");
|
|
32
32
|
}
|
|
33
|
-
exports.crc32cToString = crc32cToString;
|