@timeback/sdk 0.1.7 → 0.1.9

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 (116) hide show
  1. package/README.md +97 -8
  2. package/dist/chunk-07j8zre9.js +2 -0
  3. package/dist/chunk-5171mkp2.js +2 -0
  4. package/dist/chunk-63afdp3y.js +8 -0
  5. package/dist/chunk-8gg8n8v9.js +2 -0
  6. package/dist/chunk-9se82640.js +1 -0
  7. package/dist/chunk-agpf1x3g.js +16 -0
  8. package/dist/chunk-hnf0tart.js +2 -0
  9. package/dist/chunk-qr0bbnsr.js +1 -0
  10. package/dist/chunk-whc53e0y.js +11 -0
  11. package/dist/chunk-x9gvef7q.js +1 -0
  12. package/dist/client/adapters/react/hooks/types.d.ts +80 -0
  13. package/dist/client/adapters/react/hooks/types.d.ts.map +1 -1
  14. package/dist/client/adapters/react/hooks/useTimebackProfile.d.ts +42 -0
  15. package/dist/client/adapters/react/hooks/useTimebackProfile.d.ts.map +1 -0
  16. package/dist/client/adapters/react/hooks/useTimebackVerification.d.ts +17 -5
  17. package/dist/client/adapters/react/hooks/useTimebackVerification.d.ts.map +1 -1
  18. package/dist/client/adapters/react/index.d.ts +2 -1
  19. package/dist/client/adapters/react/index.d.ts.map +1 -1
  20. package/dist/client/adapters/react/index.js +2 -494
  21. package/dist/client/adapters/react/provider.d.ts.map +1 -1
  22. package/dist/client/adapters/solid/index.d.ts +3 -0
  23. package/dist/client/adapters/solid/index.d.ts.map +1 -1
  24. package/dist/client/adapters/solid/index.ts +12 -0
  25. package/dist/client/adapters/solid/primitives/createTimebackProfile.d.ts +58 -0
  26. package/dist/client/adapters/solid/primitives/createTimebackProfile.d.ts.map +1 -0
  27. package/dist/client/adapters/solid/primitives/createTimebackProfile.ts +209 -0
  28. package/dist/client/adapters/solid/primitives/createTimebackVerification.d.ts +38 -0
  29. package/dist/client/adapters/solid/primitives/createTimebackVerification.d.ts.map +1 -0
  30. package/dist/client/adapters/solid/primitives/createTimebackVerification.ts +173 -0
  31. package/dist/client/adapters/solid/types.d.ts +109 -0
  32. package/dist/client/adapters/solid/types.d.ts.map +1 -0
  33. package/dist/client/adapters/solid/types.ts +110 -0
  34. package/dist/client/adapters/svelte/index.d.ts +2 -1
  35. package/dist/client/adapters/svelte/index.d.ts.map +1 -1
  36. package/dist/client/adapters/svelte/index.ts +11 -2
  37. package/dist/client/adapters/svelte/{stores.d.ts → stores/client.d.ts} +11 -9
  38. package/dist/client/adapters/svelte/stores/client.d.ts.map +1 -0
  39. package/dist/client/adapters/svelte/{stores.ts → stores/client.ts} +24 -52
  40. package/dist/client/adapters/svelte/stores/index.d.ts +10 -0
  41. package/dist/client/adapters/svelte/stores/index.d.ts.map +1 -0
  42. package/dist/client/adapters/svelte/stores/index.ts +22 -0
  43. package/dist/client/adapters/svelte/stores/profile.d.ts +66 -0
  44. package/dist/client/adapters/svelte/stores/profile.d.ts.map +1 -0
  45. package/dist/client/adapters/svelte/stores/profile.ts +168 -0
  46. package/dist/client/adapters/svelte/stores/verification.d.ts +43 -0
  47. package/dist/client/adapters/svelte/stores/verification.d.ts.map +1 -0
  48. package/dist/client/adapters/svelte/stores/verification.ts +208 -0
  49. package/dist/client/adapters/svelte/types.d.ts +35 -0
  50. package/dist/client/adapters/svelte/types.d.ts.map +1 -0
  51. package/dist/client/adapters/vue/composables/useTimebackProfile.d.ts +51 -0
  52. package/dist/client/adapters/vue/composables/useTimebackProfile.d.ts.map +1 -0
  53. package/dist/client/adapters/vue/composables/useTimebackProfile.ts +186 -0
  54. package/dist/client/adapters/vue/composables/useTimebackVerification.d.ts +46 -0
  55. package/dist/client/adapters/vue/composables/useTimebackVerification.d.ts.map +1 -0
  56. package/dist/client/adapters/vue/composables/useTimebackVerification.ts +169 -0
  57. package/dist/client/adapters/vue/index.d.ts +3 -0
  58. package/dist/client/adapters/vue/index.d.ts.map +1 -1
  59. package/dist/client/adapters/vue/index.ts +12 -1
  60. package/dist/client/adapters/vue/types.d.ts +109 -0
  61. package/dist/client/adapters/vue/types.d.ts.map +1 -0
  62. package/dist/client/adapters/vue/types.ts +110 -0
  63. package/dist/client/lib/activity/activity.class.d.ts +5 -5
  64. package/dist/client/lib/activity/activity.class.d.ts.map +1 -1
  65. package/dist/client/lib/user-cache.d.ts +39 -0
  66. package/dist/client/lib/user-cache.d.ts.map +1 -0
  67. package/dist/client/lib/user-cache.ts +168 -0
  68. package/dist/client/lib/utils.d.ts +15 -0
  69. package/dist/client/lib/utils.d.ts.map +1 -1
  70. package/dist/client/namespaces/activity.d.ts +2 -3
  71. package/dist/client/namespaces/activity.d.ts.map +1 -1
  72. package/dist/client.d.ts +1 -1
  73. package/dist/client.js +1 -257
  74. package/dist/edge.js +1 -86271
  75. package/dist/identity.js +1 -86131
  76. package/dist/index.d.ts +2 -2
  77. package/dist/index.js +22 -104883
  78. package/dist/server/adapters/express.js +1 -85973
  79. package/dist/server/adapters/native.js +2 -221
  80. package/dist/server/adapters/nextjs.js +1 -233
  81. package/dist/server/adapters/nuxt.js +1 -86046
  82. package/dist/server/adapters/solid-start.js +1 -85945
  83. package/dist/server/adapters/svelte-kit.js +1 -279
  84. package/dist/server/adapters/tanstack-start.js +1 -85918
  85. package/dist/server/handlers/activity/attempts.d.ts +51 -0
  86. package/dist/server/handlers/activity/attempts.d.ts.map +1 -0
  87. package/dist/server/handlers/activity/caliper.d.ts +46 -5
  88. package/dist/server/handlers/activity/caliper.d.ts.map +1 -1
  89. package/dist/server/handlers/activity/completion.d.ts +43 -0
  90. package/dist/server/handlers/activity/completion.d.ts.map +1 -0
  91. package/dist/server/handlers/activity/handler.d.ts +18 -1
  92. package/dist/server/handlers/activity/handler.d.ts.map +1 -1
  93. package/dist/server/handlers/activity/progress.d.ts +47 -0
  94. package/dist/server/handlers/activity/progress.d.ts.map +1 -0
  95. package/dist/server/handlers/activity/schema.d.ts +1 -2
  96. package/dist/server/handlers/activity/schema.d.ts.map +1 -1
  97. package/dist/server/handlers/activity/types.d.ts +1 -2
  98. package/dist/server/handlers/activity/types.d.ts.map +1 -1
  99. package/dist/server/lib/index.d.ts +1 -1
  100. package/dist/server/lib/index.d.ts.map +1 -1
  101. package/dist/server/lib/utils.d.ts +61 -0
  102. package/dist/server/lib/utils.d.ts.map +1 -1
  103. package/dist/server/timeback.d.ts +2 -2
  104. package/dist/server/timeback.d.ts.map +1 -1
  105. package/dist/server/types.d.ts +7 -1
  106. package/dist/server/types.d.ts.map +1 -1
  107. package/dist/shared/constants.d.ts +19 -0
  108. package/dist/shared/constants.d.ts.map +1 -1
  109. package/dist/shared/types.d.ts +62 -8
  110. package/dist/shared/types.d.ts.map +1 -1
  111. package/dist/shared/xp-calculator.d.ts +25 -0
  112. package/dist/shared/xp-calculator.d.ts.map +1 -0
  113. package/package.json +6 -4
  114. package/dist/client/adapters/svelte/stores.d.ts.map +0 -1
  115. package/dist/server/handlers/activity/gradebook.d.ts +0 -56
  116. package/dist/server/handlers/activity/gradebook.d.ts.map +0 -1
