diff --git a/CHANGELOG.md b/CHANGELOG.md index b641e53ea8a..41d57cefcf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ - Added code generation of React hooks for Data Connect - Genkit init improvements around gcloud login and flow input values. - Fixes symbol generation when uploading Unity 6 symbols to Crashlytics. +- Fixed SSR issues in Angular 19 by adding support for default and reqHandler exports. (#8145) +- Added Angular 19 as supported version. (#8145) diff --git a/src/frameworks/angular/index.ts b/src/frameworks/angular/index.ts index e023b213d4d..b870215e1fb 100644 --- a/src/frameworks/angular/index.ts +++ b/src/frameworks/angular/index.ts @@ -36,7 +36,7 @@ export const docsUrl = "https://firebase.google.com/docs/hosting/frameworks/angu const DEFAULT_BUILD_SCRIPT = ["ng build"]; -export const supportedRange = "16 - 18"; +export const supportedRange = "16 - 19"; export async function discover(dir: string): Promise { if (!(await pathExists(join(dir, "package.json")))) return; @@ -243,19 +243,24 @@ exports.handle = function(req,res) { };\n`; } else if (serverOutputPath) { bootstrapScript = ` - const app = new Promise((resolve) => { + const app = new Promise((resolve, reject) => { setTimeout(() => { const port = process.env.PORT; const socket = 'express.sock'; process.env.PORT = socket; - + ${ serverEntry?.endsWith(".mjs") ? `import(\`./${serverOutputPath}/${serverEntry}\`)` : `Promise.resolve(require('./${serverOutputPath}/${serverEntry}'))` - }.then(({ app }) => { - process.env.PORT = port; - resolve(app()); + }.then(({ default: defHandler, reqHandler, app }) => { + const handler = app?.() ?? reqHandler ?? defHandler; + if (!handler) { + reject(\`The file at "./${serverOutputPath}/${serverEntry}" did not export a valid request handler. Expected exports: 'app', 'default', or 'reqHandler'.\`); + } else { + process.env.PORT = port; + resolve(handler); + } }); }, 0); });