firebase-tools 13.3.1 → 13.4.1
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/api.js +2 -1
- package/lib/apiv2.js +8 -3
- package/lib/commands/apphosting-backends-create.js +3 -3
- package/lib/commands/apphosting-backends-delete.js +3 -39
- package/lib/commands/apphosting-backends-get.js +4 -35
- package/lib/commands/apphosting-backends-list.js +17 -9
- package/lib/commands/apphosting-builds-create.js +4 -4
- package/lib/commands/apphosting-builds-get.js +2 -2
- package/lib/commands/apphosting-rollouts-create.js +3 -3
- package/lib/commands/apphosting-rollouts-list.js +2 -2
- package/lib/commands/firestore-backups-delete.js +44 -0
- package/lib/commands/firestore-backups-get.js +25 -0
- package/lib/commands/firestore-backups-list.js +34 -0
- package/lib/commands/firestore-backups-schedules-create.js +67 -0
- package/lib/commands/firestore-backups-schedules-delete.js +46 -0
- package/lib/commands/firestore-backups-schedules-list.js +28 -0
- package/lib/commands/firestore-backups-schedules-update.js +33 -0
- package/lib/commands/firestore-databases-create.js +4 -2
- package/lib/commands/firestore-databases-delete.js +4 -2
- package/lib/commands/firestore-databases-get.js +3 -1
- package/lib/commands/firestore-databases-list.js +3 -1
- package/lib/commands/firestore-databases-restore.js +42 -0
- package/lib/commands/firestore-databases-update.js +4 -2
- package/lib/commands/firestore-indexes-list.js +5 -3
- package/lib/commands/firestore-locations.js +3 -1
- package/lib/commands/index.js +10 -0
- package/lib/deploy/extensions/v2FunctionHelper.js +2 -1
- package/lib/deploy/functions/backend.js +5 -1
- package/lib/deploy/functions/build.js +9 -6
- package/lib/deploy/functions/ensure.js +2 -2
- package/lib/deploy/functions/prepare.js +5 -9
- package/lib/deploy/functions/runtimes/discovery/v1alpha1.js +2 -1
- package/lib/emulator/downloadableEmulators.js +3 -3
- package/lib/ensureApiEnabled.js +8 -6
- package/lib/extensions/extensionsHelper.js +2 -2
- package/lib/extensions/secretsUtils.js +2 -1
- package/lib/fetchWebSetup.js +2 -1
- package/lib/firestore/api-sort.js +23 -1
- package/lib/firestore/api-types.js +6 -1
- package/lib/firestore/api.js +18 -115
- package/lib/firestore/backupUtils.js +30 -0
- package/lib/firestore/pretty-print.js +184 -0
- package/lib/frameworks/index.js +6 -2
- package/lib/frameworks/next/constants.js +35 -1
- package/lib/frameworks/next/index.js +25 -3
- package/lib/frameworks/next/utils.js +20 -1
- package/lib/functions/secrets.js +1 -1
- package/lib/gcp/apphosting.js +2 -3
- package/lib/gcp/auth.js +5 -2
- package/lib/gcp/firestore.js +75 -1
- package/lib/gcp/storage.js +1 -1
- package/lib/hosting/api.js +12 -1
- package/lib/init/features/apphosting/index.js +12 -7
- package/lib/init/features/database.js +2 -1
- package/lib/init/features/extensions/index.js +2 -1
- package/lib/init/features/functions/index.js +3 -2
- package/package.json +2 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.command = void 0;
|
|
4
|
-
const command_1 = require("../command");
|
|
5
4
|
const clc = require("colorette");
|
|
5
|
+
const command_1 = require("../command");
|
|
6
6
|
const fsi = require("../firestore/api");
|
|
7
7
|
const prompt_1 = require("../prompt");
|
|
8
8
|
const logger_1 = require("../logger");
|
|
@@ -10,6 +10,7 @@ const requirePermissions_1 = require("../requirePermissions");
|
|
|
10
10
|
const types_1 = require("../emulator/types");
|
|
11
11
|
const commandUtils_1 = require("../emulator/commandUtils");
|
|
12
12
|
const error_1 = require("../error");
|
|
13
|
+
const pretty_print_1 = require("../firestore/pretty-print");
|
|
13
14
|
exports.command = new command_1.Command("firestore:databases:delete <database>")
|
|
14
15
|
.description("Delete a database in your Cloud Firestore project. Database delete protection state must be disabled. To do so, use the update command: firebase firestore:databases:update <database> --delete-protection DISABLED")
|
|
15
16
|
.option("--force", "Attempt to delete database without prompting for confirmation.")
|
|
@@ -17,6 +18,7 @@ exports.command = new command_1.Command("firestore:databases:delete <database>")
|
|
|
17
18
|
.before(commandUtils_1.warnEmulatorNotSupported, types_1.Emulators.FIRESTORE)
|
|
18
19
|
.action(async (database, options) => {
|
|
19
20
|
const api = new fsi.FirestoreApi();
|
|
21
|
+
const printer = new pretty_print_1.PrettyPrint();
|
|
20
22
|
if (!options.force) {
|
|
21
23
|
const confirmMessage = `You are about to delete projects/${options.project}/databases/${database}. Do you wish to continue?`;
|
|
22
24
|
const consent = await (0, prompt_1.promptOnce)({
|
|
@@ -33,7 +35,7 @@ exports.command = new command_1.Command("firestore:databases:delete <database>")
|
|
|
33
35
|
logger_1.logger.info(JSON.stringify(databaseResp, undefined, 2));
|
|
34
36
|
}
|
|
35
37
|
else {
|
|
36
|
-
logger_1.logger.info(clc.bold(`Successfully deleted ${
|
|
38
|
+
logger_1.logger.info(clc.bold(`Successfully deleted ${printer.prettyDatabaseString(databaseResp)}`));
|
|
37
39
|
}
|
|
38
40
|
return databaseResp;
|
|
39
41
|
});
|
|
@@ -7,19 +7,21 @@ const logger_1 = require("../logger");
|
|
|
7
7
|
const requirePermissions_1 = require("../requirePermissions");
|
|
8
8
|
const types_1 = require("../emulator/types");
|
|
9
9
|
const commandUtils_1 = require("../emulator/commandUtils");
|
|
10
|
+
const pretty_print_1 = require("../firestore/pretty-print");
|
|
10
11
|
exports.command = new command_1.Command("firestore:databases:get [database]")
|
|
11
12
|
.description("Get database in your Cloud Firestore project.")
|
|
12
13
|
.before(requirePermissions_1.requirePermissions, ["datastore.databases.get"])
|
|
13
14
|
.before(commandUtils_1.warnEmulatorNotSupported, types_1.Emulators.FIRESTORE)
|
|
14
15
|
.action(async (database, options) => {
|
|
15
16
|
const api = new fsi.FirestoreApi();
|
|
17
|
+
const printer = new pretty_print_1.PrettyPrint();
|
|
16
18
|
const databaseId = database || "(default)";
|
|
17
19
|
const databaseResp = await api.getDatabase(options.project, databaseId);
|
|
18
20
|
if (options.json) {
|
|
19
21
|
logger_1.logger.info(JSON.stringify(databaseResp, undefined, 2));
|
|
20
22
|
}
|
|
21
23
|
else {
|
|
22
|
-
|
|
24
|
+
printer.prettyPrintDatabase(databaseResp);
|
|
23
25
|
}
|
|
24
26
|
return databaseResp;
|
|
25
27
|
});
|
|
@@ -7,18 +7,20 @@ const logger_1 = require("../logger");
|
|
|
7
7
|
const requirePermissions_1 = require("../requirePermissions");
|
|
8
8
|
const types_1 = require("../emulator/types");
|
|
9
9
|
const commandUtils_1 = require("../emulator/commandUtils");
|
|
10
|
+
const pretty_print_1 = require("../firestore/pretty-print");
|
|
10
11
|
exports.command = new command_1.Command("firestore:databases:list")
|
|
11
12
|
.description("List databases in your Cloud Firestore project.")
|
|
12
13
|
.before(requirePermissions_1.requirePermissions, ["datastore.databases.list"])
|
|
13
14
|
.before(commandUtils_1.warnEmulatorNotSupported, types_1.Emulators.FIRESTORE)
|
|
14
15
|
.action(async (options) => {
|
|
15
16
|
const api = new fsi.FirestoreApi();
|
|
17
|
+
const printer = new pretty_print_1.PrettyPrint();
|
|
16
18
|
const databases = await api.listDatabases(options.project);
|
|
17
19
|
if (options.json) {
|
|
18
20
|
logger_1.logger.info(JSON.stringify(databases, undefined, 2));
|
|
19
21
|
}
|
|
20
22
|
else {
|
|
21
|
-
|
|
23
|
+
printer.prettyPrintDatabases(databases);
|
|
22
24
|
}
|
|
23
25
|
return databases;
|
|
24
26
|
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.command = void 0;
|
|
4
|
+
const clc = require("colorette");
|
|
5
|
+
const command_1 = require("../command");
|
|
6
|
+
const fsi = require("../firestore/api");
|
|
7
|
+
const logger_1 = require("../logger");
|
|
8
|
+
const requirePermissions_1 = require("../requirePermissions");
|
|
9
|
+
const types_1 = require("../emulator/types");
|
|
10
|
+
const commandUtils_1 = require("../emulator/commandUtils");
|
|
11
|
+
const pretty_print_1 = require("../firestore/pretty-print");
|
|
12
|
+
exports.command = new command_1.Command("firestore:databases:restore")
|
|
13
|
+
.description("Restore a Firestore database in your Firebase project.")
|
|
14
|
+
.option("-d, --database <databaseID>", "ID of the database to restore into")
|
|
15
|
+
.option("-b, --backup <backup>", "Backup from which to restore")
|
|
16
|
+
.before(requirePermissions_1.requirePermissions, ["datastore.backups.restoreDatabase"])
|
|
17
|
+
.before(commandUtils_1.warnEmulatorNotSupported, types_1.Emulators.FIRESTORE)
|
|
18
|
+
.action(async (options) => {
|
|
19
|
+
const api = new fsi.FirestoreApi();
|
|
20
|
+
const printer = new pretty_print_1.PrettyPrint();
|
|
21
|
+
if (!options.database) {
|
|
22
|
+
logger_1.logger.error("Missing required flag --database. See firebase firestore:databases:restore --help for more info");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const databaseId = options.database;
|
|
26
|
+
if (!options.backup) {
|
|
27
|
+
logger_1.logger.error("Missing required flag --backup. See firebase firestore:databases:restore --help for more info");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const backupName = options.backup;
|
|
31
|
+
const databaseResp = await api.restoreDatabase(options.project, databaseId, backupName);
|
|
32
|
+
if (options.json) {
|
|
33
|
+
logger_1.logger.info(JSON.stringify(databaseResp, undefined, 2));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
logger_1.logger.info(clc.bold(`Successfully initiated restore of ${printer.prettyDatabaseString(databaseResp)}`));
|
|
37
|
+
logger_1.logger.info("Please be sure to configure Firebase rules in your Firebase config file for\n" +
|
|
38
|
+
"the new database. By default, created databases will have closed rules that\n" +
|
|
39
|
+
"block any incoming third-party traffic.");
|
|
40
|
+
}
|
|
41
|
+
return databaseResp;
|
|
42
|
+
});
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.command = void 0;
|
|
4
|
-
const command_1 = require("../command");
|
|
5
4
|
const clc = require("colorette");
|
|
5
|
+
const command_1 = require("../command");
|
|
6
6
|
const fsi = require("../firestore/api");
|
|
7
7
|
const types = require("../firestore/api-types");
|
|
8
8
|
const logger_1 = require("../logger");
|
|
9
9
|
const requirePermissions_1 = require("../requirePermissions");
|
|
10
10
|
const types_1 = require("../emulator/types");
|
|
11
11
|
const commandUtils_1 = require("../emulator/commandUtils");
|
|
12
|
+
const pretty_print_1 = require("../firestore/pretty-print");
|
|
12
13
|
exports.command = new command_1.Command("firestore:databases:update <database>")
|
|
13
14
|
.description("Update a database in your Firebase project. Must specify at least one property to update.")
|
|
14
15
|
.option("--json", "Prints raw json response of the create API call if specified")
|
|
@@ -18,6 +19,7 @@ exports.command = new command_1.Command("firestore:databases:update <database>")
|
|
|
18
19
|
.before(commandUtils_1.warnEmulatorNotSupported, types_1.Emulators.FIRESTORE)
|
|
19
20
|
.action(async (database, options) => {
|
|
20
21
|
const api = new fsi.FirestoreApi();
|
|
22
|
+
const printer = new pretty_print_1.PrettyPrint();
|
|
21
23
|
if (!options.deleteProtection && !options.pointInTimeRecovery) {
|
|
22
24
|
logger_1.logger.error("Missing properties to update. See firebase firestore:databases:update --help for more info.");
|
|
23
25
|
return;
|
|
@@ -53,7 +55,7 @@ exports.command = new command_1.Command("firestore:databases:update <database>")
|
|
|
53
55
|
logger_1.logger.info(JSON.stringify(databaseResp, undefined, 2));
|
|
54
56
|
}
|
|
55
57
|
else {
|
|
56
|
-
logger_1.logger.info(clc.bold(`Successfully updated ${
|
|
58
|
+
logger_1.logger.info(clc.bold(`Successfully updated ${printer.prettyDatabaseString(databaseResp)}`));
|
|
57
59
|
}
|
|
58
60
|
return databaseResp;
|
|
59
61
|
});
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.command = void 0;
|
|
4
|
-
const command_1 = require("../command");
|
|
5
4
|
const clc = require("colorette");
|
|
5
|
+
const command_1 = require("../command");
|
|
6
6
|
const fsi = require("../firestore/api");
|
|
7
7
|
const logger_1 = require("../logger");
|
|
8
8
|
const requirePermissions_1 = require("../requirePermissions");
|
|
9
9
|
const types_1 = require("../emulator/types");
|
|
10
10
|
const commandUtils_1 = require("../emulator/commandUtils");
|
|
11
|
+
const pretty_print_1 = require("../firestore/pretty-print");
|
|
11
12
|
exports.command = new command_1.Command("firestore:indexes")
|
|
12
13
|
.description("List indexes in your project's Cloud Firestore database.")
|
|
13
14
|
.option("--pretty", "Pretty print. When not specified the indexes are printed in the " +
|
|
@@ -18,17 +19,18 @@ exports.command = new command_1.Command("firestore:indexes")
|
|
|
18
19
|
.action(async (options) => {
|
|
19
20
|
var _a;
|
|
20
21
|
const indexApi = new fsi.FirestoreApi();
|
|
22
|
+
const printer = new pretty_print_1.PrettyPrint();
|
|
21
23
|
const databaseId = (_a = options.database) !== null && _a !== void 0 ? _a : "(default)";
|
|
22
24
|
const indexes = await indexApi.listIndexes(options.project, databaseId);
|
|
23
25
|
const fieldOverrides = await indexApi.listFieldOverrides(options.project, databaseId);
|
|
24
26
|
const indexSpec = indexApi.makeIndexSpec(indexes, fieldOverrides);
|
|
25
27
|
if (options.pretty) {
|
|
26
28
|
logger_1.logger.info(clc.bold(clc.white("Compound Indexes")));
|
|
27
|
-
|
|
29
|
+
printer.prettyPrintIndexes(indexes);
|
|
28
30
|
if (fieldOverrides) {
|
|
29
31
|
logger_1.logger.info();
|
|
30
32
|
logger_1.logger.info(clc.bold(clc.white("Field Overrides")));
|
|
31
|
-
|
|
33
|
+
printer.printFieldOverrides(fieldOverrides);
|
|
32
34
|
}
|
|
33
35
|
}
|
|
34
36
|
else {
|
|
@@ -7,18 +7,20 @@ const logger_1 = require("../logger");
|
|
|
7
7
|
const requirePermissions_1 = require("../requirePermissions");
|
|
8
8
|
const types_1 = require("../emulator/types");
|
|
9
9
|
const commandUtils_1 = require("../emulator/commandUtils");
|
|
10
|
+
const pretty_print_1 = require("../firestore/pretty-print");
|
|
10
11
|
exports.command = new command_1.Command("firestore:locations")
|
|
11
12
|
.description("List possible locations for your Cloud Firestore project.")
|
|
12
13
|
.before(requirePermissions_1.requirePermissions, ["datastore.locations.list"])
|
|
13
14
|
.before(commandUtils_1.warnEmulatorNotSupported, types_1.Emulators.FIRESTORE)
|
|
14
15
|
.action(async (options) => {
|
|
15
16
|
const api = new fsi.FirestoreApi();
|
|
17
|
+
const printer = new pretty_print_1.PrettyPrint();
|
|
16
18
|
const locations = await api.locations(options.project);
|
|
17
19
|
if (options.json) {
|
|
18
20
|
logger_1.logger.info(JSON.stringify(locations, undefined, 2));
|
|
19
21
|
}
|
|
20
22
|
else {
|
|
21
|
-
|
|
23
|
+
printer.prettyPrintLocations(locations);
|
|
22
24
|
}
|
|
23
25
|
return locations;
|
|
24
26
|
});
|
package/lib/commands/index.js
CHANGED
|
@@ -101,6 +101,16 @@ function load(client) {
|
|
|
101
101
|
client.firestore.databases.create = loadCommand("firestore-databases-create");
|
|
102
102
|
client.firestore.databases.update = loadCommand("firestore-databases-update");
|
|
103
103
|
client.firestore.databases.delete = loadCommand("firestore-databases-delete");
|
|
104
|
+
client.firestore.databases.restore = loadCommand("firestore-databases-restore");
|
|
105
|
+
client.firestore.backups = {};
|
|
106
|
+
client.firestore.backups.schedules = {};
|
|
107
|
+
client.firestore.backups.list = loadCommand("firestore-backups-list");
|
|
108
|
+
client.firestore.backups.get = loadCommand("firestore-backups-get");
|
|
109
|
+
client.firestore.backups.delete = loadCommand("firestore-backups-delete");
|
|
110
|
+
client.firestore.backups.schedules.list = loadCommand("firestore-backups-schedules-list");
|
|
111
|
+
client.firestore.backups.schedules.create = loadCommand("firestore-backups-schedules-create");
|
|
112
|
+
client.firestore.backups.schedules.update = loadCommand("firestore-backups-schedules-update");
|
|
113
|
+
client.firestore.backups.schedules.delete = loadCommand("firestore-backups-schedules-delete");
|
|
104
114
|
client.functions = {};
|
|
105
115
|
client.functions.config = {};
|
|
106
116
|
client.functions.config.clone = loadCommand("functions-config-clone");
|
|
@@ -8,6 +8,7 @@ const error_1 = require("../../error");
|
|
|
8
8
|
const ensureApiEnabled_1 = require("../../ensureApiEnabled");
|
|
9
9
|
const planner = require("./planner");
|
|
10
10
|
const projectUtils_1 = require("../../projectUtils");
|
|
11
|
+
const api_1 = require("../../api");
|
|
11
12
|
const SERVICE_AGENT_ROLE = "roles/eventarc.eventReceiver";
|
|
12
13
|
async function checkSpecForV2Functions(i) {
|
|
13
14
|
const extensionSpec = await planner.getExtensionSpec(i);
|
|
@@ -16,7 +17,7 @@ async function checkSpecForV2Functions(i) {
|
|
|
16
17
|
exports.checkSpecForV2Functions = checkSpecForV2Functions;
|
|
17
18
|
async function ensureNecessaryV2ApisAndRoles(options) {
|
|
18
19
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
19
|
-
await (0, ensureApiEnabled_1.ensure)(projectId,
|
|
20
|
+
await (0, ensureApiEnabled_1.ensure)(projectId, api_1.computeOrigin, "extensions", options.markdown);
|
|
20
21
|
await ensureComputeP4SARole(projectId);
|
|
21
22
|
}
|
|
22
23
|
exports.ensureNecessaryV2ApisAndRoles = ensureNecessaryV2ApisAndRoles;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.compareFunctions = exports.missingEndpoint = exports.hasEndpoint = exports.regionalEndpoints = exports.matchingBackend = exports.findEndpoint = exports.someEndpoint = exports.allEndpoints = exports.checkAvailability = exports.existingBackend = exports.scheduleIdForFunction = exports.functionName = exports.isEmptyBackend = exports.merge = exports.of = exports.empty = exports.isBlockingTriggered = exports.isTaskQueueTriggered = exports.isScheduleTriggered = exports.isEventTriggered = exports.isCallableTriggered = exports.isHttpsTriggered = exports.AllFunctionsPlatforms = exports.secretVersionName = exports.SCHEDULED_FUNCTION_LABEL = exports.MIN_CPU_FOR_CONCURRENCY = exports.DEFAULT_MEMORY = exports.DEFAULT_CONCURRENCY = exports.memoryToGen2Cpu = exports.memoryToGen1Cpu = exports.memoryOptionDisplayName = exports.isValidMemoryOption = exports.AllIngressSettings = exports.AllVpcEgressSettings = exports.endpointTriggerType = void 0;
|
|
3
|
+
exports.compareFunctions = exports.missingEndpoint = exports.hasEndpoint = exports.regionalEndpoints = exports.matchingBackend = exports.findEndpoint = exports.someEndpoint = exports.allEndpoints = exports.checkAvailability = exports.existingBackend = exports.scheduleIdForFunction = exports.functionName = exports.isEmptyBackend = exports.merge = exports.of = exports.empty = exports.isBlockingTriggered = exports.isTaskQueueTriggered = exports.isScheduleTriggered = exports.isEventTriggered = exports.isCallableTriggered = exports.isHttpsTriggered = exports.AllFunctionsPlatforms = exports.secretVersionName = exports.SCHEDULED_FUNCTION_LABEL = exports.MIN_CPU_FOR_CONCURRENCY = exports.DEFAULT_MEMORY = exports.DEFAULT_CONCURRENCY = exports.memoryToGen2Cpu = exports.memoryToGen1Cpu = exports.memoryOptionDisplayName = exports.isValidEgressSetting = exports.isValidMemoryOption = exports.AllIngressSettings = exports.AllVpcEgressSettings = exports.endpointTriggerType = void 0;
|
|
4
4
|
const gcf = require("../../gcp/cloudfunctions");
|
|
5
5
|
const gcfV2 = require("../../gcp/cloudfunctionsv2");
|
|
6
6
|
const utils = require("../../utils");
|
|
@@ -41,6 +41,10 @@ function isValidMemoryOption(mem) {
|
|
|
41
41
|
return allMemoryOptions.includes(mem);
|
|
42
42
|
}
|
|
43
43
|
exports.isValidMemoryOption = isValidMemoryOption;
|
|
44
|
+
function isValidEgressSetting(egress) {
|
|
45
|
+
return egress === "PRIVATE_RANGES_ONLY" || egress === "ALL_TRAFFIC";
|
|
46
|
+
}
|
|
47
|
+
exports.isValidEgressSetting = isValidEgressSetting;
|
|
44
48
|
function memoryOptionDisplayName(option) {
|
|
45
49
|
return {
|
|
46
50
|
128: "128MB",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toBackend = exports.resolveBackend = exports.AllIngressSettings = exports.AllVpcEgressSettings = exports.AllFunctionsPlatforms = exports.
|
|
3
|
+
exports.toBackend = exports.resolveBackend = exports.AllIngressSettings = exports.AllVpcEgressSettings = exports.AllFunctionsPlatforms = exports.isBlockingTriggered = exports.isTaskQueueTriggered = exports.isScheduleTriggered = exports.isEventTriggered = exports.isCallableTriggered = exports.isHttpsTriggered = exports.of = exports.empty = void 0;
|
|
4
4
|
const backend = require("./backend");
|
|
5
5
|
const proto = require("../../gcp/proto");
|
|
6
6
|
const api = require("../../.../../api");
|
|
@@ -48,10 +48,6 @@ function isBlockingTriggered(triggered) {
|
|
|
48
48
|
}
|
|
49
49
|
exports.isBlockingTriggered = isBlockingTriggered;
|
|
50
50
|
const allMemoryOptions = [128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768];
|
|
51
|
-
function isValidMemoryOption(mem) {
|
|
52
|
-
return allMemoryOptions.includes(mem);
|
|
53
|
-
}
|
|
54
|
-
exports.isValidMemoryOption = isValidMemoryOption;
|
|
55
51
|
exports.AllFunctionsPlatforms = ["gcfv1", "gcfv2"];
|
|
56
52
|
exports.AllVpcEgressSettings = ["PRIVATE_RANGES_ONLY", "ALL_TRAFFIC"];
|
|
57
53
|
exports.AllIngressSettings = [
|
|
@@ -222,7 +218,14 @@ function toBackend(build, paramValues) {
|
|
|
222
218
|
bdEndpoint.vpc.connector = `projects/${bdEndpoint.project}/locations/${region}/connectors/${bdEndpoint.vpc.connector}`;
|
|
223
219
|
}
|
|
224
220
|
bkEndpoint.vpc = { connector: bdEndpoint.vpc.connector };
|
|
225
|
-
|
|
221
|
+
if (bdEndpoint.vpc.egressSettings) {
|
|
222
|
+
const egressSettings = r.resolveString(bdEndpoint.vpc.egressSettings);
|
|
223
|
+
if (!backend.isValidEgressSetting(egressSettings)) {
|
|
224
|
+
throw new error_1.FirebaseError(`Value "${egressSettings}" is an invalid ` +
|
|
225
|
+
"egress setting. Valid values are PRIVATE_RANGES_ONLY and ALL_TRAFFIC");
|
|
226
|
+
}
|
|
227
|
+
bkEndpoint.vpc.egressSettings = egressSettings;
|
|
228
|
+
}
|
|
226
229
|
}
|
|
227
230
|
else if (bdEndpoint.vpc === null) {
|
|
228
231
|
bkEndpoint.vpc = null;
|
|
@@ -8,9 +8,9 @@ const utils_1 = require("../../utils");
|
|
|
8
8
|
const secretManager_1 = require("../../gcp/secretManager");
|
|
9
9
|
const projects_1 = require("../../management/projects");
|
|
10
10
|
const functional_1 = require("../../functional");
|
|
11
|
+
const api_1 = require("../../api");
|
|
11
12
|
const backend = require("./backend");
|
|
12
13
|
const FAQ_URL = "https://firebase.google.com/support/faq#functions-runtime";
|
|
13
|
-
const CLOUD_BUILD_API = "cloudbuild.googleapis.com";
|
|
14
14
|
const metadataCallCache = new Map();
|
|
15
15
|
async function defaultServiceAccount(e) {
|
|
16
16
|
let metadataCall = metadataCallCache.get(e.project);
|
|
@@ -54,7 +54,7 @@ function isPermissionError(e) {
|
|
|
54
54
|
}
|
|
55
55
|
async function cloudBuildEnabled(projectId) {
|
|
56
56
|
try {
|
|
57
|
-
await (0, ensureApiEnabled_1.ensure)(projectId,
|
|
57
|
+
await (0, ensureApiEnabled_1.ensure)(projectId, api_1.cloudbuildOrigin, "functions");
|
|
58
58
|
}
|
|
59
59
|
catch (e) {
|
|
60
60
|
if ((0, error_1.isBillingError)(e)) {
|
|
@@ -10,6 +10,7 @@ const functionsEnv = require("../../functions/env");
|
|
|
10
10
|
const runtimes = require("./runtimes");
|
|
11
11
|
const validate = require("./validate");
|
|
12
12
|
const ensure = require("./ensure");
|
|
13
|
+
const api_1 = require("../../api");
|
|
13
14
|
const functionsDeployHelper_1 = require("./functionsDeployHelper");
|
|
14
15
|
const utils_1 = require("../../utils");
|
|
15
16
|
const prepareFunctionsUpload_1 = require("./prepareFunctionsUpload");
|
|
@@ -40,10 +41,10 @@ async function prepare(context, options, payload) {
|
|
|
40
41
|
(0, utils_1.logLabeledBullet)("functions", `preparing codebase ${clc.bold(codebase)} for deployment`);
|
|
41
42
|
}
|
|
42
43
|
const checkAPIsEnabled = await Promise.all([
|
|
43
|
-
ensureApiEnabled.ensure(projectId,
|
|
44
|
-
ensureApiEnabled.check(projectId,
|
|
44
|
+
ensureApiEnabled.ensure(projectId, api_1.functionsOrigin, "functions"),
|
|
45
|
+
ensureApiEnabled.check(projectId, api_1.runtimeconfigOrigin, "runtimeconfig", true),
|
|
45
46
|
ensure.cloudBuildEnabled(projectId),
|
|
46
|
-
ensureApiEnabled.ensure(projectId,
|
|
47
|
+
ensureApiEnabled.ensure(projectId, api_1.artifactRegistryDomain, "artifactregistry"),
|
|
47
48
|
]);
|
|
48
49
|
const firebaseConfig = await functionsConfig.getFirebaseConfig(options);
|
|
49
50
|
context.firebaseConfig = firebaseConfig;
|
|
@@ -157,12 +158,7 @@ async function prepare(context, options, payload) {
|
|
|
157
158
|
return ensureApiEnabled.ensure(projectId, api, "functions", false);
|
|
158
159
|
}));
|
|
159
160
|
if (backend.someEndpoint(wantBackend, (e) => e.platform === "gcfv2")) {
|
|
160
|
-
const V2_APIS = [
|
|
161
|
-
"run.googleapis.com",
|
|
162
|
-
"eventarc.googleapis.com",
|
|
163
|
-
"pubsub.googleapis.com",
|
|
164
|
-
"storage.googleapis.com",
|
|
165
|
-
];
|
|
161
|
+
const V2_APIS = [api_1.cloudRunApiOrigin, api_1.eventarcOrigin, api_1.pubsubOrigin, api_1.storageOrigin];
|
|
166
162
|
const enablements = V2_APIS.map((api) => {
|
|
167
163
|
return ensureApiEnabled.ensure(context.projectId, api, "functions");
|
|
168
164
|
});
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildFromV1Alpha1 = void 0;
|
|
4
4
|
const build = require("../../build");
|
|
5
|
+
const backend = require("../../backend");
|
|
5
6
|
const proto_1 = require("../../../../gcp/proto");
|
|
6
7
|
const parsing_1 = require("./parsing");
|
|
7
8
|
const error_1 = require("../../../../error");
|
|
@@ -52,7 +53,7 @@ function assertBuildEndpoint(ep, id) {
|
|
|
52
53
|
platform: (platform) => build.AllFunctionsPlatforms.includes(platform),
|
|
53
54
|
entryPoint: "string",
|
|
54
55
|
omit: "Field<boolean>?",
|
|
55
|
-
availableMemoryMb: (mem) => mem === null || isCEL(mem) ||
|
|
56
|
+
availableMemoryMb: (mem) => mem === null || isCEL(mem) || backend.isValidMemoryOption(mem),
|
|
56
57
|
maxInstances: "Field<number>?",
|
|
57
58
|
minInstances: "Field<number>?",
|
|
58
59
|
concurrency: "Field<number>?",
|
|
@@ -23,9 +23,9 @@ const EMULATOR_UPDATE_DETAILS = {
|
|
|
23
23
|
expectedChecksum: "2fd771101c0e1f7898c04c9204f2ce63",
|
|
24
24
|
},
|
|
25
25
|
firestore: {
|
|
26
|
-
version: "1.19.
|
|
27
|
-
expectedSize:
|
|
28
|
-
expectedChecksum: "
|
|
26
|
+
version: "1.19.2",
|
|
27
|
+
expectedSize: 67203281,
|
|
28
|
+
expectedChecksum: "167205aea99351c08ef293f35009a63c",
|
|
29
29
|
},
|
|
30
30
|
storage: {
|
|
31
31
|
version: "1.1.3",
|
package/lib/ensureApiEnabled.js
CHANGED
|
@@ -15,7 +15,8 @@ const apiClient = new apiv2_1.Client({
|
|
|
15
15
|
urlPrefix: api_1.serviceUsageOrigin,
|
|
16
16
|
apiVersion: "v1",
|
|
17
17
|
});
|
|
18
|
-
async function check(projectId,
|
|
18
|
+
async function check(projectId, apiUri, prefix, silent = false) {
|
|
19
|
+
const apiName = apiUri.startsWith("http") ? new URL(apiUri).hostname : apiUri;
|
|
19
20
|
const res = await apiClient.get(`/projects/${projectId}/services/${apiName}`, {
|
|
20
21
|
headers: { "x-goog-quota-user": `projects/${projectId}` },
|
|
21
22
|
skipLog: { resBody: true },
|
|
@@ -90,18 +91,19 @@ async function enableApiWithRetries(projectId, apiName, prefix, silent, enableme
|
|
|
90
91
|
await enable(projectId, apiName);
|
|
91
92
|
return pollCheckEnabled(projectId, apiName, prefix, silent, enablementRetries);
|
|
92
93
|
}
|
|
93
|
-
async function ensure(projectId,
|
|
94
|
+
async function ensure(projectId, apiUri, prefix, silent = false) {
|
|
95
|
+
const hostname = apiUri.startsWith("http") ? new URL(apiUri).hostname : apiUri;
|
|
94
96
|
if (!silent) {
|
|
95
|
-
utils.logLabeledBullet(prefix, `ensuring required API ${(0, colorette_1.bold)(
|
|
97
|
+
utils.logLabeledBullet(prefix, `ensuring required API ${(0, colorette_1.bold)(hostname)} is enabled...`);
|
|
96
98
|
}
|
|
97
|
-
const isEnabled = await check(projectId,
|
|
99
|
+
const isEnabled = await check(projectId, hostname, prefix, silent);
|
|
98
100
|
if (isEnabled) {
|
|
99
101
|
return;
|
|
100
102
|
}
|
|
101
103
|
if (!silent) {
|
|
102
|
-
utils.logLabeledWarning(prefix, `missing required API ${(0, colorette_1.bold)(
|
|
104
|
+
utils.logLabeledWarning(prefix, `missing required API ${(0, colorette_1.bold)(hostname)}. Enabling now...`);
|
|
103
105
|
}
|
|
104
|
-
return enableApiWithRetries(projectId,
|
|
106
|
+
return enableApiWithRetries(projectId, hostname, prefix, silent);
|
|
105
107
|
}
|
|
106
108
|
exports.ensure = ensure;
|
|
107
109
|
function enableApiURI(projectId, apiName) {
|
|
@@ -353,7 +353,7 @@ async function ensureExtensionsApiEnabled(options) {
|
|
|
353
353
|
if (!projectId) {
|
|
354
354
|
return;
|
|
355
355
|
}
|
|
356
|
-
return await (0, ensureApiEnabled_1.ensure)(projectId,
|
|
356
|
+
return await (0, ensureApiEnabled_1.ensure)(projectId, api_1.extensionsOrigin, "extensions", options.markdown);
|
|
357
357
|
}
|
|
358
358
|
exports.ensureExtensionsApiEnabled = ensureExtensionsApiEnabled;
|
|
359
359
|
async function ensureExtensionsPublisherApiEnabled(options) {
|
|
@@ -361,7 +361,7 @@ async function ensureExtensionsPublisherApiEnabled(options) {
|
|
|
361
361
|
if (!projectId) {
|
|
362
362
|
return;
|
|
363
363
|
}
|
|
364
|
-
return await (0, ensureApiEnabled_1.ensure)(projectId,
|
|
364
|
+
return await (0, ensureApiEnabled_1.ensure)(projectId, api_1.extensionsPublisherOrigin, "extensions", options.markdown);
|
|
365
365
|
}
|
|
366
366
|
exports.ensureExtensionsPublisherApiEnabled = ensureExtensionsPublisherApiEnabled;
|
|
367
367
|
async function archiveAndUploadSource(extPath, bucketName) {
|
|
@@ -8,11 +8,12 @@ const projectUtils_1 = require("../projectUtils");
|
|
|
8
8
|
const types_1 = require("./types");
|
|
9
9
|
const secretManagerApi = require("../gcp/secretManager");
|
|
10
10
|
const logger_1 = require("../logger");
|
|
11
|
+
const api_1 = require("../api");
|
|
11
12
|
exports.SECRET_LABEL = "firebase-extensions-managed";
|
|
12
13
|
exports.SECRET_ROLE = "secretmanager.secretAccessor";
|
|
13
14
|
async function ensureSecretManagerApiEnabled(options) {
|
|
14
15
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
15
|
-
return await (0, ensureApiEnabled_1.ensure)(projectId,
|
|
16
|
+
return await (0, ensureApiEnabled_1.ensure)(projectId, api_1.secretManagerOrigin, "extensions", options.markdown);
|
|
16
17
|
}
|
|
17
18
|
exports.ensureSecretManagerApiEnabled = ensureSecretManagerApiEnabled;
|
|
18
19
|
function usesSecrets(spec) {
|
package/lib/fetchWebSetup.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.fetchWebSetup = exports.getCachedWebSetup = void 0;
|
|
3
|
+
exports.fetchWebSetup = exports.constructDefaultWebSetup = exports.getCachedWebSetup = void 0;
|
|
4
4
|
const apiv2_1 = require("./apiv2");
|
|
5
5
|
const configstore_1 = require("./configstore");
|
|
6
6
|
const api_1 = require("./api");
|
|
@@ -46,6 +46,7 @@ function constructDefaultWebSetup(projectId) {
|
|
|
46
46
|
authDomain: `${projectId}.firebaseapp.com`,
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
|
+
exports.constructDefaultWebSetup = constructDefaultWebSetup;
|
|
49
50
|
async function fetchWebSetup(options) {
|
|
50
51
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
51
52
|
if (constants_1.Constants.isDemoProject(projectId)) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.compareFieldOverride = exports.compareApiField = exports.compareLocation = exports.compareApiDatabase = exports.compareApiIndex = exports.compareSpecIndex = void 0;
|
|
3
|
+
exports.compareFieldOverride = exports.compareApiField = exports.compareApiBackupSchedule = exports.compareApiBackup = exports.compareLocation = exports.compareApiDatabase = exports.compareApiIndex = exports.compareSpecIndex = void 0;
|
|
4
4
|
const API = require("./api-types");
|
|
5
5
|
const util = require("./util");
|
|
6
6
|
const QUERY_SCOPE_SEQUENCE = [
|
|
@@ -42,6 +42,28 @@ function compareLocation(a, b) {
|
|
|
42
42
|
return a.locationId > b.locationId ? 1 : -1;
|
|
43
43
|
}
|
|
44
44
|
exports.compareLocation = compareLocation;
|
|
45
|
+
function compareApiBackup(a, b) {
|
|
46
|
+
const aLocation = a.name.split("/")[3];
|
|
47
|
+
const bLocation = b.name.split("/")[3];
|
|
48
|
+
if (aLocation && bLocation && aLocation !== bLocation) {
|
|
49
|
+
return aLocation > bLocation ? 1 : -1;
|
|
50
|
+
}
|
|
51
|
+
if (a.snapshotTime && b.snapshotTime && a.snapshotTime !== b.snapshotTime) {
|
|
52
|
+
return a.snapshotTime > b.snapshotTime ? -1 : 1;
|
|
53
|
+
}
|
|
54
|
+
return a.name > b.name ? 1 : -1;
|
|
55
|
+
}
|
|
56
|
+
exports.compareApiBackup = compareApiBackup;
|
|
57
|
+
function compareApiBackupSchedule(a, b) {
|
|
58
|
+
if (a.dailyRecurrence && !b.dailyRecurrence) {
|
|
59
|
+
return -1;
|
|
60
|
+
}
|
|
61
|
+
else if (a.weeklyRecurrence && b.dailyRecurrence) {
|
|
62
|
+
return 1;
|
|
63
|
+
}
|
|
64
|
+
return a.name > b.name ? 1 : -1;
|
|
65
|
+
}
|
|
66
|
+
exports.compareApiBackupSchedule = compareApiBackupSchedule;
|
|
45
67
|
function compareApiField(a, b) {
|
|
46
68
|
const aName = util.parseFieldName(a.name);
|
|
47
69
|
const bName = util.parseFieldName(b.name);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PointInTimeRecoveryEnablement = exports.PointInTimeRecoveryEnablementOption = exports.DatabaseDeleteProtectionState = exports.DatabaseDeleteProtectionStateOption = exports.DatabaseType = exports.StateTtl = exports.State = exports.ArrayConfig = exports.Order = exports.QueryScope = exports.Mode = void 0;
|
|
3
|
+
exports.RecurrenceType = exports.PointInTimeRecoveryEnablement = exports.PointInTimeRecoveryEnablementOption = exports.DatabaseDeleteProtectionState = exports.DatabaseDeleteProtectionStateOption = exports.DatabaseType = exports.StateTtl = exports.State = exports.ArrayConfig = exports.Order = exports.QueryScope = exports.Mode = void 0;
|
|
4
4
|
var Mode;
|
|
5
5
|
(function (Mode) {
|
|
6
6
|
Mode["ASCENDING"] = "ASCENDING";
|
|
@@ -58,3 +58,8 @@ var PointInTimeRecoveryEnablement;
|
|
|
58
58
|
PointInTimeRecoveryEnablement["ENABLED"] = "POINT_IN_TIME_RECOVERY_ENABLED";
|
|
59
59
|
PointInTimeRecoveryEnablement["DISABLED"] = "POINT_IN_TIME_RECOVERY_DISABLED";
|
|
60
60
|
})(PointInTimeRecoveryEnablement = exports.PointInTimeRecoveryEnablement || (exports.PointInTimeRecoveryEnablement = {}));
|
|
61
|
+
var RecurrenceType;
|
|
62
|
+
(function (RecurrenceType) {
|
|
63
|
+
RecurrenceType["DAILY"] = "DAILY";
|
|
64
|
+
RecurrenceType["WEEKLY"] = "WEEKLY";
|
|
65
|
+
})(RecurrenceType = exports.RecurrenceType || (exports.RecurrenceType = {}));
|