@reckona/mreact-router 0.0.203 → 0.0.205

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/README.md +53 -9
  2. package/dist/actions.d.ts +6 -0
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +70 -10
  5. package/dist/actions.js.map +1 -1
  6. package/dist/adapters/aws-lambda.d.ts +15 -4
  7. package/dist/adapters/aws-lambda.d.ts.map +1 -1
  8. package/dist/adapters/aws-lambda.js +301 -63
  9. package/dist/adapters/aws-lambda.js.map +1 -1
  10. package/dist/adapters/cloudflare.d.ts +2 -1
  11. package/dist/adapters/cloudflare.d.ts.map +1 -1
  12. package/dist/adapters/cloudflare.js +18 -10
  13. package/dist/adapters/cloudflare.js.map +1 -1
  14. package/dist/adapters/edge.d.ts +1 -1
  15. package/dist/adapters/edge.d.ts.map +1 -1
  16. package/dist/adapters/edge.js.map +1 -1
  17. package/dist/adapters/node.d.ts +5 -3
  18. package/dist/adapters/node.d.ts.map +1 -1
  19. package/dist/adapters/node.js +2 -1
  20. package/dist/adapters/node.js.map +1 -1
  21. package/dist/adapters/static.d.ts.map +1 -1
  22. package/dist/adapters/static.js +24 -2
  23. package/dist/adapters/static.js.map +1 -1
  24. package/dist/build.d.ts +1 -0
  25. package/dist/build.d.ts.map +1 -1
  26. package/dist/build.js +91 -5
  27. package/dist/build.js.map +1 -1
  28. package/dist/built-runtime.d.ts +2 -0
  29. package/dist/built-runtime.d.ts.map +1 -1
  30. package/dist/built-runtime.js +16 -0
  31. package/dist/built-runtime.js.map +1 -1
  32. package/dist/cache.d.ts +3 -1
  33. package/dist/cache.d.ts.map +1 -1
  34. package/dist/cache.js +211 -13
  35. package/dist/cache.js.map +1 -1
  36. package/dist/cli.js +12 -1
  37. package/dist/cli.js.map +1 -1
  38. package/dist/client.d.ts.map +1 -1
  39. package/dist/client.js +32 -1
  40. package/dist/client.js.map +1 -1
  41. package/dist/config.d.ts +3 -0
  42. package/dist/config.d.ts.map +1 -1
  43. package/dist/config.js +21 -2
  44. package/dist/config.js.map +1 -1
  45. package/dist/csp.d.ts +1 -0
  46. package/dist/csp.d.ts.map +1 -1
  47. package/dist/csp.js +11 -6
  48. package/dist/csp.js.map +1 -1
  49. package/dist/dehydrate-policy.d.ts +3 -0
  50. package/dist/dehydrate-policy.d.ts.map +1 -0
  51. package/dist/dehydrate-policy.js +16 -0
  52. package/dist/dehydrate-policy.js.map +1 -0
  53. package/dist/dev-server.d.ts +7 -2
  54. package/dist/dev-server.d.ts.map +1 -1
  55. package/dist/dev-server.js +120 -11
  56. package/dist/dev-server.js.map +1 -1
  57. package/dist/http.d.ts +1 -1
  58. package/dist/http.d.ts.map +1 -1
  59. package/dist/http.js +147 -7
  60. package/dist/http.js.map +1 -1
  61. package/dist/index.d.ts +4 -3
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +1 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/logger.d.ts +22 -1
  66. package/dist/logger.d.ts.map +1 -1
  67. package/dist/logger.js +22 -8
  68. package/dist/logger.js.map +1 -1
  69. package/dist/metadata.d.ts +8 -0
  70. package/dist/metadata.d.ts.map +1 -1
  71. package/dist/metadata.js +60 -22
  72. package/dist/metadata.js.map +1 -1
  73. package/dist/navigation-marker.d.ts.map +1 -1
  74. package/dist/navigation-marker.js +72 -9
  75. package/dist/navigation-marker.js.map +1 -1
  76. package/dist/navigation.d.ts +1 -0
  77. package/dist/navigation.d.ts.map +1 -1
  78. package/dist/navigation.js +1 -1
  79. package/dist/navigation.js.map +1 -1
  80. package/dist/node-server.d.ts +5 -2
  81. package/dist/node-server.d.ts.map +1 -1
  82. package/dist/node-server.js +75 -6
  83. package/dist/node-server.js.map +1 -1
  84. package/dist/prerender-entry.d.ts +14 -0
  85. package/dist/prerender-entry.d.ts.map +1 -1
  86. package/dist/prerender-entry.js +40 -3
  87. package/dist/prerender-entry.js.map +1 -1
  88. package/dist/render.d.ts +9 -1
  89. package/dist/render.d.ts.map +1 -1
  90. package/dist/render.js +102 -123
  91. package/dist/render.js.map +1 -1
  92. package/dist/serve.d.ts +8 -2
  93. package/dist/serve.d.ts.map +1 -1
  94. package/dist/serve.js +22 -20
  95. package/dist/serve.js.map +1 -1
  96. package/dist/session.d.ts.map +1 -1
  97. package/dist/session.js +52 -19
  98. package/dist/session.js.map +1 -1
  99. package/dist/upgrade.d.ts +59 -2
  100. package/dist/upgrade.d.ts.map +1 -1
  101. package/dist/upgrade.js +282 -1
  102. package/dist/upgrade.js.map +1 -1
  103. package/dist/vite-config.d.ts +2 -0
  104. package/dist/vite-config.d.ts.map +1 -1
  105. package/dist/vite-config.js +2 -0
  106. package/dist/vite-config.js.map +1 -1
  107. package/dist/vite.d.ts +4 -1
  108. package/dist/vite.d.ts.map +1 -1
  109. package/dist/vite.js +117 -6
  110. package/dist/vite.js.map +1 -1
  111. package/package.json +11 -11
  112. package/src/actions.ts +81 -11
  113. package/src/adapters/aws-lambda.ts +426 -115
  114. package/src/adapters/cloudflare.ts +29 -13
  115. package/src/adapters/edge.ts +2 -0
  116. package/src/adapters/node.ts +8 -10
  117. package/src/adapters/static.ts +31 -2
  118. package/src/build.ts +117 -10
  119. package/src/built-runtime.ts +28 -0
  120. package/src/cache.ts +262 -15
  121. package/src/cli.ts +14 -1
  122. package/src/client.ts +32 -1
  123. package/src/config.ts +43 -6
  124. package/src/csp.ts +14 -11
  125. package/src/dehydrate-policy.ts +23 -0
  126. package/src/dev-server.ts +188 -15
  127. package/src/http.ts +172 -6
  128. package/src/index.ts +14 -1
  129. package/src/logger.ts +47 -10
  130. package/src/metadata.ts +125 -60
  131. package/src/navigation-marker.ts +79 -9
  132. package/src/navigation.ts +1 -1
  133. package/src/node-server.ts +128 -22
  134. package/src/prerender-entry.ts +52 -3
  135. package/src/render.ts +807 -753
  136. package/src/serve.ts +49 -56
  137. package/src/session.ts +56 -25
  138. package/src/upgrade.ts +402 -3
  139. package/src/vite-config.ts +6 -0
  140. package/src/vite.ts +157 -5
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAiHA,MAAM,UAAU,aAAa,CAC3B,MAAmC,EACnC,KAAwB,EACxB,KAAwB;IAExB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;IAE7B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,cAAc,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAE3B,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;QACzE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAO,IAAI,KAAK;QAChB,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU,CAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAgB,EAChB,OAAyB;IAEzB,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ;QACnC,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAuB;IACrD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;QACtB,IAAI,EAAE,OAAO;KACd,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Names the severity channel used for app-router structured logs.\n */\nexport type AppRouterLogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\n/**\n * Names the runtime that handled an app-router request.\n */\nexport type AppRouterRuntime = \"aws-lambda\" | \"cloudflare\" | \"edge\" | \"node\";\n\n/**\n * Receives structured app-router log events by severity.\n */\nexport interface AppRouterLogger {\n debug?: ((event: AppRouterLogEvent) => void | Promise<void>) | undefined;\n error?: ((event: AppRouterLogEvent) => void | Promise<void>) | undefined;\n info?: ((event: AppRouterLogEvent) => void | Promise<void>) | undefined;\n warn?: ((event: AppRouterLogEvent) => void | Promise<void>) | undefined;\n}\n\n/**\n * Represents every structured log event emitted by the app router.\n */\nexport type AppRouterLogEvent =\n | AppRouterRequestStartLogEvent\n | AppRouterRequestEndLogEvent\n | AppRouterRequestErrorLogEvent\n | AppRouterRequestTimingLogEvent\n | AppRouterRenderTimingLogEvent\n | AppRouterCspInlineNonceWarningLogEvent;\n\n/**\n * Logs the start of an app-router request.\n */\nexport interface AppRouterRequestStartLogEvent {\n method: string;\n path: string;\n runtime: AppRouterRuntime;\n type: \"router:request:start\";\n}\n\n/**\n * Logs the successful completion of an app-router request.\n */\nexport interface AppRouterRequestEndLogEvent {\n durationMs: number;\n method: string;\n path: string;\n runtime: AppRouterRuntime;\n status: number;\n type: \"router:request:end\";\n}\n\n/**\n * Logs a request that ended with an app-router error response.\n */\nexport interface AppRouterRequestErrorLogEvent {\n durationMs: number;\n error: AppRouterLogError;\n method: string;\n path: string;\n runtime: AppRouterRuntime;\n type: \"router:request:error\";\n}\n\n/**\n * Logs per-phase timings for a complete app-router request.\n */\nexport interface AppRouterRequestTimingLogEvent {\n durationMs: number;\n method: string;\n path: string;\n phases: Record<string, number>;\n runtime: AppRouterRuntime;\n status: number;\n type: \"router:request:timing\";\n}\n\n/**\n * Logs per-phase timings for route rendering.\n */\nexport interface AppRouterRenderTimingLogEvent {\n method: string;\n path: string;\n phases: Record<string, number>;\n status: number;\n type: \"router:render:timing\";\n}\n\n/**\n * Logs an inline CSP nonce warning emitted while rendering a route.\n */\nexport interface AppRouterCspInlineNonceWarningLogEvent {\n directive: \"script-src\" | \"style-src\";\n path: string;\n tag: \"script\" | \"style\";\n type: \"router:csp:inline-nonce-warning\";\n}\n\n/**\n * Serializes an error for app-router structured logs.\n */\nexport interface AppRouterLogError {\n message: string;\n name: string;\n}\n\nexport interface RouterRequestLogFields {\n method: string;\n path: string;\n runtime: AppRouterRuntime;\n}\n\nexport function emitRouterLog(\n logger: AppRouterLogger | undefined,\n level: AppRouterLogLevel,\n event: AppRouterLogEvent,\n): void {\n const sink = logger?.[level];\n\n if (sink === undefined) {\n return;\n }\n\n queueMicrotask(() => {\n try {\n const result = sink(event);\n\n if (isPromiseLike(result)) {\n result.catch(() => {});\n }\n } catch {\n // Logger sinks are best-effort and must never affect request handling.\n }\n });\n}\n\nfunction isPromiseLike(value: unknown): value is Promise<void> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"catch\" in value &&\n typeof value.catch === \"function\"\n );\n}\n\nexport function requestLogFields(\n request: Request,\n runtime: AppRouterRuntime,\n): RouterRequestLogFields {\n return {\n method: request.method,\n path: new URL(request.url).pathname,\n runtime,\n };\n}\n\nexport function nodeRequestPath(url: string | undefined): string {\n if (url === undefined || url === \"\") {\n return \"/\";\n }\n\n try {\n return new URL(url, \"http://mreact.local\").pathname;\n } catch {\n return \"/\";\n }\n}\n\nexport function logNow(): number {\n return performance.now();\n}\n\nexport function logDurationMs(startedAt: number): number {\n return Math.max(0, Math.round((logNow() - startedAt) * 1000) / 1000);\n}\n\nexport function logError(error: unknown): AppRouterLogError {\n if (error instanceof Error) {\n return {\n message: error.message,\n name: error.name,\n };\n }\n\n return {\n message: String(error),\n name: \"Error\",\n };\n}\n"]}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AA0IA,MAAM,UAAU,aAAa,CAC3B,MAAmC,EACnC,KAAwB,EACxB,KAAwB;IAExB,IAAI,IAAwC,CAAC;IAC7C,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,cAAc,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAE3B,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;QACzE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAO,IAAI,KAAK;QAChB,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU,CAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAgB,EAChB,OAAyB;IAEzB,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ;QACnC,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAuB;IACrD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,IAAI,CAAC;QACH,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC9B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;aACzB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;YACtB,IAAI,EAAE,OAAO;SACd,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,6BAA6B;YACtC,IAAI,EAAE,OAAO;SACd,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["/**\n * Names the severity channel used for app-router structured logs.\n */\nexport type AppRouterLogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\n/**\n * Names the runtime that handled an app-router request.\n */\nexport type AppRouterRuntime = \"aws-lambda\" | \"cloudflare\" | \"edge\" | \"node\";\n\n/**\n * Receives structured app-router log events by severity.\n */\nexport interface AppRouterLogger {\n debug?: ((event: AppRouterLogEvent) => void | Promise<void>) | undefined;\n error?: ((event: AppRouterLogEvent) => void | Promise<void>) | undefined;\n info?: ((event: AppRouterLogEvent) => void | Promise<void>) | undefined;\n warn?: ((event: AppRouterLogEvent) => void | Promise<void>) | undefined;\n}\n\n/**\n * Represents every structured log event emitted by the app router.\n */\nexport type AppRouterLogEvent =\n | AppRouterRequestStartLogEvent\n | AppRouterRequestEndLogEvent\n | AppRouterRequestErrorLogEvent\n | AppRouterRequestTimingLogEvent\n | AppRouterRenderTimingLogEvent\n | AppRouterCspInlineNonceWarningLogEvent\n | AppRouterUpgradeErrorLogEvent\n | AppRouterUpgradeRejectedLogEvent;\n\n/**\n * Logs the start of an app-router request.\n */\nexport interface AppRouterRequestStartLogEvent {\n method: string;\n path: string;\n runtime: AppRouterRuntime;\n type: \"router:request:start\";\n}\n\n/**\n * Logs the successful completion of an app-router request.\n */\nexport interface AppRouterRequestEndLogEvent {\n durationMs: number;\n method: string;\n path: string;\n runtime: AppRouterRuntime;\n status: number;\n type: \"router:request:end\";\n}\n\n/**\n * Logs a request that ended with an app-router error response.\n */\nexport interface AppRouterRequestErrorLogEvent {\n durationMs: number;\n error: AppRouterLogError;\n method: string;\n path: string;\n runtime: AppRouterRuntime;\n type: \"router:request:error\";\n}\n\n/**\n * Logs a failed or timed-out HTTP upgrade handler.\n */\nexport interface AppRouterUpgradeErrorLogEvent {\n durationMs: number;\n error: AppRouterLogError;\n method: string;\n path: string;\n runtime: \"node\";\n type: \"router:upgrade:error\";\n}\n\n/**\n * Logs an HTTP upgrade rejected before application ownership.\n */\nexport interface AppRouterUpgradeRejectedLogEvent {\n method: string;\n path: string;\n reason: \"disallowed-origin\" | \"malformed-origin\" | \"missing-origin\" | \"opaque-origin\";\n runtime: \"node\";\n type: \"router:upgrade:rejected\";\n}\n\n/**\n * Logs per-phase timings for a complete app-router request.\n */\nexport interface AppRouterRequestTimingLogEvent {\n durationMs: number;\n method: string;\n path: string;\n phases: Record<string, number>;\n runtime: AppRouterRuntime;\n status: number;\n type: \"router:request:timing\";\n}\n\n/**\n * Logs per-phase timings for route rendering.\n */\nexport interface AppRouterRenderTimingLogEvent {\n method: string;\n path: string;\n phases: Record<string, number>;\n status: number;\n type: \"router:render:timing\";\n}\n\n/**\n * Logs an inline CSP nonce warning emitted while rendering a route.\n */\nexport interface AppRouterCspInlineNonceWarningLogEvent {\n directive: \"script-src\" | \"style-src\";\n path: string;\n tag: \"script\" | \"style\";\n type: \"router:csp:inline-nonce-warning\";\n}\n\n/**\n * Serializes an error for app-router structured logs.\n */\nexport interface AppRouterLogError {\n message: string;\n name: string;\n}\n\nexport interface RouterRequestLogFields {\n method: string;\n path: string;\n runtime: AppRouterRuntime;\n}\n\nexport function emitRouterLog(\n logger: AppRouterLogger | undefined,\n level: AppRouterLogLevel,\n event: AppRouterLogEvent,\n): void {\n let sink: AppRouterLogger[AppRouterLogLevel];\n try {\n sink = logger?.[level];\n } catch {\n return;\n }\n\n if (sink === undefined) {\n return;\n }\n\n queueMicrotask(() => {\n try {\n const result = sink(event);\n\n if (isPromiseLike(result)) {\n result.catch(() => {});\n }\n } catch {\n // Logger sinks are best-effort and must never affect request handling.\n }\n });\n}\n\nfunction isPromiseLike(value: unknown): value is Promise<void> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"catch\" in value &&\n typeof value.catch === \"function\"\n );\n}\n\nexport function requestLogFields(\n request: Request,\n runtime: AppRouterRuntime,\n): RouterRequestLogFields {\n return {\n method: request.method,\n path: new URL(request.url).pathname,\n runtime,\n };\n}\n\nexport function nodeRequestPath(url: string | undefined): string {\n if (url === undefined || url === \"\") {\n return \"/\";\n }\n\n try {\n return new URL(url, \"http://mreact.local\").pathname;\n } catch {\n return \"/\";\n }\n}\n\nexport function logNow(): number {\n return performance.now();\n}\n\nexport function logDurationMs(startedAt: number): number {\n return Math.max(0, Math.round((logNow() - startedAt) * 1000) / 1000);\n}\n\nexport function logError(error: unknown): AppRouterLogError {\n try {\n if (error instanceof Error) {\n return {\n message: String(error.message),\n name: String(error.name),\n };\n }\n\n return {\n message: String(error),\n name: \"Error\",\n };\n } catch {\n return {\n message: \"Unknown non-coercible error\",\n name: \"Error\",\n };\n }\n}\n"]}
@@ -1,7 +1,15 @@
1
1
  import type { AppRoute } from "./routes.js";
