timeback 0.1.1 → 0.1.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.
- package/README.md +208 -10
- package/dist/client/adapters/react/index.d.ts +1 -1
- package/dist/client/adapters/react/index.d.ts.map +1 -1
- package/dist/client/adapters/solid/index.d.ts +1 -1
- package/dist/client/adapters/solid/index.d.ts.map +1 -1
- package/dist/client/adapters/solid/index.ts +1 -1
- package/dist/client/adapters/svelte/index.d.ts +1 -1
- package/dist/client/adapters/svelte/index.d.ts.map +1 -1
- package/dist/client/adapters/svelte/index.ts +1 -1
- package/dist/client/adapters/vue/index.d.ts +1 -1
- package/dist/client/adapters/vue/index.d.ts.map +1 -1
- package/dist/client/adapters/vue/index.ts +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/edge.d.ts +13 -0
- package/dist/edge.d.ts.map +1 -0
- package/dist/edge.js +1149 -0
- package/dist/identity.d.ts +14 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +1019 -0
- package/dist/index.d.ts +24 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8987 -145
- package/dist/server/adapters/express.d.ts +9 -5
- package/dist/server/adapters/express.d.ts.map +1 -1
- package/dist/server/adapters/express.js +8854 -93
- package/dist/server/adapters/native.d.ts +7 -5
- package/dist/server/adapters/native.d.ts.map +1 -1
- package/dist/server/adapters/native.js +120 -439
- package/dist/server/adapters/nextjs.d.ts +5 -3
- package/dist/server/adapters/nextjs.d.ts.map +1 -1
- package/dist/server/adapters/nextjs.js +120 -439
- package/dist/server/adapters/nuxt.d.ts +6 -4
- package/dist/server/adapters/nuxt.d.ts.map +1 -1
- package/dist/server/adapters/nuxt.js +8900 -168
- package/dist/server/adapters/solid-start.d.ts +5 -3
- package/dist/server/adapters/solid-start.d.ts.map +1 -1
- package/dist/server/adapters/solid-start.js +8821 -78
- package/dist/server/adapters/svelte-kit.d.ts +5 -3
- package/dist/server/adapters/svelte-kit.d.ts.map +1 -1
- package/dist/server/adapters/svelte-kit.js +134 -463
- package/dist/server/adapters/tanstack-start.d.ts +5 -3
- package/dist/server/adapters/tanstack-start.d.ts.map +1 -1
- package/dist/server/adapters/tanstack-start.js +8794 -44
- package/dist/server/adapters/types.d.ts +25 -11
- package/dist/server/adapters/types.d.ts.map +1 -1
- package/dist/server/adapters/utils.d.ts +66 -5
- package/dist/server/adapters/utils.d.ts.map +1 -1
- package/dist/server/handlers/activity.d.ts +1 -1
- package/dist/server/handlers/activity.d.ts.map +1 -1
- package/dist/server/handlers/identity-full.d.ts +28 -0
- package/dist/server/handlers/identity-full.d.ts.map +1 -0
- package/dist/server/handlers/identity-only.d.ts +22 -0
- package/dist/server/handlers/identity-only.d.ts.map +1 -0
- package/dist/server/handlers/index.d.ts +1 -1
- package/dist/server/handlers/index.d.ts.map +1 -1
- package/dist/server/handlers/user.d.ts +1 -1
- package/dist/server/handlers/user.d.ts.map +1 -1
- package/dist/server/index.d.ts +3 -4
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/lib/index.d.ts +2 -1
- package/dist/server/lib/index.d.ts.map +1 -1
- package/dist/server/lib/resolve-timeback-user.d.ts +42 -0
- package/dist/server/lib/resolve-timeback-user.d.ts.map +1 -0
- package/dist/server/lib/utils.d.ts +15 -0
- package/dist/server/lib/utils.d.ts.map +1 -1
- package/dist/server/timeback-identity.d.ts +19 -0
- package/dist/server/timeback-identity.d.ts.map +1 -0
- package/dist/server/timeback.d.ts +33 -13
- package/dist/server/timeback.d.ts.map +1 -1
- package/dist/server/types.d.ts +135 -33
- package/dist/server/types.d.ts.map +1 -1
- package/dist/shared/types.d.ts +49 -5
- package/dist/shared/types.d.ts.map +1 -1
- package/package.json +10 -1
- package/dist/server/handlers/identity.d.ts +0 -24
- package/dist/server/handlers/identity.d.ts.map +0 -1
package/dist/server/types.d.ts
CHANGED
|
@@ -3,11 +3,16 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Configuration and internal types for the server SDK.
|
|
5
5
|
*/
|
|
6
|
-
import type {
|
|
6
|
+
import type { TimebackClient } from '@timeback/core';
|
|
7
|
+
import type { TimebackAuthUser, TimebackIdentity } from '../shared/types';
|
|
7
8
|
/**
|
|
8
9
|
* Environment configuration.
|
|
9
10
|
*/
|
|
10
11
|
export type Environment = 'local' | 'staging' | 'production';
|
|
12
|
+
/**
|
|
13
|
+
* Error codes for Timeback user resolution failures.
|
|
14
|
+
*/
|
|
15
|
+
export type TimebackUserResolutionErrorCode = 'missing_email' | 'timeback_user_not_found' | 'timeback_user_ambiguous' | 'timeback_user_lookup_failed';
|
|
11
16
|
/**
|
|
12
17
|
* API credentials for Timeback API calls.
|
|
13
18
|
*/
|
|
@@ -82,15 +87,48 @@ export interface BuildStateContext {
|
|
|
82
87
|
url: URL;
|
|
83
88
|
}
|
|
84
89
|
/**
|
|
85
|
-
*
|
|
90
|
+
* Raw identity provider data (tokens and user info claims).
|
|
91
|
+
*/
|
|
92
|
+
export interface IdpData {
|
|
93
|
+
/** OIDC tokens from the identity provider */
|
|
94
|
+
tokens: OIDCTokens;
|
|
95
|
+
/** User info claims from the identity provider */
|
|
96
|
+
userInfo: OIDCUserInfo;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Context passed to onCallbackSuccess hook for full SDK (createTimeback).
|
|
100
|
+
*
|
|
101
|
+
* When using `createTimeback()` with SSO mode, the `user` field contains the
|
|
102
|
+
* enriched `TimebackAuthUser` with `timebackId` as the canonical identifier. Raw IdP
|
|
103
|
+
* data is available under `idp`.
|
|
86
104
|
*/
|
|
87
105
|
export interface CallbackSuccessContext<TState = unknown> {
|
|
106
|
+
/** Authenticated user with Timeback profile and IdP claims */
|
|
107
|
+
user: TimebackAuthUser;
|
|
108
|
+
/** Raw identity provider data (tokens and user info) */
|
|
109
|
+
idp: IdpData;
|
|
110
|
+
/** State data from buildState (if provided) */
|
|
111
|
+
state: TState | undefined;
|
|
112
|
+
/** The incoming callback request */
|
|
113
|
+
req: Request;
|
|
114
|
+
/** Helper to create a redirect response */
|
|
115
|
+
redirect: (url: string, headers?: HeadersInit) => Response;
|
|
116
|
+
/** Helper to create a JSON response */
|
|
117
|
+
json: <T>(data: T, status?: number, headers?: HeadersInit) => Response;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Context passed to onCallbackSuccess hook for identity-only SDK (createTimebackIdentity).
|
|
121
|
+
*
|
|
122
|
+
* When using `createTimebackIdentity()`, the `user` field contains raw OIDC user info
|
|
123
|
+
* claims (no Timeback profile enrichment).
|
|
124
|
+
*/
|
|
125
|
+
export interface IdentityOnlyCallbackSuccessContext<TState = unknown> {
|
|
88
126
|
/** OIDC tokens from the identity provider */
|
|
89
127
|
tokens: OIDCTokens;
|
|
90
128
|
/** User info claims from the identity provider */
|
|
91
129
|
user: OIDCUserInfo;
|
|
92
130
|
/** State data from buildState (if provided) */
|
|
93
|
-
state: TState;
|
|
131
|
+
state: TState | undefined;
|
|
94
132
|
/** The incoming callback request */
|
|
95
133
|
req: Request;
|
|
96
134
|
/** Helper to create a redirect response */
|
|
@@ -116,11 +154,9 @@ export interface CallbackErrorContext<TState = unknown> {
|
|
|
116
154
|
json: <T>(data: T, status?: number, headers?: HeadersInit) => Response;
|
|
117
155
|
}
|
|
118
156
|
/**
|
|
119
|
-
* SSO identity configuration.
|
|
120
|
-
*
|
|
121
|
-
* Provides full control over the OIDC flow without managing user sessions.
|
|
157
|
+
* Base SSO identity configuration fields (shared between full and identity-only).
|
|
122
158
|
*/
|
|
123
|
-
|
|
159
|
+
interface BaseSsoIdentityConfig<TState = unknown> {
|
|
124
160
|
mode: 'sso';
|
|
125
161
|
/** OIDC client ID */
|
|
126
162
|
clientId: string;
|
|
@@ -163,29 +199,6 @@ export interface SsoIdentityConfig<TState = unknown> {
|
|
|
163
199
|
* ```
|
|
164
200
|
*/
|
|
165
201
|
buildState?: (ctx: BuildStateContext) => TState;
|
|
166
|
-
/**
|
|
167
|
-
* Called after successful OIDC authentication.
|
|
168
|
-
*
|
|
169
|
-
* Use this to:
|
|
170
|
-
* 1. Upsert the user in your database
|
|
171
|
-
* 2. Set your own session cookie
|
|
172
|
-
* 3. Redirect to the appropriate page
|
|
173
|
-
*
|
|
174
|
-
* @param ctx - Context with tokens, user info, state, and helpers
|
|
175
|
-
* @returns Response (typically a redirect)
|
|
176
|
-
*
|
|
177
|
-
* @example
|
|
178
|
-
* ```typescript
|
|
179
|
-
* onCallbackSuccess: async ({ user, state, redirect }) => {
|
|
180
|
-
* await db.user.upsert({ where: { email: user.email }, ... })
|
|
181
|
-
* const session = await createSession(user)
|
|
182
|
-
* return redirect(state.returnTo ?? '/', {
|
|
183
|
-
* 'Set-Cookie': `session=${session.id}; HttpOnly; Path=/`,
|
|
184
|
-
* })
|
|
185
|
-
* }
|
|
186
|
-
* ```
|
|
187
|
-
*/
|
|
188
|
-
onCallbackSuccess: (ctx: CallbackSuccessContext<TState>) => Promise<Response> | Response;
|
|
189
202
|
/**
|
|
190
203
|
* Called when OIDC authentication fails.
|
|
191
204
|
*
|
|
@@ -200,7 +213,7 @@ export interface SsoIdentityConfig<TState = unknown> {
|
|
|
200
213
|
* }
|
|
201
214
|
* ```
|
|
202
215
|
*/
|
|
203
|
-
onCallbackError
|
|
216
|
+
onCallbackError?(ctx: CallbackErrorContext<TState>): Promise<Response> | Response;
|
|
204
217
|
/**
|
|
205
218
|
* Get the current user from the request.
|
|
206
219
|
*
|
|
@@ -223,7 +236,39 @@ export interface SsoIdentityConfig<TState = unknown> {
|
|
|
223
236
|
* getUser: (req) => currentUser
|
|
224
237
|
* ```
|
|
225
238
|
*/
|
|
226
|
-
getUser
|
|
239
|
+
getUser(req: Request): Promise<TimebackIdentity | undefined> | TimebackIdentity | undefined;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* SSO identity configuration for full SDK (createTimeback).
|
|
243
|
+
*
|
|
244
|
+
* When using `createTimeback()`, the SSO callback provides an enriched `TimebackAuthUser`
|
|
245
|
+
* with `timebackId` as the canonical identifier. The SDK resolves the Timeback
|
|
246
|
+
* user by email using server API credentials.
|
|
247
|
+
*/
|
|
248
|
+
export interface SsoIdentityConfig<TState = unknown, TSuccessContext = CallbackSuccessContext<TState>> extends BaseSsoIdentityConfig<TState> {
|
|
249
|
+
/**
|
|
250
|
+
* Called after successful OIDC authentication and Timeback user resolution.
|
|
251
|
+
*
|
|
252
|
+
* The `user` field contains the enriched `TimebackAuthUser` with:
|
|
253
|
+
* - `id`: Timeback user ID (canonical stable identifier)
|
|
254
|
+
* - `email`, `name`: User profile data
|
|
255
|
+
* - `claims`: Raw IdP claims (sub, firstName, lastName, pictureUrl)
|
|
256
|
+
*
|
|
257
|
+
* Raw IdP data (tokens, userInfo) is available under `idp`.
|
|
258
|
+
*
|
|
259
|
+
* @param ctx - Context with enriched user, IdP data, state, and helpers
|
|
260
|
+
* @returns Response (typically a redirect)
|
|
261
|
+
*
|
|
262
|
+
* @example
|
|
263
|
+
* ```typescript
|
|
264
|
+
* onCallbackSuccess: async ({ user, state, redirect }) => {
|
|
265
|
+
* // user.id is the timebackId (canonical identifier)
|
|
266
|
+
* await setSession({ id: user.id, email: user.email })
|
|
267
|
+
* return redirect(state.returnTo ?? '/')
|
|
268
|
+
* }
|
|
269
|
+
* ```
|
|
270
|
+
*/
|
|
271
|
+
onCallbackSuccess(ctx: TSuccessContext): Promise<Response> | Response;
|
|
227
272
|
}
|
|
228
273
|
/**
|
|
229
274
|
* Custom identity configuration.
|
|
@@ -241,7 +286,7 @@ export interface CustomIdentityConfig {
|
|
|
241
286
|
* @param req - The incoming request
|
|
242
287
|
* @returns User object or undefined (sync or async)
|
|
243
288
|
*/
|
|
244
|
-
getUser
|
|
289
|
+
getUser(req: Request): Promise<TimebackIdentity | undefined> | TimebackIdentity | undefined;
|
|
245
290
|
}
|
|
246
291
|
/**
|
|
247
292
|
* Identity configuration (SSO or custom).
|
|
@@ -296,5 +341,62 @@ export interface TimebackInstance<TState = unknown> {
|
|
|
296
341
|
config: TimebackConfig<TState>;
|
|
297
342
|
/** Request handlers */
|
|
298
343
|
handle: Handlers;
|
|
344
|
+
/**
|
|
345
|
+
* Direct access to the Timeback API client.
|
|
346
|
+
*
|
|
347
|
+
* This is an escape hatch for advanced use cases that need to call Timeback
|
|
348
|
+
* services (OneRoster, Edubridge, Caliper, QTI) beyond what the SDK handlers
|
|
349
|
+
* provide. The client is created lazily on first access.
|
|
350
|
+
*
|
|
351
|
+
* Note: For `env: 'local'`, outbound API calls use `staging` environment.
|
|
352
|
+
*
|
|
353
|
+
* @example
|
|
354
|
+
* ```typescript
|
|
355
|
+
* // List users from OneRoster
|
|
356
|
+
* const { data: users } = await timeback.api.oneroster.users.list({ limit: 10 })
|
|
357
|
+
*
|
|
358
|
+
* // Send a Caliper event
|
|
359
|
+
* await timeback.api.caliper.emit(event)
|
|
360
|
+
* ```
|
|
361
|
+
*/
|
|
362
|
+
api: TimebackClient;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Identity-only configuration.
|
|
366
|
+
*
|
|
367
|
+
* Use this when you only need SSO authentication without activity tracking
|
|
368
|
+
* or Timeback API integration.
|
|
369
|
+
*/
|
|
370
|
+
export interface IdentityOnlyConfig<TState = unknown> {
|
|
371
|
+
/** Environment */
|
|
372
|
+
env: Environment;
|
|
373
|
+
/** Identity configuration (SSO mode required for identity-only) */
|
|
374
|
+
identity: SsoIdentityConfig<TState, IdentityOnlyCallbackSuccessContext<TState>>;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Identity-only handlers.
|
|
378
|
+
*/
|
|
379
|
+
export interface IdentityOnlyHandlers {
|
|
380
|
+
/** Identity-related handlers */
|
|
381
|
+
identity: {
|
|
382
|
+
/** Initiate sign-in */
|
|
383
|
+
signIn: (req: Request) => Promise<Response>;
|
|
384
|
+
/** Handle OAuth callback */
|
|
385
|
+
callback: (req: Request) => Promise<Response>;
|
|
386
|
+
/** Sign out user */
|
|
387
|
+
signOut: () => Response;
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Identity-only SDK instance.
|
|
392
|
+
*
|
|
393
|
+
* Returned by `createTimebackIdentity()` for SSO-only integrations.
|
|
394
|
+
*/
|
|
395
|
+
export interface IdentityOnlyInstance<TState = unknown> {
|
|
396
|
+
/** Configuration */
|
|
397
|
+
config: IdentityOnlyConfig<TState>;
|
|
398
|
+
/** Request handlers (identity only) */
|
|
399
|
+
handle: IdentityOnlyHandlers;
|
|
299
400
|
}
|
|
401
|
+
export {};
|
|
300
402
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/types.d.ts
CHANGED
|
@@ -11,17 +11,15 @@ export interface TimebackIdentity {
|
|
|
11
11
|
email: string;
|
|
12
12
|
name?: string;
|
|
13
13
|
}
|
|
14
|
-
/**
|
|
15
|
-
* @deprecated Use TimebackIdentity instead
|
|
16
|
-
*/
|
|
17
|
-
export type TimebackUser = TimebackIdentity;
|
|
18
14
|
/**
|
|
19
15
|
* Timeback user profile with enriched data from the Timeback API.
|
|
20
16
|
*/
|
|
21
17
|
export interface TimebackProfile {
|
|
22
|
-
/**
|
|
18
|
+
/** Timeback user ID */
|
|
23
19
|
id: string;
|
|
20
|
+
/** User's email address */
|
|
24
21
|
email: string;
|
|
22
|
+
/** User's display name */
|
|
25
23
|
name?: string;
|
|
26
24
|
/** School information */
|
|
27
25
|
school?: {
|
|
@@ -45,6 +43,52 @@ export interface TimebackProfile {
|
|
|
45
43
|
dailyActiveMinutes?: number;
|
|
46
44
|
};
|
|
47
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Recommended minimal user payload to persist in a session.
|
|
48
|
+
*
|
|
49
|
+
* **User-facing note:** this type is part of the SDK’s developer experience.
|
|
50
|
+
* It exists to give you a “safe default” session shape that works well for
|
|
51
|
+
* cookie-based sessions (small payload) while still carrying enough Timeback
|
|
52
|
+
* context to power common UI affordances (e.g. showing a school name or grade).
|
|
53
|
+
*
|
|
54
|
+
* **What it is:** a minimal, serializable subset of `TimebackProfile`.
|
|
55
|
+
* **What it isn’t:** a guarantee that you’ll always have the full Timeback
|
|
56
|
+
* profile (courses, goals, xp, etc.) in-session. If you need richer data, fetch
|
|
57
|
+
* it from the API (e.g. `timeback.user.fetch()`) and cache/store it according
|
|
58
|
+
* to your app’s needs.
|
|
59
|
+
*
|
|
60
|
+
* **Stability:** this is still early and we’re actively iterating on identity
|
|
61
|
+
* and session ergonomics. We may rename, restructure, or remove this type from
|
|
62
|
+
* the public surface as the SDK evolves.
|
|
63
|
+
*/
|
|
64
|
+
export type TimebackSessionUser = Pick<TimebackProfile, 'id' | 'email' | 'name' | 'school' | 'grade'>;
|
|
65
|
+
/**
|
|
66
|
+
* Claims from the identity provider (IdP).
|
|
67
|
+
*
|
|
68
|
+
* Normalized subset of OIDC UserInfo claims.
|
|
69
|
+
*/
|
|
70
|
+
export interface IdentityClaims {
|
|
71
|
+
/** Subject identifier (unique user ID from IdP) */
|
|
72
|
+
sub: string;
|
|
73
|
+
/** User's email address */
|
|
74
|
+
email: string;
|
|
75
|
+
/** User's first/given name */
|
|
76
|
+
firstName?: string;
|
|
77
|
+
/** User's last/family name */
|
|
78
|
+
lastName?: string;
|
|
79
|
+
/** User's profile picture URL */
|
|
80
|
+
pictureUrl?: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Authenticated user with Timeback profile and IdP claims.
|
|
84
|
+
*
|
|
85
|
+
* This is the primary user object returned during SSO callback when using
|
|
86
|
+
* `createTimeback()`. The `id` field is the canonical `timebackId` (stable identifier).
|
|
87
|
+
*/
|
|
88
|
+
export interface TimebackAuthUser extends TimebackProfile {
|
|
89
|
+
/** IdP claims (raw identity provider data) */
|
|
90
|
+
claims: IdentityClaims;
|
|
91
|
+
}
|
|
48
92
|
/**
|
|
49
93
|
* Activity start parameters.
|
|
50
94
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "timeback",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Timeback SDK for frontend and backend integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -12,6 +12,14 @@
|
|
|
12
12
|
"types": "./dist/client.d.ts",
|
|
13
13
|
"import": "./dist/client.js"
|
|
14
14
|
},
|
|
15
|
+
"./identity": {
|
|
16
|
+
"types": "./dist/identity.d.ts",
|
|
17
|
+
"import": "./dist/identity.js"
|
|
18
|
+
},
|
|
19
|
+
"./edge": {
|
|
20
|
+
"types": "./dist/edge.d.ts",
|
|
21
|
+
"import": "./dist/edge.js"
|
|
22
|
+
},
|
|
15
23
|
"./react": {
|
|
16
24
|
"types": "./dist/client/adapters/react/index.d.ts",
|
|
17
25
|
"import": "./dist/client/adapters/react/index.js"
|
|
@@ -69,6 +77,7 @@
|
|
|
69
77
|
"test": "bun test --no-env-file unit.test.ts"
|
|
70
78
|
},
|
|
71
79
|
"dependencies": {
|
|
80
|
+
"@timeback/core": "0.1.1",
|
|
72
81
|
"jiti": "^2.6.1",
|
|
73
82
|
"zod": "^4.2.1"
|
|
74
83
|
},
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Identity Handlers
|
|
3
|
-
*
|
|
4
|
-
* Route handlers for SSO identity operations.
|
|
5
|
-
* User session state is managed by your own auth system via the hooks.
|
|
6
|
-
*/
|
|
7
|
-
import type { Environment, IdentityConfig } from '../types';
|
|
8
|
-
interface IdentityHandlerParams {
|
|
9
|
-
env: Environment;
|
|
10
|
-
identity: IdentityConfig;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Create identity route handlers.
|
|
14
|
-
*
|
|
15
|
-
* @param params - Handler configuration
|
|
16
|
-
* @returns Identity handlers
|
|
17
|
-
*/
|
|
18
|
-
export declare function createIdentityHandlers(params: IdentityHandlerParams): {
|
|
19
|
-
signIn: (req: Request) => Promise<Response>;
|
|
20
|
-
callback: (req: Request) => Promise<Response>;
|
|
21
|
-
signOut: () => Response;
|
|
22
|
-
};
|
|
23
|
-
export {};
|
|
24
|
-
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/identity.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,OAAO,KAAK,EAGX,WAAW,EACX,cAAc,EAEd,MAAM,UAAU,CAAA;AAEjB,UAAU,qBAAqB;IAC9B,GAAG,EAAE,WAAW,CAAA;IAChB,QAAQ,EAAE,cAAc,CAAA;CACxB;AAqPA;;;;;EAKE;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,qBAAqB;;;;EAQnE"}
|