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
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.listLocations = listLocations;
|
|
4
|
+
exports.getService = getService;
|
|
5
|
+
exports.listAllServices = listAllServices;
|
|
6
|
+
exports.createService = createService;
|
|
7
|
+
exports.deleteService = deleteService;
|
|
8
|
+
exports.getSchema = getSchema;
|
|
9
|
+
exports.listSchemas = listSchemas;
|
|
10
|
+
exports.upsertSchema = upsertSchema;
|
|
11
|
+
exports.deleteSchema = deleteSchema;
|
|
12
|
+
exports.getConnector = getConnector;
|
|
13
|
+
exports.deleteConnector = deleteConnector;
|
|
14
|
+
exports.listConnectors = listConnectors;
|
|
15
|
+
exports.upsertConnector = upsertConnector;
|
|
4
16
|
const api_1 = require("../api");
|
|
5
17
|
const apiv2_1 = require("../apiv2");
|
|
6
18
|
const operationPoller = require("../operation-poller");
|
|
@@ -13,22 +25,17 @@ const dataconnectClient = () => new apiv2_1.Client({
|
|
|
13
25
|
auth: true,
|
|
14
26
|
});
|
|
15
27
|
async function listLocations(projectId) {
|
|
16
|
-
var _a, _b, _c;
|
|
17
28
|
const res = await dataconnectClient().get(`/projects/${projectId}/locations`);
|
|
18
|
-
return
|
|
29
|
+
return res.body?.locations?.map((l) => l.locationId) ?? [];
|
|
19
30
|
}
|
|
20
|
-
exports.listLocations = listLocations;
|
|
21
31
|
async function getService(serviceName) {
|
|
22
32
|
const res = await dataconnectClient().get(serviceName);
|
|
23
33
|
return res.body;
|
|
24
34
|
}
|
|
25
|
-
exports.getService = getService;
|
|
26
35
|
async function listAllServices(projectId) {
|
|
27
|
-
var _a;
|
|
28
36
|
const res = await dataconnectClient().get(`/projects/${projectId}/locations/-/services`);
|
|
29
|
-
return
|
|
37
|
+
return res.body.services ?? [];
|
|
30
38
|
}
|
|
31
|
-
exports.listAllServices = listAllServices;
|
|
32
39
|
async function createService(projectId, locationId, serviceId) {
|
|
33
40
|
try {
|
|
34
41
|
const op = await dataconnectClient().post(`/projects/${projectId}/locations/${locationId}/services`, {
|
|
@@ -52,7 +59,6 @@ async function createService(projectId, locationId, serviceId) {
|
|
|
52
59
|
return undefined;
|
|
53
60
|
}
|
|
54
61
|
}
|
|
55
|
-
exports.createService = createService;
|
|
56
62
|
async function deleteService(serviceName) {
|
|
57
63
|
const op = await dataconnectClient().delete(serviceName, {
|
|
58
64
|
queryParams: { force: "true" },
|
|
@@ -64,7 +70,6 @@ async function deleteService(serviceName) {
|
|
|
64
70
|
});
|
|
65
71
|
return pollRes;
|
|
66
72
|
}
|
|
67
|
-
exports.deleteService = deleteService;
|
|
68
73
|
async function getSchema(serviceName, schemaId = types.MAIN_SCHEMA_ID) {
|
|
69
74
|
try {
|
|
70
75
|
const res = await dataconnectClient().get(`${serviceName}/schemas/${schemaId}`);
|
|
@@ -77,7 +82,6 @@ async function getSchema(serviceName, schemaId = types.MAIN_SCHEMA_ID) {
|
|
|
77
82
|
return undefined;
|
|
78
83
|
}
|
|
79
84
|
}
|
|
80
|
-
exports.getSchema = getSchema;
|
|
81
85
|
async function listSchemas(serviceName, fields = []) {
|
|
82
86
|
const schemas = [];
|
|
83
87
|
const getNextPage = async (pageToken = "") => {
|
|
@@ -96,7 +100,6 @@ async function listSchemas(serviceName, fields = []) {
|
|
|
96
100
|
await getNextPage();
|
|
97
101
|
return schemas;
|
|
98
102
|
}
|
|
99
|
-
exports.listSchemas = listSchemas;
|
|
100
103
|
async function upsertSchema(schema, validateOnly = false, async = false) {
|
|
101
104
|
const op = await dataconnectClient().patch(`${schema.name}`, schema, {
|
|
102
105
|
queryParams: {
|
|
@@ -114,7 +117,6 @@ async function upsertSchema(schema, validateOnly = false, async = false) {
|
|
|
114
117
|
masterTimeout: 10000,
|
|
115
118
|
});
|
|
116
119
|
}
|
|
117
|
-
exports.upsertSchema = upsertSchema;
|
|
118
120
|
async function deleteSchema(serviceName) {
|
|
119
121
|
const op = await dataconnectClient().delete(`${serviceName}/schemas/${types.MAIN_SCHEMA_ID}`);
|
|
120
122
|
await operationPoller.pollOperation({
|
|
@@ -124,12 +126,10 @@ async function deleteSchema(serviceName) {
|
|
|
124
126
|
});
|
|
125
127
|
return;
|
|
126
128
|
}
|
|
127
|
-
exports.deleteSchema = deleteSchema;
|
|
128
129
|
async function getConnector(name) {
|
|
129
130
|
const res = await dataconnectClient().get(name);
|
|
130
131
|
return res.body;
|
|
131
132
|
}
|
|
132
|
-
exports.getConnector = getConnector;
|
|
133
133
|
async function deleteConnector(name) {
|
|
134
134
|
const op = await dataconnectClient().delete(name);
|
|
135
135
|
await operationPoller.pollOperation({
|
|
@@ -139,7 +139,6 @@ async function deleteConnector(name) {
|
|
|
139
139
|
});
|
|
140
140
|
return;
|
|
141
141
|
}
|
|
142
|
-
exports.deleteConnector = deleteConnector;
|
|
143
142
|
async function listConnectors(serviceName, fields = []) {
|
|
144
143
|
const connectors = [];
|
|
145
144
|
const getNextPage = async (pageToken = "") => {
|
|
@@ -158,7 +157,6 @@ async function listConnectors(serviceName, fields = []) {
|
|
|
158
157
|
await getNextPage();
|
|
159
158
|
return connectors;
|
|
160
159
|
}
|
|
161
|
-
exports.listConnectors = listConnectors;
|
|
162
160
|
async function upsertConnector(connector) {
|
|
163
161
|
const op = await dataconnectClient().patch(`${connector.name}?allow_missing=true`, connector);
|
|
164
162
|
const pollRes = await operationPoller.pollOperation({
|
|
@@ -168,4 +166,3 @@ async function upsertConnector(connector) {
|
|
|
168
166
|
});
|
|
169
167
|
return pollRes;
|
|
170
168
|
}
|
|
171
|
-
exports.upsertConnector = upsertConnector;
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.DATACONNECT_API_VERSION = exports.dataconnectOrigin = void 0;
|
|
4
|
+
exports.dataconnectDataplaneClient = dataconnectDataplaneClient;
|
|
5
|
+
exports.executeGraphQL = executeGraphQL;
|
|
6
|
+
exports.executeGraphQLRead = executeGraphQLRead;
|
|
7
|
+
exports.executeGraphQLQuery = executeGraphQLQuery;
|
|
8
|
+
exports.executeGraphQLMutation = executeGraphQLMutation;
|
|
4
9
|
const api_1 = require("../api");
|
|
5
10
|
var api_2 = require("../api");
|
|
6
11
|
Object.defineProperty(exports, "dataconnectOrigin", { enumerable: true, get: function () { return api_2.dataconnectOrigin; } });
|
|
@@ -13,24 +18,19 @@ function dataconnectDataplaneClient() {
|
|
|
13
18
|
auth: true,
|
|
14
19
|
});
|
|
15
20
|
}
|
|
16
|
-
exports.dataconnectDataplaneClient = dataconnectDataplaneClient;
|
|
17
21
|
async function executeGraphQL(client, servicePath, body) {
|
|
18
22
|
const res = await client.post(`${servicePath}:executeGraphql`, body, { resolveOnHTTPError: true });
|
|
19
23
|
return res;
|
|
20
24
|
}
|
|
21
|
-
exports.executeGraphQL = executeGraphQL;
|
|
22
25
|
async function executeGraphQLRead(client, servicePath, body) {
|
|
23
26
|
const res = await client.post(`${servicePath}:executeGraphqlRead`, body, { resolveOnHTTPError: true });
|
|
24
27
|
return res;
|
|
25
28
|
}
|
|
26
|
-
exports.executeGraphQLRead = executeGraphQLRead;
|
|
27
29
|
async function executeGraphQLQuery(client, connectorPath, body) {
|
|
28
30
|
const res = await client.post(`${connectorPath}:executeQuery`, body, { resolveOnHTTPError: true });
|
|
29
31
|
return res;
|
|
30
32
|
}
|
|
31
|
-
exports.executeGraphQLQuery = executeGraphQLQuery;
|
|
32
33
|
async function executeGraphQLMutation(client, connectorPath, body) {
|
|
33
34
|
const res = await client.post(`${connectorPath}:executeMutation`, body, { resolveOnHTTPError: true });
|
|
34
35
|
return res;
|
|
35
36
|
}
|
|
36
|
-
exports.executeGraphQLMutation = executeGraphQLMutation;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.ensureApis = ensureApis;
|
|
4
|
+
exports.ensureGIFApiTos = ensureGIFApiTos;
|
|
4
5
|
const api = require("../api");
|
|
5
6
|
const configstore_1 = require("../configstore");
|
|
6
7
|
const ensureApiEnabled_1 = require("../ensureApiEnabled");
|
|
@@ -11,7 +12,6 @@ async function ensureApis(projectId, silent = false) {
|
|
|
11
12
|
(0, ensureApiEnabled_1.ensure)(projectId, api.cloudSQLAdminOrigin(), prefix, silent),
|
|
12
13
|
]);
|
|
13
14
|
}
|
|
14
|
-
exports.ensureApis = ensureApis;
|
|
15
15
|
async function ensureGIFApiTos(projectId) {
|
|
16
16
|
if (configstore_1.configstore.get("gemini")) {
|
|
17
17
|
await (0, ensureApiEnabled_1.ensure)(projectId, api.cloudAiCompanionOrigin(), "");
|
|
@@ -23,4 +23,3 @@ async function ensureGIFApiTos(projectId) {
|
|
|
23
23
|
}
|
|
24
24
|
return true;
|
|
25
25
|
}
|
|
26
|
-
exports.ensureGIFApiTos = ensureGIFApiTos;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getIncompatibleSchemaError = getIncompatibleSchemaError;
|
|
4
|
+
exports.getInvalidConnectors = getInvalidConnectors;
|
|
5
|
+
exports.getGQLErrors = getGQLErrors;
|
|
4
6
|
const graphqlError_1 = require("./graphqlError");
|
|
5
7
|
const INCOMPATIBLE_SCHEMA_ERROR_TYPESTRING = "IncompatibleSqlSchemaError";
|
|
6
8
|
const PRECONDITION_ERROR_TYPESTRING = "type.googleapis.com/google.rpc.PreconditionFailure";
|
|
@@ -19,27 +21,22 @@ function getIncompatibleSchemaError(err) {
|
|
|
19
21
|
incompatible.violationType = violationTypes[0];
|
|
20
22
|
return incompatible;
|
|
21
23
|
}
|
|
22
|
-
exports.getIncompatibleSchemaError = getIncompatibleSchemaError;
|
|
23
24
|
function getInvalidConnectors(err) {
|
|
24
|
-
var _a, _b;
|
|
25
25
|
const preconditionErrs = errorDetails(err, PRECONDITION_ERROR_TYPESTRING);
|
|
26
26
|
const invalidConns = [];
|
|
27
27
|
for (const preconditionErr of preconditionErrs) {
|
|
28
|
-
const incompatibleConnViolation =
|
|
29
|
-
const newConns =
|
|
28
|
+
const incompatibleConnViolation = preconditionErr?.violations?.filter((v) => v.type === INCOMPATIBLE_CONNECTOR_TYPE);
|
|
29
|
+
const newConns = incompatibleConnViolation?.map((i) => i.subject) ?? [];
|
|
30
30
|
invalidConns.push(...newConns);
|
|
31
31
|
}
|
|
32
32
|
return invalidConns;
|
|
33
33
|
}
|
|
34
|
-
exports.getInvalidConnectors = getInvalidConnectors;
|
|
35
34
|
function getGQLErrors(err) {
|
|
36
35
|
const gqlErrs = errorDetails(err, "GraphqlError");
|
|
37
36
|
return gqlErrs.map(graphqlError_1.prettify).join("\n");
|
|
38
37
|
}
|
|
39
|
-
exports.getGQLErrors = getGQLErrors;
|
|
40
38
|
function errorDetails(err, ofType) {
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
return (details === null || details === void 0 ? void 0 : details.filter((d) => { var _a; return (_a = d["@type"]) === null || _a === void 0 ? void 0 : _a.includes(ofType); })) || [];
|
|
39
|
+
const original = err.context?.body?.error || err?.original;
|
|
40
|
+
const details = original?.details;
|
|
41
|
+
return details?.filter((d) => d["@type"]?.includes(ofType)) || [];
|
|
45
42
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getResourceFilters = getResourceFilters;
|
|
4
|
+
exports.toString = toString;
|
|
4
5
|
const error_1 = require("../error");
|
|
5
6
|
function getResourceFilters(options) {
|
|
6
7
|
if (!options.only) {
|
|
@@ -21,7 +22,6 @@ function getResourceFilters(options) {
|
|
|
21
22
|
}
|
|
22
23
|
return filters;
|
|
23
24
|
}
|
|
24
|
-
exports.getResourceFilters = getResourceFilters;
|
|
25
25
|
function parseSelector(selector) {
|
|
26
26
|
const parts = selector.split(":");
|
|
27
27
|
const filter = {
|
|
@@ -53,4 +53,3 @@ function toString(rf) {
|
|
|
53
53
|
}
|
|
54
54
|
return base;
|
|
55
55
|
}
|
|
56
|
-
exports.toString = toString;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.freeTrialTermsLink = freeTrialTermsLink;
|
|
4
|
+
exports.checkFreeTrialInstanceUsed = checkFreeTrialInstanceUsed;
|
|
5
|
+
exports.upgradeInstructions = upgradeInstructions;
|
|
4
6
|
const clc = require("colorette");
|
|
5
7
|
const cloudmonitoring_1 = require("../gcp/cloudmonitoring");
|
|
6
8
|
function freeTrialTermsLink() {
|
|
7
9
|
return "https://firebase.google.com/pricing";
|
|
8
10
|
}
|
|
9
|
-
exports.freeTrialTermsLink = freeTrialTermsLink;
|
|
10
11
|
const FREE_TRIAL_METRIC = "sqladmin.googleapis.com/fdc_lifetime_free_trial_per_project";
|
|
11
12
|
async function checkFreeTrialInstanceUsed(projectId) {
|
|
12
13
|
const past7d = new Date();
|
|
@@ -28,7 +29,6 @@ async function checkFreeTrialInstanceUsed(projectId) {
|
|
|
28
29
|
}
|
|
29
30
|
return used;
|
|
30
31
|
}
|
|
31
|
-
exports.checkFreeTrialInstanceUsed = checkFreeTrialInstanceUsed;
|
|
32
32
|
function upgradeInstructions(projectId, trialUsed) {
|
|
33
33
|
return `To provision a ${trialUsed ? "paid CloudSQL Postgres instance" : "CloudSQL Postgres instance on the Firebase Data Connect no-cost trial"}:
|
|
34
34
|
|
|
@@ -38,4 +38,3 @@ function upgradeInstructions(projectId, trialUsed) {
|
|
|
38
38
|
|
|
39
39
|
2. Run ${clc.bold("firebase deploy --only dataconnect")} to deploy your Data Connect service.`;
|
|
40
40
|
}
|
|
41
|
-
exports.upgradeInstructions = upgradeInstructions;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.prettify = prettify;
|
|
4
|
+
exports.prettifyTable = prettifyTable;
|
|
4
5
|
const Table = require("cli-table3");
|
|
5
6
|
function prettify(err) {
|
|
6
|
-
var _a, _b, _c, _d;
|
|
7
7
|
let message = err.message;
|
|
8
|
-
let header =
|
|
8
|
+
let header = err.extensions?.file ?? "";
|
|
9
9
|
if (err.locations && err.locations.length) {
|
|
10
|
-
const line =
|
|
10
|
+
const line = err.locations[0]?.line ?? "";
|
|
11
11
|
if (line) {
|
|
12
12
|
header += `:${line}`;
|
|
13
13
|
}
|
|
@@ -31,7 +31,6 @@ function prettify(err) {
|
|
|
31
31
|
}
|
|
32
32
|
return header.length ? `${header}: ${message}` : message;
|
|
33
33
|
}
|
|
34
|
-
exports.prettify = prettify;
|
|
35
34
|
function splitIssueMessage(err) {
|
|
36
35
|
const msg = err.message.split(": ");
|
|
37
36
|
if (msg.length >= 2) {
|
|
@@ -40,7 +39,6 @@ function splitIssueMessage(err) {
|
|
|
40
39
|
return ["", err.message];
|
|
41
40
|
}
|
|
42
41
|
function prettifyTable(errs) {
|
|
43
|
-
var _a, _b;
|
|
44
42
|
const table = new Table({
|
|
45
43
|
head: ["Type", "Issue", "Workaround", "Reason"],
|
|
46
44
|
style: { head: ["yellow"] },
|
|
@@ -51,7 +49,7 @@ function prettifyTable(errs) {
|
|
|
51
49
|
for (const e of errs) {
|
|
52
50
|
const msg = splitIssueMessage(e);
|
|
53
51
|
e.message = msg[1];
|
|
54
|
-
if (!
|
|
52
|
+
if (!e.extensions?.workarounds?.length) {
|
|
55
53
|
table.push([msg[0], prettify(e), "", ""]);
|
|
56
54
|
}
|
|
57
55
|
else {
|
|
@@ -68,4 +66,3 @@ function prettifyTable(errs) {
|
|
|
68
66
|
}
|
|
69
67
|
return table.toString();
|
|
70
68
|
}
|
|
71
|
-
exports.prettifyTable = prettifyTable;
|
package/lib/dataconnect/load.js
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.pickOneService = pickOneService;
|
|
4
|
+
exports.pickServices = pickServices;
|
|
5
|
+
exports.loadAll = loadAll;
|
|
6
|
+
exports.load = load;
|
|
7
|
+
exports.readFirebaseJson = readFirebaseJson;
|
|
8
|
+
exports.readDataConnectYaml = readDataConnectYaml;
|
|
9
|
+
exports.readConnectorYaml = readConnectorYaml;
|
|
10
|
+
exports.readGQLFiles = readGQLFiles;
|
|
11
|
+
exports.squashGraphQL = squashGraphQL;
|
|
4
12
|
const path = require("path");
|
|
5
13
|
const fs = require("fs-extra");
|
|
6
14
|
const clc = require("colorette");
|
|
@@ -17,7 +25,6 @@ async function pickOneService(projectId, config, service, location) {
|
|
|
17
25
|
}
|
|
18
26
|
return services[0];
|
|
19
27
|
}
|
|
20
|
-
exports.pickOneService = pickOneService;
|
|
21
28
|
async function pickServices(projectId, config, serviceId, location) {
|
|
22
29
|
const serviceInfos = await loadAll(projectId, config);
|
|
23
30
|
if (serviceInfos.length === 0) {
|
|
@@ -32,12 +39,10 @@ async function pickServices(projectId, config, serviceId, location) {
|
|
|
32
39
|
}
|
|
33
40
|
return matchingServices;
|
|
34
41
|
}
|
|
35
|
-
exports.pickServices = pickServices;
|
|
36
42
|
async function loadAll(projectId, config) {
|
|
37
43
|
const serviceCfgs = readFirebaseJson(config);
|
|
38
44
|
return await Promise.all(serviceCfgs.map((c) => load(projectId, config, c.source)));
|
|
39
45
|
}
|
|
40
|
-
exports.loadAll = loadAll;
|
|
41
46
|
async function load(projectId, config, sourceDirectory) {
|
|
42
47
|
const resolvedDir = config.path(sourceDirectory);
|
|
43
48
|
const dataConnectYaml = await readDataConnectYaml(resolvedDir);
|
|
@@ -77,9 +82,8 @@ async function load(projectId, config, sourceDirectory) {
|
|
|
77
82
|
connectorInfo,
|
|
78
83
|
};
|
|
79
84
|
}
|
|
80
|
-
exports.load = load;
|
|
81
85
|
function readFirebaseJson(config) {
|
|
82
|
-
if (!
|
|
86
|
+
if (!config?.has("dataconnect")) {
|
|
83
87
|
return [];
|
|
84
88
|
}
|
|
85
89
|
const validator = (cfg) => {
|
|
@@ -101,13 +105,11 @@ function readFirebaseJson(config) {
|
|
|
101
105
|
throw new error_1.FirebaseError("Invalid firebase.json: dataconnect should be of the form { source: string }");
|
|
102
106
|
}
|
|
103
107
|
}
|
|
104
|
-
exports.readFirebaseJson = readFirebaseJson;
|
|
105
108
|
async function readDataConnectYaml(sourceDirectory) {
|
|
106
109
|
const file = await (0, utils_1.readFileFromDirectory)(sourceDirectory, "dataconnect.yaml");
|
|
107
110
|
const dataconnectYaml = await (0, utils_1.wrappedSafeLoad)(file.source);
|
|
108
111
|
return validateDataConnectYaml(dataconnectYaml);
|
|
109
112
|
}
|
|
110
|
-
exports.readDataConnectYaml = readDataConnectYaml;
|
|
111
113
|
function validateDataConnectYaml(unvalidated) {
|
|
112
114
|
if (!unvalidated["location"]) {
|
|
113
115
|
throw new error_1.FirebaseError("Missing required field 'location' in dataconnect.yaml");
|
|
@@ -125,7 +127,6 @@ async function readConnectorYaml(sourceDirectory) {
|
|
|
125
127
|
const connectorYaml = await (0, utils_1.wrappedSafeLoad)(file.source);
|
|
126
128
|
return validateConnectorYaml(connectorYaml);
|
|
127
129
|
}
|
|
128
|
-
exports.readConnectorYaml = readConnectorYaml;
|
|
129
130
|
function validateConnectorYaml(unvalidated) {
|
|
130
131
|
return unvalidated;
|
|
131
132
|
}
|
|
@@ -136,7 +137,6 @@ async function readGQLFiles(sourceDir) {
|
|
|
136
137
|
const files = await (0, glob_1.glob)("**/*.{gql,graphql}", { cwd: sourceDir, absolute: true, nodir: true });
|
|
137
138
|
return files.map((f) => toFile(sourceDir, f));
|
|
138
139
|
}
|
|
139
|
-
exports.readGQLFiles = readGQLFiles;
|
|
140
140
|
function toFile(sourceDir, fullPath) {
|
|
141
141
|
const relPath = path.relative(sourceDir, fullPath);
|
|
142
142
|
if (!fs.existsSync(fullPath)) {
|
|
@@ -166,4 +166,3 @@ function squashGraphQL(source) {
|
|
|
166
166
|
}
|
|
167
167
|
return query;
|
|
168
168
|
}
|
|
169
|
-
exports.squashGraphQL = squashGraphQL;
|
package/lib/dataconnect/names.js
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.parseServiceName = parseServiceName;
|
|
4
|
+
exports.parseConnectorName = parseConnectorName;
|
|
5
|
+
exports.parseCloudSQLInstanceName = parseCloudSQLInstanceName;
|
|
6
|
+
exports.isGraphqlName = isGraphqlName;
|
|
4
7
|
const error_1 = require("../error");
|
|
5
8
|
const serviceNameRegex = /projects\/(?<projectId>[^\/]+)\/locations\/(?<location>[^\/]+)\/services\/(?<serviceId>[^\/]+)/;
|
|
6
9
|
function parseServiceName(serviceName) {
|
|
7
|
-
var _a, _b, _c;
|
|
8
10
|
const res = serviceNameRegex.exec(serviceName);
|
|
9
|
-
const projectId =
|
|
10
|
-
const location =
|
|
11
|
-
const serviceId =
|
|
11
|
+
const projectId = res?.groups?.projectId;
|
|
12
|
+
const location = res?.groups?.location;
|
|
13
|
+
const serviceId = res?.groups?.serviceId;
|
|
12
14
|
if (!projectId || !location || !serviceId) {
|
|
13
15
|
throw new error_1.FirebaseError(`${serviceName} is not a valid service name`);
|
|
14
16
|
}
|
|
@@ -22,15 +24,13 @@ function parseServiceName(serviceName) {
|
|
|
22
24
|
toString,
|
|
23
25
|
};
|
|
24
26
|
}
|
|
25
|
-
exports.parseServiceName = parseServiceName;
|
|
26
27
|
const connectorNameRegex = /projects\/(?<projectId>[^\/]+)\/locations\/(?<location>[^\/]+)\/services\/(?<serviceId>[^\/]+)\/connectors\/(?<connectorId>[^\/]+)/;
|
|
27
28
|
function parseConnectorName(connectorName) {
|
|
28
|
-
var _a, _b, _c, _d;
|
|
29
29
|
const res = connectorNameRegex.exec(connectorName);
|
|
30
|
-
const projectId =
|
|
31
|
-
const location =
|
|
32
|
-
const serviceId =
|
|
33
|
-
const connectorId =
|
|
30
|
+
const projectId = res?.groups?.projectId;
|
|
31
|
+
const location = res?.groups?.location;
|
|
32
|
+
const serviceId = res?.groups?.serviceId;
|
|
33
|
+
const connectorId = res?.groups?.connectorId;
|
|
34
34
|
if (!projectId || !location || !serviceId || !connectorId) {
|
|
35
35
|
throw new error_1.FirebaseError(`${connectorName} is not a valid connector name`);
|
|
36
36
|
}
|
|
@@ -45,14 +45,12 @@ function parseConnectorName(connectorName) {
|
|
|
45
45
|
toString,
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
|
-
exports.parseConnectorName = parseConnectorName;
|
|
49
48
|
const cloudSQLInstanceNameRegex = /projects\/(?<projectId>[^\/]+)\/locations\/(?<location>[^\/]+)\/instances\/(?<instanceId>[^\/]+)/;
|
|
50
49
|
function parseCloudSQLInstanceName(cloudSQLInstanceName) {
|
|
51
|
-
var _a, _b, _c;
|
|
52
50
|
const res = cloudSQLInstanceNameRegex.exec(cloudSQLInstanceName);
|
|
53
|
-
const projectId =
|
|
54
|
-
const location =
|
|
55
|
-
const instanceId =
|
|
51
|
+
const projectId = res?.groups?.projectId;
|
|
52
|
+
const location = res?.groups?.location;
|
|
53
|
+
const instanceId = res?.groups?.instanceId;
|
|
56
54
|
if (!projectId || !location || !instanceId) {
|
|
57
55
|
throw new error_1.FirebaseError(`${cloudSQLInstanceName} is not a valid cloudSQL instance name`);
|
|
58
56
|
}
|
|
@@ -66,9 +64,7 @@ function parseCloudSQLInstanceName(cloudSQLInstanceName) {
|
|
|
66
64
|
toString,
|
|
67
65
|
};
|
|
68
66
|
}
|
|
69
|
-
exports.parseCloudSQLInstanceName = parseCloudSQLInstanceName;
|
|
70
67
|
const graphqlNameRegex = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
71
68
|
function isGraphqlName(name) {
|
|
72
69
|
return graphqlNameRegex.test(name);
|
|
73
70
|
}
|
|
74
|
-
exports.isGraphqlName = isGraphqlName;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.promptDeleteConnector =
|
|
3
|
+
exports.promptDeleteConnector = promptDeleteConnector;
|
|
4
4
|
const prompt_1 = require("../prompt");
|
|
5
5
|
const utils = require("../utils");
|
|
6
6
|
const client_1 = require("./client");
|
|
@@ -17,4 +17,3 @@ async function promptDeleteConnector(options, connectorName) {
|
|
|
17
17
|
utils.logLabeledSuccess("dataconnect", `Connector ${connectorName} deleted`);
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
exports.promptDeleteConnector = promptDeleteConnector;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.setupCloudSql = setupCloudSql;
|
|
4
|
+
exports.cloudSQLBeingCreated = cloudSQLBeingCreated;
|
|
5
|
+
exports.getUpdateReason = getUpdateReason;
|
|
4
6
|
const clc = require("colorette");
|
|
5
7
|
const cloudSqlAdminClient = require("../gcp/cloudsql/cloudsqladmin");
|
|
6
8
|
const logger_1 = require("../logger");
|
|
@@ -12,13 +14,12 @@ const utils = require("../utils");
|
|
|
12
14
|
const cloudbilling_1 = require("../gcp/cloudbilling");
|
|
13
15
|
const GOOGLE_ML_INTEGRATION_ROLE = "roles/aiplatform.user";
|
|
14
16
|
async function setupCloudSql(args) {
|
|
15
|
-
var _a;
|
|
16
17
|
const { projectId, instanceId, requireGoogleMlIntegration, dryRun } = args;
|
|
17
18
|
const startTime = Date.now();
|
|
18
19
|
const stats = { action: "get" };
|
|
19
20
|
let success = false;
|
|
20
21
|
try {
|
|
21
|
-
await upsertInstance(stats,
|
|
22
|
+
await upsertInstance(stats, { ...args });
|
|
22
23
|
success = true;
|
|
23
24
|
}
|
|
24
25
|
finally {
|
|
@@ -28,7 +29,7 @@ async function setupCloudSql(args) {
|
|
|
28
29
|
action: success ? stats.action : `${stats.action}_error`,
|
|
29
30
|
location: args.location,
|
|
30
31
|
enable_google_ml_integration: args.requireGoogleMlIntegration.toString(),
|
|
31
|
-
database_version:
|
|
32
|
+
database_version: stats.databaseVersion?.toLowerCase() || "unknown",
|
|
32
33
|
dataconnect_label: stats.dataconnectLabel || "unknown",
|
|
33
34
|
}, Date.now() - startTime);
|
|
34
35
|
}
|
|
@@ -37,16 +38,14 @@ async function setupCloudSql(args) {
|
|
|
37
38
|
await (0, checkIam_1.grantRolesToCloudSqlServiceAccount)(projectId, instanceId, [GOOGLE_ML_INTEGRATION_ROLE]);
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
|
-
exports.setupCloudSql = setupCloudSql;
|
|
41
41
|
async function upsertInstance(stats, args) {
|
|
42
|
-
var _a, _b;
|
|
43
42
|
const { projectId, instanceId, requireGoogleMlIntegration, dryRun } = args;
|
|
44
43
|
try {
|
|
45
44
|
const existingInstance = await cloudSqlAdminClient.getInstance(projectId, instanceId);
|
|
46
45
|
utils.logLabeledBullet("dataconnect", `Found existing Cloud SQL instance ${clc.bold(instanceId)}.`);
|
|
47
46
|
stats.databaseVersion = existingInstance.databaseVersion;
|
|
48
47
|
stats.dataconnectLabel =
|
|
49
|
-
|
|
48
|
+
existingInstance.settings?.userLabels?.["firebase-data-connect"] || "absent";
|
|
50
49
|
const why = getUpdateReason(existingInstance, requireGoogleMlIntegration);
|
|
51
50
|
if (why) {
|
|
52
51
|
if (dryRun) {
|
|
@@ -61,7 +60,7 @@ async function upsertInstance(stats, args) {
|
|
|
61
60
|
await (0, utils_1.promiseWithSpinner)(() => cloudSqlAdminClient.updateInstanceForDataConnect(existingInstance, requireGoogleMlIntegration), "Updating your Cloud SQL instance...");
|
|
62
61
|
}
|
|
63
62
|
}
|
|
64
|
-
await upsertDatabase(
|
|
63
|
+
await upsertDatabase({ ...args });
|
|
65
64
|
}
|
|
66
65
|
catch (err) {
|
|
67
66
|
if (err.status !== 404) {
|
|
@@ -71,7 +70,7 @@ async function upsertInstance(stats, args) {
|
|
|
71
70
|
stats.databaseVersion = cloudSqlAdminClient.DEFAULT_DATABASE_VERSION;
|
|
72
71
|
const freeTrialUsed = await (0, freeTrial_1.checkFreeTrialInstanceUsed)(projectId);
|
|
73
72
|
stats.dataconnectLabel = freeTrialUsed ? "nt" : "ft";
|
|
74
|
-
await createInstance(
|
|
73
|
+
await createInstance({ ...args, freeTrialLabel: stats.dataconnectLabel });
|
|
75
74
|
}
|
|
76
75
|
}
|
|
77
76
|
async function createInstance(args) {
|
|
@@ -104,7 +103,6 @@ function cloudSQLBeingCreated(projectId, instanceId, isFreeTrial, billingEnabled
|
|
|
104
103
|
: `
|
|
105
104
|
Monitor its progress at\n\n\t${cloudSqlAdminClient.instanceConsoleLink(projectId, instanceId)}\n`));
|
|
106
105
|
}
|
|
107
|
-
exports.cloudSQLBeingCreated = cloudSQLBeingCreated;
|
|
108
106
|
async function upsertDatabase(args) {
|
|
109
107
|
const { projectId, instanceId, databaseId, dryRun } = args;
|
|
110
108
|
try {
|
|
@@ -127,14 +125,13 @@ async function upsertDatabase(args) {
|
|
|
127
125
|
}
|
|
128
126
|
}
|
|
129
127
|
function getUpdateReason(instance, requireGoogleMlIntegration) {
|
|
130
|
-
var _a, _b, _c, _d, _e, _f;
|
|
131
128
|
let reason = "";
|
|
132
129
|
const settings = instance.settings;
|
|
133
|
-
if (!
|
|
130
|
+
if (!settings.ipConfiguration?.ipv4Enabled) {
|
|
134
131
|
utils.logLabeledWarning("dataconnect", `Cloud SQL instance ${clc.bold(instance.name)} does not have a public IP.
|
|
135
132
|
${clc.bold("firebase dataconnect:sql:migrate")} will only work within its VPC (e.g. GCE, GKE).`);
|
|
136
|
-
if (
|
|
137
|
-
!
|
|
133
|
+
if (settings.ipConfiguration?.privateNetwork &&
|
|
134
|
+
!settings.ipConfiguration?.enablePrivatePathForGoogleCloudServices) {
|
|
138
135
|
reason += "\n - to enable Private Path for Google Cloud Services.";
|
|
139
136
|
}
|
|
140
137
|
}
|
|
@@ -142,14 +139,13 @@ function getUpdateReason(instance, requireGoogleMlIntegration) {
|
|
|
142
139
|
if (!settings.enableGoogleMlIntegration) {
|
|
143
140
|
reason += "\n - to enable Google ML integration.";
|
|
144
141
|
}
|
|
145
|
-
if (!
|
|
142
|
+
if (!settings.databaseFlags?.some((f) => f.name === "cloudsql.enable_google_ml_integration" && f.value === "on")) {
|
|
146
143
|
reason += "\n - to enable Google ML integration database flag.";
|
|
147
144
|
}
|
|
148
145
|
}
|
|
149
|
-
const isIamEnabled =
|
|
146
|
+
const isIamEnabled = settings.databaseFlags?.some((f) => f.name === "cloudsql.iam_authentication" && f.value === "on") ?? false;
|
|
150
147
|
if (!isIamEnabled) {
|
|
151
148
|
reason += "\n - to enable IAM authentication database flag.";
|
|
152
149
|
}
|
|
153
150
|
return reason;
|
|
154
151
|
}
|
|
155
|
-
exports.getUpdateReason = getUpdateReason;
|