@pureq/auth 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/README.md +293 -0
  2. package/dist/adapter/capabilities.d.ts +23 -0
  3. package/dist/adapter/capabilities.d.ts.map +1 -0
  4. package/dist/adapter/capabilities.js +77 -0
  5. package/dist/adapter/capabilities.js.map +1 -0
  6. package/dist/adapter/index.d.ts +12 -0
  7. package/dist/adapter/index.d.ts.map +1 -0
  8. package/dist/adapter/index.js +121 -0
  9. package/dist/adapter/index.js.map +1 -0
  10. package/dist/adapter/sql.d.ts +36 -0
  11. package/dist/adapter/sql.d.ts.map +1 -0
  12. package/dist/adapter/sql.js +268 -0
  13. package/dist/adapter/sql.js.map +1 -0
  14. package/dist/adapters/index.d.ts +4 -0
  15. package/dist/adapters/index.d.ts.map +1 -0
  16. package/dist/adapters/index.js +42 -0
  17. package/dist/adapters/index.js.map +1 -0
  18. package/dist/authorization/index.d.ts +8 -0
  19. package/dist/authorization/index.d.ts.map +1 -0
  20. package/dist/authorization/index.js +49 -0
  21. package/dist/authorization/index.js.map +1 -0
  22. package/dist/bridge/index.d.ts +23 -0
  23. package/dist/bridge/index.d.ts.map +1 -0
  24. package/dist/bridge/index.js +124 -0
  25. package/dist/bridge/index.js.map +1 -0
  26. package/dist/callbacks/index.d.ts +8 -0
  27. package/dist/callbacks/index.d.ts.map +1 -0
  28. package/dist/callbacks/index.js +53 -0
  29. package/dist/callbacks/index.js.map +1 -0
  30. package/dist/core/index.d.ts +12 -0
  31. package/dist/core/index.d.ts.map +1 -0
  32. package/dist/core/index.js +481 -0
  33. package/dist/core/index.js.map +1 -0
  34. package/dist/core/kit.d.ts +7 -0
  35. package/dist/core/kit.d.ts.map +1 -0
  36. package/dist/core/kit.js +145 -0
  37. package/dist/core/kit.js.map +1 -0
  38. package/dist/core/starter.d.ts +28 -0
  39. package/dist/core/starter.d.ts.map +1 -0
  40. package/dist/core/starter.js +67 -0
  41. package/dist/core/starter.js.map +1 -0
  42. package/dist/csrf/index.d.ts +7 -0
  43. package/dist/csrf/index.d.ts.map +1 -0
  44. package/dist/csrf/index.js +126 -0
  45. package/dist/csrf/index.js.map +1 -0
  46. package/dist/debug/index.d.ts +8 -0
  47. package/dist/debug/index.d.ts.map +1 -0
  48. package/dist/debug/index.js +21 -0
  49. package/dist/debug/index.js.map +1 -0
  50. package/dist/encryption/index.d.ts +8 -0
  51. package/dist/encryption/index.d.ts.map +1 -0
  52. package/dist/encryption/index.js +43 -0
  53. package/dist/encryption/index.js.map +1 -0
  54. package/dist/events/index.d.ts +22 -0
  55. package/dist/events/index.d.ts.map +1 -0
  56. package/dist/events/index.js +53 -0
  57. package/dist/events/index.js.map +1 -0
  58. package/dist/framework/index.d.ts +10 -0
  59. package/dist/framework/index.d.ts.map +1 -0
  60. package/dist/framework/index.js +68 -0
  61. package/dist/framework/index.js.map +1 -0
  62. package/dist/framework/packs.d.ts +54 -0
  63. package/dist/framework/packs.d.ts.map +1 -0
  64. package/dist/framework/packs.js +124 -0
  65. package/dist/framework/packs.js.map +1 -0
  66. package/dist/framework/recipes.d.ts +6 -0
  67. package/dist/framework/recipes.d.ts.map +1 -0
  68. package/dist/framework/recipes.js +108 -0
  69. package/dist/framework/recipes.js.map +1 -0
  70. package/dist/hooks/index.d.ts +11 -0
  71. package/dist/hooks/index.d.ts.map +1 -0
  72. package/dist/hooks/index.js +95 -0
  73. package/dist/hooks/index.js.map +1 -0
  74. package/dist/hooks/react.d.ts +9 -0
  75. package/dist/hooks/react.d.ts.map +1 -0
  76. package/dist/hooks/react.js +24 -0
  77. package/dist/hooks/react.js.map +1 -0
  78. package/dist/hooks/vue.d.ts +4 -0
  79. package/dist/hooks/vue.d.ts.map +1 -0
  80. package/dist/hooks/vue.js +32 -0
  81. package/dist/hooks/vue.js.map +1 -0
  82. package/dist/index.d.ts +36 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +31 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/jwt/index.d.ts +13 -0
  87. package/dist/jwt/index.d.ts.map +1 -0
  88. package/dist/jwt/index.js +82 -0
  89. package/dist/jwt/index.js.map +1 -0
  90. package/dist/middleware/authBasic.d.ts +5 -0
  91. package/dist/middleware/authBasic.d.ts.map +1 -0
  92. package/dist/middleware/authBasic.js +25 -0
  93. package/dist/middleware/authBasic.js.map +1 -0
  94. package/dist/middleware/authBearer.d.ts +4 -0
  95. package/dist/middleware/authBearer.d.ts.map +1 -0
  96. package/dist/middleware/authBearer.js +26 -0
  97. package/dist/middleware/authBearer.js.map +1 -0
  98. package/dist/middleware/authCustom.d.ts +4 -0
  99. package/dist/middleware/authCustom.d.ts.map +1 -0
  100. package/dist/middleware/authCustom.js +22 -0
  101. package/dist/middleware/authCustom.js.map +1 -0
  102. package/dist/middleware/authRefresh.d.ts +4 -0
  103. package/dist/middleware/authRefresh.d.ts.map +1 -0
  104. package/dist/middleware/authRefresh.js +68 -0
  105. package/dist/middleware/authRefresh.js.map +1 -0
  106. package/dist/middleware/authSession.d.ts +5 -0
  107. package/dist/middleware/authSession.d.ts.map +1 -0
  108. package/dist/middleware/authSession.js +35 -0
  109. package/dist/middleware/authSession.js.map +1 -0
  110. package/dist/middleware/broadcastSync.d.ts +7 -0
  111. package/dist/middleware/broadcastSync.d.ts.map +1 -0
  112. package/dist/middleware/broadcastSync.js +36 -0
  113. package/dist/middleware/broadcastSync.js.map +1 -0
  114. package/dist/middleware/common.d.ts +3 -0
  115. package/dist/middleware/common.d.ts.map +1 -0
  116. package/dist/middleware/common.js +10 -0
  117. package/dist/middleware/common.js.map +1 -0
  118. package/dist/middleware/index.d.ts +8 -0
  119. package/dist/middleware/index.d.ts.map +1 -0
  120. package/dist/middleware/index.js +8 -0
  121. package/dist/middleware/index.js.map +1 -0
  122. package/dist/middleware/tokenLifecycle.d.ts +4 -0
  123. package/dist/middleware/tokenLifecycle.d.ts.map +1 -0
  124. package/dist/middleware/tokenLifecycle.js +52 -0
  125. package/dist/middleware/tokenLifecycle.js.map +1 -0
  126. package/dist/migration/index.d.ts +40 -0
  127. package/dist/migration/index.d.ts.map +1 -0
  128. package/dist/migration/index.js +136 -0
  129. package/dist/migration/index.js.map +1 -0
  130. package/dist/oidc/index.d.ts +25 -0
  131. package/dist/oidc/index.d.ts.map +1 -0
  132. package/dist/oidc/index.js +392 -0
  133. package/dist/oidc/index.js.map +1 -0
  134. package/dist/oidc/providers.d.ts +21 -0
  135. package/dist/oidc/providers.d.ts.map +1 -0
  136. package/dist/oidc/providers.js +51 -0
  137. package/dist/oidc/providers.js.map +1 -0
  138. package/dist/presets/index.d.ts +13 -0
  139. package/dist/presets/index.d.ts.map +1 -0
  140. package/dist/presets/index.js +12 -0
  141. package/dist/presets/index.js.map +1 -0
  142. package/dist/providers/callbackContracts.d.ts +14 -0
  143. package/dist/providers/callbackContracts.d.ts.map +1 -0
  144. package/dist/providers/callbackContracts.js +14 -0
  145. package/dist/providers/callbackContracts.js.map +1 -0
  146. package/dist/providers/errors.d.ts +9 -0
  147. package/dist/providers/errors.d.ts.map +1 -0
  148. package/dist/providers/errors.js +66 -0
  149. package/dist/providers/errors.js.map +1 -0
  150. package/dist/providers/index.d.ts +28 -0
  151. package/dist/providers/index.d.ts.map +1 -0
  152. package/dist/providers/index.js +29 -0
  153. package/dist/providers/index.js.map +1 -0
  154. package/dist/providers/presets.d.ts +17 -0
  155. package/dist/providers/presets.d.ts.map +1 -0
  156. package/dist/providers/presets.js +84 -0
  157. package/dist/providers/presets.js.map +1 -0
  158. package/dist/revocation/index.d.ts +10 -0
  159. package/dist/revocation/index.d.ts.map +1 -0
  160. package/dist/revocation/index.js +182 -0
  161. package/dist/revocation/index.js.map +1 -0
  162. package/dist/session/exporters.d.ts +15 -0
  163. package/dist/session/exporters.d.ts.map +1 -0
  164. package/dist/session/exporters.js +62 -0
  165. package/dist/session/exporters.js.map +1 -0
  166. package/dist/session/index.d.ts +11 -0
  167. package/dist/session/index.d.ts.map +1 -0
  168. package/dist/session/index.js +324 -0
  169. package/dist/session/index.js.map +1 -0
  170. package/dist/shared/encoding.d.ts +5 -0
  171. package/dist/shared/encoding.d.ts.map +1 -0
  172. package/dist/shared/encoding.js +27 -0
  173. package/dist/shared/encoding.js.map +1 -0
  174. package/dist/shared/errors.d.ts +13 -0
  175. package/dist/shared/errors.d.ts.map +1 -0
  176. package/dist/shared/errors.js +12 -0
  177. package/dist/shared/errors.js.map +1 -0
  178. package/dist/shared/index.d.ts +5 -0
  179. package/dist/shared/index.d.ts.map +1 -0
  180. package/dist/shared/index.js +5 -0
  181. package/dist/shared/index.js.map +1 -0
  182. package/dist/shared/types.d.ts +585 -0
  183. package/dist/shared/types.d.ts.map +1 -0
  184. package/dist/shared/types.js +2 -0
  185. package/dist/shared/types.js.map +1 -0
  186. package/dist/shared/values.d.ts +3 -0
  187. package/dist/shared/values.d.ts.map +1 -0
  188. package/dist/shared/values.js +23 -0
  189. package/dist/shared/values.js.map +1 -0
  190. package/dist/storage/index.d.ts +44 -0
  191. package/dist/storage/index.d.ts.map +1 -0
  192. package/dist/storage/index.js +318 -0
  193. package/dist/storage/index.js.map +1 -0
  194. package/dist/templates/index.d.ts +9 -0
  195. package/dist/templates/index.d.ts.map +1 -0
  196. package/dist/templates/index.js +146 -0
  197. package/dist/templates/index.js.map +1 -0
  198. package/package.json +173 -0
