@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.
- package/README.md +97 -8
- package/dist/chunk-07j8zre9.js +2 -0
- package/dist/chunk-5171mkp2.js +2 -0
- package/dist/chunk-63afdp3y.js +8 -0
- package/dist/chunk-8gg8n8v9.js +2 -0
- package/dist/chunk-9se82640.js +1 -0
- package/dist/chunk-agpf1x3g.js +16 -0
- package/dist/chunk-hnf0tart.js +2 -0
- package/dist/chunk-qr0bbnsr.js +1 -0
- package/dist/chunk-whc53e0y.js +11 -0
- package/dist/chunk-x9gvef7q.js +1 -0
- package/dist/client/adapters/react/hooks/types.d.ts +80 -0
- package/dist/client/adapters/react/hooks/types.d.ts.map +1 -1
- package/dist/client/adapters/react/hooks/useTimebackProfile.d.ts +42 -0
- package/dist/client/adapters/react/hooks/useTimebackProfile.d.ts.map +1 -0
- package/dist/client/adapters/react/hooks/useTimebackVerification.d.ts +17 -5
- package/dist/client/adapters/react/hooks/useTimebackVerification.d.ts.map +1 -1
- package/dist/client/adapters/react/index.d.ts +2 -1
- package/dist/client/adapters/react/index.d.ts.map +1 -1
- package/dist/client/adapters/react/index.js +2 -494
- package/dist/client/adapters/react/provider.d.ts.map +1 -1
- package/dist/client/adapters/solid/index.d.ts +3 -0
- package/dist/client/adapters/solid/index.d.ts.map +1 -1
- package/dist/client/adapters/solid/index.ts +12 -0
- package/dist/client/adapters/solid/primitives/createTimebackProfile.d.ts +58 -0
- package/dist/client/adapters/solid/primitives/createTimebackProfile.d.ts.map +1 -0
- package/dist/client/adapters/solid/primitives/createTimebackProfile.ts +209 -0
- package/dist/client/adapters/solid/primitives/createTimebackVerification.d.ts +38 -0
- package/dist/client/adapters/solid/primitives/createTimebackVerification.d.ts.map +1 -0
- package/dist/client/adapters/solid/primitives/createTimebackVerification.ts +173 -0
- package/dist/client/adapters/solid/types.d.ts +109 -0
- package/dist/client/adapters/solid/types.d.ts.map +1 -0
- package/dist/client/adapters/solid/types.ts +110 -0
- package/dist/client/adapters/svelte/index.d.ts +2 -1
- package/dist/client/adapters/svelte/index.d.ts.map +1 -1
- package/dist/client/adapters/svelte/index.ts +11 -2
- package/dist/client/adapters/svelte/{stores.d.ts → stores/client.d.ts} +11 -9
- package/dist/client/adapters/svelte/stores/client.d.ts.map +1 -0
- package/dist/client/adapters/svelte/{stores.ts → stores/client.ts} +24 -52
- package/dist/client/adapters/svelte/stores/index.d.ts +10 -0
- package/dist/client/adapters/svelte/stores/index.d.ts.map +1 -0
- package/dist/client/adapters/svelte/stores/index.ts +22 -0
- package/dist/client/adapters/svelte/stores/profile.d.ts +66 -0
- package/dist/client/adapters/svelte/stores/profile.d.ts.map +1 -0
- package/dist/client/adapters/svelte/stores/profile.ts +168 -0
- package/dist/client/adapters/svelte/stores/verification.d.ts +43 -0
- package/dist/client/adapters/svelte/stores/verification.d.ts.map +1 -0
- package/dist/client/adapters/svelte/stores/verification.ts +208 -0
- package/dist/client/adapters/svelte/types.d.ts +35 -0
- package/dist/client/adapters/svelte/types.d.ts.map +1 -0
- package/dist/client/adapters/vue/composables/useTimebackProfile.d.ts +51 -0
- package/dist/client/adapters/vue/composables/useTimebackProfile.d.ts.map +1 -0
- package/dist/client/adapters/vue/composables/useTimebackProfile.ts +186 -0
- package/dist/client/adapters/vue/composables/useTimebackVerification.d.ts +46 -0
- package/dist/client/adapters/vue/composables/useTimebackVerification.d.ts.map +1 -0
- package/dist/client/adapters/vue/composables/useTimebackVerification.ts +169 -0
- package/dist/client/adapters/vue/index.d.ts +3 -0
- package/dist/client/adapters/vue/index.d.ts.map +1 -1
- package/dist/client/adapters/vue/index.ts +12 -1
- package/dist/client/adapters/vue/types.d.ts +109 -0
- package/dist/client/adapters/vue/types.d.ts.map +1 -0
- package/dist/client/adapters/vue/types.ts +110 -0
- package/dist/client/lib/activity/activity.class.d.ts +5 -5
- package/dist/client/lib/activity/activity.class.d.ts.map +1 -1
- package/dist/client/lib/user-cache.d.ts +39 -0
- package/dist/client/lib/user-cache.d.ts.map +1 -0
- package/dist/client/lib/user-cache.ts +168 -0
- package/dist/client/lib/utils.d.ts +15 -0
- package/dist/client/lib/utils.d.ts.map +1 -1
- package/dist/client/namespaces/activity.d.ts +2 -3
- package/dist/client/namespaces/activity.d.ts.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.js +1 -257
- package/dist/edge.js +1 -86271
- package/dist/identity.js +1 -86131
- package/dist/index.d.ts +2 -2
- package/dist/index.js +22 -104883
- package/dist/server/adapters/express.js +1 -85973
- package/dist/server/adapters/native.js +2 -221
- package/dist/server/adapters/nextjs.js +1 -233
- package/dist/server/adapters/nuxt.js +1 -86046
- package/dist/server/adapters/solid-start.js +1 -85945
- package/dist/server/adapters/svelte-kit.js +1 -279
- package/dist/server/adapters/tanstack-start.js +1 -85918
- package/dist/server/handlers/activity/attempts.d.ts +51 -0
- package/dist/server/handlers/activity/attempts.d.ts.map +1 -0
- package/dist/server/handlers/activity/caliper.d.ts +46 -5
- package/dist/server/handlers/activity/caliper.d.ts.map +1 -1
- package/dist/server/handlers/activity/completion.d.ts +43 -0
- package/dist/server/handlers/activity/completion.d.ts.map +1 -0
- package/dist/server/handlers/activity/handler.d.ts +18 -1
- package/dist/server/handlers/activity/handler.d.ts.map +1 -1
- package/dist/server/handlers/activity/progress.d.ts +47 -0
- package/dist/server/handlers/activity/progress.d.ts.map +1 -0
- package/dist/server/handlers/activity/schema.d.ts +1 -2
- package/dist/server/handlers/activity/schema.d.ts.map +1 -1
- package/dist/server/handlers/activity/types.d.ts +1 -2
- package/dist/server/handlers/activity/types.d.ts.map +1 -1
- package/dist/server/lib/index.d.ts +1 -1
- package/dist/server/lib/index.d.ts.map +1 -1
- package/dist/server/lib/utils.d.ts +61 -0
- package/dist/server/lib/utils.d.ts.map +1 -1
- package/dist/server/timeback.d.ts +2 -2
- package/dist/server/timeback.d.ts.map +1 -1
- package/dist/server/types.d.ts +7 -1
- package/dist/server/types.d.ts.map +1 -1
- package/dist/shared/constants.d.ts +19 -0
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/types.d.ts +62 -8
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/xp-calculator.d.ts +25 -0
- package/dist/shared/xp-calculator.d.ts.map +1 -0
- package/package.json +6 -4
- package/dist/client/adapters/svelte/stores.d.ts.map +0 -1
- package/dist/server/handlers/activity/gradebook.d.ts +0 -56
- 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.
|
|
58
|
-
clientSecret: process.env.
|
|
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.
|
|
344
|
-
clientSecret: process.env.
|
|
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.
|
|
452
|
-
clientSecret: process.env.
|
|
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
|
-
|
|
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};
|