@simulacrum/auth0-simulator 0.11.1 → 0.11.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 (105) hide show
  1. package/dist/_virtual/rolldown_runtime.cjs +29 -0
  2. package/dist/_virtual/rolldown_runtime.mjs +7 -0
  3. package/dist/auth/constants.cjs +15 -0
  4. package/dist/auth/constants.mjs +14 -0
  5. package/dist/auth/constants.mjs.map +1 -0
  6. package/dist/auth/date.cjs +8 -0
  7. package/dist/auth/date.mjs +7 -0
  8. package/dist/auth/date.mjs.map +1 -0
  9. package/dist/auth/jwt.cjs +16 -0
  10. package/dist/auth/jwt.mjs +15 -0
  11. package/dist/auth/jwt.mjs.map +1 -0
  12. package/dist/auth/refresh-token.cjs +24 -0
  13. package/dist/auth/refresh-token.mjs +23 -0
  14. package/dist/auth/refresh-token.mjs.map +1 -0
  15. package/dist/config/get-config.cjs +39 -0
  16. package/dist/config/get-config.mjs +39 -0
  17. package/dist/config/get-config.mjs.map +1 -0
  18. package/dist/handlers/auth0-handlers.cjs +207 -0
  19. package/dist/handlers/auth0-handlers.mjs +207 -0
  20. package/dist/handlers/auth0-handlers.mjs.map +1 -0
  21. package/dist/handlers/index.cjs +29 -0
  22. package/dist/handlers/index.mjs +27 -0
  23. package/dist/handlers/index.mjs.map +1 -0
  24. package/dist/handlers/login-redirect.cjs +24 -0
  25. package/dist/handlers/login-redirect.mjs +24 -0
  26. package/dist/handlers/login-redirect.mjs.map +1 -0
  27. package/dist/handlers/oauth-handlers.cjs +144 -0
  28. package/dist/handlers/oauth-handlers.mjs +144 -0
  29. package/dist/handlers/oauth-handlers.mjs.map +1 -0
  30. package/dist/handlers/openid-handlers.cjs +32 -0
  31. package/dist/handlers/openid-handlers.mjs +33 -0
  32. package/dist/handlers/openid-handlers.mjs.map +1 -0
  33. package/dist/handlers/url.cjs +6 -0
  34. package/dist/handlers/url.mjs +6 -0
  35. package/dist/handlers/url.mjs.map +1 -0
  36. package/dist/handlers/utils.cjs +25 -0
  37. package/dist/handlers/utils.mjs +24 -0
  38. package/dist/handlers/utils.mjs.map +1 -0
  39. package/dist/handlers/web-message.cjs +23 -0
  40. package/dist/handlers/web-message.mjs +23 -0
  41. package/dist/handlers/web-message.mjs.map +1 -0
  42. package/dist/index.cjs +15 -38751
  43. package/dist/index.d.cts +7 -175
  44. package/dist/index.d.cts.map +1 -1
  45. package/dist/index.d.mts +21 -0
  46. package/dist/index.d.mts.map +1 -0
  47. package/dist/index.mjs +22 -0
  48. package/dist/index.mjs.map +1 -0
  49. package/dist/middleware/create-cors.cjs +15 -0
  50. package/dist/middleware/create-cors.mjs +14 -0
  51. package/dist/middleware/create-cors.mjs.map +1 -0
  52. package/dist/middleware/error-handling.cjs +25 -0
  53. package/dist/middleware/error-handling.mjs +25 -0
  54. package/dist/middleware/error-handling.mjs.map +1 -0
  55. package/dist/middleware/no-cache.cjs +10 -0
  56. package/dist/middleware/no-cache.mjs +10 -0
  57. package/dist/middleware/no-cache.mjs.map +1 -0
  58. package/dist/middleware/session.cjs +19 -0
  59. package/dist/middleware/session.mjs +18 -0
  60. package/dist/middleware/session.mjs.map +1 -0
  61. package/dist/rules/extensionless-file-name.cjs +6 -0
  62. package/dist/rules/extensionless-file-name.mjs +6 -0
  63. package/dist/rules/extensionless-file-name.mjs.map +1 -0
  64. package/dist/rules/parse-rules-files.cjs +28 -0
  65. package/dist/rules/parse-rules-files.mjs +26 -0
  66. package/dist/rules/parse-rules-files.mjs.map +1 -0
  67. package/dist/rules/rules-runner.cjs +67 -0
  68. package/dist/rules/rules-runner.mjs +65 -0
  69. package/dist/rules/rules-runner.mjs.map +1 -0
  70. package/dist/store/entities.cjs +37 -0
  71. package/dist/store/entities.d.cts +99 -0
  72. package/dist/store/entities.d.cts.map +1 -0
  73. package/dist/store/entities.d.mts +100 -0
  74. package/dist/store/entities.d.mts.map +1 -0
  75. package/dist/store/entities.mjs +34 -0
  76. package/dist/store/entities.mjs.map +1 -0
  77. package/dist/store/index.cjs +44 -0
  78. package/dist/store/index.d.cts +22 -0
  79. package/dist/store/index.d.cts.map +1 -0
  80. package/dist/store/index.d.mts +22 -0
  81. package/dist/store/index.d.mts.map +1 -0
  82. package/dist/store/index.mjs +45 -0
  83. package/dist/store/index.mjs.map +1 -0
  84. package/dist/types.cjs +24 -0
  85. package/dist/types.d.cts +66 -0
  86. package/dist/types.d.cts.map +1 -0
  87. package/dist/types.d.mts +66 -0
  88. package/dist/types.d.mts.map +1 -0
  89. package/dist/types.mjs +24 -0
  90. package/dist/types.mjs.map +1 -0
  91. package/dist/views/login.cjs +145 -0
  92. package/dist/views/login.mjs +146 -0
  93. package/dist/views/login.mjs.map +1 -0
  94. package/dist/views/username-password.cjs +39 -0
  95. package/dist/views/username-password.mjs +39 -0
  96. package/dist/views/username-password.mjs.map +1 -0
  97. package/dist/views/web-message.cjs +66 -0
  98. package/dist/views/web-message.mjs +65 -0
  99. package/dist/views/web-message.mjs.map +1 -0
  100. package/package.json +9 -9
  101. package/dist/index.d.ts +0 -189
  102. package/dist/index.d.ts.map +0 -1
  103. package/dist/index.js +0 -38747
  104. package/dist/index.js.map +0 -1
  105. /package/dist/{public → views/public}/img/frontside-logo.png +0 -0
@@ -0,0 +1,29 @@
1
+ //#region rolldown:runtime
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) {
13
+ __defProp(to, key, {
14
+ get: ((k) => from[k]).bind(null, key),
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ });
17
+ }
18
+ }
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
23
+ value: mod,
24
+ enumerable: true
25
+ }) : target, mod));
26
+
27
+ //#endregion
28
+
29
+ exports.__toESM = __toESM;
@@ -0,0 +1,7 @@
1
+ import { createRequire } from "node:module";
2
+
3
+ //#region rolldown:runtime
4
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
5
+
6
+ //#endregion
7
+ export { __require };
@@ -0,0 +1,15 @@
1
+
2
+ //#region src/auth/constants.ts
3
+ const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----~~MIIEpAIBAAKCAQEAwzwwEqR5p7a6CaG61i3od+GLTyype3t/f0pwwtoA9NsZANcj~~HaAUR/qzqlNRQlLI687vF1OfbETYLeHIT5V36QGrMfrYR/tYAoaKFixC/wOjt8EB~~PoeHgaTOAyGf3V3YNwocNU+StyV1X4hPmDjCrapNYpbKIcAJwq5Ij0WBKGNXBcUU~~bAceRtLqgzf/6x2vcQJeE5nJK5gd41f/jtlK9Xge0Ig6CcdKOI7U3agyI/iNF3SL~~0bnCfvtDRIkgAzzeN5Yj4S3Z4rJVQ1RgzZmqBmnjw8h06G8wDyaQPf19u4F///gF~~+dL1md/fVRKL5UL7OZg42hIZzwzdhrxOGcXUFQIDAQABAoIBAQCSwHUqLjO722Av~~yT/VqqBpLEI4+0tSJFyL4/qqnI/HfcFnnk8o/6D/EfVm/EXCYtPgXKXflN3q1jzh~~ECwvlhySKszyPqnAQa/ABj1ZuV+KrMOtZgh3Zgx3aNfqBqZSES5rANB/ShbwT9nQ~~O3gI5fF/9NlCWDIL+HvduH+WIhqZrfHbTQrntr0sMvYTNE8PkAsB1GGZ5VO8gGGT~~Tg3kKOpNGWAJUYape/1Mb0Z1W8E1YDEaQKCnVY+Whr3+ZuLveDmyTuvLrUi+MAA4~~EaISkBZQo3ehUMjXm/0PdG4U9f2otAOhdwa2eT9irTkNS0TU+bi7VDEEhTmRKyfO~~yyVAGzTpAoGBAOmPbnMBAJYLk0SiQVspxIT+LW3tDWc7aFr/TtqAXkEVxI2xG6wA~~dEyRasBbPJDSWEljMre4g/6GG1fsPj0l5n2S8azy6jIu49ANvZPrrrBsuVYStR18~~MibzxjWWUht3vOCZBKtbqgHbC/oc49jMLPO5XrDFMTJPU5GkWRRLRZArAoGBANX+~~H6NQ7fUg8TUerXEB1WqA+FH4zVqJ/NKjbqaj9FPFWG59AjBVqQ335QzDWNCs/LjD~~REF/6qMeP2adehNhEVv2nK3rS+po9b4yLkiSysLivFPry9AxMGzFr3XzgoDb+y+y~~T02zj2k7nkGlNSSSanIxsp+TzTKsIY7ZbGx6d8y/AoGAS/kSDmq3DBe70cmNxN+z~~QyeDE4zWnUvfyCngNocnIbi49PY1cB+9tOJgfS2wZ9NkUIrqBoUIupRY9KKuJCnd~~7d8MqhtiPuytwhGWJzW030KejvcK3wp1LeKCCRBaqQCr+csMj8kDZhMgtD0NiInx~~3V3hBVM/i4PuRSPWrhlGCX0CgYEAq/xR8TBaD2kqc0b0np6ap75/1WHhqaK9T42K~~oOOkuq8hI6vU1oQCGvfhXyChgRWHB/foI7xrGC53RkHKm0ioawEJa75whTVWTEaI~~bEuOKpOQSOJ6LBlckg9PtbzAZlBm0S6+DfUCjdEcoCXnUD1cz+qhZR+lC9TMI8Mb~~IRRMtIECgYBrVlenf/rHK1UMC3FDmkOzH7agShcDHqzFMR1/NcMDolZNXXFy/u4t~~nDxci1smAUQr4oNs1lk9UzCdt0+pVCjmhbriBngwsS6sazOesDft53w6RTczsRpa~~09YDfcXhnI5yT+vd5r4xA5HhyniY7W1ahSzGDYIGlVm5IReC3P6Caw==~~-----END RSA PRIVATE KEY-----~~";
4
+ const JWKS = { keys: [{
5
+ kty: "RSA",
6
+ n: "wzwwEqR5p7a6CaG61i3od-GLTyype3t_f0pwwtoA9NsZANcjHaAUR_qzqlNRQlLI687vF1OfbETYLeHIT5V36QGrMfrYR_tYAoaKFixC_wOjt8EBPoeHgaTOAyGf3V3YNwocNU-StyV1X4hPmDjCrapNYpbKIcAJwq5Ij0WBKGNXBcUUbAceRtLqgzf_6x2vcQJeE5nJK5gd41f_jtlK9Xge0Ig6CcdKOI7U3agyI_iNF3SL0bnCfvtDRIkgAzzeN5Yj4S3Z4rJVQ1RgzZmqBmnjw8h06G8wDyaQPf19u4F___gF-dL1md_fVRKL5UL7OZg42hIZzwzdhrxOGcXUFQ",
7
+ e: "AQAB",
8
+ alg: "RS256",
9
+ kid: "NkRGQjI5N0RBNUUwMTYwOEMxQUVGQkJBQTJBODBGNTE2MDA5NDM5RA",
10
+ use: "sig"
11
+ }] };
12
+
13
+ //#endregion
14
+ exports.JWKS = JWKS;
15
+ exports.PRIVATE_KEY = PRIVATE_KEY;
@@ -0,0 +1,14 @@
1
+ //#region src/auth/constants.ts
2
+ const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----~~MIIEpAIBAAKCAQEAwzwwEqR5p7a6CaG61i3od+GLTyype3t/f0pwwtoA9NsZANcj~~HaAUR/qzqlNRQlLI687vF1OfbETYLeHIT5V36QGrMfrYR/tYAoaKFixC/wOjt8EB~~PoeHgaTOAyGf3V3YNwocNU+StyV1X4hPmDjCrapNYpbKIcAJwq5Ij0WBKGNXBcUU~~bAceRtLqgzf/6x2vcQJeE5nJK5gd41f/jtlK9Xge0Ig6CcdKOI7U3agyI/iNF3SL~~0bnCfvtDRIkgAzzeN5Yj4S3Z4rJVQ1RgzZmqBmnjw8h06G8wDyaQPf19u4F///gF~~+dL1md/fVRKL5UL7OZg42hIZzwzdhrxOGcXUFQIDAQABAoIBAQCSwHUqLjO722Av~~yT/VqqBpLEI4+0tSJFyL4/qqnI/HfcFnnk8o/6D/EfVm/EXCYtPgXKXflN3q1jzh~~ECwvlhySKszyPqnAQa/ABj1ZuV+KrMOtZgh3Zgx3aNfqBqZSES5rANB/ShbwT9nQ~~O3gI5fF/9NlCWDIL+HvduH+WIhqZrfHbTQrntr0sMvYTNE8PkAsB1GGZ5VO8gGGT~~Tg3kKOpNGWAJUYape/1Mb0Z1W8E1YDEaQKCnVY+Whr3+ZuLveDmyTuvLrUi+MAA4~~EaISkBZQo3ehUMjXm/0PdG4U9f2otAOhdwa2eT9irTkNS0TU+bi7VDEEhTmRKyfO~~yyVAGzTpAoGBAOmPbnMBAJYLk0SiQVspxIT+LW3tDWc7aFr/TtqAXkEVxI2xG6wA~~dEyRasBbPJDSWEljMre4g/6GG1fsPj0l5n2S8azy6jIu49ANvZPrrrBsuVYStR18~~MibzxjWWUht3vOCZBKtbqgHbC/oc49jMLPO5XrDFMTJPU5GkWRRLRZArAoGBANX+~~H6NQ7fUg8TUerXEB1WqA+FH4zVqJ/NKjbqaj9FPFWG59AjBVqQ335QzDWNCs/LjD~~REF/6qMeP2adehNhEVv2nK3rS+po9b4yLkiSysLivFPry9AxMGzFr3XzgoDb+y+y~~T02zj2k7nkGlNSSSanIxsp+TzTKsIY7ZbGx6d8y/AoGAS/kSDmq3DBe70cmNxN+z~~QyeDE4zWnUvfyCngNocnIbi49PY1cB+9tOJgfS2wZ9NkUIrqBoUIupRY9KKuJCnd~~7d8MqhtiPuytwhGWJzW030KejvcK3wp1LeKCCRBaqQCr+csMj8kDZhMgtD0NiInx~~3V3hBVM/i4PuRSPWrhlGCX0CgYEAq/xR8TBaD2kqc0b0np6ap75/1WHhqaK9T42K~~oOOkuq8hI6vU1oQCGvfhXyChgRWHB/foI7xrGC53RkHKm0ioawEJa75whTVWTEaI~~bEuOKpOQSOJ6LBlckg9PtbzAZlBm0S6+DfUCjdEcoCXnUD1cz+qhZR+lC9TMI8Mb~~IRRMtIECgYBrVlenf/rHK1UMC3FDmkOzH7agShcDHqzFMR1/NcMDolZNXXFy/u4t~~nDxci1smAUQr4oNs1lk9UzCdt0+pVCjmhbriBngwsS6sazOesDft53w6RTczsRpa~~09YDfcXhnI5yT+vd5r4xA5HhyniY7W1ahSzGDYIGlVm5IReC3P6Caw==~~-----END RSA PRIVATE KEY-----~~";
3
+ const JWKS = { keys: [{
4
+ kty: "RSA",
5
+ n: "wzwwEqR5p7a6CaG61i3od-GLTyype3t_f0pwwtoA9NsZANcjHaAUR_qzqlNRQlLI687vF1OfbETYLeHIT5V36QGrMfrYR_tYAoaKFixC_wOjt8EBPoeHgaTOAyGf3V3YNwocNU-StyV1X4hPmDjCrapNYpbKIcAJwq5Ij0WBKGNXBcUUbAceRtLqgzf_6x2vcQJeE5nJK5gd41f_jtlK9Xge0Ig6CcdKOI7U3agyI_iNF3SL0bnCfvtDRIkgAzzeN5Yj4S3Z4rJVQ1RgzZmqBmnjw8h06G8wDyaQPf19u4F___gF-dL1md_fVRKL5UL7OZg42hIZzwzdhrxOGcXUFQ",
6
+ e: "AQAB",
7
+ alg: "RS256",
8
+ kid: "NkRGQjI5N0RBNUUwMTYwOEMxQUVGQkJBQTJBODBGNTE2MDA5NDM5RA",
9
+ use: "sig"
10
+ }] };
11
+
12
+ //#endregion
13
+ export { JWKS, PRIVATE_KEY };
14
+ //# sourceMappingURL=constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.mjs","names":[],"sources":["../../src/auth/constants.ts"],"sourcesContent":["export const PRIVATE_KEY =\n \"-----BEGIN RSA PRIVATE KEY-----~~MIIEpAIBAAKCAQEAwzwwEqR5p7a6CaG61i3od+GLTyype3t/f0pwwtoA9NsZANcj~~HaAUR/qzqlNRQlLI687vF1OfbETYLeHIT5V36QGrMfrYR/tYAoaKFixC/wOjt8EB~~PoeHgaTOAyGf3V3YNwocNU+StyV1X4hPmDjCrapNYpbKIcAJwq5Ij0WBKGNXBcUU~~bAceRtLqgzf/6x2vcQJeE5nJK5gd41f/jtlK9Xge0Ig6CcdKOI7U3agyI/iNF3SL~~0bnCfvtDRIkgAzzeN5Yj4S3Z4rJVQ1RgzZmqBmnjw8h06G8wDyaQPf19u4F///gF~~+dL1md/fVRKL5UL7OZg42hIZzwzdhrxOGcXUFQIDAQABAoIBAQCSwHUqLjO722Av~~yT/VqqBpLEI4+0tSJFyL4/qqnI/HfcFnnk8o/6D/EfVm/EXCYtPgXKXflN3q1jzh~~ECwvlhySKszyPqnAQa/ABj1ZuV+KrMOtZgh3Zgx3aNfqBqZSES5rANB/ShbwT9nQ~~O3gI5fF/9NlCWDIL+HvduH+WIhqZrfHbTQrntr0sMvYTNE8PkAsB1GGZ5VO8gGGT~~Tg3kKOpNGWAJUYape/1Mb0Z1W8E1YDEaQKCnVY+Whr3+ZuLveDmyTuvLrUi+MAA4~~EaISkBZQo3ehUMjXm/0PdG4U9f2otAOhdwa2eT9irTkNS0TU+bi7VDEEhTmRKyfO~~yyVAGzTpAoGBAOmPbnMBAJYLk0SiQVspxIT+LW3tDWc7aFr/TtqAXkEVxI2xG6wA~~dEyRasBbPJDSWEljMre4g/6GG1fsPj0l5n2S8azy6jIu49ANvZPrrrBsuVYStR18~~MibzxjWWUht3vOCZBKtbqgHbC/oc49jMLPO5XrDFMTJPU5GkWRRLRZArAoGBANX+~~H6NQ7fUg8TUerXEB1WqA+FH4zVqJ/NKjbqaj9FPFWG59AjBVqQ335QzDWNCs/LjD~~REF/6qMeP2adehNhEVv2nK3rS+po9b4yLkiSysLivFPry9AxMGzFr3XzgoDb+y+y~~T02zj2k7nkGlNSSSanIxsp+TzTKsIY7ZbGx6d8y/AoGAS/kSDmq3DBe70cmNxN+z~~QyeDE4zWnUvfyCngNocnIbi49PY1cB+9tOJgfS2wZ9NkUIrqBoUIupRY9KKuJCnd~~7d8MqhtiPuytwhGWJzW030KejvcK3wp1LeKCCRBaqQCr+csMj8kDZhMgtD0NiInx~~3V3hBVM/i4PuRSPWrhlGCX0CgYEAq/xR8TBaD2kqc0b0np6ap75/1WHhqaK9T42K~~oOOkuq8hI6vU1oQCGvfhXyChgRWHB/foI7xrGC53RkHKm0ioawEJa75whTVWTEaI~~bEuOKpOQSOJ6LBlckg9PtbzAZlBm0S6+DfUCjdEcoCXnUD1cz+qhZR+lC9TMI8Mb~~IRRMtIECgYBrVlenf/rHK1UMC3FDmkOzH7agShcDHqzFMR1/NcMDolZNXXFy/u4t~~nDxci1smAUQr4oNs1lk9UzCdt0+pVCjmhbriBngwsS6sazOesDft53w6RTczsRpa~~09YDfcXhnI5yT+vd5r4xA5HhyniY7W1ahSzGDYIGlVm5IReC3P6Caw==~~-----END RSA PRIVATE KEY-----~~\" as const;\n\nexport const JWKS = {\n keys: [\n {\n kty: \"RSA\",\n n: \"wzwwEqR5p7a6CaG61i3od-GLTyype3t_f0pwwtoA9NsZANcjHaAUR_qzqlNRQlLI687vF1OfbETYLeHIT5V36QGrMfrYR_tYAoaKFixC_wOjt8EBPoeHgaTOAyGf3V3YNwocNU-StyV1X4hPmDjCrapNYpbKIcAJwq5Ij0WBKGNXBcUUbAceRtLqgzf_6x2vcQJeE5nJK5gd41f_jtlK9Xge0Ig6CcdKOI7U3agyI_iNF3SL0bnCfvtDRIkgAzzeN5Yj4S3Z4rJVQ1RgzZmqBmnjw8h06G8wDyaQPf19u4F___gF-dL1md_fVRKL5UL7OZg42hIZzwzdhrxOGcXUFQ\",\n e: \"AQAB\",\n alg: \"RS256\",\n kid: \"NkRGQjI5N0RBNUUwMTYwOEMxQUVGQkJBQTJBODBGNTE2MDA5NDM5RA\",\n use: \"sig\",\n },\n ],\n} as const;\n"],"mappings":";AAAA,MAAa,cACX;AAEF,MAAa,OAAO,EAClB,MAAM,CACJ;CACE,KAAK;CACL,GAAG;CACH,GAAG;CACH,KAAK;CACL,KAAK;CACL,KAAK;CACN,CACF,EACF"}
@@ -0,0 +1,8 @@
1
+
2
+ //#region src/auth/date.ts
3
+ const epochTime = (date = Date.now()) => Math.floor(date / 1e3);
4
+ const expiresAt = (hours = 1) => epochTime() + hours * 60 * 60 * 1e3;
5
+
6
+ //#endregion
7
+ exports.epochTime = epochTime;
8
+ exports.expiresAt = expiresAt;
@@ -0,0 +1,7 @@
1
+ //#region src/auth/date.ts
2
+ const epochTime = (date = Date.now()) => Math.floor(date / 1e3);
3
+ const expiresAt = (hours = 1) => epochTime() + hours * 60 * 60 * 1e3;
4
+
5
+ //#endregion
6
+ export { epochTime, expiresAt };
7
+ //# sourceMappingURL=date.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.mjs","names":[],"sources":["../../src/auth/date.ts"],"sourcesContent":["export const epochTime = (date = Date.now()): number => Math.floor(date / 1000);\n\nexport const expiresAt = (hours = 1): number =>\n epochTime() + hours * 60 * 60 * 1000;\n\nexport const epochTimeToLocalDate = (epoch: number): Date => {\n let date = new Date(0);\n date.setUTCSeconds(epoch);\n return date;\n};\n"],"mappings":";AAAA,MAAa,aAAa,OAAO,KAAK,KAAK,KAAa,KAAK,MAAM,OAAO,IAAK;AAE/E,MAAa,aAAa,QAAQ,MAChC,WAAW,GAAG,QAAQ,KAAK,KAAK"}
@@ -0,0 +1,16 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const require_constants = require('./constants.cjs');
3
+ let jsonwebtoken = require("jsonwebtoken");
4
+ jsonwebtoken = require_rolldown_runtime.__toESM(jsonwebtoken);
5
+
6
+ //#region src/auth/jwt.ts
7
+ const parseKey = (key) => key.split("~~").join("\n");
8
+ function createJsonWebToken(payload, privateKey = parseKey(require_constants.PRIVATE_KEY), options = {
9
+ algorithm: "RS256",
10
+ keyid: require_constants.JWKS.keys[0].kid
11
+ }) {
12
+ return jsonwebtoken.sign(payload, privateKey, options);
13
+ }
14
+
15
+ //#endregion
16
+ exports.createJsonWebToken = createJsonWebToken;
@@ -0,0 +1,15 @@
1
+ import { JWKS, PRIVATE_KEY } from "./constants.mjs";
2
+ import * as jwt from "jsonwebtoken";
3
+
4
+ //#region src/auth/jwt.ts
5
+ const parseKey = (key) => key.split("~~").join("\n");
6
+ function createJsonWebToken(payload, privateKey = parseKey(PRIVATE_KEY), options = {
7
+ algorithm: "RS256",
8
+ keyid: JWKS.keys[0].kid
9
+ }) {
10
+ return jwt.sign(payload, privateKey, options);
11
+ }
12
+
13
+ //#endregion
14
+ export { createJsonWebToken };
15
+ //# sourceMappingURL=jwt.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.mjs","names":[],"sources":["../../src/auth/jwt.ts"],"sourcesContent":["import type { SignOptions } from \"jsonwebtoken\";\nimport * as jwt from \"jsonwebtoken\";\nimport { JWKS, PRIVATE_KEY } from \"./constants.ts\";\n\nexport const parseKey = (key: string): string => key.split(\"~~\").join(\"\\n\");\n\ntype SignPayload = Parameters<typeof jwt.sign>[0];\n\nexport function createJsonWebToken<P extends SignPayload>(\n payload: P,\n privateKey = parseKey(PRIVATE_KEY),\n options: SignOptions = {\n algorithm: \"RS256\",\n keyid: JWKS.keys[0].kid,\n }\n): string {\n return jwt.sign(payload, privateKey, options);\n}\n"],"mappings":";;;;AAIA,MAAa,YAAY,QAAwB,IAAI,MAAM,KAAK,CAAC,KAAK,KAAK;AAI3E,SAAgB,mBACd,SACA,aAAa,SAAS,YAAY,EAClC,UAAuB;CACrB,WAAW;CACX,OAAO,KAAK,KAAK,GAAG;CACrB,EACO;AACR,QAAO,IAAI,KAAK,SAAS,YAAY,QAAQ"}
@@ -0,0 +1,24 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const require_date = require('./date.cjs');
3
+ let assert_ts = require("assert-ts");
4
+ let base64_url = require("base64-url");
5
+
6
+ //#region src/auth/refresh-token.ts
7
+ function issueRefreshToken(scope, grantType) {
8
+ return grantType === "refresh_token" || scope.includes("offline_access");
9
+ }
10
+ function createRefreshToken({ exp, rotations = 0, scope, user, nonce }) {
11
+ (0, assert_ts.assert)(!!user.id, `no identifier for user`);
12
+ return (0, base64_url.encode)(JSON.stringify({
13
+ exp,
14
+ iat: require_date.epochTime(),
15
+ rotations,
16
+ scope,
17
+ user: { id: user.id },
18
+ nonce
19
+ }));
20
+ }
21
+
22
+ //#endregion
23
+ exports.createRefreshToken = createRefreshToken;
24
+ exports.issueRefreshToken = issueRefreshToken;
@@ -0,0 +1,23 @@
1
+ import { epochTime } from "./date.mjs";
2
+ import { assert } from "assert-ts";
3
+ import { encode } from "base64-url";
4
+
5
+ //#region src/auth/refresh-token.ts
6
+ function issueRefreshToken(scope, grantType) {
7
+ return grantType === "refresh_token" || scope.includes("offline_access");
8
+ }
9
+ function createRefreshToken({ exp, rotations = 0, scope, user, nonce }) {
10
+ assert(!!user.id, `no identifier for user`);
11
+ return encode(JSON.stringify({
12
+ exp,
13
+ iat: epochTime(),
14
+ rotations,
15
+ scope,
16
+ user: { id: user.id },
17
+ nonce
18
+ }));
19
+ }
20
+
21
+ //#endregion
22
+ export { createRefreshToken, issueRefreshToken };
23
+ //# sourceMappingURL=refresh-token.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-token.mjs","names":[],"sources":["../../src/auth/refresh-token.ts"],"sourcesContent":["import type { GrantType, RefreshToken } from \"../types.ts\";\nimport { epochTime } from \"./date.ts\";\nimport { encode } from \"base64-url\";\nimport { assert } from \"assert-ts\";\n\nexport function issueRefreshToken(\n scope: string,\n grantType: GrantType\n): boolean {\n return grantType === \"refresh_token\" || scope.includes(\"offline_access\");\n}\n\nexport function createRefreshToken({\n exp,\n rotations = 0,\n scope,\n user,\n nonce,\n}: Omit<RefreshToken, \"iat\">): string {\n assert(!!user.id, `no identifier for user`);\n\n return encode(\n JSON.stringify({\n exp,\n iat: epochTime(),\n rotations,\n scope,\n user: { id: user.id },\n nonce,\n })\n );\n}\n"],"mappings":";;;;;AAKA,SAAgB,kBACd,OACA,WACS;AACT,QAAO,cAAc,mBAAmB,MAAM,SAAS,iBAAiB;;AAG1E,SAAgB,mBAAmB,EACjC,KACA,YAAY,GACZ,OACA,MACA,SACoC;AACpC,QAAO,CAAC,CAAC,KAAK,IAAI,yBAAyB;AAE3C,QAAO,OACL,KAAK,UAAU;EACb;EACA,KAAK,WAAW;EAChB;EACA;EACA,MAAM,EAAE,IAAI,KAAK,IAAI;EACrB;EACD,CAAC,CACH"}
@@ -0,0 +1,39 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const require_types = require('../types.cjs');
3
+ let cosmiconfig = require("cosmiconfig");
4
+
5
+ //#region src/config/get-config.ts
6
+ const DefaultAuth0Port = 4400;
7
+ const DefaultArgs = {
8
+ clientID: "00000000000000000000000000000000",
9
+ audience: "https://thefrontside.auth0.com/api/v1/",
10
+ scope: "openid profile email offline_access"
11
+ };
12
+ function getPort({ domain, port }) {
13
+ if (typeof port === "number") return port;
14
+ if (domain) {
15
+ const parts = domain.split(":");
16
+ if (parts.length === 2) return parseInt(parts[1]);
17
+ }
18
+ return DefaultAuth0Port;
19
+ }
20
+ function getConfigCreator(explorer$1) {
21
+ return function getConfig$1(options) {
22
+ let searchResult = explorer$1.search();
23
+ let config = searchResult === null ? DefaultArgs : searchResult.config;
24
+ let strippedOptions = options ?? {};
25
+ let configuration = {
26
+ ...DefaultArgs,
27
+ ...config,
28
+ ...strippedOptions
29
+ };
30
+ configuration.port = getPort(configuration);
31
+ require_types.configurationSchema.parse(configuration);
32
+ return configuration;
33
+ };
34
+ }
35
+ const explorer = (0, cosmiconfig.cosmiconfigSync)("auth0Simulator");
36
+ const getConfig = getConfigCreator(explorer);
37
+
38
+ //#endregion
39
+ exports.getConfig = getConfig;
@@ -0,0 +1,39 @@
1
+ import { configurationSchema } from "../types.mjs";
2
+ import { cosmiconfigSync } from "cosmiconfig";
3
+
4
+ //#region src/config/get-config.ts
5
+ const DefaultAuth0Port = 4400;
6
+ const DefaultArgs = {
7
+ clientID: "00000000000000000000000000000000",
8
+ audience: "https://thefrontside.auth0.com/api/v1/",
9
+ scope: "openid profile email offline_access"
10
+ };
11
+ function getPort({ domain, port }) {
12
+ if (typeof port === "number") return port;
13
+ if (domain) {
14
+ const parts = domain.split(":");
15
+ if (parts.length === 2) return parseInt(parts[1]);
16
+ }
17
+ return DefaultAuth0Port;
18
+ }
19
+ function getConfigCreator(explorer$1) {
20
+ return function getConfig$1(options) {
21
+ let searchResult = explorer$1.search();
22
+ let config = searchResult === null ? DefaultArgs : searchResult.config;
23
+ let strippedOptions = options ?? {};
24
+ let configuration = {
25
+ ...DefaultArgs,
26
+ ...config,
27
+ ...strippedOptions
28
+ };
29
+ configuration.port = getPort(configuration);
30
+ configurationSchema.parse(configuration);
31
+ return configuration;
32
+ };
33
+ }
34
+ const explorer = cosmiconfigSync("auth0Simulator");
35
+ const getConfig = getConfigCreator(explorer);
36
+
37
+ //#endregion
38
+ export { getConfig };
39
+ //# sourceMappingURL=get-config.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-config.mjs","names":["DefaultArgs: ConfigSchema","getConfig","explorer","config: ConfigSchema"],"sources":["../../src/config/get-config.ts"],"sourcesContent":["import { cosmiconfigSync } from \"cosmiconfig\";\nimport type { Auth0Configuration, ConfigSchema } from \"../types.ts\";\nimport { configurationSchema } from \"../types.ts\";\n\nconst DefaultAuth0Port = 4400;\n\nexport const DefaultArgs: ConfigSchema = {\n clientID: \"00000000000000000000000000000000\",\n audience: \"https://thefrontside.auth0.com/api/v1/\",\n scope: \"openid profile email offline_access\",\n};\n\ntype Explorer = ReturnType<typeof cosmiconfigSync>;\n\nfunction getPort({ domain, port }: Auth0Configuration): number {\n if (typeof port === \"number\") {\n return port;\n }\n\n if (domain) {\n const parts = domain.split(\":\");\n if (parts.length === 2) {\n return parseInt(parts[1]!);\n }\n }\n\n return DefaultAuth0Port;\n}\n\n// This higher order function would only be used for testing and\n// allows different cosmiconfig instances to be used for testing\nexport function getConfigCreator(explorer: Explorer) {\n return function getConfig(\n options?: Partial<Auth0Configuration>\n ): Auth0Configuration {\n let searchResult = explorer.search();\n\n let config: ConfigSchema =\n searchResult === null ? DefaultArgs : searchResult.config;\n\n let strippedOptions = options ?? {};\n\n let configuration = {\n ...DefaultArgs,\n ...config,\n ...strippedOptions,\n } as Auth0Configuration;\n\n configuration.port = getPort(configuration);\n\n configurationSchema.parse(configuration);\n\n return configuration;\n };\n}\n\nconst explorer = cosmiconfigSync(\"auth0Simulator\");\n\nexport const getConfig = getConfigCreator(explorer);\n"],"mappings":";;;;AAIA,MAAM,mBAAmB;AAEzB,MAAaA,cAA4B;CACvC,UAAU;CACV,UAAU;CACV,OAAO;CACR;AAID,SAAS,QAAQ,EAAE,QAAQ,QAAoC;AAC7D,KAAI,OAAO,SAAS,SAClB,QAAO;AAGT,KAAI,QAAQ;EACV,MAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,MAAI,MAAM,WAAW,EACnB,QAAO,SAAS,MAAM,GAAI;;AAI9B,QAAO;;AAKT,SAAgB,iBAAiB,YAAoB;AACnD,QAAO,SAASC,YACd,SACoB;EACpB,IAAI,eAAeC,WAAS,QAAQ;EAEpC,IAAIC,SACF,iBAAiB,OAAO,cAAc,aAAa;EAErD,IAAI,kBAAkB,WAAW,EAAE;EAEnC,IAAI,gBAAgB;GAClB,GAAG;GACH,GAAG;GACH,GAAG;GACJ;AAED,gBAAc,OAAO,QAAQ,cAAc;AAE3C,sBAAoB,MAAM,cAAc;AAExC,SAAO;;;AAIX,MAAM,WAAW,gBAAgB,iBAAiB;AAElD,MAAa,YAAY,iBAAiB,SAAS"}
@@ -0,0 +1,207 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const require_login_redirect = require('./login-redirect.cjs');
3
+ const require_web_message = require('./web-message.cjs');
4
+ const require_utils = require('./utils.cjs');
5
+ const require_login = require('../views/login.cjs');
6
+ const require_oauth_handlers = require('./oauth-handlers.cjs');
7
+ const require_username_password = require('../views/username-password.cjs');
8
+ let querystring = require("querystring");
9
+ let assert_ts = require("assert-ts");
10
+ let base64_url = require("base64-url");
11
+ let jsonwebtoken = require("jsonwebtoken");
12
+
13
+ //#region src/handlers/auth0-handlers.ts
14
+ const createLogger = (debug) => ({ log: (...args) => {
15
+ if (!debug) return;
16
+ console.dir(...args);
17
+ } });
18
+ const createAuth0Handlers = (simulationStore, serviceURL, options, debug) => {
19
+ let { audience, scope, clientID, rulesDirectory } = options;
20
+ let personQuery = require_utils.createPersonQuery(simulationStore);
21
+ let authorizeHandlers = {
22
+ query: require_login_redirect.createLoginRedirectHandler(options),
23
+ web_message: require_web_message.createWebMessageHandler()
24
+ };
25
+ let logger = createLogger(debug);
26
+ return {
27
+ ["/heartbeat"]: function(_, res) {
28
+ res.status(200).json({ ok: true });
29
+ },
30
+ ["/authorize"]: function(req, res, next) {
31
+ logger.log({ "/authorize": {
32
+ body: req.body,
33
+ query: req.query,
34
+ session: req.session
35
+ } });
36
+ let currentUser = req.query.currentUser;
37
+ (0, assert_ts.assert)(!!req.session, "no session");
38
+ if (currentUser) req.session.username = currentUser;
39
+ let responseMode = req.query.response_mode ?? "query";
40
+ (0, assert_ts.assert)(["query", "web_message"].includes(responseMode), `unknown response_mode ${responseMode}`);
41
+ let handler = authorizeHandlers[responseMode];
42
+ handler(req, res, next);
43
+ },
44
+ ["/login"]: function(req, res) {
45
+ logger.log({ "/login": {
46
+ body: req.body,
47
+ query: req.query
48
+ } });
49
+ let query = req.query;
50
+ let responseClientId = query.client_id ?? clientID;
51
+ let responseAudience = query.audience ?? audience;
52
+ (0, assert_ts.assert)(!!responseClientId, `no clientID assigned`);
53
+ let html = require_login.loginView({
54
+ domain: new URL(serviceURL(req)).host,
55
+ scope,
56
+ redirectUri: query.redirect_uri,
57
+ clientID: responseClientId,
58
+ audience: responseAudience,
59
+ loginFailed: false
60
+ });
61
+ res.set("Content-Type", "text/html");
62
+ res.status(200).send(Buffer.from(html));
63
+ },
64
+ ["/usernamepassword/login"]: function(req, res) {
65
+ logger.log({ "/usernamepassword/login": {
66
+ body: req.body,
67
+ query: req.query
68
+ } });
69
+ let { username, nonce, password } = req.body;
70
+ (0, assert_ts.assert)(!!username, "no username in /usernamepassword/login");
71
+ (0, assert_ts.assert)(!!nonce, "no nonce in /usernamepassword/login");
72
+ (0, assert_ts.assert)(!!req.session, "no session");
73
+ if (!personQuery((person) => person.email?.toLowerCase() === username.toLowerCase() && person.password === password)) {
74
+ let query = req.query;
75
+ let responseClientId = query.client_id ?? clientID;
76
+ let responseAudience = query.audience ?? audience;
77
+ (0, assert_ts.assert)(!!clientID, `no clientID assigned`);
78
+ let html = require_login.loginView({
79
+ domain: new URL(serviceURL(req)).host,
80
+ scope,
81
+ redirectUri: query.redirect_uri,
82
+ clientID: responseClientId,
83
+ audience: responseAudience,
84
+ loginFailed: true
85
+ });
86
+ res.set("Content-Type", "text/html");
87
+ res.status(400).send(html);
88
+ return;
89
+ }
90
+ req.session.username = username;
91
+ simulationStore.store.dispatch(simulationStore.actions.batchUpdater([simulationStore.schema.sessions.patch({ [nonce]: {
92
+ username,
93
+ nonce
94
+ } })]));
95
+ res.status(200).send(require_username_password.userNamePasswordForm(req.body));
96
+ },
97
+ ["/login/callback"]: function(req, res) {
98
+ let wctx = JSON.parse(req.body.wctx);
99
+ logger.log({ "/login/callback": {
100
+ body: req.body,
101
+ query: req.query,
102
+ wctx
103
+ } });
104
+ let { redirect_uri, nonce } = wctx;
105
+ const { username } = simulationStore.schema.sessions.selectById(simulationStore.store.getState(), { id: nonce }) ?? {};
106
+ let routerUrl = `${redirect_uri}?${(0, querystring.stringify)({
107
+ code: (0, base64_url.encode)(`${nonce}:${username}`),
108
+ ...wctx
109
+ })}`;
110
+ res.redirect(302, routerUrl);
111
+ },
112
+ ["/oauth/token"]: async function(req, res, next) {
113
+ logger.log({ "/oauth/token": {
114
+ body: req.body,
115
+ query: req.query
116
+ } });
117
+ try {
118
+ let iss = serviceURL(req);
119
+ let responseClientId = req?.body?.client_id ?? clientID;
120
+ let responseAudience = req?.body?.audience ?? audience;
121
+ (0, assert_ts.assert)(!!responseClientId, "500::no clientID in options or request body");
122
+ let tokens = await require_oauth_handlers.createTokens({
123
+ simulationStore,
124
+ body: req.body,
125
+ iss,
126
+ clientID: responseClientId,
127
+ audience: responseAudience,
128
+ rulesDirectory,
129
+ scope
130
+ });
131
+ res.status(200).json({
132
+ ...tokens,
133
+ expires_in: 86400,
134
+ token_type: "Bearer"
135
+ });
136
+ } catch (error) {
137
+ next(error);
138
+ }
139
+ },
140
+ ["/v2/logout"]: function(req, res) {
141
+ req.session = null;
142
+ let returnToUrl = req.query.returnTo ?? req.headers.referer;
143
+ (0, assert_ts.assert)(typeof returnToUrl === "string", `no logical returnTo url`);
144
+ res.redirect(returnToUrl);
145
+ },
146
+ ["/userinfo"]: function(req, res) {
147
+ let token = null;
148
+ if (req.headers.authorization) token = req.headers.authorization?.split(" ")?.[1];
149
+ else token = req?.query?.access_token;
150
+ (0, assert_ts.assert)(!!token, "no authorization header or access_token");
151
+ let { sub } = (0, jsonwebtoken.decode)(token, { json: true });
152
+ let user = personQuery((person) => {
153
+ (0, assert_ts.assert)(!!person.id, `no email defined on person scenario`);
154
+ return person.id === sub;
155
+ });
156
+ (0, assert_ts.assert)(!!user, "no user in /userinfo");
157
+ let userinfo = {
158
+ sub,
159
+ name: user.name,
160
+ given_name: user.name,
161
+ family_name: user.name,
162
+ email: user.email,
163
+ email_verified: true,
164
+ locale: "en",
165
+ hd: "okta.com"
166
+ };
167
+ res.status(200).json(userinfo);
168
+ },
169
+ ["/passwordless/start"]: function(req, res, next) {
170
+ logger.log({ "/passwordless/start": { body: req.body } });
171
+ try {
172
+ const { client_id, connection, email, phone_number } = req.body;
173
+ if (!client_id) {
174
+ res.status(400).json({ error: "client_id is required" });
175
+ return;
176
+ }
177
+ if (!connection || connection !== "email" && connection !== "sms") {
178
+ res.status(400).json({ error: "connection must be 'email' or 'sms'" });
179
+ return;
180
+ }
181
+ if (connection === "email" && !email) {
182
+ res.status(400).json({ error: "email is required when connection is 'email'" });
183
+ return;
184
+ }
185
+ if (connection === "sms" && !phone_number) {
186
+ res.status(400).json({ error: "phone_number is required when connection is 'sms'" });
187
+ return;
188
+ }
189
+ if (connection === "email") res.status(200).json({
190
+ _id: "000000000000000000000000",
191
+ email,
192
+ email_verified: false
193
+ });
194
+ else res.status(200).json({
195
+ _id: "000000000000000000000000",
196
+ phone_number,
197
+ phone_verified: false
198
+ });
199
+ } catch (error) {
200
+ next(error);
201
+ }
202
+ }
203
+ };
204
+ };
205
+
206
+ //#endregion
207
+ exports.createAuth0Handlers = createAuth0Handlers;