@atproto/oauth-provider 0.16.5 → 0.17.0

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 (321) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/access-token/access-token-mode.js +2 -5
  3. package/dist/access-token/access-token-mode.js.map +1 -1
  4. package/dist/account/account-manager.js +25 -33
  5. package/dist/account/account-manager.js.map +1 -1
  6. package/dist/account/account-store.js +11 -32
  7. package/dist/account/account-store.js.map +1 -1
  8. package/dist/account/sign-in-data.js +9 -12
  9. package/dist/account/sign-in-data.js.map +1 -1
  10. package/dist/account/sign-up-input.js +14 -17
  11. package/dist/account/sign-up-input.js.map +1 -1
  12. package/dist/client/client-auth.js +1 -2
  13. package/dist/client/client-data.js +1 -2
  14. package/dist/client/client-id.js +2 -5
  15. package/dist/client/client-id.js.map +1 -1
  16. package/dist/client/client-info.js +1 -2
  17. package/dist/client/client-manager.js +86 -97
  18. package/dist/client/client-manager.js.map +1 -1
  19. package/dist/client/client-store.js +7 -26
  20. package/dist/client/client-store.js.map +1 -1
  21. package/dist/client/client-utils.js +10 -14
  22. package/dist/client/client-utils.js.map +1 -1
  23. package/dist/client/client.js +43 -53
  24. package/dist/client/client.js.map +1 -1
  25. package/dist/constants.js +28 -31
  26. package/dist/constants.js.map +1 -1
  27. package/dist/customization/branding.js +8 -11
  28. package/dist/customization/branding.js.map +1 -1
  29. package/dist/customization/build-customization-css.js +8 -11
  30. package/dist/customization/build-customization-css.js.map +1 -1
  31. package/dist/customization/build-customization-data.js +1 -4
  32. package/dist/customization/build-customization-data.js.map +1 -1
  33. package/dist/customization/colors.js +11 -14
  34. package/dist/customization/colors.js.map +1 -1
  35. package/dist/customization/customization.js +8 -11
  36. package/dist/customization/customization.js.map +1 -1
  37. package/dist/customization/links.js +7 -10
  38. package/dist/customization/links.js.map +1 -1
  39. package/dist/device/device-data.js +7 -10
  40. package/dist/device/device-data.js.map +1 -1
  41. package/dist/device/device-id.js +11 -16
  42. package/dist/device/device-id.js.map +1 -1
  43. package/dist/device/device-manager.js +32 -38
  44. package/dist/device/device-manager.js.map +1 -1
  45. package/dist/device/device-store.js +7 -25
  46. package/dist/device/device-store.js.map +1 -1
  47. package/dist/device/session-id.js +9 -13
  48. package/dist/device/session-id.js.map +1 -1
  49. package/dist/dpop/dpop-manager.d.ts +3 -3
  50. package/dist/dpop/dpop-manager.js +38 -43
  51. package/dist/dpop/dpop-manager.js.map +1 -1
  52. package/dist/dpop/dpop-nonce.d.ts +2 -2
  53. package/dist/dpop/dpop-nonce.d.ts.map +1 -1
  54. package/dist/dpop/dpop-nonce.js +14 -18
  55. package/dist/dpop/dpop-nonce.js.map +1 -1
  56. package/dist/dpop/dpop-proof.js +1 -2
  57. package/dist/errors/access-denied-error.js +2 -6
  58. package/dist/errors/access-denied-error.js.map +1 -1
  59. package/dist/errors/account-selection-required-error.js +2 -6
  60. package/dist/errors/account-selection-required-error.js.map +1 -1
  61. package/dist/errors/authorization-error.js +7 -12
  62. package/dist/errors/authorization-error.js.map +1 -1
  63. package/dist/errors/consent-required-error.js +2 -6
  64. package/dist/errors/consent-required-error.js.map +1 -1
  65. package/dist/errors/error-parser.js +14 -18
  66. package/dist/errors/error-parser.js.map +1 -1
  67. package/dist/errors/handle-unavailable-error.js +2 -7
  68. package/dist/errors/handle-unavailable-error.js.map +1 -1
  69. package/dist/errors/invalid-authorization-details-error.js +2 -6
  70. package/dist/errors/invalid-authorization-details-error.js.map +1 -1
  71. package/dist/errors/invalid-client-error.js +2 -6
  72. package/dist/errors/invalid-client-error.js.map +1 -1
  73. package/dist/errors/invalid-client-id-error.js +2 -6
  74. package/dist/errors/invalid-client-id-error.js.map +1 -1
  75. package/dist/errors/invalid-client-metadata-error.js +7 -11
  76. package/dist/errors/invalid-client-metadata-error.js.map +1 -1
  77. package/dist/errors/invalid-credentials-error.js +2 -7
  78. package/dist/errors/invalid-credentials-error.js.map +1 -1
  79. package/dist/errors/invalid-dpop-key-binding-error.js +2 -6
  80. package/dist/errors/invalid-dpop-key-binding-error.js.map +1 -1
  81. package/dist/errors/invalid-dpop-proof-error.js +2 -6
  82. package/dist/errors/invalid-dpop-proof-error.js.map +1 -1
  83. package/dist/errors/invalid-grant-error.js +2 -6
  84. package/dist/errors/invalid-grant-error.js.map +1 -1
  85. package/dist/errors/invalid-invite-code-error.d.ts +1 -1
  86. package/dist/errors/invalid-invite-code-error.d.ts.map +1 -1
  87. package/dist/errors/invalid-invite-code-error.js +2 -6
  88. package/dist/errors/invalid-invite-code-error.js.map +1 -1
  89. package/dist/errors/invalid-redirect-uri-error.js +2 -6
  90. package/dist/errors/invalid-redirect-uri-error.js.map +1 -1
  91. package/dist/errors/invalid-request-error.js +3 -7
  92. package/dist/errors/invalid-request-error.js.map +1 -1
  93. package/dist/errors/invalid-scope-error.js +2 -6
  94. package/dist/errors/invalid-scope-error.js.map +1 -1
  95. package/dist/errors/invalid-token-error.js +10 -15
  96. package/dist/errors/invalid-token-error.js.map +1 -1
  97. package/dist/errors/login-required-error.js +2 -6
  98. package/dist/errors/login-required-error.js.map +1 -1
  99. package/dist/errors/oauth-error.js +1 -9
  100. package/dist/errors/oauth-error.js.map +1 -1
  101. package/dist/errors/second-authentication-factor-required-error.js +2 -8
  102. package/dist/errors/second-authentication-factor-required-error.js.map +1 -1
  103. package/dist/errors/unauthorized-client-error.js +2 -6
  104. package/dist/errors/unauthorized-client-error.js.map +1 -1
  105. package/dist/errors/use-dpop-nonce-error.js +4 -8
  106. package/dist/errors/use-dpop-nonce-error.js.map +1 -1
  107. package/dist/errors/www-authenticate-error.js +4 -9
  108. package/dist/errors/www-authenticate-error.js.map +1 -1
  109. package/dist/index.js +14 -30
  110. package/dist/index.js.map +1 -1
  111. package/dist/lexicon/lexicon-data.js +1 -2
  112. package/dist/lexicon/lexicon-getter.js +6 -10
  113. package/dist/lexicon/lexicon-getter.js.map +1 -1
  114. package/dist/lexicon/lexicon-manager.js +10 -30
  115. package/dist/lexicon/lexicon-manager.js.map +1 -1
  116. package/dist/lexicon/lexicon-store.js +5 -10
  117. package/dist/lexicon/lexicon-store.js.map +1 -1
  118. package/dist/lib/csp/index.js +3 -8
  119. package/dist/lib/csp/index.js.map +1 -1
  120. package/dist/lib/hcaptcha.js +33 -43
  121. package/dist/lib/hcaptcha.js.map +1 -1
  122. package/dist/lib/html/build-document.js +19 -24
  123. package/dist/lib/html/build-document.js.map +1 -1
  124. package/dist/lib/html/escapers.js +10 -16
  125. package/dist/lib/html/escapers.js.map +1 -1
  126. package/dist/lib/html/html.js +1 -5
  127. package/dist/lib/html/html.js.map +1 -1
  128. package/dist/lib/html/hydration-data.js +6 -10
  129. package/dist/lib/html/hydration-data.js.map +1 -1
  130. package/dist/lib/html/index.js +3 -19
  131. package/dist/lib/html/index.js.map +1 -1
  132. package/dist/lib/html/tags.js +14 -23
  133. package/dist/lib/html/tags.js.map +1 -1
  134. package/dist/lib/html/util.js +1 -4
  135. package/dist/lib/html/util.js.map +1 -1
  136. package/dist/lib/http/accept.d.ts.map +1 -1
  137. package/dist/lib/http/accept.js +8 -8
  138. package/dist/lib/http/accept.js.map +1 -1
  139. package/dist/lib/http/context.js +1 -4
  140. package/dist/lib/http/context.js.map +1 -1
  141. package/dist/lib/http/headers.js +1 -4
  142. package/dist/lib/http/headers.js.map +1 -1
  143. package/dist/lib/http/index.js +10 -26
  144. package/dist/lib/http/index.js.map +1 -1
  145. package/dist/lib/http/method.js +1 -4
  146. package/dist/lib/http/method.js.map +1 -1
  147. package/dist/lib/http/middleware.js +11 -17
  148. package/dist/lib/http/middleware.js.map +1 -1
  149. package/dist/lib/http/parser.js +13 -20
  150. package/dist/lib/http/parser.js.map +1 -1
  151. package/dist/lib/http/path.js +1 -4
  152. package/dist/lib/http/path.js.map +1 -1
  153. package/dist/lib/http/request.d.ts.map +1 -1
  154. package/dist/lib/http/request.js +32 -47
  155. package/dist/lib/http/request.js.map +1 -1
  156. package/dist/lib/http/response.js +14 -27
  157. package/dist/lib/http/response.js.map +1 -1
  158. package/dist/lib/http/route.js +9 -12
  159. package/dist/lib/http/route.js.map +1 -1
  160. package/dist/lib/http/router.js +8 -13
  161. package/dist/lib/http/router.js.map +1 -1
  162. package/dist/lib/http/security-headers.js +10 -15
  163. package/dist/lib/http/security-headers.js.map +1 -1
  164. package/dist/lib/http/stream.js +12 -20
  165. package/dist/lib/http/stream.js.map +1 -1
  166. package/dist/lib/http/types.js +1 -2
  167. package/dist/lib/http/url.js +1 -4
  168. package/dist/lib/http/url.js.map +1 -1
  169. package/dist/lib/nsid.js +4 -8
  170. package/dist/lib/nsid.js.map +1 -1
  171. package/dist/lib/redis.js +4 -7
  172. package/dist/lib/redis.js.map +1 -1
  173. package/dist/lib/util/authorization-header.js +11 -15
  174. package/dist/lib/util/authorization-header.js.map +1 -1
  175. package/dist/lib/util/cast.js +3 -8
  176. package/dist/lib/util/cast.js.map +1 -1
  177. package/dist/lib/util/color.js +23 -32
  178. package/dist/lib/util/color.js.map +1 -1
  179. package/dist/lib/util/crypto.js +5 -10
  180. package/dist/lib/util/crypto.js.map +1 -1
  181. package/dist/lib/util/date.js +2 -6
  182. package/dist/lib/util/date.js.map +1 -1
  183. package/dist/lib/util/error.js +5 -8
  184. package/dist/lib/util/error.js.map +1 -1
  185. package/dist/lib/util/function.js +3 -8
  186. package/dist/lib/util/function.js.map +1 -1
  187. package/dist/lib/util/locale.js +3 -6
  188. package/dist/lib/util/locale.js.map +1 -1
  189. package/dist/lib/util/object.js +1 -4
  190. package/dist/lib/util/object.js.map +1 -1
  191. package/dist/lib/util/redirect-uri.js +3 -6
  192. package/dist/lib/util/redirect-uri.js.map +1 -1
  193. package/dist/lib/util/time.js +5 -9
  194. package/dist/lib/util/time.js.map +1 -1
  195. package/dist/lib/util/type.d.ts.map +1 -1
  196. package/dist/lib/util/type.js +1 -5
  197. package/dist/lib/util/type.js.map +1 -1
  198. package/dist/lib/util/ui8.js +3 -8
  199. package/dist/lib/util/ui8.js.map +1 -1
  200. package/dist/lib/util/well-known.js +1 -4
  201. package/dist/lib/util/well-known.js.map +1 -1
  202. package/dist/lib/util/zod-error.js +4 -8
  203. package/dist/lib/util/zod-error.js.map +1 -1
  204. package/dist/lib/write-form-redirect.js +9 -12
  205. package/dist/lib/write-form-redirect.js.map +1 -1
  206. package/dist/lib/write-html.js +12 -15
  207. package/dist/lib/write-html.js.map +1 -1
  208. package/dist/metadata/build-metadata.js +9 -12
  209. package/dist/metadata/build-metadata.js.map +1 -1
  210. package/dist/oauth-client.js +2 -18
  211. package/dist/oauth-client.js.map +1 -1
  212. package/dist/oauth-dpop.js +2 -18
  213. package/dist/oauth-dpop.js.map +1 -1
  214. package/dist/oauth-errors.js +24 -42
  215. package/dist/oauth-errors.js.map +1 -1
  216. package/dist/oauth-hooks.js +8 -15
  217. package/dist/oauth-hooks.js.map +1 -1
  218. package/dist/oauth-middleware.js +13 -16
  219. package/dist/oauth-middleware.js.map +1 -1
  220. package/dist/oauth-provider.js +108 -125
  221. package/dist/oauth-provider.js.map +1 -1
  222. package/dist/oauth-store.js +7 -23
  223. package/dist/oauth-store.js.map +1 -1
  224. package/dist/oauth-verifier.js +41 -53
  225. package/dist/oauth-verifier.js.map +1 -1
  226. package/dist/oidc/sub.js +2 -5
  227. package/dist/oidc/sub.js.map +1 -1
  228. package/dist/replay/replay-manager.js +6 -11
  229. package/dist/replay/replay-manager.js.map +1 -1
  230. package/dist/replay/replay-store-memory.js +5 -7
  231. package/dist/replay/replay-store-memory.js.map +1 -1
  232. package/dist/replay/replay-store-redis.js +3 -8
  233. package/dist/replay/replay-store-redis.js.map +1 -1
  234. package/dist/replay/replay-store.js +3 -8
  235. package/dist/replay/replay-store.js.map +1 -1
  236. package/dist/request/code.js +10 -15
  237. package/dist/request/code.js.map +1 -1
  238. package/dist/request/request-data.js +1 -5
  239. package/dist/request/request-data.js.map +1 -1
  240. package/dist/request/request-id.js +9 -13
  241. package/dist/request/request-id.js.map +1 -1
  242. package/dist/request/request-manager.js +61 -71
  243. package/dist/request/request-manager.js.map +1 -1
  244. package/dist/request/request-store.js +9 -27
  245. package/dist/request/request-store.js.map +1 -1
  246. package/dist/request/request-uri.js +17 -23
  247. package/dist/request/request-uri.js.map +1 -1
  248. package/dist/result/authorization-redirect-parameters.js +1 -2
  249. package/dist/result/authorization-result-authorize-page.js +1 -2
  250. package/dist/result/authorization-result-redirect.js +1 -2
  251. package/dist/router/assets/assets-manifest.d.ts.map +1 -1
  252. package/dist/router/assets/assets-manifest.js +14 -15
  253. package/dist/router/assets/assets-manifest.js.map +1 -1
  254. package/dist/router/assets/assets.d.ts.map +1 -1
  255. package/dist/router/assets/assets.js +25 -27
  256. package/dist/router/assets/assets.js.map +1 -1
  257. package/dist/router/assets/csrf.js +16 -25
  258. package/dist/router/assets/csrf.js.map +1 -1
  259. package/dist/router/assets/send-account-page.js +3 -6
  260. package/dist/router/assets/send-account-page.js.map +1 -1
  261. package/dist/router/assets/send-authorization-page.js +3 -6
  262. package/dist/router/assets/send-authorization-page.js.map +1 -1
  263. package/dist/router/assets/send-cookie-error-page.js +3 -6
  264. package/dist/router/assets/send-cookie-error-page.js.map +1 -1
  265. package/dist/router/assets/send-error-page.js +6 -9
  266. package/dist/router/assets/send-error-page.js.map +1 -1
  267. package/dist/router/assets/send-redirect.js +12 -20
  268. package/dist/router/assets/send-redirect.js.map +1 -1
  269. package/dist/router/create-account-page-middleware.js +11 -14
  270. package/dist/router/create-account-page-middleware.js.map +1 -1
  271. package/dist/router/create-api-middleware.js +83 -90
  272. package/dist/router/create-api-middleware.js.map +1 -1
  273. package/dist/router/create-authorization-page-middleware.js +43 -46
  274. package/dist/router/create-authorization-page-middleware.js.map +1 -1
  275. package/dist/router/create-oauth-middleware.js +31 -34
  276. package/dist/router/create-oauth-middleware.js.map +1 -1
  277. package/dist/router/error-handler.js +1 -2
  278. package/dist/router/middleware-options.js +1 -2
  279. package/dist/signer/access-token-payload.js +12 -15
  280. package/dist/signer/access-token-payload.js.map +1 -1
  281. package/dist/signer/api-token-payload.js +8 -11
  282. package/dist/signer/api-token-payload.js.map +1 -1
  283. package/dist/signer/signer.js +11 -17
  284. package/dist/signer/signer.js.map +1 -1
  285. package/dist/token/refresh-token.js +10 -15
  286. package/dist/token/refresh-token.js.map +1 -1
  287. package/dist/token/token-claims.js +1 -2
  288. package/dist/token/token-data.js +1 -2
  289. package/dist/token/token-id.js +10 -15
  290. package/dist/token/token-id.js.map +1 -1
  291. package/dist/token/token-manager.js +40 -51
  292. package/dist/token/token-manager.js.map +1 -1
  293. package/dist/token/token-store.js +7 -25
  294. package/dist/token/token-store.js.map +1 -1
  295. package/dist/types/authorization-response-error.js +8 -12
  296. package/dist/types/authorization-response-error.js.map +1 -1
  297. package/dist/types/color-hue.js +2 -5
  298. package/dist/types/color-hue.js.map +1 -1
  299. package/dist/types/email-otp.js +2 -5
  300. package/dist/types/email-otp.js.map +1 -1
  301. package/dist/types/email.js +6 -9
  302. package/dist/types/email.js.map +1 -1
  303. package/dist/types/handle.js +6 -9
  304. package/dist/types/handle.js.map +1 -1
  305. package/dist/types/invite-code.js +2 -5
  306. package/dist/types/invite-code.js.map +1 -1
  307. package/dist/types/par-response-error.js +5 -9
  308. package/dist/types/par-response-error.js.map +1 -1
  309. package/dist/types/password.js +3 -6
  310. package/dist/types/password.js.map +1 -1
  311. package/dist/types/rgb-color.js +7 -10
  312. package/dist/types/rgb-color.js.map +1 -1
  313. package/package.json +20 -22
  314. package/src/dpop/dpop-nonce.ts +1 -1
  315. package/src/errors/invalid-invite-code-error.ts +1 -1
  316. package/src/lib/http/accept.ts +4 -1
  317. package/src/lib/http/request.ts +4 -1
  318. package/src/lib/util/type.ts +0 -1
  319. package/src/router/assets/assets-manifest.ts +3 -1
  320. package/src/router/assets/assets.ts +2 -0
  321. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"escapers.js","sourceRoot":"","sources":["../../../src/lib/html/escapers.ts"],"names":[],"mappings":";;AAGA,8CAIC;AAED,kCAOC;AAED,gCAEC;AAKD,kCAUC;AAnCD,uCAAgC;AAChC,uCAA0D;AAE1D,QAAe,CAAC,CAAC,iBAAiB,CAAC,IAAY;IAC7C,6EAA6E;IAC7E,2CAA2C;IAC3C,KAAK,CAAC,CAAC,IAAA,wBAAc,EAAC,IAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAA;AAC7D,CAAC;AAED,QAAe,CAAC,CAAC,WAAW,CAAC,KAAc;IACzC,sEAAsE;IACtE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAClC,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAA;IACvE,0EAA0E;IAC1E,qBAAqB;IACrB,KAAK,CAAC,CAAC,IAAA,wBAAc,EAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;AAC7C,CAAC;AAED,QAAe,CAAC,CAAC,UAAU,CAAC,GAAW;IACrC,KAAK,CAAC,CAAC,IAAA,wBAAc,EAAC,GAAG,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAA;AAC1D,CAAC;AAKD,QAAe,CAAC,CAAC,WAAW,CAC1B,aAAmC,EACnC,MAA4B;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,aAAa,CAAC,CAAC,CAAE,CAAA;QAEvB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACvB,IAAI,KAAK,IAAI,IAAI;YAAE,KAAK,CAAC,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAA;IAC1D,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,CAAC,uBAAuB,CAC/B,KAAgB;IAEhB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAM;IACR,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;SAAM,IAAI,KAAK,YAAY,cAAI,EAAE,CAAC;QACjC,MAAM,KAAK,CAAA;IACb,CAAC;SAAM,CAAC;QACN,6CAA6C;QAC7C,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,KAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAA;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,iBAAiB,GAAG,UAAU,CAAA;AACpC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,QAAQ,CAAC;IACf,CAAC,GAAG,EAAE,QAAQ,CAAC;IACf,CAAC,GAAG,EAAE,OAAO,CAAC;CACf,CAAC,CAAA;AACF,MAAM,iBAAiB,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAE,CAAA;AAC/D,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAA;AAC5D,CAAC","sourcesContent":["import { Html } from './html.js'\nimport { NestedIterable, stringReplacer } from './util.js'\n\nexport function* javascriptEscaper(code: string) {\n // \"</script>\" can only appear in javascript strings, so we can safely escape\n // the \"<\" without breaking the javascript.\n yield* stringReplacer(code, '</script>', '\\\\u003c/script>')\n}\n\nexport function* jsonEscaper(value: unknown) {\n // https://redux.js.org/usage/server-rendering#security-considerations\n const json = JSON.stringify(value)\n if (json === undefined) throw new TypeError('Cannot serialize to JSON')\n // \"<\" can only appear in JSON strings, so we can safely escape it without\n // breaking the JSON.\n yield* stringReplacer(json, '<', '\\\\u003c')\n}\n\nexport function* cssEscaper(css: string) {\n yield* stringReplacer(css, '</style>', '\\\\u003c/style>')\n}\n\nexport type HtmlVariable = Html | string | number | null | undefined\nexport type HtmlValue = NestedIterable<HtmlVariable>\n\nexport function* htmlEscaper(\n htmlFragments: TemplateStringsArray,\n values: readonly HtmlValue[],\n): Generator<string | Html, void, undefined> {\n for (let i = 0; i < htmlFragments.length; i++) {\n yield htmlFragments[i]!\n\n const value = values[i]\n if (value != null) yield* htmlVariableToFragments(value)\n }\n}\n\nfunction* htmlVariableToFragments(\n value: HtmlValue,\n): Generator<string | Html, void, undefined> {\n if (value == null) {\n return\n } else if (typeof value === 'number') {\n yield String(value)\n } else if (typeof value === 'string') {\n yield encode(value)\n } else if (value instanceof Html) {\n yield value\n } else {\n // Will throw if the value is not an iterable\n for (const v of value) yield* htmlVariableToFragments(v)\n }\n}\n\nconst specialCharRegExp = /[<>\"'&]/g\nconst specialCharMap = new Map([\n ['<', '&lt;'],\n ['>', '&gt;'],\n ['\"', '&quot;'],\n [\"'\", '&apos;'],\n ['&', '&amp;'],\n])\nconst specialCharMapGet = (c: string) => specialCharMap.get(c)!\nfunction encode(value: string): string {\n return value.replace(specialCharRegExp, specialCharMapGet)\n}\n"]}
