@timeback/sdk 0.1.6 → 0.1.8
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 +91 -2
- package/dist/chunk-07j8zre9.js +2 -0
- package/dist/chunk-3886xy48.js +8 -0
- package/dist/chunk-9se82640.js +1 -0
- package/dist/chunk-ahy54f2r.js +2 -0
- package/dist/chunk-ewsp6v3b.js +16 -0
- package/dist/chunk-j1xdrfqj.js +2 -0
- package/dist/chunk-qaa129bd.js +2 -0
- package/dist/chunk-qr0bbnsr.js +1 -0
- package/dist/chunk-rgbpvxbv.js +1 -0
- package/dist/chunk-whc53e0y.js +11 -0
- package/dist/client/adapters/react/hooks/types.d.ts +61 -0
- package/dist/client/adapters/react/hooks/types.d.ts.map +1 -0
- 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 +18 -0
- package/dist/client/adapters/react/hooks/useTimebackVerification.d.ts.map +1 -0
- package/dist/client/adapters/react/index.d.ts +3 -0
- package/dist/client/adapters/react/index.d.ts.map +1 -1
- package/dist/client/adapters/react/index.js +2 -364
- 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 +36 -0
- package/dist/client/adapters/solid/primitives/createTimebackVerification.d.ts.map +1 -0
- package/dist/client/adapters/solid/primitives/createTimebackVerification.ts +133 -0
- package/dist/client/adapters/solid/types.d.ts +86 -0
- package/dist/client/adapters/solid/types.d.ts.map +1 -0
- package/dist/client/adapters/solid/types.ts +85 -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 +126 -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 +44 -0
- package/dist/client/adapters/vue/composables/useTimebackVerification.d.ts.map +1 -0
- package/dist/client/adapters/vue/composables/useTimebackVerification.ts +128 -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 +86 -0
- package/dist/client/adapters/vue/types.d.ts.map +1 -0
- package/dist/client/adapters/vue/types.ts +85 -0
- package/dist/client/auth/bearer.d.ts +17 -0
- package/dist/client/auth/bearer.d.ts.map +1 -0
- package/dist/client/auth/index.d.ts +3 -0
- package/dist/client/auth/index.d.ts.map +1 -0
- package/dist/client/auth/types.d.ts +39 -0
- package/dist/client/auth/types.d.ts.map +1 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -1
- 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/fetch.d.ts +19 -0
- package/dist/client/lib/fetch.d.ts.map +1 -0
- 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/namespaces/activity.d.ts +2 -3
- package/dist/client/namespaces/activity.d.ts.map +1 -1
- package/dist/client/namespaces/user.d.ts +25 -2
- package/dist/client/namespaces/user.d.ts.map +1 -1
- package/dist/client/timeback-client.class.d.ts +15 -0
- package/dist/client/timeback-client.class.d.ts.map +1 -1
- package/dist/client/timeback-client.d.ts +3 -0
- package/dist/client/timeback-client.d.ts.map +1 -1
- package/dist/client.d.ts +3 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1 -194
- package/dist/edge.js +1 -1149
- package/dist/identity.js +1 -1019
- package/dist/index.js +22 -104603
- package/dist/server/adapters/express.d.ts.map +1 -1
- package/dist/server/adapters/express.js +1 -85997
- package/dist/server/adapters/native.d.ts.map +1 -1
- package/dist/server/adapters/native.js +2 -190
- package/dist/server/adapters/nextjs.js +1 -202
- package/dist/server/adapters/nuxt.d.ts.map +1 -1
- package/dist/server/adapters/nuxt.js +1 -86066
- package/dist/server/adapters/solid-start.d.ts.map +1 -1
- package/dist/server/adapters/solid-start.js +1 -85965
- package/dist/server/adapters/svelte-kit.d.ts.map +1 -1
- package/dist/server/adapters/svelte-kit.js +1 -243
- package/dist/server/adapters/tanstack-start.d.ts.map +1 -1
- package/dist/server/adapters/tanstack-start.js +1 -85943
- package/dist/server/adapters/utils.d.ts +1 -1
- package/dist/server/adapters/utils.d.ts.map +1 -1
- 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 +133 -0
- package/dist/server/handlers/activity/caliper.d.ts.map +1 -0
- 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 +32 -0
- package/dist/server/handlers/activity/handler.d.ts.map +1 -0
- package/dist/server/handlers/activity/index.d.ts +9 -0
- package/dist/server/handlers/activity/index.d.ts.map +1 -0
- 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/resolve.d.ts +39 -0
- package/dist/server/handlers/activity/resolve.d.ts.map +1 -0
- package/dist/server/handlers/activity/schema.d.ts +51 -0
- package/dist/server/handlers/activity/schema.d.ts.map +1 -0
- package/dist/server/handlers/activity/types.d.ts +51 -0
- package/dist/server/handlers/activity/types.d.ts.map +1 -0
- package/dist/server/handlers/identity/handler.d.ts +14 -0
- package/dist/server/handlers/identity/handler.d.ts.map +1 -0
- package/dist/server/handlers/identity/index.d.ts +8 -0
- package/dist/server/handlers/identity/index.d.ts.map +1 -0
- package/dist/server/handlers/identity/oidc.d.ts +43 -0
- package/dist/server/handlers/identity/oidc.d.ts.map +1 -0
- package/dist/server/handlers/identity/types.d.ts +24 -0
- package/dist/server/handlers/identity/types.d.ts.map +1 -0
- package/dist/server/handlers/identity-only/handler.d.ts +15 -0
- package/dist/server/handlers/identity-only/handler.d.ts.map +1 -0
- package/dist/server/handlers/identity-only/index.d.ts +8 -0
- package/dist/server/handlers/identity-only/index.d.ts.map +1 -0
- package/dist/server/handlers/identity-only/oidc.d.ts +26 -0
- package/dist/server/handlers/identity-only/oidc.d.ts.map +1 -0
- package/dist/server/handlers/identity-only/types.d.ts +19 -0
- package/dist/server/handlers/identity-only/types.d.ts.map +1 -0
- package/dist/server/handlers/index.d.ts +5 -2
- package/dist/server/handlers/index.d.ts.map +1 -1
- package/dist/server/{lib/build-user-profile.d.ts → handlers/user/enrollments.d.ts} +7 -2
- package/dist/server/handlers/user/enrollments.d.ts.map +1 -0
- package/dist/server/handlers/user/handler.d.ts +17 -0
- package/dist/server/handlers/user/handler.d.ts.map +1 -0
- package/dist/server/handlers/user/index.d.ts +10 -0
- package/dist/server/handlers/user/index.d.ts.map +1 -0
- package/dist/server/handlers/user/profile.d.ts +22 -0
- package/dist/server/handlers/user/profile.d.ts.map +1 -0
- package/dist/server/handlers/user/types.d.ts +35 -0
- package/dist/server/handlers/user/types.d.ts.map +1 -0
- package/dist/server/handlers/user/verify.d.ts +25 -0
- package/dist/server/handlers/user/verify.d.ts.map +1 -0
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/lib/index.d.ts +4 -5
- package/dist/server/lib/index.d.ts.map +1 -1
- package/dist/server/lib/resolve.d.ts +4 -42
- package/dist/server/lib/resolve.d.ts.map +1 -1
- package/dist/server/lib/sso.d.ts +86 -0
- package/dist/server/lib/sso.d.ts.map +1 -0
- package/dist/server/lib/utils.d.ts +93 -1
- package/dist/server/lib/utils.d.ts.map +1 -1
- package/dist/server/timeback-identity.d.ts.map +1 -1
- package/dist/server/timeback.d.ts.map +1 -1
- package/dist/server/types.d.ts +23 -10
- package/dist/server/types.d.ts.map +1 -1
- package/dist/shared/constants.d.ts +7 -0
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/types.d.ts +77 -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 +8 -2
- package/dist/client/adapters/svelte/stores.d.ts.map +0 -1
- package/dist/server/handlers/activity.d.ts +0 -25
- package/dist/server/handlers/activity.d.ts.map +0 -1
- package/dist/server/handlers/identity-full.d.ts +0 -28
- package/dist/server/handlers/identity-full.d.ts.map +0 -1
- package/dist/server/handlers/identity-only.d.ts +0 -22
- package/dist/server/handlers/identity-only.d.ts.map +0 -1
- package/dist/server/handlers/user.d.ts +0 -31
- package/dist/server/handlers/user.d.ts.map +0 -1
- package/dist/server/lib/build-activity-events.d.ts +0 -67
- package/dist/server/lib/build-activity-events.d.ts.map +0 -1
- package/dist/server/lib/build-user-profile.d.ts.map +0 -1
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useTimebackVerification
|
|
3
|
+
*
|
|
4
|
+
* Vue composable for checking whether the current user can be verified in Timeback.
|
|
5
|
+
*
|
|
6
|
+
* This is a lightweight check (backed by `/api/timeback/user/verify`) and is
|
|
7
|
+
* intended for partner gating flows (e.g., "free for Timeback users").
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { ref, watch } from 'vue'
|
|
11
|
+
|
|
12
|
+
import { getVerifyCache, verifyOnce } from '../../../lib/user-cache'
|
|
13
|
+
import { useTimeback } from '../provider'
|
|
14
|
+
|
|
15
|
+
import type { Ref } from 'vue'
|
|
16
|
+
import type { TimebackVerifyResult } from '../../../../shared/types'
|
|
17
|
+
import type { TimebackVerificationState, UseTimebackVerificationOptions } from '../types'
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Convert a verify result into a composable-friendly state machine.
|
|
21
|
+
*
|
|
22
|
+
* @param result - Raw verify result from the SDK client
|
|
23
|
+
* @returns Mapped verification state
|
|
24
|
+
*/
|
|
25
|
+
function toState(result: TimebackVerifyResult): TimebackVerificationState {
|
|
26
|
+
return result.verified
|
|
27
|
+
? { status: 'verified', timebackId: result.timebackId }
|
|
28
|
+
: { status: 'unverified' }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Verify the current user against Timeback.
|
|
33
|
+
*
|
|
34
|
+
* The composable runs automatically once the Timeback client is available, and
|
|
35
|
+
* provides a `refresh()` method to retry.
|
|
36
|
+
*
|
|
37
|
+
* @param options - Composable options
|
|
38
|
+
* @param options.enabled - If false, the composable does nothing and stays in loading state.
|
|
39
|
+
* @returns Verification state and a refresh method
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```vue
|
|
43
|
+
* <script setup>
|
|
44
|
+
* import { useTimebackVerification } from '@timeback/sdk/vue'
|
|
45
|
+
*
|
|
46
|
+
* const { state, refresh } = useTimebackVerification()
|
|
47
|
+
* </script>
|
|
48
|
+
*
|
|
49
|
+
* <template>
|
|
50
|
+
* <div v-if="state.status === 'verified'">
|
|
51
|
+
* Verified as {{ state.timebackId }}
|
|
52
|
+
* </div>
|
|
53
|
+
* <div v-else-if="state.status === 'loading'">
|
|
54
|
+
* Verifying...
|
|
55
|
+
* </div>
|
|
56
|
+
* <button @click="refresh">Refresh</button>
|
|
57
|
+
* </template>
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export function useTimebackVerification(
|
|
61
|
+
options: UseTimebackVerificationOptions = {},
|
|
62
|
+
): {
|
|
63
|
+
state: Ref<TimebackVerificationState>
|
|
64
|
+
refresh: () => void
|
|
65
|
+
} {
|
|
66
|
+
const enabled = options.enabled ?? true
|
|
67
|
+
const timebackRef = useTimeback()
|
|
68
|
+
|
|
69
|
+
const state = ref<TimebackVerificationState>({ status: 'loading' }) as Ref<TimebackVerificationState>
|
|
70
|
+
const refreshNonce = ref(0)
|
|
71
|
+
|
|
72
|
+
let lastHandledRefreshNonce = 0
|
|
73
|
+
|
|
74
|
+
const refresh = () => {
|
|
75
|
+
if (!enabled) return
|
|
76
|
+
refreshNonce.value++
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
watch(
|
|
80
|
+
[() => timebackRef.value, refreshNonce],
|
|
81
|
+
async ([timeback, nonce], _prev, onCleanup) => {
|
|
82
|
+
if (!enabled) return
|
|
83
|
+
|
|
84
|
+
let cancelled = false
|
|
85
|
+
|
|
86
|
+
onCleanup(() => {
|
|
87
|
+
cancelled = true
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
const force = nonce > lastHandledRefreshNonce
|
|
91
|
+
|
|
92
|
+
if (timeback && !force) {
|
|
93
|
+
const cached = getVerifyCache(timeback)
|
|
94
|
+
|
|
95
|
+
if (cached) {
|
|
96
|
+
state.value = toState(cached)
|
|
97
|
+
return
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
state.value = { status: 'loading' }
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
if (!timeback) return
|
|
105
|
+
|
|
106
|
+
if (force) {
|
|
107
|
+
lastHandledRefreshNonce = nonce
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const result = await verifyOnce(timeback, force)
|
|
111
|
+
|
|
112
|
+
if (cancelled) return
|
|
113
|
+
|
|
114
|
+
state.value = toState(result)
|
|
115
|
+
} catch (err) {
|
|
116
|
+
if (!cancelled) {
|
|
117
|
+
state.value = {
|
|
118
|
+
status: 'error',
|
|
119
|
+
message: err instanceof Error ? err.message : 'Failed to verify Timeback user',
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
{ immediate: true },
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
return { state, refresh }
|
|
128
|
+
}
|
|
@@ -37,6 +37,9 @@
|
|
|
37
37
|
export { Activity, createClient, TimebackClient } from '@timeback/sdk/client';
|
|
38
38
|
export type { ActivityMetrics, ActivityParams, TimebackIdentity } from '@timeback/sdk/client';
|
|
39
39
|
export { TimebackProvider, useTimeback } from './provider';
|
|
40
|
+
export { useTimebackVerification } from './composables/useTimebackVerification';
|
|
41
|
+
export { useTimebackProfile } from './composables/useTimebackProfile';
|
|
42
|
+
export type { TimebackProfileState, TimebackVerificationState, UseTimebackProfileOptions, UseTimebackProfileResult, UseTimebackVerificationOptions, UseTimebackVerificationResult, } from './types';
|
|
40
43
|
export { default as SignInButton } from './SignInButton.vue';
|
|
41
44
|
export type { SignInButtonProps } from './SignInButton.vue';
|
|
42
45
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/client/adapters/vue/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/client/adapters/vue/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC7E,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAG7F,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAA;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,YAAY,EACX,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,8BAA8B,EAC9B,6BAA6B,GAC7B,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC5D,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -35,13 +35,24 @@
|
|
|
35
35
|
* ```
|
|
36
36
|
*/
|
|
37
37
|
|
|
38
|
-
// Re-export from timeback/client for convenience
|
|
39
38
|
export { Activity, createClient, TimebackClient } from '@timeback/sdk/client'
|
|
40
39
|
export type { ActivityMetrics, ActivityParams, TimebackIdentity } from '@timeback/sdk/client'
|
|
41
40
|
|
|
42
41
|
// Vue-specific
|
|
43
42
|
export { TimebackProvider, useTimeback } from './provider'
|
|
44
43
|
|
|
44
|
+
// Composables
|
|
45
|
+
export { useTimebackVerification } from './composables/useTimebackVerification'
|
|
46
|
+
export { useTimebackProfile } from './composables/useTimebackProfile'
|
|
47
|
+
export type {
|
|
48
|
+
TimebackProfileState,
|
|
49
|
+
TimebackVerificationState,
|
|
50
|
+
UseTimebackProfileOptions,
|
|
51
|
+
UseTimebackProfileResult,
|
|
52
|
+
UseTimebackVerificationOptions,
|
|
53
|
+
UseTimebackVerificationResult,
|
|
54
|
+
} from './types'
|
|
55
|
+
|
|
45
56
|
// Components
|
|
46
57
|
export { default as SignInButton } from './SignInButton.vue'
|
|
47
58
|
export type { SignInButtonProps } from './SignInButton.vue'
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vue Types
|
|
3
|
+
*
|
|
4
|
+
* Types for Vue-specific composables.
|
|
5
|
+
*/
|
|
6
|
+
import type { TimebackProfile } from '../../../shared/types';
|
|
7
|
+
/**
|
|
8
|
+
* Verification state for the current user.
|
|
9
|
+
*/
|
|
10
|
+
export type TimebackVerificationState = {
|
|
11
|
+
status: 'loading';
|
|
12
|
+
} | {
|
|
13
|
+
status: 'verified';
|
|
14
|
+
timebackId: string;
|
|
15
|
+
} | {
|
|
16
|
+
status: 'unverified';
|
|
17
|
+
} | {
|
|
18
|
+
status: 'error';
|
|
19
|
+
message: string;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Profile state for the current user.
|
|
23
|
+
*/
|
|
24
|
+
export type TimebackProfileState = {
|
|
25
|
+
status: 'idle';
|
|
26
|
+
} | {
|
|
27
|
+
status: 'loading';
|
|
28
|
+
} | {
|
|
29
|
+
status: 'loaded';
|
|
30
|
+
profile: TimebackProfile;
|
|
31
|
+
} | {
|
|
32
|
+
status: 'error';
|
|
33
|
+
message: string;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Options for the useTimebackVerification composable.
|
|
37
|
+
*/
|
|
38
|
+
export interface UseTimebackVerificationOptions {
|
|
39
|
+
/**
|
|
40
|
+
* If false, the composable does nothing and stays in loading state.
|
|
41
|
+
*
|
|
42
|
+
* @default true
|
|
43
|
+
*/
|
|
44
|
+
enabled?: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Return value of the useTimebackVerification composable.
|
|
48
|
+
*/
|
|
49
|
+
export interface UseTimebackVerificationResult {
|
|
50
|
+
/** Current verification state (reactive ref) */
|
|
51
|
+
state: TimebackVerificationState;
|
|
52
|
+
/** Force a re-verification. No-op if not enabled. */
|
|
53
|
+
refresh: () => void;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Options for the useTimebackProfile composable.
|
|
57
|
+
*/
|
|
58
|
+
export interface UseTimebackProfileOptions {
|
|
59
|
+
/**
|
|
60
|
+
* If false, the composable does nothing and stays in idle state.
|
|
61
|
+
*
|
|
62
|
+
* @default true
|
|
63
|
+
*/
|
|
64
|
+
enabled?: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* If true, automatically fetch the profile once the user is verified.
|
|
67
|
+
* If false, you must call `fetchProfile()` manually.
|
|
68
|
+
*
|
|
69
|
+
* @default false
|
|
70
|
+
*/
|
|
71
|
+
auto?: boolean;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Return value of the useTimebackProfile composable.
|
|
75
|
+
*/
|
|
76
|
+
export interface UseTimebackProfileResult {
|
|
77
|
+
/** Current profile state (reactive ref) */
|
|
78
|
+
state: TimebackProfileState;
|
|
79
|
+
/** Whether the profile can be fetched (user is verified and client is ready) */
|
|
80
|
+
canFetch: boolean;
|
|
81
|
+
/** Manually trigger a profile fetch. No-op if canFetch is false. */
|
|
82
|
+
fetchProfile: () => void;
|
|
83
|
+
/** Force a re-fetch even if already loaded. No-op if canFetch is false. */
|
|
84
|
+
refresh: () => void;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/client/adapters/vue/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE5D;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAClC;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,GACxB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAEvC;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAC7B;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GAC9C;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAEvC;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC9C;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC7C,gDAAgD;IAChD,KAAK,EAAE,yBAAyB,CAAA;IAEhC,qDAAqD;IACrD,OAAO,EAAE,MAAM,IAAI,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACzC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACxC,2CAA2C;IAC3C,KAAK,EAAE,oBAAoB,CAAA;IAE3B,gFAAgF;IAChF,QAAQ,EAAE,OAAO,CAAA;IAEjB,oEAAoE;IACpE,YAAY,EAAE,MAAM,IAAI,CAAA;IAExB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,IAAI,CAAA;CACnB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vue Types
|
|
3
|
+
*
|
|
4
|
+
* Types for Vue-specific composables.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { TimebackProfile } from '../../../shared/types'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Verification state for the current user.
|
|
11
|
+
*/
|
|
12
|
+
export type TimebackVerificationState =
|
|
13
|
+
| { status: 'loading' }
|
|
14
|
+
| { status: 'verified'; timebackId: string }
|
|
15
|
+
| { status: 'unverified' }
|
|
16
|
+
| { status: 'error'; message: string }
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Profile state for the current user.
|
|
20
|
+
*/
|
|
21
|
+
export type TimebackProfileState =
|
|
22
|
+
| { status: 'idle' }
|
|
23
|
+
| { status: 'loading' }
|
|
24
|
+
| { status: 'loaded'; profile: TimebackProfile }
|
|
25
|
+
| { status: 'error'; message: string }
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Options for the useTimebackVerification composable.
|
|
29
|
+
*/
|
|
30
|
+
export interface UseTimebackVerificationOptions {
|
|
31
|
+
/**
|
|
32
|
+
* If false, the composable does nothing and stays in loading state.
|
|
33
|
+
*
|
|
34
|
+
* @default true
|
|
35
|
+
*/
|
|
36
|
+
enabled?: boolean
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Return value of the useTimebackVerification composable.
|
|
41
|
+
*/
|
|
42
|
+
export interface UseTimebackVerificationResult {
|
|
43
|
+
/** Current verification state (reactive ref) */
|
|
44
|
+
state: TimebackVerificationState
|
|
45
|
+
|
|
46
|
+
/** Force a re-verification. No-op if not enabled. */
|
|
47
|
+
refresh: () => void
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Options for the useTimebackProfile composable.
|
|
52
|
+
*/
|
|
53
|
+
export interface UseTimebackProfileOptions {
|
|
54
|
+
/**
|
|
55
|
+
* If false, the composable does nothing and stays in idle state.
|
|
56
|
+
*
|
|
57
|
+
* @default true
|
|
58
|
+
*/
|
|
59
|
+
enabled?: boolean
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* If true, automatically fetch the profile once the user is verified.
|
|
63
|
+
* If false, you must call `fetchProfile()` manually.
|
|
64
|
+
*
|
|
65
|
+
* @default false
|
|
66
|
+
*/
|
|
67
|
+
auto?: boolean
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Return value of the useTimebackProfile composable.
|
|
72
|
+
*/
|
|
73
|
+
export interface UseTimebackProfileResult {
|
|
74
|
+
/** Current profile state (reactive ref) */
|
|
75
|
+
state: TimebackProfileState
|
|
76
|
+
|
|
77
|
+
/** Whether the profile can be fetched (user is verified and client is ready) */
|
|
78
|
+
canFetch: boolean
|
|
79
|
+
|
|
80
|
+
/** Manually trigger a profile fetch. No-op if canFetch is false. */
|
|
81
|
+
fetchProfile: () => void
|
|
82
|
+
|
|
83
|
+
/** Force a re-fetch even if already loaded. No-op if canFetch is false. */
|
|
84
|
+
refresh: () => void
|
|
85
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bearer Auth Plugin
|
|
3
|
+
*
|
|
4
|
+
* Adds `Authorization: Bearer <token>` to SDK requests.
|
|
5
|
+
*/
|
|
6
|
+
import type { BearerAuthOptions, TimebackClientPlugin } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Create an auth plugin that attaches a Bearer token.
|
|
9
|
+
*
|
|
10
|
+
* This intentionally throws when no token is available so we never "silently"
|
|
11
|
+
* send an unauthenticated request that then 401s (terrible DX in dev + prod).
|
|
12
|
+
*
|
|
13
|
+
* @param options - The options for the bearer auth plugin.
|
|
14
|
+
* @returns The bearer auth plugin.
|
|
15
|
+
*/
|
|
16
|
+
export declare function bearer(options: BearerAuthOptions): TimebackClientPlugin;
|
|
17
|
+
//# sourceMappingURL=bearer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bearer.d.ts","sourceRoot":"","sources":["../../../src/client/auth/bearer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAiB,MAAM,SAAS,CAAA;AAErF;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,oBAAoB,CAuBvE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/auth/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client Auth Types
|
|
3
|
+
*
|
|
4
|
+
* Small, framework-agnostic extension point for customizing how the SDK makes HTTP requests.
|
|
5
|
+
*/
|
|
6
|
+
export type TimebackFetch = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
|
|
7
|
+
/**
|
|
8
|
+
* Auth plugin that can wrap the SDK's fetch implementation.
|
|
9
|
+
*
|
|
10
|
+
* Example use cases:
|
|
11
|
+
* - Add `Authorization: Bearer <token>` for resource-server architectures (Auth0 SPA + FastAPI)
|
|
12
|
+
* - Add custom headers (e.g. trace IDs) to all SDK requests
|
|
13
|
+
*/
|
|
14
|
+
export interface TimebackClientPlugin {
|
|
15
|
+
/**
|
|
16
|
+
* Wrap a fetch implementation and return a new one.
|
|
17
|
+
*/
|
|
18
|
+
wrapFetch(fetch: TimebackFetch): TimebackFetch;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Options for Bearer auth plugin.
|
|
22
|
+
*/
|
|
23
|
+
export interface BearerAuthOptions {
|
|
24
|
+
/**
|
|
25
|
+
* Return the current access token (e.g. Auth0 getAccessTokenSilently()).
|
|
26
|
+
*
|
|
27
|
+
* Return undefined if the user is not authenticated yet.
|
|
28
|
+
*/
|
|
29
|
+
getToken: () => Promise<string | undefined> | string | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Header name to set. Defaults to `Authorization`.
|
|
32
|
+
*/
|
|
33
|
+
headerName?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Optional prefix. Defaults to `Bearer `.
|
|
36
|
+
*/
|
|
37
|
+
prefix?: string;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE/F;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACpC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,CAAA;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC;;;;OAIG;IACH,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAAA;IAEhE;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CACf"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -5,5 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export { createClient } from './timeback-client';
|
|
7
7
|
export { TimebackClient } from './timeback-client.class';
|
|
8
|
+
export { bearer } from './auth';
|
|
9
|
+
export type { BearerAuthOptions, TimebackClientPlugin, TimebackFetch } from './auth';
|
|
8
10
|
export { Activity } from './lib/activity';
|
|
9
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAGxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAGxD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAGpF,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Client-side activity tracking logic.
|
|
5
5
|
*/
|
|
6
|
-
import type {
|
|
6
|
+
import type { ActivityEndData, ActivityEndPayload, ActivityParams } from '../../../shared/types';
|
|
7
7
|
/**
|
|
8
8
|
* Activity tracker that tracks time spent on an activity.
|
|
9
9
|
*
|
|
@@ -51,10 +51,10 @@ export declare class Activity {
|
|
|
51
51
|
* Useful for "preview" flows in examples where you want to inspect the payload
|
|
52
52
|
* that would be POSTed to the server without calling `end()`.
|
|
53
53
|
*
|
|
54
|
-
* @param data - Activity completion data (metrics + optional
|
|
54
|
+
* @param data - Activity completion data (metrics + optional time override)
|
|
55
55
|
* @returns Activity end payload
|
|
56
56
|
*/
|
|
57
|
-
_buildPayload(data:
|
|
57
|
+
_buildPayload(data: ActivityEndData): ActivityEndPayload;
|
|
58
58
|
/**
|
|
59
59
|
* Pause the activity timer.
|
|
60
60
|
*/
|
|
@@ -66,8 +66,8 @@ export declare class Activity {
|
|
|
66
66
|
/**
|
|
67
67
|
* End the activity and send to server.
|
|
68
68
|
*
|
|
69
|
-
* @param data - Activity completion data (metrics + optional
|
|
69
|
+
* @param data - Activity completion data (metrics + optional time override)
|
|
70
70
|
*/
|
|
71
|
-
end(data:
|
|
71
|
+
end(data: ActivityEndData): Promise<void>;
|
|
72
72
|
}
|
|
73
73
|
//# sourceMappingURL=activity.class.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.class.d.ts","sourceRoot":"","sources":["../../../../src/client/lib/activity/activity.class.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"activity.class.d.ts","sourceRoot":"","sources":["../../../../src/client/lib/activity/activity.class.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEhG;;;;;GAKG;AACH,qBAAa,QAAQ;IAgBnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAhB9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;IACjC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,MAAM,CAAQ;IAEtB;;;;;;;OAOG;IACH,YACkB,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,EAG7E;IAED;;;;OAIG;IACH,IAAI,SAAS,IAAI,IAAI,CAEpB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;;OAIG;IACH,IAAI,SAAS,IAAI,MAAM,CAatB;IAED;;;;;;;;OAQG;IACH,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,kBAAkB,CAiDvD;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CAIZ;IAED;;OAEG;IACH,MAAM,IAAI,IAAI,CAKb;IAED;;;;OAIG;IACG,GAAG,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAa9C;CACD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch Utilities
|
|
3
|
+
*
|
|
4
|
+
* Helpers for selecting a safe fetch implementation across runtimes.
|
|
5
|
+
*/
|
|
6
|
+
import type { TimebackFetch } from '../auth/types';
|
|
7
|
+
/**
|
|
8
|
+
* Get a safe default fetch implementation.
|
|
9
|
+
*
|
|
10
|
+
* Some runtimes (notably Safari/WebKit) can throw "Illegal invocation" if the
|
|
11
|
+
* global `fetch` is called unbound (e.g. stored in a variable then invoked).
|
|
12
|
+
*
|
|
13
|
+
* This function returns a wrapper that always calls `fetch` via property access
|
|
14
|
+
* on `globalThis`, preserving the correct receiver.
|
|
15
|
+
*
|
|
16
|
+
* @returns The default fetch implementation.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getDefaultFetch(): TimebackFetch | undefined;
|
|
19
|
+
//# sourceMappingURL=fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/client/lib/fetch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAElD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,aAAa,GAAG,SAAS,CAQ3D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared User Cache
|
|
3
|
+
*
|
|
4
|
+
* Internal module for in-flight deduplication and short-lived caching of
|
|
5
|
+
* verify and profile requests. Used by Solid, Svelte, and Vue adapters.
|
|
6
|
+
*/
|
|
7
|
+
import type { TimebackProfile, TimebackVerifyResult } from '../../shared/types';
|
|
8
|
+
import type { TimebackClient } from '../timeback-client.class';
|
|
9
|
+
/**
|
|
10
|
+
* Verify the current user with in-flight dedupe and short-lived caching.
|
|
11
|
+
*
|
|
12
|
+
* @param timeback - Timeback client instance
|
|
13
|
+
* @param force - If true, bypass cache and in-flight reuse
|
|
14
|
+
* @returns Verify result
|
|
15
|
+
*/
|
|
16
|
+
export declare function verifyOnce(timeback: TimebackClient, force: boolean): Promise<TimebackVerifyResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Get cached verification result if fresh.
|
|
19
|
+
*
|
|
20
|
+
* @param timeback - Timeback client instance
|
|
21
|
+
* @returns Cached result or undefined
|
|
22
|
+
*/
|
|
23
|
+
export declare function getVerifyCache(timeback: TimebackClient): TimebackVerifyResult | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Fetch the profile with in-flight dedupe and short-lived caching.
|
|
26
|
+
*
|
|
27
|
+
* @param timeback - Timeback client instance
|
|
28
|
+
* @param force - If true, bypass cache and in-flight reuse
|
|
29
|
+
* @returns The user's Timeback profile
|
|
30
|
+
*/
|
|
31
|
+
export declare function fetchProfileOnce(timeback: TimebackClient, force: boolean): Promise<TimebackProfile>;
|
|
32
|
+
/**
|
|
33
|
+
* Get cached profile result if fresh.
|
|
34
|
+
*
|
|
35
|
+
* @param timeback - Timeback client instance
|
|
36
|
+
* @returns Cached profile or undefined
|
|
37
|
+
*/
|
|
38
|
+
export declare function getProfileCache(timeback: TimebackClient): TimebackProfile | undefined;
|
|
39
|
+
//# sourceMappingURL=user-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-cache.d.ts","sourceRoot":"","sources":["../../../src/client/lib/user-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAkC9D;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC/B,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,OAAO,GACZ,OAAO,CAAC,oBAAoB,CAAC,CAyC/B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,oBAAoB,GAAG,SAAS,CAGzF;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACrC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,OAAO,GACZ,OAAO,CAAC,eAAe,CAAC,CAwC1B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,eAAe,GAAG,SAAS,CAGrF"}
|