@@ -0,0 +1,145 @@
1
+ import { createReactAuthHooks, createAuthSessionStore, createVueAuthSessionComposable } from "../hooks";
2
+ import { createAuth } from "./index";
3
+ function mergeSessionStoreOptions(base, next) {
4
+ return {
5
+ ...(base ?? {}),
6
+ ...(next ?? {}),
7
+ };
8
+ }
9
+ function getSecurityPreset(mode) {
10
+ if (mode === "browser-spa") {
11
+ return {
12
+ bridge: {
13
+ secure: true,
14
+ httpOnly: false,
15
+ sameSite: "lax",
16
+ },
17
+ session: {
18
+ rotationPolicy: "preserve-refresh-token",
19
+ minRefreshIntervalMs: 5000,
20
+ },
21
+ };
22
+ }
23
+ if (mode === "edge") {
24
+ return {
25
+ bridge: {
26
+ secure: true,
27
+ httpOnly: true,
28
+ sameSite: "lax",
29
+ },
30
+ session: {
31
+ rotationPolicy: "require-refresh-token",
32
+ minRefreshIntervalMs: 8000,
33
+ },
34
+ };
35
+ }
36
+ return {
37
+ bridge: {
38
+ secure: true,
39
+ httpOnly: true,
40
+ sameSite: "lax",
41
+ },
42
+ session: {
43
+ rotationPolicy: "require-refresh-token",
44
+ minRefreshIntervalMs: 10000,
45
+ },
46
+ };
47
+ }
48
+ function reportPolicyOverride(onPolicyOverride, event) {
49
+ if (!onPolicyOverride) {
50
+ return;
51
+ }
52
+ void onPolicyOverride(event);
53
+ }
54
+ /**
55
+ * AuthKit alpha: one entrypoint that wires core auth and framework session integrations.
56
+ */
57
+ export function createAuthKit(config = {}) {
58
+ const defaultSessionStore = config.sessionStore;
59
+ const mode = config.security?.mode ?? "ssr-bff";
60
+ const preset = getSecurityPreset(mode);
61
+ const bridge = {
62
+ ...(config.bridge ?? {}),
63
+ ...(config.bridge?.secure === undefined ? { secure: preset.bridge.secure } : {}),
64
+ ...(config.bridge?.httpOnly === undefined ? { httpOnly: preset.bridge.httpOnly } : {}),
65
+ ...(config.bridge?.sameSite === undefined ? { sameSite: preset.bridge.sameSite } : {}),
66
+ };
67
+ const session = {
68
+ ...(config.session ?? {}),
69
+ ...(config.session?.rotationPolicy === undefined ? { rotationPolicy: preset.session.rotationPolicy } : {}),
70
+ ...(config.session?.minRefreshIntervalMs === undefined
71
+ ? { minRefreshIntervalMs: preset.session.minRefreshIntervalMs }
72
+ : {}),
73
+ };
74
+ if (config.bridge?.secure !== undefined && config.bridge.secure !== preset.bridge.secure) {
75
+ reportPolicyOverride(config.security?.onPolicyOverride, {
76
+ key: "bridge.secure",
77
+ mode,
78
+ recommended: preset.bridge.secure,
79
+ actual: config.bridge.secure,
80
+ });
81
+ }
82
+ if (config.bridge?.httpOnly !== undefined && config.bridge.httpOnly !== preset.bridge.httpOnly) {
83
+ reportPolicyOverride(config.security?.onPolicyOverride, {
84
+ key: "bridge.httpOnly",
85
+ mode,
86
+ recommended: preset.bridge.httpOnly,
87
+ actual: config.bridge.httpOnly,
88
+ });
89
+ }
90
+ if (config.bridge?.sameSite !== undefined && config.bridge.sameSite !== preset.bridge.sameSite) {
91
+ reportPolicyOverride(config.security?.onPolicyOverride, {
92
+ key: "bridge.sameSite",
93
+ mode,
94
+ recommended: preset.bridge.sameSite,
95
+ actual: config.bridge.sameSite,
96
+ });
97
+ }
98
+ if (config.session?.rotationPolicy !== undefined && config.session.rotationPolicy !== preset.session.rotationPolicy) {
99
+ reportPolicyOverride(config.security?.onPolicyOverride, {
100
+ key: "session.rotationPolicy",
101
+ mode,
102
+ recommended: preset.session.rotationPolicy,
103
+ actual: config.session.rotationPolicy,
104
+ });
105
+ }
106
+ if (config.session?.minRefreshIntervalMs !== undefined &&
107
+ config.session.minRefreshIntervalMs !== preset.session.minRefreshIntervalMs) {
108
+ reportPolicyOverride(config.security?.onPolicyOverride, {
109
+ key: "session.minRefreshIntervalMs",
110
+ mode,
111
+ recommended: preset.session.minRefreshIntervalMs,
112
+ actual: config.session.minRefreshIntervalMs,
113
+ });
114
+ }
115
+ const auth = createAuth({
116
+ ...(config.providers !== undefined ? { providers: config.providers } : {}),
117
+ ...(config.adapter !== undefined ? { adapter: config.adapter } : {}),
118
+ ...(config.callbacks !== undefined ? { callbacks: config.callbacks } : {}),
119
+ ...(config.secret !== undefined ? { secret: config.secret } : {}),
120
+ session,
121
+ ...(config.storage !== undefined ? { storage: config.storage } : {}),
122
+ bridge,
123
+ ...(config.debug !== undefined ? { debug: config.debug } : {}),
124
+ ...(config.allowDangerousAccountLinking !== undefined
125
+ ? { allowDangerousAccountLinking: config.allowDangerousAccountLinking }
126
+ : {}),
127
+ });
128
+ const createSessionStore = (options) => {
129
+ return createAuthSessionStore(auth.session, mergeSessionStoreOptions(defaultSessionStore, options));
130
+ };
131
+ return {
132
+ auth,
133
+ handlers: auth.handlers,
134
+ createSessionStore,
135
+ createReactHooks(useSyncExternalStore, options) {
136
+ const sessionStore = createSessionStore(options);
137
+ return createReactAuthHooks(sessionStore, useSyncExternalStore);
138
+ },
139
+ createVueSessionComposable(runtime, options) {
140
+ const sessionStore = createSessionStore(options);
141
+ return createVueAuthSessionComposable(sessionStore, runtime);
142
+ },
143
+ };
144
+ }
145
+ //# sourceMappingURL=kit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kit.js","sourceRoot":"","sources":["../../src/core/kit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { AuthFrameworkContext, AuthFrameworkContextOptions, AuthKit, AuthKitConfig, AuthRequestAdapter, AuthRouteHandlerRecipe, AuthServerActionRecipe, AuthSessionStore, AuthSessionStoreOptions, ReactAuthHooks, ReactUseSyncExternalStore, VueAuthSessionComposable, VueRuntimeBindings } from "../shared";
2
+ import type { AdapterReadinessReport } from "../adapter";
3
+ export interface AuthStarterConfig extends AuthKitConfig, AuthFrameworkContextOptions {
4
+ readonly sessionStore?: AuthSessionStoreOptions;
5
+ readonly adapterReadiness?: {
6
+ readonly deployment?: "development" | "production";
7
+ readonly requireEmailProviderSupport?: boolean;
8
+ readonly failOnNeedsAttention?: boolean;
9
+ readonly onReport?: (report: AdapterReadinessReport) => void;
10
+ };
11
+ }
12
+ export interface AuthStarter {
13
+ readonly kit: AuthKit;
14
+ readonly request: AuthRequestAdapter;
15
+ readonly context: AuthFrameworkContext;
16
+ readonly route: AuthRouteHandlerRecipe;
17
+ readonly action: AuthServerActionRecipe;
18
+ readonly adapterReadiness?: AdapterReadinessReport;
19
+ createSessionStore(options?: AuthSessionStoreOptions): AuthSessionStore;
20
+ createReactHooks(useSyncExternalStore: ReactUseSyncExternalStore, options?: AuthSessionStoreOptions): ReactAuthHooks;
21
+ createVueSessionComposable(runtime: VueRuntimeBindings, options?: AuthSessionStoreOptions): () => VueAuthSessionComposable;
22
+ }
23
+ /**
24
+ * Convenience starter for the smallest supported end-to-end auth setup.
25
+ * It keeps the golden path in one place without hiding the lower-level primitives.
26
+ */
27
+ export declare function createAuthStarter(config?: AuthStarterConfig): Promise<AuthStarter>;
28
+ //# sourceMappingURL=starter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"starter.d.ts","sourceRoot":"","sources":["../../src/core/starter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,2BAA2B,EAC3B,OAAO,EACP,aAAa,EACb,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,EACvB,cAAc,EACd,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,EACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAkBzD,MAAM,WAAW,iBAAkB,SAAQ,aAAa,EAAE,2BAA2B;IACnF,QAAQ,CAAC,YAAY,CAAC,EAAE,uBAAuB,CAAC;IAChD,QAAQ,CAAC,gBAAgB,CAAC,EAAE;QAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;QACnD,QAAQ,CAAC,2BAA2B,CAAC,EAAE,OAAO,CAAC;QAC/C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;QACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;KAC9D,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IACnD,kBAAkB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,gBAAgB,CAAC;IACxE,gBAAgB,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,cAAc,CAAC;IACrH,0BAA0B,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,MAAM,wBAAwB,CAAC;CAC5H;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CA6D5F"}
@@ -0,0 +1,67 @@
1
+ import { assessAdapterReadiness } from "../adapter";
2
+ import { createAuthRequestAdapter } from "../adapters";
3
+ import { createAuthFrameworkContext } from "../framework";
4
+ import { createAuthRouteHandlerRecipe, createAuthServerActionRecipe } from "../framework/recipes";
5
+ import { createAuthError } from "../shared";
6
+ import { authMemoryStore } from "../storage";
7
+ import { createAuthKit } from "./kit";
8
+ function mergeSessionStoreOptions(base, next) {
9
+ return {
10
+ ...(base ?? {}),
11
+ ...(next ?? {}),
12
+ };
13
+ }
14
+ /**
15
+ * Convenience starter for the smallest supported end-to-end auth setup.
16
+ * It keeps the golden path in one place without hiding the lower-level primitives.
17
+ */
18
+ export async function createAuthStarter(config = {}) {
19
+ const sharedStorage = config.storage ?? authMemoryStore();
20
+ const starterConfig = {
21
+ ...config,
22
+ storage: sharedStorage,
23
+ };
24
+ const kit = createAuthKit(starterConfig);
25
+ const request = createAuthRequestAdapter(starterConfig);
26
+ const context = await createAuthFrameworkContext(starterConfig);
27
+ const route = createAuthRouteHandlerRecipe(context);
28
+ const action = createAuthServerActionRecipe(context);
29
+ const defaultSessionStore = config.sessionStore;
30
+ let adapterReadiness;
31
+ if (starterConfig.adapter) {
32
+ adapterReadiness = assessAdapterReadiness(starterConfig.adapter, {
33
+ ...(starterConfig.adapterReadiness?.deployment !== undefined
34
+ ? { deployment: starterConfig.adapterReadiness.deployment }
35
+ : {}),
36
+ ...(starterConfig.adapterReadiness?.requireEmailProviderSupport !== undefined
37
+ ? { requireEmailProviderSupport: starterConfig.adapterReadiness.requireEmailProviderSupport }
38
+ : {}),
39
+ });
40
+ starterConfig.adapterReadiness?.onReport?.(adapterReadiness);
41
+ if (adapterReadiness.status === "blocked") {
42
+ throw createAuthError("PUREQ_ADAPTER_NOT_READY", `pureq: adapter is blocked for starter (${adapterReadiness.blockers.join("; ")})`);
43
+ }
44
+ if (adapterReadiness.status === "needs-attention" && starterConfig.adapterReadiness?.failOnNeedsAttention) {
45
+ throw createAuthError("PUREQ_ADAPTER_NEEDS_ATTENTION", `pureq: adapter needs attention for starter (${adapterReadiness.warnings.join("; ")})`);
46
+ }
47
+ }
48
+ const createSessionStore = (options) => {
49
+ return kit.createSessionStore(mergeSessionStoreOptions(defaultSessionStore, options));
50
+ };
51
+ return {
52
+ kit,
53
+ request,
54
+ context,
55
+ route,
56
+ action,
57
+ ...(adapterReadiness !== undefined ? { adapterReadiness } : {}),
58
+ createSessionStore,
59
+ createReactHooks(useSyncExternalStore, options) {
60
+ return kit.createReactHooks(useSyncExternalStore, mergeSessionStoreOptions(defaultSessionStore, options));
61
+ },
62
+ createVueSessionComposable(runtime, options) {
63
+ return kit.createVueSessionComposable(runtime, mergeSessionStoreOptions(defaultSessionStore, options));
64
+ },
65
+ };
66
+ }
67
+ //# sourceMappingURL=starter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"starter.js","sourceRoot":"","sources":["../../src/core/starter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Middleware } from "@pureq/pureq";
2
+ import type { AuthCsrfOptions, AuthCsrfProtection } from "../shared";
3
+ /** Create a CSRF protection handler with HMAC-based safe comparison. */
4
+ export declare function createAuthCsrfProtection(options: AuthCsrfOptions): AuthCsrfProtection;
5
+ /** Shorthand: create CSRF middleware directly. */
6
+ export declare function withCsrfProtection(options: AuthCsrfOptions): Middleware;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/csrf/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,cAAc,CAAC;AAG9D,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AA2ErE,wEAAwE;AACxE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,eAAe,GAAG,kBAAkB,CAuErF;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,UAAU,CAEvE"}
@@ -0,0 +1,126 @@
1
+ import { markPolicyMiddleware } from "@pureq/pureq";
2
+ import { generateSecureId } from "@pureq/pureq";
3
+ import { createAuthError } from "../shared";
4
+ const DEFAULT_SAFE_METHODS = ["GET", "HEAD", "OPTIONS"];
5
+ const MAX_CSRF_TOKEN_LENGTH = 2048;
6
+ function getHeader(headers, name) {
7
+ if (!headers) {
8
+ return null;
9
+ }
10
+ const normalized = name.toLowerCase();
11
+ for (const [key, value] of Object.entries(headers)) {
12
+ if (key.toLowerCase() === normalized) {
13
+ return typeof value === "string" ? value : null;
14
+ }
15
+ }
16
+ return null;
17
+ }
18
+ function toUrl(url) {
19
+ try {
20
+ return new URL(url);
21
+ }
22
+ catch {
23
+ return new URL(url, "http://localhost");
24
+ }
25
+ }
26
+ function getRequestToken(req, options) {
27
+ if (options.headerName) {
28
+ const headerValue = getHeader(req.headers, options.headerName);
29
+ if (headerValue) {
30
+ return headerValue;
31
+ }
32
+ }
33
+ if (options.queryParamName) {
34
+ const parsed = toUrl(req.url);
35
+ const queryValue = parsed.searchParams.get(options.queryParamName);
36
+ if (queryValue) {
37
+ return queryValue;
38
+ }
39
+ }
40
+ return null;
41
+ }
42
+ /**
43
+ * SEC-H8: HMAC-based constant-time token comparison.
44
+ * Instead of comparing tokens directly, we HMAC both with a random key
45
+ * and compare the digests. This defeats timing side-channels regardless of
46
+ * JIT optimization behavior.
47
+ */
48
+ async function hmacTokenEquals(candidate, expected, hmacKey) {
49
+ const encoder = new TextEncoder();
50
+ const [candidateDigest, expectedDigest] = await Promise.all([
51
+ crypto.subtle.sign("HMAC", hmacKey, encoder.encode(candidate)),
52
+ crypto.subtle.sign("HMAC", hmacKey, encoder.encode(expected)),
53
+ ]);
54
+ const a = new Uint8Array(candidateDigest);
55
+ const b = new Uint8Array(expectedDigest);
56
+ if (a.length !== b.length) {
57
+ return false;
58
+ }
59
+ let diff = 0;
60
+ for (let i = 0; i < a.length; i++) {
61
+ diff |= a[i] ^ b[i];
62
+ }
63
+ return diff === 0;
64
+ }
65
+ /** Create a CSRF protection handler with HMAC-based safe comparison. */
66
+ export function createAuthCsrfProtection(options) {
67
+ if (typeof options.expectedToken !== "function") {
68
+ throw new Error("pureq: CSRF protection requires an expectedToken provider");
69
+ }
70
+ const headerName = options.headerName ?? "x-csrf-token";
71
+ const queryParamName = options.queryParamName ?? "csrfToken";
72
+ const safeMethods = options.safeMethods ?? DEFAULT_SAFE_METHODS;
73
+ // Generate a per-instance HMAC key for constant-time comparison
74
+ const hmacKeyPromise = crypto.subtle.generateKey({ name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
75
+ const issueToken = async () => {
76
+ const token = options.tokenFactory ? await options.tokenFactory() : generateSecureId("csrf");
77
+ if (!token.trim()) {
78
+ throw createAuthError("PUREQ_AUTH_CSRF_INVALID_TOKEN", "pureq: CSRF token factory returned an empty token");
79
+ }
80
+ return token;
81
+ };
82
+ const verify = async (req) => {
83
+ if (safeMethods.includes(req.method)) {
84
+ return true;
85
+ }
86
+ const expected = await options.expectedToken();
87
+ if (!expected) {
88
+ return false;
89
+ }
90
+ if (expected.length > MAX_CSRF_TOKEN_LENGTH) {
91
+ return false;
92
+ }
93
+ const candidate = getRequestToken(req, { headerName, queryParamName });
94
+ if (candidate === null || candidate.length > MAX_CSRF_TOKEN_LENGTH) {
95
+ return false;
96
+ }
97
+ const hmacKey = await hmacKeyPromise;
98
+ return hmacTokenEquals(candidate, expected, hmacKey);
99
+ };
100
+ const middleware = () => {
101
+ const policy = async (req, next) => {
102
+ const verified = await verify(req);
103
+ if (!verified) {
104
+ throw createAuthError("PUREQ_AUTH_CSRF_FAILED", "pureq: CSRF validation failed", {
105
+ details: {
106
+ method: req.method,
107
+ headerName,
108
+ queryParamName,
109
+ },
110
+ });
111
+ }
112
+ return next(req);
113
+ };
114
+ return markPolicyMiddleware(policy, { name: "csrfProtection", kind: "auth" });
115
+ };
116
+ return {
117
+ issueToken,
118
+ verify,
119
+ middleware,
120
+ };
121
+ }
122
+ /** Shorthand: create CSRF middleware directly. */
123
+ export function withCsrfProtection(options) {
124
+ return createAuthCsrfProtection(options).middleware();
125
+ }
126
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/csrf/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { AuthDebugLogger } from "../shared";
2
+ /**
3
+ * FEAT-L1: Debug logger for auth operations.
4
+ * When enabled, logs all middleware, session, and OIDC operations.
5
+ */
6
+ export declare function createAuthDebugLogger(enabled?: boolean, logger?: Pick<Console, "log" | "warn" | "error">): AuthDebugLogger;
7
+ export type { AuthDebugLogger } from "../shared";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/debug/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,UAAQ,EACf,MAAM,GAAE,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAW,GACxD,eAAe,CAcjB;AAED,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * FEAT-L1: Debug logger for auth operations.
3
+ * When enabled, logs all middleware, session, and OIDC operations.
4
+ */
5
+ export function createAuthDebugLogger(enabled = false, logger = console) {
6
+ return {
7
+ enabled,
8
+ log(category, message, data) {
9
+ if (!enabled) {
10
+ return;
11
+ }
12
+ if (data !== undefined) {
13
+ logger.log(`[pureq/auth/${category}]`, message, data);
14
+ }
15
+ else {
16
+ logger.log(`[pureq/auth/${category}]`, message);
17
+ }
18
+ },
19
+ };
20
+ }
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/debug/index.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAO,GAAG,KAAK,EACf,SAAkD,OAAO;IAEzD,OAAO;QACL,OAAO;QACP,GAAG,CAAC,QAAgB,EAAE,OAAe,EAAE,IAAc;YACnD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,CAAC,eAAe,QAAQ,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,eAAe,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AuthEncryption } from "../shared";
2
+ /**
3
+ * FEAT-H7: AES-256-GCM encryption using Web Crypto API.
4
+ * Zero dependencies. Works in browsers, Node.js, Cloudflare Workers, Deno.
5
+ */
6
+ export declare function createAuthEncryption(secret: string): AuthEncryption;
7
+ export type { AuthEncryption } from "../shared";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/encryption/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAqEnE;AAED,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * FEAT-H7: AES-256-GCM encryption using Web Crypto API.
3
+ * Zero dependencies. Works in browsers, Node.js, Cloudflare Workers, Deno.
4
+ */
5
+ export function createAuthEncryption(secret) {
6
+ const encoder = new TextEncoder();
7
+ const decoder = new TextDecoder();
8
+ let cachedKey = null;
9
+ const deriveKey = async () => {
10
+ if (cachedKey) {
11
+ return cachedKey;
12
+ }
13
+ const keyMaterial = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "PBKDF2" }, false, ["deriveKey"]);
14
+ cachedKey = await crypto.subtle.deriveKey({
15
+ name: "PBKDF2",
16
+ salt: encoder.encode("pureq-auth-encryption-v1"),
17
+ iterations: 100000,
18
+ hash: "SHA-256",
19
+ }, keyMaterial, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"]);
20
+ return cachedKey;
21
+ };
22
+ return {
23
+ async encrypt(payload) {
24
+ const key = await deriveKey();
25
+ const iv = crypto.getRandomValues(new Uint8Array(12));
26
+ const plaintext = encoder.encode(JSON.stringify(payload));
27
+ const ciphertext = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, key, plaintext);
28
+ const combined = new Uint8Array(iv.length + new Uint8Array(ciphertext).length);
29
+ combined.set(iv);
30
+ combined.set(new Uint8Array(ciphertext), iv.length);
31
+ return btoa(String.fromCharCode(...combined));
32
+ },
33
+ async decrypt(token) {
34
+ const key = await deriveKey();
35
+ const combined = Uint8Array.from(atob(token), (c) => c.charCodeAt(0));
36
+ const iv = combined.slice(0, 12);
37
+ const ciphertext = combined.slice(12);
38
+ const plaintext = await crypto.subtle.decrypt({ name: "AES-GCM", iv }, key, ciphertext);
39
+ return JSON.parse(decoder.decode(plaintext));
40
+ },
41
+ };
42
+ }
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/encryption/index.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAElC,IAAI,SAAS,GAAqB,IAAI,CAAC;IAEvC,MAAM,SAAS,GAAG,KAAK,IAAwB,EAAE;QAC/C,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAC/C,KAAK,EACL,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EACtB,EAAE,IAAI,EAAE,QAAQ,EAAE,EAClB,KAAK,EACL,CAAC,WAAW,CAAC,CACd,CAAC;QAEF,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CACvC;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,0BAA0B,CAAC;YAChD,UAAU,EAAE,MAAO;YACnB,IAAI,EAAE,SAAS;SAChB,EACD,WAAW,EACX,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAChC,KAAK,EACL,CAAC,SAAS,EAAE,SAAS,CAAC,CACvB,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,OAAgB;YAC5B,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAE1D,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAC5C,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EACvB,GAAG,EACH,SAAS,CACV,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;YAC/E,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjB,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;YAEpD,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,KAAK,CAAC,OAAO,CAAc,KAAa;YACtC,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAEtC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAC3C,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EACvB,GAAG,EACH,UAAU,CACX,CAAC;YAEF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAM,CAAC;QACpD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { AuthSessionEvent, AuthSessionEventListener } from "../shared";
2
+ type AuthSessionTypedEvent<T extends AuthSessionEvent["type"]> = AuthSessionEvent & {
3
+ readonly type: T;
4
+ };
5
+ export interface AuthEventAdapterOptions {
6
+ readonly onEvent?: AuthSessionEventListener;
7
+ readonly onTokensUpdated?: (event: AuthSessionTypedEvent<"tokens-updated">) => void | Promise<void>;
8
+ readonly onTokensCleared?: (event: AuthSessionTypedEvent<"tokens-cleared">) => void | Promise<void>;
9
+ readonly onSessionRefreshed?: (event: AuthSessionTypedEvent<"session-refreshed">) => void | Promise<void>;
10
+ readonly onSessionRefreshFailed?: (event: AuthSessionTypedEvent<"session-refresh-failed">) => void | Promise<void>;
11
+ readonly onSessionLogout?: (event: AuthSessionTypedEvent<"session-logout">) => void | Promise<void>;
12
+ readonly onSessionRegenerated?: (event: AuthSessionTypedEvent<"session-regenerated">) => void | Promise<void>;
13
+ readonly onError?: (error: Error, event: AuthSessionEvent) => void | Promise<void>;
14
+ }
15
+ export interface AuthEventAdapter {
16
+ readonly listener: AuthSessionEventListener;
17
+ dispatch(event: AuthSessionEvent): Promise<void>;
18
+ }
19
+ export declare function createAuthEventAdapter(options?: AuthEventAdapterOptions): AuthEventAdapter;
20
+ export declare function composeAuthEventListeners(...listeners: readonly AuthSessionEventListener[]): AuthSessionEventListener;
21
+ export {};
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAE5E,KAAK,qBAAqB,CAAC,CAAC,SAAS,gBAAgB,CAAC,MAAM,CAAC,IAAI,gBAAgB,GAAG;IAClF,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,wBAAwB,CAAC;IAC5C,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,CAAC,gBAAgB,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpG,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,CAAC,gBAAgB,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpG,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,CAAC,mBAAmB,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1G,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,CAAC,wBAAwB,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnH,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,CAAC,gBAAgB,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpG,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,CAAC,qBAAqB,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9G,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpF;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AAwBD,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,gBAAgB,CAsD9F;AAED,wBAAgB,yBAAyB,CAAC,GAAG,SAAS,EAAE,SAAS,wBAAwB,EAAE,GAAG,wBAAwB,CAMrH"}
@@ -0,0 +1,53 @@
1
+ async function runSafely(handler, event, onError) {
2
+ if (!handler) {
3
+ return;
4
+ }
5
+ try {
6
+ await handler(event);
7
+ }
8
+ catch (error) {
9
+ const normalized = error instanceof Error ? error : new Error(String(error));
10
+ if (onError) {
11
+ await onError(normalized, event);
12
+ return;
13
+ }
14
+ throw normalized;
15
+ }
16
+ }
17
+ export function createAuthEventAdapter(options = {}) {
18
+ const dispatch = async (event) => {
19
+ await options.onEvent?.(event);
20
+ switch (event.type) {
21
+ case "tokens-updated":
22
+ await runSafely(options.onTokensUpdated, event, options.onError);
23
+ break;
24
+ case "tokens-cleared":
25
+ await runSafely(options.onTokensCleared, event, options.onError);
26
+ break;
27
+ case "session-refreshed":
28
+ await runSafely(options.onSessionRefreshed, event, options.onError);
29
+ break;
30
+ case "session-refresh-failed":
31
+ await runSafely(options.onSessionRefreshFailed, event, options.onError);
32
+ break;
33
+ case "session-logout":
34
+ await runSafely(options.onSessionLogout, event, options.onError);
35
+ break;
36
+ case "session-regenerated":
37
+ await runSafely(options.onSessionRegenerated, event, options.onError);
38
+ break;
39
+ }
40
+ };
41
+ return {
42
+ listener: dispatch,
43
+ dispatch,
44
+ };
45
+ }
46
+ export function composeAuthEventListeners(...listeners) {
47
+ return async (event) => {
48
+ for (const listener of listeners) {
49
+ await listener(event);
50
+ }
51
+ };
52
+ }
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAsBA,KAAK,UAAU,SAAS,CACtB,OAAgF,EAChF,KAA+B,EAC/B,OAAsF;IAEtF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,UAAU,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7E,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QAED,MAAM,UAAU,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAmC,EAAE;IAC1E,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAuB,EAAiB,EAAE;QAChE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QAE/B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,gBAAgB;gBACnB,MAAM,SAAS,CACb,OAAO,CAAC,eAAe,EACvB,KAAgD,EAChD,OAAO,CAAC,OAAO,CAChB,CAAC;gBACF,MAAM;YACR,KAAK,gBAAgB;gBACnB,MAAM,SAAS,CACb,OAAO,CAAC,eAAe,EACvB,KAAgD,EAChD,OAAO,CAAC,OAAO,CAChB,CAAC;gBACF,MAAM;YACR,KAAK,mBAAmB;gBACtB,MAAM,SAAS,CACb,OAAO,CAAC,kBAAkB,EAC1B,KAAmD,EACnD,OAAO,CAAC,OAAO,CAChB,CAAC;gBACF,MAAM;YACR,KAAK,wBAAwB;gBAC3B,MAAM,SAAS,CACb,OAAO,CAAC,sBAAsB,EAC9B,KAAwD,EACxD,OAAO,CAAC,OAAO,CAChB,CAAC;gBACF,MAAM;YACR,KAAK,gBAAgB;gBACnB,MAAM,SAAS,CACb,OAAO,CAAC,eAAe,EACvB,KAAgD,EAChD,OAAO,CAAC,OAAO,CAChB,CAAC;gBACF,MAAM;YACR,KAAK,qBAAqB;gBACxB,MAAM,SAAS,CACb,OAAO,CAAC,oBAAoB,EAC5B,KAAqD,EACrD,OAAO,CAAC,OAAO,CAChB,CAAC;gBACF,MAAM;QACV,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,QAAQ;QAClB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAG,SAA8C;IACzF,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { AuthFrameworkContext, AuthFrameworkContextOptions } from "../shared";
2
+ export { createAuthRouteHandlerRecipe, createAuthServerActionRecipe, mapAuthErrorToHttp } from "./recipes";
3
+ export { createExpressAuthKitPack, createFastifyAuthKitPack, createNextAuthKitPack, createReactAuthKitBootstrapPack, } from "./packs";
4
+ /**
5
+ * Create a framework context that bootstraps auth from a request.
6
+ * ARCH-3: Catches bootstrap errors and falls back to empty session.
7
+ */
8
+ export declare function createAuthFrameworkContext(options?: AuthFrameworkContextOptions): Promise<AuthFrameworkContext>;
9
+ export type { AuthFrameworkContext, AuthFrameworkContextOptions } from "../shared";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/framework/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,2BAA2B,EAI5B,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC3G,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,+BAA+B,GAChC,MAAM,SAAS,CAAC;AAkBjB;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,oBAAoB,CAAC,CAyD/B;AAED,YAAY,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC"}