firebase-tools 14.18.0 → 14.19.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/README.md +11 -5
- package/lib/appUtils.js +230 -0
- package/lib/apphosting/localbuilds.js +23 -0
- package/lib/bin/mcp.js +16 -1
- package/lib/commands/index.js +8 -0
- package/lib/commands/init.js +0 -2
- package/lib/commands/remoteconfig-experiments-delete.js +32 -0
- package/lib/commands/remoteconfig-experiments-get.js +20 -0
- package/lib/commands/remoteconfig-experiments-list.js +38 -0
- package/lib/commands/remoteconfig-rollouts-delete.js +32 -0
- package/lib/commands/remoteconfig-rollouts-get.js +20 -0
- package/lib/commands/remoteconfig-rollouts-list.js +38 -0
- package/lib/config.js +4 -2
- package/lib/deploy/apphosting/deploy.js +26 -10
- package/lib/deploy/apphosting/prepare.js +23 -1
- package/lib/deploy/apphosting/release.js +5 -0
- package/lib/deploy/apphosting/util.js +4 -3
- package/lib/deploy/functions/deploy.js +5 -4
- package/lib/deploy/functions/params.js +2 -2
- package/lib/emulator/commandUtils.js +3 -3
- package/lib/emulator/controller.js +3 -2
- package/lib/gcp/cloudsql/cloudsqladmin.js +1 -1
- package/lib/gcp/storage.js +73 -20
- package/lib/init/features/dataconnect/index.js +18 -9
- package/lib/init/features/project.js +66 -75
- package/lib/management/projects.js +16 -4
- package/lib/mcp/index.js +9 -0
- package/lib/mcp/prompts/core/deploy.js +8 -8
- package/lib/mcp/prompts/core/init.js +15 -18
- package/lib/mcp/prompts/crashlytics/connect.js +2 -2
- package/lib/mcp/prompts/index.js +30 -9
- package/lib/mcp/resources/guides/init_ai.js +8 -0
- package/lib/mcp/resources/guides/init_auth.js +4 -0
- package/lib/mcp/resources/guides/init_firestore_rules.js +2 -0
- package/lib/mcp/resources/index.js +16 -1
- package/lib/mcp/tools/apphosting/list_backends.js +1 -1
- package/lib/mcp/tools/core/get_environment.js +34 -17
- package/lib/mcp/tools/core/init.js +2 -1
- package/lib/mcp/tools/core/logout.js +1 -2
- package/lib/mcp/tools/functions/get_logs.js +9 -7
- package/lib/mcp/tools/index.js +3 -2
- package/lib/remoteconfig/deleteExperiment.js +32 -0
- package/lib/remoteconfig/deleteRollout.js +33 -0
- package/lib/remoteconfig/getExperiment.js +52 -0
- package/lib/remoteconfig/getRollout.js +43 -0
- package/lib/remoteconfig/interfaces.js +3 -1
- package/lib/remoteconfig/listExperiments.js +72 -0
- package/lib/remoteconfig/listRollouts.js +72 -0
- package/lib/remoteconfig/options.js +4 -0
- package/lib/track.js +6 -4
- package/package.json +3 -1
- package/schema/firebase-config.json +6 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listExperiments = exports.parseExperimentList = void 0;
|
|
4
|
+
const Table = require("cli-table3");
|
|
5
|
+
const api_1 = require("../api");
|
|
6
|
+
const apiv2_1 = require("../apiv2");
|
|
7
|
+
const logger_1 = require("../logger");
|
|
8
|
+
const error_1 = require("../error");
|
|
9
|
+
const TIMEOUT = 30000;
|
|
10
|
+
const TABLE_HEAD = [
|
|
11
|
+
"Experiment ID",
|
|
12
|
+
"Display Name",
|
|
13
|
+
"Service",
|
|
14
|
+
"Description",
|
|
15
|
+
"State",
|
|
16
|
+
"Start Time",
|
|
17
|
+
"End Time",
|
|
18
|
+
"Last Update Time",
|
|
19
|
+
"etag",
|
|
20
|
+
];
|
|
21
|
+
const apiClient = new apiv2_1.Client({
|
|
22
|
+
urlPrefix: (0, api_1.remoteConfigApiOrigin)(),
|
|
23
|
+
apiVersion: "v1",
|
|
24
|
+
});
|
|
25
|
+
const parseExperimentList = (experiments) => {
|
|
26
|
+
if (experiments.length === 0)
|
|
27
|
+
return "\x1b[33mNo experiments found\x1b[0m";
|
|
28
|
+
const table = new Table({ head: TABLE_HEAD, style: { head: ["green"] } });
|
|
29
|
+
for (const experiment of experiments) {
|
|
30
|
+
table.push([
|
|
31
|
+
experiment.name.split("/").pop(),
|
|
32
|
+
experiment.definition.displayName,
|
|
33
|
+
experiment.definition.service,
|
|
34
|
+
experiment.definition.description,
|
|
35
|
+
experiment.state,
|
|
36
|
+
experiment.startTime,
|
|
37
|
+
experiment.endTime,
|
|
38
|
+
experiment.lastUpdateTime,
|
|
39
|
+
experiment.etag,
|
|
40
|
+
]);
|
|
41
|
+
}
|
|
42
|
+
return table.toString();
|
|
43
|
+
};
|
|
44
|
+
exports.parseExperimentList = parseExperimentList;
|
|
45
|
+
async function listExperiments(projectId, namespace, listExperimentOptions) {
|
|
46
|
+
try {
|
|
47
|
+
const params = new URLSearchParams();
|
|
48
|
+
if (listExperimentOptions.pageSize) {
|
|
49
|
+
params.set("page_size", listExperimentOptions.pageSize);
|
|
50
|
+
}
|
|
51
|
+
if (listExperimentOptions.filter) {
|
|
52
|
+
params.set("filter", listExperimentOptions.filter);
|
|
53
|
+
}
|
|
54
|
+
if (listExperimentOptions.pageToken) {
|
|
55
|
+
params.set("page_token", listExperimentOptions.pageToken);
|
|
56
|
+
}
|
|
57
|
+
logger_1.logger.debug(`Query parameters for listExperiments: ${params.toString()}`);
|
|
58
|
+
const res = await apiClient.request({
|
|
59
|
+
method: "GET",
|
|
60
|
+
path: `projects/${projectId}/namespaces/${namespace}/experiments`,
|
|
61
|
+
queryParams: params,
|
|
62
|
+
timeout: TIMEOUT,
|
|
63
|
+
});
|
|
64
|
+
return res.body;
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const error = (0, error_1.getError)(err);
|
|
68
|
+
logger_1.logger.debug(error.message);
|
|
69
|
+
throw new error_1.FirebaseError(`Failed to get Remote Config experiments for project ${projectId}. Error: ${error.message}`, { original: error });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.listExperiments = listExperiments;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listRollouts = exports.parseRolloutList = void 0;
|
|
4
|
+
const api_1 = require("../api");
|
|
5
|
+
const apiv2_1 = require("../apiv2");
|
|
6
|
+
const logger_1 = require("../logger");
|
|
7
|
+
const error_1 = require("../error");
|
|
8
|
+
const Table = require("cli-table3");
|
|
9
|
+
const TIMEOUT = 30000;
|
|
10
|
+
const apiClient = new apiv2_1.Client({
|
|
11
|
+
urlPrefix: (0, api_1.remoteConfigApiOrigin)(),
|
|
12
|
+
apiVersion: "v1",
|
|
13
|
+
});
|
|
14
|
+
const TABLE_HEAD = [
|
|
15
|
+
"Rollout ID",
|
|
16
|
+
"Display Name",
|
|
17
|
+
"Service",
|
|
18
|
+
"Description",
|
|
19
|
+
"State",
|
|
20
|
+
"Start Time",
|
|
21
|
+
"End Time",
|
|
22
|
+
"Last Update Time",
|
|
23
|
+
"ETag",
|
|
24
|
+
];
|
|
25
|
+
const parseRolloutList = (rollouts) => {
|
|
26
|
+
if (rollouts.length === 0) {
|
|
27
|
+
return "\x1b[33mNo rollouts found.\x1b[0m";
|
|
28
|
+
}
|
|
29
|
+
const table = new Table({ head: TABLE_HEAD, style: { head: ["green"] } });
|
|
30
|
+
for (const rollout of rollouts) {
|
|
31
|
+
table.push([
|
|
32
|
+
rollout.name.split("/").pop() || rollout.name,
|
|
33
|
+
rollout.definition.displayName,
|
|
34
|
+
rollout.definition.service,
|
|
35
|
+
rollout.definition.description,
|
|
36
|
+
rollout.state,
|
|
37
|
+
rollout.startTime,
|
|
38
|
+
rollout.endTime,
|
|
39
|
+
rollout.lastUpdateTime,
|
|
40
|
+
rollout.etag,
|
|
41
|
+
]);
|
|
42
|
+
}
|
|
43
|
+
return table.toString();
|
|
44
|
+
};
|
|
45
|
+
exports.parseRolloutList = parseRolloutList;
|
|
46
|
+
async function listRollouts(projectId, namespace, listRolloutOptions) {
|
|
47
|
+
try {
|
|
48
|
+
const params = new URLSearchParams();
|
|
49
|
+
if (listRolloutOptions.pageSize) {
|
|
50
|
+
params.set("page_size", listRolloutOptions.pageSize);
|
|
51
|
+
}
|
|
52
|
+
if (listRolloutOptions.filter) {
|
|
53
|
+
params.set("filter", listRolloutOptions.filter);
|
|
54
|
+
}
|
|
55
|
+
if (listRolloutOptions.pageToken) {
|
|
56
|
+
params.set("page_token", listRolloutOptions.pageToken);
|
|
57
|
+
}
|
|
58
|
+
const res = await apiClient.request({
|
|
59
|
+
method: "GET",
|
|
60
|
+
path: `/projects/${projectId}/namespaces/${namespace}/rollouts`,
|
|
61
|
+
queryParams: params,
|
|
62
|
+
timeout: TIMEOUT,
|
|
63
|
+
});
|
|
64
|
+
return res.body;
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const error = (0, error_1.getError)(err);
|
|
68
|
+
logger_1.logger.debug(error.message);
|
|
69
|
+
throw new error_1.FirebaseError(`Failed to get Remote Config rollouts for project ${projectId}. Error: ${error.message}`, { original: error });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.listRollouts = listRollouts;
|
package/lib/track.js
CHANGED
|
@@ -9,14 +9,16 @@ const logger_1 = require("./logger");
|
|
|
9
9
|
const env_1 = require("./env");
|
|
10
10
|
const pkg = require("../package.json");
|
|
11
11
|
function detectAIAgent() {
|
|
12
|
-
if (process.env.CODEX_SANDBOX)
|
|
13
|
-
return "codex_cli";
|
|
14
12
|
if (process.env.CLAUDECODE)
|
|
15
13
|
return "claude_code";
|
|
16
|
-
if (process.env.
|
|
17
|
-
return "
|
|
14
|
+
if (process.env.CLINE_ACTIVE)
|
|
15
|
+
return "cline";
|
|
16
|
+
if (process.env.CODEX_SANDBOX)
|
|
17
|
+
return "codex_cli";
|
|
18
18
|
if (process.env.CURSOR_AGENT)
|
|
19
19
|
return "cursor";
|
|
20
|
+
if (process.env.GEMINI_CLI)
|
|
21
|
+
return "gemini_cli";
|
|
20
22
|
if (process.env.OPENCODE)
|
|
21
23
|
return "open_code";
|
|
22
24
|
return "unknown";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "firebase-tools",
|
|
3
|
-
"version": "14.
|
|
3
|
+
"version": "14.19.1",
|
|
4
4
|
"description": "Command-Line Interface for Firebase",
|
|
5
5
|
"main": "./lib/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -61,6 +61,8 @@
|
|
|
61
61
|
]
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
|
+
"@apphosting/build": "^0.1.6",
|
|
65
|
+
"@apphosting/common": "^0.0.8",
|
|
64
66
|
"@electric-sql/pglite": "^0.3.3",
|
|
65
67
|
"@electric-sql/pglite-tools": "^0.2.8",
|
|
66
68
|
"@google-cloud/cloud-sql-connector": "^1.3.3",
|
|
@@ -1107,6 +1107,9 @@
|
|
|
1107
1107
|
},
|
|
1108
1108
|
"type": "array"
|
|
1109
1109
|
},
|
|
1110
|
+
"localBuild": {
|
|
1111
|
+
"type": "boolean"
|
|
1112
|
+
},
|
|
1110
1113
|
"rootDir": {
|
|
1111
1114
|
"type": "string"
|
|
1112
1115
|
}
|
|
@@ -1134,6 +1137,9 @@
|
|
|
1134
1137
|
},
|
|
1135
1138
|
"type": "array"
|
|
1136
1139
|
},
|
|
1140
|
+
"localBuild": {
|
|
1141
|
+
"type": "boolean"
|
|
1142
|
+
},
|
|
1137
1143
|
"rootDir": {
|
|
1138
1144
|
"type": "string"
|
|
1139
1145
|
}
|