()
| 10 | |
| 11 | // The Express app is exported so that it can be used by serverless Functions. |
| 12 | export function app(): express.Express { |
| 13 | const server = express(); |
| 14 | const serverDistFolder = dirname(fileURLToPath(import.meta.url)); |
| 15 | const browserDistFolder = resolve(serverDistFolder, '../browser'); |
| 16 | const indexHtml = join(serverDistFolder, 'index.server.html'); |
| 17 | |
| 18 | // const fsCacheHandler = new FileSystemCacheHandler({ |
| 19 | // cacheFolderPath: join(browserDistFolder, '/cache'), |
| 20 | // prerenderedPagesPath: browserDistFolder, |
| 21 | // addPrerenderedPagesToCache: true, |
| 22 | // }); |
| 23 | |
| 24 | const commonEngine = new CommonEngine(); |
| 25 | |
| 26 | const isr = new ISRHandler({ |
| 27 | indexHtml, |
| 28 | invalidateSecretToken: 'MY_TOKEN', // replace with env secret key ex. process.env.REVALIDATE_SECRET_TOKEN |
| 29 | enableLogging: true, |
| 30 | serverDistFolder, |
| 31 | browserDistFolder, |
| 32 | bootstrap, |
| 33 | commonEngine, |
| 34 | backgroundRevalidation: true, // will revalidate in background and serve the cache page first |
| 35 | nonBlockingRender: true, // will serve page first and store in cache in background |
| 36 | modifyGeneratedHtml: customModifyGeneratedHtml, |
| 37 | // cache: fsCacheHandler, |
| 38 | }); |
| 39 | |
| 40 | server.use(express.json()); |
| 41 | |
| 42 | server.post( |
| 43 | '/api/invalidate', |
| 44 | async (req, res) => await isr.invalidate(req, res), |
| 45 | ); |
| 46 | |
| 47 | server.set('view engine', 'html'); |
| 48 | server.set('views', browserDistFolder); |
| 49 | |
| 50 | // Example Express Rest API endpoints |
| 51 | // server.get('/api/**', (req, res) => { }); |
| 52 | // Serve static files from /browser |
| 53 | server.get('*.*', express.static(browserDistFolder, { maxAge: '1y' })); |
| 54 | |
| 55 | server.get( |
| 56 | '*', |
| 57 | // Serve page if it exists in cache |
| 58 | async (req, res, next) => |
| 59 | await isr.serveFromCache(req, res, next, { |
| 60 | providers: [{ provide: RESPONSE, useValue: res }], |
| 61 | }), |
| 62 | |
| 63 | // Server side render the page and add to cache if needed |
| 64 | async (req, res, next) => |
| 65 | await isr.render(req, res, next, { |
| 66 | providers: [{ provide: RESPONSE, useValue: res }], |
| 67 | }), |
| 68 | ); |
| 69 |
no test coverage detected