firebase-tools 10.6.0 → 10.7.2
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/command.js +4 -4
- package/lib/commands/deploy.js +1 -1
- package/lib/commands/emulators-start.js +7 -2
- package/lib/commands/ext-configure.js +15 -5
- package/lib/commands/ext-export.js +6 -5
- package/lib/commands/ext-install.js +28 -44
- package/lib/commands/ext-update.js +9 -1
- package/lib/commands/functions-delete.js +7 -3
- package/lib/commands/hosting-channel-deploy.js +2 -2
- package/lib/deploy/database/deploy.js +4 -0
- package/lib/deploy/database/index.js +1 -0
- package/lib/deploy/extensions/deploy.js +4 -4
- package/lib/deploy/extensions/deploymentSummary.js +8 -5
- package/lib/deploy/extensions/planner.js +36 -9
- package/lib/deploy/extensions/prepare.js +1 -1
- package/lib/deploy/extensions/secrets.js +2 -2
- package/lib/deploy/extensions/tasks.js +60 -21
- package/lib/deploy/functions/backend.js +37 -2
- package/lib/deploy/functions/build.js +173 -0
- package/lib/deploy/functions/checkIam.js +11 -14
- package/lib/deploy/functions/containerCleaner.js +8 -7
- package/lib/deploy/functions/deploy.js +49 -28
- package/lib/deploy/functions/ensure.js +4 -4
- package/lib/deploy/functions/functionsDeployHelper.js +99 -24
- package/lib/deploy/functions/prepare.js +129 -71
- package/lib/deploy/functions/prepareFunctionsUpload.js +16 -21
- package/lib/deploy/functions/pricing.js +6 -3
- package/lib/deploy/functions/prompts.js +1 -7
- package/lib/deploy/functions/release/executor.js +1 -1
- package/lib/deploy/functions/release/fabricator.js +69 -25
- package/lib/deploy/functions/release/index.js +20 -6
- package/lib/deploy/functions/release/planner.js +18 -10
- package/lib/deploy/functions/release/reporter.js +14 -11
- package/lib/deploy/functions/runtimes/discovery/parsing.js +12 -6
- package/lib/deploy/functions/runtimes/discovery/v1alpha1.js +50 -3
- package/lib/deploy/functions/runtimes/golang/index.js +3 -0
- package/lib/deploy/functions/runtimes/node/index.js +7 -0
- package/lib/deploy/functions/runtimes/node/parseRuntimeAndValidateSDK.js +3 -3
- package/lib/deploy/functions/runtimes/node/parseTriggers.js +132 -6
- package/lib/deploy/functions/runtimes/node/versioning.js +2 -2
- package/lib/deploy/functions/services/auth.js +95 -0
- package/lib/deploy/functions/services/index.js +41 -21
- package/lib/deploy/functions/validate.js +33 -7
- package/lib/deploy/hosting/args.js +2 -0
- package/lib/deploy/hosting/convertConfig.js +39 -8
- package/lib/deploy/hosting/deploy.js +3 -3
- package/lib/deploy/hosting/prepare.js +2 -2
- package/lib/deploy/hosting/release.js +6 -2
- package/lib/deploy/index.js +82 -93
- package/lib/deploy/remoteconfig/deploy.js +4 -0
- package/lib/deploy/remoteconfig/index.js +3 -1
- package/lib/emulator/auth/cloudFunctions.js +6 -2
- package/lib/emulator/auth/operations.js +5 -1
- package/lib/emulator/auth/server.js +8 -1
- package/lib/emulator/auth/state.js +27 -24
- package/lib/emulator/auth/utils.js +3 -25
- package/lib/emulator/controller.js +17 -14
- package/lib/emulator/databaseEmulator.js +36 -3
- package/lib/emulator/downloadableEmulators.js +39 -23
- package/lib/emulator/extensions/validation.js +2 -2
- package/lib/emulator/extensionsEmulator.js +85 -21
- package/lib/emulator/functionsEmulator.js +89 -15
- package/lib/emulator/functionsEmulatorRuntime.js +1 -1
- package/lib/emulator/functionsEmulatorShared.js +25 -2
- package/lib/emulator/functionsEmulatorShell.js +2 -3
- package/lib/emulator/functionsEmulatorUtils.js +5 -1
- package/lib/emulator/pubsubEmulator.js +13 -9
- package/lib/emulator/registry.js +34 -12
- package/lib/emulator/storage/apis/firebase.js +33 -6
- package/lib/emulator/storage/apis/gcloud.js +6 -3
- package/lib/emulator/storage/files.js +9 -1
- package/lib/ensureApiEnabled.js +8 -4
- package/lib/extensions/changelog.js +1 -1
- package/lib/extensions/emulator/optionsHelper.js +4 -3
- package/lib/extensions/emulator/specHelper.js +7 -1
- package/lib/extensions/extensionsHelper.js +30 -24
- package/lib/extensions/manifest.js +27 -7
- package/lib/extensions/paramHelper.js +7 -5
- package/lib/extensions/provisioningHelper.js +2 -2
- package/lib/extensions/warnings.js +11 -4
- package/lib/functions/events/index.js +7 -0
- package/lib/functions/events/v1.js +6 -0
- package/lib/functions/projectConfig.js +32 -6
- package/lib/functionsShellCommandAction.js +1 -1
- package/lib/gcp/cloudfunctions.js +38 -5
- package/lib/gcp/cloudfunctionsv2.js +46 -7
- package/lib/gcp/identityPlatform.js +44 -0
- package/lib/gcp/secretManager.js +1 -1
- package/lib/metaprogramming.js +2 -0
- package/lib/previews.js +1 -1
- package/lib/serve/functions.js +16 -19
- package/lib/serve/hosting.js +25 -12
- package/lib/serve/index.js +6 -0
- package/lib/track.js +15 -21
- package/npm-shrinkwrap.json +256 -527
- package/package.json +6 -3
- package/schema/firebase-config.json +6 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.updateConfig = exports.setBlockingFunctionsConfig = exports.getConfig = exports.getBlockingFunctionsConfig = void 0;
|
|
4
|
+
const proto = require("./proto");
|
|
5
|
+
const api_1 = require("../api");
|
|
6
|
+
const apiv2_1 = require("../apiv2");
|
|
7
|
+
const API_VERSION = "v2";
|
|
8
|
+
const adminApiClient = new apiv2_1.Client({
|
|
9
|
+
urlPrefix: api_1.identityOrigin + "/admin",
|
|
10
|
+
apiVersion: API_VERSION,
|
|
11
|
+
});
|
|
12
|
+
async function getBlockingFunctionsConfig(project) {
|
|
13
|
+
const config = (await getConfig(project)) || {};
|
|
14
|
+
if (!config.blockingFunctions) {
|
|
15
|
+
config.blockingFunctions = {};
|
|
16
|
+
}
|
|
17
|
+
return config.blockingFunctions;
|
|
18
|
+
}
|
|
19
|
+
exports.getBlockingFunctionsConfig = getBlockingFunctionsConfig;
|
|
20
|
+
async function getConfig(project) {
|
|
21
|
+
const response = await adminApiClient.get(`projects/${project}/config`);
|
|
22
|
+
return response.body;
|
|
23
|
+
}
|
|
24
|
+
exports.getConfig = getConfig;
|
|
25
|
+
async function setBlockingFunctionsConfig(project, blockingConfig) {
|
|
26
|
+
const config = (await updateConfig(project, { blockingFunctions: blockingConfig }, "blockingFunctions")) || {};
|
|
27
|
+
if (!config.blockingFunctions) {
|
|
28
|
+
config.blockingFunctions = {};
|
|
29
|
+
}
|
|
30
|
+
return config.blockingFunctions;
|
|
31
|
+
}
|
|
32
|
+
exports.setBlockingFunctionsConfig = setBlockingFunctionsConfig;
|
|
33
|
+
async function updateConfig(project, config, updateMask) {
|
|
34
|
+
if (!updateMask) {
|
|
35
|
+
updateMask = proto.fieldMasks(config).join(",");
|
|
36
|
+
}
|
|
37
|
+
const response = await adminApiClient.patch(`projects/${project}/config`, config, {
|
|
38
|
+
queryParams: {
|
|
39
|
+
updateMask,
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
return response.body;
|
|
43
|
+
}
|
|
44
|
+
exports.updateConfig = updateConfig;
|
package/lib/gcp/secretManager.js
CHANGED
|
@@ -33,7 +33,7 @@ async function listSecrets(projectId, filter) {
|
|
|
33
33
|
? baseOpts
|
|
34
34
|
: Object.assign(Object.assign({}, baseOpts), { queryParams: Object.assign(Object.assign({}, baseOpts === null || baseOpts === void 0 ? void 0 : baseOpts.queryParams), { pageToken }) });
|
|
35
35
|
const res = await client.get(path, opts);
|
|
36
|
-
for (const s of res.body.secrets) {
|
|
36
|
+
for (const s of res.body.secrets || []) {
|
|
37
37
|
secrets.push(Object.assign(Object.assign({}, parseSecretResourceName(s.name)), { labels: (_a = s.labels) !== null && _a !== void 0 ? _a : {} }));
|
|
38
38
|
}
|
|
39
39
|
if (!res.body.nextPageToken) {
|
package/lib/previews.js
CHANGED
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.previews = void 0;
|
|
4
4
|
const lodash_1 = require("lodash");
|
|
5
5
|
const configstore_1 = require("./configstore");
|
|
6
|
-
exports.previews = Object.assign({ rtdbrules: false, ext: false, extdev: false, extensionsemulator: false, rtdbmanagement: false, functionsv2: false, golang: false, deletegcfartifacts: false, artifactregistry: false, emulatoruisnapshot: false }, configstore_1.configstore.get("previews"));
|
|
6
|
+
exports.previews = Object.assign({ rtdbrules: false, ext: false, extdev: false, extensionsemulator: false, rtdbmanagement: false, functionsv2: false, golang: false, deletegcfartifacts: false, artifactregistry: false, emulatoruisnapshot: false, frameworkawareness: false }, configstore_1.configstore.get("previews"));
|
|
7
7
|
if (process.env.FIREBASE_CLI_PREVIEWS) {
|
|
8
8
|
process.env.FIREBASE_CLI_PREVIEWS.split(",").forEach((feature) => {
|
|
9
9
|
if ((0, lodash_1.has)(exports.previews, feature)) {
|
package/lib/serve/functions.js
CHANGED
|
@@ -10,28 +10,29 @@ const auth_1 = require("../auth");
|
|
|
10
10
|
const projectConfig = require("../functions/projectConfig");
|
|
11
11
|
const utils = require("../utils");
|
|
12
12
|
class FunctionsServer {
|
|
13
|
-
constructor() {
|
|
14
|
-
this.emulatorServer = undefined;
|
|
15
|
-
this.backend = undefined;
|
|
16
|
-
}
|
|
17
13
|
assertServer() {
|
|
18
|
-
if (!this.emulatorServer || !this.
|
|
14
|
+
if (!this.emulatorServer || !this.backends) {
|
|
19
15
|
throw new Error("Must call start() before calling any other operation!");
|
|
20
16
|
}
|
|
21
17
|
}
|
|
22
18
|
async start(options, partialArgs) {
|
|
23
19
|
const projectId = (0, projectUtils_1.needProjectId)(options);
|
|
24
|
-
const config = projectConfig.normalizeAndValidate(options.config.src.functions)
|
|
25
|
-
const
|
|
20
|
+
const config = projectConfig.normalizeAndValidate(options.config.src.functions);
|
|
21
|
+
const backends = [];
|
|
22
|
+
for (const cfg of config) {
|
|
23
|
+
const functionsDir = path.join(options.config.projectDir, cfg.source);
|
|
24
|
+
const nodeMajorVersion = (0, functionsEmulatorUtils_1.parseRuntimeVersion)(cfg.runtime);
|
|
25
|
+
backends.push({
|
|
26
|
+
functionsDir,
|
|
27
|
+
codebase: cfg.codebase,
|
|
28
|
+
nodeMajorVersion,
|
|
29
|
+
env: {},
|
|
30
|
+
secretEnv: [],
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
this.backends = backends;
|
|
26
34
|
const account = (0, auth_1.getProjectDefaultAccount)(options.config.projectDir);
|
|
27
|
-
const
|
|
28
|
-
this.backend = {
|
|
29
|
-
functionsDir,
|
|
30
|
-
nodeMajorVersion,
|
|
31
|
-
env: {},
|
|
32
|
-
secretEnv: [],
|
|
33
|
-
};
|
|
34
|
-
const args = Object.assign({ projectId, projectDir: options.config.projectDir, emulatableBackends: [this.backend], projectAlias: options.projectAlias, account }, partialArgs);
|
|
35
|
+
const args = Object.assign({ projectId, projectDir: options.config.projectDir, emulatableBackends: this.backends, projectAlias: options.projectAlias, account }, partialArgs);
|
|
35
36
|
if (options.host) {
|
|
36
37
|
utils.assertIsStringOrUndefined(options.host);
|
|
37
38
|
args.host = options.host;
|
|
@@ -59,10 +60,6 @@ class FunctionsServer {
|
|
|
59
60
|
this.assertServer();
|
|
60
61
|
await this.emulatorServer.stop();
|
|
61
62
|
}
|
|
62
|
-
getBackend() {
|
|
63
|
-
this.assertServer();
|
|
64
|
-
return this.backend;
|
|
65
|
-
}
|
|
66
63
|
get() {
|
|
67
64
|
this.assertServer();
|
|
68
65
|
return this.emulatorServer.get();
|
package/lib/serve/hosting.js
CHANGED
|
@@ -15,6 +15,7 @@ const stream_1 = require("stream");
|
|
|
15
15
|
const emulatorLogger_1 = require("../emulator/emulatorLogger");
|
|
16
16
|
const types_1 = require("../emulator/types");
|
|
17
17
|
const utils_1 = require("../utils");
|
|
18
|
+
const child_process_1 = require("child_process");
|
|
18
19
|
const MAX_PORT_ATTEMPTS = 10;
|
|
19
20
|
let attempts = 0;
|
|
20
21
|
let destroyServer = undefined;
|
|
@@ -31,6 +32,29 @@ function startServer(options, config, port, init) {
|
|
|
31
32
|
const morganMiddleware = morgan("combined", {
|
|
32
33
|
stream: morganStream,
|
|
33
34
|
});
|
|
35
|
+
const portInUse = () => {
|
|
36
|
+
const message = "Port " + options.port + " is not available.";
|
|
37
|
+
logger.log("WARN", clc.yellow("hosting: ") + message + " Trying another port...");
|
|
38
|
+
if (attempts < MAX_PORT_ATTEMPTS) {
|
|
39
|
+
attempts++;
|
|
40
|
+
startServer(options, config, port + 5, init);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
logger.log("WARN", message);
|
|
44
|
+
throw new error_1.FirebaseError("Could not find an open port for hosting development server.", {
|
|
45
|
+
exit: 1,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
if (process.platform === "darwin") {
|
|
50
|
+
try {
|
|
51
|
+
(0, child_process_1.execSync)(`lsof -i :${port}`);
|
|
52
|
+
portInUse();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
}
|
|
57
|
+
}
|
|
34
58
|
const server = superstatic({
|
|
35
59
|
debug: false,
|
|
36
60
|
port: port,
|
|
@@ -60,18 +84,7 @@ function startServer(options, config, port, init) {
|
|
|
60
84
|
destroyServer = (0, utils_1.createDestroyer)(server);
|
|
61
85
|
server.on("error", (err) => {
|
|
62
86
|
if (err.code === "EADDRINUSE") {
|
|
63
|
-
|
|
64
|
-
logger.log("WARN", clc.yellow("hosting: ") + message + " Trying another port...");
|
|
65
|
-
if (attempts < MAX_PORT_ATTEMPTS) {
|
|
66
|
-
attempts++;
|
|
67
|
-
startServer(options, config, port + 5, init);
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
logger.log("WARN", message);
|
|
71
|
-
throw new error_1.FirebaseError("Could not find an open port for hosting development server.", {
|
|
72
|
-
exit: 1,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
87
|
+
portInUse();
|
|
75
88
|
}
|
|
76
89
|
else {
|
|
77
90
|
throw new error_1.FirebaseError("An error occurred while starting the hosting development server:\n\n" + err.toString(), { exit: 1 });
|
package/lib/serve/index.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.serve = void 0;
|
|
4
4
|
const _ = require("lodash");
|
|
5
5
|
const logger_1 = require("../logger");
|
|
6
|
+
const previews_1 = require("../previews");
|
|
6
7
|
const { FunctionsServer } = require("./functions");
|
|
7
8
|
const TARGETS = {
|
|
8
9
|
hosting: require("./hosting"),
|
|
@@ -11,6 +12,11 @@ const TARGETS = {
|
|
|
11
12
|
async function serve(options) {
|
|
12
13
|
const targetNames = options.targets;
|
|
13
14
|
options.port = parseInt(options.port, 10);
|
|
15
|
+
if (previews_1.previews.frameworkawareness &&
|
|
16
|
+
targetNames.includes("hosting") &&
|
|
17
|
+
[].concat(options.config.get("hosting")).some((it) => it.source)) {
|
|
18
|
+
await require("firebase-frameworks").prepare(targetNames, { project: options.projectId }, options);
|
|
19
|
+
}
|
|
14
20
|
await Promise.all(_.map(targetNames, (targetName) => {
|
|
15
21
|
return TARGETS[targetName].start(options);
|
|
16
22
|
}));
|
package/lib/track.js
CHANGED
|
@@ -1,31 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.track = void 0;
|
|
4
|
+
const ua = require("universal-analytics");
|
|
5
|
+
const uuid_1 = require("uuid");
|
|
6
|
+
const configstore_1 = require("./configstore");
|
|
7
|
+
const pkg = require("../package.json");
|
|
8
|
+
let anonId = configstore_1.configstore.get("analytics-uuid");
|
|
9
9
|
if (!anonId) {
|
|
10
|
-
anonId =
|
|
11
|
-
configstore.set("analytics-uuid", anonId);
|
|
10
|
+
anonId = (0, uuid_1.v4)();
|
|
11
|
+
configstore_1.configstore.set("analytics-uuid", anonId);
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
const visitor = ua(process.env.FIREBASE_ANALYTICS_UA || "UA-29174744-3", anonId, {
|
|
14
14
|
strictCidFormat: false,
|
|
15
15
|
https: true,
|
|
16
16
|
});
|
|
17
17
|
visitor.set("cd1", process.platform);
|
|
18
18
|
visitor.set("cd2", process.version);
|
|
19
19
|
visitor.set("cd3", process.env.FIREPIT_VERSION || "none");
|
|
20
|
-
function track(action, label, duration) {
|
|
21
|
-
return new Promise(
|
|
22
|
-
if (
|
|
23
|
-
|
|
24
|
-
resolve();
|
|
25
|
-
}
|
|
26
|
-
duration = duration || 0;
|
|
27
|
-
if (configstore.get("tokens") && configstore.get("usage")) {
|
|
28
|
-
visitor.event("Firebase CLI " + pkg.version, action, label, duration).send(function () {
|
|
20
|
+
function track(action, label, duration = 0) {
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
if (configstore_1.configstore.get("tokens") && configstore_1.configstore.get("usage")) {
|
|
23
|
+
visitor.event("Firebase CLI " + pkg.version, action, label, duration).send(() => {
|
|
29
24
|
resolve();
|
|
30
25
|
});
|
|
31
26
|
}
|
|
@@ -34,5 +29,4 @@ function track(action, label, duration) {
|
|
|
34
29
|
}
|
|
35
30
|
});
|
|
36
31
|
}
|
|
37
|
-
|
|
38
|
-
module.exports = track;
|
|
32
|
+
exports.track = track;
|