firebase-tools 15.0.0 → 15.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/accountExporter.js +3 -5
- package/lib/accountImporter.js +4 -5
- package/lib/api.js +3 -3
- package/lib/apiv2.js +9 -13
- package/lib/appUtils.js +33 -36
- package/lib/appdistribution/client.js +4 -8
- package/lib/appdistribution/distribution.js +4 -4
- package/lib/appdistribution/options-parser-util.js +8 -9
- package/lib/appdistribution/types.js +2 -2
- package/lib/appdistribution/yaml_helper.js +33 -17
- package/lib/apphosting/app.js +8 -13
- package/lib/apphosting/backend.js +34 -24
- package/lib/apphosting/config.js +14 -14
- package/lib/apphosting/githubConnections.js +38 -35
- package/lib/apphosting/localbuilds.js +4 -6
- package/lib/apphosting/repo.js +24 -20
- package/lib/apphosting/rollout.js +12 -5
- package/lib/apphosting/secrets/dialogs.js +9 -9
- package/lib/apphosting/secrets/index.js +9 -11
- package/lib/apphosting/utils.js +2 -3
- package/lib/apphosting/yaml.js +12 -11
- package/lib/apptesting/ensureProjectConfigured.js +1 -2
- package/lib/apptesting/invokeTests.js +2 -3
- package/lib/apptesting/parseTestFiles.js +5 -6
- package/lib/apptesting/types.js +2 -2
- package/lib/archiveDirectory.js +1 -2
- package/lib/auth.js +36 -40
- package/lib/bin/cli.js +2 -3
- package/lib/bin/mcp.js +47 -10
- package/lib/checkMinRequiredVersion.js +1 -2
- package/lib/checkValidTargetFilters.js +1 -2
- package/lib/command.js +6 -9
- package/lib/commands/appdistribution-testers-list.js +2 -3
- package/lib/commands/apphosting-backends-list.js +4 -6
- package/lib/commands/apphosting-builds-create.js +2 -3
- package/lib/commands/apphosting-builds-get.js +1 -2
- package/lib/commands/apphosting-rollouts-list.js +1 -2
- package/lib/commands/apps-init.js +1 -1
- package/lib/commands/{apptesting-execute.js → apptesting-wata.js} +3 -4
- package/lib/commands/crashlytics-symbols-upload.js +2 -2
- package/lib/commands/dataconnect-execute.js +4 -4
- package/lib/commands/dataconnect-sdk-generate.js +5 -6
- package/lib/commands/dataconnect-services-list.js +7 -8
- package/lib/commands/dataconnect-sql-diff.js +1 -2
- package/lib/commands/dataconnect-sql-migrate.js +4 -3
- package/lib/commands/dataconnect-sql-setup.js +2 -2
- package/lib/commands/dataconnect-sql-shell.js +5 -1
- package/lib/commands/emulators-start.js +1 -2
- package/lib/commands/ext-configure.js +6 -4
- package/lib/commands/ext-dev-list.js +2 -3
- package/lib/commands/ext-dev-upload.js +2 -2
- package/lib/commands/ext-export.js +1 -1
- package/lib/commands/ext-info.js +2 -3
- package/lib/commands/ext-install.js +5 -7
- package/lib/commands/firestore-backups-list.js +1 -2
- package/lib/commands/firestore-backups-schedules-list.js +1 -2
- package/lib/commands/firestore-indexes-list.js +1 -2
- package/lib/commands/firestore-utils.js +1 -2
- package/lib/commands/functions-artifacts-setpolicy.js +1 -2
- package/lib/commands/functions-config-export.js +2 -3
- package/lib/commands/hosting-channel-deploy.js +2 -2
- package/lib/commands/hosting-clone.js +2 -3
- package/lib/commands/hosting-sites-create.js +1 -1
- package/lib/commands/index.js +2 -3
- package/lib/commands/init.js +4 -5
- package/lib/commands/internaltesting-functions-discover.js +1 -1
- package/lib/commands/login.js +4 -5
- package/lib/commands/logout.js +3 -3
- package/lib/commands/projects-create.js +1 -1
- package/lib/commands/remoteconfig-experiments-list.js +2 -3
- package/lib/commands/remoteconfig-get.js +1 -1
- package/lib/commands/remoteconfig-rollback.js +1 -2
- package/lib/commands/remoteconfig-rollouts-list.js +2 -3
- package/lib/commands/remoteconfig-versions-list.js +3 -4
- package/lib/commands/use.js +3 -3
- package/lib/config.js +4 -5
- package/lib/crashlytics/buildToolsJarHelper.js +3 -5
- package/lib/crashlytics/events.js +4 -7
- package/lib/crashlytics/filters.js +10 -12
- package/lib/crashlytics/issues.js +2 -3
- package/lib/crashlytics/notes.js +3 -4
- package/lib/crashlytics/reports.js +21 -15
- package/lib/crashlytics/types.js +7 -7
- package/lib/crashlytics/utils.js +4 -4
- package/lib/database/api.js +2 -3
- package/lib/database/import.js +4 -4
- package/lib/database/metadata.js +5 -6
- package/lib/database/rulesConfig.js +2 -3
- package/lib/dataconnect/build.js +10 -13
- package/lib/dataconnect/checkIam.js +1 -2
- package/lib/dataconnect/client.js +15 -18
- package/lib/dataconnect/dataplaneClient.js +6 -6
- package/lib/dataconnect/ensureApis.js +2 -3
- package/lib/dataconnect/errors.js +8 -11
- package/lib/dataconnect/filters.js +2 -3
- package/lib/dataconnect/freeTrial.js +3 -4
- package/lib/dataconnect/graphqlError.js +5 -8
- package/lib/dataconnect/load.js +10 -11
- package/lib/dataconnect/names.js +14 -18
- package/lib/dataconnect/prompts.js +1 -2
- package/lib/dataconnect/provisionCloudSql.js +13 -17
- package/lib/dataconnect/schemaMigration.js +60 -27
- package/lib/dataconnect/types.js +10 -12
- package/lib/dataconnect/webhook.js +3 -3
- package/lib/defaultCredentials.js +3 -4
- package/lib/deploy/apphosting/deploy.js +2 -3
- package/lib/deploy/apphosting/prepare.js +3 -5
- package/lib/deploy/apphosting/release.js +1 -1
- package/lib/deploy/apphosting/util.js +1 -2
- package/lib/deploy/database/deploy.js +1 -2
- package/lib/deploy/database/prepare.js +1 -2
- package/lib/deploy/database/release.js +1 -2
- package/lib/deploy/dataconnect/context.js +15 -4
- package/lib/deploy/dataconnect/deploy.js +5 -6
- package/lib/deploy/dataconnect/prepare.js +7 -9
- package/lib/deploy/dataconnect/release.js +7 -10
- package/lib/deploy/extensions/deploy.js +7 -9
- package/lib/deploy/extensions/deploymentSummary.js +6 -7
- package/lib/deploy/extensions/planner.js +15 -18
- package/lib/deploy/extensions/prepare.js +9 -11
- package/lib/deploy/extensions/release.js +10 -12
- package/lib/deploy/extensions/secrets.js +8 -11
- package/lib/deploy/extensions/tasks.js +6 -8
- package/lib/deploy/extensions/v2FunctionHelper.js +2 -3
- package/lib/deploy/extensions/validate.js +1 -2
- package/lib/deploy/firestore/deploy.js +3 -5
- package/lib/deploy/firestore/prepare.js +2 -3
- package/lib/deploy/firestore/release.js +3 -4
- package/lib/deploy/functions/backend.js +52 -42
- package/lib/deploy/functions/build.js +41 -15
- package/lib/deploy/functions/cache/applyHash.js +3 -5
- package/lib/deploy/functions/cache/hash.js +4 -5
- package/lib/deploy/functions/cel.js +3 -3
- package/lib/deploy/functions/checkIam.js +8 -8
- package/lib/deploy/functions/containerCleaner.js +10 -6
- package/lib/deploy/functions/deploy.js +6 -8
- package/lib/deploy/functions/ensure.js +6 -9
- package/lib/deploy/functions/functionsDeployHelper.js +10 -11
- package/lib/deploy/functions/params.js +10 -10
- package/lib/deploy/functions/prepare.js +41 -36
- package/lib/deploy/functions/prepareFunctionsUpload.js +24 -10
- package/lib/deploy/functions/pricing.js +3 -3
- package/lib/deploy/functions/prompts.js +7 -10
- package/lib/deploy/functions/release/executor.js +5 -6
- package/lib/deploy/functions/release/fabricator.js +76 -29
- package/lib/deploy/functions/release/index.js +23 -14
- package/lib/deploy/functions/release/planner.js +15 -14
- package/lib/deploy/functions/release/reporter.js +20 -20
- package/lib/deploy/functions/release/sourceTokenScraper.js +4 -5
- package/lib/deploy/functions/remoteSource.js +3 -4
- package/lib/deploy/functions/runtimes/discovery/index.js +9 -12
- package/lib/deploy/functions/runtimes/discovery/parsing.js +2 -3
- package/lib/deploy/functions/runtimes/discovery/v1alpha1.js +29 -10
- package/lib/deploy/functions/runtimes/index.js +1 -2
- package/lib/deploy/functions/runtimes/node/index.js +18 -9
- package/lib/deploy/functions/runtimes/node/parseRuntimeAndValidateSDK.js +2 -2
- package/lib/deploy/functions/runtimes/node/validate.js +1 -2
- package/lib/deploy/functions/runtimes/node/versioning.js +6 -7
- package/lib/deploy/functions/runtimes/python/index.js +12 -12
- package/lib/deploy/functions/runtimes/supported/index.js +5 -6
- package/lib/deploy/functions/services/auth.js +49 -36
- package/lib/deploy/functions/services/database.js +1 -2
- package/lib/deploy/functions/services/dataconnect.js +16 -2
- package/lib/deploy/functions/services/firebaseAlerts.js +1 -2
- package/lib/deploy/functions/services/firestore.js +3 -5
- package/lib/deploy/functions/services/index.js +2 -2
- package/lib/deploy/functions/services/remoteConfig.js +1 -2
- package/lib/deploy/functions/services/storage.js +3 -5
- package/lib/deploy/functions/services/testLab.js +1 -2
- package/lib/deploy/functions/triggerRegionHelper.js +1 -2
- package/lib/deploy/functions/validate.js +12 -11
- package/lib/deploy/hosting/convertConfig.js +38 -22
- package/lib/deploy/hosting/deploy.js +4 -7
- package/lib/deploy/hosting/hashcache.js +2 -3
- package/lib/deploy/hosting/prepare.js +14 -14
- package/lib/deploy/hosting/release.js +1 -2
- package/lib/deploy/index.js +7 -8
- package/lib/deploy/lifecycleHooks.js +3 -5
- package/lib/deploy/remoteconfig/deploy.js +1 -1
- package/lib/deploy/remoteconfig/functions.js +5 -6
- package/lib/deploy/remoteconfig/prepare.js +2 -3
- package/lib/deploy/remoteconfig/release.js +2 -2
- package/lib/deploy/storage/deploy.js +1 -1
- package/lib/deploy/storage/prepare.js +1 -1
- package/lib/deploy/storage/release.js +1 -1
- package/lib/deploymentTool.js +5 -6
- package/lib/detectProjectRoot.js +1 -2
- package/lib/downloadUtils.js +2 -3
- package/lib/emulator/adminSdkConfig.js +2 -3
- package/lib/emulator/apphosting/config.js +1 -2
- package/lib/emulator/apphosting/developmentServer.js +3 -3
- package/lib/emulator/apphosting/serve.js +20 -14
- package/lib/emulator/auth/cloudFunctions.js +2 -3
- package/lib/emulator/auth/errors.js +2 -2
- package/lib/emulator/auth/handlers.js +3 -4
- package/lib/emulator/auth/index.js +6 -6
- package/lib/emulator/auth/operations.js +171 -129
- package/lib/emulator/auth/server.js +30 -22
- package/lib/emulator/auth/state.js +26 -36
- package/lib/emulator/auth/utils.js +12 -13
- package/lib/emulator/commandUtils.js +20 -20
- package/lib/emulator/controller.js +32 -29
- package/lib/emulator/databaseEmulator.js +1 -2
- package/lib/emulator/dataconnect/pgliteServer.js +48 -104
- package/lib/emulator/dataconnectEmulator.js +6 -9
- package/lib/emulator/download.js +2 -3
- package/lib/emulator/downloadableEmulatorInfo.json +31 -31
- package/lib/emulator/downloadableEmulators.js +49 -24
- package/lib/emulator/emulatorLogger.js +19 -4
- package/lib/emulator/env.js +6 -8
- package/lib/emulator/eventarcEmulator.js +2 -3
- package/lib/emulator/eventarcEmulatorUtils.js +3 -6
- package/lib/emulator/extensions/postinstall.js +1 -2
- package/lib/emulator/extensions/validation.js +4 -7
- package/lib/emulator/extensionsEmulator.js +6 -9
- package/lib/emulator/functionsEmulator.js +89 -46
- package/lib/emulator/functionsEmulatorRuntime.js +1 -1
- package/lib/emulator/functionsEmulatorShared.js +30 -30
- package/lib/emulator/functionsEmulatorShell.js +4 -6
- package/lib/emulator/functionsEmulatorUtils.js +8 -9
- package/lib/emulator/functionsRuntimeWorker.js +18 -9
- package/lib/emulator/hub.js +41 -34
- package/lib/emulator/hubClient.js +1 -1
- package/lib/emulator/initEmulators.js +2 -3
- package/lib/emulator/loggingEmulator.js +2 -2
- package/lib/emulator/portUtils.js +4 -5
- package/lib/emulator/registry.js +10 -4
- package/lib/emulator/shared/request.js +1 -2
- package/lib/emulator/storage/apis/firebase.js +16 -20
- package/lib/emulator/storage/apis/gcloud.js +6 -9
- package/lib/emulator/storage/apis/shared.js +1 -2
- package/lib/emulator/storage/crc.js +2 -3
- package/lib/emulator/storage/files.js +18 -41
- package/lib/emulator/storage/metadata.js +10 -4
- package/lib/emulator/storage/multipart.js +1 -2
- package/lib/emulator/storage/rfc.js +1 -2
- package/lib/emulator/storage/rules/config.js +1 -2
- package/lib/emulator/storage/rules/manager.js +3 -5
- package/lib/emulator/storage/rules/runtime.js +15 -13
- package/lib/emulator/storage/rules/types.js +2 -2
- package/lib/emulator/storage/rules/utils.js +5 -6
- package/lib/emulator/storage/server.js +1 -2
- package/lib/emulator/storage/upload.js +3 -4
- package/lib/emulator/taskQueue.js +11 -4
- package/lib/emulator/tasksEmulator.js +11 -12
- package/lib/emulator/types.js +6 -6
- package/lib/emulator/ui.js +6 -1
- package/lib/ensureApiEnabled.js +7 -9
- package/lib/env.js +2 -3
- package/lib/error.js +11 -13
- package/lib/errorOut.js +1 -2
- package/lib/experiments.js +15 -18
- package/lib/extensions/askUserForEventsConfig.js +12 -13
- package/lib/extensions/askUserForParam.js +11 -12
- package/lib/extensions/change-log.js +4 -5
- package/lib/extensions/checkProjectBilling.js +1 -2
- package/lib/extensions/diagnose.js +1 -2
- package/lib/extensions/displayExtensionInfo.js +25 -32
- package/lib/extensions/emulator/optionsHelper.js +6 -8
- package/lib/extensions/emulator/specHelper.js +15 -16
- package/lib/extensions/emulator/triggerHelper.js +3 -5
- package/lib/extensions/etags.js +2 -3
- package/lib/extensions/export.js +7 -9
- package/lib/extensions/extensionsApi.js +23 -29
- package/lib/extensions/extensionsHelper.js +52 -80
- package/lib/extensions/listExtensions.js +3 -5
- package/lib/extensions/localHelper.js +5 -5
- package/lib/extensions/manifest.js +15 -16
- package/lib/extensions/metricsUtils.js +3 -4
- package/lib/extensions/paramHelper.js +21 -18
- package/lib/extensions/provisioningHelper.js +17 -21
- package/lib/extensions/publishHelpers.js +1 -2
- package/lib/extensions/publisherApi.js +11 -13
- package/lib/extensions/refs.js +6 -7
- package/lib/extensions/runtimes/common.js +18 -19
- package/lib/extensions/runtimes/node.js +5 -6
- package/lib/extensions/secretsUtils.js +8 -8
- package/lib/extensions/tos.js +7 -8
- package/lib/extensions/types.js +3 -3
- package/lib/extensions/updateHelper.js +6 -7
- package/lib/extensions/utils.js +6 -8
- package/lib/extensions/versionHelper.js +1 -2
- package/lib/extensions/warnings.js +6 -8
- package/lib/fetchMOTD.js +1 -2
- package/lib/fetchWebSetup.js +3 -4
- package/lib/filterTargets.js +1 -2
- package/lib/firebaseConfigValidate.js +2 -3
- package/lib/firestore/api-sort.js +8 -9
- package/lib/firestore/api-types.js +15 -15
- package/lib/firestore/api.js +15 -13
- package/lib/firestore/backupUtils.js +3 -3
- package/lib/firestore/checkDatabaseType.js +1 -2
- package/lib/firestore/delete.js +1 -2
- package/lib/firestore/encodeFirestoreValue.js +1 -2
- package/lib/firestore/fsConfig.js +1 -2
- package/lib/firestore/options.js +1 -1
- package/lib/firestore/util.js +5 -6
- package/lib/firestore/validator.js +4 -5
- package/lib/frameworks/angular/index.js +14 -15
- package/lib/frameworks/angular/utils.js +21 -23
- package/lib/frameworks/astro/index.js +7 -7
- package/lib/frameworks/astro/utils.js +4 -6
- package/lib/frameworks/compose/discover/filesystem.js +3 -3
- package/lib/frameworks/compose/discover/frameworkMatcher.js +4 -5
- package/lib/frameworks/compose/discover/index.js +1 -2
- package/lib/frameworks/compose/discover/runtime/node.js +8 -11
- package/lib/frameworks/compose/driver/docker.js +3 -5
- package/lib/frameworks/compose/driver/hooks.js +2 -2
- package/lib/frameworks/compose/driver/index.js +2 -2
- package/lib/frameworks/compose/driver/local.js +2 -3
- package/lib/frameworks/compose/index.js +5 -7
- package/lib/frameworks/constants.js +3 -3
- package/lib/frameworks/express/index.js +7 -8
- package/lib/frameworks/flutter/index.js +6 -7
- package/lib/frameworks/flutter/utils.js +4 -5
- package/lib/frameworks/index.js +21 -22
- package/lib/frameworks/next/constants.js +5 -2
- package/lib/frameworks/next/index.js +34 -32
- package/lib/frameworks/next/utils.js +40 -39
- package/lib/frameworks/nuxt/index.js +9 -9
- package/lib/frameworks/nuxt/utils.js +4 -6
- package/lib/frameworks/nuxt2/index.js +7 -7
- package/lib/frameworks/sveltekit/index.js +6 -8
- package/lib/frameworks/utils.js +26 -24
- package/lib/frameworks/vite/index.js +8 -9
- package/lib/fsAsync.js +1 -2
- package/lib/fsutils.js +5 -6
- package/lib/functional.js +11 -11
- package/lib/functions/artifacts.js +25 -22
- package/lib/functions/ensureTargeted.js +1 -2
- package/lib/functions/env.js +13 -14
- package/lib/functions/functionslog.js +2 -3
- package/lib/functions/projectConfig.js +29 -33
- package/lib/functions/python.js +10 -4
- package/lib/functions/secrets.js +32 -18
- package/lib/functionsConfig.js +14 -14
- package/lib/functionsConfigClone.js +1 -2
- package/lib/functionsShellCommandAction.js +2 -3
- package/lib/gcp/apphosting.js +43 -28
- package/lib/gcp/apptesting.js +2 -2
- package/lib/gcp/artifactregistry.js +5 -5
- package/lib/gcp/auth.js +11 -13
- package/lib/gcp/cloudbilling.js +4 -5
- package/lib/gcp/cloudbuild.js +10 -11
- package/lib/gcp/cloudfunctions.js +61 -45
- package/lib/gcp/cloudfunctionsv2.js +81 -43
- package/lib/gcp/cloudlogging.js +2 -4
- package/lib/gcp/cloudmonitoring.js +7 -7
- package/lib/gcp/cloudscheduler.js +12 -14
- package/lib/gcp/cloudsql/cloudsqladmin.js +19 -21
- package/lib/gcp/cloudsql/connect.js +14 -9
- package/lib/gcp/cloudsql/fbToolsAuthClient.js +5 -3
- package/lib/gcp/cloudsql/interactive.js +2 -3
- package/lib/gcp/cloudsql/permissions.js +8 -8
- package/lib/gcp/cloudsql/permissionsSetup.js +9 -9
- package/lib/gcp/cloudtasks.js +19 -18
- package/lib/gcp/computeEngine.js +1 -2
- package/lib/gcp/devConnect.js +32 -29
- package/lib/gcp/docker.js +2 -4
- package/lib/gcp/eventarc.js +5 -5
- package/lib/gcp/firedata.js +4 -4
- package/lib/gcp/firestore.js +16 -16
- package/lib/gcp/iam.js +11 -12
- package/lib/gcp/identityPlatform.js +4 -5
- package/lib/gcp/k8s.js +1 -2
- package/lib/gcp/location.js +2 -2
- package/lib/gcp/proto.js +10 -11
- package/lib/gcp/pubsub.js +4 -5
- package/lib/gcp/resourceManager.js +5 -5
- package/lib/gcp/rules.js +13 -14
- package/lib/gcp/run.js +24 -31
- package/lib/gcp/runv2.js +39 -27
- package/lib/gcp/secretManager.js +60 -39
- package/lib/gcp/serviceusage.js +8 -4
- package/lib/gcp/storage.js +22 -20
- package/lib/gemini/fdcExperience.js +5 -5
- package/lib/getDefaultDatabaseInstance.js +2 -4
- package/lib/getDefaultHostingSite.js +3 -4
- package/lib/getProjectNumber.js +1 -2
- package/lib/hosting/api.js +32 -36
- package/lib/hosting/cloudRunProxy.js +2 -3
- package/lib/hosting/config.js +17 -17
- package/lib/hosting/expireUtils.js +3 -3
- package/lib/hosting/functionsProxy.js +1 -2
- package/lib/hosting/implicitInit.js +1 -2
- package/lib/hosting/initMiddleware.js +1 -2
- package/lib/hosting/interactive.js +1 -2
- package/lib/hosting/proxy.js +3 -5
- package/lib/hosting/runTags.js +8 -11
- package/lib/init/features/account.js +1 -2
- package/lib/init/features/ailogic/index.js +3 -5
- package/lib/init/features/ailogic/utils.js +6 -8
- package/lib/init/features/aitools/claude.js +1 -2
- package/lib/init/features/aitools/cursor.js +1 -2
- package/lib/init/features/aitools/gemini.js +1 -1
- package/lib/init/features/aitools/promptUpdater.js +10 -12
- package/lib/init/features/aitools.js +1 -2
- package/lib/init/features/apphosting.js +3 -4
- package/lib/init/features/apptesting/index.js +9 -9
- package/lib/init/features/database.js +4 -5
- package/lib/init/features/dataconnect/create_app.js +3 -4
- package/lib/init/features/dataconnect/index.js +25 -22
- package/lib/init/features/dataconnect/resolver.js +6 -10
- package/lib/init/features/dataconnect/sdk.js +31 -24
- package/lib/init/features/emulators.js +7 -6
- package/lib/init/features/extensions/index.js +3 -5
- package/lib/init/features/firestore/index.js +7 -9
- package/lib/init/features/firestore/indexes.js +2 -2
- package/lib/init/features/firestore/rules.js +3 -3
- package/lib/init/features/functions/index.js +3 -5
- package/lib/init/features/functions/javascript.js +1 -2
- package/lib/init/features/functions/npm-dependencies.js +1 -2
- package/lib/init/features/functions/python.js +1 -2
- package/lib/init/features/functions/typescript.js +1 -2
- package/lib/init/features/genkit/index.js +44 -18
- package/lib/init/features/hosting/github.js +6 -8
- package/lib/init/features/hosting/index.js +10 -13
- package/lib/init/features/project.js +4 -7
- package/lib/init/features/remoteconfig.js +1 -2
- package/lib/init/features/storage.js +3 -5
- package/lib/init/index.js +4 -7
- package/lib/init/spawn.js +7 -9
- package/lib/listFiles.js +1 -2
- package/lib/loadCJSON.js +1 -2
- package/lib/localFunction.js +14 -15
- package/lib/logError.js +1 -2
- package/lib/logger.js +7 -7
- package/lib/management/apps.js +22 -22
- package/lib/management/database.js +11 -12
- package/lib/management/projects.js +57 -56
- package/lib/management/provisioning/errorHandler.js +3 -5
- package/lib/management/provisioning/provision.js +15 -9
- package/lib/management/studio.js +2 -3
- package/lib/mcp/errors.js +4 -4
- package/lib/mcp/index.js +47 -45
- package/lib/mcp/prompt.js +1 -2
- package/lib/mcp/prompts/core/consult.js +2 -3
- package/lib/mcp/prompts/crashlytics/connect.js +15 -122
- package/lib/mcp/prompts/dataconnect/schema.js +3 -3
- package/lib/mcp/prompts/index.js +8 -10
- package/lib/mcp/resource.js +3 -15
- package/lib/mcp/resources/guides/app_id.js +39 -0
- package/lib/mcp/resources/guides/crashlytics_connect.js +51 -0
- package/lib/mcp/resources/guides/crashlytics_investigations.js +51 -0
- package/lib/mcp/resources/guides/crashlytics_issues.js +42 -0
- package/lib/mcp/resources/guides/crashlytics_reports.js +112 -0
- package/lib/mcp/resources/index.js +11 -3
- package/lib/mcp/tool.js +3 -15
- package/lib/mcp/tools/apphosting/fetch_logs.js +3 -4
- package/lib/mcp/tools/apphosting/list_backends.js +1 -1
- package/lib/mcp/tools/auth/get_users.js +5 -16
- package/lib/mcp/tools/core/create_android_sha.js +4 -1
- package/lib/mcp/tools/core/get_environment.js +7 -4
- package/lib/mcp/tools/core/get_sdk_config.js +4 -5
- package/lib/mcp/tools/core/get_security_rules.js +1 -2
- package/lib/mcp/tools/core/init.js +2 -2
- package/lib/mcp/tools/core/logout.js +1 -1
- package/lib/mcp/tools/core/read_resources.js +2 -2
- package/lib/mcp/tools/core/validate_security_rules.js +1 -2
- package/lib/mcp/tools/crashlytics/events.js +43 -19
- package/lib/mcp/tools/crashlytics/index.js +1 -6
- package/lib/mcp/tools/crashlytics/issues.js +33 -12
- package/lib/mcp/tools/crashlytics/reports.js +66 -117
- package/lib/mcp/tools/dataconnect/list_services.js +2 -3
- package/lib/mcp/tools/firestore/converter.js +3 -5
- package/lib/mcp/tools/firestore/delete_document.js +1 -1
- package/lib/mcp/tools/functions/get_logs.js +14 -12
- package/lib/mcp/tools/functions/list_functions.js +1 -1
- package/lib/mcp/tools/index.js +67 -50
- package/lib/mcp/util/apptesting/availability.js +1 -2
- package/lib/mcp/util/availability.js +1 -2
- package/lib/mcp/util/crashlytics/availability.js +1 -2
- package/lib/mcp/util/dataconnect/compile.js +7 -6
- package/lib/mcp/util/dataconnect/converter.js +7 -10
- package/lib/mcp/util/dataconnect/emulator.js +1 -2
- package/lib/mcp/util.js +9 -11
- package/lib/messaging/sendMessage.js +1 -2
- package/lib/metaprogramming.js +1 -2
- package/lib/operation-poller.js +2 -2
- package/lib/profileReport.js +6 -6
- package/lib/profiler.js +1 -2
- package/lib/projectPath.js +1 -2
- package/lib/projectUtils.js +5 -6
- package/lib/prompt.js +22 -13
- package/lib/rc.js +5 -7
- package/lib/remoteconfig/deleteExperiment.js +1 -2
- package/lib/remoteconfig/deleteRollout.js +1 -2
- package/lib/remoteconfig/get.js +2 -3
- package/lib/remoteconfig/getExperiment.js +2 -2
- package/lib/remoteconfig/getRollout.js +2 -2
- package/lib/remoteconfig/interfaces.js +1 -1
- package/lib/remoteconfig/listExperiments.js +2 -2
- package/lib/remoteconfig/listRollouts.js +2 -2
- package/lib/remoteconfig/publish.js +1 -2
- package/lib/remoteconfig/rollback.js +1 -2
- package/lib/remoteconfig/versionslist.js +1 -2
- package/lib/requireAuth.js +4 -6
- package/lib/requireConfig.js +5 -8
- package/lib/requireDatabaseInstance.js +2 -2
- package/lib/requireHostingSite.js +1 -2
- package/lib/requireInteractive.js +1 -1
- package/lib/requirePermissions.js +1 -2
- package/lib/requireTosAcceptance.js +1 -2
- package/lib/responseToError.js +1 -2
- package/lib/rtdb.js +2 -3
- package/lib/rulesDeploy.js +3 -4
- package/lib/serve/functions.js +9 -1
- package/lib/serve/hosting.js +4 -5
- package/lib/serve/index.js +1 -2
- package/lib/shortenUrl.js +1 -2
- package/lib/templates.js +3 -4
- package/lib/throttler/throttler.js +3 -3
- package/lib/timeout.js +2 -3
- package/lib/track.js +23 -14
- package/lib/tsconfig.publish.tsbuildinfo +1 -0
- package/lib/unzip.js +2 -3
- package/lib/utils.js +62 -63
- package/lib/vsCodeUtils.js +2 -3
- package/package.json +6 -6
- package/templates/extensions/typescript/index.ts +1 -1
- package/templates/extensions/typescript/package.lint.json +1 -1
- package/templates/extensions/typescript/package.nolint.json +1 -1
- package/templates/extensions/typescript/tsconfig.json +2 -1
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DockerHelper = exports.
|
|
3
|
+
exports.DockerHelper = exports.ContainerRegistryCleaner = exports.NoopArtifactRegistryCleaner = exports.ArtifactRegistryCleaner = void 0;
|
|
4
|
+
exports.cleanupBuildImages = cleanupBuildImages;
|
|
5
|
+
exports.listGcfPaths = listGcfPaths;
|
|
6
|
+
exports.deleteGcfArtifacts = deleteGcfArtifacts;
|
|
4
7
|
const clc = require("colorette");
|
|
5
8
|
const error_1 = require("../../error");
|
|
6
9
|
const api_1 = require("../../api");
|
|
@@ -80,7 +83,6 @@ async function cleanupBuildImages(haveFunctions, deletedFunctions, cleaners = {}
|
|
|
80
83
|
utils.logLabeledWarning("functions", message);
|
|
81
84
|
}
|
|
82
85
|
}
|
|
83
|
-
exports.cleanupBuildImages = cleanupBuildImages;
|
|
84
86
|
class ArtifactRegistryCleaner {
|
|
85
87
|
static packagePath(func) {
|
|
86
88
|
const encodedId = func.platform === "gcfv2"
|
|
@@ -119,7 +121,11 @@ class ArtifactRegistryCleaner {
|
|
|
119
121
|
if (op.done) {
|
|
120
122
|
return;
|
|
121
123
|
}
|
|
122
|
-
await poller.pollOperation(
|
|
124
|
+
await poller.pollOperation({
|
|
125
|
+
...ArtifactRegistryCleaner.POLLER_OPTIONS,
|
|
126
|
+
pollerName: `cleanup-${func.region}-${func.id}`,
|
|
127
|
+
operationResourceName: op.name,
|
|
128
|
+
});
|
|
123
129
|
}
|
|
124
130
|
}
|
|
125
131
|
exports.ArtifactRegistryCleaner = ArtifactRegistryCleaner;
|
|
@@ -161,7 +167,7 @@ class ContainerRegistryCleaner {
|
|
|
161
167
|
await Promise.all(loadUuidTags);
|
|
162
168
|
const extractFunction = /^(.*)_version-\d+$/;
|
|
163
169
|
const entry = Object.entries(uuidTags).find(([, tags]) => {
|
|
164
|
-
return tags.find((tag) =>
|
|
170
|
+
return tags.find((tag) => extractFunction.exec(tag)?.[1] === func.id);
|
|
165
171
|
});
|
|
166
172
|
if (!entry) {
|
|
167
173
|
logger_1.logger.debug("Could not find image for function", backend.functionName(func));
|
|
@@ -220,7 +226,6 @@ async function listGcfPaths(projectId, locations, dockerHelpers = {}) {
|
|
|
220
226
|
return `${docker.GCR_SUBDOMAIN_MAPPING[loc]}.${(0, api_1.containerRegistryDomain)()}/${projectId}/gcf/${loc}`;
|
|
221
227
|
});
|
|
222
228
|
}
|
|
223
|
-
exports.listGcfPaths = listGcfPaths;
|
|
224
229
|
async function deleteGcfArtifacts(projectId, locations, dockerHelpers = {}) {
|
|
225
230
|
if (!locations) {
|
|
226
231
|
locations = Object.keys(docker.GCR_SUBDOMAIN_MAPPING);
|
|
@@ -249,7 +254,6 @@ async function deleteGcfArtifacts(projectId, locations, dockerHelpers = {}) {
|
|
|
249
254
|
throw new error_1.FirebaseError(`Failed to search the following subdomains: ${failedSubdomains.join(",")}`);
|
|
250
255
|
}
|
|
251
256
|
}
|
|
252
|
-
exports.deleteGcfArtifacts = deleteGcfArtifacts;
|
|
253
257
|
class DockerHelper {
|
|
254
258
|
constructor(origin) {
|
|
255
259
|
this.cache = {};
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.createReadStream = createReadStream;
|
|
4
|
+
exports.uploadSourceV2 = uploadSourceV2;
|
|
5
|
+
exports.deploy = deploy;
|
|
6
|
+
exports.shouldUploadBeSkipped = shouldUploadBeSkipped;
|
|
4
7
|
const tmp_1 = require("tmp");
|
|
5
8
|
const clc = require("colorette");
|
|
6
9
|
const fs = require("fs");
|
|
@@ -38,7 +41,6 @@ async function uploadSourceV1(projectId, source, wantBackend) {
|
|
|
38
41
|
function createReadStream(filePath) {
|
|
39
42
|
return fs.createReadStream(filePath);
|
|
40
43
|
}
|
|
41
|
-
exports.createReadStream = createReadStream;
|
|
42
44
|
async function uploadSourceV2(projectId, projectNumber, source, wantBackend) {
|
|
43
45
|
const v2Endpoints = backend
|
|
44
46
|
.allEndpoints(wantBackend)
|
|
@@ -85,10 +87,8 @@ async function uploadSourceV2(projectId, projectNumber, source, wantBackend) {
|
|
|
85
87
|
object: objectPath,
|
|
86
88
|
};
|
|
87
89
|
}
|
|
88
|
-
exports.uploadSourceV2 = uploadSourceV2;
|
|
89
90
|
async function uploadCodebase(context, projectNumber, codebase, wantBackend) {
|
|
90
|
-
|
|
91
|
-
const source = (_a = context.sources) === null || _a === void 0 ? void 0 : _a[codebase];
|
|
91
|
+
const source = context.sources?.[codebase];
|
|
92
92
|
if (!source || (!source.functionsSourceV1 && !source.functionsSourceV2)) {
|
|
93
93
|
return;
|
|
94
94
|
}
|
|
@@ -104,7 +104,7 @@ async function uploadCodebase(context, projectNumber, codebase, wantBackend) {
|
|
|
104
104
|
source.storage = storage;
|
|
105
105
|
}
|
|
106
106
|
const cfg = (0, projectConfig_1.configForCodebase)(context.config, codebase);
|
|
107
|
-
const label =
|
|
107
|
+
const label = cfg.source ?? cfg.remoteSource?.dir ?? "remote";
|
|
108
108
|
if (uploads.length) {
|
|
109
109
|
(0, utils_1.logLabeledSuccess)("functions", `${clc.bold(label)} source uploaded successfully`);
|
|
110
110
|
}
|
|
@@ -131,7 +131,6 @@ async function deploy(context, options, payload) {
|
|
|
131
131
|
await Promise.all(uploads);
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
|
-
exports.deploy = deploy;
|
|
135
134
|
function shouldUploadBeSkipped(context, wantBackend, haveBackend) {
|
|
136
135
|
if (context.filters && context.filters.length > 0) {
|
|
137
136
|
return false;
|
|
@@ -152,4 +151,3 @@ function shouldUploadBeSkipped(context, wantBackend, haveBackend) {
|
|
|
152
151
|
haveEndpoint.state === "ACTIVE");
|
|
153
152
|
});
|
|
154
153
|
}
|
|
155
|
-
exports.shouldUploadBeSkipped = shouldUploadBeSkipped;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.defaultServiceAccount = defaultServiceAccount;
|
|
4
|
+
exports.cloudBuildEnabled = cloudBuildEnabled;
|
|
5
|
+
exports.secretAccess = secretAccess;
|
|
4
6
|
const clc = require("colorette");
|
|
5
7
|
const ensureApiEnabled_1 = require("../../ensureApiEnabled");
|
|
6
8
|
const error_1 = require("../../error");
|
|
@@ -28,7 +30,6 @@ async function defaultServiceAccount(e) {
|
|
|
28
30
|
}
|
|
29
31
|
(0, functional_1.assertExhaustive)(e.platform);
|
|
30
32
|
}
|
|
31
|
-
exports.defaultServiceAccount = defaultServiceAccount;
|
|
32
33
|
function nodeBillingError(projectId) {
|
|
33
34
|
return new error_1.FirebaseError(`Cloud Functions deployment requires the pay-as-you-go (Blaze) billing plan. To upgrade your project, visit the following URL:
|
|
34
35
|
|
|
@@ -50,8 +51,7 @@ ${FAQ_URL}
|
|
|
50
51
|
`);
|
|
51
52
|
}
|
|
52
53
|
function isPermissionError(e) {
|
|
53
|
-
|
|
54
|
-
return ((_c = (_b = (_a = e.context) === null || _a === void 0 ? void 0 : _a.body) === null || _b === void 0 ? void 0 : _b.error) === null || _c === void 0 ? void 0 : _c.status) === "PERMISSION_DENIED";
|
|
54
|
+
return e.context?.body?.error?.status === "PERMISSION_DENIED";
|
|
55
55
|
}
|
|
56
56
|
async function cloudBuildEnabled(projectId) {
|
|
57
57
|
try {
|
|
@@ -67,7 +67,6 @@ async function cloudBuildEnabled(projectId) {
|
|
|
67
67
|
throw e;
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
|
-
exports.cloudBuildEnabled = cloudBuildEnabled;
|
|
71
70
|
async function secretsToServiceAccounts(b) {
|
|
72
71
|
const secretsToSa = {};
|
|
73
72
|
for (const e of backend.allEndpoints(b)) {
|
|
@@ -81,7 +80,6 @@ async function secretsToServiceAccounts(b) {
|
|
|
81
80
|
return secretsToSa;
|
|
82
81
|
}
|
|
83
82
|
async function secretAccess(projectId, wantBackend, haveBackend, dryRun) {
|
|
84
|
-
var _a, _b;
|
|
85
83
|
const ensureAccess = async (secret, serviceAccounts) => {
|
|
86
84
|
(0, utils_1.logLabeledBullet)("functions", `ensuring ${clc.bold(serviceAccounts.join(", "))} access to secret ${clc.bold(secret)}.`);
|
|
87
85
|
if (dryRun) {
|
|
@@ -99,9 +97,9 @@ async function secretAccess(projectId, wantBackend, haveBackend, dryRun) {
|
|
|
99
97
|
const haveSecrets = await secretsToServiceAccounts(haveBackend);
|
|
100
98
|
for (const [secret, serviceAccounts] of Object.entries(haveSecrets)) {
|
|
101
99
|
for (const serviceAccount of serviceAccounts) {
|
|
102
|
-
|
|
100
|
+
wantSecrets[secret]?.delete(serviceAccount);
|
|
103
101
|
}
|
|
104
|
-
if (
|
|
102
|
+
if (wantSecrets[secret]?.size === 0) {
|
|
105
103
|
delete wantSecrets[secret];
|
|
106
104
|
}
|
|
107
105
|
}
|
|
@@ -111,4 +109,3 @@ async function secretAccess(projectId, wantBackend, haveBackend, dryRun) {
|
|
|
111
109
|
}
|
|
112
110
|
await Promise.all(ensure);
|
|
113
111
|
}
|
|
114
|
-
exports.secretAccess = secretAccess;
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.endpointMatchesAnyFilter = endpointMatchesAnyFilter;
|
|
4
|
+
exports.endpointMatchesFilter = endpointMatchesFilter;
|
|
5
|
+
exports.parseFunctionSelector = parseFunctionSelector;
|
|
6
|
+
exports.getEndpointFilters = getEndpointFilters;
|
|
7
|
+
exports.getHumanFriendlyPlatformName = getHumanFriendlyPlatformName;
|
|
8
|
+
exports.getFunctionLabel = getFunctionLabel;
|
|
9
|
+
exports.targetCodebases = targetCodebases;
|
|
10
|
+
exports.groupEndpointsByCodebase = groupEndpointsByCodebase;
|
|
11
|
+
exports.isCodebaseFiltered = isCodebaseFiltered;
|
|
12
|
+
exports.isEndpointFiltered = isEndpointFiltered;
|
|
4
13
|
const backend = require("./backend");
|
|
5
14
|
const projectConfig_1 = require("../../functions/projectConfig");
|
|
6
15
|
const functional_1 = require("../../functional");
|
|
@@ -10,7 +19,6 @@ function endpointMatchesAnyFilter(endpoint, filters) {
|
|
|
10
19
|
}
|
|
11
20
|
return filters.some((filter) => endpointMatchesFilter(endpoint, filter));
|
|
12
21
|
}
|
|
13
|
-
exports.endpointMatchesAnyFilter = endpointMatchesAnyFilter;
|
|
14
22
|
function endpointMatchesFilter(endpoint, filter) {
|
|
15
23
|
if (endpoint.codebase && filter.codebase) {
|
|
16
24
|
if (endpoint.codebase !== filter.codebase) {
|
|
@@ -31,7 +39,6 @@ function endpointMatchesFilter(endpoint, filter) {
|
|
|
31
39
|
}
|
|
32
40
|
return true;
|
|
33
41
|
}
|
|
34
|
-
exports.endpointMatchesFilter = endpointMatchesFilter;
|
|
35
42
|
function parseFunctionSelector(selector, config) {
|
|
36
43
|
const fragments = selector.split(":");
|
|
37
44
|
if (fragments.length < 2) {
|
|
@@ -48,7 +55,6 @@ function parseFunctionSelector(selector, config) {
|
|
|
48
55
|
},
|
|
49
56
|
];
|
|
50
57
|
}
|
|
51
|
-
exports.parseFunctionSelector = parseFunctionSelector;
|
|
52
58
|
function getEndpointFilters(options, config) {
|
|
53
59
|
if (!options.only) {
|
|
54
60
|
return undefined;
|
|
@@ -68,7 +74,6 @@ function getEndpointFilters(options, config) {
|
|
|
68
74
|
}
|
|
69
75
|
return filters;
|
|
70
76
|
}
|
|
71
|
-
exports.getEndpointFilters = getEndpointFilters;
|
|
72
77
|
function getHumanFriendlyPlatformName(platform) {
|
|
73
78
|
if (platform === "gcfv1") {
|
|
74
79
|
return "1st Gen";
|
|
@@ -81,7 +86,6 @@ function getHumanFriendlyPlatformName(platform) {
|
|
|
81
86
|
}
|
|
82
87
|
(0, functional_1.assertExhaustive)(platform);
|
|
83
88
|
}
|
|
84
|
-
exports.getHumanFriendlyPlatformName = getHumanFriendlyPlatformName;
|
|
85
89
|
function getFunctionLabel(fn) {
|
|
86
90
|
let id = `${fn.id}(${fn.region})`;
|
|
87
91
|
if (fn.codebase && fn.codebase !== projectConfig_1.DEFAULT_CODEBASE) {
|
|
@@ -89,7 +93,6 @@ function getFunctionLabel(fn) {
|
|
|
89
93
|
}
|
|
90
94
|
return id;
|
|
91
95
|
}
|
|
92
|
-
exports.getFunctionLabel = getFunctionLabel;
|
|
93
96
|
function targetCodebases(config, filters) {
|
|
94
97
|
const codebasesFromConfig = [...new Set(Object.values(config).map((c) => c.codebase))];
|
|
95
98
|
if (!filters) {
|
|
@@ -109,7 +112,6 @@ function targetCodebases(config, filters) {
|
|
|
109
112
|
}
|
|
110
113
|
return intersections;
|
|
111
114
|
}
|
|
112
|
-
exports.targetCodebases = targetCodebases;
|
|
113
115
|
function groupEndpointsByCodebase(wantBackends, haveEndpoints) {
|
|
114
116
|
const grouped = {};
|
|
115
117
|
let endpointsToAssign = haveEndpoints;
|
|
@@ -128,15 +130,12 @@ function groupEndpointsByCodebase(wantBackends, haveEndpoints) {
|
|
|
128
130
|
}
|
|
129
131
|
return grouped;
|
|
130
132
|
}
|
|
131
|
-
exports.groupEndpointsByCodebase = groupEndpointsByCodebase;
|
|
132
133
|
function isCodebaseFiltered(codebase, filters) {
|
|
133
134
|
return filters.some((filter) => {
|
|
134
135
|
const noIdChunks = (filter.idChunks || []).length === 0;
|
|
135
136
|
return noIdChunks && filter.codebase === codebase;
|
|
136
137
|
});
|
|
137
138
|
}
|
|
138
|
-
exports.isCodebaseFiltered = isCodebaseFiltered;
|
|
139
139
|
function isEndpointFiltered(endpoint, filters) {
|
|
140
140
|
return filters.some((filter) => endpointMatchesFilter(endpoint, filter));
|
|
141
141
|
}
|
|
142
|
-
exports.isEndpointFiltered = isEndpointFiltered;
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.ParamValue = void 0;
|
|
4
|
+
exports.resolveInt = resolveInt;
|
|
5
|
+
exports.resolveString = resolveString;
|
|
6
|
+
exports.resolveList = resolveList;
|
|
7
|
+
exports.resolveBoolean = resolveBoolean;
|
|
8
|
+
exports.isTextInput = isTextInput;
|
|
9
|
+
exports.isSelectInput = isSelectInput;
|
|
10
|
+
exports.isResourceInput = isResourceInput;
|
|
11
|
+
exports.isMultiSelectInput = isMultiSelectInput;
|
|
12
|
+
exports.resolveParams = resolveParams;
|
|
4
13
|
const logger_1 = require("../../logger");
|
|
5
14
|
const error_1 = require("../../error");
|
|
6
15
|
const prompt_1 = require("../../prompt");
|
|
@@ -25,7 +34,6 @@ function resolveInt(from, paramValues) {
|
|
|
25
34
|
}
|
|
26
35
|
return (0, cel_1.resolveExpression)("number", from, paramValues);
|
|
27
36
|
}
|
|
28
|
-
exports.resolveInt = resolveInt;
|
|
29
37
|
function resolveString(from, paramValues) {
|
|
30
38
|
let output = from;
|
|
31
39
|
const celCapture = /{{ .+? }}/g;
|
|
@@ -39,7 +47,6 @@ function resolveString(from, paramValues) {
|
|
|
39
47
|
}
|
|
40
48
|
return output;
|
|
41
49
|
}
|
|
42
|
-
exports.resolveString = resolveString;
|
|
43
50
|
function resolveList(from, paramValues) {
|
|
44
51
|
if (!from) {
|
|
45
52
|
return [];
|
|
@@ -54,30 +61,24 @@ function resolveList(from, paramValues) {
|
|
|
54
61
|
(0, functional_1.assertExhaustive)(from);
|
|
55
62
|
}
|
|
56
63
|
}
|
|
57
|
-
exports.resolveList = resolveList;
|
|
58
64
|
function resolveBoolean(from, paramValues) {
|
|
59
65
|
if (typeof from === "boolean") {
|
|
60
66
|
return from;
|
|
61
67
|
}
|
|
62
68
|
return (0, cel_1.resolveExpression)("boolean", from, paramValues);
|
|
63
69
|
}
|
|
64
|
-
exports.resolveBoolean = resolveBoolean;
|
|
65
70
|
function isTextInput(input) {
|
|
66
71
|
return {}.hasOwnProperty.call(input, "text");
|
|
67
72
|
}
|
|
68
|
-
exports.isTextInput = isTextInput;
|
|
69
73
|
function isSelectInput(input) {
|
|
70
74
|
return {}.hasOwnProperty.call(input, "select");
|
|
71
75
|
}
|
|
72
|
-
exports.isSelectInput = isSelectInput;
|
|
73
76
|
function isResourceInput(input) {
|
|
74
77
|
return {}.hasOwnProperty.call(input, "resource");
|
|
75
78
|
}
|
|
76
|
-
exports.isResourceInput = isResourceInput;
|
|
77
79
|
function isMultiSelectInput(input) {
|
|
78
80
|
return {}.hasOwnProperty.call(input, "multiSelect");
|
|
79
81
|
}
|
|
80
|
-
exports.isMultiSelectInput = isMultiSelectInput;
|
|
81
82
|
class ParamValue {
|
|
82
83
|
constructor(rawValue, internal, types) {
|
|
83
84
|
this.rawValue = rawValue;
|
|
@@ -192,7 +193,6 @@ async function resolveParams(params, firebaseConfig, userEnvs, nonInteractive, i
|
|
|
192
193
|
}
|
|
193
194
|
return paramValues;
|
|
194
195
|
}
|
|
195
|
-
exports.resolveParams = resolveParams;
|
|
196
196
|
function populateDefaultParams(config) {
|
|
197
197
|
const defaultParams = {};
|
|
198
198
|
if (config.databaseURL && config.databaseURL !== "") {
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.EVENTARC_SOURCE_ENV = void 0;
|
|
4
|
+
exports.prepare = prepare;
|
|
5
|
+
exports.inferDetailsFromExisting = inferDetailsFromExisting;
|
|
6
|
+
exports.updateEndpointTargetedStatus = updateEndpointTargetedStatus;
|
|
7
|
+
exports.inferBlockingDetails = inferBlockingDetails;
|
|
8
|
+
exports.resolveCpuAndConcurrency = resolveCpuAndConcurrency;
|
|
9
|
+
exports.loadCodebases = loadCodebases;
|
|
10
|
+
exports.warnIfNewGenkitFunctionIsMissingSecrets = warnIfNewGenkitFunctionIsMissingSecrets;
|
|
11
|
+
exports.ensureAllRequiredAPIsEnabled = ensureAllRequiredAPIsEnabled;
|
|
4
12
|
const clc = require("colorette");
|
|
5
13
|
const proto = require("../../gcp/proto");
|
|
6
14
|
const backend = require("./backend");
|
|
@@ -30,10 +38,8 @@ const backend_1 = require("./backend");
|
|
|
30
38
|
const functional_1 = require("../../functional");
|
|
31
39
|
const prepare_1 = require("../extensions/prepare");
|
|
32
40
|
const prompt = require("../../prompt");
|
|
33
|
-
const experiments = require("../../experiments");
|
|
34
41
|
exports.EVENTARC_SOURCE_ENV = "EVENTARC_CLOUD_EVENT_SOURCE";
|
|
35
42
|
async function prepare(context, options, payload) {
|
|
36
|
-
var _a, _b;
|
|
37
43
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
38
44
|
const projectNumber = await (0, projectUtils_1.needProjectNumber)(options);
|
|
39
45
|
context.config = (0, projectConfig_1.normalizeAndValidate)(options.config.src.functions);
|
|
@@ -55,12 +61,9 @@ async function prepare(context, options, payload) {
|
|
|
55
61
|
context.firebaseConfig = firebaseConfig;
|
|
56
62
|
context.codebaseDeployEvents = {};
|
|
57
63
|
let runtimeConfig = { firebase: firebaseConfig };
|
|
58
|
-
const allowFunctionsConfig = experiments.isEnabled("legacyRuntimeConfigCommands");
|
|
59
64
|
const targetedCodebaseConfigs = context.config.filter((cfg) => codebases.includes(cfg.codebase));
|
|
60
|
-
if (
|
|
61
|
-
|
|
62
|
-
targetedCodebaseConfigs.some(projectConfig_1.shouldUseRuntimeConfig)) {
|
|
63
|
-
runtimeConfig = Object.assign(Object.assign({}, runtimeConfig), (await (0, prepareFunctionsUpload_1.getFunctionsConfig)(projectId)));
|
|
65
|
+
if (checkAPIsEnabled[1] && targetedCodebaseConfigs.some(projectConfig_1.shouldUseRuntimeConfig)) {
|
|
66
|
+
runtimeConfig = { ...runtimeConfig, ...(await (0, prepareFunctionsUpload_1.getFunctionsConfig)(projectId)) };
|
|
64
67
|
}
|
|
65
68
|
context.hasRuntimeConfig = Object.keys(runtimeConfig).some((k) => k !== "firebase");
|
|
66
69
|
const wantBuilds = await loadCodebases(context.config, options, firebaseConfig, runtimeConfig, context.filters);
|
|
@@ -84,7 +87,7 @@ async function prepare(context, options, payload) {
|
|
|
84
87
|
};
|
|
85
88
|
proto.convertIfPresent(userEnvOpt, localCfg, "configDir", (cd) => options.config.path(cd));
|
|
86
89
|
const userEnvs = functionsEnv.loadUserEnvs(userEnvOpt);
|
|
87
|
-
const envs =
|
|
90
|
+
const envs = { ...userEnvs, ...firebaseEnvs };
|
|
88
91
|
const { backend: wantBackend, envs: resolvedEnvs } = await build.resolveBackend({
|
|
89
92
|
build: wantBuild,
|
|
90
93
|
firebaseConfig,
|
|
@@ -96,8 +99,8 @@ async function prepare(context, options, payload) {
|
|
|
96
99
|
let hasEnvsFromParams = false;
|
|
97
100
|
wantBackend.environmentVariables = envs;
|
|
98
101
|
for (const envName of Object.keys(resolvedEnvs)) {
|
|
99
|
-
const isList =
|
|
100
|
-
const envValue =
|
|
102
|
+
const isList = resolvedEnvs[envName]?.legalList;
|
|
103
|
+
const envValue = resolvedEnvs[envName]?.toSDK();
|
|
101
104
|
if (envValue &&
|
|
102
105
|
!resolvedEnvs[envName].internal &&
|
|
103
106
|
(!Object.prototype.hasOwnProperty.call(wantBackend.environmentVariables, envName) || isList)) {
|
|
@@ -106,7 +109,7 @@ async function prepare(context, options, payload) {
|
|
|
106
109
|
}
|
|
107
110
|
}
|
|
108
111
|
for (const endpoint of backend.allEndpoints(wantBackend)) {
|
|
109
|
-
endpoint.environmentVariables =
|
|
112
|
+
endpoint.environmentVariables = { ...(wantBackend.environmentVariables || {}) };
|
|
110
113
|
let resource;
|
|
111
114
|
if (endpoint.platform === "gcfv1") {
|
|
112
115
|
resource = `projects/${endpoint.project}/locations/${endpoint.region}/functions/${endpoint.id}`;
|
|
@@ -155,15 +158,22 @@ async function prepare(context, options, payload) {
|
|
|
155
158
|
(0, utils_1.logLabeledBullet)("functions", `preparing ${clc.bold(sourceDirName)} directory for uploading...`);
|
|
156
159
|
}
|
|
157
160
|
if (backend.someEndpoint(wantBackend, (e) => e.platform === "gcfv2")) {
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
+
const schPathSet = new Set();
|
|
162
|
+
for (const e of backend.allEndpoints(wantBackend)) {
|
|
163
|
+
if (backend.isDataConnectGraphqlTriggered(e) &&
|
|
164
|
+
e.dataConnectGraphqlTrigger.schemaFilePath) {
|
|
165
|
+
schPathSet.add(e.dataConnectGraphqlTrigger.schemaFilePath);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const packagedSource = await (0, prepareFunctionsUpload_1.prepareFunctionsUpload)(options.config.projectDir, sourceDir, localCfg, [...schPathSet]);
|
|
169
|
+
source.functionsSourceV2 = packagedSource?.pathToSource;
|
|
170
|
+
source.functionsSourceV2Hash = packagedSource?.hash;
|
|
161
171
|
}
|
|
162
172
|
if (backend.someEndpoint(wantBackend, (e) => e.platform === "gcfv1")) {
|
|
163
173
|
const configForUpload = (0, projectConfig_1.shouldUseRuntimeConfig)(localCfg) ? runtimeConfig : undefined;
|
|
164
|
-
const packagedSource = await (0, prepareFunctionsUpload_1.prepareFunctionsUpload)(sourceDir, localCfg, configForUpload);
|
|
165
|
-
source.functionsSourceV1 = packagedSource
|
|
166
|
-
source.functionsSourceV1Hash = packagedSource
|
|
174
|
+
const packagedSource = await (0, prepareFunctionsUpload_1.prepareFunctionsUpload)(options.config.projectDir, sourceDir, localCfg, [], configForUpload);
|
|
175
|
+
source.functionsSourceV1 = packagedSource?.pathToSource;
|
|
176
|
+
source.functionsSourceV1Hash = packagedSource?.hash;
|
|
167
177
|
}
|
|
168
178
|
context.sources[codebase] = source;
|
|
169
179
|
}
|
|
@@ -197,17 +207,18 @@ async function prepare(context, options, payload) {
|
|
|
197
207
|
updateEndpointTargetedStatus(wantBackends, context.filters || []);
|
|
198
208
|
(0, applyHash_1.applyBackendHashToBackends)(wantBackends, context);
|
|
199
209
|
}
|
|
200
|
-
exports.prepare = prepare;
|
|
201
210
|
function inferDetailsFromExisting(want, have, usedDotenv) {
|
|
202
|
-
var _a;
|
|
203
211
|
for (const wantE of backend.allEndpoints(want)) {
|
|
204
|
-
const haveE =
|
|
212
|
+
const haveE = have.endpoints[wantE.region]?.[wantE.id];
|
|
205
213
|
if (!haveE) {
|
|
206
214
|
continue;
|
|
207
215
|
}
|
|
208
216
|
wantE.runServiceId = haveE.runServiceId;
|
|
209
217
|
if (!usedDotenv) {
|
|
210
|
-
wantE.environmentVariables =
|
|
218
|
+
wantE.environmentVariables = {
|
|
219
|
+
...haveE.environmentVariables,
|
|
220
|
+
...wantE.environmentVariables,
|
|
221
|
+
};
|
|
211
222
|
}
|
|
212
223
|
if (typeof wantE.availableMemoryMb === "undefined" && haveE.availableMemoryMb) {
|
|
213
224
|
wantE.availableMemoryMb = haveE.availableMemoryMb;
|
|
@@ -219,7 +230,6 @@ function inferDetailsFromExisting(want, have, usedDotenv) {
|
|
|
219
230
|
maybeCopyTriggerRegion(wantE, haveE);
|
|
220
231
|
}
|
|
221
232
|
}
|
|
222
|
-
exports.inferDetailsFromExisting = inferDetailsFromExisting;
|
|
223
233
|
function maybeCopyTriggerRegion(wantE, haveE) {
|
|
224
234
|
if (!backend.isEventTriggered(wantE) || !backend.isEventTriggered(haveE)) {
|
|
225
235
|
return;
|
|
@@ -240,9 +250,7 @@ function updateEndpointTargetedStatus(wantBackends, endpointFilters) {
|
|
|
240
250
|
}
|
|
241
251
|
}
|
|
242
252
|
}
|
|
243
|
-
exports.updateEndpointTargetedStatus = updateEndpointTargetedStatus;
|
|
244
253
|
function inferBlockingDetails(want) {
|
|
245
|
-
var _a, _b, _c;
|
|
246
254
|
const authBlockingEndpoints = backend
|
|
247
255
|
.allEndpoints(want)
|
|
248
256
|
.filter((ep) => backend.isBlockingTriggered(ep) &&
|
|
@@ -254,9 +262,9 @@ function inferBlockingDetails(want) {
|
|
|
254
262
|
let idToken = false;
|
|
255
263
|
let refreshToken = false;
|
|
256
264
|
for (const blockingEp of authBlockingEndpoints) {
|
|
257
|
-
accessToken || (accessToken = !!
|
|
258
|
-
idToken || (idToken = !!
|
|
259
|
-
refreshToken || (refreshToken = !!
|
|
265
|
+
accessToken || (accessToken = !!blockingEp.blockingTrigger.options?.accessToken);
|
|
266
|
+
idToken || (idToken = !!blockingEp.blockingTrigger.options?.idToken);
|
|
267
|
+
refreshToken || (refreshToken = !!blockingEp.blockingTrigger.options?.refreshToken);
|
|
260
268
|
}
|
|
261
269
|
for (const blockingEp of authBlockingEndpoints) {
|
|
262
270
|
if (!blockingEp.blockingTrigger.options) {
|
|
@@ -267,7 +275,6 @@ function inferBlockingDetails(want) {
|
|
|
267
275
|
blockingEp.blockingTrigger.options.refreshToken = refreshToken;
|
|
268
276
|
}
|
|
269
277
|
}
|
|
270
|
-
exports.inferBlockingDetails = inferBlockingDetails;
|
|
271
278
|
function resolveCpuAndConcurrency(want) {
|
|
272
279
|
for (const e of backend.allEndpoints(want)) {
|
|
273
280
|
if (e.platform === "gcfv1") {
|
|
@@ -284,7 +291,6 @@ function resolveCpuAndConcurrency(want) {
|
|
|
284
291
|
}
|
|
285
292
|
}
|
|
286
293
|
}
|
|
287
|
-
exports.resolveCpuAndConcurrency = resolveCpuAndConcurrency;
|
|
288
294
|
async function loadCodebases(config, options, firebaseConfig, runtimeConfig, filters) {
|
|
289
295
|
const codebases = (0, functionsDeployHelper_1.targetCodebases)(config, filters);
|
|
290
296
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
@@ -321,24 +327,25 @@ async function loadCodebases(config, options, firebaseConfig, runtimeConfig, fil
|
|
|
321
327
|
const codebaseRuntimeConfig = (0, projectConfig_1.shouldUseRuntimeConfig)(codebaseConfig)
|
|
322
328
|
? runtimeConfig
|
|
323
329
|
: { firebase: firebaseConfig };
|
|
324
|
-
const discoveredBuild = await runtimeDelegate.discoverBuild(codebaseRuntimeConfig,
|
|
330
|
+
const discoveredBuild = await runtimeDelegate.discoverBuild(codebaseRuntimeConfig, {
|
|
331
|
+
...firebaseEnvs,
|
|
332
|
+
GOOGLE_CLOUD_QUOTA_PROJECT: projectId,
|
|
333
|
+
});
|
|
325
334
|
discoveredBuild.runtime = codebaseConfig.runtime;
|
|
326
335
|
build.applyPrefix(discoveredBuild, codebaseConfig.prefix || "");
|
|
327
336
|
wantBuilds[codebase] = discoveredBuild;
|
|
328
337
|
}
|
|
329
338
|
return wantBuilds;
|
|
330
339
|
}
|
|
331
|
-
exports.loadCodebases = loadCodebases;
|
|
332
340
|
async function warnIfNewGenkitFunctionIsMissingSecrets(have, want, options) {
|
|
333
341
|
if (options.force) {
|
|
334
342
|
return;
|
|
335
343
|
}
|
|
336
344
|
const newAndMissingSecrets = backend.allEndpoints(backend.matchingBackend(want, (e) => {
|
|
337
|
-
var _a;
|
|
338
345
|
if (!backend.isCallableTriggered(e) || !e.callableTrigger.genkitAction) {
|
|
339
346
|
return false;
|
|
340
347
|
}
|
|
341
|
-
if (
|
|
348
|
+
if (e.secretEnvironmentVariables?.length) {
|
|
342
349
|
return false;
|
|
343
350
|
}
|
|
344
351
|
return !backend.hasEndpoint(have)(e);
|
|
@@ -352,7 +359,6 @@ async function warnIfNewGenkitFunctionIsMissingSecrets(have, want, options) {
|
|
|
352
359
|
}
|
|
353
360
|
}
|
|
354
361
|
}
|
|
355
|
-
exports.warnIfNewGenkitFunctionIsMissingSecrets = warnIfNewGenkitFunctionIsMissingSecrets;
|
|
356
362
|
async function ensureAllRequiredAPIsEnabled(projectNumber, wantBackend) {
|
|
357
363
|
await Promise.all(Object.values(wantBackend.requiredAPIs).map(({ api }) => {
|
|
358
364
|
return ensureApiEnabled.ensure(projectNumber, api, "functions", false);
|
|
@@ -373,4 +379,3 @@ async function ensureAllRequiredAPIsEnabled(projectNumber, wantBackend) {
|
|
|
373
379
|
await ensureApiEnabled.ensure(projectNumber, (0, api_1.secretManagerOrigin)(), "functions", false);
|
|
374
380
|
}
|
|
375
381
|
}
|
|
376
|
-
exports.ensureAllRequiredAPIsEnabled = ensureAllRequiredAPIsEnabled;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getFunctionsConfig = getFunctionsConfig;
|
|
4
|
+
exports.prepareFunctionsUpload = prepareFunctionsUpload;
|
|
5
|
+
exports.convertToSortedKeyValueArray = convertToSortedKeyValueArray;
|
|
4
6
|
const archiver = require("archiver");
|
|
5
7
|
const clc = require("colorette");
|
|
6
8
|
const filesize = require("filesize");
|
|
@@ -15,13 +17,12 @@ const utils = require("../../utils");
|
|
|
15
17
|
const fsAsync = require("../../fsAsync");
|
|
16
18
|
const CONFIG_DEST_FILE = ".runtimeconfig.json";
|
|
17
19
|
async function getFunctionsConfig(projectId) {
|
|
18
|
-
var _a, _b;
|
|
19
20
|
try {
|
|
20
21
|
return await functionsConfig.materializeAll(projectId);
|
|
21
22
|
}
|
|
22
23
|
catch (err) {
|
|
23
24
|
logger_1.logger.debug(err);
|
|
24
|
-
let errorCode =
|
|
25
|
+
let errorCode = err?.context?.response?.statusCode;
|
|
25
26
|
if (!errorCode) {
|
|
26
27
|
logger_1.logger.debug("Got unexpected error from Runtime Config; it has no status code:", err);
|
|
27
28
|
errorCode = 500;
|
|
@@ -35,16 +36,15 @@ async function getFunctionsConfig(projectId) {
|
|
|
35
36
|
}
|
|
36
37
|
return {};
|
|
37
38
|
}
|
|
38
|
-
exports.getFunctionsConfig = getFunctionsConfig;
|
|
39
39
|
async function pipeAsync(from, to) {
|
|
40
40
|
from.pipe(to);
|
|
41
41
|
await from.finalize();
|
|
42
42
|
return new Promise((resolve, reject) => {
|
|
43
|
-
to.on("finish", resolve);
|
|
43
|
+
to.on("finish", () => resolve());
|
|
44
44
|
to.on("error", reject);
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
|
-
async function packageSource(sourceDir, config, runtimeConfig) {
|
|
47
|
+
async function packageSource(projectDir, sourceDir, config, additionalSources, runtimeConfig) {
|
|
48
48
|
const tmpFile = tmp.fileSync({ prefix: "firebase-functions-", postfix: ".zip" }).name;
|
|
49
49
|
const fileStream = fs.createWriteStream(tmpFile, {
|
|
50
50
|
flags: "w",
|
|
@@ -65,6 +65,19 @@ async function packageSource(sourceDir, config, runtimeConfig) {
|
|
|
65
65
|
mode: file.mode,
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
|
+
for (const name of additionalSources) {
|
|
69
|
+
const absPath = utils.resolveWithin(projectDir, name);
|
|
70
|
+
if (!fs.existsSync(absPath)) {
|
|
71
|
+
throw new error_1.FirebaseError(clc.bold(absPath) + " does not exist.", { exit: 1 });
|
|
72
|
+
}
|
|
73
|
+
const mode = fs.statSync(absPath).mode;
|
|
74
|
+
const fileHash = await (0, hash_1.getSourceHash)(absPath);
|
|
75
|
+
hashes.push(fileHash);
|
|
76
|
+
archive.file(absPath, {
|
|
77
|
+
name,
|
|
78
|
+
mode,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
68
81
|
if (typeof runtimeConfig !== "undefined") {
|
|
69
82
|
const runtimeConfigHashString = JSON.stringify(convertToSortedKeyValueArray(runtimeConfig));
|
|
70
83
|
hashes.push(runtimeConfigHashString);
|
|
@@ -80,6 +93,9 @@ async function packageSource(sourceDir, config, runtimeConfig) {
|
|
|
80
93
|
await pipeAsync(archive, fileStream);
|
|
81
94
|
}
|
|
82
95
|
catch (err) {
|
|
96
|
+
if (err instanceof error_1.FirebaseError) {
|
|
97
|
+
throw err;
|
|
98
|
+
}
|
|
83
99
|
throw new error_1.FirebaseError("Could not read source directory. Remove links and shortcuts and try again.", {
|
|
84
100
|
original: err,
|
|
85
101
|
exit: 1,
|
|
@@ -94,10 +110,9 @@ async function packageSource(sourceDir, config, runtimeConfig) {
|
|
|
94
110
|
const hash = hashes.join(".");
|
|
95
111
|
return { pathToSource: tmpFile, hash };
|
|
96
112
|
}
|
|
97
|
-
async function prepareFunctionsUpload(sourceDir, config, runtimeConfig) {
|
|
98
|
-
return packageSource(sourceDir, config, runtimeConfig);
|
|
113
|
+
async function prepareFunctionsUpload(projectDir, sourceDir, config, additionalSources, runtimeConfig) {
|
|
114
|
+
return packageSource(projectDir, sourceDir, config, additionalSources, runtimeConfig);
|
|
99
115
|
}
|
|
100
|
-
exports.prepareFunctionsUpload = prepareFunctionsUpload;
|
|
101
116
|
function convertToSortedKeyValueArray(config) {
|
|
102
117
|
if (typeof config !== "object" || config === null)
|
|
103
118
|
return config;
|
|
@@ -107,4 +122,3 @@ function convertToSortedKeyValueArray(config) {
|
|
|
107
122
|
return { key, value: convertToSortedKeyValueArray(config[key]) };
|
|
108
123
|
});
|
|
109
124
|
}
|
|
110
|
-
exports.convertToSortedKeyValueArray = convertToSortedKeyValueArray;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.V2_FREE_TIER = exports.V1_FREE_TIER = exports.V2_RATES = exports.V1_RATES = void 0;
|
|
4
|
+
exports.canCalculateMinInstanceCost = canCalculateMinInstanceCost;
|
|
5
|
+
exports.monthlyMinInstanceCost = monthlyMinInstanceCost;
|
|
4
6
|
const backend = require("./backend");
|
|
5
7
|
const V1_REGION_TO_TIER = {
|
|
6
8
|
"us-central1": 1,
|
|
@@ -124,7 +126,6 @@ function canCalculateMinInstanceCost(endpoint) {
|
|
|
124
126
|
}
|
|
125
127
|
return true;
|
|
126
128
|
}
|
|
127
|
-
exports.canCalculateMinInstanceCost = canCalculateMinInstanceCost;
|
|
128
129
|
const SECONDS_PER_MONTH = 30 * 24 * 60 * 60;
|
|
129
130
|
function monthlyMinInstanceCost(endpoints) {
|
|
130
131
|
const usage = {
|
|
@@ -175,4 +176,3 @@ function monthlyMinInstanceCost(endpoints) {
|
|
|
175
176
|
runCpuBill = Math.max(runCpuBill, 0);
|
|
176
177
|
return v1MemoryBill + v1CpuBill + v2MemoryBill + v2CpuBill + runMemoryBill + runCpuBill;
|
|
177
178
|
}
|
|
178
|
-
exports.monthlyMinInstanceCost = monthlyMinInstanceCost;
|