Skip to content

Commit 214d190

Browse files
authored
Merge branch 'master' into bk-mcp-apphosting
2 parents cc064c0 + 789ba4f commit 214d190

16 files changed

+131
-67
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
1+
- Updated supported runtimes for functions. Default python runtime is now 3.13. (#8534)
12
- Fixed issue where Secret Manager API was not automatically enabled for functions using secrets. (#8528)
23
- Changed artifact registry cleanup policy error to warn for CI/CD workloads #8513
34
- Enhance firebase init apphosting to support local source deploys. (#8479)
45
- Fixed issue where `firebase init hosting:github` didn't correctly parse the repo input. (#8536)
56
- Add GCP API client functions to support App Hosting deploy from source feature. (#8545)
67
- Changed firebase init template for functions to pin runtime version on init. (#8553)
78
- Fix an issue where updating a Cloud Function that retires would add incorrect fields to the updateMask. (#8560)
9+
- Fixed multi tenancy support for SSO users in the auth emulator (#8544)
810
- Add SDK autoinit capabilities to App Hosting emulator. (#8582)
911
- Provision App Hosting compute service account during init flow. (#8580)
12+
- Updated the Firebase Data Connect local toolkit to v2.6.1, which includes the following changes: (#8598)
13+
- Fixed a bug where `@transaction` continued to execute after errors and produces more confusing errors.
14+
- Fixed a bug where rolled-back fields in `@transaction` returned bogus data that had been invalidated by the rollback. They now correctly return null with a corresponding error "(rolled back)".
15+
- Disallow `@check` on side-effect fields if the mutation doesn't have `@transaction`.
16+
- Improved error messages when reading a field of `null` in CEL expressions.
17+
- Updated the underlying Go dependency version from v1.22.2 to v1.22.12.
18+
- Added the `response` binding to Server Values and `@check(expr:)` CEL expressions.

schema/firebase-config.json

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -275,16 +275,12 @@
275275
},
276276
"runtime": {
277277
"enum": [
278-
"nodejs10",
279-
"nodejs12",
280-
"nodejs14",
281-
"nodejs16",
282-
"nodejs18",
283278
"nodejs20",
284279
"nodejs22",
285280
"python310",
286281
"python311",
287-
"python312"
282+
"python312",
283+
"python313"
288284
],
289285
"type": "string"
290286
},

src/bin/mcp.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { FirebaseMcpServer } from "../mcp/index";
55
import { parseArgs } from "util";
66
import { SERVER_FEATURES, ServerFeature } from "../mcp/types";
77
import { markdownDocsOfTools } from "../mcp/tools/index.js";
8+
import { resolve } from "path";
89

910
const STARTUP_MESSAGE = `
1011
This is a running process of the Firebase MCP server. This command should only be executed by an MCP client. An example MCP client configuration might be:
@@ -36,7 +37,10 @@ export async function mcp(): Promise<void> {
3637
const activeFeatures = (values.only || "")
3738
.split(",")
3839
.filter((f) => SERVER_FEATURES.includes(f as ServerFeature)) as ServerFeature[];
39-
const server = new FirebaseMcpServer({ activeFeatures, projectRoot: values.dir });
40+
const server = new FirebaseMcpServer({
41+
activeFeatures,
42+
projectRoot: values.dir ? resolve(values.dir) : undefined,
43+
});
4044
await server.start();
4145
if (process.stdin.isTTY) process.stderr.write(STARTUP_MESSAGE);
4246
}

src/command.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ export class Command {
311311

312312
if (getInheritedOption(options, "json")) {
313313
options.nonInteractive = true;
314-
} else {
314+
} else if (!options.isMCP) {
315315
useConsoleLoggers();
316316
}
317317

src/deploy/functions/runtimes/python/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ export function getPythonBinary(
6060
return "python3.11";
6161
} else if (runtime === "python312") {
6262
return "python3.12";
63+
} else if (runtime === "python313") {
64+
return "python3.13";
6365
}
6466
assertExhaustive(runtime, `Unhandled python runtime ${runtime as string}`);
6567
}

src/deploy/functions/runtimes/supported/supported.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ describe("supported runtimes", () => {
4646
expect(logLabeledWarning).to.have.been.calledWith(
4747
"functions",
4848
"Runtime Node.js 20 was deprecated on 2026-04-30 and will be " +
49-
"decommissioned on 2026-10-31, after which you will not be able to " +
49+
"decommissioned on 2026-10-30, after which you will not be able to " +
5050
"deploy without upgrading. Consider upgrading now to avoid disruption. See " +
5151
"https://cloud.google.com/functions/docs/runtime-support for full " +
5252
"details on the lifecycle policy",
@@ -58,7 +58,7 @@ describe("supported runtimes", () => {
5858
expect(logLabeledWarning).to.have.been.calledWith(
5959
"functions",
6060
"Runtime Node.js 20 will be deprecated on 2026-04-30 and will be " +
61-
"decommissioned on 2026-10-31, after which you will not be able to " +
61+
"decommissioned on 2026-10-30, after which you will not be able to " +
6262
"deploy without upgrading. Consider upgrading now to avoid disruption. See " +
6363
"https://cloud.google.com/functions/docs/runtime-support for full " +
6464
"details on the lifecycle policy",

src/deploy/functions/runtimes/supported/types.ts

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,63 +49,69 @@ export const RUNTIMES = runtimes({
4949
},
5050
nodejs10: {
5151
friendly: "Node.js 10",
52-
status: "GA",
52+
status: "decommissioned",
5353
deprecationDate: "2024-01-30",
5454
decommissionDate: "2025-01-30",
5555
},
5656
nodejs12: {
5757
friendly: "Node.js 12",
58-
status: "GA",
58+
status: "decommissioned",
5959
deprecationDate: "2024-01-30",
6060
decommissionDate: "2025-01-30",
6161
},
6262
nodejs14: {
6363
friendly: "Node.js 14",
64-
status: "GA",
64+
status: "decommissioned",
6565
deprecationDate: "2024-01-30",
6666
decommissionDate: "2025-01-30",
6767
},
6868
nodejs16: {
6969
friendly: "Node.js 16",
70-
status: "GA",
70+
status: "decommissioned",
7171
deprecationDate: "2024-01-30",
7272
decommissionDate: "2025-01-30",
7373
},
7474
nodejs18: {
7575
friendly: "Node.js 18",
76-
status: "GA",
76+
status: "decommissioned",
7777
deprecationDate: "2025-04-30",
78-
decommissionDate: "2025-10-31",
78+
decommissionDate: "2025-10-30",
7979
},
8080
nodejs20: {
8181
friendly: "Node.js 20",
8282
status: "GA",
8383
deprecationDate: "2026-04-30",
84-
decommissionDate: "2026-10-31",
84+
decommissionDate: "2026-10-30",
8585
},
8686
nodejs22: {
8787
friendly: "Node.js 22",
8888
status: "GA",
8989
deprecationDate: "2027-04-30",
90-
decommissionDate: "2027-10-31",
90+
decommissionDate: "2028-10-31",
9191
},
9292
python310: {
9393
friendly: "Python 3.10",
9494
status: "GA",
9595
deprecationDate: "2026-10-04",
96-
decommissionDate: "2027-04-30",
96+
decommissionDate: "2027-04-04",
9797
},
9898
python311: {
9999
friendly: "Python 3.11",
100100
status: "GA",
101101
deprecationDate: "2027-10-24",
102-
decommissionDate: "2028-04-30",
102+
decommissionDate: "2028-04-24",
103103
},
104104
python312: {
105105
friendly: "Python 3.12",
106106
status: "GA",
107107
deprecationDate: "2028-10-02",
108-
decommissionDate: "2029-04-30",
108+
decommissionDate: "2029-04-02",
109+
},
110+
python313: {
111+
friendly: "Python 3.13",
112+
status: "GA",
113+
deprecationDate: "2029-10-10",
114+
decommissionDate: "2030-04-10",
109115
},
110116
});
111117

src/emulator/auth/widget_ui.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ assert(!internalError, internalError);
2121
2222
var apiKey = query.get('apiKey');
2323
var appName = query.get('appName');
24+
var tenantId = query.get('tid');
2425
var authType = query.get('authType');
2526
var providerId = query.get('providerId');
2627
var redirectUrl = query.get('redirectUrl');
@@ -192,7 +193,7 @@ function finishWithUser(urlEncodedIdToken, email) {
192193
urlResponse: url,
193194
sessionId: "ValueNotUsedByAuthEmulator",
194195
postBody: "",
195-
tenantId: null,
196+
tenantId: tenantId,
196197
error: null,
197198
});
198199
}

src/emulator/downloadableEmulatorInfo.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,22 @@
3939
},
4040
"dataconnect": {
4141
"darwin": {
42-
"version": "2.5.0",
43-
"expectedSize": 27378432,
44-
"expectedChecksum": "d18bc3a07be90886f6ec212f3393b66e",
45-
"expectedChecksumSHA256": "a863e04f45a6704c25f1a7155c13dac5ed5f481f1a75ed11e45abed570d13117"
42+
"version": "2.6.1",
43+
"expectedSize": 27415296,
44+
"expectedChecksum": "5814d22b06b1321409f40693dfe47288",
45+
"expectedChecksumSHA256": "8df1cfac6ef747909b3c18b57ba52b70a11d53b9d0a22b197011d6550ceca133"
4646
},
4747
"win32": {
48-
"version": "2.5.0",
49-
"expectedSize": 27836416,
50-
"expectedChecksum": "d335e9295b00381eb12682bc944ffef7",
51-
"expectedChecksumSHA256": "8a216c475c4796bfcd65bcfb52aa303b3d79f389e3675dbf37702052d82c04c5"
48+
"version": "2.6.1",
49+
"expectedSize": 27875328,
50+
"expectedChecksum": "21381052c2bf767ee84fb85975cfd4d5",
51+
"expectedChecksumSHA256": "6bebaa9575b460c4fa170b191d94722923a3c869bc1eca24c7e444428e6b7a70"
5252
},
5353
"linux": {
54-
"version": "2.5.0",
55-
"expectedSize": 27295896,
56-
"expectedChecksum": "dc44dbfd972a9b3608794909df517077",
57-
"expectedChecksumSHA256": "7276447968da6375d3818f5011b1474f39510ec53b2fa14c4b771f795e19e7bd"
54+
"version": "2.6.1",
55+
"expectedSize": 27332760,
56+
"expectedChecksum": "0480a92f5af8e8441e680dc4e7995263",
57+
"expectedChecksumSHA256": "4f60baf4649c670227314302056f50b1c40ccc8d673b98d16935977508342a67"
5858
}
5959
}
6060
}

src/functions/projectConfig.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ describe("projectConfig", () => {
2929
});
3030

3131
it("fails validation given config w/o source", () => {
32-
expect(() => projectConfig.validate([{ runtime: "nodejs10" }])).to.throw(
32+
expect(() => projectConfig.validate([{ runtime: "nodejs22" }])).to.throw(
3333
FirebaseError,
3434
/codebase source must be specified/,
3535
);
@@ -84,7 +84,7 @@ describe("projectConfig", () => {
8484
});
8585

8686
it("fails validation given singleton config w/o source", () => {
87-
expect(() => projectConfig.normalizeAndValidate({ runtime: "nodejs10" })).to.throw(
87+
expect(() => projectConfig.normalizeAndValidate({ runtime: "nodejs22" })).to.throw(
8888
FirebaseError,
8989
/codebase source must be specified/,
9090
);
@@ -98,7 +98,7 @@ describe("projectConfig", () => {
9898
});
9999

100100
it("fails validation given multi-resource config w/o source", () => {
101-
expect(() => projectConfig.normalizeAndValidate([{ runtime: "nodejs10" }])).to.throw(
101+
expect(() => projectConfig.normalizeAndValidate([{ runtime: "nodejs22" }])).to.throw(
102102
FirebaseError,
103103
/codebase source must be specified/,
104104
);

0 commit comments

Comments
 (0)