Skip to content

CI rehearsal for the re-cut 20.0.2 release (do not merge) - #3

Open
armando-navarro wants to merge 10 commits into
release-base-20.0.1from
20.0.x
Open

CI rehearsal for the re-cut 20.0.2 release (do not merge)#3
armando-navarro wants to merge 10 commits into
release-base-20.0.1from
20.0.x

Conversation

@armando-navarro

Copy link
Copy Markdown
Owner

Rehearses CI for the re-cut 20.0.x branch before the 20.0.2 release is tagged. Ten commits: eight cherry-picks of merged main content, the v20-only build machinery, and the version bump. Do not merge.

armando-navarro and others added 10 commits August 12, 2026 12:47
…config (angular#3707)

The Firebase CLI's apps.sdkconfig response includes management-API
fields (projectNumber, version, locationId) alongside the web app
config. The schematic only deleted locationId and inlined the rest
into initializeApp(), so the generated app failed to compile with
TS2769: 'projectNumber' does not exist in type 'FirebaseOptions'.

Keep only the keys FirebaseOptions accepts, so future additions to
the CLI response cannot break the generated config again.
…functions (angular#3730)

The SSR Cloud Function generated by `ng deploy` crashed at cold start:

    Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath
    './lib/logger/compat' is not defined by "exports" in
    node_modules/firebase-functions/package.json

Both generated templates required `firebase-functions/lib/logger/compat`.
firebase-functions declares an exports map, and the internal `lib/` path is not
in it. The exported subpath is `firebase-functions/logger/compat`, which maps
to the same file.

Verified by generating the function source and loading it against a real
firebase-functions install: the shipped path throws, the exported path loads
and emits structured Cloud Logging JSON, which is what the compat logger is
there to do.

This affects the deployed function rather than the build, so it fails at
runtime in Cloud Functions rather than during `ng deploy`, and it is present in
both the 20.x and 21.x lines.

(cherry picked from commit a99f09b)
…ular#3718)

Every platform-browser-dynamic 20.x/21.x patch release requires the exact @angular/core and @angular/common version matching its own patch. Declaring pbd as a required peer therefore makes npm pull in a pbd version whose required core/common usually differs from the app's installed core/common, failing `ng add @angular/fire` with ERESOLVE on Angular >= 20.1 apps.

Nothing in the published package imports platform-browser-dynamic; the only usage in the repo is the Karma test bootstrap (src/test.ts), which is supplied by the root package.json and is unaffected. Removing a peer nothing imports is non-breaking for consumers.

Considered marking the peer optional via peerDependenciesMeta instead (the manifest already uses that pattern for firebase-tools and platform-server); it would also avoid the ERESOLVE on npm, but it keeps advertising a dependency relationship that does not exist and relies on npm-specific resolver behavior. Deletion fixes every package manager.

Refs angular#3667

(cherry picked from commit 8dfcc2c)
…3702)

The optional firebase-tools peerDependency was capped at ^14.0.0, which
excludes the current major (15.x). The ng add version check already
accepts anything >= 14.0.0 and the schematic runs fine on 15.x, so the
narrow range only produces spurious peer-dependency warnings for users
on the current CLI.

(cherry picked from commit 45f138d)
…rated Cloud Functions (angular#3743)

* fix(deploy): target Node 22 and the firebase-functions/v1 API in generated Cloud Functions

The generated function declared engines.node 14, a runtime Cloud
Functions decommissioned in early 2025, so it could not deploy at all.
The gen 1 template also called functions.region() on the
firebase-functions package root, which moved to the /v1 subpath in v6,
so a deployed function crashed at cold start with
TypeError: functions.region is not a function.

Node 22 is the newest runtime Cloud Functions supports and satisfies
the engines ranges of @angular/core and firebase-admin. Node 20 would
deploy today, but its security support ended 2026-04-30. The same
constant picks the Cloud Run base image, now node:22-slim. The docs
example moves off the decommissioned functionsNodeVersion 12.

* docs(site): update the functionsNodeVersion example in the site copy

The site/ copy of the deploy guide still showed the decommissioned 12,
flagged in review. Also fixes a spelling error on the same passage.

* test(deploy): assert the generated template's require path and runtime

Add two specs for what the earlier commit in this PR fixed: the gen 1
template requires firebase-functions/v1, and the default runtime is 22.
Both specs fail when run against the old template. Also moves the /v1
comment above the export so it no longer reads like a parameter
annotation.
…manifest (angular#3745)

* fix(deploy): declare firebase-admin in the generated Cloud Functions manifest

The root package.json had no firebase-admin entry, so the build resolved
its version to undefined and JSON.stringify dropped it from the generated
manifest. firebase-functions 6.x requires firebase-admin eagerly at
module load, so the deployed function crashed at cold start wherever
peers are not auto-installed (--legacy-peer-deps, yarn 1, pnpm).

firebase-functions moves to ^6.1.1, the first release whose peer range
accepts firebase-admin 13.

* build: fail the build when a schematic dependency version is missing

replaceSchematicVersions resolved versions from the root package.json
with no check, and a missing entry was silently dropped from the
shipped versions.json by JSON.stringify. That is how the generated
Cloud Functions manifest lost firebase-admin (angular#3744). The build now
throws, naming the package, and both loops share the guard.
v20's deploy schematics statically import versions.json, so esbuild
inlines the source placeholders and 20.0.1 shipped version:"0.0.0" in
the generated Cloud Functions manifest (ETARGET at install). The build
now rewrites per-package placeholder tokens inside the emitted bundles
and fails if any token survives. v20-only: main reads versions.json at
runtime and never inlines it.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants