@atproto/oauth-provider 0.13.1 → 0.13.3

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 (183) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/access-token/access-token-mode.js.map +1 -1
  3. package/dist/account/account-manager.d.ts.map +1 -1
  4. package/dist/account/account-manager.js +20 -2
  5. package/dist/account/account-manager.js.map +1 -1
  6. package/dist/account/account-store.d.ts +2 -2
  7. package/dist/account/account-store.d.ts.map +1 -1
  8. package/dist/account/account-store.js.map +1 -1
  9. package/dist/account/sign-in-data.js.map +1 -1
  10. package/dist/account/sign-up-input.js.map +1 -1
  11. package/dist/client/client-auth.js.map +1 -1
  12. package/dist/client/client-data.js.map +1 -1
  13. package/dist/client/client-id.js.map +1 -1
  14. package/dist/client/client-info.js.map +1 -1
  15. package/dist/client/client-manager.d.ts.map +1 -1
  16. package/dist/client/client-manager.js +31 -53
  17. package/dist/client/client-manager.js.map +1 -1
  18. package/dist/client/client-store.js.map +1 -1
  19. package/dist/client/client-utils.d.ts.map +1 -1
  20. package/dist/client/client-utils.js +1 -2
  21. package/dist/client/client-utils.js.map +1 -1
  22. package/dist/client/client.js.map +1 -1
  23. package/dist/constants.js.map +1 -1
  24. package/dist/customization/branding.js.map +1 -1
  25. package/dist/customization/build-customization-css.js.map +1 -1
  26. package/dist/customization/build-customization-data.js.map +1 -1
  27. package/dist/customization/colors.js.map +1 -1
  28. package/dist/customization/customization.js.map +1 -1
  29. package/dist/customization/links.js.map +1 -1
  30. package/dist/device/device-data.js.map +1 -1
  31. package/dist/device/device-id.js.map +1 -1
  32. package/dist/device/device-manager.d.ts +8 -8
  33. package/dist/device/device-manager.js.map +1 -1
  34. package/dist/device/device-store.js.map +1 -1
  35. package/dist/device/session-id.js.map +1 -1
  36. package/dist/dpop/dpop-manager.js.map +1 -1
  37. package/dist/dpop/dpop-nonce.js.map +1 -1
  38. package/dist/dpop/dpop-proof.js.map +1 -1
  39. package/dist/errors/access-denied-error.js.map +1 -1
  40. package/dist/errors/account-selection-required-error.js.map +1 -1
  41. package/dist/errors/authorization-error.js.map +1 -1
  42. package/dist/errors/consent-required-error.js.map +1 -1
  43. package/dist/errors/error-parser.js.map +1 -1
  44. package/dist/errors/handle-unavailable-error.js.map +1 -1
  45. package/dist/errors/invalid-authorization-details-error.js.map +1 -1
  46. package/dist/errors/invalid-client-error.js.map +1 -1
  47. package/dist/errors/invalid-client-id-error.js.map +1 -1
  48. package/dist/errors/invalid-client-metadata-error.js.map +1 -1
  49. package/dist/errors/invalid-dpop-key-binding-error.js.map +1 -1
  50. package/dist/errors/invalid-dpop-proof-error.js.map +1 -1
  51. package/dist/errors/invalid-grant-error.js.map +1 -1
  52. package/dist/errors/invalid-invite-code-error.js.map +1 -1
  53. package/dist/errors/invalid-redirect-uri-error.js.map +1 -1
  54. package/dist/errors/invalid-request-error.js.map +1 -1
  55. package/dist/errors/invalid-scope-error.js.map +1 -1
  56. package/dist/errors/invalid-token-error.js.map +1 -1
  57. package/dist/errors/login-required-error.js.map +1 -1
  58. package/dist/errors/oauth-error.js.map +1 -1
  59. package/dist/errors/second-authentication-factor-required-error.js.map +1 -1
  60. package/dist/errors/unauthorized-client-error.js.map +1 -1
  61. package/dist/errors/use-dpop-nonce-error.js.map +1 -1
  62. package/dist/errors/www-authenticate-error.js.map +1 -1
  63. package/dist/index.js.map +1 -1
  64. package/dist/lexicon/lexicon-data.js.map +1 -1
  65. package/dist/lexicon/lexicon-getter.js.map +1 -1
  66. package/dist/lexicon/lexicon-manager.js.map +1 -1
  67. package/dist/lexicon/lexicon-store.js.map +1 -1
  68. package/dist/lib/csp/index.js.map +1 -1
  69. package/dist/lib/hcaptcha.js.map +1 -1
  70. package/dist/lib/html/build-document.js.map +1 -1
  71. package/dist/lib/html/escapers.js.map +1 -1
  72. package/dist/lib/html/html.js.map +1 -1
  73. package/dist/lib/html/hydration-data.js.map +1 -1
  74. package/dist/lib/html/index.js.map +1 -1
  75. package/dist/lib/html/tags.js.map +1 -1
  76. package/dist/lib/html/util.js.map +1 -1
  77. package/dist/lib/http/accept.js.map +1 -1
  78. package/dist/lib/http/context.js.map +1 -1
  79. package/dist/lib/http/headers.js.map +1 -1
  80. package/dist/lib/http/index.js.map +1 -1
  81. package/dist/lib/http/method.js.map +1 -1
  82. package/dist/lib/http/middleware.js.map +1 -1
  83. package/dist/lib/http/parser.js.map +1 -1
  84. package/dist/lib/http/path.js.map +1 -1
  85. package/dist/lib/http/request.js.map +1 -1
  86. package/dist/lib/http/response.js.map +1 -1
  87. package/dist/lib/http/route.js.map +1 -1
  88. package/dist/lib/http/router.js.map +1 -1
  89. package/dist/lib/http/security-headers.js.map +1 -1
  90. package/dist/lib/http/stream.js.map +1 -1
  91. package/dist/lib/http/types.js.map +1 -1
  92. package/dist/lib/http/url.js.map +1 -1
  93. package/dist/lib/nsid.js.map +1 -1
  94. package/dist/lib/redis.js.map +1 -1
  95. package/dist/lib/send-web-page.js.map +1 -1
  96. package/dist/lib/util/authorization-header.js.map +1 -1
  97. package/dist/lib/util/cast.js.map +1 -1
  98. package/dist/lib/util/color.js.map +1 -1
  99. package/dist/lib/util/crypto.js.map +1 -1
  100. package/dist/lib/util/date.js.map +1 -1
  101. package/dist/lib/util/error.js.map +1 -1
  102. package/dist/lib/util/function.js.map +1 -1
  103. package/dist/lib/util/locale.js.map +1 -1
  104. package/dist/lib/util/redirect-uri.js.map +1 -1
  105. package/dist/lib/util/time.js.map +1 -1
  106. package/dist/lib/util/type.js.map +1 -1
  107. package/dist/lib/util/ui8.js.map +1 -1
  108. package/dist/lib/util/well-known.js.map +1 -1
  109. package/dist/lib/util/zod-error.js.map +1 -1
  110. package/dist/metadata/build-metadata.js +4 -3
  111. package/dist/metadata/build-metadata.js.map +1 -1
  112. package/dist/oauth-client.js.map +1 -1
  113. package/dist/oauth-dpop.js.map +1 -1
  114. package/dist/oauth-errors.js.map +1 -1
  115. package/dist/oauth-hooks.d.ts +20 -0
  116. package/dist/oauth-hooks.d.ts.map +1 -1
  117. package/dist/oauth-hooks.js.map +1 -1
  118. package/dist/oauth-middleware.js.map +1 -1
  119. package/dist/oauth-provider.d.ts +128 -98
  120. package/dist/oauth-provider.d.ts.map +1 -1
  121. package/dist/oauth-provider.js.map +1 -1
  122. package/dist/oauth-store.js.map +1 -1
  123. package/dist/oauth-verifier.js.map +1 -1
  124. package/dist/oidc/sub.js.map +1 -1
  125. package/dist/replay/replay-manager.js.map +1 -1
  126. package/dist/replay/replay-store-memory.js.map +1 -1
  127. package/dist/replay/replay-store-redis.js.map +1 -1
  128. package/dist/replay/replay-store.js.map +1 -1
  129. package/dist/request/code.js.map +1 -1
  130. package/dist/request/request-data.js.map +1 -1
  131. package/dist/request/request-id.js.map +1 -1
  132. package/dist/request/request-manager.d.ts +18 -18
  133. package/dist/request/request-manager.d.ts.map +1 -1
  134. package/dist/request/request-manager.js.map +1 -1
  135. package/dist/request/request-store.js.map +1 -1
  136. package/dist/request/request-uri.js.map +1 -1
  137. package/dist/result/authorization-redirect-parameters.js.map +1 -1
  138. package/dist/result/authorization-result-authorize-page.js.map +1 -1
  139. package/dist/result/authorization-result-redirect.js.map +1 -1
  140. package/dist/router/assets/assets-manifest.js.map +1 -1
  141. package/dist/router/assets/assets.js.map +1 -1
  142. package/dist/router/assets/csrf.js.map +1 -1
  143. package/dist/router/assets/send-account-page.js.map +1 -1
  144. package/dist/router/assets/send-authorization-page.js.map +1 -1
  145. package/dist/router/assets/send-error-page.js.map +1 -1
  146. package/dist/router/create-account-page-middleware.js.map +1 -1
  147. package/dist/router/create-api-middleware.js.map +1 -1
  148. package/dist/router/create-authorization-page-middleware.js.map +1 -1
  149. package/dist/router/create-oauth-middleware.js.map +1 -1
  150. package/dist/router/error-handler.js.map +1 -1
  151. package/dist/router/middleware-options.js.map +1 -1
  152. package/dist/router/send-redirect.js.map +1 -1
  153. package/dist/signer/access-token-payload.d.ts +4113 -1362
  154. package/dist/signer/access-token-payload.d.ts.map +1 -1
  155. package/dist/signer/access-token-payload.js.map +1 -1
  156. package/dist/signer/api-token-payload.d.ts +3974 -1223
  157. package/dist/signer/api-token-payload.d.ts.map +1 -1
  158. package/dist/signer/api-token-payload.js.map +1 -1
  159. package/dist/signer/signer.d.ts +46 -26
  160. package/dist/signer/signer.d.ts.map +1 -1
  161. package/dist/signer/signer.js.map +1 -1
  162. package/dist/token/refresh-token.js.map +1 -1
  163. package/dist/token/token-claims.js.map +1 -1
  164. package/dist/token/token-data.js.map +1 -1
  165. package/dist/token/token-id.js.map +1 -1
  166. package/dist/token/token-manager.js.map +1 -1
  167. package/dist/token/token-store.js.map +1 -1
  168. package/dist/types/authorization-response-error.js.map +1 -1
  169. package/dist/types/color-hue.js.map +1 -1
  170. package/dist/types/email-otp.js.map +1 -1
  171. package/dist/types/email.js.map +1 -1
  172. package/dist/types/handle.js.map +1 -1
  173. package/dist/types/invite-code.js.map +1 -1
  174. package/dist/types/par-response-error.js.map +1 -1
  175. package/dist/types/password.js.map +1 -1
  176. package/dist/types/rgb-color.js.map +1 -1
  177. package/package.json +11 -11
  178. package/src/account/account-manager.ts +24 -2
  179. package/src/account/account-store.ts +7 -2
  180. package/src/client/client-manager.ts +41 -71
  181. package/src/client/client-utils.ts +1 -1
  182. package/src/metadata/build-metadata.ts +4 -4
  183. package/src/oauth-hooks.ts +22 -0
@@ -1 +1 @@
1
- {"version":3,"file":"invalid-token-error.js","sourceRoot":"","sources":["../../src/errors/invalid-token-error.ts"],"names":[],"mappings":";;;AAAA,+BAA6B;AAC7B,6BAA8B;AAC9B,sCAA6C;AAC7C,qDAA6C;AAC7C,2EAAkE;AAElE,MAAM,EAAE,SAAS,EAAE,GAAG,aAAM,CAAA;AAE5B;;;;;;;;GAQG;AACH,MAAa,iBAAkB,SAAQ,gDAAoB;IA8B9C;IA7BX,MAAM,CAAC,IAAI,CACT,GAAY,EACZ,SAAiB,EACjB,eAAe,GAAG,eAAe;QAEjC,IAAI,GAAG,YAAY,iBAAiB,EAAE,CAAC;YACrC,OAAO,GAAG,CAAA;QACZ,CAAC;QAED,IAAI,GAAG,YAAY,2BAAU,EAAE,CAAC;YAC9B,OAAO,IAAI,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAA;QACrE,CAAC;QAED,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;YAC7B,OAAO,IAAI,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC3D,CAAC;QAED,IAAI,GAAG,YAAY,oBAAc,EAAE,CAAC;YAClC,OAAO,IAAI,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC3D,CAAC;QAED,IAAI,GAAG,YAAY,cAAQ,EAAE,CAAC;YAC5B,OAAO,IAAI,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC3D,CAAC;QAED,OAAO,IAAI,iBAAiB,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,CAAC,CAAA;IAC/D,CAAC;IAED,YACW,SAAiB,EAC1B,iBAAyB,EACzB,KAAe;QAEf,MAAM,KAAK,GAAG,eAAe,CAAA;QAC7B,KAAK,CACH,KAAK,EACL,iBAAiB,EACjB,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAC7C,KAAK,CACN,CAAA;QAVQ,cAAS,GAAT,SAAS,CAAQ;IAW5B,CAAC;CACF;AA1CD,8CA0CC"}
1
+ {"version":3,"file":"invalid-token-error.js","sourceRoot":"","sources":["../../src/errors/invalid-token-error.ts"],"names":[],"mappings":";;;AAAA,+BAA6B;AAC7B,6BAA8B;AAC9B,sCAA6C;AAC7C,qDAA6C;AAC7C,2EAAkE;AAElE,MAAM,EAAE,SAAS,EAAE,GAAG,aAAM,CAAA;AAE5B;;;;;;;;GAQG;AACH,MAAa,iBAAkB,SAAQ,gDAAoB;IA8B9C;IA7BX,MAAM,CAAC,IAAI,CACT,GAAY,EACZ,SAAiB,EACjB,eAAe,GAAG,eAAe;QAEjC,IAAI,GAAG,YAAY,iBAAiB,EAAE,CAAC;YACrC,OAAO,GAAG,CAAA;QACZ,CAAC;QAED,IAAI,GAAG,YAAY,2BAAU,EAAE,CAAC;YAC9B,OAAO,IAAI,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAA;QACrE,CAAC;QAED,IAAI,GAAG,YAAY,SAAS,EAAE,CAAC;YAC7B,OAAO,IAAI,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC3D,CAAC;QAED,IAAI,GAAG,YAAY,oBAAc,EAAE,CAAC;YAClC,OAAO,IAAI,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC3D,CAAC;QAED,IAAI,GAAG,YAAY,cAAQ,EAAE,CAAC;YAC5B,OAAO,IAAI,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC3D,CAAC;QAED,OAAO,IAAI,iBAAiB,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,CAAC,CAAA;IAC/D,CAAC;IAED,YACW,SAAiB,EAC1B,iBAAyB,EACzB,KAAe;QAEf,MAAM,KAAK,GAAG,eAAe,CAAA;QAC7B,KAAK,CACH,KAAK,EACL,iBAAiB,EACjB,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAC7C,KAAK,CACN,CAAA;QAVQ,cAAS,GAAT,SAAS,CAAQ;IAW5B,CAAC;CACF;AA1CD,8CA0CC","sourcesContent":["import { errors } from 'jose'\nimport { ZodError } from 'zod'\nimport { JwtVerifyError } from '@atproto/jwk'\nimport { OAuthError } from './oauth-error.js'\nimport { WWWAuthenticateError } from './www-authenticate-error.js'\n\nconst { JOSEError } = errors\n\n/**\n * @see\n * {@link https://datatracker.ietf.org/doc/html/rfc6750#section-3.1 | RFC6750 - The WWW-Authenticate Response Header Field }\n *\n * The access token provided is expired, revoked, malformed, or invalid for\n * other reasons. The resource SHOULD respond with the HTTP 401 (Unauthorized)\n * status code. The client MAY request a new access token and retry the\n * protected resource request.\n */\nexport class InvalidTokenError extends WWWAuthenticateError {\n static from(\n err: unknown,\n tokenType: string,\n fallbackMessage = 'Invalid token',\n ): InvalidTokenError {\n if (err instanceof InvalidTokenError) {\n return err\n }\n\n if (err instanceof OAuthError) {\n return new InvalidTokenError(tokenType, err.error_description, err)\n }\n\n if (err instanceof JOSEError) {\n return new InvalidTokenError(tokenType, err.message, err)\n }\n\n if (err instanceof JwtVerifyError) {\n return new InvalidTokenError(tokenType, err.message, err)\n }\n\n if (err instanceof ZodError) {\n return new InvalidTokenError(tokenType, err.message, err)\n }\n\n return new InvalidTokenError(tokenType, fallbackMessage, err)\n }\n\n constructor(\n readonly tokenType: string,\n error_description: string,\n cause?: unknown,\n ) {\n const error = 'invalid_token'\n super(\n error,\n error_description,\n { [tokenType]: { error, error_description } },\n cause,\n )\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"login-required-error.js","sourceRoot":"","sources":["../../src/errors/login-required-error.ts"],"names":[],"mappings":";;;AACA,qEAA6D;AAE7D,MAAa,kBAAmB,SAAQ,2CAAkB;IACxD,YACE,UAA+C,EAC/C,iBAAiB,GAAG,mBAAmB,EACvC,KAAe;QAEf,KAAK,CAAC,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAA;IAC/D,CAAC;CACF;AARD,gDAQC"}
1
+ {"version":3,"file":"login-required-error.js","sourceRoot":"","sources":["../../src/errors/login-required-error.ts"],"names":[],"mappings":";;;AACA,qEAA6D;AAE7D,MAAa,kBAAmB,SAAQ,2CAAkB;IACxD,YACE,UAA+C,EAC/C,iBAAiB,GAAG,mBAAmB,EACvC,KAAe;QAEf,KAAK,CAAC,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAA;IAC/D,CAAC;CACF;AARD,gDAQC","sourcesContent":["import { OAuthAuthorizationRequestParameters } from '@atproto/oauth-types'\nimport { AuthorizationError } from './authorization-error.js'\n\nexport class LoginRequiredError extends AuthorizationError {\n constructor(\n parameters: OAuthAuthorizationRequestParameters,\n error_description = 'Login is required',\n cause?: unknown,\n ) {\n super(parameters, error_description, 'login_required', cause)\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-error.js","sourceRoot":"","sources":["../../src/errors/oauth-error.ts"],"names":[],"mappings":";;;AAAA,MAAa,UAAW,SAAQ,KAAK;IAIjB;IACA;IACA;IALX,MAAM,CAAS;IAEtB,YACkB,KAAa,EACb,iBAAyB,EACzB,SAAS,GAAG,EAC5B,KAAe;QAEf,KAAK,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QALnB,UAAK,GAAL,KAAK,CAAQ;QACb,sBAAiB,GAAjB,iBAAiB,CAAQ;QACzB,WAAM,GAAN,MAAM,CAAM;QAK5B,KAAK,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QAEjD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,GAAG,GAAG,CAAA;IAC5B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,MAAM;QACJ,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;SAC1C,CAAA;IACH,CAAC;CACF;AA3BD,gCA2BC"}
1
+ {"version":3,"file":"oauth-error.js","sourceRoot":"","sources":["../../src/errors/oauth-error.ts"],"names":[],"mappings":";;;AAAA,MAAa,UAAW,SAAQ,KAAK;IAIjB;IACA;IACA;IALX,MAAM,CAAS;IAEtB,YACkB,KAAa,EACb,iBAAyB,EACzB,SAAS,GAAG,EAC5B,KAAe;QAEf,KAAK,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QALnB,UAAK,GAAL,KAAK,CAAQ;QACb,sBAAiB,GAAjB,iBAAiB,CAAQ;QACzB,WAAM,GAAN,MAAM,CAAM;QAK5B,KAAK,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QAEjD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,GAAG,GAAG,CAAA;IAC5B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,MAAM;QACJ,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;SAC1C,CAAA;IACH,CAAC;CACF;AA3BD,gCA2BC","sourcesContent":["export class OAuthError extends Error {\n public expose: boolean\n\n constructor(\n public readonly error: string,\n public readonly error_description: string,\n public readonly status = 400,\n cause?: unknown,\n ) {\n super(error_description, { cause })\n\n Error.captureStackTrace?.(this, this.constructor)\n\n this.name = this.constructor.name\n this.expose = status < 500\n }\n\n get statusCode() {\n return this.status\n }\n\n toJSON() {\n return {\n error: this.error,\n error_description: this.error_description,\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"second-authentication-factor-required-error.js","sourceRoot":"","sources":["../../src/errors/second-authentication-factor-required-error.ts"],"names":[],"mappings":";;;AAAA,qDAA6C;AAE7C,MAAa,uCAAwC,SAAQ,2BAAU;IAE5D;IACA;IAFT,YACS,IAAgB,EAChB,IAAY,EACnB,KAAe;QAEf,MAAM,KAAK,GAAG,uCAAuC,CAAA;QACrD,KAAK,CACH,KAAK,EACL,GAAG,IAAI,0CAA0C,IAAI,GAAG,EACxD,GAAG,EACH,KAAK,CACN,CAAA;QAVM,SAAI,GAAJ,IAAI,CAAY;QAChB,SAAI,GAAJ,IAAI,CAAQ;IAUrB,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;SACP,CAAA;IACZ,CAAC;CACF;AAtBD,0FAsBC"}
1
+ {"version":3,"file":"second-authentication-factor-required-error.js","sourceRoot":"","sources":["../../src/errors/second-authentication-factor-required-error.ts"],"names":[],"mappings":";;;AAAA,qDAA6C;AAE7C,MAAa,uCAAwC,SAAQ,2BAAU;IAE5D;IACA;IAFT,YACS,IAAgB,EAChB,IAAY,EACnB,KAAe;QAEf,MAAM,KAAK,GAAG,uCAAuC,CAAA;QACrD,KAAK,CACH,KAAK,EACL,GAAG,IAAI,0CAA0C,IAAI,GAAG,EACxD,GAAG,EACH,KAAK,CACN,CAAA;QAVM,SAAI,GAAJ,IAAI,CAAY;QAChB,SAAI,GAAJ,IAAI,CAAQ;IAUrB,CAAC;IAED,MAAM;QACJ,OAAO;YACL,GAAG,KAAK,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;SACP,CAAA;IACZ,CAAC;CACF;AAtBD,0FAsBC","sourcesContent":["import { OAuthError } from './oauth-error.js'\n\nexport class SecondAuthenticationFactorRequiredError extends OAuthError {\n constructor(\n public type: 'emailOtp',\n public hint: string,\n cause?: unknown,\n ) {\n const error = 'second_authentication_factor_required'\n super(\n error,\n `${type} authentication factor required (hint: ${hint})`,\n 401,\n cause,\n )\n }\n\n toJSON() {\n return {\n ...super.toJSON(),\n type: this.type,\n hint: this.hint,\n } as const\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"unauthorized-client-error.js","sourceRoot":"","sources":["../../src/errors/unauthorized-client-error.ts"],"names":[],"mappings":";;;AAAA,qDAA6C;AAE7C;;;;;;;;;;;;GAYG;AACH,MAAa,uBAAwB,SAAQ,2BAAU;IACrD,YAAY,iBAAyB,EAAE,KAAe;QACpD,KAAK,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IAC7D,CAAC;CACF;AAJD,0DAIC"}
1
+ {"version":3,"file":"unauthorized-client-error.js","sourceRoot":"","sources":["../../src/errors/unauthorized-client-error.ts"],"names":[],"mappings":";;;AAAA,qDAA6C;AAE7C;;;;;;;;;;;;GAYG;AACH,MAAa,uBAAwB,SAAQ,2BAAU;IACrD,YAAY,iBAAyB,EAAE,KAAe;QACpD,KAAK,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IAC7D,CAAC;CACF;AAJD,0DAIC","sourcesContent":["import { OAuthError } from './oauth-error.js'\n\n/**\n * @see\n * {@link https://datatracker.ietf.org/doc/html/rfc6749#section-5.2 | RFC6749 - Issuing an Access Token }\n *\n * The authenticated client is not authorized to use this authorization grant\n * type.\n *\n * @see\n * {@link https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.2.1 | RFC6749 - Authorization Code Grant, Authorization Request}\n *\n * The client is not authorized to request an authorization code using this\n * method.\n */\nexport class UnauthorizedClientError extends OAuthError {\n constructor(error_description: string, cause?: unknown) {\n super('unauthorized_client', error_description, 400, cause)\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"use-dpop-nonce-error.js","sourceRoot":"","sources":["../../src/errors/use-dpop-nonce-error.ts"],"names":[],"mappings":";;;AAAA,qDAA6C;AAC7C,2EAAkE;AAElE;;;GAGG;AACH,MAAa,iBAAkB,SAAQ,2BAAU;IAC/C,YACE,iBAAiB,GAAG,mDAAmD,EACvE,KAAe;QAEf,KAAK,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IACxD,CAAC;IAED;;;;;;OAMG;IACH,sBAAsB;QACpB,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAA;QACzC,OAAO,IAAI,gDAAoB,CAC7B,KAAK,EACL,iBAAiB,EACjB,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,EACtC,IAAI,CACL,CAAA;IACH,CAAC;CACF;AAxBD,8CAwBC"}
1
+ {"version":3,"file":"use-dpop-nonce-error.js","sourceRoot":"","sources":["../../src/errors/use-dpop-nonce-error.ts"],"names":[],"mappings":";;;AAAA,qDAA6C;AAC7C,2EAAkE;AAElE;;;GAGG;AACH,MAAa,iBAAkB,SAAQ,2BAAU;IAC/C,YACE,iBAAiB,GAAG,mDAAmD,EACvE,KAAe;QAEf,KAAK,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IACxD,CAAC;IAED;;;;;;OAMG;IACH,sBAAsB;QACpB,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAA;QACzC,OAAO,IAAI,gDAAoB,CAC7B,KAAK,EACL,iBAAiB,EACjB,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,EACtC,IAAI,CACL,CAAA;IACH,CAAC;CACF;AAxBD,8CAwBC","sourcesContent":["import { OAuthError } from './oauth-error.js'\nimport { WWWAuthenticateError } from './www-authenticate-error.js'\n\n/**\n * @see\n * {@link https://datatracker.ietf.org/doc/html/rfc9449#section-8 | RFC9449 - Section 8. Authorization Server-Provided Nonce}\n */\nexport class UseDpopNonceError extends OAuthError {\n constructor(\n error_description = 'Authorization server requires nonce in DPoP proof',\n cause?: unknown,\n ) {\n super('use_dpop_nonce', error_description, 400, cause)\n }\n\n /**\n * Convert this error into an error meant to be used as \"Resource\n * Server-Provided Nonce\" error.\n *\n * @see\n * {@link https://datatracker.ietf.org/doc/html/rfc9449#section-9 | RFC9449 - Section 9. Resource Server-Provided Nonce}\n */\n toWwwAuthenticateError(): WWWAuthenticateError {\n const { error, error_description } = this\n return new WWWAuthenticateError(\n error,\n error_description,\n { DPoP: { error, error_description } },\n this,\n )\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"www-authenticate-error.js","sourceRoot":"","sources":["../../src/errors/www-authenticate-error.ts"],"names":[],"mappings":";;;AAAA,qDAAoD;AACpD,qDAA6C;AAK7C,MAAa,oBAAqB,SAAQ,2BAAU;IAClC,eAAe,CAAiB;IAEhD,YACE,KAAa,EACb,iBAAyB,EACzB,eAAgC,EAChC,KAAe;QAEf,KAAK,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAE3C,IAAI,CAAC,eAAe;YAClB,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI;gBAC7B,CAAC,CAAC;oBACE,GAAG,eAAe;oBAClB,IAAI,EAAE,EAAE,IAAI,EAAE,wBAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,EAAE;iBACnE;gBACH,CAAC,CAAC,eAAe,CAAA;IACvB,CAAC;IAED,IAAI,qBAAqB;QACvB,OAAO,2BAA2B,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC1D,CAAC;CACF;AAvBD,oDAuBC;AAED,SAAS,2BAA2B,CAAC,eAAgC;IACnE,OAAO,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;SACnC,MAAM,CAAC,sBAAsB,CAAC;SAC9B,GAAG,CAAC,4BAA4B,CAAC;SACjC,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAGD,SAAS,sBAAsB,CAC7B,KAAwB;IAExB,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,KAAK,CAAA;IACvB,OAAO,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAA;AACnD,CAAC;AAED,SAAS,4BAA4B,CAAC,CAAC,IAAI,EAAE,MAAM,CAAuB;IACxE,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SACrC,MAAM,CAAC,YAAY,CAAC;SACpB,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAE1B,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACpE,CAAC;AAID,SAAS,YAAY,CAAC,KAAwB;IAC5C,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,KAAK,CAAA;IACvB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC1E,CAAC;AAED,SAAS,kBAAkB,CAAC,CAAC,IAAI,EAAE,KAAK,CAAa;IACnD,OAAO,GAAG,IAAI,KAAK,KAAK,GAAG,CAAA;AAC7B,CAAC"}
1
+ {"version":3,"file":"www-authenticate-error.js","sourceRoot":"","sources":["../../src/errors/www-authenticate-error.ts"],"names":[],"mappings":";;;AAAA,qDAAoD;AACpD,qDAA6C;AAK7C,MAAa,oBAAqB,SAAQ,2BAAU;IAClC,eAAe,CAAiB;IAEhD,YACE,KAAa,EACb,iBAAyB,EACzB,eAAgC,EAChC,KAAe;QAEf,KAAK,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;QAE3C,IAAI,CAAC,eAAe;YAClB,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI;gBAC7B,CAAC,CAAC;oBACE,GAAG,eAAe;oBAClB,IAAI,EAAE,EAAE,IAAI,EAAE,wBAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,EAAE;iBACnE;gBACH,CAAC,CAAC,eAAe,CAAA;IACvB,CAAC;IAED,IAAI,qBAAqB;QACvB,OAAO,2BAA2B,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IAC1D,CAAC;CACF;AAvBD,oDAuBC;AAED,SAAS,2BAA2B,CAAC,eAAgC;IACnE,OAAO,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;SACnC,MAAM,CAAC,sBAAsB,CAAC;SAC9B,GAAG,CAAC,4BAA4B,CAAC;SACjC,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAGD,SAAS,sBAAsB,CAC7B,KAAwB;IAExB,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,KAAK,CAAA;IACvB,OAAO,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAA;AACnD,CAAC;AAED,SAAS,4BAA4B,CAAC,CAAC,IAAI,EAAE,MAAM,CAAuB;IACxE,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SACrC,MAAM,CAAC,YAAY,CAAC;SACpB,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAE1B,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACpE,CAAC;AAID,SAAS,YAAY,CAAC,KAAwB;IAC5C,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,KAAK,CAAA;IACvB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC1E,CAAC;AAED,SAAS,kBAAkB,CAAC,CAAC,IAAI,EAAE,KAAK,CAAa;IACnD,OAAO,GAAG,IAAI,KAAK,KAAK,GAAG,CAAA;AAC7B,CAAC","sourcesContent":["import { VERIFY_ALGOS } from '../lib/util/crypto.js'\nimport { OAuthError } from './oauth-error.js'\n\nexport type WWWAuthenticateParams = Record<string, string | undefined>\nexport type WWWAuthenticate = Record<string, undefined | WWWAuthenticateParams>\n\nexport class WWWAuthenticateError extends OAuthError {\n public readonly wwwAuthenticate: WWWAuthenticate\n\n constructor(\n error: string,\n error_description: string,\n wwwAuthenticate: WWWAuthenticate,\n cause?: unknown,\n ) {\n super(error, error_description, 401, cause)\n\n this.wwwAuthenticate =\n wwwAuthenticate['DPoP'] != null\n ? {\n ...wwwAuthenticate,\n DPoP: { algs: VERIFY_ALGOS.join(' '), ...wwwAuthenticate['DPoP'] },\n }\n : wwwAuthenticate\n }\n\n get wwwAuthenticateHeader() {\n return formatWWWAuthenticateHeader(this.wwwAuthenticate)\n }\n}\n\nfunction formatWWWAuthenticateHeader(wwwAuthenticate: WWWAuthenticate): string {\n return Object.entries(wwwAuthenticate)\n .filter(isWWWAuthenticateEntry)\n .map(wwwAuthenticateEntryToString)\n .join(', ')\n}\n\ntype WWWAuthenticateEntry = [type: string, params: WWWAuthenticateParams]\nfunction isWWWAuthenticateEntry(\n entry: [string, unknown],\n): entry is WWWAuthenticateEntry {\n const [, value] = entry\n return value != null && typeof value === 'object'\n}\n\nfunction wwwAuthenticateEntryToString([type, params]: WWWAuthenticateEntry) {\n const paramsEnc = Object.entries(params)\n .filter(isParamEntry)\n .map(paramEntryToString)\n\n return paramsEnc.length ? `${type} ${paramsEnc.join(', ')}` : type\n}\n\ntype ParamEntry = [name: string, value: string]\n\nfunction isParamEntry(entry: [string, unknown]): entry is ParamEntry {\n const [, value] = entry\n return typeof value === 'string' && value !== '' && !value.includes('\"')\n}\n\nfunction paramEntryToString([name, value]: ParamEntry): string {\n return `${name}=\"${value}\"`\n}\n"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAqD;AACrD,sDAAmC;AACnC,2DAAwC;AACxC,+CAA4B;AAC5B,oDAAiC;AACjC,uDAAoC;AAEpC,iDAA8B;AAC9B,oDAAiC;AACjC,kDAA+B;AAC/B,oDAAiC;AACjC,mDAAgC;AAChC,wDAAqC;AACrC,sDAAmC;AACnC,mDAAgC;AAChC,sDAAmC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAqD;AACrD,sDAAmC;AACnC,2DAAwC;AACxC,+CAA4B;AAC5B,oDAAiC;AACjC,uDAAoC;AAEpC,iDAA8B;AAC9B,oDAAiC;AACjC,kDAA+B;AAC/B,oDAAiC;AACjC,mDAAgC;AAChC,wDAAqC;AACrC,sDAAmC;AACnC,mDAAgC;AAChC,sDAAmC","sourcesContent":["// Avoid having to explicitly depend sub dependencies\nexport * from '@atproto-labs/fetch'\nexport * from '@atproto-labs/fetch-node'\nexport * from '@atproto/jwk'\nexport * from '@atproto/jwk-jose'\nexport * from '@atproto/oauth-types'\n\nexport * from './constants.js'\nexport * from './oauth-client.js'\nexport * from './oauth-dpop.js'\nexport * from './oauth-errors.js'\nexport * from './oauth-hooks.js'\nexport * from './oauth-middleware.js'\nexport * from './oauth-provider.js'\nexport * from './oauth-store.js'\nexport * from './oauth-verifier.js'\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"lexicon-data.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-data.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"lexicon-data.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-data.ts"],"names":[],"mappings":"","sourcesContent":["import { LexiconDoc } from '@atproto/lexicon'\n\nexport type LexiconData = {\n createdAt: Date\n updatedAt: Date\n lastSucceededAt: null | Date\n uri: null | string\n lexicon: null | LexiconDoc\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"lexicon-getter.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-getter.ts"],"names":[],"mappings":";;;AAAA,gEAIkC;AAElC,6DAAyD;AACzD,kDAA2D;AAG3D;;;;;;GAMG;AACH,MAAa,aAAc,SAAQ,2BAA+B;IAChE,YAAY,KAAmB,EAAE,WAA4B,iCAAc;QACzE,KAAK,CACH,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE;YACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YACtB,oEAAoE;YACpE,oEAAoE;YACpE,sBAAsB;YACtB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACjD,kEAAkE;gBAClE,mEAAmE;gBACnE,mEAAmE;gBACnE,gEAAgE;gBAChE,IAAI,GAAG,YAAY,yCAAsB;oBAAE,OAAO,SAAS,CAAA;gBAE3D,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,wCAAyB,CAAA;YACzD,CAAC;SACF,CACF,CAAA;IACH,CAAC;CACF;AA5CD,sCA4CC"}
1
+ {"version":3,"file":"lexicon-getter.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-getter.ts"],"names":[],"mappings":";;;AAAA,gEAIkC;AAElC,6DAAyD;AACzD,kDAA2D;AAG3D;;;;;;GAMG;AACH,MAAa,aAAc,SAAQ,2BAA+B;IAChE,YAAY,KAAmB,EAAE,WAA4B,iCAAc;QACzE,KAAK,CACH,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE;YACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YACtB,oEAAoE;YACpE,oEAAoE;YACpE,sBAAsB;YACtB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACjD,kEAAkE;gBAClE,mEAAmE;gBACnE,mEAAmE;gBACnE,gEAAgE;gBAChE,IAAI,GAAG,YAAY,yCAAsB;oBAAE,OAAO,SAAS,CAAA;gBAE3D,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,wCAAyB,CAAA;YACzD,CAAC;SACF,CACF,CAAA;IACH,CAAC;CACF;AA5CD,sCA4CC","sourcesContent":["import {\n LexiconResolutionError,\n LexiconResolver,\n resolveLexicon,\n} from '@atproto/lexicon-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, resolver: LexiconResolver = resolveLexicon) {\n super(\n async (input, options, storedData) => {\n const now = new Date()\n // @TODO We would want to be able to explicit that the Lexicon needs\n // to be fresh, which is not possible yet with the current interface\n // of LexiconResolver.\n const result = await resolver(input).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 LexiconResolutionError) 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 +1 @@
1
- {"version":3,"file":"lexicon-manager.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lexicon-manager.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { LexPermissionSet } from '@atproto/lexicon'\nimport {\n LexiconResolutionError,\n LexiconResolver,\n} from '@atproto/lexicon-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, resolveLexicon?: LexiconResolver) {\n this.lexiconGetter = new LexiconGetter(store, resolveLexicon)\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, LexPermissionSet>(\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: LexPermissionSet]> {\n const permissionSet = await this.getPermissionSet(nsid)\n return [nsid, permissionSet]\n }\n\n protected async getPermissionSet(nsid: Nsid): Promise<LexPermissionSet> {\n const { lexicon } = await this.lexiconGetter.get(nsid)\n\n if (!lexicon) {\n throw LexiconResolutionError.from(nsid)\n }\n\n if (lexicon.defs.main?.type !== 'permission-set') {\n const description = 'Lexicon document is not a permission set'\n throw LexiconResolutionError.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, LexPermissionSet>,\n includeScope: IncludeScope,\n): string[] {\n const permissionSet = this.get(includeScope.nsid)!\n return includeScope.toPermissions(permissionSet).map(String)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"lexicon-store.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-store.ts"],"names":[],"mappings":";;;AAkBA,wCAQC;AAED,wCAOC;AAlCD,iDAAsE;AAWzD,QAAA,cAAc,GAAG,IAAA,+BAAqB,EAAe;IAChE,aAAa;IACb,cAAc;IACd,eAAe;CAChB,CAAC,CAAA;AAEF,SAAgB,cAAc,CAC5B,cAAkB;IAElB,IAAI,cAAc,IAAI,IAAA,sBAAc,EAAC,cAAc,CAAC,EAAE,CAAC;QACrD,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAgB,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"}
1
+ {"version":3,"file":"lexicon-store.js","sourceRoot":"","sources":["../../src/lexicon/lexicon-store.ts"],"names":[],"mappings":";;;AAkBA,wCAQC;AAED,wCAOC;AAlCD,iDAAsE;AAWzD,QAAA,cAAc,GAAG,IAAA,+BAAqB,EAAe;IAChE,aAAa;IACb,cAAc;IACd,eAAe;CAChB,CAAC,CAAA;AAEF,SAAgB,cAAc,CAC5B,cAAkB;IAElB,IAAI,cAAc,IAAI,IAAA,sBAAc,EAAC,cAAc,CAAC,EAAE,CAAC;QACrD,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAgB,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 { LexiconDoc } from '@atproto/lexicon'\nimport { Awaitable, buildInterfaceChecker } from '../lib/util/type.js'\nimport { LexiconData } from './lexicon-data.js'\n\nexport type { Awaitable, LexiconData, LexiconDoc }\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 'findLexicon',\n 'storeLexicon',\n 'deleteLexicon',\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 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/csp/index.ts"],"names":[],"mappings":"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"}
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 +1 @@
1
- {"version":3,"file":"hcaptcha.js","sourceRoot":"","sources":["../../src/lib/hcaptcha.ts"],"names":[],"mappings":"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"}
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 +1 @@
1
- {"version":3,"file":"build-document.js","sourceRoot":"","sources":["../../../src/lib/html/build-document.ts"],"names":[],"mappings":";;;AACA,uCAAgC;AAChC,uCAAgC;AAQhC;;GAEG;AACH,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC5C,WAAW;IACX,QAAQ;IACR,WAAW;IACX,cAAc;IACd,UAAU;IACV,QAAQ;IACR,MAAM;IACN,MAAM;IACN,SAAS;IACT,UAAU;IACV,IAAI;IACJ,eAAe;IACf,MAAM;IACN,UAAU;IACV,YAAY;IACZ,UAAU;IACV,SAAS;IACT,WAAW;IACX,MAAM;IACN,gBAAgB;IAChB,QAAQ;IACR,YAAY;IACZ,kBAAkB;CACV,CAAC,CAAA;AAEJ,MAAM,SAAS,GAAG,CAAC,GAAY,EAAkB,EAAE,CACvD,uBAA8C,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AADlD,QAAA,SAAS,aACyC;AAU/D,MAAM,eAAe,GAAG,IAAA,cAAI,EAAA;;;GAGzB,CAAA;AAgBI,MAAM,aAAa,GAAG,CAAC,EAC5B,SAAS,EACT,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,OAAO,EACP,MAAM,GACe,EAAE,EAAE,CAAC,IAAA,cAAI,EAAA;OACzB,WAAW,CAAC,SAAS,CAAC;;;MAGvB,KAAK,IAAI,IAAA,cAAI,EAAA,UAAU,KAAK,UAAU;MACtC,IAAI,IAAI,IAAA,cAAI,EAAA,eAAe,IAAI,CAAC,IAAI,MAAM;MAC1C,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe;MACnD,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC;MACrB,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC;MAC1B,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC;MACtB,IAAI;MACJ,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC;;SAErB,WAAW,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC;QAC5D,CAAA;AA1BK,QAAA,aAAa,iBA0BlB;AAER,SAAS,cAAc,CACrB,KAAQ;IAER,OAAO,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,CAAA;AACrD,CAAC;AAED,SAAS,UAAU,CAAC,KAAgB;IAClC,OAAO,IAAA,cAAI,EAAA,QAAQ,WAAW,CAAC,KAAK,CAAC,KAAK,CAAA;AAC5C,CAAC;AAED,SAAS,UAAU,CAAC,KAAgB;IAClC,OAAO,IAAA,cAAI,EAAA,QAAQ,WAAW,CAAC,KAAK,CAAC,KAAK,CAAA;AAC5C,CAAC;AAED,QAAQ,CAAC,CAAC,WAAW,CAAC,KAAa;IACjC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,IAAI,KAAK,IAAI,IAAI;gBAAE,SAAQ;iBACtB,IAAI,KAAK,KAAK,KAAK;gBAAE,SAAQ;iBAC7B,IAAI,KAAK,KAAK,IAAI;gBAAE,MAAM,IAAA,cAAI,EAAA,IAAI,IAAI,EAAE,CAAA;;gBACxC,MAAM,IAAA,cAAI,EAAA,IAAI,IAAI,KAAK,KAAK,GAAG,CAAA;QACtC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAe;IAClC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IAEtC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAA,cAAI,EAAA,mCAAmC,KAAK,CAAC,GAAG,MAAM,CAAA;IAC/D,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAA,cAAI,EAAA,6BAA6B,KAAK,CAAC,GAAG,iBAAiB,CAAA;IACpE,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,MAAwB;IAC5C,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,SAAS,CAAA;IACpC,OAAO,MAAM,YAAY,cAAI;QAC3B,CAAC,CAAC,kBAAkB;YAClB,IAAA,cAAI,EAAA,WAAW,MAAM,WAAW,CAAC,qDAAqD;QACxF,CAAC,CAAC,IAAA,cAAI,EAAA,8BAA8B,MAAM,CAAC,GAAG,aAAa,CAAA;AAC/D,CAAC;AAED,SAAS,WAAW,CAAC,KAAuB;IAC1C,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAA;IACnC,OAAO,KAAK,YAAY,cAAI;QAC1B,CAAC,CAAC,kBAAkB;YAClB,IAAA,cAAI,EAAA,UAAU,KAAK,UAAU,CAAC,qDAAqD;QACrF,CAAC,CAAC,IAAA,cAAI,EAAA,gCAAgC,KAAK,CAAC,GAAG,MAAM,CAAA;AACzD,CAAC"}
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 +1 @@
1
- {"version":3,"file":"escapers.js","sourceRoot":"","sources":["../../../src/lib/html/escapers.ts"],"names":[],"mappings":";;AAGA,8CAIC;AAED,kCAOC;AAED,gCAEC;AAKD,kCAUC;AAnCD,uCAAgC;AAChC,uCAA0D;AAE1D,QAAe,CAAC,CAAC,iBAAiB,CAAC,IAAY;IAC7C,6EAA6E;IAC7E,2CAA2C;IAC3C,KAAK,CAAC,CAAC,IAAA,wBAAc,EAAC,IAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAA;AAC7D,CAAC;AAED,QAAe,CAAC,CAAC,WAAW,CAAC,KAAc;IACzC,sEAAsE;IACtE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAClC,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAA;IACvE,0EAA0E;IAC1E,qBAAqB;IACrB,KAAK,CAAC,CAAC,IAAA,wBAAc,EAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;AAC7C,CAAC;AAED,QAAe,CAAC,CAAC,UAAU,CAAC,GAAW;IACrC,KAAK,CAAC,CAAC,IAAA,wBAAc,EAAC,GAAG,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAA;AAC1D,CAAC;AAKD,QAAe,CAAC,CAAC,WAAW,CAC1B,aAAmC,EACnC,MAA4B;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,aAAa,CAAC,CAAC,CAAE,CAAA;QAEvB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACvB,IAAI,KAAK,IAAI,IAAI;YAAE,KAAK,CAAC,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAA;IAC1D,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,CAAC,uBAAuB,CAC/B,KAAgB;IAEhB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAM;IACR,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;SAAM,IAAI,KAAK,YAAY,cAAI,EAAE,CAAC;QACjC,MAAM,KAAK,CAAA;IACb,CAAC;SAAM,CAAC;QACN,6CAA6C;QAC7C,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,KAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAA;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,iBAAiB,GAAG,UAAU,CAAA;AACpC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,QAAQ,CAAC;IACf,CAAC,GAAG,EAAE,QAAQ,CAAC;IACf,CAAC,GAAG,EAAE,OAAO,CAAC;CACf,CAAC,CAAA;AACF,MAAM,iBAAiB,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAE,CAAA;AAC/D,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAA;AAC5D,CAAC"}
1
+ {"version":3,"file":"escapers.js","sourceRoot":"","sources":["../../../src/lib/html/escapers.ts"],"names":[],"mappings":";;AAGA,8CAIC;AAED,kCAOC;AAED,gCAEC;AAKD,kCAUC;AAnCD,uCAAgC;AAChC,uCAA0D;AAE1D,QAAe,CAAC,CAAC,iBAAiB,CAAC,IAAY;IAC7C,6EAA6E;IAC7E,2CAA2C;IAC3C,KAAK,CAAC,CAAC,IAAA,wBAAc,EAAC,IAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAA;AAC7D,CAAC;AAED,QAAe,CAAC,CAAC,WAAW,CAAC,KAAc;IACzC,sEAAsE;IACtE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAClC,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAA;IACvE,0EAA0E;IAC1E,qBAAqB;IACrB,KAAK,CAAC,CAAC,IAAA,wBAAc,EAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;AAC7C,CAAC;AAED,QAAe,CAAC,CAAC,UAAU,CAAC,GAAW;IACrC,KAAK,CAAC,CAAC,IAAA,wBAAc,EAAC,GAAG,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAA;AAC1D,CAAC;AAKD,QAAe,CAAC,CAAC,WAAW,CAC1B,aAAmC,EACnC,MAA4B;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,aAAa,CAAC,CAAC,CAAE,CAAA;QAEvB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACvB,IAAI,KAAK,IAAI,IAAI;YAAE,KAAK,CAAC,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAA;IAC1D,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,CAAC,uBAAuB,CAC/B,KAAgB;IAEhB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAM;IACR,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;SAAM,IAAI,KAAK,YAAY,cAAI,EAAE,CAAC;QACjC,MAAM,KAAK,CAAA;IACb,CAAC;SAAM,CAAC;QACN,6CAA6C;QAC7C,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,KAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAA;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,iBAAiB,GAAG,UAAU,CAAA;AACpC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,QAAQ,CAAC;IACf,CAAC,GAAG,EAAE,QAAQ,CAAC;IACf,CAAC,GAAG,EAAE,OAAO,CAAC;CACf,CAAC,CAAA;AACF,MAAM,iBAAiB,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAE,CAAA;AAC/D,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAA;AAC5D,CAAC","sourcesContent":["import { Html } from './html.js'\nimport { NestedIterable, stringReplacer } from './util.js'\n\nexport function* javascriptEscaper(code: string) {\n // \"</script>\" can only appear in javascript strings, so we can safely escape\n // the \"<\" without breaking the javascript.\n yield* stringReplacer(code, '</script>', '\\\\u003c/script>')\n}\n\nexport function* jsonEscaper(value: unknown) {\n // https://redux.js.org/usage/server-rendering#security-considerations\n const json = JSON.stringify(value)\n if (json === undefined) throw new TypeError('Cannot serialize to JSON')\n // \"<\" can only appear in JSON strings, so we can safely escape it without\n // breaking the JSON.\n yield* stringReplacer(json, '<', '\\\\u003c')\n}\n\nexport function* cssEscaper(css: string) {\n yield* stringReplacer(css, '</style>', '\\\\u003c/style>')\n}\n\nexport type HtmlVariable = Html | string | number | null | undefined\nexport type HtmlValue = NestedIterable<HtmlVariable>\n\nexport function* htmlEscaper(\n htmlFragments: TemplateStringsArray,\n values: readonly HtmlValue[],\n): Generator<string | Html, void, undefined> {\n for (let i = 0; i < htmlFragments.length; i++) {\n yield htmlFragments[i]!\n\n const value = values[i]\n if (value != null) yield* htmlVariableToFragments(value)\n }\n}\n\nfunction* htmlVariableToFragments(\n value: HtmlValue,\n): Generator<string | Html, void, undefined> {\n if (value == null) {\n return\n } else if (typeof value === 'number') {\n yield String(value)\n } else if (typeof value === 'string') {\n yield encode(value)\n } else if (value instanceof Html) {\n yield value\n } else {\n // Will throw if the value is not an iterable\n for (const v of value) yield* htmlVariableToFragments(v)\n }\n}\n\nconst specialCharRegExp = /[<>\"'&]/g\nconst specialCharMap = new Map([\n ['<', '&lt;'],\n ['>', '&gt;'],\n ['\"', '&quot;'],\n [\"'\", '&apos;'],\n ['&', '&amp;'],\n])\nconst specialCharMapGet = (c: string) => specialCharMap.get(c)!\nfunction encode(value: string): string {\n return value.replace(specialCharRegExp, specialCharMapGet)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"html.js","sourceRoot":"","sources":["../../../src/lib/html/html.ts"],"names":[],"mappings":";;;AAAA,MAAM,MAAM,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAA;AAE/C;;;GAGG;AACH,MAAa,IAAI;IACN,UAAU,CAA4B;IAE/C,YAAoB,SAAkC,EAAE,KAAa;QACnE,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,sEAAsE;YACtE,mEAAmE;YACnE,MAAM,IAAI,SAAS,CACjB,yDAAyD,CAC1D,CAAA;QACH,CAAC;QAED,qEAAqE;QACrE,+BAA+B;QAC/B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC;IAED,QAAQ;QACN,0EAA0E;QAC1E,uEAAuE;QACvE,yEAAyE;QACzE,4EAA4E;QAC5E,gEAAgE;QAChE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC;IAED,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI;QACvB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ,CAAC;YACd,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;YACxB;gBACE,MAAM,IAAI,SAAS,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;IAED,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,MAAM,QAAQ,CAAA;YAChB,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,CAAC,QAAQ,CAAA;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,SAAkC;QACzD,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACpC,CAAC;CACF;AAjDD,oBAiDC"}
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../../src/lib/html/html.ts"],"names":[],"mappings":";;;AAAA,MAAM,MAAM,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAA;AAE/C;;;GAGG;AACH,MAAa,IAAI;IACN,UAAU,CAA4B;IAE/C,YAAoB,SAAkC,EAAE,KAAa;QACnE,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,sEAAsE;YACtE,mEAAmE;YACnE,MAAM,IAAI,SAAS,CACjB,yDAAyD,CAC1D,CAAA;QACH,CAAC;QAED,qEAAqE;QACrE,+BAA+B;QAC/B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC;IAED,QAAQ;QACN,0EAA0E;QAC1E,uEAAuE;QACvE,yEAAyE;QACzE,4EAA4E;QAC5E,gEAAgE;QAChE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC;IAED,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI;QACvB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ,CAAC;YACd,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAA;YACxB;gBACE,MAAM,IAAI,SAAS,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;IAED,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,MAAM,QAAQ,CAAA;YAChB,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,CAAC,QAAQ,CAAA;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,SAAkC;QACzD,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACpC,CAAC;CACF;AAjDD,oBAiDC","sourcesContent":["const symbol = Symbol('Html.dangerouslyCreate')\n\n/**\n * This class represents trusted HTML that can be safely embedded in a web page,\n * or used as fragments to build a larger HTML document.\n */\nexport class Html implements Iterable<string> {\n readonly #fragments: readonly (Html | string)[]\n\n private constructor(fragments: Iterable<Html | string>, guard: symbol) {\n if (guard !== symbol) {\n // Forces developers to use `Html.dangerouslyCreate` to create an Html\n // instance, to make it clear that the content needs to be trusted.\n throw new TypeError(\n 'Use Html.dangerouslyCreate() to create an Html instance',\n )\n }\n\n // Transform into an array in case iterable can be consumed only once\n // (e.g. a generator function).\n this.#fragments = Array.from(fragments)\n }\n\n toString(): string {\n // More efficient than `return this.#fragments.join('')` because it avoids\n // creating intermediate strings when items of this.#fragments are Html\n // instances (as all their toString() would end-up being called, creating\n // lots of intermediary strings). The approach here allows to do a full scan\n // of all the child nodes and concatenate them in a single pass.\n return Array.from(this).join('')\n }\n\n [Symbol.toPrimitive](hint): string {\n switch (hint) {\n case 'string':\n case 'default':\n return this.toString()\n default:\n throw new TypeError(`Cannot convert Html to a ${hint}`)\n }\n }\n\n *[Symbol.iterator](): IterableIterator<string> {\n for (const fragment of this.#fragments) {\n if (typeof fragment === 'string') {\n yield fragment\n } else {\n yield* fragment\n }\n }\n }\n\n static dangerouslyCreate(fragments: Iterable<Html | string>): Html {\n return new Html(fragments, symbol)\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"hydration-data.js","sourceRoot":"","sources":["../../../src/lib/html/hydration-data.ts"],"names":[],"mappings":";;AAEA,oDAIC;AAED,wDAUC;AAlBD,yCAAqC;AAErC,SAAgB,oBAAoB,CAClC,MAAS;IAET,OAAO,eAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAA;AAC/D,CAAC;AAED,QAAe,CAAC,CAAC,sBAAsB,CACrC,MAA+B;IAE/B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,MAAM,IAAA,aAAE,EAAA,UAAU,GAAG,gBAAgB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAA;IAC9D,CAAC;IACD,qEAAqE;IACrE,wEAAwE;IACxE,0DAA0D;IAC1D,MAAM,IAAA,aAAE,EAAA,kCAAkC,CAAA;AAC5C,CAAC"}
1
+ {"version":3,"file":"hydration-data.js","sourceRoot":"","sources":["../../../src/lib/html/hydration-data.ts"],"names":[],"mappings":";;AAEA,oDAIC;AAED,wDAUC;AAlBD,yCAAqC;AAErC,SAAgB,oBAAoB,CAClC,MAAS;IAET,OAAO,eAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAA;AAC/D,CAAC;AAED,QAAe,CAAC,CAAC,sBAAsB,CACrC,MAA+B;IAE/B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,MAAM,IAAA,aAAE,EAAA,UAAU,GAAG,gBAAgB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAA;IAC9D,CAAC;IACD,qEAAqE;IACrE,wEAAwE;IACxE,0DAA0D;IAC1D,MAAM,IAAA,aAAE,EAAA,kCAAkC,CAAA;AAC5C,CAAC","sourcesContent":["import { Html, js } from './index.js'\n\nexport function declareHydrationData<T extends Record<string, unknown>>(\n values: T,\n): Html {\n return Html.dangerouslyCreate(hydrationDataGenerator(values))\n}\n\nexport function* hydrationDataGenerator(\n values: Record<string, unknown>,\n): Generator<Html> {\n for (const [key, val] of Object.entries(values)) {\n yield js`window[${key}]=JSON.parse(${JSON.stringify(val)});`\n }\n // The script tag is removed after the data is assigned to the global\n // variables to prevent other scripts from reading the values. The \"app\"\n // script will read the global variable and then unset it.\n yield js`document.currentScript.remove();`\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/html/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAAyB;AACzB,4CAAyB;AAEzB,aAAa;AACb,sDAAmC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/html/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAAyB;AACzB,4CAAyB;AAEzB,aAAa;AACb,sDAAmC","sourcesContent":["export * from './html.js'\nexport * from './tags.js'\n\n// Extra util\nexport * from './build-document.js'\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../../src/lib/html/tags.ts"],"names":[],"mappings":";;;AAAA,+CAMsB;AACtB,uCAAgC;AAGzB,MAAM,IAAI,GAAG,CAClB,GAAyB,EACzB,GAAG,GAAyB,EAC5B,EAAE,CACF,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;IAClC,CAAC,CAAC,2DAA2D;QAC3D,cAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;IAC7B,CAAC,CAAC,cAAI,CAAC,iBAAiB,CAAC,IAAA,yBAAW,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;AAPtC,QAAA,IAAI,QAOkC;AAEnD;;GAEG;AACI,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE,CAC7C,cAAI,CAAC,iBAAiB,CAAC,IAAA,+BAAiB,EAAC,IAAI,CAAC,CAAC,CAAA;AADpC,QAAA,cAAc,kBACsB;AAEjD;;;;;;;;;;;;;GAaG;AACI,MAAM,EAAE,GAAG,CAAC,GAAyB,EAAE,GAAG,GAAuB,EAAE,EAAE,CAC1E,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;IAClC,CAAC,CAAC,uEAAuE;QACvE,IAAA,sBAAc,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,IAAA,sBAAc,EAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,gBAAQ,CAAC,CAAC,CAAC,CAAA;AAJvD,QAAA,EAAE,MAIqD;AAEpE;;;;GAIG;AACI,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAE,EAAE,CACzC,cAAI,CAAC,iBAAiB,CAAC,IAAA,yBAAW,EAAC,KAAK,CAAC,CAAC,CAAA;AAD/B,QAAA,QAAQ,YACuB;AAE5C;;GAEG;AACI,MAAM,OAAO,GAAG,CAAC,IAAa,EAAE,EAAE,CACvC,IAAI,CAAC,CAAC,CAAC,cAAI,CAAC,iBAAiB,CAAC,IAAA,wBAAU,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AADhD,QAAA,OAAO,WACyC"}
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../../src/lib/html/tags.ts"],"names":[],"mappings":";;;AAAA,+CAMsB;AACtB,uCAAgC;AAGzB,MAAM,IAAI,GAAG,CAClB,GAAyB,EACzB,GAAG,GAAyB,EAC5B,EAAE,CACF,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;IAClC,CAAC,CAAC,2DAA2D;QAC3D,cAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;IAC7B,CAAC,CAAC,cAAI,CAAC,iBAAiB,CAAC,IAAA,yBAAW,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;AAPtC,QAAA,IAAI,QAOkC;AAEnD;;GAEG;AACI,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE,CAC7C,cAAI,CAAC,iBAAiB,CAAC,IAAA,+BAAiB,EAAC,IAAI,CAAC,CAAC,CAAA;AADpC,QAAA,cAAc,kBACsB;AAEjD;;;;;;;;;;;;;GAaG;AACI,MAAM,EAAE,GAAG,CAAC,GAAyB,EAAE,GAAG,GAAuB,EAAE,EAAE,CAC1E,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;IAClC,CAAC,CAAC,uEAAuE;QACvE,IAAA,sBAAc,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,IAAA,sBAAc,EAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,gBAAQ,CAAC,CAAC,CAAC,CAAA;AAJvD,QAAA,EAAE,MAIqD;AAEpE;;;;GAIG;AACI,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAE,EAAE,CACzC,cAAI,CAAC,iBAAiB,CAAC,IAAA,yBAAW,EAAC,KAAK,CAAC,CAAC,CAAA;AAD/B,QAAA,QAAQ,YACuB;AAE5C;;GAEG;AACI,MAAM,OAAO,GAAG,CAAC,IAAa,EAAE,EAAE,CACvC,IAAI,CAAC,CAAC,CAAC,cAAI,CAAC,iBAAiB,CAAC,IAAA,wBAAU,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AADhD,QAAA,OAAO,WACyC","sourcesContent":["import {\n HtmlValue,\n cssEscaper,\n htmlEscaper,\n javascriptEscaper,\n jsonEscaper,\n} from './escapers.js'\nimport { Html } from './html.js'\n\nexport { type HtmlValue }\nexport const html = (\n tpl: TemplateStringsArray,\n ...val: readonly HtmlValue[]\n) =>\n tpl.length === 1 && val.length === 0\n ? // Optimization for static HTML, avoid creating an iterable\n Html.dangerouslyCreate(tpl)\n : Html.dangerouslyCreate(htmlEscaper(tpl, val))\n\n/**\n * Escapes code to use as a JavaScript string inside a `<script>` tag.\n */\nexport const javascriptCode = (code: string) =>\n Html.dangerouslyCreate(javascriptEscaper(code))\n\n/**\n * Creates an HTML safe JavaScript code block, with JSON serialization of the\n * injected variables.\n *\n * @example\n * ```js\n * const dataOnTheServer = { foo: 'bar' };\n * const clientScript = js`\n * const data = ${dataOnTheServer};\n * console.log(data);\n * `\n * console.log(clientScript.toString()); // Output: 'const data = {\"foo\":\"bar\"};console.log(data);'\n * ```\n */\nexport const js = (tpl: TemplateStringsArray, ...val: readonly unknown[]) =>\n tpl.length === 1 && val.length === 0\n ? // Optimization for static JavaScript, avoid un-necessary serialization\n javascriptCode(tpl[0])\n : javascriptCode(String.raw({ raw: tpl }, ...val.map(jsonCode)))\n\n/**\n * Escapes a value to be used as a JSON string inside a `<script>` tag.\n *\n * @see {@link https://redux.js.org/usage/server-rendering#security-considerations}\n */\nexport const jsonCode = (value: unknown) =>\n Html.dangerouslyCreate(jsonEscaper(value))\n\n/**\n * 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 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/lib/html/util.ts"],"names":[],"mappings":";;AAEA,wCAcC;AAdD,QAAe,CAAC,CAAC,cAAc,CAC7B,MAAc,EACd,WAAmB,EACnB,YAAoB;IAEpB,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACvC,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;QACxC,MAAM,YAAY,CAAA;QAClB,aAAa,GAAG,KAAK,GAAG,WAAW,CAAC,MAAM,CAAA;QAC1C,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA;IACpD,CAAC;IACD,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;AACnC,CAAC"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/lib/html/util.ts"],"names":[],"mappings":";;AAEA,wCAcC;AAdD,QAAe,CAAC,CAAC,cAAc,CAC7B,MAAc,EACd,WAAmB,EACnB,YAAoB;IAEpB,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACvC,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;QACxC,MAAM,YAAY,CAAA;QAClB,aAAa,GAAG,KAAK,GAAG,WAAW,CAAC,MAAM,CAAA;QAC1C,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA;IACpD,CAAC;IACD,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;AACnC,CAAC","sourcesContent":["export type NestedIterable<V> = V | Iterable<NestedIterable<V>>\n\nexport function* stringReplacer(\n source: string,\n searchValue: string,\n replaceValue: string,\n): Generator<string, void, undefined> {\n let previousIndex = 0\n let index = source.indexOf(searchValue)\n while (index !== -1) {\n yield source.slice(previousIndex, index)\n yield replaceValue\n previousIndex = index + searchValue.length\n index = source.indexOf(searchValue, previousIndex)\n }\n yield source.slice(previousIndex)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"accept.js","sourceRoot":"","sources":["../../../src/lib/http/accept.ts"],"names":[],"mappings":";;AAsCA,4CAgDC;AArFD,yCAAwC;AACxC,6CAA6C;AAe7C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAgB,gBAAgB,CAM9B,UAA+D,EAC/D,KAAoD,EACpD,WAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;IAE5E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAE/D,8EAA8E;IAC9E,YAAY;IACZ,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,qBAAqB,IAAI,GAAG,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IAED,OAAO,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAChC,CAAC,CAAC,IAAA,kBAAS,EAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,IAAI,SAAS;gBAC5D,CAAC,CAAC,EAAE,CAAA,CAAC,4CAA4C;YAEnD,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAExD,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACvD,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAA,CAAC,oBAAoB;YAElF,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;gBAClD,MAAM,GAAG,GAAG,IAAA,mBAAM,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;gBAClC,IAAI,IAAI;oBAAE,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;gBAE7C,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YACtC,CAAC;iBAAM,CAAC;gBACN,2BAA2B;gBAC3B,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAC3C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,WAAW;gBAAE,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;YACtD,IAAI,CAAC,GAAG,CAAC,CAAA;QACX,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"accept.js","sourceRoot":"","sources":["../../../src/lib/http/accept.ts"],"names":[],"mappings":";;AAsCA,4CAgDC;AArFD,yCAAwC;AACxC,6CAA6C;AAe7C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAgB,gBAAgB,CAM9B,UAA+D,EAC/D,KAAoD,EACpD,WAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;IAE5E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAE/D,8EAA8E;IAC9E,YAAY;IACZ,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,qBAAqB,IAAI,GAAG,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IAED,OAAO,KAAK,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAChC,CAAC,CAAC,IAAA,kBAAS,EAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,IAAI,SAAS;gBAC5D,CAAC,CAAC,EAAE,CAAA,CAAC,4CAA4C;YAEnD,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAExD,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACvD,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAA,CAAC,oBAAoB;YAElF,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;gBAClD,MAAM,GAAG,GAAG,IAAA,mBAAM,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;gBAClC,IAAI,IAAI;oBAAE,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;gBAE7C,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YACtC,CAAC;iBAAM,CAAC;gBACN,2BAA2B;gBAC3B,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAC3C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,WAAW;gBAAE,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;YACtD,IAAI,CAAC,GAAG,CAAC,CAAA;QACX,CAAC;IACH,CAAC,CAAA;AACH,CAAC","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { mediaType } from '@hapi/accept'\nimport { SubCtx, subCtx } from './context.js'\nimport { Middleware, NextFunction } from './types.js'\n\ntype View<\n T extends object | void,\n D,\n Req extends IncomingMessage = IncomingMessage,\n Res extends ServerResponse = ServerResponse,\n> = (\n this: SubCtx<T, { data: D }>,\n req: Req,\n res: Res,\n next: NextFunction,\n) => void | PromiseLike<void>\n\n/**\n * @example\n * ```ts\n * app.use(\n * acceptMiddleware(\n * async function (req, res) {\n * return { hello: 'world' }\n * },\n * {\n * '': 'application/json', // Fallback to JSON\n * 'text/plain': function (req, res) {\n * res.writeHead(200).end(this.data.hello)\n * },\n * 'application/json': function (req, res) {\n * res.writeHead(200).end(JSON.stringify(this.data))\n * }\n * }\n * )\n * )\n * ```\n */\nexport function acceptMiddleware<\n D,\n T extends object | void = void,\n Req extends IncomingMessage = IncomingMessage,\n Res extends ServerResponse = ServerResponse,\n>(\n controller: (this: T, req: Req, res: Res) => D | PromiseLike<D>,\n views: Record<string, string | View<T, D, Req, Res>>,\n fallback: Middleware<T> = (req, res, _next) => void res.writeHead(406).end(),\n): (this: T, req: Req, res: Res, next: NextFunction) => Promise<void> {\n const viewsMap = new Map(Object.entries(views))\n const preferences = Array.from(viewsMap.keys()).filter(Boolean)\n\n // Make sure that every view is either a function or a string that points to a\n // function.\n for (const type of viewsMap.keys()) {\n const view = viewsMap.get(type)\n if (typeof view === 'string' && typeof viewsMap.get(view) !== 'function') {\n throw new Error(`Invalid view \"${view}\" for media type \"${type}\"`)\n }\n }\n\n return async function (req, res, next) {\n try {\n const type = req.headers['accept']\n ? mediaType(req.headers['accept'], preferences) || undefined\n : '' // indicate that the client accepts anything\n\n let view = type != null ? viewsMap.get(type) : undefined\n\n if (typeof view === 'string') view = viewsMap.get(view)\n if (typeof view === 'string') throw new Error('Invalid view') // should not happen\n\n if (view) {\n const data = await controller.call(this, req, res)\n const ctx = subCtx(this, { data })\n if (type) res.setHeader('Content-Type', type)\n\n await view.call(ctx, req, res, next)\n } else {\n // media negotiation failed\n await fallback.call(this, req, res, next)\n }\n } catch (err) {\n if (!res.headersSent) res.removeHeader('Content-Type')\n next(err)\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/lib/http/context.ts"],"names":[],"mappings":";;AAGA,wBA4BC;AA5BD,SAAgB,MAAM,CACpB,MAAc,EACd,KAAY;IAEZ,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAErC,iCAAiC;IACjC,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC;YACJ,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC7B,KAAK,CAAC,CAAC,CAAC,CAAC;YACP,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACrB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC1B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAChC,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,CAAC,CAAC,CAAC,CAAC;YACP,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACrB,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACrB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC1B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAChC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;AAChF,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAwB;IAExB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9C,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;AACrD,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/lib/http/context.ts"],"names":[],"mappings":";;AAGA,wBA4BC;AA5BD,SAAgB,MAAM,CACpB,MAAc,EACd,KAAY;IAEZ,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAErC,iCAAiC;IACjC,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC;YACJ,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC7B,KAAK,CAAC,CAAC,CAAC,CAAC;YACP,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACrB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC1B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAChC,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,CAAC,CAAC,CAAC,CAAC;YACP,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACrB,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACrB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC1B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAChC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;AAChF,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAwB;IAExB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9C,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;AACrD,CAAC","sourcesContent":["export type SubCtx<Parent extends object | void, Child extends object> = Child &\n Omit<Parent, keyof Child>\n\nexport function subCtx<Parent extends object | void, Child extends object>(\n parent: Parent,\n child: Child,\n): SubCtx<Parent, Child> {\n const proto = typeof parent === 'object' ? parent : null\n const entries = Object.entries(child)\n\n // Optimization for small objects\n switch (entries.length) {\n case 0:\n return Object.create(proto)\n case 1: {\n const e0 = entries[0]\n return Object.create(proto, {\n [e0[0]]: valueDescriptor(e0[1]),\n })\n }\n case 2: {\n const e0 = entries[0]\n const e1 = entries[1]\n return Object.create(proto, {\n [e0[0]]: valueDescriptor(e0[1]),\n [e1[0]]: valueDescriptor(e1[1]),\n })\n }\n }\n\n return Object.create(proto, Object.fromEntries(entries.map(entryToEntryDesc)))\n}\n\nfunction entryToEntryDesc(\n entry: [string, unknown],\n): [string, PropertyDescriptor] {\n return [entry[0], valueDescriptor(entry[1])]\n}\n\nfunction valueDescriptor(value: unknown): PropertyDescriptor {\n return { value, enumerable: true, writable: false }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../../src/lib/http/headers.ts"],"names":[],"mappings":";;AAEA,oCAYC;AAZD,SAAgB,YAAY,CAC1B,GAAmB,EACnB,MAAc,EACd,KAAiC;IAEjC,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACtC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QACnE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../../src/lib/http/headers.ts"],"names":[],"mappings":";;AAEA,oCAYC;AAZD,SAAgB,YAAY,CAC1B,GAAmB,EACnB,MAAc,EACd,KAAiC;IAEjC,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACtC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QACnE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC","sourcesContent":["import type { ServerResponse } from 'node:http'\n\nexport function appendHeader(\n res: ServerResponse,\n header: string,\n value: string | readonly string[],\n): void {\n const existing = res.getHeader(header)\n if (existing == null) {\n res.setHeader(header, value)\n } else {\n const arr = Array.isArray(existing) ? existing : [String(existing)]\n res.setHeader(header, arr.concat(value))\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/http/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,+CAA4B;AAC5B,+CAA4B;AAC5B,kDAA+B;AAC/B,8CAA2B;AAC3B,+CAA4B;AAC5B,gDAA6B;AAC7B,8CAA2B;AAC3B,8CAA2B;AAC3B,6CAA0B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/http/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,+CAA4B;AAC5B,+CAA4B;AAC5B,kDAA+B;AAC/B,8CAA2B;AAC3B,+CAA4B;AAC5B,gDAA6B;AAC7B,8CAA2B;AAC3B,8CAA2B;AAC3B,6CAA0B","sourcesContent":["export * from './accept.js'\nexport * from './context.js'\nexport * from './headers.js'\nexport * from './middleware.js'\nexport * from './parser.js'\nexport * from './request.js'\nexport * from './response.js'\nexport * from './router.js'\nexport * from './stream.js'\nexport * from './types.js'\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"method.js","sourceRoot":"","sources":["../../../src/lib/http/method.ts"],"names":[],"mappings":";;AAKA,kDAYC;AAZD,SAAgB,mBAAmB,CAAC,MAA0B;IAC5D,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAA;IACrC,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,MAAM,CAAA;IAE/C,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;QAC7B,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAA;IACvC,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAC/D,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,EAAE,CAAC,KAAK,CAAA;IACtC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAC3D,CAAC"}
1
+ {"version":3,"file":"method.js","sourceRoot":"","sources":["../../../src/lib/http/method.ts"],"names":[],"mappings":";;AAKA,kDAYC;AAZD,SAAgB,mBAAmB,CAAC,MAA0B;IAC5D,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAA;IACrC,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,MAAM,CAAA;IAE/C,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;QAC7B,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAA;IACvC,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAC/D,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,EAAE,CAAC,KAAK,CAAA;IACtC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AAC3D,CAAC","sourcesContent":["import type { IncomingMessage } from 'node:http'\n\nexport type MethodMatcherInput = string | Iterable<string> | MethodMatcher\nexport type MethodMatcher = (req: IncomingMessage) => boolean\n\nexport function createMethodMatcher(method: MethodMatcherInput): MethodMatcher {\n if (method === '*') return () => true\n if (typeof method === 'function') return method\n\n if (typeof method === 'string') {\n method = method.toUpperCase()\n return (req) => req.method === method\n }\n\n const set = new Set(Array.from(method, (m) => m.toUpperCase()))\n if (set.size === 0) return () => false\n return (req) => req.method != null && set.has(req.method)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/lib/http/middleware.ts"],"names":[],"mappings":"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"}
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 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/lib/http/parser.ts"],"names":[],"mappings":";;;;;;AAYA,4CAiBC;AA7BD,yCAAiD;AACjD,2CAAuD;AACvD,8DAAyC;AAKzC;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,IAAa;IAC5C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAA,qBAAe,EACnB,GAAG,EACH,yBAAyB,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CACrE,CAAA;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAA,cAAe,EAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,uBAAuB;QACvB,MAAM,IAAA,qBAAe,EACnB,GAAG,EACH,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAC5D,CAAA;IACH,CAAC;AACH,CAAC;AAuBY,QAAA,OAAO,GAAG;IACrB;QACE,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,CAAC,IAAI,EAA6D,EAAE;YACxE,OAAO,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,CAAC;QACD,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,EAAQ,EAAE;YACnC,IAAI,OAAO,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,qBAAqB,CAAC,CAAA;YACnD,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,IAAA,cAAS,EAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;YACrC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;YAC5D,CAAC;QACH,CAAC;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,CAAC,IAAI,EAA+C,EAAE;YAC1D,OAAO,IAAI,KAAK,mCAAmC,CAAA;QACrD,CAAC;QACD,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,EAA8B,EAAE;YACzD,IAAI,OAAO,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,qBAAqB,CAAC,CAAA;YACnD,CAAC;YACD,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,MAAM;oBAAE,OAAO,EAAE,CAAA;gBAC7B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;gBACrD,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;oBAAE,MAAM,IAAI,SAAS,CAAC,aAAa,CAAC,CAAA;gBAC/D,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;YACnC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,0BAA0B,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;YACxE,CAAC;QACH,CAAC;KACF;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,CAAC,IAAI,EAAsC,EAAE;YACjD,OAAO,IAAI,KAAK,0BAA0B,CAAA;QAC5C,CAAC;QACD,KAAK,EAAE,CAAC,MAAM,EAAU,EAAE,CAAC,MAAM;KAClC;CAC0B,CAAA"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/lib/http/parser.ts"],"names":[],"mappings":";;;;;;AAYA,4CAiBC;AA7BD,yCAAiD;AACjD,2CAAuD;AACvD,8DAAyC;AAKzC;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,IAAa;IAC5C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAA,qBAAe,EACnB,GAAG,EACH,yBAAyB,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CACrE,CAAA;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAA,cAAe,EAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,uBAAuB;QACvB,MAAM,IAAA,qBAAe,EACnB,GAAG,EACH,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAC5D,CAAA;IACH,CAAC;AACH,CAAC;AAuBY,QAAA,OAAO,GAAG;IACrB;QACE,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,CAAC,IAAI,EAA6D,EAAE;YACxE,OAAO,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,CAAC;QACD,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,EAAQ,EAAE;YACnC,IAAI,OAAO,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,qBAAqB,CAAC,CAAA;YACnD,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,IAAA,cAAS,EAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;YACrC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;YAC5D,CAAC;QACH,CAAC;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,CAAC,IAAI,EAA+C,EAAE;YAC1D,OAAO,IAAI,KAAK,mCAAmC,CAAA;QACrD,CAAC;QACD,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,EAA8B,EAAE;YACzD,IAAI,OAAO,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,qBAAqB,CAAC,CAAA;YACnD,CAAC;YACD,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,MAAM;oBAAE,OAAO,EAAE,CAAA;gBAC7B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;gBACrD,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;oBAAE,MAAM,IAAI,SAAS,CAAC,aAAa,CAAC,CAAA;gBAC/D,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;YACnC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,0BAA0B,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;YACxE,CAAC;QACH,CAAC;KACF;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,CAAC,IAAI,EAAsC,EAAE;YACjD,OAAO,IAAI,KAAK,0BAA0B,CAAA;QAC5C,CAAC;QACD,KAAK,EAAE,CAAC,MAAM,EAAU,EAAE,CAAC,MAAM;KAClC;CAC0B,CAAA","sourcesContent":["import { parse as parseJson } from '@hapi/bourne'\nimport { type as hapiContentType } from '@hapi/content'\nimport createHttpError from 'http-errors'\n\nexport type JsonScalar = string | number | boolean | null\nexport type Json = JsonScalar | Json[] | { [_ in string]?: Json }\n\n/**\n * Parse a content-type string into its components.\n *\n * @throws {TypeError} If the content-type is invalid.\n */\nexport function parseContentType(type: unknown): ContentType {\n if (typeof type !== 'string') {\n throw createHttpError(\n 415,\n `Invalid content-type: ${type == null ? String(type) : typeof type}`,\n )\n }\n\n try {\n return hapiContentType(type)\n } catch (err) {\n // De-boomify the error\n throw createHttpError(\n 415,\n err instanceof Error ? err.message : 'Invalid content-type',\n )\n }\n}\n\nexport type ContentType = {\n mime: string\n charset?: string\n boundary?: string\n}\n\nexport type Parser<T extends string = string, R = unknown> = {\n readonly name: string\n readonly test: (mime: string) => mime is T\n readonly parse: (buffer: Buffer, type: ContentType) => R\n}\n\nexport type ParserName<P extends Parser> = P extends { readonly name: infer N }\n ? N\n : never\nexport type ParserType<P extends Parser> = P extends Parser<infer T> ? T : never\nexport type ParserResult<P extends Parser> = ReturnType<P['parse']>\n\nexport type ParserForType<P extends Parser, T> =\n P extends Parser<infer U> ? (U extends T ? P : never) : never\n\nexport const parsers = [\n {\n name: 'json',\n test: (mime): mime is `application/json` | `application/${string}+json` => {\n return /^application\\/(?:.+\\+)?json$/.test(mime)\n },\n parse: (buffer, { charset }): Json => {\n if (charset != null && !/^utf-?8$/i.test(charset)) {\n throw createHttpError(415, 'Unsupported charset')\n }\n try {\n return parseJson(buffer.toString())\n } catch (err) {\n throw createHttpError(400, 'Invalid JSON', { cause: err })\n }\n },\n },\n {\n name: 'urlencoded',\n test: (mime): mime is 'application/x-www-form-urlencoded' => {\n return mime === 'application/x-www-form-urlencoded'\n },\n parse: (buffer, { charset }): { [_ in string]?: string } => {\n if (charset != null && !/^utf-?8$/i.test(charset)) {\n throw createHttpError(415, 'Unsupported charset')\n }\n try {\n if (!buffer.length) return {}\n const params = new URLSearchParams(buffer.toString())\n if (params.has('__proto__')) throw new TypeError('Invalid key')\n return Object.fromEntries(params)\n } catch (err) {\n throw createHttpError(400, 'Invalid URL-encoded data', { cause: err })\n }\n },\n },\n {\n name: 'bytes',\n test: (mime): mime is 'application/octet-stream' => {\n return mime === 'application/octet-stream'\n },\n parse: (buffer): Buffer => buffer,\n },\n] as const satisfies Parser[]\n\nexport type KnownParser = (typeof parsers)[number]\n\nexport type KnownNames = KnownParser['name']\nexport type KnownTypes = ParserType<KnownParser>\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/lib/http/path.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/lib/http/path.ts"],"names":[],"mappings":"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","sourcesContent":["export type PathMatcher<P extends Params> = (pathname: string) => P | undefined\n\ntype StringPath<P extends Params> = string extends keyof P\n ? `/${string}`\n : keyof P extends never\n ? `/${string}` | ``\n : {\n [K in keyof P]: K extends string\n ?\n | `${`/:${K}` | `/${string}/:${K}`}${StringPath<Omit<P, K>>}`\n | `${StringPath<Omit<P, K>>}${`/:${K}` | `/:${K}/${string}`}`\n : never\n }[keyof P]\n\nexport type Path<P extends Params> =\n | string\n | StringPath<P>\n | RegExp\n | PathMatcher<P>\nexport type Params = Record<string, undefined | string>\n\nexport function createPathMatcher<P extends Params = Params>(\n refPath: Path<P>,\n): PathMatcher<P> {\n if (typeof refPath === 'string') {\n // Create a path matcher for a path with parameters (like /foo/:fooId/bar/:barId).\n if (refPath.includes('/:')) {\n const refParts = refPath\n .slice(1)\n .split('/')\n .map((part, i) => [part, i] as const)\n const refPartsLength = refParts.length\n\n const staticParts = refParts.filter(([p]) => !p.startsWith(':'))\n const paramParts = refParts\n // Extract parameters, ignoring those with no name (like /foo/:/bar).\n .filter(([p]) => p.startsWith(':') && p.length > 1)\n .map(([p, i]) => [p.slice(1), i] as const)\n\n return (reqPath: string) => {\n const reqParts = reqPath.slice(1).split('/')\n\n if (reqParts.length !== refPartsLength) return undefined\n\n // Make sure all static parts match.\n for (let i = 0; i < staticParts.length; i++) {\n const value = staticParts[i]![0]\n const idx = staticParts[i]![1]\n\n if (value !== reqParts[idx]) return undefined\n }\n\n // Then extract the parameters.\n const params: Record<string, string> = {}\n for (let i = 0; i < paramParts.length; i++) {\n const name = paramParts[i]![0]\n const idx = paramParts[i]![1]\n\n const value = reqParts[idx]\n\n // Empty parameter values are not allowed.\n if (!value) return undefined\n\n params[name] = value\n }\n\n return params as P\n }\n }\n\n return (reqPath: string) => (reqPath === refPath ? ({} as P) : undefined)\n }\n\n if (refPath instanceof RegExp) {\n return (reqPath: string) => {\n const match = reqPath.match(refPath)\n return match ? ((match.groups || {}) as P) : undefined\n }\n }\n\n return refPath\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/lib/http/request.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/lib/http/request.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { languages, mediaType } from '@hapi/accept'\nimport {\n CookieSerializeOptions,\n parse as parseCookie,\n serialize as serializeCookie,\n} from 'cookie'\nimport forwarded from 'forwarded'\nimport createHttpError from 'http-errors'\nimport { appendHeader } from './headers.js'\nimport { UrlReference, urlMatch } from './url.js'\n\nexport function validateHeaderValue(\n req: IncomingMessage,\n name: keyof IncomingMessage['headers'],\n allowedValues: readonly (string | null)[],\n) {\n const value = req.headers[name] ?? null\n\n if (Array.isArray(value)) {\n throw createHttpError(400, `Invalid ${name} header`)\n }\n\n if (!allowedValues.includes(value)) {\n throw createHttpError(\n 400,\n value\n ? `Forbidden ${name} header \"${value}\" (expected ${allowedValues})`\n : `Missing ${name} header`,\n )\n }\n}\n\nexport function validateFetchMode(\n req: IncomingMessage,\n expectedMode: readonly (\n | null\n | 'navigate'\n | 'same-origin'\n | 'no-cors'\n | 'cors'\n )[],\n) {\n validateHeaderValue(req, 'sec-fetch-mode', expectedMode)\n}\n\nexport function validateFetchDest(\n req: IncomingMessage,\n expectedDest: readonly (\n | null\n | 'document'\n | 'embed'\n | 'font'\n | 'image'\n | 'manifest'\n | 'media'\n | 'object'\n | 'report'\n | 'script'\n | 'serviceworker'\n | 'sharedworker'\n | 'style'\n | 'worker'\n | 'xslt'\n )[],\n) {\n validateHeaderValue(req, 'sec-fetch-dest', expectedDest)\n}\n\nexport function validateFetchSite(\n req: IncomingMessage,\n expectedSite: readonly (\n | null\n | 'same-origin'\n | 'same-site'\n | 'cross-site'\n | 'none'\n )[],\n) {\n validateHeaderValue(req, 'sec-fetch-site', expectedSite)\n}\n\nexport function validateReferrer(\n req: IncomingMessage,\n reference: UrlReference,\n allowNull: true,\n): URL | null\nexport function validateReferrer(\n req: IncomingMessage,\n reference: UrlReference,\n allowNull?: false,\n): URL\nexport function validateReferrer(\n req: IncomingMessage,\n reference: UrlReference,\n allowNull = false,\n) {\n // @NOTE The header name \"referer\" is actually a misspelling of the word\n // \"referrer\". https://en.wikipedia.org/wiki/HTTP_referer\n const referrer = req.headers['referer']\n const referrerUrl = referrer ? new URL(referrer) : null\n if (referrerUrl ? !urlMatch(referrerUrl, reference) : !allowNull) {\n throw createHttpError(400, `Invalid referrer ${referrer}`)\n }\n return referrerUrl\n}\n\nexport function validateOrigin(\n req: IncomingMessage,\n expectedOrigin: string,\n optional = true,\n) {\n const reqOrigin = req.headers['origin']\n if (reqOrigin ? reqOrigin !== expectedOrigin : !optional) {\n throw createHttpError(400, `Invalid origin ${reqOrigin}`)\n }\n}\n\nexport type { CookieSerializeOptions }\n\nexport function setCookie(\n res: ServerResponse,\n cookieName: string,\n value: string,\n options?: CookieSerializeOptions,\n) {\n appendHeader(res, 'Set-Cookie', serializeCookie(cookieName, value, options))\n}\n\nexport function clearCookie(\n res: ServerResponse,\n cookieName: string,\n options?: Omit<CookieSerializeOptions, 'maxAge' | 'expires'>,\n) {\n setCookie(res, cookieName, '', { ...options, maxAge: 0 })\n}\n\nexport function parseHttpCookies(\n req: IncomingMessage & { cookies?: any },\n): Record<string, undefined | string> {\n req.cookies ??= req.headers['cookie']\n ? parseCookie(req.headers['cookie'])\n : Object.create(null)\n return req.cookies\n}\n\nexport type ExtractRequestMetadataOptions = {\n /**\n * A function that determines whether a given IP address is trusted. The\n * function is called with the IP addresses and its index in the list of\n * forwarded addresses (starting from 0, 0 corresponding to the ip of the\n * incoming HTTP connection, and the last item being the first proxied IP\n * address in the proxy chain, deduced from the `X-Forwarded-For` header). The\n * function should return `true` if the IP address is trusted, and `false`\n * otherwise.\n *\n * @see {@link https://www.npmjs.com/package/proxy-addr} for a utility that\n * allows you to create a trust function.\n */\n trustProxy?: (addr: string, i: number) => boolean\n}\n\nexport type RequestMetadata = {\n userAgent?: string\n ipAddress: string\n port: number\n}\n\nexport function extractRequestMetadata(\n req: IncomingMessage,\n options?: ExtractRequestMetadataOptions,\n): RequestMetadata {\n const ip = extractIp(req, options)\n return {\n userAgent: req.headers['user-agent'],\n ipAddress: ip,\n port: extractPort(req, ip),\n }\n}\n\nfunction extractIp(\n req: IncomingMessage,\n options?: ExtractRequestMetadataOptions,\n): string {\n const trust = options?.trustProxy\n if (trust) {\n const ips = forwarded(req)\n for (let i = 0; i < ips.length; i++) {\n const isTrusted = trust(ips[i], i)\n if (!isTrusted) return ips[i]\n }\n // Let's return the last (\"furthest\") IP address in the chain if all of them\n // are trusted. Note that this may indicate an issue with either the trust\n // function (too permissive), or the proxy configuration (one of them not\n // setting the X-Forwarded-For header).\n const ip = ips[ips.length - 1]\n if (ip) return ip\n }\n\n // Express app compatibility (see \"trust proxy\" setting)\n if ('ip' in req) {\n const ip = req.ip\n if (typeof ip === 'string') return ip\n }\n\n const ip = req.socket.remoteAddress\n if (ip) return ip\n\n throw new Error('Could not determine IP address')\n}\n\nfunction extractPort(req: IncomingMessage, ip: string): number {\n if (ip !== req.socket.remoteAddress) {\n // Trust the X-Forwarded-Port header only if the IP address was a trusted\n // proxied IP.\n const forwardedPort = req.headers['x-forwarded-port']\n if (typeof forwardedPort === 'string') {\n const port = Number(forwardedPort.trim())\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n throw new Error('Invalid forwarded port')\n }\n return port\n }\n }\n\n const port = req.socket.remotePort\n if (port != null) return port\n\n throw new Error('Could not determine port')\n}\n\nexport function extractLocales(req: IncomingMessage) {\n const acceptLanguage = req.headers['accept-language']\n return acceptLanguage ? languages(acceptLanguage) : []\n}\n\nexport function negotiateResponseContent<T extends string>(\n req: IncomingMessage,\n types: readonly T[],\n): T | undefined {\n const type = mediaType(req.headers['accept'], types)\n if (type) return type as T\n\n return undefined\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/lib/http/response.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/lib/http/response.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { type Readable, pipeline } from 'node:stream'\nimport createHttpError from 'http-errors'\nimport { Awaitable } from '../util/type.js'\nimport { negotiateResponseContent } from './request.js'\nimport {\n SecurityHeadersOptions,\n setSecurityHeaders,\n} from './security-headers.js'\nimport type { Handler, Middleware } from './types.js'\n\nexport function writeRedirect(\n res: ServerResponse,\n url: string,\n status = 302,\n): void {\n res.writeHead(status, { Location: url }).end()\n}\n\nexport type WriteResponseOptions = {\n status?: number\n contentType?: string\n}\n\nexport function writeStream(\n res: ServerResponse,\n stream: Readable,\n {\n status = 200,\n contentType = 'application/octet-stream',\n }: WriteResponseOptions = {},\n): void {\n res.statusCode = status\n res.setHeader('content-type', contentType)\n\n if (res.req.method === 'HEAD') {\n res.end()\n stream.destroy()\n } else {\n pipeline([stream, res], (_err: Error | null) => {\n // The error will be propagated through the streams\n })\n }\n}\n\nexport function writeBuffer(\n res: ServerResponse,\n chunk: string | Buffer,\n opts: WriteResponseOptions,\n): void {\n if (opts?.status != null) res.statusCode = opts.status\n res.setHeader('content-type', opts?.contentType || 'application/octet-stream')\n res.end(chunk)\n}\n\nexport function toJsonBuffer(value: unknown): Buffer {\n try {\n return Buffer.from(JSON.stringify(value))\n } catch (cause) {\n throw new Error(`Failed to serialize as JSON`, { cause })\n }\n}\n\nexport function writeJson(\n res: ServerResponse,\n payload: unknown,\n { contentType = 'application/json', ...options }: WriteResponseOptions = {},\n): void {\n const buffer = toJsonBuffer(payload)\n writeBuffer(res, buffer, { ...options, contentType })\n}\n\nexport function staticJsonMiddleware(\n value: unknown,\n { contentType = 'application/json', ...options }: WriteResponseOptions = {},\n): Handler<unknown> {\n const buffer = toJsonBuffer(value)\n const staticOptions: WriteResponseOptions = { ...options, contentType }\n return function (req, res) {\n writeBuffer(res, buffer, staticOptions)\n }\n}\n\nexport type WriteHtmlOptions = WriteResponseOptions & SecurityHeadersOptions\n\nexport function writeHtml(\n res: ServerResponse,\n html: Buffer | string,\n { contentType = 'text/html', ...options }: WriteHtmlOptions = {},\n): void {\n // HTML pages should always be served with safety protection headers\n setSecurityHeaders(res, options)\n writeBuffer(res, html, { ...options, contentType })\n}\n\nexport function cacheControlMiddleware(maxAge: number): Middleware<void> {\n const header = `max-age=${maxAge}`\n return function (req, res, next) {\n res.setHeader('Cache-Control', header)\n next()\n }\n}\n\nexport type JsonResponse<P = unknown> = WriteResponseOptions & {\n json: P\n}\n\nexport function jsonHandler<\n T,\n Req extends IncomingMessage = IncomingMessage,\n Res extends ServerResponse = ServerResponse,\n>(\n buildJson: (this: T, req: Req, res: Res) => Awaitable<JsonResponse>,\n): Middleware<T, Req, Res> {\n return function (req, res, next) {\n // Ensure we can agree on a content encoding & type before starting to\n // build the JSON response.\n if (negotiateResponseContent(req, ['application/json'])) {\n // A middleware should not be async, so we wrap the async operation in a\n // promise and return it.\n void (async () => {\n try {\n const jsonResponse = await buildJson.call(this, req, res)\n const { json, status = 200, ...options } = jsonResponse\n writeJson(res, json, { ...options, status })\n } catch (err) {\n next(asError(err, 'Failed to build JSON response'))\n }\n })()\n } else {\n next(createHttpError(406, 'Unsupported media type'))\n }\n }\n}\n\nfunction asError(cause: unknown, message: string): Error {\n return cause instanceof Error ? cause : new Error(message, { cause })\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../src/lib/http/route.ts"],"names":[],"mappings":";;AAgCA,kCA2BC;AA1DD,6CAA6C;AAC7C,2CAAqE;AACrE,mDAAoD;AACpD,uCAA2D;AAc3D;;;;;;;;;;;;;GAaG;AACH,SAAgB,WAAW,CAMzB,MAA0B,EAC1B,IAAa,EACb,GAAG,EAAqC;IAExC,MAAM,aAAa,GAAG,IAAA,2BAAiB,EAAI,IAAI,CAAC,CAAA;IAChD,MAAM,aAAa,GAAG,IAAA,+BAAmB,EAAC,MAAM,CAAC,CAAA;IAEjD,MAAM,UAAU,GAAG,IAAA,kCAAkB,EAAC,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAA;IAEnE,OAAO,UAAU,GAAG,EAAE,GAAG,EAAE,IAAI;QAC7B,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAA;YAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;YACtC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,IAAA,mBAAM,EAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;gBACxC,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YACjD,CAAC;QACH,CAAC;QAED,OAAO,IAAI,EAAE,CAAA;IACf,CAAC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../src/lib/http/route.ts"],"names":[],"mappings":";;AAgCA,kCA2BC;AA1DD,6CAA6C;AAC7C,2CAAqE;AACrE,mDAAoD;AACpD,uCAA2D;AAc3D;;;;;;;;;;;;;GAaG;AACH,SAAgB,WAAW,CAMzB,MAA0B,EAC1B,IAAa,EACb,GAAG,EAAqC;IAExC,MAAM,aAAa,GAAG,IAAA,2BAAiB,EAAI,IAAI,CAAC,CAAA;IAChD,MAAM,aAAa,GAAG,IAAA,+BAAmB,EAAC,MAAM,CAAC,CAAA;IAEjD,MAAM,UAAU,GAAG,IAAA,kCAAkB,EAAC,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAA;IAEnE,OAAO,UAAU,GAAG,EAAE,GAAG,EAAE,IAAI;QAC7B,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAA;YAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;YACtC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,IAAA,mBAAM,EAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;gBACxC,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YACjD,CAAC;QACH,CAAC;QAED,OAAO,IAAI,EAAE,CAAA;IACf,CAAC,CAAA;AACH,CAAC","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { SubCtx, subCtx } from './context.js'\nimport { MethodMatcherInput, createMethodMatcher } from './method.js'\nimport { combineMiddlewares } from './middleware.js'\nimport { Params, Path, createPathMatcher } from './path.js'\nimport { Middleware } from './types.js'\n\nexport type RouteCtx<\n T extends object | void,\n P extends Params = Params,\n> = SubCtx<T, { params: Readonly<P> }>\nexport type RouteMiddleware<\n T extends object | void,\n P extends Params,\n Req = IncomingMessage,\n Res = ServerResponse,\n> = Middleware<RouteCtx<T, P>, Req, Res>\n\n/**\n * @example\n * ```ts\n * createRoute<{ foo: string }>('GET', '/foo/:foo', function (req, res) {\n * console.log(this.params.foo) // OK\n * console.log(this.params.bar) // Error\n * })\n *\n * createRoute<{ foo: string }>(['POST', 'PUT'], '/foo/:foo', function (req, res) {\n * console.log(this.params.foo) // OK\n * console.log(this.params.bar) // Error\n * })\n * ```\n */\nexport function createRoute<\n P extends Params = Params,\n T extends object | void = void,\n Req extends IncomingMessage = IncomingMessage,\n Res extends ServerResponse = ServerResponse,\n>(\n method: MethodMatcherInput,\n path: Path<P>,\n ...mw: RouteMiddleware<T, P, Req, Res>[]\n): Middleware<T, Req, Res> {\n const paramsMatcher = createPathMatcher<P>(path)\n const methodMatcher = createMethodMatcher(method)\n\n const middleware = combineMiddlewares(mw, { skipKeyword: 'route' })\n\n return function (req, res, next) {\n if (methodMatcher(req)) {\n const pathname = req.url?.split('?')[0] ?? '/'\n const params = paramsMatcher(pathname)\n if (params) {\n const context = subCtx(this, { params })\n return middleware.call(context, req, res, next)\n }\n }\n\n return next()\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/lib/http/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/lib/http/router.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { SubCtx, subCtx } from './context.js'\nimport { MethodMatcherInput } from './method.js'\nimport { combineMiddlewares } from './middleware.js'\nimport { Params, Path } from './path.js'\nimport { RouteMiddleware, createRoute } from './route.js'\nimport { Middleware } from './types.js'\n\nexport type RouterCtx<T extends object | void = void> = SubCtx<\n T,\n { url: Readonly<URL> }\n>\n\nexport type RouterMiddleware<\n T extends object | void = void,\n Req = IncomingMessage,\n Res = ServerResponse,\n> = Middleware<RouterCtx<T>, Req, Res>\n\nexport type RouterConfig = {\n /** Used to build the origin of the {@link RouterCtx['url']} context property */\n protocol?: string\n /** Used to build the origin of the {@link RouterCtx['url']} context property */\n host?: string\n}\n\nexport class Router<\n T extends object | void = void,\n Req extends IncomingMessage = IncomingMessage,\n Res extends ServerResponse = ServerResponse,\n> {\n private readonly middlewares: RouterMiddleware<T, Req, Res>[] = []\n\n constructor(private readonly config?: RouterConfig) {}\n\n use(...middlewares: RouterMiddleware<T, Req, Res>[]) {\n this.middlewares.push(...middlewares)\n return this\n }\n\n all<P extends Params = Params>(\n path: Path<P>,\n ...mw: RouteMiddleware<RouterCtx<T>, P, Req, Res>[]\n ) {\n return this.addRoute<P>('*', path, ...mw)\n }\n\n get<P extends Params = Params>(\n path: Path<P>,\n ...mw: RouteMiddleware<RouterCtx<T>, P, Req, Res>[]\n ) {\n return this.addRoute<P>('GET', path, ...mw)\n }\n\n post<P extends Params = Params>(\n path: Path<P>,\n ...mw: RouteMiddleware<RouterCtx<T>, P, Req, Res>[]\n ) {\n return this.addRoute<P>('POST', path, ...mw)\n }\n\n options<P extends Params = Params>(\n path: Path<P>,\n ...mw: RouteMiddleware<RouterCtx<T>, P, Req, Res>[]\n ) {\n return this.addRoute<P>('OPTIONS', path, ...mw)\n }\n\n addRoute<P extends Params>(\n method: MethodMatcherInput,\n path: Path<P>,\n ...mw: RouteMiddleware<RouterCtx<T>, P, Req, Res>[]\n ) {\n return this.use(createRoute(method, path, ...mw))\n }\n\n /**\n * @returns router middleware which dispatches a route matching the request.\n */\n buildMiddleware(): Middleware<T, Req, Res> {\n const { config } = this\n\n // Calling next('router') from a middleware will skip all the remaining\n // middlewares in the stack.\n const middleware = combineMiddlewares(this.middlewares, {\n skipKeyword: 'router',\n })\n\n return function (this, req, res, next) {\n // Parse the URL using node's URL parser.\n const url = extractUrl(req, config)\n if (url instanceof Error) return next(url)\n\n // Any error thrown here will be uncaught/unhandled (a middleware should\n // never throw)\n const context = subCtx(this, { url })\n middleware.call(context, req, res, next)\n }\n }\n}\n\nfunction extractUrl(req: IncomingMessage, config?: RouterConfig): URL | Error {\n try {\n const protocol = config?.protocol || 'https:'\n const host = config?.host || req.headers.host || 'localhost'\n const pathname = req.url || '/'\n return new URL(pathname, `${protocol}//${host}`)\n } catch (cause) {\n const error =\n cause instanceof Error ? cause : new Error('Invalid URL', { cause })\n return Object.assign(error, { status: 400, statusCode: 400 })\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"security-headers.js","sourceRoot":"","sources":["../../../src/lib/http/security-headers.ts"],"names":[],"mappings":";;;AAoDA,gDA+BC;AAlFD,8CAA0D;AAE1D;;GAEG;AACH,IAAY,yBAIX;AAJD,WAAY,yBAAyB;IACnC,uDAA0B,CAAA;IAC1B,yDAA4B,CAAA;IAC5B,8DAAiC,CAAA;AACnC,CAAC,EAJW,yBAAyB,yCAAzB,yBAAyB,QAIpC;AAED;;GAEG;AACH,IAAY,yBAIX;AAJD,WAAY,yBAAyB;IACnC,mDAAsB,CAAA;IACtB,uDAA0B,CAAA;IAC1B,yDAA4B,CAAA;AAC9B,CAAC,EAJW,yBAAyB,yCAAzB,yBAAyB,QAIpC;AAED;;GAEG;AACH,IAAY,uBAKX;AALD,WAAY,uBAAuB;IACjC,qDAA0B,CAAA;IAC1B,6EAAkD,CAAA;IAClD,qDAA0B,CAAA;IAC1B,wEAA6C,CAAA;AAC/C,CAAC,EALW,uBAAuB,uCAAvB,uBAAuB,QAKlC;AAuBD,SAAgB,kBAAkB,CAChC,GAAmB,EACnB,EACE,GAAG,GAAG,EAAE,aAAa,EAAE,CAAC,QAAQ,CAAC,EAAE,EACnC,IAAI,GAAG,yBAAyB,CAAC,WAAW,EAC5C,IAAI,GAAG,yBAAyB,CAAC,UAAU,EAC3C,IAAI,GAAG,uBAAuB,CAAC,UAAU,EACzC,IAAI,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GACJ;IAEzB,yEAAyE;IACzE,wEAAwE;IACxE,MAAM,SAAS,GAAG,IAAA,mBAAQ,EAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,SAAS,EAAE,CAAC;QACd,GAAG,CAAC,SAAS,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAA;IACrD,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,IAAI,CAAC,CAAA;IACnD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,IAAI,CAAC,CAAA;IACnD,GAAG,CAAC,SAAS,CAAC,4BAA4B,EAAE,IAAI,CAAC,CAAA;IAEjD,IAAI,IAAI,EAAE,CAAC;QACT,GAAG,CAAC,SAAS,CAAC,2BAA2B,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAA;IAClE,CAAC;IAED,4CAA4C;IAC5C,GAAG,CAAC,SAAS,CAAC,oBAAoB,EAAE,uCAAuC,CAAC,CAAA;IAC5E,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAA;IAC/C,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;IACxC,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAA;IAClD,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,MAAyC;IAC/D,IAAI,KAAK,GAAG,WAAW,MAAM,CAAC,MAAM,EAAE,CAAA;IACtC,IAAI,MAAM,CAAC,iBAAiB;QAAE,KAAK,IAAI,qBAAqB,CAAA;IAC5D,IAAI,MAAM,CAAC,OAAO;QAAE,KAAK,IAAI,WAAW,CAAA;IACxC,OAAO,KAAK,CAAA;AACd,CAAC"}
1
+ {"version":3,"file":"security-headers.js","sourceRoot":"","sources":["../../../src/lib/http/security-headers.ts"],"names":[],"mappings":";;;AAoDA,gDA+BC;AAlFD,8CAA0D;AAE1D;;GAEG;AACH,IAAY,yBAIX;AAJD,WAAY,yBAAyB;IACnC,uDAA0B,CAAA;IAC1B,yDAA4B,CAAA;IAC5B,8DAAiC,CAAA;AACnC,CAAC,EAJW,yBAAyB,yCAAzB,yBAAyB,QAIpC;AAED;;GAEG;AACH,IAAY,yBAIX;AAJD,WAAY,yBAAyB;IACnC,mDAAsB,CAAA;IACtB,uDAA0B,CAAA;IAC1B,yDAA4B,CAAA;AAC9B,CAAC,EAJW,yBAAyB,yCAAzB,yBAAyB,QAIpC;AAED;;GAEG;AACH,IAAY,uBAKX;AALD,WAAY,uBAAuB;IACjC,qDAA0B,CAAA;IAC1B,6EAAkD,CAAA;IAClD,qDAA0B,CAAA;IAC1B,wEAA6C,CAAA;AAC/C,CAAC,EALW,uBAAuB,uCAAvB,uBAAuB,QAKlC;AAuBD,SAAgB,kBAAkB,CAChC,GAAmB,EACnB,EACE,GAAG,GAAG,EAAE,aAAa,EAAE,CAAC,QAAQ,CAAC,EAAE,EACnC,IAAI,GAAG,yBAAyB,CAAC,WAAW,EAC5C,IAAI,GAAG,yBAAyB,CAAC,UAAU,EAC3C,IAAI,GAAG,uBAAuB,CAAC,UAAU,EACzC,IAAI,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GACJ;IAEzB,yEAAyE;IACzE,wEAAwE;IACxE,MAAM,SAAS,GAAG,IAAA,mBAAQ,EAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,SAAS,EAAE,CAAC;QACd,GAAG,CAAC,SAAS,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAA;IACrD,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,IAAI,CAAC,CAAA;IACnD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,IAAI,CAAC,CAAA;IACnD,GAAG,CAAC,SAAS,CAAC,4BAA4B,EAAE,IAAI,CAAC,CAAA;IAEjD,IAAI,IAAI,EAAE,CAAC;QACT,GAAG,CAAC,SAAS,CAAC,2BAA2B,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAA;IAClE,CAAC;IAED,4CAA4C;IAC5C,GAAG,CAAC,SAAS,CAAC,oBAAoB,EAAE,uCAAuC,CAAC,CAAA;IAC5E,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAA;IAC/C,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;IACxC,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAA;IAClD,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,MAAyC;IAC/D,IAAI,KAAK,GAAG,WAAW,MAAM,CAAC,MAAM,EAAE,CAAA;IACtC,IAAI,MAAM,CAAC,iBAAiB;QAAE,KAAK,IAAI,qBAAqB,CAAA;IAC5D,IAAI,MAAM,CAAC,OAAO;QAAE,KAAK,IAAI,WAAW,CAAA;IACxC,OAAO,KAAK,CAAA;AACd,CAAC","sourcesContent":["import type { ServerResponse } from 'node:http'\nimport { type CspConfig, buildCsp } from '../csp/index.js'\n\n/**\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Embedder-Policy COEP on MDN}\n */\nexport enum CrossOriginEmbedderPolicy {\n unsafeNone = 'unsafe-none',\n requireCorp = 'require-corp',\n credentialless = 'credentialless',\n}\n\n/**\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Resource-Policy CORP on MDN}\n */\nexport enum CrossOriginResourcePolicy {\n sameSite = 'same-site',\n sameOrigin = 'same-origin',\n crossOrigin = 'cross-origin',\n}\n\n/**\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Opener-Policy COOP on MDN}\n */\nexport enum CrossOriginOpenerPolicy {\n unsafeNone = 'unsafe-none',\n sameOriginAllowPopups = 'same-origin-allow-popups',\n sameOrigin = 'same-origin',\n noopenerAllowPopups = 'noopener-allow-popups',\n}\n\nexport type HTTPStrictTransportSecurityConfig = {\n maxAge: number\n includeSubDomains?: boolean\n preload?: boolean\n}\n\nexport type SecurityHeadersOptions = {\n /**\n * Defaults to `default-src: 'none'`. Use an empty object to disable CSP.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy CSP on MDN}\n */\n csp?: CspConfig\n coep?: CrossOriginEmbedderPolicy\n corp?: CrossOriginResourcePolicy\n coop?: CrossOriginOpenerPolicy\n /**\n * Defaults to 2 years. Use `false` to disable HSTS.\n */\n hsts?: HTTPStrictTransportSecurityConfig | false\n}\n\nexport function setSecurityHeaders(\n res: ServerResponse,\n {\n csp = { 'default-src': [\"'none'\"] },\n coep = CrossOriginEmbedderPolicy.requireCorp,\n corp = CrossOriginResourcePolicy.sameOrigin,\n coop = CrossOriginOpenerPolicy.sameOrigin,\n hsts = { maxAge: 63072000 },\n }: SecurityHeadersOptions,\n): void {\n // @NOTE Never set CSP through http-equiv meta as not all directives will\n // be honored. Always set it through the Content-Security-Policy header.\n const cspString = buildCsp(csp)\n if (cspString) {\n res.setHeader('Content-Security-Policy', cspString)\n }\n\n res.setHeader('Cross-Origin-Embedder-Policy', coep)\n res.setHeader('Cross-Origin-Resource-Policy', corp)\n res.setHeader('Cross-Origin-Opener-Policy', coop)\n\n if (hsts) {\n res.setHeader('Strict-Transport-Security', buildHstsValue(hsts))\n }\n\n // @TODO make these headers configurable (?)\n res.setHeader('Permissions-Policy', 'otp-credentials=*, document-domain=()')\n res.setHeader('Referrer-Policy', 'same-origin')\n res.setHeader('X-Frame-Options', 'DENY')\n res.setHeader('X-Content-Type-Options', 'nosniff')\n res.setHeader('X-XSS-Protection', '0')\n}\n\nfunction buildHstsValue(config: HTTPStrictTransportSecurityConfig): string {\n let value = `max-age=${config.maxAge}`\n if (config.includeSubDomains) value += '; includeSubDomains'\n if (config.preload) value += '; preload'\n return value\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../src/lib/http/stream.ts"],"names":[],"mappings":";;;;;AAYA,8CAQC;AASD,4CAqBC;AAED,kCAIC;AAtDD,8DAAyC;AACzC,4CAAkE;AAClE,2CAMoB;AAEpB,SAAgB,iBAAiB,CAAC,GAAoB;IACpD,IAAI,CAAC;QACH,OAAO,IAAA,qBAAY,EAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GACX,KAAK,YAAY,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAA;QACzE,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAChD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AAEI,KAAK,UAAU,gBAAgB,CACpC,GAAoB,EACpB,KAAQ;IAER,MAAM,IAAI,GAAG,IAAA,4BAAgB,EAC3B,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,0BAA0B,CAC1D,CAAA;IAED,MAAM,MAAM,GAAG,mBAAO,CAAC,IAAI,CACzB,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAClE,CAAA;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,6BAA6B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IACtE,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IACrC,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAkB,EAAC,MAAM,CAAC,CAAA;IAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAE/B,CAAA;AACH,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,MAA0B;IAC1D,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QAC7B,mCAAmC;IACrC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../src/lib/http/stream.ts"],"names":[],"mappings":";;;;;AAYA,8CAQC;AASD,4CAqBC;AAED,kCAIC;AAtDD,8DAAyC;AACzC,4CAAkE;AAClE,2CAMoB;AAEpB,SAAgB,iBAAiB,CAAC,GAAoB;IACpD,IAAI,CAAC;QACH,OAAO,IAAA,qBAAY,EAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GACX,KAAK,YAAY,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAA;QACzE,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAChD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AAEI,KAAK,UAAU,gBAAgB,CACpC,GAAoB,EACpB,KAAQ;IAER,MAAM,IAAI,GAAG,IAAA,4BAAgB,EAC3B,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,0BAA0B,CAC1D,CAAA;IAED,MAAM,MAAM,GAAG,mBAAO,CAAC,IAAI,CACzB,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAClE,CAAA;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,6BAA6B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IACtE,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IACrC,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAkB,EAAC,MAAM,CAAC,CAAA;IAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAE/B,CAAA;AACH,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,MAA0B;IAC1D,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QAC7B,mCAAmC;IACrC,CAAC;AACH,CAAC","sourcesContent":["import type { IncomingMessage } from 'node:http'\nimport { Readable } from 'node:stream'\nimport createHttpError from 'http-errors'\nimport { decodeStream, streamToNodeBuffer } from '@atproto/common'\nimport {\n KnownNames,\n KnownParser,\n ParserResult,\n parseContentType,\n parsers,\n} from './parser.js'\n\nexport function decodeHttpRequest(req: IncomingMessage): Readable {\n try {\n return decodeStream(req, req.headers['content-encoding'])\n } catch (cause) {\n const message =\n cause instanceof TypeError ? cause.message : `Invalid content-encoding`\n throw createHttpError(415, message, { cause })\n }\n}\n\n/**\n * Generic method that parses a stream of unknown nature (HTTP request/response,\n * socket, file, etc.), but of known mime type, into a parsed object.\n *\n * @throws {TypeError} If the content-type is not valid or supported.\n */\n\nexport async function parseHttpRequest<A extends readonly KnownNames[]>(\n req: IncomingMessage,\n allow: A,\n) {\n const type = parseContentType(\n req.headers['content-type'] ?? 'application/octet-stream',\n )\n\n const parser = parsers.find(\n (parser) => allow.includes(parser.name) && parser.test(type.mime),\n )\n\n if (!parser) {\n throw createHttpError(415, `Unsupported content-type: ${type.mime}`)\n }\n\n const stream = decodeHttpRequest(req)\n const buffer = await streamToNodeBuffer(stream)\n return parser.parse(buffer, type) as ParserResult<\n Extract<KnownParser, { name: A[number] }>\n >\n}\n\nexport async function flushStream(stream: AsyncIterable<any>): Promise<void> {\n for await (const _ of stream) {\n // Consume the stream to completion\n }\n}\n"]}