Skip to content

Cleaning up help texts (and remove experimental:functions:shell) #8367

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Mar 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
- BREAKING(general)! Removed support for node 18.
- BREAKING(apphosting)! `init emulators` App Hosting flow now creates `apphosting.emulator.yaml` with references to live secrets rather than `apphosting.local.yaml` with saved plaintext. `apphosting:config:export` command has been removed (#8361)
- BREAKING(apphosting)! Removed `--location` flag from `apphosting` commands. Instead, commands now prompt for primary region as needed.
- BREAKING(dataconnect)! `deploy dataconnect` will now warn about unsafe connector changes and insecure operations.
- BREAKING(cloud functions)! `deploy functions` no longer aggressively tries to clean up functions artifacts. Instead, it sets up an Artifact Registry Cleanup Policy to clean these up automatically.
- BREAKING(dataconnect)! `deploy dataconnect` now warns about unsafe connector changes and insecure operations.
- BREAKING(cloud functions)! Removed the `experimental:functions:shell` command. Use `functions:shell` instead.
- Updated the Firebase Data Connect local toolkit to v2.0.0, which contains the following changes: (#8370)
- Added support for aggregate functions in queries.
- BREAKING: New types for Generated React SDKs.
Expand All @@ -11,7 +11,7 @@
- `apphosting:secrets:grantAccess` can now grant access to emails and can grant multiple secrets at once (#8357)
- `apphosting:secrets:set` now has flows to help with test secrets (#8359)
- Updated `init dataconnect` templates to `v1`.
- Fix bug in Auth emulator where accounts:lookup is case-sensitive for emails (#8344)
- Fix bug where function deploys didn't support shorthand notation and parameterized service account (#8366)
- Fixed a bug in Auth emulator where accounts:lookup is case-sensitive for emails (#8344)
- Fixed a bug where function deploys didn't support shorthand notation and parameterized service account (#8366)
- Fixed an issue where `sql:setup` would incorrectly remove the `cloudsqlsuperuser` role from `firebasesuperuser` (#8363)
- Fixed a bug where `appdistribution:testers:list` would error out if there were no testers.
2 changes: 1 addition & 1 deletion src/commands/appdistribution-groups-create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
import { getProjectName } from "../appdistribution/options-parser-util";

export const command = new Command("appdistribution:groups:create <displayName> [alias]")
.description("create group in project")
.description("create an App Distribution group")
.alias("appdistribution:group:create")
.before(requireAuth)
.action(async (displayName: string, alias?: string, options?: any) => {

Check warning on line 11 in src/commands/appdistribution-groups-create.ts

View workflow job for this annotation

GitHub Actions / lint (20)

Unexpected any. Specify a different type
const projectName = await getProjectName(options);
const appDistroClient = new AppDistributionClient();
utils.logBullet(`Creating group in project`);
const group = await appDistroClient.createGroup(projectName, displayName, alias);
alias = group.name.split("/").pop();
utils.logSuccess(`Group '${group.displayName}' (alias: ${alias}) created successfully`);

Check warning on line 17 in src/commands/appdistribution-groups-create.ts

View workflow job for this annotation

GitHub Actions / lint (20)

Invalid type "string | undefined" of template literal expression
});
2 changes: 1 addition & 1 deletion src/commands/appdistribution-groups-delete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
import { getProjectName } from "../appdistribution/options-parser-util";

export const command = new Command("appdistribution:groups:delete <alias>")
.description("delete group from a project")
.description("delete an App Distribution group")
.alias("appdistribution:group:delete")
.before(requireAuth)
.action(async (alias: string, options: any) => {

Check warning on line 12 in src/commands/appdistribution-groups-delete.ts

View workflow job for this annotation

GitHub Actions / lint (20)

Unexpected any. Specify a different type
const projectName = await getProjectName(options);
const appDistroClient = new AppDistributionClient();
try {
Expand Down
2 changes: 1 addition & 1 deletion src/commands/appdistribution-groups-list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import * as Table from "cli-table3";

export const command = new Command("appdistribution:groups:list")
.description("list groups in project")
.description("list App Distribution groups")
.alias("appdistribution:group:list")
.before(requireAuth)
.action(async (options?: Options): Promise<ListGroupsResponse> => {
Expand All @@ -21,11 +21,11 @@
const spinner = ora("Preparing the list of your App Distribution Groups").start();
try {
groupsResponse = await appDistroClient.listGroups(projectName);
} catch (err: any) {

Check warning on line 24 in src/commands/appdistribution-groups-list.ts

View workflow job for this annotation

GitHub Actions / lint (20)

Unexpected any. Specify a different type
spinner.fail();
throw new FirebaseError("Failed to list groups.", {
exit: 1,
original: err,

Check warning on line 28 in src/commands/appdistribution-groups-list.ts

View workflow job for this annotation

GitHub Actions / lint (20)

Unsafe assignment of an `any` value
});
}
spinner.succeed();
Expand Down
2 changes: 1 addition & 1 deletion src/commands/appdistribution-testers-add.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,23 @@
import { getEmails, getProjectName } from "../appdistribution/options-parser-util";

export const command = new Command("appdistribution:testers:add [emails...]")
.description("add testers to project (and possibly group)")
.description("add testers to project (and App Distribution group, if specified via flag)")
.option("--file <file>", "a path to a file containing a list of tester emails to be added")
.option(
"--group-alias <group-alias>",
"if specified, the testers are also added to the group identified by this alias",
)
.before(requireAuth)
.action(async (emails: string[], options?: any) => {

Check warning on line 15 in src/commands/appdistribution-testers-add.ts

View workflow job for this annotation

GitHub Actions / lint (20)

Unexpected any. Specify a different type
const projectName = await getProjectName(options);
const appDistroClient = new AppDistributionClient();
const emailsToAdd = getEmails(emails, options.file);

Check warning on line 18 in src/commands/appdistribution-testers-add.ts

View workflow job for this annotation

GitHub Actions / lint (20)

Unsafe argument of type `any` assigned to a parameter of type `string`

Check warning on line 18 in src/commands/appdistribution-testers-add.ts

View workflow job for this annotation

GitHub Actions / lint (20)

Unsafe member access .file on an `any` value
utils.logBullet(`Adding ${emailsToAdd.length} testers to project`);
await appDistroClient.addTesters(projectName, emailsToAdd);
if (options.groupAlias) {

Check warning on line 21 in src/commands/appdistribution-testers-add.ts

View workflow job for this annotation

GitHub Actions / lint (20)

Unsafe member access .groupAlias on an `any` value
utils.logBullet(`Adding ${emailsToAdd.length} testers to group`);
await appDistroClient.addTestersToGroup(
`${projectName}/groups/${options.groupAlias}`,

Check warning on line 24 in src/commands/appdistribution-testers-add.ts

View workflow job for this annotation

GitHub Actions / lint (20)

Invalid type "any" of template literal expression
emailsToAdd,
);
}
Expand Down
2 changes: 1 addition & 1 deletion src/commands/appdistribution-testers-remove.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { getEmails, getProjectName } from "../appdistribution/options-parser-uti
import { logger } from "../logger";

export const command = new Command("appdistribution:testers:remove [emails...]")
.description("remove testers from a project (or group)")
.description("remove testers from a project (or App Distribution group, if specified via flag)")
.option("--file <file>", "a path to a file containing a list of tester emails to be removed")
.option(
"--group-alias <group-alias>",
Expand Down
2 changes: 1 addition & 1 deletion src/commands/apphosting-secrets-access.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { requirePermissions } from "../requirePermissions";

export const command = new Command("apphosting:secrets:access <secretName[@version]>")
.description(
"Access secret value given secret and its version. Defaults to accessing the latest version.",
"access secret value given secret and its version. Defaults to accessing the latest version",
)
.before(requireAuth)
.before(secretManager.ensureApi)
Expand Down
2 changes: 1 addition & 1 deletion src/commands/apphosting-secrets-describe.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { requirePermissions } from "../requirePermissions";
import * as Table from "cli-table3";

export const command = new Command("apphosting:secrets:describe <secretName>")
.description("Get metadata for secret and its versions.")
.description("get metadata for secret and its versions")
.before(requireAuth)
.before(secretManager.ensureApi)
.before(requirePermissions, ["secretmanager.secrets.get"])
Expand Down
2 changes: 1 addition & 1 deletion src/commands/apps-android-sha-create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ function getCertHashType(shaHash: string): string {
}

export const command = new Command("apps:android:sha:create <appId> <shaHash>")
.description("add a SHA certificate hash for a given app id.")
.description("add a SHA certificate hash for a given app id")
.before(requireAuth)
.action(
async (appId: string = "", shaHash: string = "", options: any): Promise<AppAndroidShaData> => {
Expand Down
2 changes: 1 addition & 1 deletion src/commands/apps-android-sha-delete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { requireAuth } from "../requireAuth";
import { promiseWithSpinner } from "../utils";

export const command = new Command("apps:android:sha:delete <appId> <shaId>")
.description("delete a SHA certificate hash for a given app id.")
.description("delete a SHA certificate hash for a given app id")
.before(requireAuth)
.action(async (appId: string = "", shaId: string = "", options: any): Promise<void> => {
const projectId = needProjectId(options);
Expand Down
2 changes: 1 addition & 1 deletion src/commands/apps-android-sha-list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ function logCertificatesCount(count: number = 0): void {
}

export const command = new Command("apps:android:sha:list <appId>")
.description("list the SHA certificate hashes for a given app id. ")
.description("list the SHA certificate hashes for a given app id")
.before(requireAuth)
.action(async (appId: string = "", options: any): Promise<AppAndroidShaData[]> => {
const projectId = needProjectId(options);
Expand Down
2 changes: 1 addition & 1 deletion src/commands/apps-create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ interface AppsCreateOptions extends Options {

export const command = new Command("apps:create [platform] [displayName]")
.description(
"create a new Firebase app. [platform] can be IOS, ANDROID or WEB (case insensitive).",
"create a new Firebase app. [platform] can be IOS, ANDROID or WEB (case insensitive)",
)
.option("-a, --package-name <packageName>", "required package name for the Android app")
.option("-b, --bundle-id <bundleId>", "required bundle id for the iOS app")
Expand Down
2 changes: 1 addition & 1 deletion src/commands/apps-init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ function toAppPlatform(str: string) {
}

export const command = new Command("apps:init [platform] [appId]")
.description("Automatically download and create config of a Firebase app. ")
.description("automatically download and create config of a Firebase app")
.before(requireAuth)
.option("-o, --out [file]", "(optional) write config output to a file")
.action(async (platform = "", appId = "", options: AppsInitOptions): Promise<AppConfig> => {
Expand Down
2 changes: 1 addition & 1 deletion src/commands/auth-export.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ interface exportOptions {
}

export const command = new Command("auth:export [dataFile]")
.description("Export accounts from your Firebase project into a data file")
.description("export accounts from your Firebase project into a data file")
.option(
"--format <format>",
"Format of exported data (csv, json). Ignored if <dataFile> has format extension.",
Expand Down
2 changes: 1 addition & 1 deletion src/commands/auth-import.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import {
const MAX_BATCH_SIZE = 1000;

export const command = new Command("auth:import [dataFile]")
.description("import users into your Firebase project from a data file(.csv or .json)")
.description("import users into your Firebase project from a data file (.csv or .json)")
.option(
"--hash-algo <hashAlgo>",
"specify the hash algorithm used in password for these accounts",
Expand Down
2 changes: 1 addition & 1 deletion src/commands/database-instances-create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { FirebaseError } from "../error";
import { MISSING_DEFAULT_INSTANCE_ERROR_MESSAGE } from "../requireDatabaseInstance";

export const command = new Command("database:instances:create <instanceName>")
.description("create a realtime database instance")
.description("create a Realtime Database instance")
.option(
"-l, --location <location>",
"(optional) location for the database instance, defaults to us-central1",
Expand Down
4 changes: 1 addition & 3 deletions src/commands/database-profile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@ import { profiler } from "../profiler";
import { Emulators } from "../emulator/types";
import { warnEmulatorNotSupported } from "../emulator/commandUtils";

const description = "profile the Realtime Database and generate a usage report";

export const command = new Command("database:profile")
.description(description)
.description("profile the Realtime Database and generate a usage report")
.option("-o, --output <filename>", "save the output to the specified file")
.option(
"-d, --duration <seconds>",
Expand Down
2 changes: 1 addition & 1 deletion src/commands/database-settings-set.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { requireDatabaseInstance } from "../requireDatabaseInstance";
import * as utils from "../utils";

export const command = new Command("database:settings:set <path> <value>")
.description("set the realtime database setting at path.")
.description("set the Realtime Database setting at path")
.option(
"--instance <instance>",
"use the database <instance>.firebaseio.com (if omitted, use default database instance)",
Expand Down
2 changes: 1 addition & 1 deletion src/commands/database-update.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { requireDatabaseInstance } from "../requireDatabaseInstance";
import * as utils from "../utils";

export const command = new Command("database:update <path> [infile]")
.description("update some of the keys for the defined path in your Firebase")
.description("update some of the keys for the defined path in your Realtime Database")
.option("-d, --data <data>", "specify escaped JSON directly")
.option("-f, --force", "pass this option to bypass confirmation prompt")
.option(
Expand Down
2 changes: 1 addition & 1 deletion src/commands/dataconnect-sdk-generate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { getProjectDefaultAccount } from "../auth";
type GenerateOptions = Options & { watch?: boolean };

export const command = new Command("dataconnect:sdk:generate")
.description("generates typed SDKs for your Data Connect connectors")
.description("generate typed SDKs for your Data Connect connectors")
.option(
"--watch",
"watch for changes to your connector GQL files and regenerate your SDKs when updates occur",
Expand Down
2 changes: 1 addition & 1 deletion src/commands/dataconnect-services-list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { ensureApis } from "../dataconnect/ensureApis";
import * as Table from "cli-table3";

export const command = new Command("dataconnect:services:list")
.description("list all deployed services in your Firebase project")
.description("list all deployed Data Connect services")
.before(requirePermissions, [
"dataconnect.services.list",
"dataconnect.schemas.list",
Expand Down
2 changes: 1 addition & 1 deletion src/commands/dataconnect-sql-diff.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { requireAuth } from "../requireAuth";

export const command = new Command("dataconnect:sql:diff [serviceId]")
.description(
"displays the differences between a local DataConnect schema and your CloudSQL database's current schema",
"display the differences between a local Data Connect schema and your CloudSQL database's current schema",
)
.before(requirePermissions, [
"firebasedataconnect.services.list",
Expand Down
2 changes: 1 addition & 1 deletion src/commands/dataconnect-sql-grant.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { fdcSqlRoleMap } from "../gcp/cloudsql/permissions_setup";
const allowedRoles = Object.keys(fdcSqlRoleMap);

export const command = new Command("dataconnect:sql:grant [serviceId]")
.description("Grants the SQL role <role> to the provided user or service account <email>.")
.description("grants the SQL role <role> to the provided user or service account <email>")
.option("-R, --role <role>", "The SQL role to grant. One of: owner, writer, or reader.")
.option(
"-E, --email <email>",
Expand Down
4 changes: 2 additions & 2 deletions src/commands/dataconnect-sql-migrate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ import { ensureApis } from "../dataconnect/ensureApis";
import { logLabeledSuccess } from "../utils";

export const command = new Command("dataconnect:sql:migrate [serviceId]")
.description("migrates your CloudSQL database's schema to match your local DataConnect schema")
.description("migrate your CloudSQL database's schema to match your local Data Connect schema")
.before(requirePermissions, [
"firebasedataconnect.services.list",
"firebasedataconnect.schemas.list",
"firebasedataconnect.schemas.update",
"cloudsql.instances.connect",
])
.before(requireAuth)
.withForce("Execute any required database changes without prompting")
.withForce("execute any required database changes without prompting")
.action(async (serviceId: string, options: Options) => {
const projectId = needProjectId(options);
await ensureApis(projectId);
Expand Down
2 changes: 1 addition & 1 deletion src/commands/dataconnect-sql-setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { getIAMUser } from "../gcp/cloudsql/connect";
import * as cloudSqlAdminClient from "../gcp/cloudsql/cloudsqladmin";

export const command = new Command("dataconnect:sql:setup [serviceId]")
.description("Setup your CloudSQL database")
.description("set up your CloudSQL database")
.before(requirePermissions, [
"firebasedataconnect.services.list",
"firebasedataconnect.schemas.list",
Expand Down
4 changes: 3 additions & 1 deletion src/commands/dataconnect-sql-shell.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,9 @@ async function mainShellLoop(conn: pg.PoolClient) {
}

export const command = new Command("dataconnect:sql:shell [serviceId]")
.description("Starts a shell connected directly to your dataconnect cloudsql instance.")
.description(
"start a shell connected directly to your Data Connect service's linked CloudSQL instance",
)
.before(requirePermissions, ["firebasedataconnect.services.list", "cloudsql.instances.connect"])
.before(requireAuth)
.action(async (serviceId: string, options: Options) => {
Expand Down
6 changes: 3 additions & 3 deletions src/commands/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,13 @@ export const command = new Command("deploy")
"When filtering based on codebases, use colons to specify codebase names " +
'(e.g. "--only functions:codebase1:func1,functions:codebase2:group1.subgroup1"). ' +
"For data connect, can specify filters with colons to deploy only a service, connector, or schema" +
'(e.g. "--only dataconnect:serviceId,dataconnect:serviceId:connectorId,dataconnect:serviceId:schema"). ',
'(e.g. "--only dataconnect:serviceId,dataconnect:serviceId:connectorId,dataconnect:serviceId:schema")',
)
.option("--except <targets>", 'deploy to all targets except specified (e.g. "database")')
.option(
"--dry-run",
"Perform a dry run of your deployment. Validates your changes and builds your code without deploying any changes to your project. " +
"In order to provide better validation, this may still enable APIs on the target project.",
"perform a dry run of your deployment. Validates your changes and builds your code without deploying any changes to your project. " +
"In order to provide better validation, this may still enable APIs on the target project",
)
.before(requireConfig)
.before((options) => {
Expand Down
2 changes: 1 addition & 1 deletion src/commands/emulators-exec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export const command = new Command("emulators:exec <script>")
.before(commandUtils.setExportOnExitOptions)
.before(commandUtils.beforeEmulatorCommand)
.description(
"start the local Firebase emulators, " + "run a test script, then shut down the emulators",
"start the local Firebase emulators, run a test script, then shut down the emulators",
)
.option(commandUtils.FLAG_ONLY, commandUtils.DESC_ONLY)
.option(commandUtils.FLAG_INSPECT_FUNCTIONS, commandUtils.DESC_INSPECT_FUNCTIONS)
Expand Down
13 changes: 0 additions & 13 deletions src/commands/experimental-functions-shell.ts

This file was deleted.

2 changes: 1 addition & 1 deletion src/commands/ext-dev-register.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import { PublisherProfile } from "../extensions/types";
* Register a publisher ID; run this before publishing any extensions.
*/
export const command = new Command("ext:dev:register")
.description("register a publisher ID; run this before publishing your first extension.")
.description("register a publisher ID; run this before publishing your first extension")
// temporary until registry-specific permissions are available
.before(requirePermissions, ["firebaseextensions.sources.create"])
.before(ensureExtensionsPublisherApiEnabled)
Expand Down
4 changes: 2 additions & 2 deletions src/commands/ext-dev-usage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ import { promptOnce } from "../prompt";
import { shortenUrl } from "../shortenUrl";

export const command = new Command("ext:dev:usage <publisherId>")
.description("get usage for an extension")
.description("get usage statistics for an extension")
.help(
"use this command to get the usage of extensions you published. " +
"Specify the publisher ID you used to publish your extensions, " +
"or the extension ref of your published extension.",
"or the extension ref of your published extension",
)
.before(requireAuth)
.before(checkMinRequiredVersion, "extDevMinVersion")
Expand Down
7 changes: 2 additions & 5 deletions src/commands/ext-install.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,8 @@ import { displayDeveloperTOSWarning } from "../extensions/tos";
/**
* Command for installing an extension
*/
export const command = new Command("ext:install [extensionRef]")
.description(
"add an uploaded extension to firebase.json if [publisherId/extensionId] is provided;" +
"or, add a local extension if [localPath] is provided",
)
export const command = new Command("ext:install [extensionRefOrLocalPath]")
.description("add an extension to firebase.json")
.option("--local", "deprecated")
.withForce()
.before(requirePermissions, ["firebaseextensions.instances.create"])
Expand Down
4 changes: 2 additions & 2 deletions src/commands/firestore-backups-delete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import { FirestoreOptions } from "../firestore/options";
import { FirebaseError } from "../error";

export const command = new Command("firestore:backups:delete <backup>")
.description("Delete a backup under your Cloud Firestore database.")
.option("--force", "Attempt to delete backup without prompting for confirmation.")
.description("delete a backup under your Cloud Firestore database")
.option("--force", "attempt to delete backup without prompting for confirmation")
.before(requirePermissions, ["datastore.backups.delete"])
.before(warnEmulatorNotSupported, Emulators.FIRESTORE)
.action(async (backupName: string, options: FirestoreOptions) => {
Expand Down
2 changes: 1 addition & 1 deletion src/commands/firestore-backups-get.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { Backup, getBackup } from "../gcp/firestore";
import { PrettyPrint } from "../firestore/pretty-print";

export const command = new Command("firestore:backups:get <backup>")
.description("Get a Cloud Firestore database backup.")
.description("get a Cloud Firestore database backup")
.before(requirePermissions, ["datastore.backups.get"])
.before(warnEmulatorNotSupported, Emulators.FIRESTORE)
.action(async (backupName: string, options: FirestoreOptions) => {
Expand Down
Loading
Loading