firebase-tools 11.8.0 → 11.8.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/auth.js +1 -1
- package/lib/deploy/functions/build.js +38 -24
- package/lib/deploy/functions/cache/applyHash.js +29 -0
- package/lib/deploy/functions/cache/hash.js +30 -0
- package/lib/deploy/functions/cel.js +249 -0
- package/lib/deploy/functions/functionsDeployHelper.js +12 -1
- package/lib/deploy/functions/params.js +253 -102
- package/lib/deploy/functions/prepare.js +34 -4
- package/lib/deploy/functions/prepareFunctionsUpload.js +12 -4
- package/lib/deploy/functions/release/fabricator.js +17 -1
- package/lib/deploy/functions/release/planner.js +17 -0
- package/lib/deploy/functions/runtimes/node/parseTriggers.js +9 -0
- package/lib/emulator/extensionsEmulator.js +1 -0
- package/lib/emulator/functionsEmulator.js +18 -59
- package/lib/emulator/functionsRuntimeWorker.js +38 -7
- package/lib/emulator/storage/metadata.js +10 -1
- package/lib/extensions/extensionsHelper.js +1 -1
- package/lib/functions/secrets.js +8 -1
- package/lib/gcp/secretManager.js +15 -1
- package/lib/gcp/storage.js +15 -1
- package/lib/previews.js +1 -1
- package/npm-shrinkwrap.json +23 -23
- package/package.json +3 -2
- package/templates/init/storage/storage.rules +1 -1
|
@@ -54,7 +54,11 @@ class FunctionsEmulator {
|
|
|
54
54
|
const mode = this.args.debugPort
|
|
55
55
|
? types_1.FunctionsExecutionMode.SEQUENTIAL
|
|
56
56
|
: types_1.FunctionsExecutionMode.AUTO;
|
|
57
|
-
this.
|
|
57
|
+
this.workerPools = {};
|
|
58
|
+
for (const backend of this.args.emulatableBackends) {
|
|
59
|
+
const pool = new functionsRuntimeWorker_1.RuntimeWorkerPool(mode);
|
|
60
|
+
this.workerPools[backend.codebase] = pool;
|
|
61
|
+
}
|
|
58
62
|
this.workQueue = new workQueue_1.WorkQueue(mode);
|
|
59
63
|
}
|
|
60
64
|
static getHttpFunctionUrl(host, port, projectId, name, region) {
|
|
@@ -241,7 +245,9 @@ class FunctionsEmulator {
|
|
|
241
245
|
this.logger.logLabeled("WARN", "functions", "Functions emulator work queue did not empty before stopping");
|
|
242
246
|
}
|
|
243
247
|
this.workQueue.stop();
|
|
244
|
-
this.
|
|
248
|
+
for (const pool of Object.values(this.workerPools)) {
|
|
249
|
+
pool.exit();
|
|
250
|
+
}
|
|
245
251
|
if (this.destroyServer) {
|
|
246
252
|
await this.destroyServer();
|
|
247
253
|
}
|
|
@@ -273,7 +279,8 @@ class FunctionsEmulator {
|
|
|
273
279
|
projectAlias: this.args.projectAlias,
|
|
274
280
|
};
|
|
275
281
|
const discoveredBuild = await runtimeDelegate.discoverBuild(runtimeConfig, environment);
|
|
276
|
-
const
|
|
282
|
+
const resolution = await (0, build_1.resolveBackend)(discoveredBuild, userEnvOpt, environment);
|
|
283
|
+
const discoveredBackend = resolution.backend;
|
|
277
284
|
const endpoints = backend.allEndpoints(discoveredBackend);
|
|
278
285
|
(0, functionsEmulatorShared_1.prepareEndpoints)(endpoints);
|
|
279
286
|
for (const e of endpoints) {
|
|
@@ -297,7 +304,7 @@ class FunctionsEmulator {
|
|
|
297
304
|
this.logger.logLabeled("ERROR", "functions", `Failed to load function definition from source: ${e}`);
|
|
298
305
|
return;
|
|
299
306
|
}
|
|
300
|
-
this.
|
|
307
|
+
this.workerPools[emulatableBackend.codebase].refresh();
|
|
301
308
|
this.blockingFunctionsConfig = {};
|
|
302
309
|
const toSetup = triggerDefinitions.filter((definition) => {
|
|
303
310
|
if (force) {
|
|
@@ -380,7 +387,7 @@ class FunctionsEmulator {
|
|
|
380
387
|
}
|
|
381
388
|
}
|
|
382
389
|
if (this.args.debugPort) {
|
|
383
|
-
this.startRuntime(emulatableBackend, { nodeBinary: emulatableBackend.nodeBinary });
|
|
390
|
+
await this.startRuntime(emulatableBackend, { nodeBinary: emulatableBackend.nodeBinary });
|
|
384
391
|
}
|
|
385
392
|
}
|
|
386
393
|
addEventarcTrigger(projectId, key, eventTrigger) {
|
|
@@ -802,10 +809,11 @@ class FunctionsEmulator {
|
|
|
802
809
|
return secretEnvs;
|
|
803
810
|
}
|
|
804
811
|
async invokeRuntime(backend, trigger, frb, opts) {
|
|
805
|
-
|
|
812
|
+
const pool = this.workerPools[backend.codebase];
|
|
813
|
+
if (!pool.readyForWork(trigger.id)) {
|
|
806
814
|
await this.startRuntime(backend, opts, trigger);
|
|
807
815
|
}
|
|
808
|
-
return
|
|
816
|
+
return pool.submitWork(trigger.id, frb, opts);
|
|
809
817
|
}
|
|
810
818
|
async startRuntime(backend, opts, trigger) {
|
|
811
819
|
var _a;
|
|
@@ -838,52 +846,18 @@ class FunctionsEmulator {
|
|
|
838
846
|
env: Object.assign(Object.assign(Object.assign(Object.assign({ node: opts.nodeBinary }, process.env), runtimeEnv), secretEnvs), { PORT: socketPath }),
|
|
839
847
|
stdio: ["pipe", "pipe", "pipe", "ipc"],
|
|
840
848
|
});
|
|
841
|
-
if (!childProcess.stderr) {
|
|
842
|
-
throw new error_1.FirebaseError(`childProcess.stderr is undefined.`);
|
|
843
|
-
}
|
|
844
|
-
if (!childProcess.stdout) {
|
|
845
|
-
throw new error_1.FirebaseError(`childProcess.stdout is undefined.`);
|
|
846
|
-
}
|
|
847
|
-
const buffers = {
|
|
848
|
-
stderr: { pipe: childProcess.stderr, value: "" },
|
|
849
|
-
stdout: { pipe: childProcess.stdout, value: "" },
|
|
850
|
-
};
|
|
851
|
-
const ipcBuffer = { value: "" };
|
|
852
|
-
childProcess.on("message", (message) => {
|
|
853
|
-
this.onData(childProcess, emitter, ipcBuffer, message);
|
|
854
|
-
});
|
|
855
|
-
for (const id in buffers) {
|
|
856
|
-
if (buffers.hasOwnProperty(id)) {
|
|
857
|
-
const buffer = buffers[id];
|
|
858
|
-
buffer.pipe.on("data", (buf) => {
|
|
859
|
-
this.onData(childProcess, emitter, buffer, buf);
|
|
860
|
-
});
|
|
861
|
-
}
|
|
862
|
-
}
|
|
863
849
|
const runtime = {
|
|
864
|
-
|
|
865
|
-
exit: new Promise((resolve) => {
|
|
866
|
-
childProcess.on("exit", resolve);
|
|
867
|
-
}),
|
|
850
|
+
process: childProcess,
|
|
868
851
|
events: emitter,
|
|
869
852
|
cwd: backend.functionsDir,
|
|
870
853
|
socketPath,
|
|
871
|
-
shutdown: () => {
|
|
872
|
-
childProcess.kill();
|
|
873
|
-
},
|
|
874
|
-
kill: (signal) => {
|
|
875
|
-
childProcess.kill(signal);
|
|
876
|
-
emitter.emit("log", new types_1.EmulatorLog("SYSTEM", "runtime-status", "killed"));
|
|
877
|
-
},
|
|
878
|
-
send: (args) => {
|
|
879
|
-
return childProcess.send(JSON.stringify(args));
|
|
880
|
-
},
|
|
881
854
|
};
|
|
882
855
|
const extensionLogInfo = {
|
|
883
856
|
instanceId: backend.extensionInstanceId,
|
|
884
857
|
ref: (_a = backend.extensionVersion) === null || _a === void 0 ? void 0 : _a.ref,
|
|
885
858
|
};
|
|
886
|
-
|
|
859
|
+
const pool = this.workerPools[backend.codebase];
|
|
860
|
+
pool.addWorker(trigger === null || trigger === void 0 ? void 0 : trigger.id, runtime, extensionLogInfo);
|
|
887
861
|
return;
|
|
888
862
|
}
|
|
889
863
|
async disableBackgroundTriggers() {
|
|
@@ -1057,20 +1031,5 @@ class FunctionsEmulator {
|
|
|
1057
1031
|
});
|
|
1058
1032
|
await worker.waitForDone();
|
|
1059
1033
|
}
|
|
1060
|
-
onData(runtime, emitter, buffer, buf) {
|
|
1061
|
-
buffer.value += buf.toString();
|
|
1062
|
-
const lines = buffer.value.split("\n");
|
|
1063
|
-
if (lines.length > 1) {
|
|
1064
|
-
lines.slice(0, -1).forEach((line) => {
|
|
1065
|
-
const log = types_1.EmulatorLog.fromJSON(line);
|
|
1066
|
-
emitter.emit("log", log);
|
|
1067
|
-
if (log.level === "FATAL") {
|
|
1068
|
-
emitter.emit("log", new types_1.EmulatorLog("SYSTEM", "runtime-status", "killed"));
|
|
1069
|
-
runtime.kill();
|
|
1070
|
-
}
|
|
1071
|
-
});
|
|
1072
|
-
}
|
|
1073
|
-
buffer.value = lines[lines.length - 1];
|
|
1074
|
-
}
|
|
1075
1034
|
}
|
|
1076
1035
|
exports.FunctionsEmulator = FunctionsEmulator;
|
|
@@ -30,21 +30,52 @@ class RuntimeWorker {
|
|
|
30
30
|
}
|
|
31
31
|
else if (this.state === RuntimeWorkerState.FINISHING) {
|
|
32
32
|
this.log(`IDLE --> FINISHING`);
|
|
33
|
-
this.runtime.
|
|
33
|
+
this.runtime.process.kill();
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
});
|
|
38
|
-
this.runtime.
|
|
38
|
+
const childProc = this.runtime.process;
|
|
39
|
+
let msgBuffer = "";
|
|
40
|
+
childProc.on("message", (msg) => {
|
|
41
|
+
msgBuffer = this.processStream(msg, msgBuffer);
|
|
42
|
+
});
|
|
43
|
+
let stdBuffer = "";
|
|
44
|
+
if (childProc.stdout) {
|
|
45
|
+
childProc.stdout.on("data", (data) => {
|
|
46
|
+
stdBuffer = this.processStream(data, stdBuffer);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (childProc.stderr) {
|
|
50
|
+
childProc.stderr.on("data", (data) => {
|
|
51
|
+
stdBuffer = this.processStream(data, stdBuffer);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
childProc.on("exit", () => {
|
|
39
55
|
this.log("exited");
|
|
40
56
|
this.state = RuntimeWorkerState.FINISHED;
|
|
41
57
|
});
|
|
42
58
|
}
|
|
59
|
+
processStream(s, buf) {
|
|
60
|
+
buf += s.toString();
|
|
61
|
+
const lines = buf.split("\n");
|
|
62
|
+
if (lines.length > 1) {
|
|
63
|
+
lines.slice(0, -1).forEach((line) => {
|
|
64
|
+
const log = types_1.EmulatorLog.fromJSON(line);
|
|
65
|
+
this.runtime.events.emit("log", log);
|
|
66
|
+
if (log.level === "FATAL") {
|
|
67
|
+
this.runtime.events.emit("log", new types_1.EmulatorLog("SYSTEM", "runtime-status", "killed"));
|
|
68
|
+
this.runtime.process.kill();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return lines[lines.length - 1];
|
|
73
|
+
}
|
|
43
74
|
execute(frb, opts) {
|
|
44
75
|
const execFrb = Object.assign({}, frb);
|
|
45
76
|
const args = { frb: execFrb, opts };
|
|
46
77
|
this.state = RuntimeWorkerState.BUSY;
|
|
47
|
-
this.runtime.send(args);
|
|
78
|
+
this.runtime.process.send(JSON.stringify(args));
|
|
48
79
|
}
|
|
49
80
|
get state() {
|
|
50
81
|
return this._state;
|
|
@@ -102,7 +133,7 @@ class RuntimeWorker {
|
|
|
102
133
|
const timeout = new Promise((resolve, reject) => {
|
|
103
134
|
setTimeout(() => {
|
|
104
135
|
reject(new error_1.FirebaseError("Failed to load function."));
|
|
105
|
-
},
|
|
136
|
+
}, 30000);
|
|
106
137
|
});
|
|
107
138
|
while (true) {
|
|
108
139
|
try {
|
|
@@ -142,7 +173,7 @@ class RuntimeWorkerPool {
|
|
|
142
173
|
if (w.state === RuntimeWorkerState.IDLE) {
|
|
143
174
|
this.log(`Shutting down IDLE worker (${w.key})`);
|
|
144
175
|
w.state = RuntimeWorkerState.FINISHING;
|
|
145
|
-
w.runtime.
|
|
176
|
+
w.runtime.process.kill();
|
|
146
177
|
}
|
|
147
178
|
else if (w.state === RuntimeWorkerState.BUSY) {
|
|
148
179
|
this.log(`Marking BUSY worker to finish (${w.key})`);
|
|
@@ -155,10 +186,10 @@ class RuntimeWorkerPool {
|
|
|
155
186
|
for (const arr of this.workers.values()) {
|
|
156
187
|
arr.forEach((w) => {
|
|
157
188
|
if (w.state === RuntimeWorkerState.IDLE) {
|
|
158
|
-
w.runtime.
|
|
189
|
+
w.runtime.process.kill();
|
|
159
190
|
}
|
|
160
191
|
else {
|
|
161
|
-
w.runtime.kill();
|
|
192
|
+
w.runtime.process.kill();
|
|
162
193
|
}
|
|
163
194
|
});
|
|
164
195
|
}
|
|
@@ -20,7 +20,6 @@ class StoredFileMetadata {
|
|
|
20
20
|
this.contentLanguage = opts.contentLanguage;
|
|
21
21
|
this.customTime = opts.customTime;
|
|
22
22
|
this.contentEncoding = opts.contentEncoding;
|
|
23
|
-
this.customMetadata = opts.customMetadata;
|
|
24
23
|
this.downloadTokens = opts.downloadTokens || [];
|
|
25
24
|
if (opts.etag) {
|
|
26
25
|
this.etag = opts.etag;
|
|
@@ -28,6 +27,16 @@ class StoredFileMetadata {
|
|
|
28
27
|
else {
|
|
29
28
|
this.etag = generateETag(this.generation, this.metageneration);
|
|
30
29
|
}
|
|
30
|
+
if (opts.customMetadata) {
|
|
31
|
+
this.customMetadata = {};
|
|
32
|
+
for (const [k, v] of Object.entries(opts.customMetadata)) {
|
|
33
|
+
let stringVal = v;
|
|
34
|
+
if (typeof stringVal !== "string") {
|
|
35
|
+
stringVal = JSON.stringify(v);
|
|
36
|
+
}
|
|
37
|
+
this.customMetadata[k] = stringVal || "";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
31
40
|
this.timeCreated = opts.timeCreated ? new Date(opts.timeCreated) : new Date();
|
|
32
41
|
this.updated = opts.updated ? new Date(opts.updated) : this.timeCreated;
|
|
33
42
|
if (bytes) {
|
|
@@ -350,7 +350,7 @@ async function publishExtensionVersionFromLocalSource(args) {
|
|
|
350
350
|
if (extension &&
|
|
351
351
|
extension.latestVersion &&
|
|
352
352
|
semver.lt(extensionSpec.version, extension.latestVersion)) {
|
|
353
|
-
throw new error_1.FirebaseError(`The version you are trying to publish (${clc.bold(extensionSpec.version)}) is lower than the current version (${clc.bold(extension.latestVersion)}) for the extension '${clc.bold(`${args.publisherId}/${args.extensionId}`)}'. Please make sure this version is greater than the current version (${clc.bold(extension.latestVersion)}) inside of extension.yaml.\n
|
|
353
|
+
throw new error_1.FirebaseError(`The version you are trying to publish (${clc.bold(extensionSpec.version)}) is lower than the current version (${clc.bold(extension.latestVersion)}) for the extension '${clc.bold(`${args.publisherId}/${args.extensionId}`)}'. Please make sure this version is greater than the current version (${clc.bold(extension.latestVersion)}) inside of extension.yaml.\n`, { exit: 104 });
|
|
354
354
|
}
|
|
355
355
|
else if (extension &&
|
|
356
356
|
extension.latestVersion &&
|
package/lib/functions/secrets.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.updateEndpointSecret = exports.pruneAndDestroySecrets = exports.pruneSecrets = exports.inUse = exports.of = exports.ensureSecret = exports.ensureValidKey = exports.labels = exports.isFirebaseManaged = void 0;
|
|
3
|
+
exports.updateEndpointSecret = exports.pruneAndDestroySecrets = exports.pruneSecrets = exports.inUse = exports.getSecretVersions = exports.of = exports.ensureSecret = exports.ensureValidKey = exports.labels = exports.isFirebaseManaged = void 0;
|
|
4
4
|
const utils = require("../utils");
|
|
5
5
|
const poller = require("../operation-poller");
|
|
6
6
|
const gcf = require("../gcp/cloudfunctions");
|
|
@@ -85,6 +85,13 @@ function of(endpoints) {
|
|
|
85
85
|
return endpoints.reduce((envs, endpoint) => [...envs, ...(endpoint.secretEnvironmentVariables || [])], []);
|
|
86
86
|
}
|
|
87
87
|
exports.of = of;
|
|
88
|
+
function getSecretVersions(endpoint) {
|
|
89
|
+
return (endpoint.secretEnvironmentVariables || []).reduce((memo, { secret, version }) => {
|
|
90
|
+
memo[secret] = version || "";
|
|
91
|
+
return memo;
|
|
92
|
+
}, {});
|
|
93
|
+
}
|
|
94
|
+
exports.getSecretVersions = getSecretVersions;
|
|
88
95
|
function inUse(projectInfo, secret, endpoint) {
|
|
89
96
|
const { projectId, projectNumber } = projectInfo;
|
|
90
97
|
for (const sev of of([endpoint])) {
|
package/lib/gcp/secretManager.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ensureServiceAgentRole = exports.setIamPolicy = exports.getIamPolicy = exports.addVersion = exports.deleteSecret = exports.patchSecret = exports.createSecret = exports.toSecretVersionResourceName = exports.parseSecretVersionResourceName = exports.parseSecretResourceName = exports.secretExists = exports.destroySecretVersion = exports.accessSecretVersion = exports.getSecretVersion = exports.listSecretVersions = exports.listSecrets = exports.getSecret = exports.secretManagerConsoleUri = void 0;
|
|
3
|
+
exports.ensureServiceAgentRole = exports.setIamPolicy = exports.getIamPolicy = exports.addVersion = exports.deleteSecret = exports.patchSecret = exports.createSecret = exports.toSecretVersionResourceName = exports.parseSecretVersionResourceName = exports.parseSecretResourceName = exports.secretExists = exports.destroySecretVersion = exports.accessSecretVersion = exports.getSecretVersion = exports.listSecretVersions = exports.getSecretMetadata = exports.listSecrets = exports.getSecret = exports.secretManagerConsoleUri = void 0;
|
|
4
4
|
const utils_1 = require("../utils");
|
|
5
5
|
const error_1 = require("../error");
|
|
6
6
|
const apiv2_1 = require("../apiv2");
|
|
@@ -44,6 +44,20 @@ async function listSecrets(projectId, filter) {
|
|
|
44
44
|
return secrets;
|
|
45
45
|
}
|
|
46
46
|
exports.listSecrets = listSecrets;
|
|
47
|
+
async function getSecretMetadata(projectId, secretName, version) {
|
|
48
|
+
const secretInfo = {};
|
|
49
|
+
try {
|
|
50
|
+
secretInfo.secret = await getSecret(projectId, secretName);
|
|
51
|
+
secretInfo.secretVersion = getSecretVersion(projectId, secretName, version);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
if (err.status !== 404) {
|
|
55
|
+
throw err;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return secretInfo;
|
|
59
|
+
}
|
|
60
|
+
exports.getSecretMetadata = getSecretMetadata;
|
|
47
61
|
async function listSecretVersions(projectId, name, filter) {
|
|
48
62
|
const secrets = [];
|
|
49
63
|
const path = `projects/${projectId}/secrets/${name}/versions`;
|
package/lib/gcp/storage.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getServiceAccount = exports.getBucket = exports.deleteObject = exports.uploadObject = exports.upload = exports.getDefaultBucket = void 0;
|
|
3
|
+
exports.getServiceAccount = exports.listBuckets = exports.getBucket = exports.deleteObject = exports.uploadObject = exports.upload = exports.getDefaultBucket = void 0;
|
|
4
4
|
const path = require("path");
|
|
5
5
|
const api_1 = require("../api");
|
|
6
6
|
const apiv2_1 = require("../apiv2");
|
|
@@ -80,6 +80,20 @@ async function getBucket(bucketName) {
|
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
exports.getBucket = getBucket;
|
|
83
|
+
async function listBuckets(projectId) {
|
|
84
|
+
try {
|
|
85
|
+
const localAPIClient = new apiv2_1.Client({ urlPrefix: api_1.storageOrigin });
|
|
86
|
+
const result = await localAPIClient.get(`/storage/v1/b?project=${projectId}`);
|
|
87
|
+
return result.body.items.map((bucket) => bucket.name);
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
logger_1.logger.debug(err);
|
|
91
|
+
throw new error_1.FirebaseError("Failed to read the storage buckets", {
|
|
92
|
+
original: err,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.listBuckets = listBuckets;
|
|
83
97
|
async function getServiceAccount(projectId) {
|
|
84
98
|
try {
|
|
85
99
|
const localAPIClient = new apiv2_1.Client({ urlPrefix: api_1.storageOrigin });
|
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, rtdbmanagement: false, golang: false, deletegcfartifacts: false, emulatoruisnapshot: false, frameworkawareness: false, functionsparams: false, crossservicerules: false }, configstore_1.configstore.get("previews"));
|
|
6
|
+
exports.previews = Object.assign({ rtdbrules: false, ext: false, extdev: false, rtdbmanagement: false, golang: false, deletegcfartifacts: false, emulatoruisnapshot: false, frameworkawareness: false, functionsparams: false, crossservicerules: false, skipdeployingnoopfunctions: 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/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "firebase-tools",
|
|
3
|
-
"version": "11.8.
|
|
3
|
+
"version": "11.8.1",
|
|
4
4
|
"lockfileVersion": 2,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "firebase-tools",
|
|
9
|
-
"version": "11.8.
|
|
9
|
+
"version": "11.8.1",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@google-cloud/pubsub": "^3.0.1",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"node-fetch": "^2.6.7",
|
|
50
50
|
"open": "^6.3.0",
|
|
51
51
|
"ora": "^5.4.1",
|
|
52
|
-
"portfinder": "^1.0.
|
|
52
|
+
"portfinder": "^1.0.32",
|
|
53
53
|
"progress": "^2.0.3",
|
|
54
54
|
"proxy-agent": "^5.0.0",
|
|
55
55
|
"request": "^2.87.0",
|
|
@@ -9568,11 +9568,11 @@
|
|
|
9568
9568
|
}
|
|
9569
9569
|
},
|
|
9570
9570
|
"node_modules/mkdirp": {
|
|
9571
|
-
"version": "0.5.
|
|
9572
|
-
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.
|
|
9573
|
-
"integrity": "sha512-
|
|
9571
|
+
"version": "0.5.6",
|
|
9572
|
+
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
|
|
9573
|
+
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
|
|
9574
9574
|
"dependencies": {
|
|
9575
|
-
"minimist": "^1.2.
|
|
9575
|
+
"minimist": "^1.2.6"
|
|
9576
9576
|
},
|
|
9577
9577
|
"bin": {
|
|
9578
9578
|
"mkdirp": "bin/cmd.js"
|
|
@@ -10909,13 +10909,13 @@
|
|
|
10909
10909
|
}
|
|
10910
10910
|
},
|
|
10911
10911
|
"node_modules/portfinder": {
|
|
10912
|
-
"version": "1.0.
|
|
10913
|
-
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.
|
|
10914
|
-
"integrity": "sha512-
|
|
10912
|
+
"version": "1.0.32",
|
|
10913
|
+
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz",
|
|
10914
|
+
"integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==",
|
|
10915
10915
|
"dependencies": {
|
|
10916
|
-
"async": "^2.6.
|
|
10917
|
-
"debug": "^3.
|
|
10918
|
-
"mkdirp": "^0.5.
|
|
10916
|
+
"async": "^2.6.4",
|
|
10917
|
+
"debug": "^3.2.7",
|
|
10918
|
+
"mkdirp": "^0.5.6"
|
|
10919
10919
|
},
|
|
10920
10920
|
"engines": {
|
|
10921
10921
|
"node": ">= 0.12.0"
|
|
@@ -21853,11 +21853,11 @@
|
|
|
21853
21853
|
}
|
|
21854
21854
|
},
|
|
21855
21855
|
"mkdirp": {
|
|
21856
|
-
"version": "0.5.
|
|
21857
|
-
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.
|
|
21858
|
-
"integrity": "sha512-
|
|
21856
|
+
"version": "0.5.6",
|
|
21857
|
+
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
|
|
21858
|
+
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
|
|
21859
21859
|
"requires": {
|
|
21860
|
-
"minimist": "^1.2.
|
|
21860
|
+
"minimist": "^1.2.6"
|
|
21861
21861
|
}
|
|
21862
21862
|
},
|
|
21863
21863
|
"mkdirp-classic": {
|
|
@@ -22876,13 +22876,13 @@
|
|
|
22876
22876
|
}
|
|
22877
22877
|
},
|
|
22878
22878
|
"portfinder": {
|
|
22879
|
-
"version": "1.0.
|
|
22880
|
-
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.
|
|
22881
|
-
"integrity": "sha512-
|
|
22879
|
+
"version": "1.0.32",
|
|
22880
|
+
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz",
|
|
22881
|
+
"integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==",
|
|
22882
22882
|
"requires": {
|
|
22883
|
-
"async": "^2.6.
|
|
22884
|
-
"debug": "^3.
|
|
22885
|
-
"mkdirp": "^0.5.
|
|
22883
|
+
"async": "^2.6.4",
|
|
22884
|
+
"debug": "^3.2.7",
|
|
22885
|
+
"mkdirp": "^0.5.6"
|
|
22886
22886
|
},
|
|
22887
22887
|
"dependencies": {
|
|
22888
22888
|
"debug": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "firebase-tools",
|
|
3
|
-
"version": "11.8.
|
|
3
|
+
"version": "11.8.1",
|
|
4
4
|
"description": "Command-Line Interface for Firebase",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"test:hosting-rewrites": "bash ./scripts/hosting-tests/rewrites-tests/run.sh",
|
|
34
34
|
"test:import-export": "bash ./scripts/emulator-import-export-tests/run.sh",
|
|
35
35
|
"test:triggers-end-to-end": "bash ./scripts/triggers-end-to-end-tests/run.sh",
|
|
36
|
+
"test:triggers-end-to-end:inspect": "bash ./scripts/triggers-end-to-end-tests/run.sh inspect",
|
|
36
37
|
"test:storage-deploy": "bash ./scripts/storage-deploy-tests/run.sh",
|
|
37
38
|
"test:storage-emulator-integration": "bash ./scripts/storage-emulator-integration/run.sh"
|
|
38
39
|
},
|
|
@@ -128,7 +129,7 @@
|
|
|
128
129
|
"node-fetch": "^2.6.7",
|
|
129
130
|
"open": "^6.3.0",
|
|
130
131
|
"ora": "^5.4.1",
|
|
131
|
-
"portfinder": "^1.0.
|
|
132
|
+
"portfinder": "^1.0.32",
|
|
132
133
|
"progress": "^2.0.3",
|
|
133
134
|
"proxy-agent": "^5.0.0",
|
|
134
135
|
"request": "^2.87.0",
|