timeback 0.0.0-alpha.2 → 0.1.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 (100) hide show
  1. package/README.md +211 -7
  2. package/dist/client/adapters/react/SignInButton.d.ts +60 -0
  3. package/dist/client/adapters/react/SignInButton.d.ts.map +1 -0
  4. package/dist/client/adapters/react/index.d.ts +43 -0
  5. package/dist/client/adapters/react/index.d.ts.map +1 -0
  6. package/dist/client/adapters/react/index.js +478 -0
  7. package/dist/client/adapters/react/provider.d.ts +74 -0
  8. package/dist/client/adapters/react/provider.d.ts.map +1 -0
  9. package/dist/client/adapters/solid/SignInButton.d.ts +52 -0
  10. package/dist/client/adapters/solid/SignInButton.d.ts.map +1 -0
  11. package/dist/client/adapters/solid/SignInButton.tsx +321 -0
  12. package/dist/client/adapters/solid/context.d.ts +73 -0
  13. package/dist/client/adapters/solid/context.d.ts.map +1 -0
  14. package/dist/client/adapters/solid/context.tsx +91 -0
  15. package/dist/client/adapters/solid/index.d.ts +42 -0
  16. package/dist/client/adapters/solid/index.d.ts.map +1 -0
  17. package/dist/client/adapters/solid/index.ts +46 -0
  18. package/dist/client/adapters/svelte/SignInButton.svelte +234 -0
  19. package/dist/client/adapters/svelte/SignInButton.svelte.d.ts +24 -0
  20. package/dist/client/adapters/svelte/index.d.ts +33 -0
  21. package/dist/client/adapters/svelte/index.d.ts.map +1 -0
  22. package/dist/client/adapters/svelte/index.ts +38 -0
  23. package/dist/client/adapters/svelte/stores.d.ts +62 -0
  24. package/dist/client/adapters/svelte/stores.d.ts.map +1 -0
  25. package/dist/client/adapters/svelte/stores.ts +139 -0
  26. package/dist/client/index.d.ts +9 -0
  27. package/dist/client/index.d.ts.map +1 -0
  28. package/dist/client/lib/activity/activity.class.d.ts +73 -0
  29. package/dist/client/lib/activity/activity.class.d.ts.map +1 -0
  30. package/dist/client/lib/activity/activity.d.ts +16 -0
  31. package/dist/client/lib/activity/activity.d.ts.map +1 -0
  32. package/dist/client/lib/activity/index.d.ts +6 -0
  33. package/dist/client/lib/activity/index.d.ts.map +1 -0
  34. package/dist/client/lib/utils.d.ts +20 -0
  35. package/dist/client/lib/utils.d.ts.map +1 -0
  36. package/dist/client/namespaces/activity.d.ts +37 -0
  37. package/dist/client/namespaces/activity.d.ts.map +1 -0
  38. package/dist/client/namespaces/auth.d.ts +33 -0
  39. package/dist/client/namespaces/auth.d.ts.map +1 -0
  40. package/dist/client/namespaces/index.d.ts +7 -0
  41. package/dist/client/namespaces/index.d.ts.map +1 -0
  42. package/dist/client/namespaces/user.d.ts +29 -0
  43. package/dist/client/namespaces/user.d.ts.map +1 -0
  44. package/dist/client/timeback-client.class.d.ts +37 -0
  45. package/dist/client/timeback-client.class.d.ts.map +1 -0
  46. package/dist/client/timeback-client.d.ts +29 -0
  47. package/dist/client/timeback-client.d.ts.map +1 -0
  48. package/dist/client.d.ts +30 -0
  49. package/dist/client.d.ts.map +1 -0
  50. package/dist/client.js +198 -0
  51. package/dist/index.d.ts +27 -14
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +1137 -11
  54. package/dist/server/adapters/express.d.ts +62 -0
  55. package/dist/server/adapters/express.d.ts.map +1 -0
  56. package/dist/server/adapters/express.js +565 -0
  57. package/dist/server/adapters/native.d.ts +45 -0
  58. package/dist/server/adapters/native.d.ts.map +1 -0
  59. package/dist/server/adapters/native.js +509 -0
  60. package/dist/server/adapters/nextjs.d.ts +30 -0
  61. package/dist/server/adapters/nextjs.d.ts.map +1 -0
  62. package/dist/server/adapters/nextjs.js +521 -0
  63. package/dist/server/adapters/solid-start.d.ts +61 -0
  64. package/dist/server/adapters/solid-start.d.ts.map +1 -0
  65. package/dist/server/adapters/solid-start.js +551 -0
  66. package/dist/server/adapters/svelte-kit.d.ts +82 -0
  67. package/dist/server/adapters/svelte-kit.d.ts.map +1 -0
  68. package/dist/server/adapters/svelte-kit.js +572 -0
  69. package/dist/server/adapters/tanstack-start.js +522 -0
  70. package/dist/server/adapters/types.d.ts +212 -0
  71. package/dist/server/adapters/types.d.ts.map +1 -0
  72. package/dist/server/adapters/utils.d.ts +15 -0
  73. package/dist/server/adapters/utils.d.ts.map +1 -0
  74. package/dist/server/handlers/activity.d.ts +28 -0
  75. package/dist/server/handlers/activity.d.ts.map +1 -0
  76. package/dist/server/handlers/identity.d.ts +24 -0
  77. package/dist/server/handlers/identity.d.ts.map +1 -0
  78. package/dist/server/handlers/index.d.ts +9 -0
  79. package/dist/server/handlers/index.d.ts.map +1 -0
  80. package/dist/server/handlers/user.d.ts +30 -0
  81. package/dist/server/handlers/user.d.ts.map +1 -0
  82. package/dist/server/index.d.ts +10 -0
  83. package/dist/server/index.d.ts.map +1 -0
  84. package/dist/server/lib/index.d.ts +9 -0
  85. package/dist/server/lib/index.d.ts.map +1 -0
  86. package/dist/server/lib/logger.d.ts +21 -0
  87. package/dist/server/lib/logger.d.ts.map +1 -0
  88. package/dist/server/lib/oidc.d.ts +76 -0
  89. package/dist/server/lib/oidc.d.ts.map +1 -0
  90. package/dist/server/lib/utils.d.ts +39 -0
  91. package/dist/server/lib/utils.d.ts.map +1 -0
  92. package/dist/server/timeback.d.ts +48 -0
  93. package/dist/server/timeback.d.ts.map +1 -0
  94. package/dist/server/types.d.ts +300 -0
  95. package/dist/server/types.d.ts.map +1 -0
  96. package/dist/shared/constants.d.ts +18 -0
  97. package/dist/shared/constants.d.ts.map +1 -0
  98. package/dist/shared/types.d.ts +100 -0
  99. package/dist/shared/types.d.ts.map +1 -0
  100. package/package.json +92 -28
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Server Types
3
+ *
4
+ * Configuration and internal types for the server SDK.
5
+ */
6
+ import type { TimebackUser } from '../shared/types';
7
+ /**
8
+ * Environment configuration.
9
+ */
10
+ export type Environment = 'local' | 'staging' | 'production';
11
+ /**
12
+ * API credentials for Timeback API calls.
13
+ */
14
+ export interface ApiCredentials {
15
+ clientId: string;
16
+ clientSecret: string;
17
+ }
18
+ /**
19
+ * OIDC tokens returned from the identity provider.
20
+ */
21
+ export interface OIDCTokens {
22
+ /** Access token for API calls */
23
+ access_token: string;
24
+ /** ID token containing user claims */
25
+ id_token?: string;
26
+ /** Refresh token for obtaining new access tokens */
27
+ refresh_token?: string;
28
+ /** Token type (usually "Bearer") */
29
+ token_type: string;
30
+ /** Token expiration in seconds */
31
+ expires_in?: number;
32
+ }
33
+ /**
34
+ * Identity provider link info (e.g., Google, Facebook).
35
+ */
36
+ export interface IdentityProviderLink {
37
+ /** When the identity was linked */
38
+ dateCreated: string;
39
+ /** User ID from the external provider */
40
+ userId: string;
41
+ /** Provider name (e.g., "Google", "Facebook") */
42
+ providerName: string;
43
+ /** Provider type */
44
+ providerType: string;
45
+ /** Issuer URL (if applicable) */
46
+ issuer: string | null;
47
+ /** Whether this is the primary identity */
48
+ primary: string;
49
+ }
50
+ /**
51
+ * User info claims from the identity provider.
52
+ */
53
+ export interface OIDCUserInfo {
54
+ /** Subject identifier (unique user ID from IdP) */
55
+ sub: string;
56
+ /** User's email address */
57
+ email?: string;
58
+ /** Whether email is verified */
59
+ email_verified?: boolean | string;
60
+ /** User's full name */
61
+ name?: string;
62
+ /** User's given/first name */
63
+ given_name?: string;
64
+ /** User's family/last name */
65
+ family_name?: string;
66
+ /** User's profile picture URL */
67
+ picture?: string;
68
+ /** Username in the IdP */
69
+ username?: string;
70
+ /** Linked identity providers (JSON string from Cognito) */
71
+ identities?: string | IdentityProviderLink[];
72
+ /** Additional claims */
73
+ [key: string]: unknown;
74
+ }
75
+ /**
76
+ * Context passed to buildState hook.
77
+ */
78
+ export interface BuildStateContext {
79
+ /** The incoming sign-in request */
80
+ req: Request;
81
+ /** Parsed URL for easy access to query params */
82
+ url: URL;
83
+ }
84
+ /**
85
+ * Context passed to onCallbackSuccess hook.
86
+ */
87
+ export interface CallbackSuccessContext<TState = unknown> {
88
+ /** OIDC tokens from the identity provider */
89
+ tokens: OIDCTokens;
90
+ /** User info claims from the identity provider */
91
+ user: OIDCUserInfo;
92
+ /** State data from buildState (if provided) */
93
+ state: TState;
94
+ /** The incoming callback request */
95
+ req: Request;
96
+ /** Helper to create a redirect response */
97
+ redirect: (url: string, headers?: HeadersInit) => Response;
98
+ /** Helper to create a JSON response */
99
+ json: <T>(data: T, status?: number, headers?: HeadersInit) => Response;
100
+ }
101
+ /**
102
+ * Context passed to onCallbackError hook.
103
+ */
104
+ export interface CallbackErrorContext<TState = unknown> {
105
+ /** The error that occurred */
106
+ error: Error;
107
+ /** Error code from OIDC provider (if available) */
108
+ errorCode?: string;
109
+ /** State data from buildState (if available) */
110
+ state: TState | undefined;
111
+ /** The incoming callback request */
112
+ req: Request;
113
+ /** Helper to create a redirect response */
114
+ redirect: (url: string, headers?: HeadersInit) => Response;
115
+ /** Helper to create a JSON response */
116
+ json: <T>(data: T, status?: number, headers?: HeadersInit) => Response;
117
+ }
118
+ /**
119
+ * SSO identity configuration.
120
+ *
121
+ * Provides full control over the OIDC flow without managing user sessions.
122
+ */
123
+ export interface SsoIdentityConfig<TState = unknown> {
124
+ mode: 'sso';
125
+ /** OIDC client ID */
126
+ clientId: string;
127
+ /** OIDC client secret */
128
+ clientSecret: string;
129
+ /**
130
+ * Custom OIDC issuer URL.
131
+ *
132
+ * Override the default Timeback IdP URL. Useful for:
133
+ * - Local development with a mock OIDC server
134
+ * - Self-hosted Timeback instances
135
+ *
136
+ * @example 'http://localhost:3001/mock-oidc'
137
+ */
138
+ issuer?: string;
139
+ /**
140
+ * Custom OAuth redirect URI.
141
+ *
142
+ * Override the auto-computed callback URL. Use when your IdP has
143
+ * pre-configured callback URLs that differ from the SDK default.
144
+ *
145
+ * @example 'http://localhost:5174/api/auth/sso/callback/timeback'
146
+ */
147
+ redirectUri?: string;
148
+ /**
149
+ * Build custom state to pass through the OIDC flow.
150
+ *
151
+ * Use this to preserve data across the redirect (e.g., return URL, invite codes).
152
+ * State is encoded in the OIDC state parameter and returned in onCallbackSuccess.
153
+ *
154
+ * @param ctx - Context with request and parsed URL
155
+ * @returns State object (will be JSON serialized)
156
+ *
157
+ * @example
158
+ * ```typescript
159
+ * buildState: ({ url }) => ({
160
+ * returnTo: url.searchParams.get('returnTo') ?? '/dashboard',
161
+ * inviteId: url.searchParams.get('inviteId'),
162
+ * })
163
+ * ```
164
+ */
165
+ 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
+ /**
190
+ * Called when OIDC authentication fails.
191
+ *
192
+ * @param ctx - Context with error info and helpers
193
+ * @returns Response (typically a redirect to an error page)
194
+ *
195
+ * @example
196
+ * ```typescript
197
+ * onCallbackError: ({ error, redirect }) => {
198
+ * console.error('SSO failed:', error)
199
+ * return redirect('/login?error=sso_failed')
200
+ * }
201
+ * ```
202
+ */
203
+ onCallbackError?: (ctx: CallbackErrorContext<TState>) => Promise<Response> | Response;
204
+ /**
205
+ * Get the current user from the request.
206
+ *
207
+ * This is called by the activity handler to associate activities with users.
208
+ * Read your session cookie/JWT and return the user, or undefined if not authenticated.
209
+ *
210
+ * @param req - The incoming request
211
+ * @returns User object or undefined
212
+ *
213
+ * @example
214
+ * ```typescript
215
+ * // Async (with database/session lookup)
216
+ * getUser: async (req) => {
217
+ * const session = await getSession(req)
218
+ * if (!session) return undefined
219
+ * return { id: session.userId, email: session.email }
220
+ * }
221
+ *
222
+ * // Sync (already have user in memory)
223
+ * getUser: (req) => currentUser
224
+ * ```
225
+ */
226
+ getUser: (req: Request) => Promise<TimebackUser | undefined> | TimebackUser | undefined;
227
+ }
228
+ /**
229
+ * Custom identity configuration.
230
+ *
231
+ * Use when you have your own auth system (Clerk, Auth0, etc.).
232
+ */
233
+ export interface CustomIdentityConfig {
234
+ mode: 'custom';
235
+ /**
236
+ * Get the current user from the request.
237
+ *
238
+ * Read your session cookie/JWT and return the user, or undefined if not authenticated.
239
+ * Can return synchronously or as a Promise.
240
+ *
241
+ * @param req - The incoming request
242
+ * @returns User object or undefined (sync or async)
243
+ */
244
+ getUser: (req: Request) => Promise<TimebackUser | undefined> | TimebackUser | undefined;
245
+ }
246
+ /**
247
+ * Identity configuration (SSO or custom).
248
+ */
249
+ export type IdentityConfig<TState = unknown> = SsoIdentityConfig<TState> | CustomIdentityConfig;
250
+ /**
251
+ * Full Timeback SDK configuration.
252
+ */
253
+ export interface TimebackConfig<TState = unknown> {
254
+ /** Optional path to timeback.config.ts (auto-discovered if not provided) */
255
+ configPath?: string;
256
+ /** Environment */
257
+ env: Environment;
258
+ /** API credentials for Timeback API */
259
+ api: ApiCredentials;
260
+ /** Identity configuration */
261
+ identity: IdentityConfig<TState>;
262
+ }
263
+ /**
264
+ * Request handlers namespace.
265
+ */
266
+ export interface Handlers {
267
+ /** Activity submission handler */
268
+ activity: (req: Request) => Promise<Response>;
269
+ /** Identity-related handlers */
270
+ identity: {
271
+ /** Initiate sign-in (SSO only) */
272
+ signIn: (req: Request) => Promise<Response>;
273
+ /** Handle OAuth callback (SSO only) */
274
+ callback: (req: Request) => Promise<Response>;
275
+ /** Sign out user */
276
+ signOut: () => Response;
277
+ };
278
+ /** User profile handler */
279
+ user: {
280
+ /** Get current user profile */
281
+ me: (req: Request) => Promise<Response>;
282
+ };
283
+ }
284
+ /**
285
+ * App configuration from timeback.config.ts.
286
+ */
287
+ export interface AppConfig {
288
+ name: string;
289
+ sensors: string[];
290
+ }
291
+ /**
292
+ * Timeback SDK instance (framework-agnostic).
293
+ */
294
+ export interface TimebackInstance<TState = unknown> {
295
+ /** Configuration */
296
+ config: TimebackConfig<TState>;
297
+ /** Request handlers */
298
+ handle: Handlers;
299
+ }
300
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEnD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,CAAA;AAE5D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAA;IACpB,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,iCAAiC;IACjC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAA;IACX,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gCAAgC;IAChC,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IACjC,uBAAuB;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8BAA8B;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAAA;IAC5C,wBAAwB;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,mCAAmC;IACnC,GAAG,EAAE,OAAO,CAAA;IACZ,iDAAiD;IACjD,GAAG,EAAE,GAAG,CAAA;CACR;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB,CAAC,MAAM,GAAG,OAAO;IACvD,6CAA6C;IAC7C,MAAM,EAAE,UAAU,CAAA;IAClB,kDAAkD;IAClD,IAAI,EAAE,YAAY,CAAA;IAClB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,oCAAoC;IACpC,GAAG,EAAE,OAAO,CAAA;IACZ,2CAA2C;IAC3C,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,QAAQ,CAAA;IAC1D,uCAAuC;IACvC,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,QAAQ,CAAA;CACtE;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,MAAM,GAAG,OAAO;IACrD,8BAA8B;IAC9B,KAAK,EAAE,KAAK,CAAA;IACZ,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gDAAgD;IAChD,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,oCAAoC;IACpC,GAAG,EAAE,OAAO,CAAA;IACZ,2CAA2C;IAC3C,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,QAAQ,CAAA;IAC1D,uCAAuC;IACvC,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,QAAQ,CAAA;CACtE;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB,CAAC,MAAM,GAAG,OAAO;IAClD,IAAI,EAAE,KAAK,CAAA;IACX,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,yBAAyB;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;;;;;;;;;;;;;;;OAgBG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,MAAM,CAAA;IAE/C;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,iBAAiB,EAAE,CAAC,GAAG,EAAE,sBAAsB,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAA;IAExF;;;;;;;;;;;;;OAaG;IACH,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,oBAAoB,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAA;IAErF;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,YAAY,GAAG,SAAS,CAAA;CACvF;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,QAAQ,CAAA;IACd;;;;;;;;OAQG;IACH,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,YAAY,GAAG,SAAS,CAAA;CACvF;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,MAAM,GAAG,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,GAAG,oBAAoB,CAAA;AAE/F;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,MAAM,GAAG,OAAO;IAC/C,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kBAAkB;IAClB,GAAG,EAAE,WAAW,CAAA;IAChB,uCAAuC;IACvC,GAAG,EAAE,cAAc,CAAA;IACnB,6BAA6B;IAC7B,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,kCAAkC;IAClC,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC7C,gCAAgC;IAChC,QAAQ,EAAE;QACT,kCAAkC;QAClC,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC3C,uCAAuC;QACvC,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC7C,oBAAoB;QACpB,OAAO,EAAE,MAAM,QAAQ,CAAA;KACvB,CAAA;IACD,2BAA2B;IAC3B,IAAI,EAAE;QACL,+BAA+B;QAC/B,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;KACvC,CAAA;CACD;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,MAAM,GAAG,OAAO;IACjD,oBAAoB;IACpB,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;IAC9B,uBAAuB;IACvB,MAAM,EAAE,QAAQ,CAAA;CAChB"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Shared Constants
3
+ */
4
+ /** Default base path for Timeback API routes */
5
+ export declare const DEFAULT_BASE_PATH = "/api/timeback";
6
+ /** API route paths */
7
+ export declare const ROUTES: {
8
+ readonly ACTIVITY: "/activity";
9
+ readonly IDENTITY: {
10
+ readonly SIGNIN: "/identity/signin";
11
+ readonly SIGNOUT: "/identity/signout";
12
+ readonly CALLBACK: "/identity/callback";
13
+ };
14
+ readonly USER: {
15
+ readonly ME: "/user/me";
16
+ };
17
+ };
18
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/shared/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gDAAgD;AAChD,eAAO,MAAM,iBAAiB,kBAAkB,CAAA;AAEhD,sBAAsB;AACtB,eAAO,MAAM,MAAM;;;;;;;;;;CAUT,CAAA"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Shared Types
3
+ *
4
+ * Types shared between client and server.
5
+ */
6
+ /**
7
+ * User identity returned from SSO.
8
+ */
9
+ export interface TimebackIdentity {
10
+ id: string;
11
+ email: string;
12
+ name?: string;
13
+ }
14
+ /**
15
+ * @deprecated Use TimebackIdentity instead
16
+ */
17
+ export type TimebackUser = TimebackIdentity;
18
+ /**
19
+ * Timeback user profile with enriched data from the Timeback API.
20
+ */
21
+ export interface TimebackProfile {
22
+ /** User identity */
23
+ id: string;
24
+ email: string;
25
+ name?: string;
26
+ /** School information */
27
+ school?: {
28
+ id: string;
29
+ name: string;
30
+ };
31
+ /** Grade level */
32
+ grade?: number;
33
+ /** XP earned on this app */
34
+ xp?: number;
35
+ /** Enrolled courses */
36
+ courses?: Array<{
37
+ id: string;
38
+ code: string;
39
+ name: string;
40
+ }>;
41
+ /** Goals and progress */
42
+ goals?: {
43
+ dailyXp?: number;
44
+ dailyLessons?: number;
45
+ dailyActiveMinutes?: number;
46
+ };
47
+ }
48
+ /**
49
+ * Activity start parameters.
50
+ */
51
+ export interface ActivityParams {
52
+ /** Unique identifier for the learning object */
53
+ id: string;
54
+ /** Display name of the activity */
55
+ name: string;
56
+ /** Course code from timeback.config.ts (e.g., 'FASTMATH-1') */
57
+ courseCode: string;
58
+ }
59
+ /**
60
+ * Activity metrics (optional performance data).
61
+ */
62
+ export interface ActivityMetrics {
63
+ /** Total questions attempted */
64
+ totalQuestions?: number;
65
+ /** Number of correct answers */
66
+ correctQuestions?: number;
67
+ /** XP earned from this activity */
68
+ xpEarned?: number;
69
+ /** Number of units mastered */
70
+ masteredUnits?: number;
71
+ }
72
+ /**
73
+ * Activity state sent to the server when ending.
74
+ */
75
+ export interface ActivityEndPayload {
76
+ /** Unique identifier for the learning object */
77
+ id: string;
78
+ /** Display name of the activity */
79
+ name: string;
80
+ /** Course code from timeback.config.ts */
81
+ courseCode: string;
82
+ /** ISO 8601 timestamp when activity started */
83
+ startedAt: string;
84
+ /** ISO 8601 timestamp when activity ended */
85
+ endedAt: string;
86
+ /** Active time in milliseconds (excluding paused time) */
87
+ elapsedMs: number;
88
+ /** Total paused time in milliseconds */
89
+ pausedMs: number;
90
+ /** Activity metrics */
91
+ metrics: ActivityMetrics;
92
+ }
93
+ /**
94
+ * Activity submission response.
95
+ */
96
+ export interface ActivityResponse {
97
+ success: boolean;
98
+ error?: string;
99
+ }
100
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +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,MAAM,YAAY,GAAG,gBAAgB,CAAA;AAE3C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,oBAAoB;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,yBAAyB;IACzB,MAAM,CAAC,EAAE;QACR,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;KACZ,CAAA;IAED,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd,4BAA4B;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAA;IAEX,uBAAuB;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACZ,CAAC,CAAA;IAEF,yBAAyB;IACzB,KAAK,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAC3B,CAAA;CACD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAA;IACV,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,gCAAgC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gCAAgC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAA;IACV,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAA;IACjB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAA;IACf,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAA;IACjB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAA;IAChB,uBAAuB;IACvB,OAAO,EAAE,eAAe,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACd"}
package/package.json CHANGED
@@ -1,30 +1,94 @@
1
1
  {
2
- "name": "timeback",
3
- "version": "0.0.0-alpha.2",
4
- "type": "module",
5
- "exports": {
6
- ".": {
7
- "types": "./dist/index.d.ts",
8
- "import": "./dist/index.js"
9
- }
10
- },
11
- "main": "dist/index.js",
12
- "types": "dist/index.d.ts",
13
- "files": [
14
- "dist"
15
- ],
16
- "scripts": {
17
- "build": "bun build.ts",
18
- "release": "bun publish.ts",
19
- "sort": "bunx sort-package-json"
20
- },
21
- "devDependencies": {
22
- "@timeback/internal-utils": "0.0.0",
23
- "@types/bun": "latest",
24
- "@typescript/native-preview": "^7.0.0-dev.20251217.1",
25
- "bun-plugin-dts": "^0.3.0"
26
- },
27
- "peerDependencies": {
28
- "typescript": "^5"
29
- }
2
+ "name": "timeback",
3
+ "version": "0.1.0",
4
+ "description": "Timeback SDK for frontend and backend integration",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js"
10
+ },
11
+ "./client": {
12
+ "types": "./dist/client.d.ts",
13
+ "import": "./dist/client.js"
14
+ },
15
+ "./react": {
16
+ "types": "./dist/client/adapters/react/index.d.ts",
17
+ "import": "./dist/client/adapters/react/index.js"
18
+ },
19
+ "./svelte": {
20
+ "types": "./dist/client/adapters/svelte/index.d.ts",
21
+ "svelte": "./dist/client/adapters/svelte/index.ts",
22
+ "import": "./dist/client/adapters/svelte/index.ts"
23
+ },
24
+ "./solid": {
25
+ "types": "./dist/client/adapters/solid/index.d.ts",
26
+ "solid": "./dist/client/adapters/solid/index.ts",
27
+ "import": "./dist/client/adapters/solid/index.ts"
28
+ },
29
+ "./native": {
30
+ "types": "./dist/server/adapters/native.d.ts",
31
+ "import": "./dist/server/adapters/native.js"
32
+ },
33
+ "./nextjs": {
34
+ "types": "./dist/server/adapters/nextjs.d.ts",
35
+ "import": "./dist/server/adapters/nextjs.js"
36
+ },
37
+ "./svelte-kit": {
38
+ "types": "./dist/server/adapters/svelte-kit.d.ts",
39
+ "import": "./dist/server/adapters/svelte-kit.js"
40
+ },
41
+ "./solid-start": {
42
+ "types": "./dist/server/adapters/solid-start.d.ts",
43
+ "import": "./dist/server/adapters/solid-start.js"
44
+ },
45
+ "./express": {
46
+ "types": "./dist/server/adapters/express.d.ts",
47
+ "import": "./dist/server/adapters/express.js"
48
+ },
49
+ "./tanstack-start": {
50
+ "types": "./dist/server/adapters/tanstack-start.d.ts",
51
+ "import": "./dist/server/adapters/tanstack-start.js"
52
+ }
53
+ },
54
+ "main": "dist/index.js",
55
+ "types": "dist/index.d.ts",
56
+ "files": [
57
+ "dist"
58
+ ],
59
+ "scripts": {
60
+ "build": "bun build.ts",
61
+ "test": "bun test --no-env-file unit.test.ts"
62
+ },
63
+ "dependencies": {
64
+ "jiti": "^2.6.1",
65
+ "zod": "^4.2.1"
66
+ },
67
+ "devDependencies": {
68
+ "@timeback/caliper": "0.1.0",
69
+ "@timeback/internal-cli-infra": "0.0.0",
70
+ "@timeback/internal-logger": "0.0.0",
71
+ "@timeback/internal-utils": "0.0.0",
72
+ "@timeback/types": "0.0.0",
73
+ "@types/bun": "latest",
74
+ "@types/express": "^5.0.6",
75
+ "@types/react": "^19.1.8"
76
+ },
77
+ "peerDependencies": {
78
+ "react": "^18 || ^19",
79
+ "solid-js": "^1.9.10",
80
+ "svelte": "^4 || ^5",
81
+ "typescript": "^5"
82
+ },
83
+ "peerDependenciesMeta": {
84
+ "react": {
85
+ "optional": true
86
+ },
87
+ "solid-js": {
88
+ "optional": true
89
+ },
90
+ "svelte": {
91
+ "optional": true
92
+ }
93
+ }
30
94
  }