@atproto/oauth-provider 0.19.8 → 0.20.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 (308) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/account/account-manager.d.ts +11 -11
  3. package/dist/account/account-manager.d.ts.map +1 -1
  4. package/dist/account/account-manager.js.map +1 -1
  5. package/dist/account/account-store.d.ts +5 -10
  6. package/dist/account/account-store.d.ts.map +1 -1
  7. package/dist/account/account-store.js +0 -5
  8. package/dist/account/account-store.js.map +1 -1
  9. package/dist/client/client-auth.d.ts +1 -1
  10. package/dist/client/client-auth.d.ts.map +1 -1
  11. package/dist/client/client-auth.js.map +1 -1
  12. package/dist/client/client-data.d.ts +2 -2
  13. package/dist/client/client-data.d.ts.map +1 -1
  14. package/dist/client/client-data.js.map +1 -1
  15. package/dist/client/client-id.d.ts +1 -1
  16. package/dist/client/client-id.d.ts.map +1 -1
  17. package/dist/client/client-id.js.map +1 -1
  18. package/dist/client/client-manager.d.ts +8 -8
  19. package/dist/client/client-manager.d.ts.map +1 -1
  20. package/dist/client/client-manager.js +1 -1
  21. package/dist/client/client-manager.js.map +1 -1
  22. package/dist/client/client-store.d.ts +4 -6
  23. package/dist/client/client-store.d.ts.map +1 -1
  24. package/dist/client/client-store.js +0 -3
  25. package/dist/client/client-store.js.map +1 -1
  26. package/dist/client/client-utils.d.ts +1 -1
  27. package/dist/client/client-utils.d.ts.map +1 -1
  28. package/dist/client/client-utils.js.map +1 -1
  29. package/dist/client/client.d.ts +6 -6
  30. package/dist/client/client.d.ts.map +1 -1
  31. package/dist/client/client.js +1 -1
  32. package/dist/client/client.js.map +1 -1
  33. package/dist/customization/branding.d.ts +1 -1
  34. package/dist/customization/branding.d.ts.map +1 -1
  35. package/dist/customization/branding.js.map +1 -1
  36. package/dist/customization/build-customization-css.d.ts +1 -1
  37. package/dist/customization/build-customization-css.d.ts.map +1 -1
  38. package/dist/customization/build-customization-css.js.map +1 -1
  39. package/dist/customization/customization.d.ts +1 -1
  40. package/dist/customization/customization.d.ts.map +1 -1
  41. package/dist/customization/customization.js.map +1 -1
  42. package/dist/device/device-data.d.ts +2 -0
  43. package/dist/device/device-data.d.ts.map +1 -1
  44. package/dist/device/device-data.js.map +1 -1
  45. package/dist/device/device-id.js +1 -1
  46. package/dist/device/device-id.js.map +1 -1
  47. package/dist/device/device-manager.d.ts +3 -3
  48. package/dist/device/device-manager.d.ts.map +1 -1
  49. package/dist/device/device-manager.js +1 -1
  50. package/dist/device/device-manager.js.map +1 -1
  51. package/dist/device/device-store.d.ts +5 -7
  52. package/dist/device/device-store.d.ts.map +1 -1
  53. package/dist/device/device-store.js +0 -4
  54. package/dist/device/device-store.js.map +1 -1
  55. package/dist/device/session-id.d.ts.map +1 -1
  56. package/dist/device/session-id.js +1 -1
  57. package/dist/device/session-id.js.map +1 -1
  58. package/dist/dpop/dpop-manager.d.ts +2 -2
  59. package/dist/dpop/dpop-manager.d.ts.map +1 -1
  60. package/dist/dpop/dpop-manager.js +1 -1
  61. package/dist/dpop/dpop-manager.js.map +1 -1
  62. package/dist/dpop/dpop-nonce.js +1 -1
  63. package/dist/dpop/dpop-nonce.js.map +1 -1
  64. package/dist/errors/access-denied-error.d.ts +1 -1
  65. package/dist/errors/access-denied-error.d.ts.map +1 -1
  66. package/dist/errors/access-denied-error.js.map +1 -1
  67. package/dist/errors/account-selection-required-error.d.ts +1 -1
  68. package/dist/errors/account-selection-required-error.d.ts.map +1 -1
  69. package/dist/errors/account-selection-required-error.js.map +1 -1
  70. package/dist/errors/authorization-error.d.ts +2 -2
  71. package/dist/errors/authorization-error.d.ts.map +1 -1
  72. package/dist/errors/authorization-error.js.map +1 -1
  73. package/dist/errors/consent-required-error.d.ts +1 -1
  74. package/dist/errors/consent-required-error.d.ts.map +1 -1
  75. package/dist/errors/consent-required-error.js.map +1 -1
  76. package/dist/errors/handle-unavailable-error.d.ts +1 -1
  77. package/dist/errors/handle-unavailable-error.d.ts.map +1 -1
  78. package/dist/errors/handle-unavailable-error.js.map +1 -1
  79. package/dist/errors/invalid-authorization-details-error.d.ts +1 -1
  80. package/dist/errors/invalid-authorization-details-error.d.ts.map +1 -1
  81. package/dist/errors/invalid-authorization-details-error.js.map +1 -1
  82. package/dist/errors/invalid-client-metadata-error.js +1 -1
  83. package/dist/errors/invalid-client-metadata-error.js.map +1 -1
  84. package/dist/errors/invalid-credentials-error.d.ts +1 -1
  85. package/dist/errors/invalid-credentials-error.d.ts.map +1 -1
  86. package/dist/errors/invalid-credentials-error.js.map +1 -1
  87. package/dist/errors/invalid-scope-error.d.ts +1 -1
  88. package/dist/errors/invalid-scope-error.d.ts.map +1 -1
  89. package/dist/errors/invalid-scope-error.js.map +1 -1
  90. package/dist/errors/login-required-error.d.ts +1 -1
  91. package/dist/errors/login-required-error.d.ts.map +1 -1
  92. package/dist/errors/login-required-error.js.map +1 -1
  93. package/dist/lexicon/lexicon-data.d.ts +1 -1
  94. package/dist/lexicon/lexicon-data.d.ts.map +1 -1
  95. package/dist/lexicon/lexicon-data.js.map +1 -1
  96. package/dist/lexicon/lexicon-getter.d.ts +3 -3
  97. package/dist/lexicon/lexicon-getter.d.ts.map +1 -1
  98. package/dist/lexicon/lexicon-getter.js +1 -1
  99. package/dist/lexicon/lexicon-getter.js.map +1 -1
  100. package/dist/lexicon/lexicon-manager.d.ts +4 -4
  101. package/dist/lexicon/lexicon-manager.d.ts.map +1 -1
  102. package/dist/lexicon/lexicon-manager.js.map +1 -1
  103. package/dist/lexicon/lexicon-store.d.ts +4 -3
  104. package/dist/lexicon/lexicon-store.d.ts.map +1 -1
  105. package/dist/lexicon/lexicon-store.js.map +1 -1
  106. package/dist/lib/csp/index.d.ts +1 -1
  107. package/dist/lib/csp/index.d.ts.map +1 -1
  108. package/dist/lib/csp/index.js.map +1 -1
  109. package/dist/lib/hcaptcha.d.ts +1 -1
  110. package/dist/lib/hcaptcha.d.ts.map +1 -1
  111. package/dist/lib/hcaptcha.js +1 -1
  112. package/dist/lib/hcaptcha.js.map +1 -1
  113. package/dist/lib/html/build-document.d.ts +1 -1
  114. package/dist/lib/html/build-document.d.ts.map +1 -1
  115. package/dist/lib/html/build-document.js.map +1 -1
  116. package/dist/lib/html/escapers.d.ts +1 -1
  117. package/dist/lib/html/escapers.d.ts.map +1 -1
  118. package/dist/lib/html/escapers.js.map +1 -1
  119. package/dist/lib/html/tags.d.ts +1 -1
  120. package/dist/lib/html/tags.d.ts.map +1 -1
  121. package/dist/lib/html/tags.js +1 -0
  122. package/dist/lib/html/tags.js.map +1 -1
  123. package/dist/lib/http/accept.d.ts +2 -2
  124. package/dist/lib/http/accept.d.ts.map +1 -1
  125. package/dist/lib/http/accept.js.map +1 -1
  126. package/dist/lib/http/middleware.d.ts +1 -1
  127. package/dist/lib/http/middleware.d.ts.map +1 -1
  128. package/dist/lib/http/middleware.js.map +1 -1
  129. package/dist/lib/http/request.d.ts +2 -2
  130. package/dist/lib/http/request.d.ts.map +1 -1
  131. package/dist/lib/http/request.js.map +1 -1
  132. package/dist/lib/http/response.d.ts +1 -1
  133. package/dist/lib/http/response.d.ts.map +1 -1
  134. package/dist/lib/http/response.js.map +1 -1
  135. package/dist/lib/http/route.d.ts +4 -4
  136. package/dist/lib/http/route.d.ts.map +1 -1
  137. package/dist/lib/http/route.js.map +1 -1
  138. package/dist/lib/http/router.d.ts +5 -5
  139. package/dist/lib/http/router.d.ts.map +1 -1
  140. package/dist/lib/http/router.js.map +1 -1
  141. package/dist/lib/http/stream.d.ts +2 -2
  142. package/dist/lib/http/stream.d.ts.map +1 -1
  143. package/dist/lib/http/stream.js.map +1 -1
  144. package/dist/lib/util/time.d.ts +1 -1
  145. package/dist/lib/util/time.d.ts.map +1 -1
  146. package/dist/lib/util/time.js.map +1 -1
  147. package/dist/lib/util/zod-error.d.ts +1 -1
  148. package/dist/lib/util/zod-error.d.ts.map +1 -1
  149. package/dist/lib/util/zod-error.js.map +1 -1
  150. package/dist/lib/write-form-redirect.d.ts +1 -1
  151. package/dist/lib/write-form-redirect.d.ts.map +1 -1
  152. package/dist/lib/write-form-redirect.js.map +1 -1
  153. package/dist/lib/write-html.d.ts +3 -3
  154. package/dist/lib/write-html.d.ts.map +1 -1
  155. package/dist/lib/write-html.js.map +1 -1
  156. package/dist/metadata/build-metadata.d.ts +2 -2
  157. package/dist/metadata/build-metadata.d.ts.map +1 -1
  158. package/dist/metadata/build-metadata.js.map +1 -1
  159. package/dist/{constants.d.ts → oauth-constants.d.ts} +1 -1
  160. package/dist/oauth-constants.d.ts.map +1 -0
  161. package/dist/{constants.js → oauth-constants.js} +1 -1
  162. package/dist/oauth-constants.js.map +1 -0
  163. package/dist/oauth-errors.d.ts +2 -3
  164. package/dist/oauth-errors.d.ts.map +1 -1
  165. package/dist/oauth-errors.js +4 -4
  166. package/dist/oauth-errors.js.map +1 -1
  167. package/dist/oauth-hooks.d.ts +20 -24
  168. package/dist/oauth-hooks.d.ts.map +1 -1
  169. package/dist/oauth-hooks.js +1 -8
  170. package/dist/oauth-hooks.js.map +1 -1
  171. package/dist/oauth-middleware.d.ts +4 -4
  172. package/dist/oauth-middleware.d.ts.map +1 -1
  173. package/dist/oauth-middleware.js.map +1 -1
  174. package/dist/oauth-provider.d.ts +46 -37
  175. package/dist/oauth-provider.d.ts.map +1 -1
  176. package/dist/oauth-provider.js +17 -8
  177. package/dist/oauth-provider.js.map +1 -1
  178. package/dist/oauth-store.d.ts +0 -4
  179. package/dist/oauth-store.d.ts.map +1 -1
  180. package/dist/oauth-store.js +0 -4
  181. package/dist/oauth-store.js.map +1 -1
  182. package/dist/oauth-utils.d.ts +14 -0
  183. package/dist/oauth-utils.d.ts.map +1 -0
  184. package/dist/oauth-utils.js +5 -0
  185. package/dist/oauth-utils.js.map +1 -0
  186. package/dist/oauth-verifier.d.ts +6 -6
  187. package/dist/oauth-verifier.d.ts.map +1 -1
  188. package/dist/oauth-verifier.js.map +1 -1
  189. package/dist/replay/replay-manager.d.ts +2 -2
  190. package/dist/replay/replay-manager.d.ts.map +1 -1
  191. package/dist/replay/replay-manager.js +1 -1
  192. package/dist/replay/replay-manager.js.map +1 -1
  193. package/dist/replay/replay-store-redis.d.ts +1 -1
  194. package/dist/replay/replay-store-redis.d.ts.map +1 -1
  195. package/dist/replay/replay-store-redis.js.map +1 -1
  196. package/dist/replay/replay-store.d.ts +1 -1
  197. package/dist/replay/replay-store.d.ts.map +1 -1
  198. package/dist/replay/replay-store.js.map +1 -1
  199. package/dist/request/code.js +1 -1
  200. package/dist/request/code.js.map +1 -1
  201. package/dist/request/request-data.d.ts +7 -7
  202. package/dist/request/request-data.d.ts.map +1 -1
  203. package/dist/request/request-data.js.map +1 -1
  204. package/dist/request/request-id.d.ts.map +1 -1
  205. package/dist/request/request-id.js +1 -1
  206. package/dist/request/request-id.js.map +1 -1
  207. package/dist/request/request-manager.d.ts +13 -13
  208. package/dist/request/request-manager.d.ts.map +1 -1
  209. package/dist/request/request-manager.js +1 -1
  210. package/dist/request/request-manager.js.map +1 -1
  211. package/dist/request/request-store.d.ts +6 -8
  212. package/dist/request/request-store.d.ts.map +1 -1
  213. package/dist/request/request-store.js +0 -4
  214. package/dist/request/request-store.js.map +1 -1
  215. package/dist/request/request-uri.d.ts +1 -1
  216. package/dist/request/request-uri.d.ts.map +1 -1
  217. package/dist/request/request-uri.js.map +1 -1
  218. package/dist/result/authorization-redirect-parameters.d.ts +2 -2
  219. package/dist/result/authorization-redirect-parameters.d.ts.map +1 -1
  220. package/dist/result/authorization-redirect-parameters.js.map +1 -1
  221. package/dist/result/authorization-result-redirect.d.ts +2 -2
  222. package/dist/result/authorization-result-redirect.d.ts.map +1 -1
  223. package/dist/result/authorization-result-redirect.js.map +1 -1
  224. package/dist/router/assets/assets-manifest.d.ts +2 -2
  225. package/dist/router/assets/assets-manifest.d.ts.map +1 -1
  226. package/dist/router/assets/assets-manifest.js.map +1 -1
  227. package/dist/router/assets/assets.d.ts +4 -4
  228. package/dist/router/assets/assets.d.ts.map +1 -1
  229. package/dist/router/assets/assets.js.map +1 -1
  230. package/dist/router/assets/csrf.js.map +1 -1
  231. package/dist/router/assets/send-account-page.d.ts +2 -2
  232. package/dist/router/assets/send-account-page.d.ts.map +1 -1
  233. package/dist/router/assets/send-account-page.js.map +1 -1
  234. package/dist/router/assets/send-authorization-page.d.ts +3 -3
  235. package/dist/router/assets/send-authorization-page.d.ts.map +1 -1
  236. package/dist/router/assets/send-authorization-page.js.map +1 -1
  237. package/dist/router/assets/send-cookie-error-page.d.ts +2 -2
  238. package/dist/router/assets/send-cookie-error-page.d.ts.map +1 -1
  239. package/dist/router/assets/send-cookie-error-page.js.map +1 -1
  240. package/dist/router/assets/send-error-page.d.ts +2 -2
  241. package/dist/router/assets/send-error-page.d.ts.map +1 -1
  242. package/dist/router/assets/send-error-page.js.map +1 -1
  243. package/dist/router/assets/send-redirect.d.ts +4 -4
  244. package/dist/router/assets/send-redirect.d.ts.map +1 -1
  245. package/dist/router/assets/send-redirect.js.map +1 -1
  246. package/dist/router/create-account-page-middleware.d.ts +1 -1
  247. package/dist/router/create-account-page-middleware.d.ts.map +1 -1
  248. package/dist/router/create-account-page-middleware.js.map +1 -1
  249. package/dist/router/create-api-middleware.d.ts +2 -2
  250. package/dist/router/create-api-middleware.d.ts.map +1 -1
  251. package/dist/router/create-api-middleware.js +1 -1
  252. package/dist/router/create-api-middleware.js.map +1 -1
  253. package/dist/router/create-authorization-page-middleware.d.ts +1 -1
  254. package/dist/router/create-authorization-page-middleware.d.ts.map +1 -1
  255. package/dist/router/create-authorization-page-middleware.js.map +1 -1
  256. package/dist/router/create-oauth-middleware.d.ts +1 -1
  257. package/dist/router/create-oauth-middleware.d.ts.map +1 -1
  258. package/dist/router/create-oauth-middleware.js +1 -1
  259. package/dist/router/create-oauth-middleware.js.map +1 -1
  260. package/dist/signer/api-token-payload.d.ts +1 -1
  261. package/dist/signer/api-token-payload.d.ts.map +1 -1
  262. package/dist/signer/api-token-payload.js +1 -1
  263. package/dist/signer/api-token-payload.js.map +1 -1
  264. package/dist/signer/signer.d.ts +4 -4
  265. package/dist/signer/signer.d.ts.map +1 -1
  266. package/dist/signer/signer.js +2 -2
  267. package/dist/signer/signer.js.map +1 -1
  268. package/dist/token/refresh-token.js +1 -1
  269. package/dist/token/refresh-token.js.map +1 -1
  270. package/dist/token/token-claims.d.ts +4 -4
  271. package/dist/token/token-claims.d.ts.map +1 -1
  272. package/dist/token/token-claims.js.map +1 -1
  273. package/dist/token/token-data.d.ts +7 -7
  274. package/dist/token/token-data.d.ts.map +1 -1
  275. package/dist/token/token-data.js.map +1 -1
  276. package/dist/token/token-id.js +1 -1
  277. package/dist/token/token-id.js.map +1 -1
  278. package/dist/token/token-manager.d.ts +14 -14
  279. package/dist/token/token-manager.d.ts.map +1 -1
  280. package/dist/token/token-manager.js +1 -1
  281. package/dist/token/token-manager.js.map +1 -1
  282. package/dist/token/token-store.d.ts +7 -9
  283. package/dist/token/token-store.d.ts.map +1 -1
  284. package/dist/token/token-store.js +0 -4
  285. package/dist/token/token-store.js.map +1 -1
  286. package/dist/types/handle.js.map +1 -1
  287. package/dist/types/rgb-color.d.ts +1 -1
  288. package/dist/types/rgb-color.d.ts.map +1 -1
  289. package/dist/types/rgb-color.js.map +1 -1
  290. package/package.json +47 -20
  291. package/dist/constants.d.ts.map +0 -1
  292. package/dist/constants.js.map +0 -1
  293. package/dist/errors/invalid-invite-code-error.d.ts +0 -5
  294. package/dist/errors/invalid-invite-code-error.d.ts.map +0 -1
  295. package/dist/errors/invalid-invite-code-error.js +0 -7
  296. package/dist/errors/invalid-invite-code-error.js.map +0 -1
  297. package/dist/index.d.ts +0 -15
  298. package/dist/index.d.ts.map +0 -1
  299. package/dist/index.js +0 -16
  300. package/dist/index.js.map +0 -1
  301. package/dist/oauth-client.d.ts +0 -4
  302. package/dist/oauth-client.d.ts.map +0 -1
  303. package/dist/oauth-client.js +0 -3
  304. package/dist/oauth-client.js.map +0 -1
  305. package/dist/oauth-dpop.d.ts +0 -3
  306. package/dist/oauth-dpop.d.ts.map +0 -1
  307. package/dist/oauth-dpop.js +0 -3
  308. package/dist/oauth-dpop.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { LexiconDocument } from '@atproto/lex-document';