2
2
  import type { RobotsManifest, RouteMetadata, RouteParams, SitemapEntry } from "./types.js";
3
+ export interface FileConventionMetadataTemplate {
4
+ appleIconPath?: string | undefined;
5
+ iconPath?: string | undefined;
6
+ openGraphImageFallbackPath?: string | undefined;
7
+ openGraphImageRoutePath?: string | undefined;
8
+ }
3
9
  export declare function mergeRouteMetadata(metadata: readonly RouteMetadata[]): RouteMetadata | undefined;
4
10
  export declare function applyFileConventionMetadata(metadata: RouteMetadata | undefined, routes: readonly AppRoute[], filename: string, params: RouteParams): RouteMetadata | undefined;
11
+ export declare function fileConventionMetadataTemplate(routes: readonly AppRoute[], filename: string): FileConventionMetadataTemplate;
12
+ export declare function applyFileConventionMetadataTemplate(metadata: RouteMetadata | undefined, template: FileConventionMetadataTemplate, params: RouteParams): RouteMetadata | undefined;
5
13
  export declare function injectHeadMetadata(html: string, metadata: RouteMetadata | undefined): string;
6
14
  export declare function responseHeadersForMetadata(metadata: RouteMetadata | undefined, request: Request, extra?: Readonly<Record<string, string>>): HeadersInit;
7
15
  export declare function validateRouteMetadata(metadata: RouteMetadata | undefined, path?: string): RouteMetadata | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,EAKV,cAAc,EAEd,aAAa,EACb,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAC;AAQpB,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,GAAG,aAAa,GAAG,SAAS,CA+BhG;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,MAAM,EAAE,SAAS,QAAQ,EAAE,EAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,GAClB,aAAa,GAAG,SAAS,CA4B3B;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,CA6D5F;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACvC,WAAW,CAoBb;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,IAAI,SAAa,GAChB,aAAa,GAAG,SAAS,CA0B3B;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CA6BhE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAmBzE"}
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,EAKV,cAAc,EAEd,aAAa,EACb,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,8BAA8B;IAC7C,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,0BAA0B,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD,uBAAuB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9C;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,GAAG,aAAa,GAAG,SAAS,CA+BhG;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,MAAM,EAAE,SAAS,QAAQ,EAAE,EAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,GAClB,aAAa,GAAG,SAAS,CAM3B;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,SAAS,QAAQ,EAAE,EAC3B,QAAQ,EAAE,MAAM,GACf,8BAA8B,CA6BhC;AAED,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,QAAQ,EAAE,8BAA8B,EACxC,MAAM,EAAE,WAAW,GAClB,aAAa,GAAG,SAAS,CAuB3B;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,CA6D5F;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACvC,WAAW,CAoBb;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,IAAI,SAAa,GAChB,aAAa,GAAG,SAAS,CA0B3B;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CA6BhE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAmBzE"}
package/dist/metadata.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { escapeHtmlAttribute, escapeHtmlText as escapeHtml, } from "@reckona/mreact-shared/html-escape";
2
- import { isDangerousHtmlAttribute, isUnsafeUrlAttribute, } from "@reckona/mreact-shared/url-safety";
2
+ import { isDangerousHtmlAttribute, isUnsafeMetaRefreshContent, isUnsafeUrlAttribute, } from "@reckona/mreact-shared/url-safety";
3
3
  import { contentSecurityPolicy } from "./csp.js";
4
4
  import { routeSecurityHeaders } from "./security-headers.js";
5
5
  const DEFAULT_HTML_RESPONSE_HEADERS = Object.freeze({
@@ -35,15 +35,42 @@ export function mergeRouteMetadata(metadata) {
35
35
  }, {});
36
36
  }