1
+ {"version":3,"file":"escapers.js","sourceRoot":"","sources":["../../../src/lib/html/escapers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAkB,cAAc,EAAE,MAAM,WAAW,CAAA;AAE1D,MAAM,SAAS,CAAC,CAAC,iBAAiB,CAAC,IAAY;IAC7C,6EAA6E;IAC7E,2CAA2C;IAC3C,KAAK,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAA;AAC7D,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,WAAW,CAAC,KAAc;IACzC,sEAAsE;IACtE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAClC,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAA;IACvE,0EAA0E;IAC1E,qBAAqB;IACrB,KAAK,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,UAAU,CAAC,GAAW;IACrC,KAAK,CAAC,CAAC,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAA;AAC1D,CAAC;AAKD,MAAM,SAAS,CAAC,CAAC,WAAW,CAC1B,aAAmC,EACnC,MAA4B;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,aAAa,CAAC,CAAC,CAAE,CAAA;QAEvB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACvB,IAAI,KAAK,IAAI,IAAI;YAAE,KAAK,CAAC,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAA;IAC1D,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,CAAC,uBAAuB,CAC/B,KAAgB;IAEhB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAM;IACR,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;SAAM,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QACjC,MAAM,KAAK,CAAA;IACb,CAAC;SAAM,CAAC;QACN,6CAA6C;QAC7C,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,KAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAA;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,iBAAiB,GAAG,UAAU,CAAA;AACpC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,QAAQ,CAAC;IACf,CAAC,GAAG,EAAE,QAAQ,CAAC;IACf,CAAC,GAAG,EAAE,OAAO,CAAC;CACf,CAAC,CAAA;AACF,MAAM,iBAAiB,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAE,CAAA;AAC/D,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAA;AAC5D,CAAC","sourcesContent":["import { Html } from './html.js'\nimport { NestedIterable, stringReplacer } from './util.js'\n\nexport function* javascriptEscaper(code: string) {\n // \"</script>\" can only appear in javascript strings, so we can safely escape\n // the \"<\" without breaking the javascript.\n yield* stringReplacer(code, '</script>', '\\\\u003c/script>')\n}\n\nexport function* jsonEscaper(value: unknown) {\n // https://redux.js.org/usage/server-rendering#security-considerations\n const json = JSON.stringify(value)\n if (json === undefined) throw new TypeError('Cannot serialize to JSON')\n // \"<\" can only appear in JSON strings, so we can safely escape it without\n // breaking the JSON.\n yield* stringReplacer(json, '<', '\\\\u003c')\n}\n\nexport function* cssEscaper(css: string) {\n yield* stringReplacer(css, '</style>', '\\\\u003c/style>')\n}\n\nexport type HtmlVariable = Html | string | number | null | undefined\nexport type HtmlValue = NestedIterable<HtmlVariable>\n\nexport function* htmlEscaper(\n htmlFragments: TemplateStringsArray,\n values: readonly HtmlValue[],\n): Generator<string | Html, void, undefined> {\n for (let i = 0; i < htmlFragments.length; i++) {\n yield htmlFragments[i]!\n\n const value = values[i]\n if (value != null) yield* htmlVariableToFragments(value)\n }\n}\n\nfunction* htmlVariableToFragments(\n value: HtmlValue,\n): Generator<string | Html, void, undefined> {\n if (value == null) {\n return\n } else if (typeof value === 'number') {\n yield String(value)\n } else if (typeof value === 'string') {\n yield encode(value)\n } else if (value instanceof Html) {\n yield value\n } else {\n // Will throw if the value is not an iterable\n for (const v of value) yield* htmlVariableToFragments(v)\n }\n}\n\nconst specialCharRegExp = /[<>\"'&]/g\nconst specialCharMap = new Map([\n ['<', '&lt;'],\n ['>', '&gt;'],\n ['\"', '&quot;'],\n [\"'\", '&apos;'],\n ['&', '&amp;'],\n])\nconst specialCharMapGet = (c: string) => specialCharMap.get(c)!\nfunction encode(value: string): string {\n return value.replace(specialCharRegExp, specialCharMapGet)\n}\n"]}
@@ -1,12 +1,9 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Html = void 0;
4
1
  const symbol = Symbol('Html.dangerouslyCreate');
5
2
  /**
6
3
  * This class represents trusted HTML that can be safely embedded in a web page,
7
4
  * or used as fragments to build a larger HTML document.
8
5
  */
9
- class Html {
6
+ export class Html {
10
7
  #fragments;
11
8
  constructor(fragments, guard) {
12
9
  if (guard !== symbol) {
@@ -49,5 +46,4 @@ class Html {
49
46
  return new Html(fragments, symbol);
50
47
  }
51
48
  }
52
- exports.Html = Html;
53
49
  //# sourceMappingURL=html.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"html.js","sourceRoot":"","sources":["../../../src/lib/html/html.ts"],"names":[],"mappings":";;;AAAA,MAAM,MAAM,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAA;AAE/C;;;GAGG;AACH,MAAa,IAAI;IACN,UAAU,CAA4B;IAE/C,YAAoB,SAAkC,EAAE,KAAa;QACnE,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,sEAAsE;YACtE,mEAAmE;YACnE,MAAM,IAAI,SAAS,CACjB,yDAAyD,CAC1D,CAAA;QACH,CAAC;QAED,qEAAqE;QACrE,+BAA+B;QAC/B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC;IAED,QAAQ;QACN,0EAA0E;QAC1E,uEAAuE;QACvE,yEAAyE;QACzE,4EAA4E;QAC5E,gEAAgE;QAChE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC;IAED,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI;QACvB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ,CAAC;YACd,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;YACxB;gBACE,MAAM,IAAI,SAAS,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;IAED,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,MAAM,QAAQ,CAAA;YAChB,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,CAAC,QAAQ,CAAA;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,SAAkC;QACzD,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACpC,CAAC;CACF;AAjDD,oBAiDC","sourcesContent":["const symbol = Symbol('Html.dangerouslyCreate')\n\n/**\n * This class represents trusted HTML that can be safely embedded in a web page,\n * or used as fragments to build a larger HTML document.\n */\nexport class Html implements Iterable<string> {\n readonly #fragments: readonly (Html | string)[]\n\n private constructor(fragments: Iterable<Html | string>, guard: symbol) {\n if (guard !== symbol) {\n // Forces developers to use `Html.dangerouslyCreate` to create an Html\n // instance, to make it clear that the content needs to be trusted.\n throw new TypeError(\n 'Use Html.dangerouslyCreate() to create an Html instance',\n )\n }\n\n // Transform into an array in case iterable can be consumed only once\n // (e.g. a generator function).\n this.#fragments = Array.from(fragments)\n }\n\n toString(): string {\n // More efficient than `return this.#fragments.join('')` because it avoids\n // creating intermediate strings when items of this.#fragments are Html\n // instances (as all their toString() would end-up being called, creating\n // lots of intermediary strings). The approach here allows to do a full scan\n // of all the child nodes and concatenate them in a single pass.\n return Array.from(this).join('')\n }\n\n [Symbol.toPrimitive](hint): string {\n switch (hint) {\n case 'string':\n case 'default':\n return this.toString()\n default:\n throw new TypeError(`Cannot convert Html to a ${hint}`)\n }\n }\n\n *[Symbol.iterator](): IterableIterator<string> {\n for (const fragment of this.#fragments) {\n if (typeof fragment === 'string') {\n yield fragment\n } else {\n yield* fragment\n }\n }\n }\n\n static dangerouslyCreate(fragments: Iterable<Html | string>): Html {\n return new Html(fragments, symbol)\n }\n}\n"]}
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../../src/lib/html/html.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAA;AAE/C;;;GAGG;AACH,MAAM,OAAO,IAAI;IACN,UAAU,CAA4B;IAE/C,YAAoB,SAAkC,EAAE,KAAa;QACnE,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,sEAAsE;YACtE,mEAAmE;YACnE,MAAM,IAAI,SAAS,CACjB,yDAAyD,CAC1D,CAAA;QACH,CAAC;QAED,qEAAqE;QACrE,+BAA+B;QAC/B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC;IAED,QAAQ;QACN,0EAA0E;QAC1E,uEAAuE;QACvE,yEAAyE;QACzE,4EAA4E;QAC5E,gEAAgE;QAChE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC;IAED,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI;QACvB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ,CAAC;YACd,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;YACxB;gBACE,MAAM,IAAI,SAAS,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;IAED,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,MAAM,QAAQ,CAAA;YAChB,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,CAAC,QAAQ,CAAA;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,SAAkC;QACzD,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACpC,CAAC;CACF","sourcesContent":["const symbol = Symbol('Html.dangerouslyCreate')\n\n/**\n * This class represents trusted HTML that can be safely embedded in a web page,\n * or used as fragments to build a larger HTML document.\n */\nexport class Html implements Iterable<string> {\n readonly #fragments: readonly (Html | string)[]\n\n private constructor(fragments: Iterable<Html | string>, guard: symbol) {\n if (guard !== symbol) {\n // Forces developers to use `Html.dangerouslyCreate` to create an Html\n // instance, to make it clear that the content needs to be trusted.\n throw new TypeError(\n 'Use Html.dangerouslyCreate() to create an Html instance',\n )\n }\n\n // Transform into an array in case iterable can be consumed only once\n // (e.g. a generator function).\n this.#fragments = Array.from(fragments)\n }\n\n toString(): string {\n // More efficient than `return this.#fragments.join('')` because it avoids\n // creating intermediate strings when items of this.#fragments are Html\n // instances (as all their toString() would end-up being called, creating\n // lots of intermediary strings). The approach here allows to do a full scan\n // of all the child nodes and concatenate them in a single pass.\n return Array.from(this).join('')\n }\n\n [Symbol.toPrimitive](hint): string {\n switch (hint) {\n case 'string':\n case 'default':\n return this.toString()\n default:\n throw new TypeError(`Cannot convert Html to a ${hint}`)\n }\n }\n\n *[Symbol.iterator](): IterableIterator<string> {\n for (const fragment of this.#fragments) {\n if (typeof fragment === 'string') {\n yield fragment\n } else {\n yield* fragment\n }\n }\n }\n\n static dangerouslyCreate(fragments: Iterable<Html | string>): Html {\n return new Html(fragments, symbol)\n }\n}\n"]}
@@ -1,18 +1,14 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.declareHydrationData = declareHydrationData;
4
- exports.hydrationDataGenerator = hydrationDataGenerator;
5
- const index_js_1 = require("./index.js");
6
- function declareHydrationData(values) {
7
- return index_js_1.Html.dangerouslyCreate(hydrationDataGenerator(values));
1
+ import { Html, js } from './index.js';
2
+ export function declareHydrationData(values) {
3
+ return Html.dangerouslyCreate(hydrationDataGenerator(values));
8
4
  }
9
- function* hydrationDataGenerator(values) {
5
+ export function* hydrationDataGenerator(values) {
10
6
  for (const [key, val] of Object.entries(values)) {
11
- yield (0, index_js_1.js) `window[${key}]=JSON.parse(${JSON.stringify(val)});`;
7
+ yield js `window[${key}]=JSON.parse(${JSON.stringify(val)});`;
12
8
  }
13
9
  // The script tag is removed after the data is assigned to the global
14
10
  // variables to prevent other scripts from reading the values. The "app"
15
11
  // script will read the global variable and then unset it.
16
- yield (0, index_js_1.js) `document.currentScript.remove();`;
12
+ yield js `document.currentScript.remove();`;
17
13
  }
18
14
  //# sourceMappingURL=hydration-data.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hydration-data.js","sourceRoot":"","sources":["../../../src/lib/html/hydration-data.ts"],"names":[],"mappings":";;AAEA,oDAIC;AAED,wDAUC;AAlBD,yCAAqC;AAErC,SAAgB,oBAAoB,CAClC,MAAS;IAET,OAAO,eAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAA;AAC/D,CAAC;AAED,QAAe,CAAC,CAAC,sBAAsB,CACrC,MAA+B;IAE/B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,MAAM,IAAA,aAAE,EAAA,UAAU,GAAG,gBAAgB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAA;IAC9D,CAAC;IACD,qEAAqE;IACrE,wEAAwE;IACxE,0DAA0D;IAC1D,MAAM,IAAA,aAAE,EAAA,kCAAkC,CAAA;AAC5C,CAAC","sourcesContent":["import { Html, js } from './index.js'\n\nexport function declareHydrationData<T extends Record<string, unknown>>(\n values: T,\n): Html {\n return Html.dangerouslyCreate(hydrationDataGenerator(values))\n}\n\nexport function* hydrationDataGenerator(\n values: Record<string, unknown>,\n): Generator<Html> {\n for (const [key, val] of Object.entries(values)) {\n yield js`window[${key}]=JSON.parse(${JSON.stringify(val)});`\n }\n // The script tag is removed after the data is assigned to the global\n // variables to prevent other scripts from reading the values. The \"app\"\n // script will read the global variable and then unset it.\n yield js`document.currentScript.remove();`\n}\n"]}
1
+ {"version":3,"file":"hydration-data.js","sourceRoot":"","sources":["../../../src/lib/html/hydration-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,YAAY,CAAA;AAErC,MAAM,UAAU,oBAAoB,CAClC,MAAS;IAET,OAAO,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,sBAAsB,CACrC,MAA+B;IAE/B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,MAAM,EAAE,CAAA,UAAU,GAAG,gBAAgB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAA;IAC9D,CAAC;IACD,qEAAqE;IACrE,wEAAwE;IACxE,0DAA0D;IAC1D,MAAM,EAAE,CAAA,kCAAkC,CAAA;AAC5C,CAAC","sourcesContent":["import { Html, js } from './index.js'\n\nexport function declareHydrationData<T extends Record<string, unknown>>(\n values: T,\n): Html {\n return Html.dangerouslyCreate(hydrationDataGenerator(values))\n}\n\nexport function* hydrationDataGenerator(\n values: Record<string, unknown>,\n): Generator<Html> {\n for (const [key, val] of Object.entries(values)) {\n yield js`window[${key}]=JSON.parse(${JSON.stringify(val)});`\n }\n // The script tag is removed after the data is assigned to the global\n // variables to prevent other scripts from reading the values. The \"app\"\n // script will read the global variable and then unset it.\n yield js`document.currentScript.remove();`\n}\n"]}
@@ -1,21 +1,5 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./html.js"), exports);
18
- __exportStar(require("./tags.js"), exports);
1
+ export * from './html.js';
2
+ export * from './tags.js';
19
3
  // Extra util
20
- __exportStar(require("./build-document.js"), exports);
4
+ export * from './build-document.js';
21
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/html/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAAyB;AACzB,4CAAyB;AAEzB,aAAa;AACb,sDAAmC","sourcesContent":["export * from './html.js'\nexport * from './tags.js'\n\n// Extra util\nexport * from './build-document.js'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/html/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AAEzB,aAAa;AACb,cAAc,qBAAqB,CAAA","sourcesContent":["export * from './html.js'\nexport * from './tags.js'\n\n// Extra util\nexport * from './build-document.js'\n"]}
@@ -1,18 +1,13 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.cssCode = exports.css = exports.jsonCode = exports.js = exports.javascriptCode = exports.html = void 0;
4
- const escapers_js_1 = require("./escapers.js");
5
- const html_js_1 = require("./html.js");
6
- const html = (tpl, ...val) => tpl.length === 1 && val.length === 0
1
+ import { cssEscaper, htmlEscaper, javascriptEscaper, jsonEscaper, } from './escapers.js';
2
+ import { Html } from './html.js';
3
+ export const html = (tpl, ...val) => tpl.length === 1 && val.length === 0
7
4
  ? // Optimization for static HTML, avoid creating an iterable
8
- html_js_1.Html.dangerouslyCreate(tpl)
9
- : html_js_1.Html.dangerouslyCreate((0, escapers_js_1.htmlEscaper)(tpl, val));
10
- exports.html = html;
5
+ Html.dangerouslyCreate(tpl)
6
+ : Html.dangerouslyCreate(htmlEscaper(tpl, val));
11
7
  /**
12
8
  * Escapes code to use as a JavaScript string inside a `<script>` tag.
13
9
  */
14
- const javascriptCode = (code) => html_js_1.Html.dangerouslyCreate((0, escapers_js_1.javascriptEscaper)(code));
15
- exports.javascriptCode = javascriptCode;
10
+ export const javascriptCode = (code) => Html.dangerouslyCreate(javascriptEscaper(code));
16
11
  /**
17
12
  * Creates an HTML safe JavaScript code block, with JSON serialization of the
18
13
  * injected variables.
@@ -27,29 +22,25 @@ exports.javascriptCode = javascriptCode;
27
22
  * console.log(clientScript.toString()); // Output: 'const data = {"foo":"bar"};console.log(data);'
28
23
  * ```
29
24
  */
30
- const js = (tpl, ...val) => tpl.length === 1 && val.length === 0
25
+ export const js = (tpl, ...val) => tpl.length === 1 && val.length === 0
31
26
  ? // Optimization for static JavaScript, avoid un-necessary serialization
32
- (0, exports.javascriptCode)(tpl[0])
33
- : (0, exports.javascriptCode)(String.raw({ raw: tpl }, ...val.map(exports.jsonCode)));
34
- exports.js = js;
27
+ javascriptCode(tpl[0])
28
+ : javascriptCode(String.raw({ raw: tpl }, ...val.map(jsonCode)));
35
29
  /**
36
30
  * Escapes a value to be used as a JSON string inside a `<script>` tag.
37
31
  *
38
32
  * @see {@link https://redux.js.org/usage/server-rendering#security-considerations}
39
33
  */
40
- const jsonCode = (value) => html_js_1.Html.dangerouslyCreate((0, escapers_js_1.jsonEscaper)(value));
41
- exports.jsonCode = jsonCode;
34
+ export const jsonCode = (value) => Html.dangerouslyCreate(jsonEscaper(value));
42
35
  /**
43
36
  * Creates an HTML safe CSS code block.
44
37
  */
45
- const css = (tpl, ...val) => tpl.length === 1 && val.length === 0
38
+ export const css = (tpl, ...val) => tpl.length === 1 && val.length === 0
46
39
  ? // Optimization for static CSS, avoid creating an iterable
47
- (0, exports.cssCode)(tpl[0])
48
- : (0, exports.cssCode)(String.raw({ raw: tpl }, ...val.map(escapers_js_1.jsonEscaper)));
49
- exports.css = css;
40
+ cssCode(tpl[0])
41
+ : cssCode(String.raw({ raw: tpl }, ...val.map(jsonEscaper)));
50
42
  /**
51
43
  * Escapes a value to be uses as CSS styles inside a `<style>` tag.
52
44
  */
53
- const cssCode = (code) => code ? html_js_1.Html.dangerouslyCreate((0, escapers_js_1.cssEscaper)(code)) : undefined;
54
- exports.cssCode = cssCode;
45
+ export const cssCode = (code) => code ? Html.dangerouslyCreate(cssEscaper(code)) : undefined;
55
46
  //# sourceMappingURL=tags.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../../src/lib/html/tags.ts"],"names":[],"mappings":";;;AAAA,+CAMsB;AACtB,uCAAgC;AAGzB,MAAM,IAAI,GAAG,CAClB,GAAyB,EACzB,GAAG,GAAyB,EAC5B,EAAE,CACF,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;IAClC,CAAC,CAAC,2DAA2D;QAC3D,cAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;IAC7B,CAAC,CAAC,cAAI,CAAC,iBAAiB,CAAC,IAAA,yBAAW,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;AAPtC,QAAA,IAAI,QAOkC;AAEnD;;GAEG;AACI,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE,CAC7C,cAAI,CAAC,iBAAiB,CAAC,IAAA,+BAAiB,EAAC,IAAI,CAAC,CAAC,CAAA;AADpC,QAAA,cAAc,kBACsB;AAEjD;;;;;;;;;;;;;GAaG;AACI,MAAM,EAAE,GAAG,CAAC,GAAyB,EAAE,GAAG,GAAuB,EAAE,EAAE,CAC1E,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;IAClC,CAAC,CAAC,uEAAuE;QACvE,IAAA,sBAAc,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,IAAA,sBAAc,EAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,gBAAQ,CAAC,CAAC,CAAC,CAAA;AAJvD,QAAA,EAAE,MAIqD;AAEpE;;;;GAIG;AACI,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAE,EAAE,CACzC,cAAI,CAAC,iBAAiB,CAAC,IAAA,yBAAW,EAAC,KAAK,CAAC,CAAC,CAAA;AAD/B,QAAA,QAAQ,YACuB;AAE5C;;GAEG;AACI,MAAM,GAAG,GAAG,CAAC,GAAyB,EAAE,GAAG,GAAsB,EAAE,EAAE,CAC1E,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;IAClC,CAAC,CAAC,0DAA0D;QAC1D,IAAA,eAAO,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,IAAA,eAAO,EAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,yBAAW,CAAC,CAAC,CAAC,CAAA;AAJnD,QAAA,GAAG,OAIgD;AAEhE;;GAEG;AACI,MAAM,OAAO,GAAG,CAAC,IAAa,EAAE,EAAE,CACvC,IAAI,CAAC,CAAC,CAAC,cAAI,CAAC,iBAAiB,CAAC,IAAA,wBAAU,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AADhD,QAAA,OAAO,WACyC","sourcesContent":["import {\n HtmlValue,\n cssEscaper,\n htmlEscaper,\n javascriptEscaper,\n jsonEscaper,\n} from './escapers.js'\nimport { Html } from './html.js'\n\nexport { type HtmlValue }\nexport const html = (\n tpl: TemplateStringsArray,\n ...val: readonly HtmlValue[]\n) =>\n tpl.length === 1 && val.length === 0\n ? // Optimization for static HTML, avoid creating an iterable\n Html.dangerouslyCreate(tpl)\n : Html.dangerouslyCreate(htmlEscaper(tpl, val))\n\n/**\n * Escapes code to use as a JavaScript string inside a `<script>` tag.\n */\nexport const javascriptCode = (code: string) =>\n Html.dangerouslyCreate(javascriptEscaper(code))\n\n/**\n * Creates an HTML safe JavaScript code block, with JSON serialization of the\n * injected variables.\n *\n * @example\n * ```js\n * const dataOnTheServer = { foo: 'bar' };\n * const clientScript = js`\n * const data = ${dataOnTheServer};\n * console.log(data);\n * `\n * console.log(clientScript.toString()); // Output: 'const data = {\"foo\":\"bar\"};console.log(data);'\n * ```\n */\nexport const js = (tpl: TemplateStringsArray, ...val: readonly unknown[]) =>\n tpl.length === 1 && val.length === 0\n ? // Optimization for static JavaScript, avoid un-necessary serialization\n javascriptCode(tpl[0])\n : javascriptCode(String.raw({ raw: tpl }, ...val.map(jsonCode)))\n\n/**\n * Escapes a value to be used as a JSON string inside a `<script>` tag.\n *\n * @see {@link https://redux.js.org/usage/server-rendering#security-considerations}\n */\nexport const jsonCode = (value: unknown) =>\n Html.dangerouslyCreate(jsonEscaper(value))\n\n/**\n * Creates an HTML safe CSS code block.\n */\nexport const css = (tpl: TemplateStringsArray, ...val: readonly number[]) =>\n tpl.length === 1 && val.length === 0\n ? // Optimization for static CSS, avoid creating an iterable\n cssCode(tpl[0])\n : cssCode(String.raw({ raw: tpl }, ...val.map(jsonEscaper)))\n\n/**\n * Escapes a value to be uses as CSS styles inside a `<style>` tag.\n */\nexport const cssCode = (code?: string) =>\n code ? Html.dangerouslyCreate(cssEscaper(code)) : undefined\n"]}
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../../src/lib/html/tags.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,WAAW,GACZ,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,GAAyB,EACzB,GAAG,GAAyB,EAC5B,EAAE,CACF,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;IAClC,CAAC,CAAC,2DAA2D;QAC3D,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;IAC7B,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;AAEnD;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE,CAC7C,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAA;AAEjD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAyB,EAAE,GAAG,GAAuB,EAAE,EAAE,CAC1E,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;IAClC,CAAC,CAAC,uEAAuE;QACvE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AAEpE;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAE,EAAE,CACzC,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,GAAyB,EAAE,GAAG,GAAsB,EAAE,EAAE,CAC1E,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;IAClC,CAAC,CAAC,0DAA0D;QAC1D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;AAEhE;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAa,EAAE,EAAE,CACvC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA","sourcesContent":["import {\n HtmlValue,\n cssEscaper,\n htmlEscaper,\n javascriptEscaper,\n jsonEscaper,\n} from './escapers.js'\nimport { Html } from './html.js'\n\nexport { type HtmlValue }\nexport const html = (\n tpl: TemplateStringsArray,\n ...val: readonly HtmlValue[]\n) =>\n tpl.length === 1 && val.length === 0\n ? // Optimization for static HTML, avoid creating an iterable\n Html.dangerouslyCreate(tpl)\n : Html.dangerouslyCreate(htmlEscaper(tpl, val))\n\n/**\n * Escapes code to use as a JavaScript string inside a `<script>` tag.\n */\nexport const javascriptCode = (code: string) =>\n Html.dangerouslyCreate(javascriptEscaper(code))\n\n/**\n * Creates an HTML safe JavaScript code block, with JSON serialization of the\n * injected variables.\n *\n * @example\n * ```js\n * const dataOnTheServer = { foo: 'bar' };\n * const clientScript = js`\n * const data = ${dataOnTheServer};\n * console.log(data);\n * `\n * console.log(clientScript.toString()); // Output: 'const data = {\"foo\":\"bar\"};console.log(data);'\n * ```\n */\nexport const js = (tpl: TemplateStringsArray, ...val: readonly unknown[]) =>\n tpl.length === 1 && val.length === 0\n ? // Optimization for static JavaScript, avoid un-necessary serialization\n javascriptCode(tpl[0])\n : javascriptCode(String.raw({ raw: tpl }, ...val.map(jsonCode)))\n\n/**\n * Escapes a value to be used as a JSON string inside a `<script>` tag.\n *\n * @see {@link https://redux.js.org/usage/server-rendering#security-considerations}\n */\nexport const jsonCode = (value: unknown) =>\n Html.dangerouslyCreate(jsonEscaper(value))\n\n/**\n * Creates an HTML safe CSS code block.\n */\nexport const css = (tpl: TemplateStringsArray, ...val: readonly number[]) =>\n tpl.length === 1 && val.length === 0\n ? // Optimization for static CSS, avoid creating an iterable\n cssCode(tpl[0])\n : cssCode(String.raw({ raw: tpl }, ...val.map(jsonEscaper)))\n\n/**\n * Escapes a value to be uses as CSS styles inside a `<style>` tag.\n */\nexport const cssCode = (code?: string) =>\n code ? Html.dangerouslyCreate(cssEscaper(code)) : undefined\n"]}
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.stringReplacer = stringReplacer;
4
- function* stringReplacer(source, searchValue, replaceValue) {
1
+ export function* stringReplacer(source, searchValue, replaceValue) {
5
2
  let previousIndex = 0;
6
3
  let index = source.indexOf(searchValue);
7
4
  while (index !== -1) {
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/lib/html/util.ts"],"names":[],"mappings":";;AAEA,wCAcC;AAdD,QAAe,CAAC,CAAC,cAAc,CAC7B,MAAc,EACd,WAAmB,EACnB,YAAoB;IAEpB,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACvC,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;QACxC,MAAM,YAAY,CAAA;QAClB,aAAa,GAAG,KAAK,GAAG,WAAW,CAAC,MAAM,CAAA;QAC1C,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA;IACpD,CAAC;IACD,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;AACnC,CAAC","sourcesContent":["export type NestedIterable<V> = V | Iterable<NestedIterable<V>>\n\nexport function* stringReplacer(\n source: string,\n searchValue: string,\n replaceValue: string,\n): Generator<string, void, undefined> {\n let previousIndex = 0\n let index = source.indexOf(searchValue)\n while (index !== -1) {\n yield source.slice(previousIndex, index)\n yield replaceValue\n previousIndex = index + searchValue.length\n index = source.indexOf(searchValue, previousIndex)\n }\n yield source.slice(previousIndex)\n}\n"]}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/lib/html/util.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,CAAC,CAAC,cAAc,CAC7B,MAAc,EACd,WAAmB,EACnB,YAAoB;IAEpB,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACvC,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;QACxC,MAAM,YAAY,CAAA;QAClB,aAAa,GAAG,KAAK,GAAG,WAAW,CAAC,MAAM,CAAA;QAC1C,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA;IACpD,CAAC;IACD,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;AACnC,CAAC","sourcesContent":["export type NestedIterable<V> = V | Iterable<NestedIterable<V>>\n\nexport function* stringReplacer(\n source: string,\n searchValue: string,\n replaceValue: string,\n): Generator<string, void, undefined> {\n let previousIndex = 0\n let index = source.indexOf(searchValue)\n while (index !== -1) {\n yield source.slice(previousIndex, index)\n yield replaceValue\n previousIndex = index + searchValue.length\n index = source.indexOf(searchValue, previousIndex)\n }\n yield source.slice(previousIndex)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"accept.d.ts","sourceRoot":"","sources":["../../../src/lib/http/accept.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAEhE,OAAO,EAAE,MAAM,EAAU,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAErD,KAAK,IAAI,CACP,CAAC,SAAS,MAAM,GAAG,IAAI,EACvB,CAAC,EACD,GAAG,SAAS,eAAe,GAAG,eAAe,EAC7C,GAAG,SAAS,cAAc,GAAG,cAAc,IACzC,CACF,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,EAC5B,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,YAAY,KACf,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;AAE7B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EACD,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,IAAI,EAC9B,GAAG,SAAS,eAAe,GAAG,eAAe,EAC7C,GAAG,SAAS,cAAc,GAAG,cAAc,EAE3C,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAC/D,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EACpD,QAAQ,GAAE,UAAU,CAAC,CAAC,CAAsD,GAC3E,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAuCpE"}
1
+ {"version":3,"file":"accept.d.ts","sourceRoot":"","sources":["../../../src/lib/http/accept.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAKhE,OAAO,EAAE,MAAM,EAAU,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAErD,KAAK,IAAI,CACP,CAAC,SAAS,MAAM,GAAG,IAAI,EACvB,CAAC,EACD,GAAG,SAAS,eAAe,GAAG,eAAe,EAC7C,GAAG,SAAS,cAAc,GAAG,cAAc,IACzC,CACF,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,EAC5B,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,YAAY,KACf,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;AAE7B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EACD,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,IAAI,EAC9B,GAAG,SAAS,eAAe,GAAG,eAAe,EAC7C,GAAG,SAAS,cAAc,GAAG,cAAc,EAE3C,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAC/D,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EACpD,QAAQ,GAAE,UAAU,CAAC,CAAC,CAAsD,GAC3E,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAuCpE"}
@@ -1,8 +1,8 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.acceptMiddleware = acceptMiddleware;
4
- const accept_1 = require("@hapi/accept");
5
- const context_js_1 = require("./context.js");
1
+ // eslint-disable-next-line import/default, import/no-named-as-default-member
2
+ import accept from '@hapi/accept';
3
+ // eslint-disable-next-line import/no-named-as-default-member
4
+ const { mediaType } = accept;
5
+ import { subCtx } from './context.js';
6
6
  /**
7
7
  * @example
8
8
  * ```ts
@@ -24,7 +24,7 @@ const context_js_1 = require("./context.js");
24
24
  * )
25
25
  * ```
26
26
  */
27
- function acceptMiddleware(controller, views, fallback = (req, res, _next) => void res.writeHead(406).end()) {
27
+ export function acceptMiddleware(controller, views, fallback = (req, res, _next) => void res.writeHead(406).end()) {
28
28
  const viewsMap = new Map(Object.entries(views));
29
29
  const preferences = Array.from(viewsMap.keys()).filter(Boolean);
30
30
  // Make sure that every view is either a function or a string that points to a
@@ -38,7 +38,7 @@ function acceptMiddleware(controller, views, fallback = (req, res, _next) => voi
38
38
  return async function (req, res, next) {
39
39
  try {
40
40
  const type = req.headers['accept']
41
- ? (0, accept_1.mediaType)(req.headers['accept'], preferences) || undefined
41
+ ? mediaType(req.headers['accept'], preferences) || undefined
42
42
  : ''; // indicate that the client accepts anything
43
43
  let view = type != null ? viewsMap.get(type) : undefined;
44
44
  if (typeof view === 'string')
@@ -47,7 +47,7 @@ function acceptMiddleware(controller, views, fallback = (req, res, _next) => voi
47
47
  throw new Error('Invalid view'); // should not happen
48
48
  if (view) {
49
49
  const data = await controller.call(this, req, res);
50
- const ctx = (0, context_js_1.subCtx)(this, { data });
50
+ const ctx = subCtx(this, { data });
51
51
  if (type)
52
52
  res.setHeader('Content-Type', type);
53
53
  await view.call(ctx, req, res, next);
@@ -1 +1 @@
1
- {"version":3,"file":"accept.js","sourceRoot":"","sources":["../../../src/lib/http/accept.ts"],"names":[],"mappings":";;AAsCA,4CAgDC;AArFD,yCAAwC;AACxC,6CAA6C;AAe7C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAgB,gBAAgB,CAM9B,UAA+D,EAC/D,KAAoD,EACpD,WAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;IAE5E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAE/D,8EAA8E;IAC9E,YAAY;IACZ,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,qBAAqB,IAAI,GAAG,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IAED,OAAO,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAChC,CAAC,CAAC,IAAA,kBAAS,EAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,IAAI,SAAS;gBAC5D,CAAC,CAAC,EAAE,CAAA,CAAC,4CAA4C;YAEnD,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAExD,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACvD,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAA,CAAC,oBAAoB;YAElF,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;gBAClD,MAAM,GAAG,GAAG,IAAA,mBAAM,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;gBAClC,IAAI,IAAI;oBAAE,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;gBAE7C,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YACtC,CAAC;iBAAM,CAAC;gBACN,2BAA2B;gBAC3B,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAC3C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,WAAW;gBAAE,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;YACtD,IAAI,CAAC,GAAG,CAAC,CAAA;QACX,CAAC;IACH,CAAC,CAAA;AACH,CAAC","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { mediaType } from '@hapi/accept'\nimport { SubCtx, subCtx } from './context.js'\nimport { Middleware, NextFunction } from './types.js'\n\ntype View<\n T extends object | void,\n D,\n Req extends IncomingMessage = IncomingMessage,\n Res extends ServerResponse = ServerResponse,\n> = (\n this: SubCtx<T, { data: D }>,\n req: Req,\n res: Res,\n next: NextFunction,\n) => void | PromiseLike<void>\n\n/**\n * @example\n * ```ts\n * app.use(\n * acceptMiddleware(\n * async function (req, res) {\n * return { hello: 'world' }\n * },\n * {\n * '': 'application/json', // Fallback to JSON\n * 'text/plain': function (req, res) {\n * res.writeHead(200).end(this.data.hello)\n * },\n * 'application/json': function (req, res) {\n * res.writeHead(200).end(JSON.stringify(this.data))\n * }\n * }\n * )\n * )\n * ```\n */\nexport function acceptMiddleware<\n D,\n T extends object | void = void,\n Req extends IncomingMessage = IncomingMessage,\n Res extends ServerResponse = ServerResponse,\n>(\n controller: (this: T, req: Req, res: Res) => D | PromiseLike<D>,\n views: Record<string, string | View<T, D, Req, Res>>,\n fallback: Middleware<T> = (req, res, _next) => void res.writeHead(406).end(),\n): (this: T, req: Req, res: Res, next: NextFunction) => Promise<void> {\n const viewsMap = new Map(Object.entries(views))\n const preferences = Array.from(viewsMap.keys()).filter(Boolean)\n\n // Make sure that every view is either a function or a string that points to a\n // function.\n for (const type of viewsMap.keys()) {\n const view = viewsMap.get(type)\n if (typeof view === 'string' && typeof viewsMap.get(view) !== 'function') {\n throw new Error(`Invalid view \"${view}\" for media type \"${type}\"`)\n }\n }\n\n return async function (req, res, next) {\n try {\n const type = req.headers['accept']\n ? mediaType(req.headers['accept'], preferences) || undefined\n : '' // indicate that the client accepts anything\n\n let view = type != null ? viewsMap.get(type) : undefined\n\n if (typeof view === 'string') view = viewsMap.get(view)\n if (typeof view === 'string') throw new Error('Invalid view') // should not happen\n\n if (view) {\n const data = await controller.call(this, req, res)\n const ctx = subCtx(this, { data })\n if (type) res.setHeader('Content-Type', type)\n\n await view.call(ctx, req, res, next)\n } else {\n // media negotiation failed\n await fallback.call(this, req, res, next)\n }\n } catch (err) {\n if (!res.headersSent) res.removeHeader('Content-Type')\n next(err)\n }\n }\n}\n"]}
1
+ {"version":3,"file":"accept.js","sourceRoot":"","sources":["../../../src/lib/http/accept.ts"],"names":[],"mappings":"AACA,6EAA6E;AAC7E,OAAO,MAAM,MAAM,cAAc,CAAA;AACjC,6DAA6D;AAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;AAC5B,OAAO,EAAU,MAAM,EAAE,MAAM,cAAc,CAAA;AAe7C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,gBAAgB,CAM9B,UAA+D,EAC/D,KAAoD,EACpD,WAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;IAE5E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAE/D,8EAA8E;IAC9E,YAAY;IACZ,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,qBAAqB,IAAI,GAAG,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IAED,OAAO,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAChC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,IAAI,SAAS;gBAC5D,CAAC,CAAC,EAAE,CAAA,CAAC,4CAA4C;YAEnD,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAExD,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACvD,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAA,CAAC,oBAAoB;YAElF,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;gBAClD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;gBAClC,IAAI,IAAI;oBAAE,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;gBAE7C,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YACtC,CAAC;iBAAM,CAAC;gBACN,2BAA2B;gBAC3B,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAC3C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,WAAW;gBAAE,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;YACtD,IAAI,CAAC,GAAG,CAAC,CAAA;QACX,CAAC;IACH,CAAC,CAAA;AACH,CAAC","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http'\n// eslint-disable-next-line import/default, import/no-named-as-default-member\nimport accept from '@hapi/accept'\n// eslint-disable-next-line import/no-named-as-default-member\nconst { mediaType } = accept\nimport { SubCtx, subCtx } from './context.js'\nimport { Middleware, NextFunction } from './types.js'\n\ntype View<\n T extends object | void,\n D,\n Req extends IncomingMessage = IncomingMessage,\n Res extends ServerResponse = ServerResponse,\n> = (\n this: SubCtx<T, { data: D }>,\n req: Req,\n res: Res,\n next: NextFunction,\n) => void | PromiseLike<void>\n\n/**\n * @example\n * ```ts\n * app.use(\n * acceptMiddleware(\n * async function (req, res) {\n * return { hello: 'world' }\n * },\n * {\n * '': 'application/json', // Fallback to JSON\n * 'text/plain': function (req, res) {\n * res.writeHead(200).end(this.data.hello)\n * },\n * 'application/json': function (req, res) {\n * res.writeHead(200).end(JSON.stringify(this.data))\n * }\n * }\n * )\n * )\n * ```\n */\nexport function acceptMiddleware<\n D,\n T extends object | void = void,\n Req extends IncomingMessage = IncomingMessage,\n Res extends ServerResponse = ServerResponse,\n>(\n controller: (this: T, req: Req, res: Res) => D | PromiseLike<D>,\n views: Record<string, string | View<T, D, Req, Res>>,\n fallback: Middleware<T> = (req, res, _next) => void res.writeHead(406).end(),\n): (this: T, req: Req, res: Res, next: NextFunction) => Promise<void> {\n const viewsMap = new Map(Object.entries(views))\n const preferences = Array.from(viewsMap.keys()).filter(Boolean)\n\n // Make sure that every view is either a function or a string that points to a\n // function.\n for (const type of viewsMap.keys()) {\n const view = viewsMap.get(type)\n if (typeof view === 'string' && typeof viewsMap.get(view) !== 'function') {\n throw new Error(`Invalid view \"${view}\" for media type \"${type}\"`)\n }\n }\n\n return async function (req, res, next) {\n try {\n const type = req.headers['accept']\n ? mediaType(req.headers['accept'], preferences) || undefined\n : '' // indicate that the client accepts anything\n\n let view = type != null ? viewsMap.get(type) : undefined\n\n if (typeof view === 'string') view = viewsMap.get(view)\n if (typeof view === 'string') throw new Error('Invalid view') // should not happen\n\n if (view) {\n const data = await controller.call(this, req, res)\n const ctx = subCtx(this, { data })\n if (type) res.setHeader('Content-Type', type)\n\n await view.call(ctx, req, res, next)\n } else {\n // media negotiation failed\n await fallback.call(this, req, res, next)\n }\n } catch (err) {\n if (!res.headersSent) res.removeHeader('Content-Type')\n next(err)\n }\n }\n}\n"]}
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.subCtx = subCtx;
4
- function subCtx(parent, child) {
1
+ export function subCtx(parent, child) {
5
2
  const proto = typeof parent === 'object' ? parent : null;
6
3
  const entries = Object.entries(child);
7
4
  // Optimization for small objects
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/lib/http/context.ts"],"names":[],"mappings":";;AAGA,wBA4BC;AA5BD,SAAgB,MAAM,CACpB,MAAc,EACd,KAAY;IAEZ,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAErC,iCAAiC;IACjC,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC;YACJ,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC7B,KAAK,CAAC,CAAC,CAAC,CAAC;YACP,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACrB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC1B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAChC,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,CAAC,CAAC,CAAC,CAAC;YACP,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACrB,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACrB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC1B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAChC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;AAChF,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAwB;IAExB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9C,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;AACrD,CAAC","sourcesContent":["export type SubCtx<Parent extends object | void, Child extends object> = Child &\n Omit<Parent, keyof Child>\n\nexport function subCtx<Parent extends object | void, Child extends object>(\n parent: Parent,\n child: Child,\n): SubCtx<Parent, Child> {\n const proto = typeof parent === 'object' ? parent : null\n const entries = Object.entries(child)\n\n // Optimization for small objects\n switch (entries.length) {\n case 0:\n return Object.create(proto)\n case 1: {\n const e0 = entries[0]\n return Object.create(proto, {\n [e0[0]]: valueDescriptor(e0[1]),\n })\n }\n case 2: {\n const e0 = entries[0]\n const e1 = entries[1]\n return Object.create(proto, {\n [e0[0]]: valueDescriptor(e0[1]),\n [e1[0]]: valueDescriptor(e1[1]),\n })\n }\n }\n\n return Object.create(proto, Object.fromEntries(entries.map(entryToEntryDesc)))\n}\n\nfunction entryToEntryDesc(\n entry: [string, unknown],\n): [string, PropertyDescriptor] {\n return [entry[0], valueDescriptor(entry[1])]\n}\n\nfunction valueDescriptor(value: unknown): PropertyDescriptor {\n return { value, enumerable: true, writable: false }\n}\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/lib/http/context.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,MAAM,CACpB,MAAc,EACd,KAAY;IAEZ,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAErC,iCAAiC;IACjC,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC;YACJ,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC7B,KAAK,CAAC,CAAC,CAAC,CAAC;YACP,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACrB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC1B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAChC,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,CAAC,CAAC,CAAC,CAAC;YACP,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACrB,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACrB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC1B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAChC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;AAChF,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAwB;IAExB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9C,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;AACrD,CAAC","sourcesContent":["export type SubCtx<Parent extends object | void, Child extends object> = Child &\n Omit<Parent, keyof Child>\n\nexport function subCtx<Parent extends object | void, Child extends object>(\n parent: Parent,\n child: Child,\n): SubCtx<Parent, Child> {\n const proto = typeof parent === 'object' ? parent : null\n const entries = Object.entries(child)\n\n // Optimization for small objects\n switch (entries.length) {\n case 0:\n return Object.create(proto)\n case 1: {\n const e0 = entries[0]\n return Object.create(proto, {\n [e0[0]]: valueDescriptor(e0[1]),\n })\n }\n case 2: {\n const e0 = entries[0]\n const e1 = entries[1]\n return Object.create(proto, {\n [e0[0]]: valueDescriptor(e0[1]),\n [e1[0]]: valueDescriptor(e1[1]),\n })\n }\n }\n\n return Object.create(proto, Object.fromEntries(entries.map(entryToEntryDesc)))\n}\n\nfunction entryToEntryDesc(\n entry: [string, unknown],\n): [string, PropertyDescriptor] {\n return [entry[0], valueDescriptor(entry[1])]\n}\n\nfunction valueDescriptor(value: unknown): PropertyDescriptor {\n return { value, enumerable: true, writable: false }\n}\n"]}
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.appendHeader = appendHeader;
4
- function appendHeader(res, header, value) {
1
+ export function appendHeader(res, header, value) {
5
2
  const existing = res.getHeader(header);
6
3
  if (existing == null) {
7
4
  res.setHeader(header, value);
@@ -1 +1 @@
1
- {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../../src/lib/http/headers.ts"],"names":[],"mappings":";;AAEA,oCAYC;AAZD,SAAgB,YAAY,CAC1B,GAAmB,EACnB,MAAc,EACd,KAAiC;IAEjC,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACtC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QACnE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC","sourcesContent":["import type { ServerResponse } from 'node:http'\n\nexport function appendHeader(\n res: ServerResponse,\n header: string,\n value: string | readonly string[],\n): void {\n const existing = res.getHeader(header)\n if (existing == null) {\n res.setHeader(header, value)\n } else {\n const arr = Array.isArray(existing) ? existing : [String(existing)]\n res.setHeader(header, arr.concat(value))\n }\n}\n"]}
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../../src/lib/http/headers.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAC1B,GAAmB,EACnB,MAAc,EACd,KAAiC;IAEjC,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACtC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QACnE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC","sourcesContent":["import type { ServerResponse } from 'node:http'\n\nexport function appendHeader(\n res: ServerResponse,\n header: string,\n value: string | readonly string[],\n): void {\n const existing = res.getHeader(header)\n if (existing == null) {\n res.setHeader(header, value)\n } else {\n const arr = Array.isArray(existing) ? existing : [String(existing)]\n res.setHeader(header, arr.concat(value))\n }\n}\n"]}
@@ -1,27 +1,11 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./accept.js"), exports);
18
- __exportStar(require("./context.js"), exports);
19
- __exportStar(require("./headers.js"), exports);
20
- __exportStar(require("./middleware.js"), exports);
21
- __exportStar(require("./parser.js"), exports);
22
- __exportStar(require("./request.js"), exports);
23
- __exportStar(require("./response.js"), exports);
24
- __exportStar(require("./router.js"), exports);
25
- __exportStar(require("./stream.js"), exports);
26
- __exportStar(require("./types.js"), exports);
1
+ export * from './accept.js';
2
+ export * from './context.js';
3
+ export * from './headers.js';
4
+ export * from './middleware.js';
5
+ export * from './parser.js';
6
+ export * from './request.js';
7
+ export * from './response.js';
8
+ export * from './router.js';
9
+ export * from './stream.js';
10
+ export * from './types.js';
27
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/http/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,+CAA4B;AAC5B,+CAA4B;AAC5B,kDAA+B;AAC/B,8CAA2B;AAC3B,+CAA4B;AAC5B,gDAA6B;AAC7B,8CAA2B;AAC3B,8CAA2B;AAC3B,6CAA0B","sourcesContent":["export * from './accept.js'\nexport * from './context.js'\nexport * from './headers.js'\nexport * from './middleware.js'\nexport * from './parser.js'\nexport * from './request.js'\nexport * from './response.js'\nexport * from './router.js'\nexport * from './stream.js'\nexport * from './types.js'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/http/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA","sourcesContent":["export * from './accept.js'\nexport * from './context.js'\nexport * from './headers.js'\nexport * from './middleware.js'\nexport * from './parser.js'\nexport * from './request.js'\nexport * from './response.js'\nexport * from './router.js'\nexport * from './stream.js'\nexport * from './types.js'\n"]}
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createMethodMatcher = createMethodMatcher;
4
- function createMethodMatcher(method) {
1
+ export function createMethodMatcher(method) {
5
2
  if (method === '*')
6
3
  return () => true;
7
4
  if (typeof method === 'function')
@@ -1 +1 @@
1
- {"version":3,"file":"method.js","sourceRoot":"","sources":["../../../src/lib/http/method.ts"],"names":[],"mappings":";;AAKA,kDAYC;AAZD,SAAgB,mBAAmB,CAAC,MAA0B;IAC5D,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAA;IACrC,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,MAAM,CAAA;IAE/C,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;QAC7B,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAA;IACvC,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAC/D,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,EAAE,CAAC,KAAK,CAAA;IACtC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAC3D,CAAC","sourcesContent":["import type { IncomingMessage } from 'node:http'\n\nexport type MethodMatcherInput = string | Iterable<string> | MethodMatcher\nexport type MethodMatcher = (req: IncomingMessage) => boolean\n\nexport function createMethodMatcher(method: MethodMatcherInput): MethodMatcher {\n if (method === '*') return () => true\n if (typeof method === 'function') return method\n\n if (typeof method === 'string') {\n method = method.toUpperCase()\n return (req) => req.method === method\n }\n\n const set = new Set(Array.from(method, (m) => m.toUpperCase()))\n if (set.size === 0) return () => false\n return (req) => req.method != null && set.has(req.method)\n}\n"]}
1
+ {"version":3,"file":"method.js","sourceRoot":"","sources":["../../../src/lib/http/method.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,mBAAmB,CAAC,MAA0B;IAC5D,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAA;IACrC,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,MAAM,CAAA;IAE/C,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;QAC7B,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAA;IACvC,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAC/D,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,EAAE,CAAC,KAAK,CAAA;IACtC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAC3D,CAAC","sourcesContent":["import type { IncomingMessage } from 'node:http'\n\nexport type MethodMatcherInput = string | Iterable<string> | MethodMatcher\nexport type MethodMatcher = (req: IncomingMessage) => boolean\n\nexport function createMethodMatcher(method: MethodMatcherInput): MethodMatcher {\n if (method === '*') return () => true\n if (typeof method === 'function') return method\n\n if (typeof method === 'string') {\n method = method.toUpperCase()\n return (req) => req.method === method\n }\n\n const set = new Set(Array.from(method, (m) => m.toUpperCase()))\n if (set.size === 0) return () => false\n return (req) => req.method != null && set.has(req.method)\n}\n"]}
@@ -1,17 +1,11 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEV_MODE = void 0;
4
- exports.combineMiddlewares = combineMiddlewares;
5
- exports.asHandler = asHandler;
6
- exports.createFinalHandler = createFinalHandler;
7
- const function_js_1 = require("../util/function.js");
8
- const response_js_1 = require("./response.js");
1
+ import { invokeOnce } from '../util/function.js';
2
+ import { writeJson } from './response.js';
9
3
  const isNonNullable = (x) => x != null;
10
4
  /**
11
5
  * Combine express/connect like middlewares (that can be async) into a single
12
6
  * middleware.
13
7
  */
14
- function combineMiddlewares(middlewares, { skipKeyword } = {}) {
8
+ export function combineMiddlewares(middlewares, { skipKeyword } = {}) {
15
9
  const middlewaresArray = Array.from(middlewares).filter(isNonNullable);
16
10
  // Optimization: if there are no middlewares, return a noop middleware.
17
11
  if (middlewaresArray.length === 0)
@@ -32,7 +26,7 @@ function combineMiddlewares(middlewares, { skipKeyword } = {}) {
32
26
  }
33
27
  else {
34
28
  const currentMiddleware = middlewaresArray[i++];
35
- const currentNext = (0, function_js_1.invokeOnce)(nextMiddleware);
29
+ const currentNext = invokeOnce(nextMiddleware);
36
30
  currentMiddleware.call(this, req, res, currentNext);
37
31
  }
38
32
  };
@@ -43,15 +37,15 @@ function combineMiddlewares(middlewares, { skipKeyword } = {}) {
43
37
  * Convert a middleware in a function that can be used as both a middleware and
44
38
  * and handler.
45
39
  */
46
- function asHandler(middleware, options) {
47
- return function (req, res, next = (0, function_js_1.invokeOnce)(createFinalHandler(req, res, options))) {
40
+ export function asHandler(middleware, options) {
41
+ return function (req, res, next = invokeOnce(createFinalHandler(req, res, options))) {
48
42
  return middleware.call(this, req, res, next);
49
43
  };
50
44
  }
51
- exports.DEV_MODE = process.env['NODE_ENV'] === 'development';
52
- function createFinalHandler(req, res, options) {
45
+ export const DEV_MODE = process.env['NODE_ENV'] === 'development';
46
+ export function createFinalHandler(req, res, options) {
53
47
  return (err) => {
54
- if (err != null && (options?.debug ?? exports.DEV_MODE)) {
48
+ if (err != null && (options?.debug ?? DEV_MODE)) {
55
49
  console.error(err);
56
50
  }
57
51
  if (res.headersSent) {
@@ -64,7 +58,7 @@ function createFinalHandler(req, res, options) {
64
58
  const { status, ...payload } = buildFallbackPayload(req, err);
65
59
  res.setHeader('Content-Security-Policy', "default-src 'none'");
66
60
  res.setHeader('X-Content-Type-Options', 'nosniff');
67
- (0, response_js_1.writeJson)(res, payload, { status });
61
+ writeJson(res, payload, { status });
68
62
  };
69
63
  }
70
64
  function buildFallbackPayload(req, err) {
@@ -86,7 +80,7 @@ function buildFallbackPayload(req, err) {
86
80
  'Unknown error'
87
81
  : 'System error'
88
82
  : `Cannot ${req.method} ${req.url}`,
89
- stack: exports.DEV_MODE && err instanceof Error ? err.stack : undefined,
83
+ stack: DEV_MODE && err instanceof Error ? err.stack : undefined,
90
84
  };
91
85
  }
92
86
  function getErrorStatusCode(err) {
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/lib/http/middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { invokeOnce } from '../util/function.js'\nimport { writeJson } from './response.js'\nimport { Handler, Middleware, NextFunction } from './types.js'\n\nconst isNonNullable = <X>(x: X): x is NonNullable<X> => x != null\n\nexport function combineMiddlewares<M extends Middleware<any, any, any>>(\n middlewares: Iterable<null | undefined | M>,\n options?: { skipKeyword?: string },\n): M\n\n/**\n * Combine express/connect like middlewares (that can be async) into a single\n * middleware.\n */\nexport function combineMiddlewares(\n middlewares: Iterable<null | undefined | Middleware<unknown>>,\n { skipKeyword }: { skipKeyword?: string } = {},\n): Middleware<unknown> {\n const middlewaresArray = Array.from(middlewares).filter(isNonNullable)\n\n // Optimization: if there are no middlewares, return a noop middleware.\n if (middlewaresArray.length === 0) return (req, res, next) => void next()\n if (middlewaresArray.length === 1) return middlewaresArray[0]\n\n return function (req, res, next) {\n let i = 0\n const nextMiddleware = (err?: unknown) => {\n if (err) {\n if (skipKeyword && err === skipKeyword) next()\n else next(err)\n } else if (i >= middlewaresArray.length) {\n next()\n } else {\n const currentMiddleware = middlewaresArray[i++]!\n const currentNext = invokeOnce(nextMiddleware)\n currentMiddleware.call(this, req, res, currentNext)\n }\n }\n nextMiddleware()\n }\n}\n\nexport type AsHandler<M extends Middleware<any, any, any>> =\n M extends Middleware<infer T, infer Req, infer Res>\n ? Handler<T, Req, Res>\n : never\n\n/**\n * Convert a middleware in a function that can be used as both a middleware and\n * and handler.\n */\nexport function asHandler<M extends Middleware<any, any, any>>(\n middleware: M,\n options?: FinalHandlerOptions,\n) {\n return function (\n this,\n req,\n res,\n next = invokeOnce(createFinalHandler(req, res, options)),\n ) {\n return middleware.call(this, req, res, next)\n } as AsHandler<M>\n}\n\nexport const DEV_MODE = process.env['NODE_ENV'] === 'development'\n\nexport type FinalHandlerOptions = {\n debug?: boolean\n}\n\nexport function createFinalHandler(\n req: IncomingMessage,\n res: ServerResponse,\n options?: FinalHandlerOptions,\n): NextFunction {\n return (err) => {\n if (err != null && (options?.debug ?? DEV_MODE)) {\n console.error(err)\n }\n\n if (res.headersSent) {\n // If an error occurred, and headers were sent, we can't know that the\n // whole response body was sent. So we can't safely reuse the socket.\n if (err) req.socket.destroy()\n\n return\n }\n\n const { status, ...payload } = buildFallbackPayload(req, err)\n\n res.setHeader('Content-Security-Policy', \"default-src 'none'\")\n res.setHeader('X-Content-Type-Options', 'nosniff')\n\n writeJson(res, payload, { status })\n }\n}\n\nfunction buildFallbackPayload(\n req: IncomingMessage,\n err: unknown,\n): {\n status: number\n error: string\n error_description: string\n stack?: undefined | string\n} {\n const status = err ? getErrorStatusCode(err) : 404\n const expose = getProp(err, 'expose', 'boolean') ?? status < 500\n\n return {\n status,\n error: err\n ? expose\n ? getProp(err, 'code', 'string') ??\n getProp(err, 'error', 'string') ??\n 'unknown_error'\n : 'system_error'\n : 'not_found',\n error_description:\n err instanceof Error\n ? expose\n ? getProp(err, 'error_description', 'string') ||\n String(err.message) ||\n 'Unknown error'\n : 'System error'\n : `Cannot ${req.method} ${req.url}`,\n stack: DEV_MODE && err instanceof Error ? err.stack : undefined,\n }\n}\n\nfunction getErrorStatusCode(err: NonNullable<unknown>): number {\n const status =\n getProp(err, 'status', 'number') ?? getProp(err, 'statusCode', 'number')\n return status != null && status >= 400 && status < 600 ? status : 500\n}\n\n// eslint-disable-next-line\nfunction getProp(obj: unknown, key: string, t: 'function'): Function | undefined\nfunction getProp(obj: unknown, key: string, t: 'string'): string | undefined\nfunction getProp(obj: unknown, key: string, t: 'number'): number | undefined\nfunction getProp(obj: unknown, key: string, t: 'boolean'): boolean | undefined\nfunction getProp(obj: unknown, key: string, t: 'object'): object | undefined\nfunction getProp(obj: unknown, key: string, t: 'symbol'): symbol | undefined\nfunction getProp(obj: unknown, key: string, t: 'bigint'): bigint | undefined\nfunction getProp(obj: unknown, key: string, t: 'undefined'): undefined\nfunction getProp(\n obj: unknown,\n key: string,\n type:\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'function'\n | 'symbol'\n | 'bigint'\n | 'undefined',\n): unknown\n\nfunction getProp(obj: unknown, key: string, type: string): unknown {\n if (obj != null && typeof obj === 'object' && key in obj) {\n const value = (obj as Record<string, unknown>)[key]\n if (typeof value === type) return value\n }\n return undefined\n}\n"]}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/lib/http/middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { invokeOnce } from '../util/function.js'\nimport { writeJson } from './response.js'\nimport { Handler, Middleware, NextFunction } from './types.js'\n\nconst isNonNullable = <X>(x: X): x is NonNullable<X> => x != null\n\nexport function combineMiddlewares<M extends Middleware<any, any, any>>(\n middlewares: Iterable<null | undefined | M>,\n options?: { skipKeyword?: string },\n): M\n\n/**\n * Combine express/connect like middlewares (that can be async) into a single\n * middleware.\n */\nexport function combineMiddlewares(\n middlewares: Iterable<null | undefined | Middleware<unknown>>,\n { skipKeyword }: { skipKeyword?: string } = {},\n): Middleware<unknown> {\n const middlewaresArray = Array.from(middlewares).filter(isNonNullable)\n\n // Optimization: if there are no middlewares, return a noop middleware.\n if (middlewaresArray.length === 0) return (req, res, next) => void next()\n if (middlewaresArray.length === 1) return middlewaresArray[0]\n\n return function (req, res, next) {\n let i = 0\n const nextMiddleware = (err?: unknown) => {\n if (err) {\n if (skipKeyword && err === skipKeyword) next()\n else next(err)\n } else if (i >= middlewaresArray.length) {\n next()\n } else {\n const currentMiddleware = middlewaresArray[i++]!\n const currentNext = invokeOnce(nextMiddleware)\n currentMiddleware.call(this, req, res, currentNext)\n }\n }\n nextMiddleware()\n }\n}\n\nexport type AsHandler<M extends Middleware<any, any, any>> =\n M extends Middleware<infer T, infer Req, infer Res>\n ? Handler<T, Req, Res>\n : never\n\n/**\n * Convert a middleware in a function that can be used as both a middleware and\n * and handler.\n */\nexport function asHandler<M extends Middleware<any, any, any>>(\n middleware: M,\n options?: FinalHandlerOptions,\n) {\n return function (\n this,\n req,\n res,\n next = invokeOnce(createFinalHandler(req, res, options)),\n ) {\n return middleware.call(this, req, res, next)\n } as AsHandler<M>\n}\n\nexport const DEV_MODE = process.env['NODE_ENV'] === 'development'\n\nexport type FinalHandlerOptions = {\n debug?: boolean\n}\n\nexport function createFinalHandler(\n req: IncomingMessage,\n res: ServerResponse,\n options?: FinalHandlerOptions,\n): NextFunction {\n return (err) => {\n if (err != null && (options?.debug ?? DEV_MODE)) {\n console.error(err)\n }\n\n if (res.headersSent) {\n // If an error occurred, and headers were sent, we can't know that the\n // whole response body was sent. So we can't safely reuse the socket.\n if (err) req.socket.destroy()\n\n return\n }\n\n const { status, ...payload } = buildFallbackPayload(req, err)\n\n res.setHeader('Content-Security-Policy', \"default-src 'none'\")\n res.setHeader('X-Content-Type-Options', 'nosniff')\n\n writeJson(res, payload, { status })\n }\n}\n\nfunction buildFallbackPayload(\n req: IncomingMessage,\n err: unknown,\n): {\n status: number\n error: string\n error_description: string\n stack?: undefined | string\n} {\n const status = err ? getErrorStatusCode(err) : 404\n const expose = getProp(err, 'expose', 'boolean') ?? status < 500\n\n return {\n status,\n error: err\n ? expose\n ? getProp(err, 'code', 'string') ??\n getProp(err, 'error', 'string') ??\n 'unknown_error'\n : 'system_error'\n : 'not_found',\n error_description:\n err instanceof Error\n ? expose\n ? getProp(err, 'error_description', 'string') ||\n String(err.message) ||\n 'Unknown error'\n : 'System error'\n : `Cannot ${req.method} ${req.url}`,\n stack: DEV_MODE && err instanceof Error ? err.stack : undefined,\n }\n}\n\nfunction getErrorStatusCode(err: NonNullable<unknown>): number {\n const status =\n getProp(err, 'status', 'number') ?? getProp(err, 'statusCode', 'number')\n return status != null && status >= 400 && status < 600 ? status : 500\n}\n\n// eslint-disable-next-line\nfunction getProp(obj: unknown, key: string, t: 'function'): Function | undefined\nfunction getProp(obj: unknown, key: string, t: 'string'): string | undefined\nfunction getProp(obj: unknown, key: string, t: 'number'): number | undefined\nfunction getProp(obj: unknown, key: string, t: 'boolean'): boolean | undefined\nfunction getProp(obj: unknown, key: string, t: 'object'): object | undefined\nfunction getProp(obj: unknown, key: string, t: 'symbol'): symbol | undefined\nfunction getProp(obj: unknown, key: string, t: 'bigint'): bigint | undefined\nfunction getProp(obj: unknown, key: string, t: 'undefined'): undefined\nfunction getProp(\n obj: unknown,\n key: string,\n type:\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'function'\n | 'symbol'\n | 'bigint'\n | 'undefined',\n): unknown\n\nfunction getProp(obj: unknown, key: string, type: string): unknown {\n if (obj != null && typeof obj === 'object' && key in obj) {\n const value = (obj as Record<string, unknown>)[key]\n if (typeof value === type) return value\n }\n return undefined\n}\n"]}