1
+ import type { LexiconDocument } from '@atproto/lex-document';
2
2
  export type { LexiconDocument };
3
3
  export type LexiconData = {
4
4
  createdAt: Date;
@@ -1 +1 @@
1
- {"version":3,"file":"lexicon-data.d.ts","sourceRoot":"","sources":["../../src/lexicon/lexicon-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,YAAY,EAAE,eAAe,EAAE,CAAA;AAE/B,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,eAAe,EAAE,IAAI,GAAG,IAAI,CAAA;IAC5B,GAAG,EAAE,IAAI,GAAG,MAAM,CAAA;IAClB,OAAO,EAAE,IAAI,GAAG,eAAe,CAAA;CAChC,CAAA"}
1
+ {"version":3,"file":"lexicon-data.d.ts","sourceRoot":"","sources":["../../src/lexicon/lexicon-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE5D,YAAY,EAAE,eAAe,EAAE,CAAA;AAE/B,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,eAAe,EAAE,IAAI,GAAG,IAAI,CAAA;IAC5B,GAAG,EAAE,IAAI,GAAG,MAAM,CAAA;IAClB,OAAO,EAAE,IAAI,GAAG,eAAe,CAAA;CAChC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"lexicon-data.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-data.ts"],"names":[],"mappings":"","sourcesContent":["import { LexiconDocument } from '@atproto/lex-document'\n\nexport type { LexiconDocument }\n\nexport type LexiconData = {\n createdAt: Date\n updatedAt: Date\n lastSucceededAt: null | Date\n uri: null | string\n lexicon: null | LexiconDocument\n}\n"]}
1
+ {"version":3,"file":"lexicon-data.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-data.ts"],"names":[],"mappings":"","sourcesContent":["import type { LexiconDocument } from '@atproto/lex-document'\n\nexport type { LexiconDocument }\n\nexport type LexiconData = {\n createdAt: Date\n updatedAt: Date\n lastSucceededAt: null | Date\n uri: null | string\n lexicon: null | LexiconDocument\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { LexResolver } from '@atproto/lex-resolver';
2
- import { Nsid } from '@atproto/oauth-scopes';
1
+ import { type LexResolver } from '@atproto/lex-resolver';
2
+ import type { Nsid } from '@atproto/oauth-scopes';
3
3
  import { CachedGetter } from '@atproto-labs/simple-store';
4
- import { LexiconData, LexiconStore } from './lexicon-store.js';
4
+ import type { LexiconData, LexiconStore } from './lexicon-store.js';
5
5
  /**
6
6
  * This utility class handles the retrieval and caching of lexicon
7
7
  * data. In particular, it handles failed retrieval attempts by returning cached
@@ -1 +1 @@
1
- {"version":3,"file":"lexicon-getter.d.ts","sourceRoot":"","sources":["../../src/lexicon/lexicon-getter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAoB,MAAM,uBAAuB,CAAA;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAEzD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAE9D;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC;IAChE,YAAY,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAuCxD;CACF"}
1
+ {"version":3,"file":"lexicon-getter.d.ts","sourceRoot":"","sources":["../../src/lexicon/lexicon-getter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAoB,MAAM,uBAAuB,CAAA;AAC1E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEnE;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC;IAChE,YAAY,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAuCxD;CACF"}
@@ -1,6 +1,6 @@
1
1
  import { LexResolverError } from '@atproto/lex-resolver';
2
2
  import { CachedGetter } from '@atproto-labs/simple-store';
3
- import { LEXICON_REFRESH_FREQUENCY } from '../constants.js';
3
+ import { LEXICON_REFRESH_FREQUENCY } from '../oauth-constants.js';
4
4
  /**
5
5
  * This utility class handles the retrieval and caching of lexicon
6
6
  * data. In particular, it handles failed retrieval attempts by returning cached
@@ -1 +1 @@
1
- {"version":3,"file":"lexicon-getter.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-getter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAG3D;;;;;;GAMG;AACH,MAAM,OAAO,aAAc,SAAQ,YAA+B;IAChE,YAAY,KAAmB,EAAE,WAAwB;QACvD,KAAK,CACH,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE;YACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YACtB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACjE,kEAAkE;gBAClE,mEAAmE;gBACnE,mEAAmE;gBACnE,gEAAgE;gBAChE,IAAI,GAAG,YAAY,gBAAgB;oBAAE,OAAO,SAAS,CAAA;gBAErD,kCAAkC;gBAClC,MAAM,GAAG,CAAA;YACX,CAAC,CAAC,CAAA;YAEF,OAAO;gBACL,wCAAwC;gBACxC,SAAS,EAAE,UAAU,EAAE,SAAS,IAAI,GAAG;gBACvC,0BAA0B;gBAC1B,SAAS,EAAE,GAAG;gBACd,gEAAgE;gBAChE,6BAA6B;gBAC7B,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,eAAe,IAAI,IAAI;gBACnE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,IAAI,IAAI;gBAC7D,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,IAAI,IAAI;aAC/D,CAAA;QACH,CAAC,EACD;YACE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;YACzD,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS;YACjE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;SAC/C,EACD;YACE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAA;gBACjE,OAAO,mBAAmB,IAAI,yBAAyB,CAAA;YACzD,CAAC;SACF,CACF,CAAA;IACH,CAAC;CACF","sourcesContent":["import { LexResolver, LexResolverError } from '@atproto/lex-resolver'\nimport { Nsid } from '@atproto/oauth-scopes'\nimport { CachedGetter } from '@atproto-labs/simple-store'\nimport { LEXICON_REFRESH_FREQUENCY } from '../constants.js'\nimport { LexiconData, LexiconStore } from './lexicon-store.js'\n\n/**\n * This utility class handles the retrieval and caching of lexicon\n * data. In particular, it handles failed retrieval attempts by returning cached\n * data.\n *\n * @private\n */\nexport class LexiconGetter extends CachedGetter<Nsid, LexiconData> {\n constructor(store: LexiconStore, lexResolver: LexResolver) {\n super(\n async (input, options, storedData) => {\n const now = new Date()\n const result = await lexResolver.get(input, options).catch((err) => {\n // We swallow LexiconResolutionError errors, returning potentially\n // \"null\" values here to avoid hammering the resolver with requests\n // for the same lexicon that is known to be unavailable. The getter\n // should be called again based on the isStale() function below.\n if (err instanceof LexResolverError) return undefined\n\n // Unexpected error are propagated\n throw err\n })\n\n return {\n // Keep original createdAt, if available\n createdAt: storedData?.createdAt ?? now,\n // Always update updatedAt\n updatedAt: now,\n // Update the data with fresh data, if available, or keep cached\n // values (if any) otherwise.\n lastSucceededAt: result ? now : storedData?.lastSucceededAt ?? null,\n uri: result ? result.uri.toString() : storedData?.uri ?? null,\n lexicon: result ? result.lexicon : storedData?.lexicon ?? null,\n }\n },\n {\n set: async (nsid, data) => store.storeLexicon(nsid, data),\n get: async (nsid) => (await store.findLexicon(nsid)) ?? undefined,\n del: async (nsid) => store.deleteLexicon(nsid),\n },\n {\n isStale: (nsid, data) => {\n const timeSinceLastUpdate = Date.now() - data.updatedAt.getTime()\n return timeSinceLastUpdate >= LEXICON_REFRESH_FREQUENCY\n },\n },\n )\n }\n}\n"]}
1
+ {"version":3,"file":"lexicon-getter.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-getter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE1E,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AAGjE;;;;;;GAMG;AACH,MAAM,OAAO,aAAc,SAAQ,YAA+B;IAChE,YAAY,KAAmB,EAAE,WAAwB;QACvD,KAAK,CACH,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE;YACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YACtB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACjE,kEAAkE;gBAClE,mEAAmE;gBACnE,mEAAmE;gBACnE,gEAAgE;gBAChE,IAAI,GAAG,YAAY,gBAAgB;oBAAE,OAAO,SAAS,CAAA;gBAErD,kCAAkC;gBAClC,MAAM,GAAG,CAAA;YACX,CAAC,CAAC,CAAA;YAEF,OAAO;gBACL,wCAAwC;gBACxC,SAAS,EAAE,UAAU,EAAE,SAAS,IAAI,GAAG;gBACvC,0BAA0B;gBAC1B,SAAS,EAAE,GAAG;gBACd,gEAAgE;gBAChE,6BAA6B;gBAC7B,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,eAAe,IAAI,IAAI;gBACnE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,IAAI,IAAI;gBAC7D,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,IAAI,IAAI;aAC/D,CAAA;QACH,CAAC,EACD;YACE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;YACzD,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS;YACjE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;SAC/C,EACD;YACE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAA;gBACjE,OAAO,mBAAmB,IAAI,yBAAyB,CAAA;YACzD,CAAC;SACF,CACF,CAAA;IACH,CAAC;CACF","sourcesContent":["import { type LexResolver, LexResolverError } from '@atproto/lex-resolver'\nimport type { Nsid } from '@atproto/oauth-scopes'\nimport { CachedGetter } from '@atproto-labs/simple-store'\nimport { LEXICON_REFRESH_FREQUENCY } from '../oauth-constants.js'\nimport type { LexiconData, LexiconStore } from './lexicon-store.js'\n\n/**\n * This utility class handles the retrieval and caching of lexicon\n * data. In particular, it handles failed retrieval attempts by returning cached\n * data.\n *\n * @private\n */\nexport class LexiconGetter extends CachedGetter<Nsid, LexiconData> {\n constructor(store: LexiconStore, lexResolver: LexResolver) {\n super(\n async (input, options, storedData) => {\n const now = new Date()\n const result = await lexResolver.get(input, options).catch((err) => {\n // We swallow LexiconResolutionError errors, returning potentially\n // \"null\" values here to avoid hammering the resolver with requests\n // for the same lexicon that is known to be unavailable. The getter\n // should be called again based on the isStale() function below.\n if (err instanceof LexResolverError) return undefined\n\n // Unexpected error are propagated\n throw err\n })\n\n return {\n // Keep original createdAt, if available\n createdAt: storedData?.createdAt ?? now,\n // Always update updatedAt\n updatedAt: now,\n // Update the data with fresh data, if available, or keep cached\n // values (if any) otherwise.\n lastSucceededAt: result ? now : storedData?.lastSucceededAt ?? null,\n uri: result ? result.uri.toString() : storedData?.uri ?? null,\n lexicon: result ? result.lexicon : storedData?.lexicon ?? null,\n }\n },\n {\n set: async (nsid, data) => store.storeLexicon(nsid, data),\n get: async (nsid) => (await store.findLexicon(nsid)) ?? undefined,\n del: async (nsid) => store.deleteLexicon(nsid),\n },\n {\n isStale: (nsid, data) => {\n const timeSinceLastUpdate = Date.now() - data.updatedAt.getTime()\n return timeSinceLastUpdate >= LEXICON_REFRESH_FREQUENCY\n },\n },\n )\n }\n}\n"]}
@@ -1,8 +1,8 @@
1
- import { LexiconPermissionSet } from '@atproto/lex-document';
2
- import { LexResolver } from '@atproto/lex-resolver';
3
- import { IncludeScope, Nsid } from '@atproto/oauth-scopes';
1
+ import type { LexiconPermissionSet } from '@atproto/lex-document';
2
+ import { type LexResolver } from '@atproto/lex-resolver';
3
+ import { IncludeScope, type Nsid } from '@atproto/oauth-scopes';
4
4
  import { LexiconGetter } from './lexicon-getter.js';
5
- import { LexiconStore } from './lexicon-store.js';
5
+ import type { LexiconStore } from './lexicon-store.js';
6
6
  export * from './lexicon-store.js';
7
7
  export declare class LexiconManager {
8
8
  protected readonly lexiconGetter: LexiconGetter;
@@ -1 +1 @@
1
- {"version":3,"file":"lexicon-manager.d.ts","sourceRoot":"","sources":["../../src/lexicon/lexicon-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAoB,MAAM,uBAAuB,CAAA;AACrE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,cAAc,oBAAoB,CAAA;AAElC,qBAAa,cAAc;IACzB,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IAE/C,YAAY,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAExD;IAEY,0BAA0B,CAAC,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;;QAGrD;IAED;;;;OAIG;IACU,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY3D;IAED;;;OAGG;IACH,UAAgB,qBAAqB,CAAC,aAAa,EAAE,YAAY,EAAE;;;;;;;;;;;;QAGlE;IAED,UAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC;;;;;;;;;;;;QAIjD;IAED,UAAgB,qBAAqB,CACnC,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC,CAG5D;IAED,UAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAa1E;CACF;AA+BD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,EACvC,YAAY,EAAE,YAAY,GACzB,MAAM,EAAE,CAMV"}
1
+ {"version":3,"file":"lexicon-manager.d.ts","sourceRoot":"","sources":["../../src/lexicon/lexicon-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EAAE,KAAK,WAAW,EAAoB,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,cAAc,oBAAoB,CAAA;AAElC,qBAAa,cAAc;IACzB,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IAE/C,YAAY,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAExD;IAEY,0BAA0B,CAAC,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;;QAGrD;IAED;;;;OAIG;IACU,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY3D;IAED;;;OAGG;IACH,UAAgB,qBAAqB,CAAC,aAAa,EAAE,YAAY,EAAE;;;;;;;;;;;;QAGlE;IAED,UAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC;;;;;;;;;;;;QAIjD;IAED,UAAgB,qBAAqB,CACnC,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC,CAG5D;IAED,UAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAa1E;CACF;AA+BD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,EACvC,YAAY,EAAE,YAAY,GACzB,MAAM,EAAE,CAMV"}
@@ -1 +1 @@
1
- {"version":3,"file":"lexicon-manager.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { LexiconPermissionSet } from '@atproto/lex-document'\nimport { LexResolver, LexResolverError } from '@atproto/lex-resolver'\nimport { IncludeScope, Nsid } from '@atproto/oauth-scopes'\nimport { LexiconGetter } from './lexicon-getter.js'\nimport { LexiconStore } from './lexicon-store.js'\n\nexport * from './lexicon-store.js'\n\nexport class LexiconManager {\n protected readonly lexiconGetter: LexiconGetter\n\n constructor(store: LexiconStore, lexResolver: LexResolver) {\n this.lexiconGetter = new LexiconGetter(store, lexResolver)\n }\n\n public async getPermissionSetsFromScope(scope?: string) {\n const { includeScopes } = parseScope(scope)\n return this.extractPermissionSets(includeScopes)\n }\n\n /**\n * Transforms a scope string from an authorization request into a scope\n * composed solely of granular permission scopes, transforming any NSID\n * into its corresponding permission scopes.\n */\n public async buildTokenScope(scope: string): Promise<string> {\n const { includeScopes, otherScopes } = parseScope(scope)\n\n // If the scope does not contain any \"include:<nsid>\" scopes, return it as-is.\n if (!includeScopes.length) return scope\n\n const permissionSets = await this.extractPermissionSets(includeScopes)\n\n return Array.from(includeScopes)\n .flatMap(nsidToPermissionScopes, permissionSets)\n .concat(otherScopes)\n .join(' ')\n }\n\n /**\n * Given a list of scope values, extract those that are NSIDs and return their\n * corresponding permission sets.\n */\n protected async extractPermissionSets(includeScopes: IncludeScope[]) {\n const nsids = extractNsids(includeScopes)\n return this.getPermissionSets(nsids)\n }\n\n protected async getPermissionSets(nsids: Set<Nsid>) {\n return new Map<string, LexiconPermissionSet>(\n await Promise.all(Array.from(nsids, this.getPermissionSetEntry, this)),\n )\n }\n\n protected async getPermissionSetEntry(\n nsid: Nsid,\n ): Promise<[nsid: Nsid, permissionSet: LexiconPermissionSet]> {\n const permissionSet = await this.getPermissionSet(nsid)\n return [nsid, permissionSet]\n }\n\n protected async getPermissionSet(nsid: Nsid): Promise<LexiconPermissionSet> {\n const { lexicon } = await this.lexiconGetter.get(nsid)\n\n if (!lexicon) {\n throw LexResolverError.from(nsid)\n }\n\n if (lexicon.defs.main?.type !== 'permission-set') {\n const description = 'Lexicon document is not a permission set'\n throw LexResolverError.from(nsid, description)\n }\n\n return lexicon.defs.main\n }\n}\n\nfunction parseScope(scope?: string) {\n const includeScopes: IncludeScope[] = []\n const otherScopes: string[] = []\n\n if (scope) {\n for (const scopeValue of scope.split(' ')) {\n const parsed = IncludeScope.fromString(scopeValue)\n if (parsed) {\n includeScopes.push(parsed)\n } else {\n otherScopes.push(scopeValue)\n }\n }\n }\n\n return {\n includeScopes,\n otherScopes,\n }\n}\n\nfunction extractNsids(includeScopes: IncludeScope[]): Set<Nsid> {\n return new Set(Array.from(includeScopes, extractNsid))\n}\n\nfunction extractNsid(nsidScope: IncludeScope): Nsid {\n return nsidScope.nsid\n}\n\nexport function nsidToPermissionScopes(\n this: Map<string, LexiconPermissionSet>,\n includeScope: IncludeScope,\n): string[] {\n const permissionSet = this.get(includeScope.nsid)\n if (permissionSet) return includeScope.toScopes(permissionSet)\n\n // Should never happen (mostly there for type safety & future proofing)\n throw new Error(`Missing permission set for NSID: ${includeScope.nsid}`)\n}\n"]}
1
+ {"version":3,"file":"lexicon-manager.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { LexiconPermissionSet } from '@atproto/lex-document'\nimport { type LexResolver, LexResolverError } from '@atproto/lex-resolver'\nimport { IncludeScope, type Nsid } from '@atproto/oauth-scopes'\nimport { LexiconGetter } from './lexicon-getter.js'\nimport type { LexiconStore } from './lexicon-store.js'\n\nexport * from './lexicon-store.js'\n\nexport class LexiconManager {\n protected readonly lexiconGetter: LexiconGetter\n\n constructor(store: LexiconStore, lexResolver: LexResolver) {\n this.lexiconGetter = new LexiconGetter(store, lexResolver)\n }\n\n public async getPermissionSetsFromScope(scope?: string) {\n const { includeScopes } = parseScope(scope)\n return this.extractPermissionSets(includeScopes)\n }\n\n /**\n * Transforms a scope string from an authorization request into a scope\n * composed solely of granular permission scopes, transforming any NSID\n * into its corresponding permission scopes.\n */\n public async buildTokenScope(scope: string): Promise<string> {\n const { includeScopes, otherScopes } = parseScope(scope)\n\n // If the scope does not contain any \"include:<nsid>\" scopes, return it as-is.\n if (!includeScopes.length) return scope\n\n const permissionSets = await this.extractPermissionSets(includeScopes)\n\n return Array.from(includeScopes)\n .flatMap(nsidToPermissionScopes, permissionSets)\n .concat(otherScopes)\n .join(' ')\n }\n\n /**\n * Given a list of scope values, extract those that are NSIDs and return their\n * corresponding permission sets.\n */\n protected async extractPermissionSets(includeScopes: IncludeScope[]) {\n const nsids = extractNsids(includeScopes)\n return this.getPermissionSets(nsids)\n }\n\n protected async getPermissionSets(nsids: Set<Nsid>) {\n return new Map<string, LexiconPermissionSet>(\n await Promise.all(Array.from(nsids, this.getPermissionSetEntry, this)),\n )\n }\n\n protected async getPermissionSetEntry(\n nsid: Nsid,\n ): Promise<[nsid: Nsid, permissionSet: LexiconPermissionSet]> {\n const permissionSet = await this.getPermissionSet(nsid)\n return [nsid, permissionSet]\n }\n\n protected async getPermissionSet(nsid: Nsid): Promise<LexiconPermissionSet> {\n const { lexicon } = await this.lexiconGetter.get(nsid)\n\n if (!lexicon) {\n throw LexResolverError.from(nsid)\n }\n\n if (lexicon.defs.main?.type !== 'permission-set') {\n const description = 'Lexicon document is not a permission set'\n throw LexResolverError.from(nsid, description)\n }\n\n return lexicon.defs.main\n }\n}\n\nfunction parseScope(scope?: string) {\n const includeScopes: IncludeScope[] = []\n const otherScopes: string[] = []\n\n if (scope) {\n for (const scopeValue of scope.split(' ')) {\n const parsed = IncludeScope.fromString(scopeValue)\n if (parsed) {\n includeScopes.push(parsed)\n } else {\n otherScopes.push(scopeValue)\n }\n }\n }\n\n return {\n includeScopes,\n otherScopes,\n }\n}\n\nfunction extractNsids(includeScopes: IncludeScope[]): Set<Nsid> {\n return new Set(Array.from(includeScopes, extractNsid))\n}\n\nfunction extractNsid(nsidScope: IncludeScope): Nsid {\n return nsidScope.nsid\n}\n\nexport function nsidToPermissionScopes(\n this: Map<string, LexiconPermissionSet>,\n includeScope: IncludeScope,\n): string[] {\n const permissionSet = this.get(includeScope.nsid)\n if (permissionSet) return includeScope.toScopes(permissionSet)\n\n // Should never happen (mostly there for type safety & future proofing)\n throw new Error(`Missing permission set for NSID: ${includeScope.nsid}`)\n}\n"]}
@@ -1,6 +1,7 @@
1
- import { Awaitable } from '../lib/util/type.js';
2
- import { LexiconData, LexiconDocument } from './lexicon-data.js';
3
- export type { Awaitable, LexiconData, LexiconDocument };
1
+ import type { Awaitable } from '../lib/util/type.js';
2
+ import type { LexiconData } from './lexicon-data.js';
3
+ export type * from './lexicon-data.js';
4
+ export type { Awaitable };
4
5
  export interface LexiconStore {
5
6
  findLexicon(nsid: string): Awaitable<LexiconData | null>;
6
7
  storeLexicon(nsid: string, data: LexiconData): Awaitable<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"lexicon-store.d.ts","sourceRoot":"","sources":["../../src/lexicon/lexicon-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,MAAM,qBAAqB,CAAA;AACtE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEhE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,CAAA;AAEvD,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IACxD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC9D,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;CAC7C;AAED,eAAO,MAAM,cAAc,yHAIzB,CAAA;AAEF,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,CAAC,YAAY,CAAC,EAC5D,cAAc,CAAC,EAAE,CAAC,GACjB,CAAC,CAAC,GAAG,YAAY,CAAC,GAAG,SAAS,CAMhC;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,CAAC,YAAY,CAAC,EAC5D,cAAc,CAAC,EAAE,CAAC,GACjB,CAAC,GAAG,YAAY,CAKlB"}
1
+ {"version":3,"file":"lexicon-store.d.ts","sourceRoot":"","sources":["../../src/lexicon/lexicon-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,mBAAmB,mBAAmB,CAAA;AACtC,YAAY,EAAE,SAAS,EAAE,CAAA;AAEzB,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IACxD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC9D,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;CAC7C;AAED,eAAO,MAAM,cAAc,yHAIzB,CAAA;AAEF,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,CAAC,YAAY,CAAC,EAC5D,cAAc,CAAC,EAAE,CAAC,GACjB,CAAC,CAAC,GAAG,YAAY,CAAC,GAAG,SAAS,CAMhC;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,CAAC,YAAY,CAAC,EAC5D,cAAc,CAAC,EAAE,CAAC,GACjB,CAAC,GAAG,YAAY,CAKlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"lexicon-store.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAWtE,MAAM,CAAC,MAAM,cAAc,GAAG,qBAAqB,CAAe;IAChE,eAAe;IACf,aAAa;IACb,cAAc;CACf,CAAC,CAAA;AAEF,MAAM,UAAU,cAAc,CAC5B,cAAkB;IAElB,IAAI,cAAc,IAAI,cAAc,CAAC,cAAc,CAAC,EAAE,CAAC;QACrD,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,cAAkB;IAElB,MAAM,KAAK,GAAG,cAAc,CAAC,cAAc,CAAC,CAAA;IAC5C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAA;IAEvB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;AACxD,CAAC","sourcesContent":["import { Awaitable, buildInterfaceChecker } from '../lib/util/type.js'\nimport { LexiconData, LexiconDocument } from './lexicon-data.js'\n\nexport type { Awaitable, LexiconData, LexiconDocument }\n\nexport interface LexiconStore {\n findLexicon(nsid: string): Awaitable<LexiconData | null>\n storeLexicon(nsid: string, data: LexiconData): Awaitable<void>\n deleteLexicon(nsid: string): Awaitable<void>\n}\n\nexport const isLexiconStore = buildInterfaceChecker<LexiconStore>([\n 'deleteLexicon',\n 'findLexicon',\n 'storeLexicon',\n])\n\nexport function ifLexiconStore<V extends Partial<LexiconStore>>(\n implementation?: V,\n): (V & LexiconStore) | undefined {\n if (implementation && isLexiconStore(implementation)) {\n return implementation\n }\n\n return undefined\n}\n\nexport function asLexiconStore<V extends Partial<LexiconStore>>(\n implementation?: V,\n): V & LexiconStore {\n const store = ifLexiconStore(implementation)\n if (store) return store\n\n throw new Error('Invalid LexiconStore implementation')\n}\n"]}
1
+ {"version":3,"file":"lexicon-store.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAY3D,MAAM,CAAC,MAAM,cAAc,GAAG,qBAAqB,CAAe;IAChE,eAAe;IACf,aAAa;IACb,cAAc;CACf,CAAC,CAAA;AAEF,MAAM,UAAU,cAAc,CAC5B,cAAkB;IAElB,IAAI,cAAc,IAAI,cAAc,CAAC,cAAc,CAAC,EAAE,CAAC;QACrD,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,cAAkB;IAElB,MAAM,KAAK,GAAG,cAAc,CAAC,cAAc,CAAC,CAAA;IAC5C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAA;IAEvB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;AACxD,CAAC","sourcesContent":["import type { Awaitable } from '../lib/util/type.js'\nimport { buildInterfaceChecker } from '../lib/util/type.js'\nimport type { LexiconData } from './lexicon-data.js'\n\nexport type * from './lexicon-data.js'\nexport type { Awaitable }\n\nexport interface LexiconStore {\n findLexicon(nsid: string): Awaitable<LexiconData | null>\n storeLexicon(nsid: string, data: LexiconData): Awaitable<void>\n deleteLexicon(nsid: string): Awaitable<void>\n}\n\nexport const isLexiconStore = buildInterfaceChecker<LexiconStore>([\n 'deleteLexicon',\n 'findLexicon',\n 'storeLexicon',\n])\n\nexport function ifLexiconStore<V extends Partial<LexiconStore>>(\n implementation?: V,\n): (V & LexiconStore) | undefined {\n if (implementation && isLexiconStore(implementation)) {\n return implementation\n }\n\n return undefined\n}\n\nexport function asLexiconStore<V extends Partial<LexiconStore>>(\n implementation?: V,\n): V & LexiconStore {\n const store = ifLexiconStore(implementation)\n if (store) return store\n\n throw new Error('Invalid LexiconStore implementation')\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { CombinedTuple, Simplify } from '../util/type.js';
1
+ import type { CombinedTuple, Simplify } from '../util/type.js';
2
2
  export type CspValue = `data:` | `http:${string}` | `https:${string}` | `'none'` | `'self'` | `'sha256-${string}'` | `'nonce-${string}'` | `'unsafe-inline'` | `'unsafe-eval'` | `'strict-dynamic'` | `'report-sample'` | `'unsafe-hashes'`;
3
3
  declare const STRING_DIRECTIVES: readonly ['base-uri'];
4
4
  declare const BOOLEAN_DIRECTIVES: readonly ['upgrade-insecure-requests', 'block-all-mixed-content'];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/csp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAEzD,MAAM,MAAM,QAAQ,GAChB,OAAO,GACP,QAAQ,MAAM,EAAE,GAChB,SAAS,MAAM,EAAE,GACjB,QAAQ,GACR,QAAQ,GACR,WAAW,MAAM,GAAG,GACpB,UAAU,MAAM,GAAG,GACnB,iBAAiB,GACjB,eAAe,GACf,kBAAkB,GAClB,iBAAiB,GACjB,iBAAiB,CAAA;AAErB,QAAA,MAAM,iBAAiB,YAAI,UAAU,CAAU,CAAA;AAC/C,QAAA,MAAM,kBAAkB,YACtB,2BAA2B,EAC3B,yBAAyB,CACjB,CAAA;AACV,QAAA,MAAM,gBAAgB,YACpB,aAAa,EACb,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,CACH,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,QAAQ,CAC9B;KACG,CAAC,IAAI,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO;CACrD,GAAG;KACD,CAAC,IAAI,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ;CACrD,GAAG;KACD,CAAC,IAAI,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC;CAC9D,CACF,CAAA;AAID,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAkBlD;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EACjE,GAAG,OAAO,EAAE,CAAC,GAEiD,aAAa,CAAC,CAAC,CAAC,CAC/E;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,SAAS,CA8BhE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/csp/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE9D,MAAM,MAAM,QAAQ,GAChB,OAAO,GACP,QAAQ,MAAM,EAAE,GAChB,SAAS,MAAM,EAAE,GACjB,QAAQ,GACR,QAAQ,GACR,WAAW,MAAM,GAAG,GACpB,UAAU,MAAM,GAAG,GACnB,iBAAiB,GACjB,eAAe,GACf,kBAAkB,GAClB,iBAAiB,GACjB,iBAAiB,CAAA;AAErB,QAAA,MAAM,iBAAiB,YAAI,UAAU,CAAU,CAAA;AAC/C,QAAA,MAAM,kBAAkB,YACtB,2BAA2B,EAC3B,yBAAyB,CACjB,CAAA;AACV,QAAA,MAAM,gBAAgB,YACpB,aAAa,EACb,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,CACH,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,QAAQ,CAC9B;KACG,CAAC,IAAI,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO;CACrD,GAAG;KACD,CAAC,IAAI,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ;CACrD,GAAG;KACD,CAAC,IAAI,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC;CAC9D,CACF,CAAA;AAID,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAkBlD;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EACjE,GAAG,OAAO,EAAE,CAAC,GAEiD,aAAa,CAAC,CAAC,CAAC,CAC/E;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,SAAS,CA8BhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/csp/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { CombinedTuple, Simplify } from '../util/type.js'\n\nexport type CspValue =\n | `data:`\n | `http:${string}`\n | `https:${string}`\n | `'none'`\n | `'self'`\n | `'sha256-${string}'`\n | `'nonce-${string}'`\n | `'unsafe-inline'`\n | `'unsafe-eval'`\n | `'strict-dynamic'`\n | `'report-sample'`\n | `'unsafe-hashes'`\n\nconst STRING_DIRECTIVES = ['base-uri'] as const\nconst BOOLEAN_DIRECTIVES = [\n 'upgrade-insecure-requests',\n 'block-all-mixed-content',\n] as const\nconst ARRAY_DIRECTIVES = [\n 'connect-src',\n 'default-src',\n 'form-action',\n 'frame-ancestors',\n 'frame-src',\n 'img-src',\n 'script-src',\n 'style-src',\n] as const\n\nexport type CspConfig = Simplify<\n {\n [K in (typeof BOOLEAN_DIRECTIVES)[number]]?: boolean\n } & {\n [K in (typeof STRING_DIRECTIVES)[number]]?: CspValue\n } & {\n [K in (typeof ARRAY_DIRECTIVES)[number]]?: Iterable<CspValue>\n }\n>\n\nconst NONE = \"'none'\"\n\nexport function buildCsp(config: CspConfig): string {\n const values: string[] = []\n\n for (const name of BOOLEAN_DIRECTIVES) {\n if (config[name] === true) values.push(name)\n }\n\n for (const name of STRING_DIRECTIVES) {\n if (config[name]) values.push(`${name} ${config[name]}`)\n }\n\n for (const name of ARRAY_DIRECTIVES) {\n // Remove duplicate values by using a Set\n const val = config[name] ? new Set(config[name]) : undefined\n if (val?.size) values.push(`${name} ${Array.from(val).join(' ')}`)\n }\n\n return values.join('; ')\n}\n\nexport function mergeCsp<C extends (CspConfig | null | undefined)[]>(\n ...configs: C\n) {\n return configs.filter((v) => v != null).reduce(combineCsp) as CombinedTuple<C>\n}\n\nexport function combineCsp(a: CspConfig, b: CspConfig): CspConfig {\n const result: CspConfig = {}\n\n for (const name of BOOLEAN_DIRECTIVES) {\n // @NOTE b (if defined) takes precedence\n const value = b[name] ?? a[name]\n if (value != null) result[name] = value\n }\n\n for (const name of STRING_DIRECTIVES) {\n if (a[name] || b[name]) {\n const aNotNone = a[name] === NONE ? undefined : a[name]\n const bNotNone = b[name] === NONE ? undefined : b[name]\n // @NOTE b takes precedence\n result[name] = bNotNone || aNotNone || NONE\n }\n }\n\n for (const name of ARRAY_DIRECTIVES) {\n if (a[name] && b[name]) {\n const set = new Set(a[name])\n if (b[name]) for (const value of b[name]) set.add(value)\n if (set.size > 1 && set.has(NONE)) set.delete(NONE)\n result[name] = [...set]\n } else if (a[name] || b[name]) {\n result[name] = a[name] || b[name]\n }\n }\n\n return result\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/csp/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CombinedTuple, Simplify } from '../util/type.js'\n\nexport type CspValue =\n | `data:`\n | `http:${string}`\n | `https:${string}`\n | `'none'`\n | `'self'`\n | `'sha256-${string}'`\n | `'nonce-${string}'`\n | `'unsafe-inline'`\n | `'unsafe-eval'`\n | `'strict-dynamic'`\n | `'report-sample'`\n | `'unsafe-hashes'`\n\nconst STRING_DIRECTIVES = ['base-uri'] as const\nconst BOOLEAN_DIRECTIVES = [\n 'upgrade-insecure-requests',\n 'block-all-mixed-content',\n] as const\nconst ARRAY_DIRECTIVES = [\n 'connect-src',\n 'default-src',\n 'form-action',\n 'frame-ancestors',\n 'frame-src',\n 'img-src',\n 'script-src',\n 'style-src',\n] as const\n\nexport type CspConfig = Simplify<\n {\n [K in (typeof BOOLEAN_DIRECTIVES)[number]]?: boolean\n } & {\n [K in (typeof STRING_DIRECTIVES)[number]]?: CspValue\n } & {\n [K in (typeof ARRAY_DIRECTIVES)[number]]?: Iterable<CspValue>\n }\n>\n\nconst NONE = \"'none'\"\n\nexport function buildCsp(config: CspConfig): string {\n const values: string[] = []\n\n for (const name of BOOLEAN_DIRECTIVES) {\n if (config[name] === true) values.push(name)\n }\n\n for (const name of STRING_DIRECTIVES) {\n if (config[name]) values.push(`${name} ${config[name]}`)\n }\n\n for (const name of ARRAY_DIRECTIVES) {\n // Remove duplicate values by using a Set\n const val = config[name] ? new Set(config[name]) : undefined\n if (val?.size) values.push(`${name} ${Array.from(val).join(' ')}`)\n }\n\n return values.join('; ')\n}\n\nexport function mergeCsp<C extends (CspConfig | null | undefined)[]>(\n ...configs: C\n) {\n return configs.filter((v) => v != null).reduce(combineCsp) as CombinedTuple<C>\n}\n\nexport function combineCsp(a: CspConfig, b: CspConfig): CspConfig {\n const result: CspConfig = {}\n\n for (const name of BOOLEAN_DIRECTIVES) {\n // @NOTE b (if defined) takes precedence\n const value = b[name] ?? a[name]\n if (value != null) result[name] = value\n }\n\n for (const name of STRING_DIRECTIVES) {\n if (a[name] || b[name]) {\n const aNotNone = a[name] === NONE ? undefined : a[name]\n const bNotNone = b[name] === NONE ? undefined : b[name]\n // @NOTE b takes precedence\n result[name] = bNotNone || aNotNone || NONE\n }\n }\n\n for (const name of ARRAY_DIRECTIVES) {\n if (a[name] && b[name]) {\n const set = new Set(a[name])\n if (b[name]) for (const value of b[name]) set.add(value)\n if (set.size > 1 && set.has(NONE)) set.delete(NONE)\n result[name] = [...set]\n } else if (a[name] || b[name]) {\n result[name] = a[name] || b[name]\n }\n }\n\n return result\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { Fetch, FetchBound } from '@atproto-labs/fetch';
2
+ import { type Fetch, type FetchBound } from '@atproto-labs/fetch-node';
3
3
  export declare const hcaptchaTokenSchema: z.ZodString;
4
4
  export type HcaptchaToken = z.infer<typeof hcaptchaTokenSchema>;
5
5
  export declare const hcaptchaConfigSchema: z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"hcaptcha.d.ts","sourceRoot":"","sources":["../../src/lib/hcaptcha.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EACL,KAAK,EACL,UAAU,EAKX,MAAM,qBAAqB,CAAA;AAG5B,eAAO,MAAM,mBAAmB,aAAoB,CAAA;AACpD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAE/D,eAAO,MAAM,oBAAoB;IAC/B;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;;;;;OAMG;;;;;;;;;;;;EAEH,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEjE;;GAEG;AACH,eAAO,MAAM,0BAA0B;IACrC;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;;OAGG;;IAEH;;;OAGG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEH,CAAA;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAE7E,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAQD,qBAAa,cAAc;IAGvB,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,MAAM,EAAE,cAAc;IAHjC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IACpC,YACW,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EAC/B,KAAK,GAAE,KAAwB,EAGhC;IAEY,MAAM,CACjB,YAAY,EAAE,OAAO,GAAG,QAAQ,EAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;OAgBnC;IAEM,iBAAiB,CACtB,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,oBAAoB,GAC3B,IAAI,CAiCN;IAEM,iBAAiB,CACtB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,oBAAoB,CAMtB;IAED,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,UAKhC;CACF;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAE1C,QAAQ,CAAC,MAAM,EAAE,oBAAoB;IACrC,QAAQ,CAAC,MAAM,EAAE,oBAAoB;IAFvC,YACW,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,oBAAoB,EACrC,OAAO,CAAC,EAAE,MAAM,EAGjB;CACF"}
1
+ {"version":3,"file":"hcaptcha.d.ts","sourceRoot":"","sources":["../../src/lib/hcaptcha.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EACL,KAAK,KAAK,EACV,KAAK,UAAU,EAKhB,MAAM,0BAA0B,CAAA;AAGjC,eAAO,MAAM,mBAAmB,aAAoB,CAAA;AACpD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAE/D,eAAO,MAAM,oBAAoB;IAC/B;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;;;;;OAMG;;;;;;;;;;;;EAEH,CAAA;AACF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEjE;;GAEG;AACH,eAAO,MAAM,0BAA0B;IACrC;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;;OAGG;;IAEH;;;OAGG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEH,CAAA;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAE7E,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAQD,qBAAa,cAAc;IAGvB,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,MAAM,EAAE,cAAc;IAHjC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IACpC,YACW,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EAC/B,KAAK,GAAE,KAAwB,EAGhC;IAEY,MAAM,CACjB,YAAY,EAAE,OAAO,GAAG,QAAQ,EAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;OAgBnC;IAEM,iBAAiB,CACtB,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,oBAAoB,GAC3B,IAAI,CAiCN;IAEM,iBAAiB,CACtB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,oBAAoB,CAMtB;IAED,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,UAKhC;CACF;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAE1C,QAAQ,CAAC,MAAM,EAAE,oBAAoB;IACrC,QAAQ,CAAC,MAAM,EAAE,oBAAoB;IAFvC,YACW,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,oBAAoB,EACrC,OAAO,CAAC,EAAE,MAAM,EAGjB;CACF"}
@@ -1,6 +1,6 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import { z } from 'zod';
3
- import { bindFetch, fetchJsonProcessor, fetchJsonZodProcessor, fetchOkProcessor, } from '@atproto-labs/fetch';
3
+ import { bindFetch, fetchJsonProcessor, fetchJsonZodProcessor, fetchOkProcessor, } from '@atproto-labs/fetch-node';
4
4
  import { pipe } from '@atproto-labs/pipe';
5
5
  export const hcaptchaTokenSchema = z.string().min(1);
6
6
  export const hcaptchaConfigSchema = z.object({
@@ -1 +1 @@
1
- {"version":3,"file":"hcaptcha.js","sourceRoot":"","sources":["../../src/lib/hcaptcha.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto'\nimport { z } from 'zod'\nimport {\n Fetch,\n FetchBound,\n bindFetch,\n fetchJsonProcessor,\n fetchJsonZodProcessor,\n fetchOkProcessor,\n} from '@atproto-labs/fetch'\nimport { pipe } from '@atproto-labs/pipe'\n\nexport const hcaptchaTokenSchema = z.string().min(1)\nexport type HcaptchaToken = z.infer<typeof hcaptchaTokenSchema>\n\nexport const hcaptchaConfigSchema = z.object({\n /**\n * The hCaptcha site key to use for the sign-up form.\n */\n siteKey: z.string().min(1),\n /**\n * The hCaptcha secret key to use for the sign-up form.\n */\n secretKey: z.string().min(1),\n /**\n * A salt to use when hashing client tokens.\n */\n tokenSalt: z.string().min(1),\n /**\n * The risk score above which the user is considered a threat and will be\n * denied access. This will be ignored if the enterprise features are not\n * available.\n *\n * Note: Score values ranges from 0.0 (no risk) to 1.0 (confirmed threat).\n */\n scoreThreshold: z.number().optional(),\n})\nexport type HcaptchaConfig = z.infer<typeof hcaptchaConfigSchema>\n\n/**\n * @see {@link https://docs.hcaptcha.com/#verify-the-user-response-server-side hCaptcha API}\n */\nexport const hcaptchaVerifyResultSchema = z.object({\n /**\n * is the passcode valid, and does it meet security criteria you specified, e.g. sitekey?\n */\n success: z.boolean(),\n /**\n * timestamp of the challenge (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)\n */\n challenge_ts: z.string(),\n /**\n * the hostname of the site where the challenge was passed\n */\n hostname: z.string().nullable(),\n /**\n * optional: any error codes returned by the hCaptcha API.\n * @see {@link https://docs.hcaptcha.com/#siteverify-error-codes-table}\n */\n 'error-codes': z.array(z.string()).optional(),\n /**\n * ENTERPRISE feature: a score denoting malicious activity. Value ranges from\n * 0.0 (no risk) to 1.0 (confirmed threat).\n */\n score: z.number().optional(),\n /**\n * ENTERPRISE feature: reason(s) for score.\n */\n score_reason: z.array(z.string()).optional(),\n /**\n * sitekey of the request\n */\n sitekey: z.string().optional(),\n /**\n * obj of form: {'ip_device': 1, .. etc}\n */\n behavior_counts: z.record(z.unknown()).optional(),\n /**\n * how similar is this? (0.0 - 1.0, -1 on err)\n */\n similarity: z.number().optional(),\n /**\n * count of similar_tokens not processed\n */\n similarity_failures: z.number().optional(),\n /**\n * array of strings for any similarity errors\n */\n similarity_error_details: z.array(z.string()).optional(),\n /**\n * encoded clientID\n */\n scoped_uid_0: z.string().optional(),\n /**\n * encoded IP\n */\n scoped_uid_1: z.string().optional(),\n /**\n * encoded IP (APT)\n */\n scoped_uid_2: z.string().optional(),\n /**\n * Risk Insights (APT + RI)\n */\n risk_insights: z.record(z.unknown()).optional(),\n /**\n * Advanced Threat Signatures (APT)\n */\n sigs: z.record(z.unknown()).optional(),\n /**\n * tags added via Rules\n */\n tags: z.array(z.string()).optional(),\n})\n\nexport type HcaptchaVerifyResult = z.infer<typeof hcaptchaVerifyResultSchema>\n\nexport type HcaptchaClientTokens = {\n hashedIp: string\n hashedHandle: string\n hashedUserAgent?: string\n}\n\nconst fetchSuccessHandler = pipe(\n fetchOkProcessor(),\n fetchJsonProcessor(),\n fetchJsonZodProcessor(hcaptchaVerifyResultSchema),\n)\n\nexport class HCaptchaClient {\n protected readonly fetch: FetchBound\n constructor(\n readonly hostname: string,\n readonly config: HcaptchaConfig,\n fetch: Fetch = globalThis.fetch,\n ) {\n this.fetch = bindFetch(fetch)\n }\n\n public async verify(\n behaviorType: 'login' | 'signup',\n response: string,\n remoteip: string,\n clientTokens: HcaptchaClientTokens,\n ) {\n return this.fetch('https://api.hcaptcha.com/siteverify', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n secret: this.config.secretKey,\n sitekey: this.config.siteKey,\n behavior_type: behaviorType,\n response,\n remoteip,\n client_tokens: JSON.stringify(clientTokens),\n }).toString(),\n }).then(fetchSuccessHandler)\n }\n\n public checkVerifyResult(\n result: HcaptchaVerifyResult,\n tokens: HcaptchaClientTokens,\n ): void {\n const { success, score } = result\n\n if (success !== true) {\n throw new HCaptchaVerifyError(\n result,\n tokens,\n 'Expected success to be true',\n )\n }\n\n // https://docs.hcaptcha.com/#verify-the-user-response-server-side\n\n // Please [...] note that the hostname field is derived from the user's\n // browser, and should not be used for authentication of any kind; it is\n // primarily useful as a statistical metric. Additionally, in the event that\n // your site experiences unusually high challenge traffic, the hostname\n // field may be returned as \"not-provided\" rather than the usual value; all\n // other fields will return their normal values.\n\n if (\n // Ignore if enterprise feature is not enabled\n score != null &&\n // Ignore if disabled through config\n this.config.scoreThreshold != null &&\n score >= this.config.scoreThreshold\n ) {\n throw new HCaptchaVerifyError(\n result,\n tokens,\n `Score ${score} is above the threshold ${this.config.scoreThreshold}`,\n )\n }\n }\n\n public buildClientTokens(\n remoteip: string,\n handle: string,\n userAgent?: string,\n ): HcaptchaClientTokens {\n return {\n hashedIp: this.hashToken(remoteip),\n hashedHandle: this.hashToken(handle),\n hashedUserAgent: userAgent ? this.hashToken(userAgent) : undefined,\n }\n }\n\n protected hashToken(value: string) {\n const hash = createHash('sha256')\n hash.update(this.config.tokenSalt)\n hash.update(value)\n return hash.digest().toString('base64')\n }\n}\n\nexport class HCaptchaVerifyError extends Error {\n constructor(\n readonly result: HcaptchaVerifyResult,\n readonly tokens: HcaptchaClientTokens,\n message?: string,\n ) {\n super(message)\n }\n}\n"]}
1
+ {"version":3,"file":"hcaptcha.js","sourceRoot":"","sources":["../../src/lib/hcaptcha.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto'\nimport { z } from 'zod'\nimport {\n type Fetch,\n type FetchBound,\n bindFetch,\n fetchJsonProcessor,\n fetchJsonZodProcessor,\n fetchOkProcessor,\n} from '@atproto-labs/fetch-node'\nimport { pipe } from '@atproto-labs/pipe'\n\nexport const hcaptchaTokenSchema = z.string().min(1)\nexport type HcaptchaToken = z.infer<typeof hcaptchaTokenSchema>\n\nexport const hcaptchaConfigSchema = z.object({\n /**\n * The hCaptcha site key to use for the sign-up form.\n */\n siteKey: z.string().min(1),\n /**\n * The hCaptcha secret key to use for the sign-up form.\n */\n secretKey: z.string().min(1),\n /**\n * A salt to use when hashing client tokens.\n */\n tokenSalt: z.string().min(1),\n /**\n * The risk score above which the user is considered a threat and will be\n * denied access. This will be ignored if the enterprise features are not\n * available.\n *\n * Note: Score values ranges from 0.0 (no risk) to 1.0 (confirmed threat).\n */\n scoreThreshold: z.number().optional(),\n})\nexport type HcaptchaConfig = z.infer<typeof hcaptchaConfigSchema>\n\n/**\n * @see {@link https://docs.hcaptcha.com/#verify-the-user-response-server-side hCaptcha API}\n */\nexport const hcaptchaVerifyResultSchema = z.object({\n /**\n * is the passcode valid, and does it meet security criteria you specified, e.g. sitekey?\n */\n success: z.boolean(),\n /**\n * timestamp of the challenge (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)\n */\n challenge_ts: z.string(),\n /**\n * the hostname of the site where the challenge was passed\n */\n hostname: z.string().nullable(),\n /**\n * optional: any error codes returned by the hCaptcha API.\n * @see {@link https://docs.hcaptcha.com/#siteverify-error-codes-table}\n */\n 'error-codes': z.array(z.string()).optional(),\n /**\n * ENTERPRISE feature: a score denoting malicious activity. Value ranges from\n * 0.0 (no risk) to 1.0 (confirmed threat).\n */\n score: z.number().optional(),\n /**\n * ENTERPRISE feature: reason(s) for score.\n */\n score_reason: z.array(z.string()).optional(),\n /**\n * sitekey of the request\n */\n sitekey: z.string().optional(),\n /**\n * obj of form: {'ip_device': 1, .. etc}\n */\n behavior_counts: z.record(z.unknown()).optional(),\n /**\n * how similar is this? (0.0 - 1.0, -1 on err)\n */\n similarity: z.number().optional(),\n /**\n * count of similar_tokens not processed\n */\n similarity_failures: z.number().optional(),\n /**\n * array of strings for any similarity errors\n */\n similarity_error_details: z.array(z.string()).optional(),\n /**\n * encoded clientID\n */\n scoped_uid_0: z.string().optional(),\n /**\n * encoded IP\n */\n scoped_uid_1: z.string().optional(),\n /**\n * encoded IP (APT)\n */\n scoped_uid_2: z.string().optional(),\n /**\n * Risk Insights (APT + RI)\n */\n risk_insights: z.record(z.unknown()).optional(),\n /**\n * Advanced Threat Signatures (APT)\n */\n sigs: z.record(z.unknown()).optional(),\n /**\n * tags added via Rules\n */\n tags: z.array(z.string()).optional(),\n})\n\nexport type HcaptchaVerifyResult = z.infer<typeof hcaptchaVerifyResultSchema>\n\nexport type HcaptchaClientTokens = {\n hashedIp: string\n hashedHandle: string\n hashedUserAgent?: string\n}\n\nconst fetchSuccessHandler = pipe(\n fetchOkProcessor(),\n fetchJsonProcessor(),\n fetchJsonZodProcessor(hcaptchaVerifyResultSchema),\n)\n\nexport class HCaptchaClient {\n protected readonly fetch: FetchBound\n constructor(\n readonly hostname: string,\n readonly config: HcaptchaConfig,\n fetch: Fetch = globalThis.fetch,\n ) {\n this.fetch = bindFetch(fetch)\n }\n\n public async verify(\n behaviorType: 'login' | 'signup',\n response: string,\n remoteip: string,\n clientTokens: HcaptchaClientTokens,\n ) {\n return this.fetch('https://api.hcaptcha.com/siteverify', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n secret: this.config.secretKey,\n sitekey: this.config.siteKey,\n behavior_type: behaviorType,\n response,\n remoteip,\n client_tokens: JSON.stringify(clientTokens),\n }).toString(),\n }).then(fetchSuccessHandler)\n }\n\n public checkVerifyResult(\n result: HcaptchaVerifyResult,\n tokens: HcaptchaClientTokens,\n ): void {\n const { success, score } = result\n\n if (success !== true) {\n throw new HCaptchaVerifyError(\n result,\n tokens,\n 'Expected success to be true',\n )\n }\n\n // https://docs.hcaptcha.com/#verify-the-user-response-server-side\n\n // Please [...] note that the hostname field is derived from the user's\n // browser, and should not be used for authentication of any kind; it is\n // primarily useful as a statistical metric. Additionally, in the event that\n // your site experiences unusually high challenge traffic, the hostname\n // field may be returned as \"not-provided\" rather than the usual value; all\n // other fields will return their normal values.\n\n if (\n // Ignore if enterprise feature is not enabled\n score != null &&\n // Ignore if disabled through config\n this.config.scoreThreshold != null &&\n score >= this.config.scoreThreshold\n ) {\n throw new HCaptchaVerifyError(\n result,\n tokens,\n `Score ${score} is above the threshold ${this.config.scoreThreshold}`,\n )\n }\n }\n\n public buildClientTokens(\n remoteip: string,\n handle: string,\n userAgent?: string,\n ): HcaptchaClientTokens {\n return {\n hashedIp: this.hashToken(remoteip),\n hashedHandle: this.hashToken(handle),\n hashedUserAgent: userAgent ? this.hashToken(userAgent) : undefined,\n }\n }\n\n protected hashToken(value: string) {\n const hash = createHash('sha256')\n hash.update(this.config.tokenSalt)\n hash.update(value)\n return hash.digest().toString('base64')\n }\n}\n\nexport class HCaptchaVerifyError extends Error {\n constructor(\n readonly result: HcaptchaVerifyResult,\n readonly tokens: HcaptchaClientTokens,\n message?: string,\n ) {\n super(message)\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { HtmlValue } from './escapers.js';
1
+ import type { HtmlValue } from './escapers.js';
2
2
  import { Html } from './html.js';
3
3
  export type AssetRef = {
4
4
  url: string;
@@ -1 +1 @@
1
- {"version":3,"file":"build-document.d.ts","sourceRoot":"","sources":["../../../src/lib/html/build-document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC,CAAA;AAEhE;;GAEG;AACH,QAAA,MAAM,uBAAuB,+RAwBlB,CAAA;AACX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAA;AAC9D,eAAO,MAAM,SAAS,QAAS,OAAO,KAAG,GAAG,IAAI,OACe,CAAA;AAE/D,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,OAAO,CAAA;CACb,CAAA;AACD,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAO7C,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE,KAAK,CAAA;IACjB,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,IAAI,CAAC,EAAE,SAAS,SAAS,EAAE,CAAA;IAC3B,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,CAAA;IAC5B,QAAQ,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAA;IAC9B,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,OAAO,CAAC,EAAE,SAAS,CAAC,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAA;IAClD,MAAM,CAAC,EAAE,SAAS,CAAC,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAA;IACjD,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,SAAS,CAAC,EAAE,KAAK,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,aAAa,+FAYvB,oBAAoB,SAcf,CAAA"}
1
+ {"version":3,"file":"build-document.d.ts","sourceRoot":"","sources":["../../../src/lib/html/build-document.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC,CAAA;AAEhE;;GAEG;AACH,QAAA,MAAM,uBAAuB,+RAwBlB,CAAA;AACX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAA;AAC9D,eAAO,MAAM,SAAS,QAAS,OAAO,KAAG,GAAG,IAAI,OACe,CAAA;AAE/D,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,OAAO,CAAA;CACb,CAAA;AACD,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAO7C,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,CAAC,EAAE,KAAK,CAAA;IACjB,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,IAAI,CAAC,EAAE,SAAS,SAAS,EAAE,CAAA;IAC3B,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,CAAA;IAC5B,QAAQ,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAA;IAC9B,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,OAAO,CAAC,EAAE,SAAS,CAAC,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAA;IAClD,MAAM,CAAC,EAAE,SAAS,CAAC,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAA;IACjD,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,SAAS,CAAC,EAAE,KAAK,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,aAAa,+FAYvB,oBAAoB,SAcf,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"build-document.js","sourceRoot":"","sources":["../../../src/lib/html/build-document.ts"],"names":[],"mappings":"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","sourcesContent":["import { HtmlValue } from './escapers.js'\nimport { Html } from './html.js'\nimport { html } from './tags.js'\n\nexport type AssetRef = {\n url: string\n}\n\nexport type Attrs = Record<string, boolean | string | undefined>\n\n/**\n * @see {@link https://developer.mozilla.org/fr/docs/Web/HTML/Attributes/rel}\n */\nconst ALLOWED_LINK_REL_VALUES = Object.freeze([\n 'alternate',\n 'author',\n 'canonical',\n 'dns-prefetch',\n 'external',\n 'expect',\n 'help',\n 'icon',\n 'license',\n 'manifest',\n 'me',\n 'modulepreload',\n 'next',\n 'pingback',\n 'preconnect',\n 'prefetch',\n 'preload',\n 'prerender',\n 'prev',\n 'privacy-policy',\n 'search',\n 'stylesheet',\n 'terms-of-service',\n] as const)\nexport type LinkRel = (typeof ALLOWED_LINK_REL_VALUES)[number]\nexport const isLinkRel = (rel: unknown): rel is LinkRel =>\n (ALLOWED_LINK_REL_VALUES as readonly unknown[]).includes(rel)\n\nexport type LinkAttrs = Attrs & {\n href: string\n rel: LinkRel\n}\nexport type MetaAttrs =\n | { name: string; content: string }\n | { 'http-equiv': string; content: string }\n\nconst defaultViewport = html`<meta\n name=\"viewport\"\n content=\"width=device-width, initial-scale=1.0\"\n/>`\n\nexport type BuildDocumentOptions = {\n htmlAttrs?: Attrs\n base?: URL\n meta?: readonly MetaAttrs[]\n links?: readonly LinkAttrs[]\n preloads?: readonly AssetRef[]\n head?: HtmlValue\n title?: HtmlValue\n scripts?: readonly (Html | AssetRef | undefined)[]\n styles?: readonly (Html | AssetRef | undefined)[]\n body?: HtmlValue\n bodyAttrs?: Attrs\n}\n\nexport const buildDocument = ({\n htmlAttrs,\n head,\n title,\n body,\n bodyAttrs,\n base,\n meta,\n links,\n preloads,\n scripts,\n styles,\n}: BuildDocumentOptions) => html`<!doctype html>\n<html${attrsToHtml(htmlAttrs)}>\n <head>\n <meta charset=\"UTF-8\" />\n ${title && html`<title>${title}</title>`}\n ${base && html`<base href=\"${base.href}\" />`}\n ${meta?.some(isViewportMeta) ? null : defaultViewport}\n ${meta?.map(metaToHtml)}\n ${preloads?.map(linkPreload)}\n ${links?.map(linkToHtml)}\n ${head}\n ${styles?.map(styleToHtml)}\n </head>\n <body${attrsToHtml(bodyAttrs)}>${body}${scripts?.map(scriptToHtml)}</body>\n</html>`\n\nfunction isViewportMeta<T extends MetaAttrs>(\n attrs: T,\n): attrs is T & { name: 'viewport' } {\n return 'name' in attrs && attrs.name === 'viewport'\n}\n\nfunction linkToHtml(attrs: LinkAttrs) {\n return html`<link${attrsToHtml(attrs)} />`\n}\n\nfunction metaToHtml(attrs: MetaAttrs) {\n return html`<meta${attrsToHtml(attrs)} />`\n}\n\nfunction* attrsToHtml(attrs?: Attrs) {\n if (attrs) {\n for (const [name, value] of Object.entries(attrs)) {\n if (value == null) continue\n else if (value === false) continue\n else if (value === true) yield html` ${name}`\n else yield html` ${name}=\"${value}\"`\n }\n }\n}\n\nfunction linkPreload(asset: AssetRef) {\n const [path] = asset.url.split('?', 2)\n\n if (path.endsWith('.js')) {\n return html`<link rel=\"modulepreload\" href=\"${asset.url}\" />`\n }\n\n if (path.endsWith('.css')) {\n return html`<link rel=\"preload\" href=\"${asset.url}\" as=\"style\" />`\n }\n\n return undefined\n}\n\nfunction scriptToHtml(script?: Html | AssetRef): Html | undefined {\n if (script == null) return undefined\n return script instanceof Html\n ? // prettier-ignore\n html`<script>${script}</script>` // hash validity requires no space around the content\n : html`<script type=\"module\" src=\"${script.url}\"></script>`\n}\n\nfunction styleToHtml(style?: Html | AssetRef): Html | undefined {\n if (style == null) return undefined\n return style instanceof Html\n ? // prettier-ignore\n html`<style>${style}</style>` // hash validity requires no space around the content\n : html`<link rel=\"stylesheet\" href=\"${style.url}\" />`\n}\n"]}
1
+ {"version":3,"file":"build-document.js","sourceRoot":"","sources":["../../../src/lib/html/build-document.ts"],"names":[],"mappings":"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","sourcesContent":["import type { HtmlValue } from './escapers.js'\nimport { Html } from './html.js'\nimport { html } from './tags.js'\n\nexport type AssetRef = {\n url: string\n}\n\nexport type Attrs = Record<string, boolean | string | undefined>\n\n/**\n * @see {@link https://developer.mozilla.org/fr/docs/Web/HTML/Attributes/rel}\n */\nconst ALLOWED_LINK_REL_VALUES = Object.freeze([\n 'alternate',\n 'author',\n 'canonical',\n 'dns-prefetch',\n 'external',\n 'expect',\n 'help',\n 'icon',\n 'license',\n 'manifest',\n 'me',\n 'modulepreload',\n 'next',\n 'pingback',\n 'preconnect',\n 'prefetch',\n 'preload',\n 'prerender',\n 'prev',\n 'privacy-policy',\n 'search',\n 'stylesheet',\n 'terms-of-service',\n] as const)\nexport type LinkRel = (typeof ALLOWED_LINK_REL_VALUES)[number]\nexport const isLinkRel = (rel: unknown): rel is LinkRel =>\n (ALLOWED_LINK_REL_VALUES as readonly unknown[]).includes(rel)\n\nexport type LinkAttrs = Attrs & {\n href: string\n rel: LinkRel\n}\nexport type MetaAttrs =\n | { name: string; content: string }\n | { 'http-equiv': string; content: string }\n\nconst defaultViewport = html`<meta\n name=\"viewport\"\n content=\"width=device-width, initial-scale=1.0\"\n/>`\n\nexport type BuildDocumentOptions = {\n htmlAttrs?: Attrs\n base?: URL\n meta?: readonly MetaAttrs[]\n links?: readonly LinkAttrs[]\n preloads?: readonly AssetRef[]\n head?: HtmlValue\n title?: HtmlValue\n scripts?: readonly (Html | AssetRef | undefined)[]\n styles?: readonly (Html | AssetRef | undefined)[]\n body?: HtmlValue\n bodyAttrs?: Attrs\n}\n\nexport const buildDocument = ({\n htmlAttrs,\n head,\n title,\n body,\n bodyAttrs,\n base,\n meta,\n links,\n preloads,\n scripts,\n styles,\n}: BuildDocumentOptions) => html`<!doctype html>\n<html${attrsToHtml(htmlAttrs)}>\n <head>\n <meta charset=\"UTF-8\" />\n ${title && html`<title>${title}</title>`}\n ${base && html`<base href=\"${base.href}\" />`}\n ${meta?.some(isViewportMeta) ? null : defaultViewport}\n ${meta?.map(metaToHtml)}\n ${preloads?.map(linkPreload)}\n ${links?.map(linkToHtml)}\n ${head}\n ${styles?.map(styleToHtml)}\n </head>\n <body${attrsToHtml(bodyAttrs)}>${body}${scripts?.map(scriptToHtml)}</body>\n</html>`\n\nfunction isViewportMeta<T extends MetaAttrs>(\n attrs: T,\n): attrs is T & { name: 'viewport' } {\n return 'name' in attrs && attrs.name === 'viewport'\n}\n\nfunction linkToHtml(attrs: LinkAttrs) {\n return html`<link${attrsToHtml(attrs)} />`\n}\n\nfunction metaToHtml(attrs: MetaAttrs) {\n return html`<meta${attrsToHtml(attrs)} />`\n}\n\nfunction* attrsToHtml(attrs?: Attrs) {\n if (attrs) {\n for (const [name, value] of Object.entries(attrs)) {\n if (value == null) continue\n else if (value === false) continue\n else if (value === true) yield html` ${name}`\n else yield html` ${name}=\"${value}\"`\n }\n }\n}\n\nfunction linkPreload(asset: AssetRef) {\n const [path] = asset.url.split('?', 2)\n\n if (path.endsWith('.js')) {\n return html`<link rel=\"modulepreload\" href=\"${asset.url}\" />`\n }\n\n if (path.endsWith('.css')) {\n return html`<link rel=\"preload\" href=\"${asset.url}\" as=\"style\" />`\n }\n\n return undefined\n}\n\nfunction scriptToHtml(script?: Html | AssetRef): Html | undefined {\n if (script == null) return undefined\n return script instanceof Html\n ? // prettier-ignore\n html`<script>${script}</script>` // hash validity requires no space around the content\n : html`<script type=\"module\" src=\"${script.url}\"></script>`\n}\n\nfunction styleToHtml(style?: Html | AssetRef): Html | undefined {\n if (style == null) return undefined\n return style instanceof Html\n ? // prettier-ignore\n html`<style>${style}</style>` // hash validity requires no space around the content\n : html`<link rel=\"stylesheet\" href=\"${style.url}\" />`\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { Html } from './html.js';
2
- import { NestedIterable } from './util.js';
2
+ import { type NestedIterable } from './util.js';
3
3
  export declare function javascriptEscaper(code: string): Generator<string, void, undefined>;
4
4
  export declare function jsonEscaper(value: unknown): Generator<string, void, undefined>;
5
5
  export declare function cssEscaper(css: string): Generator<string, void, undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"escapers.d.ts","sourceRoot":"","sources":["../../../src/lib/html/escapers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,cAAc,EAAkB,MAAM,WAAW,CAAA;AAE1D,wBAAiB,iBAAiB,CAAC,IAAI,EAAE,MAAM,sCAI9C;AAED,wBAAiB,WAAW,CAAC,KAAK,EAAE,OAAO,sCAO1C;AAED,wBAAiB,UAAU,CAAC,GAAG,EAAE,MAAM,sCAEtC;AAED,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;AACpE,MAAM,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,CAAC,CAAA;AAEpD,wBAAiB,WAAW,CAC1B,aAAa,EAAE,oBAAoB,EACnC,MAAM,EAAE,SAAS,SAAS,EAAE,GAC3B,SAAS,CAAC,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAO3C"}
1
+ {"version":3,"file":"escapers.d.ts","sourceRoot":"","sources":["../../../src/lib/html/escapers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,WAAW,CAAA;AAE/D,wBAAiB,iBAAiB,CAAC,IAAI,EAAE,MAAM,sCAI9C;AAED,wBAAiB,WAAW,CAAC,KAAK,EAAE,OAAO,sCAO1C;AAED,wBAAiB,UAAU,CAAC,GAAG,EAAE,MAAM,sCAEtC;AAED,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;AACpE,MAAM,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,CAAC,CAAA;AAEpD,wBAAiB,WAAW,CAC1B,aAAa,EAAE,oBAAoB,EACnC,MAAM,EAAE,SAAS,SAAS,EAAE,GAC3B,SAAS,CAAC,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAO3C"}
@@ -1 +1 @@
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
+ {"version":3,"file":"escapers.js","sourceRoot":"","sources":["../../../src/lib/html/escapers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAuB,cAAc,EAAE,MAAM,WAAW,CAAA;AAE/D,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 { type 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,4 +1,4 @@
1
- import { HtmlValue } from './escapers.js';
1
+ import { type HtmlValue } from './escapers.js';
2
2
  import { Html } from './html.js';
3
3
  export { type HtmlValue };
4
4
  export declare const html: (tpl: TemplateStringsArray, ...val: readonly HtmlValue[]) => Html;
@@ -1 +1 @@
1
- {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../../src/lib/html/tags.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAKV,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,KAAK,SAAS,EAAE,CAAA;AACzB,eAAO,MAAM,IAAI,QACV,oBAAoB,UACjB,SAAS,SAAS,EAAE,SAKqB,CAAA;AAEnD;;GAEG;AACH,eAAO,MAAM,cAAc,SAAU,MAAM,SACM,CAAA;AAEjD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,EAAE,QAAS,oBAAoB,UAAU,SAAS,OAAO,EAAE,SAIJ,CAAA;AAEpE;;;;GAIG;AACH,eAAO,MAAM,QAAQ,UAAW,OAAO,SACK,CAAA;AAE5C;;GAEG;AACH,eAAO,MAAM,GAAG,QAAS,oBAAoB,UAAU,SAAS,MAAM,EAAE,qBAIR,CAAA;AAEhE;;GAEG;AACH,eAAO,MAAM,OAAO,UAAW,MAAM,qBACwB,CAAA"}
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../../src/lib/html/tags.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAKf,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,KAAK,SAAS,EAAE,CAAA;AACzB,eAAO,MAAM,IAAI,QACV,oBAAoB,UACjB,SAAS,SAAS,EAAE,SAKqB,CAAA;AAEnD;;GAEG;AACH,eAAO,MAAM,cAAc,SAAU,MAAM,SACM,CAAA;AAEjD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,EAAE,QAAS,oBAAoB,UAAU,SAAS,OAAO,EAAE,SAIJ,CAAA;AAEpE;;;;GAIG;AACH,eAAO,MAAM,QAAQ,UAAW,OAAO,SACK,CAAA;AAE5C;;GAEG;AACH,eAAO,MAAM,GAAG,QAAS,oBAAoB,UAAU,SAAS,MAAM,EAAE,qBAIR,CAAA;AAEhE;;GAEG;AACH,eAAO,MAAM,OAAO,UAAW,MAAM,qBACwB,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { cssEscaper, htmlEscaper, javascriptEscaper, jsonEscaper, } from './escapers.js';
2
2
  import { Html } from './html.js';
3
+ export {};
3
4
  export const html = (tpl, ...val) => tpl.length === 1 && val.length === 0
4
5
  ? // Optimization for static HTML, avoid creating an iterable
5
6
  Html.dangerouslyCreate(tpl)
@@ -1 +1 @@
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
+ {"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;AAEhC,OAAO,EAAkB,CAAA;AACzB,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 type 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,6 +1,6 @@
1
1
  import type { IncomingMessage, ServerResponse } from 'node:http';
2
- import { SubCtx } from './context.js';
3
- import { Middleware, NextFunction } from './types.js';
2
+ import { type SubCtx } from './context.js';
3
+ import type { Middleware, NextFunction } from './types.js';
4
4
  type View<T extends object | void, D, Req extends IncomingMessage = IncomingMessage, Res extends ServerResponse = ServerResponse> = (this: SubCtx<T, {
5
5
  data: D;
6
6
  }>, req: Req, res: Res, next: NextFunction) => void | PromiseLike<void>;
@@ -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;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
+ {"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,KAAK,MAAM,EAAU,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE1D,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 +1 @@
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,QAAQ,GAAkB,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
+ {"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,EAAe,MAAM,EAAE,MAAM,cAAc,CAAA;AAelD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,gBAAgB,CAM9B,UAA+D,EAC/D,KAAoD,EACpD,QAAQ,GAAkB,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 { type SubCtx, subCtx } from './context.js'\nimport type { 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,5 +1,5 @@
1
1
  import type { IncomingMessage, ServerResponse } from 'node:http';
2
- import { Handler, Middleware, NextFunction } from './types.js';
2
+ import type { Handler, Middleware, NextFunction } from './types.js';
3
3
  export declare function combineMiddlewares<M extends Middleware<any, any, any>>(middlewares: Iterable<null | undefined | M>, options?: {
4
4
  skipKeyword?: string;
5
5
  }): M;
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/lib/http/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAGhE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAI9D,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACpE,WAAW,EAAE,QAAQ,CAAC,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC,EAC3C,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC,CAAC,CAAA;AAkCJ,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IACvD,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,GAC/C,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GACpB,KAAK,CAAA;AAEX;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC3D,UAAU,EAAE,CAAC,EACb,OAAO,CAAC,EAAE,mBAAmB,GASxB,SAAS,CAAC,CAAC,CAAC,CAClB;AAED,eAAO,MAAM,QAAQ,SAA4C,CAAA;AAEjE,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,YAAY,CAqBd"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/lib/http/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAGhE,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAInE,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACpE,WAAW,EAAE,QAAQ,CAAC,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC,EAC3C,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC,CAAC,CAAA;AAkCJ,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IACvD,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,GAC/C,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GACpB,KAAK,CAAA;AAEX;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC3D,UAAU,EAAE,CAAC,EACb,OAAO,CAAC,EAAE,mBAAmB,GASxB,SAAS,CAAC,CAAC,CAAC,CAClB;AAED,eAAO,MAAM,QAAQ,SAA4C,CAAA;AAEjE,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,YAAY,CAqBd"}
@@ -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 type { 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,6 +1,6 @@
1
1
  import type { IncomingMessage, ServerResponse } from 'node:http';
2
- import { CookieSerializeOptions } from 'cookie';
3
- import { UrlReference } from './url.js';
2
+ import { type CookieSerializeOptions } from 'cookie';
3
+ import { type UrlReference } from './url.js';
4
4
  export declare function validateHeaderValue(req: IncomingMessage, name: keyof IncomingMessage['headers'], allowedValues: readonly (string | null)[]): void;
5
5
  export declare function validateFetchMode(req: IncomingMessage, expectedMode: readonly (null | 'navigate' | 'same-origin' | 'no-cors' | 'cors')[]): void;
6
6
  export declare function validateFetchDest(req: IncomingMessage, expectedDest: readonly (null | 'document' | 'embed' | 'font' | 'image' | 'manifest' | 'media' | 'object' | 'report' | 'script' | 'serviceworker' | 'sharedworker' | 'style' | 'worker' | 'xslt')[]): void;
@@ -1 +1 @@
1
- {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/lib/http/request.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/lib/http/request.ts"],"names":[],"mappings":"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"}