37
37
  export function applyFileConventionMetadata(metadata, routes, filename, params) {
38
- const next = metadata === undefined ? {} : { ...metadata };
38
+ return applyFileConventionMetadataTemplate(metadata, fileConventionMetadataTemplate(routes, filename), params);
39
+ }
40
+ export function fileConventionMetadataTemplate(routes, filename) {
41
+ const pageRoute = routes.find((route) => route.kind === "page" && route.file === filename);
39
42
  const iconRoute = routes.find((route) => route.kind === "asset" && route.convention === "icon");
40
43
  const appleIconRoute = routes.find((route) => route.kind === "asset" && route.convention === "apple-icon");
41
- const openGraphImagePath = fileConventionMetadataRoutePath(routes, filename, params, "opengraph-image");
42
- if (iconRoute !== undefined && next.icons?.icon === undefined) {
43
- next.icons = { ...next.icons, icon: iconRoute.path };
44
+ const openGraphImageRoutes = routes.filter((route) => (route.kind === "asset" || route.kind === "metadata") &&
45
+ route.convention === "opengraph-image");
46
+ const expectedOpenGraphImagePath = pageRoute === undefined
47
+ ? undefined
48
+ : pageRoute.path === "/"
49
+ ? "/opengraph-image"
50
+ : `${pageRoute.path}/opengraph-image`;
51
+ return {
52
+ ...(appleIconRoute === undefined ? {} : { appleIconPath: appleIconRoute.path }),
53
+ ...(iconRoute === undefined ? {} : { iconPath: iconRoute.path }),
54
+ ...(openGraphImageRoutes.find((route) => route.path === "/opengraph-image") === undefined
55
+ ? {}
56
+ : { openGraphImageFallbackPath: "/opengraph-image" }),
57
+ ...(expectedOpenGraphImagePath === undefined ||
58
+ openGraphImageRoutes.find((route) => route.path === expectedOpenGraphImagePath) === undefined
59
+ ? {}
60
+ : { openGraphImageRoutePath: expectedOpenGraphImagePath }),
61
+ };
62
+ }
63
+ export function applyFileConventionMetadataTemplate(metadata, template, params) {
64
+ const next = metadata === undefined ? {} : { ...metadata };
65
+ const openGraphImagePath = (template.openGraphImageRoutePath === undefined
66
+ ? undefined
67
+ : concreteRoutePath(template.openGraphImageRoutePath, params)) ??
68
+ template.openGraphImageFallbackPath;
69
+ if (template.iconPath !== undefined && next.icons?.icon === undefined) {
70
+ next.icons = { ...next.icons, icon: template.iconPath };
44
71
  }
45
- if (appleIconRoute !== undefined && next.icons?.apple === undefined) {
46
- next.icons = { ...next.icons, apple: appleIconRoute.path };
72
+ if (template.appleIconPath !== undefined && next.icons?.apple === undefined) {
73
+ next.icons = { ...next.icons, apple: template.appleIconPath };
47
74
  }
48
75
  if (openGraphImagePath !== undefined &&
49
76
  next.openGraph?.image === undefined &&
@@ -193,20 +220,6 @@ export function serializeSitemap(entries) {
193
220
  .join("");
194
221
  return `<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">${urls}</urlset>`;
195
222
  }
196
- function fileConventionMetadataRoutePath(routes, filename, params, convention) {
197
- const pageRoute = routes.find((route) => route.kind === "page" && route.file === filename);
198
- const candidateRoutes = routes.filter((route) => (route.kind === "asset" || route.kind === "metadata") &&
199
- route.convention === convention);
200
- if (pageRoute !== undefined) {
201
- const expectedPath = pageRoute.path === "/" ? `/${convention}` : `${pageRoute.path}/${convention}`;
202
- const routeLocal = candidateRoutes.find((route) => route.path === expectedPath);
203
- const routeLocalPath = routeLocal === undefined ? undefined : concreteRoutePath(routeLocal.path, params);
204
- if (routeLocalPath !== undefined) {
205
- return routeLocalPath;
206
- }
207
- }
208
- return candidateRoutes.find((route) => route.path === `/${convention}`)?.path;
209
- }
210
223
  function concreteRoutePath(path, params) {
211
224
  const segments = path === "/" ? [] : path.slice(1).split("/");
212
225
  const concrete = [];
@@ -519,9 +532,32 @@ function validateOptionalHeadMetadata(value, path) {
519
532
  }
520
533
  }
521
534
  }
535
+ validateMetaRefreshHeadDescriptor(head, descriptorPath);
522
536
  validateUnknownJsonMetadataFields(descriptor, descriptorPath, new Set(["attrs", "content", "nonce", "tag"]));
523
537
  });
524
538
  }
