platforms.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import fs from 'node:fs';
  2. import process from 'node:process';
  3. /**
  4. * @typedef {{
  5. * name: string;
  6. * test: () => boolean;
  7. * defaults: import('./index.js').AdapterOptions;
  8. * done: (builder: import('./internal.js').Builder2_0_0) => void;
  9. * }}
  10. * Platform */
  11. // This function is duplicated in adapter-vercel
  12. /** @param {import('./internal.js').Builder2_0_0} builder */
  13. function static_vercel_config(builder) {
  14. /** @type {any[]} */
  15. const prerendered_redirects = [];
  16. /** @type {Record<string, { path: string }>} */
  17. const overrides = {};
  18. for (const [src, redirect] of builder.prerendered.redirects) {
  19. prerendered_redirects.push({
  20. src,
  21. headers: {
  22. Location: redirect.location
  23. },
  24. status: redirect.status
  25. });
  26. }
  27. for (const [path, page] of builder.prerendered.pages) {
  28. if (path.endsWith('/') && path !== '/') {
  29. prerendered_redirects.push(
  30. { src: path, dest: path.slice(0, -1) },
  31. { src: path.slice(0, -1), status: 308, headers: { Location: path } }
  32. );
  33. overrides[page.file] = { path: path.slice(1, -1) };
  34. } else {
  35. overrides[page.file] = { path: path.slice(1) };
  36. }
  37. }
  38. return {
  39. version: 3,
  40. routes: [
  41. ...prerendered_redirects,
  42. {
  43. src: `/${builder.getAppPath()}/immutable/.+`,
  44. headers: {
  45. 'cache-control': 'public, immutable, max-age=31536000'
  46. }
  47. },
  48. {
  49. handle: 'filesystem'
  50. }
  51. ],
  52. overrides
  53. };
  54. }
  55. /** @type {Platform[]} */
  56. export const platforms = [
  57. {
  58. name: 'Vercel',
  59. test: () => !!process.env.VERCEL,
  60. defaults: {
  61. pages: '.vercel/output/static'
  62. },
  63. done: (builder) => {
  64. const config = static_vercel_config(builder);
  65. fs.writeFileSync('.vercel/output/config.json', JSON.stringify(config, null, ' '));
  66. }
  67. }
  68. ];