package/README.md CHANGED
@@ -54,8 +54,8 @@ export const timeback = await createTimeback({
54
54
  },
55
55
  identity: {
56
56
  mode: 'sso',
57
- clientId: process.env.AWS_COGNITO_CLIENT_ID!,
58
- clientSecret: process.env.AWS_COGNITO_CLIENT_SECRET!,
57
+ clientId: process.env.TIMEBACK_SSO_CLIENT_ID!,
58
+ clientSecret: process.env.TIMEBACK_SSO_CLIENT_SECRET!,
59
59
  redirectUri: 'http://localhost:3000/api/auth/sso/callback/timeback',
60
60
  onCallbackSuccess: async ({ user, state, redirect }) => {
61
61
  // user.id is the timebackId (canonical stable identifier)
@@ -212,8 +212,58 @@ function MyComponent() {
212
212
  }
213
213
  ```
214
214
 
215
+ #### Profile Hook
216
+
217
+ Use `useTimebackProfile` to fetch user profile data. Supports manual and auto-fetch modes:
218
+
219
+ ```tsx
220
+ // Manual fetch
221
+ import { useTimebackProfile } from '@timeback/sdk/react'
222
+
223
+ function ProfileButton() {
224
+ const { state, canFetch, fetchProfile } = useTimebackProfile()
225
+
226
+ if (state.status === 'loaded') {
227
+ return <div>XP: {state.profile.xp}</div>
228
+ }
229
+
230
+ return (
231
+ <button onClick={fetchProfile} disabled={!canFetch}>
232
+ {state.status === 'loading' ? 'Loading...' : 'Load Profile'}
233
+ </button>
234
+ )
235
+ }
236
+
237
+ // Auto-fetch when verified
238
+ function AutoProfile() {
239
+ const { state } = useTimebackProfile({ auto: true })
240
+
241
+ if (state.status === 'loading') return <div>Loading...</div>
242
+ if (state.status === 'loaded') return <div>XP: {state.profile.xp}</div>
243
+
244
+ return null
245
+ }
246
+ ```
247
+
215
248
  ### Vue
216
249
 
250
+ #### Profile Composable
251
+
252
+ ```vue
253
+ <script setup>
254
+ import { useTimebackProfile } from '@timeback/sdk/vue'
255
+
256
+ const { state, canFetch, fetchProfile } = useTimebackProfile()
257
+ </script>
258
+
259
+ <template>
260
+ <div v-if="state.status === 'loaded'">XP: {{ state.profile.xp }}</div>
261
+ <button v-else @click="fetchProfile" :disabled="!canFetch">
262
+ {{ state.status === 'loading' ? 'Loading...' : 'Load Profile' }}
263
+ </button>
264
+ </template>
265
+ ```
266
+
217
267
  ```vue
218
268
  <!-- app.vue -->
219
269
  <script setup>
@@ -290,6 +340,22 @@ onUnmounted(() => activity?.end())
290
340
  <SignInButton size="lg" />
291
341
  ```
292
342
 
343
+ #### Profile Store
344
+
345
+ ```svelte
346
+ <script>
347
+ import { timebackProfile, timebackProfileCanFetch, fetchTimebackProfile } from '@timeback/sdk/svelte'
348
+ </script>
349
+
350
+ <button onclick={fetchTimebackProfile} disabled={!$timebackProfileCanFetch}>
351
+ {$timebackProfile.status === 'loading' ? 'Loading...' : 'Load Profile'}
352
+ </button>
353
+
354
+ {#if $timebackProfile.status === 'loaded'}
355
+ <div>XP: {$timebackProfile.profile.xp}</div>
356
+ {/if}
357
+ ```
358
+
293
359
  ### Solid
294
360
 
295
361
  ```tsx
@@ -331,6 +397,30 @@ function MyComponent() {
331
397
  }
332
398
  ```
333
399
 
400
+ #### Profile Primitive
401
+
402
+ ```tsx
403
+ import { createTimebackProfile } from '@timeback/sdk/solid'
404
+ import { Show } from 'solid-js'
405
+
406
+ function ProfileButton() {
407
+ const { state, canFetch, fetchProfile } = createTimebackProfile()
408
+
409
+ return (
410
+ <Show
411
+ when={state.status === 'loaded'}
412
+ fallback={
413
+ <button onClick={fetchProfile} disabled={!canFetch}>
414
+ {state.status === 'loading' ? 'Loading...' : 'Load Profile'}
415
+ </button>
416
+ }
417
+ >
418
+ <div>XP: {state.profile.xp}</div>
419
+ </Show>
420
+ )
421
+ }
422
+ ```
423
+
334
424
  ## Identity Modes
335
425
 
336
426
  ### SSO Mode
@@ -340,8 +430,8 @@ Uses Timeback as the identity provider via OIDC. When using `createTimeback()`,
340
430
  ```typescript
341
431
  identity: {
342
432
  mode: 'sso',
343
- clientId: process.env.AWS_COGNITO_CLIENT_ID!,
344
- clientSecret: process.env.AWS_COGNITO_CLIENT_SECRET!,
433
+ clientId: process.env.TIMEBACK_SSO_CLIENT_ID!,
434
+ clientSecret: process.env.TIMEBACK_SSO_CLIENT_SECRET!,
345
435
  redirectUri: 'http://localhost:3000/api/auth/sso/callback/timeback',
346
436
  onCallbackSuccess: async ({ user, idp, state, redirect }) => {
347
437
  // user.id is the timebackId (canonical stable identifier)
@@ -448,8 +538,8 @@ export const timeback = createTimebackIdentity({
448
538
  env: 'production',
449
539
  identity: {
450
540
  mode: 'sso',
451
- clientId: process.env.AWS_COGNITO_CLIENT_ID!,
452
- clientSecret: process.env.AWS_COGNITO_CLIENT_SECRET!,
541
+ clientId: process.env.TIMEBACK_SSO_CLIENT_ID!,
542
+ clientSecret: process.env.TIMEBACK_SSO_CLIENT_SECRET!,
453
543
  onCallbackSuccess: async ({ user, tokens, redirect }) => {
454
544
  // user is raw OIDC userInfo (sub, email, name, picture, etc.)
455
545
  // No Timeback profile enrichment in identity-only mode
@@ -535,8 +625,7 @@ await activity.end({
535
625
  correctQuestions: 8,
536
626
  xpEarned: 80,
537
627
  masteredUnits: 1, // optional (default: omitted)
538
- attemptNumber: 2, // optional (default: omitted)
539
- pctCompleteApp: 67, // optional (default: omitted; clamped to 0–100 by the SDK server handler if present)
628
+ pctComplete: 67, // optional (default: omitted; clamped to 0–100 by the SDK server handler if present)
540
629
  })
541
630
  ```
542
631
 
@@ -0,0 +1,2 @@
1
+ import{createRequire as k}from"node:module";var g=Object.create;var{getPrototypeOf:h,defineProperty:f,getOwnPropertyNames:i}=Object;var j=Object.prototype.hasOwnProperty;var l=(a,b,c)=>{c=a!=null?g(h(a)):{};let d=b||!a||!a.__esModule?f(c,"default",{value:a,enumerable:!0}):c;for(let e of i(a))if(!j.call(d,e))f(d,e,{get:()=>a[e],enumerable:!0});return d};var m=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports);var o=k(import.meta.url);
2
+ export{l as M,m as N,o as O};
@@ -0,0 +1,2 @@
1
+ import{C as F}from"./chunk-hnf0tart.js";function M(j){let g=j.trim();if(g==="")return"/";let A=g.indexOf("?");if(A===-1)return g;let L=g.slice(0,A);if(L==="")return"/";return L}function X(j){let g=M(j);if(g!==""&&!g.startsWith("/"))g=`/${g}`;if(g==="/"||g==="")return"";if(g.endsWith("/"))return g.slice(0,-1);return g}function Z(j){let g=j.method.toUpperCase(),A=M(j.pathname),L=j.callbackPath?M(j.callbackPath):void 0;if(L&&A===L)return g==="GET"?"identity.callback":null;let N=j.basePath,Q=N!==void 0,J=Q?X(N):void 0,V=(G)=>{if(g==="GET"){if(G===F.IDENTITY.SIGNIN)return"identity.signIn";if(G===F.IDENTITY.CALLBACK)return"identity.callback";if(G===F.IDENTITY.SIGNOUT)return"identity.signOut";if(G===F.USER.ME)return"user.me";if(G===F.USER.VERIFY)return"user.verify"}if(g==="POST"){if(G===F.ACTIVITY)return"activity"}return null};if(Q&&J!==void 0){if(J!==""&&A===J)return null;if(J!==""&&!A.startsWith(`${J}/`))return null;let G=J===""?A:A.slice(J.length),W=G.startsWith("/")?G:`/${G}`;return V(W)}if(g==="GET"){if(A.endsWith(F.IDENTITY.SIGNIN))return"identity.signIn";if(A.endsWith(F.IDENTITY.CALLBACK))return"identity.callback";if(A.endsWith(F.IDENTITY.SIGNOUT))return"identity.signOut";if(A.endsWith(F.USER.ME))return"user.me";if(A.endsWith(F.USER.VERIFY))return"user.verify"}if(g==="POST"){if(A.endsWith(F.ACTIVITY))return"activity"}return null}function _(j){return"handle"in j?j.handle:j}function $(j){return"activity"in j}function C(j){return"user"in j}
2
+ export{M as x,Z as y,_ as z,$ as A,C as B};