539
+ function validateMetaRefreshHeadDescriptor(head, path) {
540
+ if (head.tag !== "meta" || head.attrs === undefined) {
541
+ return;
542
+ }
543
+ const attrs = Object.entries(head.attrs);
544
+ const hasRefresh = attrs.some(([name, value]) => {
545
+ const canonicalName = name.toLowerCase();
546
+ return ((canonicalName === "http-equiv" || canonicalName === "httpequiv") &&
547
+ typeof value === "string" &&
548
+ value.toLowerCase() === "refresh");
549
+ });
550
+ if (!hasRefresh) {
551
+ return;
552
+ }
553
+ for (const [name, value] of attrs) {
554
+ if (name.toLowerCase() === "content" &&
555
+ typeof value === "string" &&
556
+ isUnsafeMetaRefreshContent("refresh", value)) {
557
+ throw new Error(`Invalid metadata field ${path}.attrs.${name}: unsafe refresh URL value.`);
558
+ }
559
+ }
560
+ }
525
561
  function validateHeadAttribute(name, value, path) {
526
562
  if (!isSafeHeadAttributeName(name)) {
527
563
  throw new Error(`Invalid metadata field ${path}: expected safe HTML attribute name.`);
@@ -683,7 +719,9 @@ function openGraphImages(openGraph) {
683
719
  if (openGraph?.images !== undefined) {
684
720
  return openGraph.images.map((image, index) => metadataImageUrl(image, `openGraph.images.${index}`));
685
721
  }
686
- return openGraph?.image === undefined ? [] : [metadataImageUrl(openGraph.image, "openGraph.image")];
722
+ return openGraph?.image === undefined
723
+ ? []
724
+ : [metadataImageUrl(openGraph.image, "openGraph.image")];
687
725
  }
688
726
  function metadataImageUrl(value, path) {
689
727
  if (isMetadataScalar(value)) {
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n escapeHtmlAttribute,\n escapeHtmlText as escapeHtml,\n} from \"@reckona/mreact-shared/html-escape\";\nimport {\n isDangerousHtmlAttribute,\n isUnsafeUrlAttribute,\n} from \"@reckona/mreact-shared/url-safety\";\nimport { contentSecurityPolicy } from \"./csp.js\";\nimport type { AppFileConvention } from \"./file-conventions.js\";\nimport type { AppRoute } from \"./routes.js\";\nimport { routeSecurityHeaders } from \"./security-headers.js\";\nimport type {\n MetadataImage,\n MetadataScalar,\n MetadataThemeColor,\n MetadataViewport,\n RobotsManifest,\n RouteHeadDescriptor,\n RouteMetadata,\n RouteParams,\n SitemapEntry,\n} from \"./types.js\";\n\ntype CspDirectiveMap = Record<string, readonly string[] | string>;\n\nconst DEFAULT_HTML_RESPONSE_HEADERS = Object.freeze({\n \"content-type\": \"text/html; charset=utf-8\",\n});\n\nexport function mergeRouteMetadata(metadata: readonly RouteMetadata[]): RouteMetadata | undefined {\n if (metadata.length === 0) {\n return undefined;\n }\n\n return metadata.reduce<RouteMetadata>((merged, next) => {\n const mergedMetadata: RouteMetadata = { ...merged, ...next };\n const alternates = mergeObject(merged.alternates, next.alternates);\n const csp = mergeCspMetadata(merged.csp, next.csp);\n const head = mergeReadonlyArrays(merged.head, next.head);\n const icons = mergeObject(merged.icons, next.icons);\n const openGraph = mergeOpenGraphMetadata(merged.openGraph, next.openGraph);\n\n if (alternates !== undefined) {\n mergedMetadata.alternates = alternates;\n }\n if (csp !== undefined) {\n mergedMetadata.csp = csp;\n }\n if (head !== undefined) {\n mergedMetadata.head = head;\n }\n if (icons !== undefined) {\n mergedMetadata.icons = icons;\n }\n if (openGraph !== undefined) {\n mergedMetadata.openGraph = openGraph;\n }\n\n return mergedMetadata;\n }, {});\n}\n\nexport function applyFileConventionMetadata(\n metadata: RouteMetadata | undefined,\n routes: readonly AppRoute[],\n filename: string,\n params: RouteParams,\n): RouteMetadata | undefined {\n const next: RouteMetadata = metadata === undefined ? {} : { ...metadata };\n const iconRoute = routes.find((route) => route.kind === \"asset\" && route.convention === \"icon\");\n const appleIconRoute = routes.find(\n (route) => route.kind === \"asset\" && route.convention === \"apple-icon\",\n );\n const openGraphImagePath = fileConventionMetadataRoutePath(\n routes,\n filename,\n params,\n \"opengraph-image\",\n );\n\n if (iconRoute !== undefined && next.icons?.icon === undefined) {\n next.icons = { ...next.icons, icon: iconRoute.path };\n }\n if (appleIconRoute !== undefined && next.icons?.apple === undefined) {\n next.icons = { ...next.icons, apple: appleIconRoute.path };\n }\n if (\n openGraphImagePath !== undefined &&\n next.openGraph?.image === undefined &&\n (next.openGraph?.images === undefined || next.openGraph.images.length === 0)\n ) {\n next.openGraph = { ...next.openGraph, image: openGraphImagePath };\n }\n\n return Object.keys(next).length === 0 ? undefined : next;\n}\n\nexport function injectHeadMetadata(html: string, metadata: RouteMetadata | undefined): string {\n validateRouteMetadata(metadata);\n\n if (metadata === undefined) {\n return html;\n }\n\n let nextHtml =\n metadata.lang === undefined\n ? html\n : injectHtmlLangAttribute(html, metadataString(metadata.lang, \"lang\"));\n const tags = [\n metadata.title === undefined\n ? undefined\n : `<title>${escapeHtml(metadataString(metadata.title, \"title\"))}</title>`,\n metadata.description === undefined\n ? undefined\n : `<meta name=\"description\" content=\"${escapeHtmlAttribute(metadataString(metadata.description, \"description\"))}\">`,\n metadata.alternates?.canonical === undefined\n ? undefined\n : `<link rel=\"canonical\" href=\"${escapeHtmlAttribute(metadataString(metadata.alternates.canonical, \"alternates.canonical\"))}\">`,\n metadata.openGraph?.title === undefined\n ? undefined\n : `<meta property=\"og:title\" content=\"${escapeHtmlAttribute(metadataString(metadata.openGraph.title, \"openGraph.title\"))}\">`,\n metadata.openGraph?.description === undefined\n ? undefined\n : `<meta property=\"og:description\" content=\"${escapeHtmlAttribute(metadataString(metadata.openGraph.description, \"openGraph.description\"))}\">`,\n ...openGraphImages(metadata.openGraph).map(\n (image) => `<meta property=\"og:image\" content=\"${escapeHtmlAttribute(image)}\">`,\n ),\n metadata.icons?.icon === undefined\n ? undefined\n : `<link rel=\"icon\" href=\"${escapeHtmlAttribute(metadataString(metadata.icons.icon, \"icons.icon\"))}\">`,\n metadata.icons?.apple === undefined\n ? undefined\n : `<link rel=\"apple-touch-icon\" href=\"${escapeHtmlAttribute(metadataString(metadata.icons.apple, \"icons.apple\"))}\">`,\n metadata.robots === undefined\n ? undefined\n : `<meta name=\"robots\" content=\"${escapeHtmlAttribute(robotsContent(metadata.robots))}\">`,\n metadata.themeColor === undefined ? undefined : themeColorTag(metadata.themeColor),\n metadata.viewport === undefined\n ? undefined\n : `<meta name=\"viewport\" content=\"${escapeHtmlAttribute(viewportContent(metadata.viewport))}\">`,\n ...headDescriptorTags(metadata.head, metadata.csp?.nonce),\n ]\n .filter((tag): tag is string => tag !== undefined)\n .join(\"\");\n\n if (tags === \"\") {\n return nextHtml;\n }\n\n if (/<head(?:\\s[^>]*)?>/i.test(nextHtml)) {\n return nextHtml.replace(/<head(\\s[^>]*)?>/i, (match) => `${match}${tags}`);\n }\n\n if (/<html(?:\\s[^>]*)?>/i.test(nextHtml)) {\n return nextHtml.replace(/<html(\\s[^>]*)?>/i, (match) => `${match}<head>${tags}</head>`);\n }\n\n return `<head>${tags}</head>${nextHtml}`;\n}\n\nexport function responseHeadersForMetadata(\n metadata: RouteMetadata | undefined,\n request: Request,\n extra?: Readonly<Record<string, string>>,\n): HeadersInit {\n const csp = contentSecurityPolicy(metadata?.csp);\n const security = routeSecurityHeaders({\n request,\n security: metadata?.security,\n });\n\n if (csp === undefined && extra === undefined) {\n return {\n ...DEFAULT_HTML_RESPONSE_HEADERS,\n ...security,\n };\n }\n\n return {\n ...DEFAULT_HTML_RESPONSE_HEADERS,\n ...security,\n ...(csp === undefined ? undefined : { \"content-security-policy\": csp }),\n ...extra,\n };\n}\n\nexport function validateRouteMetadata(\n metadata: RouteMetadata | undefined,\n path = \"metadata\",\n): RouteMetadata | undefined {\n if (metadata === undefined) {\n return undefined;\n }\n\n assertPlainMetadataObject(metadata, path);\n validateOptionalMetadataObject(metadata.alternates, `${path}.alternates`, {\n canonical: validateMetadataScalar,\n });\n validateOptionalCspMetadata(metadata.csp, `${path}.csp`);\n validateOptionalMetadataScalar(metadata.description, `${path}.description`);\n validateOptionalHeadMetadata(metadata.head, `${path}.head`);\n validateOptionalMetadataObject(metadata.icons, `${path}.icons`, {\n apple: validateMetadataScalar,\n icon: validateMetadataScalar,\n });\n validateOptionalOpenGraphMetadata(metadata.openGraph, `${path}.openGraph`);\n validateOptionalMetadataScalar(metadata.lang, `${path}.lang`);\n validateOptionalRobotsMetadata(metadata.robots, `${path}.robots`);\n validateOptionalSecurityMetadata(metadata.security, `${path}.security`);\n validateOptionalThemeColorMetadata(metadata.themeColor, `${path}.themeColor`);\n validateOptionalMetadataScalar(metadata.title, `${path}.title`);\n validateOptionalViewportMetadata(metadata.viewport, `${path}.viewport`);\n validateUnknownMetadataFields(metadata, path);\n\n return metadata;\n}\n\nexport function serializeRobots(manifest: RobotsManifest): string {\n const lines: string[] = [];\n const rules =\n manifest.rules === undefined\n ? []\n : Array.isArray(manifest.rules)\n ? manifest.rules\n : [manifest.rules];\n\n for (const rule of rules) {\n for (const userAgent of arrayValue(rule.userAgent)) {\n lines.push(`User-agent: ${userAgent}`);\n }\n for (const allow of arrayValue(rule.allow)) {\n lines.push(`Allow: ${allow}`);\n }\n for (const disallow of arrayValue(rule.disallow)) {\n lines.push(`Disallow: ${disallow}`);\n }\n }\n\n for (const sitemap of arrayValue(manifest.sitemap)) {\n lines.push(`Sitemap: ${sitemap}`);\n }\n if (manifest.host !== undefined) {\n lines.push(`Host: ${manifest.host}`);\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nexport function serializeSitemap(entries: readonly SitemapEntry[]): string {\n const urls = entries\n .map((entry) => {\n const fields = [\n `<loc>${escapeXml(entry.url)}</loc>`,\n entry.lastModified === undefined\n ? undefined\n : `<lastmod>${escapeXml(sitemapDate(entry.lastModified))}</lastmod>`,\n entry.changeFrequency === undefined\n ? undefined\n : `<changefreq>${escapeXml(entry.changeFrequency)}</changefreq>`,\n entry.priority === undefined ? undefined : `<priority>${entry.priority}</priority>`,\n ].filter((field): field is string => field !== undefined);\n\n return `<url>${fields.join(\"\")}</url>`;\n })\n .join(\"\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?><urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">${urls}</urlset>`;\n}\n\nfunction fileConventionMetadataRoutePath(\n routes: readonly AppRoute[],\n filename: string,\n params: RouteParams,\n convention: AppFileConvention,\n): string | undefined {\n const pageRoute = routes.find((route) => route.kind === \"page\" && route.file === filename);\n const candidateRoutes = routes.filter(\n (route) =>\n (route.kind === \"asset\" || route.kind === \"metadata\") &&\n route.convention === convention,\n );\n\n if (pageRoute !== undefined) {\n const expectedPath = pageRoute.path === \"/\" ? `/${convention}` : `${pageRoute.path}/${convention}`;\n const routeLocal = candidateRoutes.find((route) => route.path === expectedPath);\n const routeLocalPath =\n routeLocal === undefined ? undefined : concreteRoutePath(routeLocal.path, params);\n\n if (routeLocalPath !== undefined) {\n return routeLocalPath;\n }\n }\n\n return candidateRoutes.find((route) => route.path === `/${convention}`)?.path;\n}\n\nfunction concreteRoutePath(path: string, params: RouteParams): string | undefined {\n const segments = path === \"/\" ? [] : path.slice(1).split(\"/\");\n const concrete: string[] = [];\n\n for (const segment of segments) {\n if (segment.startsWith(\":...\")) {\n const value = params[segment.slice(4)];\n const values = Array.isArray(value)\n ? value\n : typeof value === \"string\"\n ? value.split(\"/\").filter((part) => part !== \"\")\n : undefined;\n\n if (values === undefined) {\n return undefined;\n }\n concrete.push(...values.map((part) => encodeURIComponent(part)));\n continue;\n }\n\n if (segment.startsWith(\":\")) {\n const value = params[segment.slice(1)];\n const stringValue = Array.isArray(value) ? value[0] : value;\n\n if (typeof stringValue !== \"string\") {\n return undefined;\n }\n concrete.push(encodeURIComponent(stringValue));\n continue;\n }\n\n concrete.push(segment);\n }\n\n return `/${concrete.join(\"/\")}`;\n}\n\nfunction mergeObject<T extends object>(left: T | undefined, right: T | undefined): T | undefined {\n if (left === undefined) {\n return right;\n }\n\n if (right === undefined) {\n return left;\n }\n\n return { ...left, ...right };\n}\n\nfunction mergeReadonlyArrays<T>(\n left: readonly T[] | undefined,\n right: readonly T[] | undefined,\n): readonly T[] | undefined {\n if (left === undefined || left.length === 0) {\n return right;\n }\n\n if (right === undefined || right.length === 0) {\n return left;\n }\n\n return [...left, ...right];\n}\n\nfunction mergeCspMetadata(\n left: RouteMetadata[\"csp\"],\n right: RouteMetadata[\"csp\"],\n): RouteMetadata[\"csp\"] | undefined {\n if (right?.disable === true) {\n return { disable: true };\n }\n\n if (left === undefined) {\n if (right === undefined) {\n return undefined;\n }\n\n const merged: NonNullable<RouteMetadata[\"csp\"]> = { ...right };\n const directives = applyCspOverrides(undefined, right);\n\n if (directives !== undefined) {\n merged.directives = directives;\n } else {\n delete merged.directives;\n }\n\n return merged;\n }\n\n if (right === undefined) {\n return left;\n }\n\n const merged: NonNullable<RouteMetadata[\"csp\"]> = {\n ...left,\n ...right,\n };\n const directives = applyCspOverrides(left.directives, right);\n\n if (directives !== undefined) {\n merged.directives = directives;\n } else {\n delete merged.directives;\n }\n\n return merged;\n}\n\nfunction applyCspOverrides(\n left: CspDirectiveMap | undefined,\n right: RouteMetadata[\"csp\"] | undefined,\n): CspDirectiveMap | undefined {\n if (right === undefined) {\n return left;\n }\n\n const merged = { ...left, ...right.directives };\n\n for (const [name, value] of Object.entries(right.replace ?? {})) {\n merged[name] = value;\n }\n\n for (const name of right.remove ?? []) {\n delete merged[name];\n }\n\n return Object.keys(merged).length === 0 ? undefined : merged;\n}\n\nfunction mergeOpenGraphMetadata(\n left: RouteMetadata[\"openGraph\"],\n right: RouteMetadata[\"openGraph\"],\n): RouteMetadata[\"openGraph\"] | undefined {\n if (left === undefined) {\n return right;\n }\n\n if (right === undefined) {\n return left;\n }\n\n const merged: NonNullable<RouteMetadata[\"openGraph\"]> = {\n ...left,\n ...right,\n };\n const images = mergeReadonlyArrays(openGraphImages(left), openGraphImages(right));\n\n if (images !== undefined && images.length > 0) {\n merged.images = images;\n }\n\n return merged;\n}\n\nfunction injectHtmlLangAttribute(html: string, lang: string): string {\n const escapedLang = escapeHtmlAttribute(lang);\n\n if (!/<html(?:\\s[^>]*)?>/i.test(html)) {\n return html;\n }\n\n return html.replace(/<html(\\s[^>]*)?>/i, (_match, attrs = \"\") => {\n const strippedAttrs = String(attrs).replace(/\\s+lang=(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/i, \"\");\n return `<html lang=\"${escapedLang}\"${strippedAttrs}>`;\n });\n}\n\nfunction sitemapDate(value: Date | number | string): string {\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n return typeof value === \"number\" ? new Date(value).toISOString() : value;\n}\n\nfunction arrayValue<T>(value: T | readonly T[] | undefined): readonly T[] {\n if (value === undefined) {\n return [];\n }\n\n return Array.isArray(value) ? (value as readonly T[]) : [value as T];\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\");\n}\n\nfunction headDescriptorTags(\n descriptors: readonly RouteHeadDescriptor[] | undefined,\n nonce: string | undefined,\n): string[] {\n return (descriptors ?? []).flatMap((descriptor) => {\n const descriptorNonce = descriptor.nonce === true ? nonce : descriptor.nonce || undefined;\n const attrs: Record<string, boolean | number | string | undefined> = {\n ...descriptor.attrs,\n ...(descriptorNonce === undefined ? {} : { nonce: descriptorNonce }),\n };\n const attrText = Object.entries(attrs)\n .flatMap(([name, value]) => {\n if (value === undefined || value === false) {\n return [];\n }\n\n return value === true\n ? [escapeHtmlAttribute(name)]\n : [`${escapeHtmlAttribute(name)}=\"${escapeHtmlAttribute(String(value))}\"`];\n })\n .join(\" \");\n const open = attrText === \"\" ? `<${descriptor.tag}>` : `<${descriptor.tag} ${attrText}>`;\n\n if (descriptor.tag === \"meta\" || descriptor.tag === \"link\" || descriptor.tag === \"base\") {\n return [open.slice(0, -1) + \">\"];\n }\n\n return [`${open}${escapeHeadTextContent(descriptor.content ?? \"\")}</${descriptor.tag}>`];\n });\n}\n\nfunction escapeHeadTextContent(value: string): string {\n return value.replaceAll(\"<\", \"\\\\u003c\");\n}\n\nfunction metadataString(value: MetadataScalar, path: string): string {\n if (isMetadataScalar(value)) {\n return String(value);\n }\n\n throw new Error(`Invalid metadata field ${path}: expected string, number, or boolean.`);\n}\n\nfunction metadataKebabName(name: string): string {\n return name.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`);\n}\n\nfunction viewportContent(viewport: MetadataScalar | MetadataViewport): string {\n if (isMetadataScalar(viewport)) {\n return metadataString(viewport, \"viewport\");\n }\n\n return Object.entries(viewport)\n .flatMap(([key, value]) => {\n if (value === undefined || value === null || value === false) {\n return [];\n }\n\n return [`${metadataKebabName(key)}=${metadataString(value, `viewport.${key}`)}`];\n })\n .join(\", \");\n}\n\nfunction themeColorTag(themeColor: MetadataScalar | MetadataThemeColor): string {\n if (isMetadataScalar(themeColor)) {\n return `<meta name=\"theme-color\" content=\"${escapeHtmlAttribute(metadataString(themeColor, \"themeColor\"))}\">`;\n }\n\n const content = themeColor.color;\n if (!isMetadataScalar(content)) {\n throw new Error(\n \"Invalid metadata field themeColor.color: expected string, number, or boolean.\",\n );\n }\n\n const media =\n themeColor.media === undefined\n ? \"\"\n : ` media=\"${escapeHtmlAttribute(metadataString(metadataScalarField(themeColor.media, \"themeColor.media\"), \"themeColor.media\"))}\"`;\n\n return `<meta name=\"theme-color\"${media} content=\"${escapeHtmlAttribute(metadataString(content, \"themeColor.color\"))}\">`;\n}\n\nfunction metadataScalarField(value: unknown, path: string): MetadataScalar {\n if (isMetadataScalar(value)) {\n return value;\n }\n\n throw new Error(`Invalid metadata field ${path}: expected string, number, or boolean.`);\n}\n\nfunction isMetadataScalar(value: unknown): value is MetadataScalar {\n return (\n typeof value === \"string\" ||\n (typeof value === \"number\" && Number.isFinite(value)) ||\n typeof value === \"boolean\"\n );\n}\n\nfunction validateOptionalMetadataScalar(value: unknown, path: string): void {\n if (value !== undefined) {\n validateMetadataScalar(value, path);\n }\n}\n\nfunction validateMetadataScalar(value: unknown, path: string): void {\n if (!isMetadataScalar(value)) {\n throw new Error(`Invalid metadata field ${path}: expected string, number, or boolean.`);\n }\n}\n\nfunction validateOptionalMetadataObject<T extends Record<string, unknown>>(\n value: unknown,\n path: string,\n validators: Record<string, (value: unknown, path: string) => void>,\n): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n for (const [key, validator] of Object.entries(validators)) {\n const fieldValue = (value as T)[key];\n if (fieldValue !== undefined) {\n validator(fieldValue, `${path}.${key}`);\n }\n }\n validateUnknownJsonMetadataFields(\n value as Record<string, unknown>,\n path,\n new Set(Object.keys(validators)),\n );\n}\n\nfunction validateOptionalCspMetadata(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n const csp = value as NonNullable<RouteMetadata[\"csp\"]>;\n if (csp.disable !== undefined && typeof csp.disable !== \"boolean\") {\n throw new Error(`Invalid metadata field ${path}.disable: expected boolean.`);\n }\n if (csp.nonce !== undefined && typeof csp.nonce !== \"string\") {\n throw new Error(`Invalid metadata field ${path}.nonce: expected string.`);\n }\n validateOptionalDirectiveMap(csp.directives, `${path}.directives`);\n validateOptionalDirectiveMap(csp.replace, `${path}.replace`);\n if (csp.remove !== undefined) {\n validateStringArray(csp.remove, `${path}.remove`);\n }\n validateUnknownJsonMetadataFields(\n csp as Record<string, unknown>,\n path,\n new Set([\"directives\", \"disable\", \"nonce\", \"remove\", \"replace\"]),\n );\n}\n\nfunction validateOptionalDirectiveMap(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n for (const [name, directive] of Object.entries(value)) {\n if (typeof directive === \"string\") {\n continue;\n }\n validateStringArray(directive, `${path}.${name}`);\n }\n}\n\nfunction validateStringArray(value: unknown, path: string): void {\n if (!Array.isArray(value)) {\n throw new Error(`Invalid metadata field ${path}: expected string or string array.`);\n }\n\n value.forEach((entry, index) => {\n if (typeof entry !== \"string\") {\n throw new Error(`Invalid metadata field ${path}.${index}: expected string.`);\n }\n });\n}\n\nfunction validateOptionalHeadMetadata(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n if (!Array.isArray(value)) {\n throw new Error(`Invalid metadata field ${path}: expected array.`);\n }\n\n value.forEach((descriptor, index) => {\n const descriptorPath = `${path}.${index}`;\n assertPlainMetadataObject(descriptor, descriptorPath);\n const head = descriptor as unknown as RouteHeadDescriptor;\n if (![\"base\", \"link\", \"meta\", \"script\", \"style\"].includes(String(head.tag))) {\n throw new Error(`Invalid metadata field ${descriptorPath}.tag: expected supported head tag.`);\n }\n if (head.content !== undefined && typeof head.content !== \"string\") {\n throw new Error(`Invalid metadata field ${descriptorPath}.content: expected string.`);\n }\n if (\n head.nonce !== undefined &&\n typeof head.nonce !== \"boolean\" &&\n typeof head.nonce !== \"string\"\n ) {\n throw new Error(`Invalid metadata field ${descriptorPath}.nonce: expected string or boolean.`);\n }\n if (head.attrs !== undefined) {\n assertPlainMetadataObject(head.attrs, `${descriptorPath}.attrs`);\n for (const [name, attr] of Object.entries(head.attrs)) {\n validateHeadAttribute(name, attr, `${descriptorPath}.attrs.${name}`);\n if (\n attr !== undefined &&\n typeof attr !== \"boolean\" &&\n typeof attr !== \"number\" &&\n typeof attr !== \"string\"\n ) {\n throw new Error(\n `Invalid metadata field ${descriptorPath}.attrs.${name}: expected string, number, boolean, or undefined.`,\n );\n }\n }\n }\n validateUnknownJsonMetadataFields(\n descriptor as Record<string, unknown>,\n descriptorPath,\n new Set([\"attrs\", \"content\", \"nonce\", \"tag\"]),\n );\n });\n}\n\nfunction validateHeadAttribute(name: string, value: unknown, path: string): void {\n if (!isSafeHeadAttributeName(name)) {\n throw new Error(`Invalid metadata field ${path}: expected safe HTML attribute name.`);\n }\n\n const canonicalName = name.toLowerCase();\n if (canonicalName.startsWith(\"on\") || isDangerousHtmlAttribute(canonicalName)) {\n throw new Error(`Invalid metadata field ${path}: event and dangerous attributes are not allowed.`);\n }\n\n if (typeof value === \"string\" && isUnsafeUrlAttribute(canonicalName, value)) {\n throw new Error(`Invalid metadata field ${path}: unsafe URL value.`);\n }\n}\n\nfunction isSafeHeadAttributeName(name: string): boolean {\n if (name.length === 0) {\n return false;\n }\n\n for (let index = 0; index < name.length; index += 1) {\n const code = name.charCodeAt(index);\n\n if (\n code <= 0x20 ||\n code === 0x22 ||\n code === 0x27 ||\n code === 0x2f ||\n code === 0x3c ||\n code === 0x3d ||\n code === 0x3e ||\n code === 0x60 ||\n code === 0x7f\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction validateOptionalOpenGraphMetadata(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n const openGraph = value as NonNullable<RouteMetadata[\"openGraph\"]>;\n validateOptionalMetadataScalar(openGraph.description, `${path}.description`);\n validateOptionalMetadataImage(openGraph.image, `${path}.image`);\n if (openGraph.images !== undefined) {\n if (!Array.isArray(openGraph.images)) {\n throw new Error(`Invalid metadata field ${path}.images: expected array.`);\n }\n openGraph.images.forEach((image, index) =>\n validateOptionalMetadataImage(image, `${path}.images.${index}`),\n );\n }\n validateOptionalMetadataScalar(openGraph.title, `${path}.title`);\n validateUnknownJsonMetadataFields(\n openGraph as Record<string, unknown>,\n path,\n new Set([\"description\", \"image\", \"images\", \"title\"]),\n );\n}\n\nfunction validateOptionalMetadataImage(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n if (isMetadataScalar(value)) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n const image = value as unknown as MetadataImage;\n validateMetadataScalar(image.url, `${path}.url`);\n validateOptionalMetadataScalar(image.alt, `${path}.alt`);\n validateOptionalMetadataScalar(image.height, `${path}.height`);\n validateOptionalMetadataScalar(image.type, `${path}.type`);\n validateOptionalMetadataScalar(image.width, `${path}.width`);\n validateUnknownJsonMetadataFields(\n image as unknown as Record<string, unknown>,\n path,\n new Set([\"alt\", \"height\", \"type\", \"url\", \"width\"]),\n );\n}\n\nfunction validateOptionalRobotsMetadata(value: unknown, path: string): void {\n if (value === undefined || typeof value === \"string\") {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n const robots = value as Extract<NonNullable<RouteMetadata[\"robots\"]>, object>;\n if (robots.follow !== undefined && typeof robots.follow !== \"boolean\") {\n throw new Error(`Invalid metadata field ${path}.follow: expected boolean.`);\n }\n if (robots.index !== undefined && typeof robots.index !== \"boolean\") {\n throw new Error(`Invalid metadata field ${path}.index: expected boolean.`);\n }\n validateUnknownJsonMetadataFields(\n robots as Record<string, unknown>,\n path,\n new Set([\"follow\", \"index\"]),\n );\n}\n\nfunction validateOptionalSecurityMetadata(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n validateJsonSerializableMetadata(value, path);\n}\n\nfunction validateOptionalThemeColorMetadata(value: unknown, path: string): void {\n if (value === undefined || isMetadataScalar(value)) {\n return;\n }\n\n validateOptionalMetadataObject(value, path, {\n color: validateMetadataScalar,\n media: validateMetadataScalar,\n });\n}\n\nfunction validateOptionalViewportMetadata(value: unknown, path: string): void {\n if (value === undefined || isMetadataScalar(value)) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n for (const [key, viewportValue] of Object.entries(value)) {\n if (viewportValue !== undefined && viewportValue !== null && !isMetadataScalar(viewportValue)) {\n throw new Error(\n `Invalid metadata field ${path}.${key}: expected string, number, boolean, null, or undefined.`,\n );\n }\n }\n}\n\nfunction validateUnknownMetadataFields(metadata: RouteMetadata, path: string): void {\n validateUnknownJsonMetadataFields(metadata as Record<string, unknown>, path, new Set([\n \"alternates\",\n \"csp\",\n \"description\",\n \"head\",\n \"icons\",\n \"lang\",\n \"openGraph\",\n \"robots\",\n \"security\",\n \"themeColor\",\n \"title\",\n \"viewport\",\n ]));\n}\n\nfunction validateUnknownJsonMetadataFields(\n value: Record<string, unknown>,\n path: string,\n knownFields: ReadonlySet<string>,\n): void {\n for (const [key, entry] of Object.entries(value)) {\n if (!knownFields.has(key)) {\n validateJsonSerializableMetadata(entry, `${path}.${key}`);\n }\n }\n}\n\nfunction validateJsonSerializableMetadata(value: unknown, path: string): void {\n if (value === undefined || value === null || isMetadataScalar(value)) {\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((entry, index) => validateJsonSerializableMetadata(entry, `${path}.${index}`));\n return;\n }\n\n if (isPlainMetadataObject(value)) {\n for (const [key, entry] of Object.entries(value)) {\n validateJsonSerializableMetadata(entry, `${path}.${key}`);\n }\n return;\n }\n\n throw new Error(\n `Invalid metadata field ${path}: expected a JSON-serializable value.`,\n );\n}\n\nfunction assertPlainMetadataObject(value: unknown, path: string): asserts value is Record<string, unknown> {\n if (!isPlainMetadataObject(value)) {\n throw new Error(`Invalid metadata field ${path}: expected object.`);\n }\n}\n\nfunction isPlainMetadataObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction openGraphImages(openGraph: RouteMetadata[\"openGraph\"]): readonly string[] {\n if (openGraph?.images !== undefined) {\n return openGraph.images.map((image, index) =>\n metadataImageUrl(image, `openGraph.images.${index}`),\n );\n }\n\n return openGraph?.image === undefined ? [] : [metadataImageUrl(openGraph.image, \"openGraph.image\")];\n}\n\nfunction metadataImageUrl(value: MetadataImage | MetadataScalar, path: string): string {\n if (isMetadataScalar(value)) {\n return metadataString(value, path);\n }\n\n if (typeof value === \"object\" && value !== null && \"url\" in value) {\n return metadataString(value.url, `${path}.url`);\n }\n\n throw new Error(`Invalid metadata field ${path}: expected string, number, boolean, or object with url.`);\n}\n\nfunction robotsContent(robots: NonNullable<RouteMetadata[\"robots\"]>): string {\n if (typeof robots === \"string\") {\n return robots;\n }\n\n return [\n robots.index === false ? \"noindex\" : \"index\",\n robots.follow === false ? \"nofollow\" : \"follow\",\n ].join(\",\");\n}\n"]}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n escapeHtmlAttribute,\n escapeHtmlText as escapeHtml,\n} from \"@reckona/mreact-shared/html-escape\";\nimport {\n isDangerousHtmlAttribute,\n isUnsafeMetaRefreshContent,\n isUnsafeUrlAttribute,\n} from \"@reckona/mreact-shared/url-safety\";\nimport { contentSecurityPolicy } from \"./csp.js\";\nimport type { AppRoute } from \"./routes.js\";\nimport { routeSecurityHeaders } from \"./security-headers.js\";\nimport type {\n MetadataImage,\n MetadataScalar,\n MetadataThemeColor,\n MetadataViewport,\n RobotsManifest,\n RouteHeadDescriptor,\n RouteMetadata,\n RouteParams,\n SitemapEntry,\n} from \"./types.js\";\n\ntype CspDirectiveMap = Record<string, readonly string[] | string>;\n\nconst DEFAULT_HTML_RESPONSE_HEADERS = Object.freeze({\n \"content-type\": \"text/html; charset=utf-8\",\n});\n\nexport interface FileConventionMetadataTemplate {\n appleIconPath?: string | undefined;\n iconPath?: string | undefined;\n openGraphImageFallbackPath?: string | undefined;\n openGraphImageRoutePath?: string | undefined;\n}\n\nexport function mergeRouteMetadata(metadata: readonly RouteMetadata[]): RouteMetadata | undefined {\n if (metadata.length === 0) {\n return undefined;\n }\n\n return metadata.reduce<RouteMetadata>((merged, next) => {\n const mergedMetadata: RouteMetadata = { ...merged, ...next };\n const alternates = mergeObject(merged.alternates, next.alternates);\n const csp = mergeCspMetadata(merged.csp, next.csp);\n const head = mergeReadonlyArrays(merged.head, next.head);\n const icons = mergeObject(merged.icons, next.icons);\n const openGraph = mergeOpenGraphMetadata(merged.openGraph, next.openGraph);\n\n if (alternates !== undefined) {\n mergedMetadata.alternates = alternates;\n }\n if (csp !== undefined) {\n mergedMetadata.csp = csp;\n }\n if (head !== undefined) {\n mergedMetadata.head = head;\n }\n if (icons !== undefined) {\n mergedMetadata.icons = icons;\n }\n if (openGraph !== undefined) {\n mergedMetadata.openGraph = openGraph;\n }\n\n return mergedMetadata;\n }, {});\n}\n\nexport function applyFileConventionMetadata(\n metadata: RouteMetadata | undefined,\n routes: readonly AppRoute[],\n filename: string,\n params: RouteParams,\n): RouteMetadata | undefined {\n return applyFileConventionMetadataTemplate(\n metadata,\n fileConventionMetadataTemplate(routes, filename),\n params,\n );\n}\n\nexport function fileConventionMetadataTemplate(\n routes: readonly AppRoute[],\n filename: string,\n): FileConventionMetadataTemplate {\n const pageRoute = routes.find((route) => route.kind === \"page\" && route.file === filename);\n const iconRoute = routes.find((route) => route.kind === \"asset\" && route.convention === \"icon\");\n const appleIconRoute = routes.find(\n (route) => route.kind === \"asset\" && route.convention === \"apple-icon\",\n );\n const openGraphImageRoutes = routes.filter(\n (route) =>\n (route.kind === \"asset\" || route.kind === \"metadata\") &&\n route.convention === \"opengraph-image\",\n );\n const expectedOpenGraphImagePath =\n pageRoute === undefined\n ? undefined\n : pageRoute.path === \"/\"\n ? \"/opengraph-image\"\n : `${pageRoute.path}/opengraph-image`;\n\n return {\n ...(appleIconRoute === undefined ? {} : { appleIconPath: appleIconRoute.path }),\n ...(iconRoute === undefined ? {} : { iconPath: iconRoute.path }),\n ...(openGraphImageRoutes.find((route) => route.path === \"/opengraph-image\") === undefined\n ? {}\n : { openGraphImageFallbackPath: \"/opengraph-image\" }),\n ...(expectedOpenGraphImagePath === undefined ||\n openGraphImageRoutes.find((route) => route.path === expectedOpenGraphImagePath) === undefined\n ? {}\n : { openGraphImageRoutePath: expectedOpenGraphImagePath }),\n };\n}\n\nexport function applyFileConventionMetadataTemplate(\n metadata: RouteMetadata | undefined,\n template: FileConventionMetadataTemplate,\n params: RouteParams,\n): RouteMetadata | undefined {\n const next: RouteMetadata = metadata === undefined ? {} : { ...metadata };\n const openGraphImagePath =\n (template.openGraphImageRoutePath === undefined\n ? undefined\n : concreteRoutePath(template.openGraphImageRoutePath, params)) ??\n template.openGraphImageFallbackPath;\n\n if (template.iconPath !== undefined && next.icons?.icon === undefined) {\n next.icons = { ...next.icons, icon: template.iconPath };\n }\n if (template.appleIconPath !== undefined && next.icons?.apple === undefined) {\n next.icons = { ...next.icons, apple: template.appleIconPath };\n }\n if (\n openGraphImagePath !== undefined &&\n next.openGraph?.image === undefined &&\n (next.openGraph?.images === undefined || next.openGraph.images.length === 0)\n ) {\n next.openGraph = { ...next.openGraph, image: openGraphImagePath };\n }\n\n return Object.keys(next).length === 0 ? undefined : next;\n}\n\nexport function injectHeadMetadata(html: string, metadata: RouteMetadata | undefined): string {\n validateRouteMetadata(metadata);\n\n if (metadata === undefined) {\n return html;\n }\n\n let nextHtml =\n metadata.lang === undefined\n ? html\n : injectHtmlLangAttribute(html, metadataString(metadata.lang, \"lang\"));\n const tags = [\n metadata.title === undefined\n ? undefined\n : `<title>${escapeHtml(metadataString(metadata.title, \"title\"))}</title>`,\n metadata.description === undefined\n ? undefined\n : `<meta name=\"description\" content=\"${escapeHtmlAttribute(metadataString(metadata.description, \"description\"))}\">`,\n metadata.alternates?.canonical === undefined\n ? undefined\n : `<link rel=\"canonical\" href=\"${escapeHtmlAttribute(metadataString(metadata.alternates.canonical, \"alternates.canonical\"))}\">`,\n metadata.openGraph?.title === undefined\n ? undefined\n : `<meta property=\"og:title\" content=\"${escapeHtmlAttribute(metadataString(metadata.openGraph.title, \"openGraph.title\"))}\">`,\n metadata.openGraph?.description === undefined\n ? undefined\n : `<meta property=\"og:description\" content=\"${escapeHtmlAttribute(metadataString(metadata.openGraph.description, \"openGraph.description\"))}\">`,\n ...openGraphImages(metadata.openGraph).map(\n (image) => `<meta property=\"og:image\" content=\"${escapeHtmlAttribute(image)}\">`,\n ),\n metadata.icons?.icon === undefined\n ? undefined\n : `<link rel=\"icon\" href=\"${escapeHtmlAttribute(metadataString(metadata.icons.icon, \"icons.icon\"))}\">`,\n metadata.icons?.apple === undefined\n ? undefined\n : `<link rel=\"apple-touch-icon\" href=\"${escapeHtmlAttribute(metadataString(metadata.icons.apple, \"icons.apple\"))}\">`,\n metadata.robots === undefined\n ? undefined\n : `<meta name=\"robots\" content=\"${escapeHtmlAttribute(robotsContent(metadata.robots))}\">`,\n metadata.themeColor === undefined ? undefined : themeColorTag(metadata.themeColor),\n metadata.viewport === undefined\n ? undefined\n : `<meta name=\"viewport\" content=\"${escapeHtmlAttribute(viewportContent(metadata.viewport))}\">`,\n ...headDescriptorTags(metadata.head, metadata.csp?.nonce),\n ]\n .filter((tag): tag is string => tag !== undefined)\n .join(\"\");\n\n if (tags === \"\") {\n return nextHtml;\n }\n\n if (/<head(?:\\s[^>]*)?>/i.test(nextHtml)) {\n return nextHtml.replace(/<head(\\s[^>]*)?>/i, (match) => `${match}${tags}`);\n }\n\n if (/<html(?:\\s[^>]*)?>/i.test(nextHtml)) {\n return nextHtml.replace(/<html(\\s[^>]*)?>/i, (match) => `${match}<head>${tags}</head>`);\n }\n\n return `<head>${tags}</head>${nextHtml}`;\n}\n\nexport function responseHeadersForMetadata(\n metadata: RouteMetadata | undefined,\n request: Request,\n extra?: Readonly<Record<string, string>>,\n): HeadersInit {\n const csp = contentSecurityPolicy(metadata?.csp);\n const security = routeSecurityHeaders({\n request,\n security: metadata?.security,\n });\n\n if (csp === undefined && extra === undefined) {\n return {\n ...DEFAULT_HTML_RESPONSE_HEADERS,\n ...security,\n };\n }\n\n return {\n ...DEFAULT_HTML_RESPONSE_HEADERS,\n ...security,\n ...(csp === undefined ? undefined : { \"content-security-policy\": csp }),\n ...extra,\n };\n}\n\nexport function validateRouteMetadata(\n metadata: RouteMetadata | undefined,\n path = \"metadata\",\n): RouteMetadata | undefined {\n if (metadata === undefined) {\n return undefined;\n }\n\n assertPlainMetadataObject(metadata, path);\n validateOptionalMetadataObject(metadata.alternates, `${path}.alternates`, {\n canonical: validateMetadataScalar,\n });\n validateOptionalCspMetadata(metadata.csp, `${path}.csp`);\n validateOptionalMetadataScalar(metadata.description, `${path}.description`);\n validateOptionalHeadMetadata(metadata.head, `${path}.head`);\n validateOptionalMetadataObject(metadata.icons, `${path}.icons`, {\n apple: validateMetadataScalar,\n icon: validateMetadataScalar,\n });\n validateOptionalOpenGraphMetadata(metadata.openGraph, `${path}.openGraph`);\n validateOptionalMetadataScalar(metadata.lang, `${path}.lang`);\n validateOptionalRobotsMetadata(metadata.robots, `${path}.robots`);\n validateOptionalSecurityMetadata(metadata.security, `${path}.security`);\n validateOptionalThemeColorMetadata(metadata.themeColor, `${path}.themeColor`);\n validateOptionalMetadataScalar(metadata.title, `${path}.title`);\n validateOptionalViewportMetadata(metadata.viewport, `${path}.viewport`);\n validateUnknownMetadataFields(metadata, path);\n\n return metadata;\n}\n\nexport function serializeRobots(manifest: RobotsManifest): string {\n const lines: string[] = [];\n const rules =\n manifest.rules === undefined\n ? []\n : Array.isArray(manifest.rules)\n ? manifest.rules\n : [manifest.rules];\n\n for (const rule of rules) {\n for (const userAgent of arrayValue(rule.userAgent)) {\n lines.push(`User-agent: ${userAgent}`);\n }\n for (const allow of arrayValue(rule.allow)) {\n lines.push(`Allow: ${allow}`);\n }\n for (const disallow of arrayValue(rule.disallow)) {\n lines.push(`Disallow: ${disallow}`);\n }\n }\n\n for (const sitemap of arrayValue(manifest.sitemap)) {\n lines.push(`Sitemap: ${sitemap}`);\n }\n if (manifest.host !== undefined) {\n lines.push(`Host: ${manifest.host}`);\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nexport function serializeSitemap(entries: readonly SitemapEntry[]): string {\n const urls = entries\n .map((entry) => {\n const fields = [\n `<loc>${escapeXml(entry.url)}</loc>`,\n entry.lastModified === undefined\n ? undefined\n : `<lastmod>${escapeXml(sitemapDate(entry.lastModified))}</lastmod>`,\n entry.changeFrequency === undefined\n ? undefined\n : `<changefreq>${escapeXml(entry.changeFrequency)}</changefreq>`,\n entry.priority === undefined ? undefined : `<priority>${entry.priority}</priority>`,\n ].filter((field): field is string => field !== undefined);\n\n return `<url>${fields.join(\"\")}</url>`;\n })\n .join(\"\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?><urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">${urls}</urlset>`;\n}\n\nfunction concreteRoutePath(path: string, params: RouteParams): string | undefined {\n const segments = path === \"/\" ? [] : path.slice(1).split(\"/\");\n const concrete: string[] = [];\n\n for (const segment of segments) {\n if (segment.startsWith(\":...\")) {\n const value = params[segment.slice(4)];\n const values = Array.isArray(value)\n ? value\n : typeof value === \"string\"\n ? value.split(\"/\").filter((part) => part !== \"\")\n : undefined;\n\n if (values === undefined) {\n return undefined;\n }\n concrete.push(...values.map((part) => encodeURIComponent(part)));\n continue;\n }\n\n if (segment.startsWith(\":\")) {\n const value = params[segment.slice(1)];\n const stringValue = Array.isArray(value) ? value[0] : value;\n\n if (typeof stringValue !== \"string\") {\n return undefined;\n }\n concrete.push(encodeURIComponent(stringValue));\n continue;\n }\n\n concrete.push(segment);\n }\n\n return `/${concrete.join(\"/\")}`;\n}\n\nfunction mergeObject<T extends object>(left: T | undefined, right: T | undefined): T | undefined {\n if (left === undefined) {\n return right;\n }\n\n if (right === undefined) {\n return left;\n }\n\n return { ...left, ...right };\n}\n\nfunction mergeReadonlyArrays<T>(\n left: readonly T[] | undefined,\n right: readonly T[] | undefined,\n): readonly T[] | undefined {\n if (left === undefined || left.length === 0) {\n return right;\n }\n\n if (right === undefined || right.length === 0) {\n return left;\n }\n\n return [...left, ...right];\n}\n\nfunction mergeCspMetadata(\n left: RouteMetadata[\"csp\"],\n right: RouteMetadata[\"csp\"],\n): RouteMetadata[\"csp\"] | undefined {\n if (right?.disable === true) {\n return { disable: true };\n }\n\n if (left === undefined) {\n if (right === undefined) {\n return undefined;\n }\n\n const merged: NonNullable<RouteMetadata[\"csp\"]> = { ...right };\n const directives = applyCspOverrides(undefined, right);\n\n if (directives !== undefined) {\n merged.directives = directives;\n } else {\n delete merged.directives;\n }\n\n return merged;\n }\n\n if (right === undefined) {\n return left;\n }\n\n const merged: NonNullable<RouteMetadata[\"csp\"]> = {\n ...left,\n ...right,\n };\n const directives = applyCspOverrides(left.directives, right);\n\n if (directives !== undefined) {\n merged.directives = directives;\n } else {\n delete merged.directives;\n }\n\n return merged;\n}\n\nfunction applyCspOverrides(\n left: CspDirectiveMap | undefined,\n right: RouteMetadata[\"csp\"] | undefined,\n): CspDirectiveMap | undefined {\n if (right === undefined) {\n return left;\n }\n\n const merged = { ...left, ...right.directives };\n\n for (const [name, value] of Object.entries(right.replace ?? {})) {\n merged[name] = value;\n }\n\n for (const name of right.remove ?? []) {\n delete merged[name];\n }\n\n return Object.keys(merged).length === 0 ? undefined : merged;\n}\n\nfunction mergeOpenGraphMetadata(\n left: RouteMetadata[\"openGraph\"],\n right: RouteMetadata[\"openGraph\"],\n): RouteMetadata[\"openGraph\"] | undefined {\n if (left === undefined) {\n return right;\n }\n\n if (right === undefined) {\n return left;\n }\n\n const merged: NonNullable<RouteMetadata[\"openGraph\"]> = {\n ...left,\n ...right,\n };\n const images = mergeReadonlyArrays(openGraphImages(left), openGraphImages(right));\n\n if (images !== undefined && images.length > 0) {\n merged.images = images;\n }\n\n return merged;\n}\n\nfunction injectHtmlLangAttribute(html: string, lang: string): string {\n const escapedLang = escapeHtmlAttribute(lang);\n\n if (!/<html(?:\\s[^>]*)?>/i.test(html)) {\n return html;\n }\n\n return html.replace(/<html(\\s[^>]*)?>/i, (_match, attrs = \"\") => {\n const strippedAttrs = String(attrs).replace(/\\s+lang=(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/i, \"\");\n return `<html lang=\"${escapedLang}\"${strippedAttrs}>`;\n });\n}\n\nfunction sitemapDate(value: Date | number | string): string {\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n return typeof value === \"number\" ? new Date(value).toISOString() : value;\n}\n\nfunction arrayValue<T>(value: T | readonly T[] | undefined): readonly T[] {\n if (value === undefined) {\n return [];\n }\n\n return Array.isArray(value) ? (value as readonly T[]) : [value as T];\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\");\n}\n\nfunction headDescriptorTags(\n descriptors: readonly RouteHeadDescriptor[] | undefined,\n nonce: string | undefined,\n): string[] {\n return (descriptors ?? []).flatMap((descriptor) => {\n const descriptorNonce = descriptor.nonce === true ? nonce : descriptor.nonce || undefined;\n const attrs: Record<string, boolean | number | string | undefined> = {\n ...descriptor.attrs,\n ...(descriptorNonce === undefined ? {} : { nonce: descriptorNonce }),\n };\n const attrText = Object.entries(attrs)\n .flatMap(([name, value]) => {\n if (value === undefined || value === false) {\n return [];\n }\n\n return value === true\n ? [escapeHtmlAttribute(name)]\n : [`${escapeHtmlAttribute(name)}=\"${escapeHtmlAttribute(String(value))}\"`];\n })\n .join(\" \");\n const open = attrText === \"\" ? `<${descriptor.tag}>` : `<${descriptor.tag} ${attrText}>`;\n\n if (descriptor.tag === \"meta\" || descriptor.tag === \"link\" || descriptor.tag === \"base\") {\n return [open.slice(0, -1) + \">\"];\n }\n\n return [`${open}${escapeHeadTextContent(descriptor.content ?? \"\")}</${descriptor.tag}>`];\n });\n}\n\nfunction escapeHeadTextContent(value: string): string {\n return value.replaceAll(\"<\", \"\\\\u003c\");\n}\n\nfunction metadataString(value: MetadataScalar, path: string): string {\n if (isMetadataScalar(value)) {\n return String(value);\n }\n\n throw new Error(`Invalid metadata field ${path}: expected string, number, or boolean.`);\n}\n\nfunction metadataKebabName(name: string): string {\n return name.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`);\n}\n\nfunction viewportContent(viewport: MetadataScalar | MetadataViewport): string {\n if (isMetadataScalar(viewport)) {\n return metadataString(viewport, \"viewport\");\n }\n\n return Object.entries(viewport)\n .flatMap(([key, value]) => {\n if (value === undefined || value === null || value === false) {\n return [];\n }\n\n return [`${metadataKebabName(key)}=${metadataString(value, `viewport.${key}`)}`];\n })\n .join(\", \");\n}\n\nfunction themeColorTag(themeColor: MetadataScalar | MetadataThemeColor): string {\n if (isMetadataScalar(themeColor)) {\n return `<meta name=\"theme-color\" content=\"${escapeHtmlAttribute(metadataString(themeColor, \"themeColor\"))}\">`;\n }\n\n const content = themeColor.color;\n if (!isMetadataScalar(content)) {\n throw new Error(\n \"Invalid metadata field themeColor.color: expected string, number, or boolean.\",\n );\n }\n\n const media =\n themeColor.media === undefined\n ? \"\"\n : ` media=\"${escapeHtmlAttribute(metadataString(metadataScalarField(themeColor.media, \"themeColor.media\"), \"themeColor.media\"))}\"`;\n\n return `<meta name=\"theme-color\"${media} content=\"${escapeHtmlAttribute(metadataString(content, \"themeColor.color\"))}\">`;\n}\n\nfunction metadataScalarField(value: unknown, path: string): MetadataScalar {\n if (isMetadataScalar(value)) {\n return value;\n }\n\n throw new Error(`Invalid metadata field ${path}: expected string, number, or boolean.`);\n}\n\nfunction isMetadataScalar(value: unknown): value is MetadataScalar {\n return (\n typeof value === \"string\" ||\n (typeof value === \"number\" && Number.isFinite(value)) ||\n typeof value === \"boolean\"\n );\n}\n\nfunction validateOptionalMetadataScalar(value: unknown, path: string): void {\n if (value !== undefined) {\n validateMetadataScalar(value, path);\n }\n}\n\nfunction validateMetadataScalar(value: unknown, path: string): void {\n if (!isMetadataScalar(value)) {\n throw new Error(`Invalid metadata field ${path}: expected string, number, or boolean.`);\n }\n}\n\nfunction validateOptionalMetadataObject<T extends Record<string, unknown>>(\n value: unknown,\n path: string,\n validators: Record<string, (value: unknown, path: string) => void>,\n): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n for (const [key, validator] of Object.entries(validators)) {\n const fieldValue = (value as T)[key];\n if (fieldValue !== undefined) {\n validator(fieldValue, `${path}.${key}`);\n }\n }\n validateUnknownJsonMetadataFields(\n value as Record<string, unknown>,\n path,\n new Set(Object.keys(validators)),\n );\n}\n\nfunction validateOptionalCspMetadata(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n const csp = value as NonNullable<RouteMetadata[\"csp\"]>;\n if (csp.disable !== undefined && typeof csp.disable !== \"boolean\") {\n throw new Error(`Invalid metadata field ${path}.disable: expected boolean.`);\n }\n if (csp.nonce !== undefined && typeof csp.nonce !== \"string\") {\n throw new Error(`Invalid metadata field ${path}.nonce: expected string.`);\n }\n validateOptionalDirectiveMap(csp.directives, `${path}.directives`);\n validateOptionalDirectiveMap(csp.replace, `${path}.replace`);\n if (csp.remove !== undefined) {\n validateStringArray(csp.remove, `${path}.remove`);\n }\n validateUnknownJsonMetadataFields(\n csp as Record<string, unknown>,\n path,\n new Set([\"directives\", \"disable\", \"nonce\", \"remove\", \"replace\"]),\n );\n}\n\nfunction validateOptionalDirectiveMap(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n for (const [name, directive] of Object.entries(value)) {\n if (typeof directive === \"string\") {\n continue;\n }\n validateStringArray(directive, `${path}.${name}`);\n }\n}\n\nfunction validateStringArray(value: unknown, path: string): void {\n if (!Array.isArray(value)) {\n throw new Error(`Invalid metadata field ${path}: expected string or string array.`);\n }\n\n value.forEach((entry, index) => {\n if (typeof entry !== \"string\") {\n throw new Error(`Invalid metadata field ${path}.${index}: expected string.`);\n }\n });\n}\n\nfunction validateOptionalHeadMetadata(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n if (!Array.isArray(value)) {\n throw new Error(`Invalid metadata field ${path}: expected array.`);\n }\n\n value.forEach((descriptor, index) => {\n const descriptorPath = `${path}.${index}`;\n assertPlainMetadataObject(descriptor, descriptorPath);\n const head = descriptor as unknown as RouteHeadDescriptor;\n if (![\"base\", \"link\", \"meta\", \"script\", \"style\"].includes(String(head.tag))) {\n throw new Error(`Invalid metadata field ${descriptorPath}.tag: expected supported head tag.`);\n }\n if (head.content !== undefined && typeof head.content !== \"string\") {\n throw new Error(`Invalid metadata field ${descriptorPath}.content: expected string.`);\n }\n if (\n head.nonce !== undefined &&\n typeof head.nonce !== \"boolean\" &&\n typeof head.nonce !== \"string\"\n ) {\n throw new Error(\n `Invalid metadata field ${descriptorPath}.nonce: expected string or boolean.`,\n );\n }\n if (head.attrs !== undefined) {\n assertPlainMetadataObject(head.attrs, `${descriptorPath}.attrs`);\n for (const [name, attr] of Object.entries(head.attrs)) {\n validateHeadAttribute(name, attr, `${descriptorPath}.attrs.${name}`);\n if (\n attr !== undefined &&\n typeof attr !== \"boolean\" &&\n typeof attr !== \"number\" &&\n typeof attr !== \"string\"\n ) {\n throw new Error(\n `Invalid metadata field ${descriptorPath}.attrs.${name}: expected string, number, boolean, or undefined.`,\n );\n }\n }\n }\n validateMetaRefreshHeadDescriptor(head, descriptorPath);\n validateUnknownJsonMetadataFields(\n descriptor as Record<string, unknown>,\n descriptorPath,\n new Set([\"attrs\", \"content\", \"nonce\", \"tag\"]),\n );\n });\n}\n\nfunction validateMetaRefreshHeadDescriptor(head: RouteHeadDescriptor, path: string): void {\n if (head.tag !== \"meta\" || head.attrs === undefined) {\n return;\n }\n\n const attrs = Object.entries(head.attrs);\n const hasRefresh = attrs.some(([name, value]) => {\n const canonicalName = name.toLowerCase();\n return (\n (canonicalName === \"http-equiv\" || canonicalName === \"httpequiv\") &&\n typeof value === \"string\" &&\n value.toLowerCase() === \"refresh\"\n );\n });\n\n if (!hasRefresh) {\n return;\n }\n\n for (const [name, value] of attrs) {\n if (\n name.toLowerCase() === \"content\" &&\n typeof value === \"string\" &&\n isUnsafeMetaRefreshContent(\"refresh\", value)\n ) {\n throw new Error(`Invalid metadata field ${path}.attrs.${name}: unsafe refresh URL value.`);\n }\n }\n}\n\nfunction validateHeadAttribute(name: string, value: unknown, path: string): void {\n if (!isSafeHeadAttributeName(name)) {\n throw new Error(`Invalid metadata field ${path}: expected safe HTML attribute name.`);\n }\n\n const canonicalName = name.toLowerCase();\n if (canonicalName.startsWith(\"on\") || isDangerousHtmlAttribute(canonicalName)) {\n throw new Error(\n `Invalid metadata field ${path}: event and dangerous attributes are not allowed.`,\n );\n }\n\n if (typeof value === \"string\" && isUnsafeUrlAttribute(canonicalName, value)) {\n throw new Error(`Invalid metadata field ${path}: unsafe URL value.`);\n }\n}\n\nfunction isSafeHeadAttributeName(name: string): boolean {\n if (name.length === 0) {\n return false;\n }\n\n for (let index = 0; index < name.length; index += 1) {\n const code = name.charCodeAt(index);\n\n if (\n code <= 0x20 ||\n code === 0x22 ||\n code === 0x27 ||\n code === 0x2f ||\n code === 0x3c ||\n code === 0x3d ||\n code === 0x3e ||\n code === 0x60 ||\n code === 0x7f\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction validateOptionalOpenGraphMetadata(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n const openGraph = value as NonNullable<RouteMetadata[\"openGraph\"]>;\n validateOptionalMetadataScalar(openGraph.description, `${path}.description`);\n validateOptionalMetadataImage(openGraph.image, `${path}.image`);\n if (openGraph.images !== undefined) {\n if (!Array.isArray(openGraph.images)) {\n throw new Error(`Invalid metadata field ${path}.images: expected array.`);\n }\n openGraph.images.forEach((image, index) =>\n validateOptionalMetadataImage(image, `${path}.images.${index}`),\n );\n }\n validateOptionalMetadataScalar(openGraph.title, `${path}.title`);\n validateUnknownJsonMetadataFields(\n openGraph as Record<string, unknown>,\n path,\n new Set([\"description\", \"image\", \"images\", \"title\"]),\n );\n}\n\nfunction validateOptionalMetadataImage(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n if (isMetadataScalar(value)) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n const image = value as unknown as MetadataImage;\n validateMetadataScalar(image.url, `${path}.url`);\n validateOptionalMetadataScalar(image.alt, `${path}.alt`);\n validateOptionalMetadataScalar(image.height, `${path}.height`);\n validateOptionalMetadataScalar(image.type, `${path}.type`);\n validateOptionalMetadataScalar(image.width, `${path}.width`);\n validateUnknownJsonMetadataFields(\n image as unknown as Record<string, unknown>,\n path,\n new Set([\"alt\", \"height\", \"type\", \"url\", \"width\"]),\n );\n}\n\nfunction validateOptionalRobotsMetadata(value: unknown, path: string): void {\n if (value === undefined || typeof value === \"string\") {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n const robots = value as Extract<NonNullable<RouteMetadata[\"robots\"]>, object>;\n if (robots.follow !== undefined && typeof robots.follow !== \"boolean\") {\n throw new Error(`Invalid metadata field ${path}.follow: expected boolean.`);\n }\n if (robots.index !== undefined && typeof robots.index !== \"boolean\") {\n throw new Error(`Invalid metadata field ${path}.index: expected boolean.`);\n }\n validateUnknownJsonMetadataFields(\n robots as Record<string, unknown>,\n path,\n new Set([\"follow\", \"index\"]),\n );\n}\n\nfunction validateOptionalSecurityMetadata(value: unknown, path: string): void {\n if (value === undefined) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n validateJsonSerializableMetadata(value, path);\n}\n\nfunction validateOptionalThemeColorMetadata(value: unknown, path: string): void {\n if (value === undefined || isMetadataScalar(value)) {\n return;\n }\n\n validateOptionalMetadataObject(value, path, {\n color: validateMetadataScalar,\n media: validateMetadataScalar,\n });\n}\n\nfunction validateOptionalViewportMetadata(value: unknown, path: string): void {\n if (value === undefined || isMetadataScalar(value)) {\n return;\n }\n\n assertPlainMetadataObject(value, path);\n for (const [key, viewportValue] of Object.entries(value)) {\n if (viewportValue !== undefined && viewportValue !== null && !isMetadataScalar(viewportValue)) {\n throw new Error(\n `Invalid metadata field ${path}.${key}: expected string, number, boolean, null, or undefined.`,\n );\n }\n }\n}\n\nfunction validateUnknownMetadataFields(metadata: RouteMetadata, path: string): void {\n validateUnknownJsonMetadataFields(\n metadata as Record<string, unknown>,\n path,\n new Set([\n \"alternates\",\n \"csp\",\n \"description\",\n \"head\",\n \"icons\",\n \"lang\",\n \"openGraph\",\n \"robots\",\n \"security\",\n \"themeColor\",\n \"title\",\n \"viewport\",\n ]),\n );\n}\n\nfunction validateUnknownJsonMetadataFields(\n value: Record<string, unknown>,\n path: string,\n knownFields: ReadonlySet<string>,\n): void {\n for (const [key, entry] of Object.entries(value)) {\n if (!knownFields.has(key)) {\n validateJsonSerializableMetadata(entry, `${path}.${key}`);\n }\n }\n}\n\nfunction validateJsonSerializableMetadata(value: unknown, path: string): void {\n if (value === undefined || value === null || isMetadataScalar(value)) {\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((entry, index) => validateJsonSerializableMetadata(entry, `${path}.${index}`));\n return;\n }\n\n if (isPlainMetadataObject(value)) {\n for (const [key, entry] of Object.entries(value)) {\n validateJsonSerializableMetadata(entry, `${path}.${key}`);\n }\n return;\n }\n\n throw new Error(`Invalid metadata field ${path}: expected a JSON-serializable value.`);\n}\n\nfunction assertPlainMetadataObject(\n value: unknown,\n path: string,\n): asserts value is Record<string, unknown> {\n if (!isPlainMetadataObject(value)) {\n throw new Error(`Invalid metadata field ${path}: expected object.`);\n }\n}\n\nfunction isPlainMetadataObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction openGraphImages(openGraph: RouteMetadata[\"openGraph\"]): readonly string[] {\n if (openGraph?.images !== undefined) {\n return openGraph.images.map((image, index) =>\n metadataImageUrl(image, `openGraph.images.${index}`),\n );\n }\n\n return openGraph?.image === undefined\n ? []\n : [metadataImageUrl(openGraph.image, \"openGraph.image\")];\n}\n\nfunction metadataImageUrl(value: MetadataImage | MetadataScalar, path: string): string {\n if (isMetadataScalar(value)) {\n return metadataString(value, path);\n }\n\n if (typeof value === \"object\" && value !== null && \"url\" in value) {\n return metadataString(value.url, `${path}.url`);\n }\n\n throw new Error(\n `Invalid metadata field ${path}: expected string, number, boolean, or object with url.`,\n );\n}\n\nfunction robotsContent(robots: NonNullable<RouteMetadata[\"robots\"]>): string {\n if (typeof robots === \"string\") {\n return robots;\n }\n\n return [\n robots.index === false ? \"noindex\" : \"index\",\n robots.follow === false ? \"nofollow\" : \"follow\",\n ].join(\",\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"navigation-marker.d.ts","sourceRoot":"","sources":["../src/navigation-marker.ts"],"names":[],"mappings":"AAoBA,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmD9D"}
1
+ {"version":3,"file":"navigation-marker.d.ts","sourceRoot":"","sources":["../src/navigation-marker.ts"],"names":[],"mappings":"AAqBA,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAkF9D"}