foundation-sdk 0.1.0 → 0.1.1
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 +152 -5
- package/dist/client.d.ts +4 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/index.d.ts +3 -202
- package/dist/index.d.ts.map +1 -0
- package/dist/types.d.ts +208 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/vue.cjs +89 -0
- package/dist/vue.cjs.map +1 -0
- package/dist/vue.d.ts +33 -0
- package/dist/vue.d.ts.map +1 -0
- package/dist/vue.js +89 -0
- package/dist/vue.js.map +1 -0
- package/package.json +21 -2
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# foundation-
|
|
1
|
+
# foundation-sdk
|
|
2
2
|
|
|
3
3
|
SDK for building applications that embed within the Foundation container.
|
|
4
4
|
|
|
@@ -7,13 +7,21 @@ SDK for building applications that embed within the Foundation container.
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npm install foundation-
|
|
10
|
+
npm install foundation-sdk
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Vue is an optional peer dependency - only required if using the `/vue` entry point:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install foundation-sdk vue
|
|
11
17
|
```
|
|
12
18
|
|
|
13
19
|
## Quick Start
|
|
14
20
|
|
|
21
|
+
### Vanilla TypeScript/JavaScript
|
|
22
|
+
|
|
15
23
|
```typescript
|
|
16
|
-
import { createFoundationClient } from 'foundation-
|
|
24
|
+
import { createFoundationClient } from 'foundation-sdk'
|
|
17
25
|
|
|
18
26
|
const sdk = createFoundationClient()
|
|
19
27
|
|
|
@@ -30,6 +38,26 @@ const { items } = await sdk.db.list('projects', { limit: 10 })
|
|
|
30
38
|
await sdk.ui.toast('Hello from embedded app!', 'success')
|
|
31
39
|
```
|
|
32
40
|
|
|
41
|
+
### Vue 3
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
import { useFoundation } from 'foundation-sdk/vue'
|
|
45
|
+
|
|
46
|
+
// In your component setup
|
|
47
|
+
const { isReady, user, isDark, db, ui } = useFoundation()
|
|
48
|
+
|
|
49
|
+
// Reactive state is automatically updated
|
|
50
|
+
watch(isReady, (ready) => {
|
|
51
|
+
if (ready) {
|
|
52
|
+
console.log('SDK ready, user:', user.value)
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
// Use services directly
|
|
57
|
+
const { items } = await db.list('projects', { limit: 10 })
|
|
58
|
+
await ui.toast('Hello!', 'success')
|
|
59
|
+
```
|
|
60
|
+
|
|
33
61
|
## API Reference
|
|
34
62
|
|
|
35
63
|
### Initialization
|
|
@@ -48,6 +76,19 @@ if (sdk.isReady) {
|
|
|
48
76
|
|
|
49
77
|
// Wait for ready
|
|
50
78
|
await sdk.ready
|
|
79
|
+
|
|
80
|
+
// Access available entity definitions
|
|
81
|
+
console.log(sdk.entities) // EntityDefinition[]
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
#### `resetFoundationClient(): void`
|
|
85
|
+
|
|
86
|
+
Resets the singleton instance. Useful for testing or re-initialization.
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
import { resetFoundationClient } from 'foundation-sdk'
|
|
90
|
+
|
|
91
|
+
resetFoundationClient()
|
|
51
92
|
```
|
|
52
93
|
|
|
53
94
|
---
|
|
@@ -224,6 +265,8 @@ const unsubscribe = sdk.router.onChange((route) => {
|
|
|
224
265
|
interface ThemeService {
|
|
225
266
|
readonly isDark: boolean
|
|
226
267
|
readonly mode: 'light' | 'dark' | 'system'
|
|
268
|
+
setTheme(mode: 'light' | 'dark' | 'system'): Promise<void>
|
|
269
|
+
toggle(): Promise<void>
|
|
227
270
|
onChange(callback: (theme: Theme) => void): () => void
|
|
228
271
|
}
|
|
229
272
|
```
|
|
@@ -236,6 +279,13 @@ if (sdk.theme.isDark) {
|
|
|
236
279
|
// Apply dark styles
|
|
237
280
|
}
|
|
238
281
|
|
|
282
|
+
// Set specific theme mode
|
|
283
|
+
await sdk.theme.setTheme('dark')
|
|
284
|
+
await sdk.theme.setTheme('system')
|
|
285
|
+
|
|
286
|
+
// Toggle between light/dark
|
|
287
|
+
await sdk.theme.toggle()
|
|
288
|
+
|
|
239
289
|
// Subscribe to theme changes
|
|
240
290
|
const unsubscribe = sdk.theme.onChange((theme) => {
|
|
241
291
|
document.body.classList.toggle('dark', theme.isDark)
|
|
@@ -387,6 +437,96 @@ const unsubscribe = sdk.onEntityChange((event) => {
|
|
|
387
437
|
|
|
388
438
|
---
|
|
389
439
|
|
|
440
|
+
## Vue Integration
|
|
441
|
+
|
|
442
|
+
The SDK provides a Vue 3 composable for reactive state management:
|
|
443
|
+
|
|
444
|
+
```typescript
|
|
445
|
+
import { useFoundation } from 'foundation-sdk/vue'
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### `useFoundation()`
|
|
449
|
+
|
|
450
|
+
Returns reactive state and direct service access:
|
|
451
|
+
|
|
452
|
+
```typescript
|
|
453
|
+
interface UseFoundationReturn {
|
|
454
|
+
// Reactive state (readonly refs)
|
|
455
|
+
isReady: Ref<boolean>
|
|
456
|
+
user: ShallowRef<User | null>
|
|
457
|
+
isDark: Ref<boolean>
|
|
458
|
+
themeMode: Ref<'light' | 'dark' | 'system'>
|
|
459
|
+
routerPath: Ref<string>
|
|
460
|
+
routerQuery: ShallowRef<Record<string, string>>
|
|
461
|
+
routerHash: Ref<string>
|
|
462
|
+
entities: ShallowRef<EntityDefinition[]>
|
|
463
|
+
|
|
464
|
+
// Computed helpers
|
|
465
|
+
isAuthenticated: boolean
|
|
466
|
+
currentUser: User | null
|
|
467
|
+
|
|
468
|
+
// Direct service access
|
|
469
|
+
client: FoundationClient
|
|
470
|
+
auth: AuthService
|
|
471
|
+
ui: UIService
|
|
472
|
+
db: DbService
|
|
473
|
+
router: RouterService
|
|
474
|
+
config: ConfigService
|
|
475
|
+
files: FilesService
|
|
476
|
+
storage: StorageService
|
|
477
|
+
log: LogService
|
|
478
|
+
theme: ThemeService
|
|
479
|
+
|
|
480
|
+
// Theme control shortcuts
|
|
481
|
+
setTheme(mode: 'light' | 'dark' | 'system'): Promise<void>
|
|
482
|
+
toggleTheme(): Promise<void>
|
|
483
|
+
|
|
484
|
+
// Entity change subscription
|
|
485
|
+
onEntityChange(callback: (event: EntityChangeEvent) => void): () => void
|
|
486
|
+
}
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
**Example:**
|
|
490
|
+
|
|
491
|
+
```vue
|
|
492
|
+
<script setup lang="ts">
|
|
493
|
+
import { useFoundation } from 'foundation-sdk/vue'
|
|
494
|
+
import { watch } from 'vue'
|
|
495
|
+
|
|
496
|
+
const { isReady, user, isDark, db, ui, toggleTheme } = useFoundation()
|
|
497
|
+
|
|
498
|
+
// Reactive state updates automatically
|
|
499
|
+
watch(user, (newUser) => {
|
|
500
|
+
console.log('User changed:', newUser?.email)
|
|
501
|
+
})
|
|
502
|
+
|
|
503
|
+
// Theme reactivity
|
|
504
|
+
watch(isDark, (dark) => {
|
|
505
|
+
document.body.classList.toggle('dark-mode', dark)
|
|
506
|
+
})
|
|
507
|
+
|
|
508
|
+
async function loadProjects() {
|
|
509
|
+
const { items } = await db.list('projects', { limit: 10 })
|
|
510
|
+
return items
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
async function handleClick() {
|
|
514
|
+
await toggleTheme()
|
|
515
|
+
await ui.toast('Theme toggled!', 'success')
|
|
516
|
+
}
|
|
517
|
+
</script>
|
|
518
|
+
|
|
519
|
+
<template>
|
|
520
|
+
<div v-if="isReady">
|
|
521
|
+
<p>Welcome, {{ user?.name }}</p>
|
|
522
|
+
<button @click="handleClick">Toggle Theme</button>
|
|
523
|
+
</div>
|
|
524
|
+
<div v-else>Loading...</div>
|
|
525
|
+
</template>
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
---
|
|
529
|
+
|
|
390
530
|
## TypeScript
|
|
391
531
|
|
|
392
532
|
Full TypeScript support with exported types:
|
|
@@ -397,12 +537,19 @@ import type {
|
|
|
397
537
|
User,
|
|
398
538
|
Theme,
|
|
399
539
|
RouterState,
|
|
540
|
+
EntityDefinition,
|
|
400
541
|
EntityChangeEvent,
|
|
401
542
|
AuthService,
|
|
543
|
+
ThemeService,
|
|
544
|
+
RouterService,
|
|
402
545
|
DbService,
|
|
403
546
|
UIService,
|
|
404
|
-
|
|
405
|
-
|
|
547
|
+
StorageService,
|
|
548
|
+
FilesService,
|
|
549
|
+
FileMetadata,
|
|
550
|
+
LogService,
|
|
551
|
+
ConfigService
|
|
552
|
+
} from 'foundation-sdk'
|
|
406
553
|
```
|
|
407
554
|
|
|
408
555
|
---
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAiBjB,MAAM,SAAS,CAAA;AAIhB,wBAAgB,sBAAsB,IAAI,gBAAgB,CA4OzD;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,202 +1,3 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
getToken(): Promise<string>;
|
|
5
|
-
login(): Promise<void>;
|
|
6
|
-
logout(): Promise<void>;
|
|
7
|
-
onChange(callback: (user: User | null) => void): () => void;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export declare interface ConfigService {
|
|
11
|
-
readonly features: Record<string, unknown>;
|
|
12
|
-
readonly app: {
|
|
13
|
-
id?: string;
|
|
14
|
-
name?: string;
|
|
15
|
-
environment?: string;
|
|
16
|
-
};
|
|
17
|
-
get(key: string): Promise<unknown>;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export declare function createFoundationClient(): FoundationClient;
|
|
21
|
-
|
|
22
|
-
export declare interface DbService {
|
|
23
|
-
list<T = unknown>(entity: string, options?: {
|
|
24
|
-
filters?: Record<string, unknown>;
|
|
25
|
-
limit?: number;
|
|
26
|
-
cursor?: string;
|
|
27
|
-
orderBy?: string;
|
|
28
|
-
orderDir?: 'asc' | 'desc';
|
|
29
|
-
}): Promise<{
|
|
30
|
-
items: T[];
|
|
31
|
-
nextCursor?: string;
|
|
32
|
-
}>;
|
|
33
|
-
get<T = unknown>(entity: string, id: string): Promise<T>;
|
|
34
|
-
create<T = unknown>(entity: string, data: Partial<T>): Promise<T>;
|
|
35
|
-
update<T = unknown>(entity: string, id: string, updates: Partial<T>): Promise<T>;
|
|
36
|
-
delete(entity: string, id: string): Promise<void>;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export declare interface EntityChangeEvent {
|
|
40
|
-
changeType: string;
|
|
41
|
-
entityId?: string;
|
|
42
|
-
id?: string;
|
|
43
|
-
namespace?: string;
|
|
44
|
-
timestamp?: number;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export declare interface EntityDefinition {
|
|
48
|
-
name: string;
|
|
49
|
-
schema?: Record<string, unknown>;
|
|
50
|
-
methods?: string[];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export declare interface FileMetadata {
|
|
54
|
-
id: string;
|
|
55
|
-
name: string;
|
|
56
|
-
type: string;
|
|
57
|
-
size: number;
|
|
58
|
-
url: string;
|
|
59
|
-
folder?: string;
|
|
60
|
-
metadata?: Record<string, unknown>;
|
|
61
|
-
createdAt: string;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export declare interface FilesService {
|
|
65
|
-
initiate(options: {
|
|
66
|
-
name: string;
|
|
67
|
-
contentType: string;
|
|
68
|
-
contentLength: number;
|
|
69
|
-
metadata?: Record<string, unknown>;
|
|
70
|
-
}): Promise<{
|
|
71
|
-
id: string;
|
|
72
|
-
name: string;
|
|
73
|
-
signedUrl: string;
|
|
74
|
-
signedData: Record<string, string>;
|
|
75
|
-
}>;
|
|
76
|
-
get(fileId: string): Promise<FileMetadata>;
|
|
77
|
-
delete(fileId: string): Promise<void>;
|
|
78
|
-
list(options?: {
|
|
79
|
-
limit?: number;
|
|
80
|
-
cursor?: string;
|
|
81
|
-
}): Promise<{
|
|
82
|
-
items: FileMetadata[];
|
|
83
|
-
nextCursor?: string;
|
|
84
|
-
}>;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export declare interface FoundationClient {
|
|
88
|
-
readonly ready: Promise<void>;
|
|
89
|
-
readonly isReady: boolean;
|
|
90
|
-
auth: AuthService;
|
|
91
|
-
theme: ThemeService;
|
|
92
|
-
router: RouterService;
|
|
93
|
-
db: DbService;
|
|
94
|
-
ui: UIService;
|
|
95
|
-
storage: StorageService;
|
|
96
|
-
files: FilesService;
|
|
97
|
-
log: LogService;
|
|
98
|
-
config: ConfigService;
|
|
99
|
-
onEntityChange(callback: (event: EntityChangeEvent) => void): () => void;
|
|
100
|
-
readonly entities: EntityDefinition[];
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export declare interface LogService {
|
|
104
|
-
info(message: string, data?: Record<string, unknown>): void;
|
|
105
|
-
warn(message: string, data?: Record<string, unknown>): void;
|
|
106
|
-
error(message: string, data?: Record<string, unknown>): void;
|
|
107
|
-
event(name: string, properties?: Record<string, unknown>): void;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export declare function resetFoundationClient(): void;
|
|
111
|
-
|
|
112
|
-
export declare interface RouterService {
|
|
113
|
-
readonly path: string;
|
|
114
|
-
readonly query: Record<string, string>;
|
|
115
|
-
readonly hash: string;
|
|
116
|
-
push(path: string, options?: {
|
|
117
|
-
query?: Record<string, string>;
|
|
118
|
-
hash?: string;
|
|
119
|
-
}): Promise<void>;
|
|
120
|
-
replace(path: string, options?: {
|
|
121
|
-
query?: Record<string, string>;
|
|
122
|
-
hash?: string;
|
|
123
|
-
}): Promise<void>;
|
|
124
|
-
setQuery(params: Record<string, string>, options?: {
|
|
125
|
-
replace?: boolean;
|
|
126
|
-
}): Promise<void>;
|
|
127
|
-
onChange(callback: (route: RouterState) => void): () => void;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export declare interface RouterState {
|
|
131
|
-
path: string;
|
|
132
|
-
query: Record<string, string>;
|
|
133
|
-
hash: string;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export declare interface StorageService {
|
|
137
|
-
upload(options: {
|
|
138
|
-
name: string;
|
|
139
|
-
type: string;
|
|
140
|
-
size: number;
|
|
141
|
-
data: string;
|
|
142
|
-
folder?: string;
|
|
143
|
-
metadata?: Record<string, unknown>;
|
|
144
|
-
}): Promise<{
|
|
145
|
-
id: string;
|
|
146
|
-
url: string;
|
|
147
|
-
name: string;
|
|
148
|
-
}>;
|
|
149
|
-
get(fileId: string): Promise<FileMetadata>;
|
|
150
|
-
delete(fileId: string): Promise<void>;
|
|
151
|
-
list(options?: {
|
|
152
|
-
folder?: string;
|
|
153
|
-
limit?: number;
|
|
154
|
-
cursor?: string;
|
|
155
|
-
}): Promise<{
|
|
156
|
-
items: FileMetadata[];
|
|
157
|
-
nextCursor?: string;
|
|
158
|
-
}>;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
export declare interface Theme {
|
|
162
|
-
isDark: boolean;
|
|
163
|
-
mode: 'light' | 'dark' | 'system';
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
export declare interface ThemeService {
|
|
167
|
-
readonly isDark: boolean;
|
|
168
|
-
readonly mode: 'light' | 'dark' | 'system';
|
|
169
|
-
setTheme(mode: 'light' | 'dark' | 'system'): Promise<void>;
|
|
170
|
-
toggle(): Promise<void>;
|
|
171
|
-
onChange(callback: (theme: Theme) => void): () => void;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
export declare interface UIService {
|
|
175
|
-
toast(message: string, type?: 'success' | 'error' | 'warn' | 'info'): Promise<void>;
|
|
176
|
-
confirm(message: string): Promise<{
|
|
177
|
-
confirmed: boolean;
|
|
178
|
-
}>;
|
|
179
|
-
loading: {
|
|
180
|
-
show(message?: string): Promise<void>;
|
|
181
|
-
hide(): Promise<void>;
|
|
182
|
-
};
|
|
183
|
-
banner: {
|
|
184
|
-
show(message: string, options?: {
|
|
185
|
-
type?: 'info' | 'warning' | 'error' | 'success';
|
|
186
|
-
dismissible?: boolean;
|
|
187
|
-
}): Promise<{
|
|
188
|
-
bannerId: string;
|
|
189
|
-
}>;
|
|
190
|
-
hide(bannerId: string): Promise<void>;
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
export declare interface User {
|
|
195
|
-
id: string;
|
|
196
|
-
email: string;
|
|
197
|
-
name?: string;
|
|
198
|
-
picture?: string;
|
|
199
|
-
[key: string]: unknown;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
export { }
|
|
1
|
+
export { createFoundationClient, resetFoundationClient } from './client';
|
|
2
|
+
export type { FoundationClient, User, Theme, RouterState, EntityDefinition, EntityChangeEvent, AuthService, ThemeService, RouterService, DbService, UIService, StorageService, FilesService, FileMetadata, LogService, ConfigService } from './types';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAExE,YAAY,EACV,gBAAgB,EAChB,IAAI,EACJ,KAAK,EACL,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,SAAS,EACT,SAAS,EACT,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,aAAa,EACd,MAAM,SAAS,CAAA"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
export interface User {
|
|
2
|
+
id: string;
|
|
3
|
+
email: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
picture?: string;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}
|
|
8
|
+
export interface Theme {
|
|
9
|
+
isDark: boolean;
|
|
10
|
+
mode: 'light' | 'dark' | 'system';
|
|
11
|
+
}
|
|
12
|
+
export interface RouterState {
|
|
13
|
+
path: string;
|
|
14
|
+
query: Record<string, string>;
|
|
15
|
+
hash: string;
|
|
16
|
+
}
|
|
17
|
+
export interface EntityDefinition {
|
|
18
|
+
name: string;
|
|
19
|
+
schema?: Record<string, unknown>;
|
|
20
|
+
methods?: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface AuthService {
|
|
23
|
+
readonly user: User | null;
|
|
24
|
+
readonly isAuthenticated: boolean;
|
|
25
|
+
getToken(): Promise<string>;
|
|
26
|
+
login(): Promise<void>;
|
|
27
|
+
logout(): Promise<void>;
|
|
28
|
+
onChange(callback: (user: User | null) => void): () => void;
|
|
29
|
+
}
|
|
30
|
+
export interface ThemeService {
|
|
31
|
+
readonly isDark: boolean;
|
|
32
|
+
readonly mode: 'light' | 'dark' | 'system';
|
|
33
|
+
setTheme(mode: 'light' | 'dark' | 'system'): Promise<void>;
|
|
34
|
+
toggle(): Promise<void>;
|
|
35
|
+
onChange(callback: (theme: Theme) => void): () => void;
|
|
36
|
+
}
|
|
37
|
+
export interface RouterService {
|
|
38
|
+
readonly path: string;
|
|
39
|
+
readonly query: Record<string, string>;
|
|
40
|
+
readonly hash: string;
|
|
41
|
+
push(path: string, options?: {
|
|
42
|
+
query?: Record<string, string>;
|
|
43
|
+
hash?: string;
|
|
44
|
+
}): Promise<void>;
|
|
45
|
+
replace(path: string, options?: {
|
|
46
|
+
query?: Record<string, string>;
|
|
47
|
+
hash?: string;
|
|
48
|
+
}): Promise<void>;
|
|
49
|
+
setQuery(params: Record<string, string>, options?: {
|
|
50
|
+
replace?: boolean;
|
|
51
|
+
}): Promise<void>;
|
|
52
|
+
onChange(callback: (route: RouterState) => void): () => void;
|
|
53
|
+
}
|
|
54
|
+
export interface DbService {
|
|
55
|
+
list<T = unknown>(entity: string, options?: {
|
|
56
|
+
filters?: Record<string, unknown>;
|
|
57
|
+
limit?: number;
|
|
58
|
+
cursor?: string;
|
|
59
|
+
orderBy?: string;
|
|
60
|
+
orderDir?: 'asc' | 'desc';
|
|
61
|
+
}): Promise<{
|
|
62
|
+
items: T[];
|
|
63
|
+
nextCursor?: string;
|
|
64
|
+
}>;
|
|
65
|
+
get<T = unknown>(entity: string, id: string): Promise<T>;
|
|
66
|
+
create<T = unknown>(entity: string, data: Partial<T>): Promise<T>;
|
|
67
|
+
update<T = unknown>(entity: string, id: string, updates: Partial<T>): Promise<T>;
|
|
68
|
+
delete(entity: string, id: string): Promise<void>;
|
|
69
|
+
}
|
|
70
|
+
export interface UIService {
|
|
71
|
+
toast(message: string, type?: 'success' | 'error' | 'warn' | 'info'): Promise<void>;
|
|
72
|
+
confirm(message: string): Promise<{
|
|
73
|
+
confirmed: boolean;
|
|
74
|
+
}>;
|
|
75
|
+
loading: {
|
|
76
|
+
show(message?: string): Promise<void>;
|
|
77
|
+
hide(): Promise<void>;
|
|
78
|
+
};
|
|
79
|
+
banner: {
|
|
80
|
+
show(message: string, options?: {
|
|
81
|
+
type?: 'info' | 'warning' | 'error' | 'success';
|
|
82
|
+
dismissible?: boolean;
|
|
83
|
+
}): Promise<{
|
|
84
|
+
bannerId: string;
|
|
85
|
+
}>;
|
|
86
|
+
hide(bannerId: string): Promise<void>;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export interface StorageService {
|
|
90
|
+
upload(options: {
|
|
91
|
+
name: string;
|
|
92
|
+
type: string;
|
|
93
|
+
size: number;
|
|
94
|
+
data: string;
|
|
95
|
+
folder?: string;
|
|
96
|
+
metadata?: Record<string, unknown>;
|
|
97
|
+
}): Promise<{
|
|
98
|
+
id: string;
|
|
99
|
+
url: string;
|
|
100
|
+
name: string;
|
|
101
|
+
}>;
|
|
102
|
+
get(fileId: string): Promise<FileMetadata>;
|
|
103
|
+
delete(fileId: string): Promise<void>;
|
|
104
|
+
list(options?: {
|
|
105
|
+
folder?: string;
|
|
106
|
+
limit?: number;
|
|
107
|
+
cursor?: string;
|
|
108
|
+
}): Promise<{
|
|
109
|
+
items: FileMetadata[];
|
|
110
|
+
nextCursor?: string;
|
|
111
|
+
}>;
|
|
112
|
+
}
|
|
113
|
+
export interface FilesService {
|
|
114
|
+
initiate(options: {
|
|
115
|
+
name: string;
|
|
116
|
+
contentType: string;
|
|
117
|
+
contentLength: number;
|
|
118
|
+
metadata?: Record<string, unknown>;
|
|
119
|
+
}): Promise<{
|
|
120
|
+
id: string;
|
|
121
|
+
name: string;
|
|
122
|
+
signedUrl: string;
|
|
123
|
+
signedData: Record<string, string>;
|
|
124
|
+
}>;
|
|
125
|
+
get(fileId: string): Promise<FileMetadata>;
|
|
126
|
+
delete(fileId: string): Promise<void>;
|
|
127
|
+
list(options?: {
|
|
128
|
+
limit?: number;
|
|
129
|
+
cursor?: string;
|
|
130
|
+
}): Promise<{
|
|
131
|
+
items: FileMetadata[];
|
|
132
|
+
nextCursor?: string;
|
|
133
|
+
}>;
|
|
134
|
+
}
|
|
135
|
+
export interface FileMetadata {
|
|
136
|
+
id: string;
|
|
137
|
+
name: string;
|
|
138
|
+
type: string;
|
|
139
|
+
size: number;
|
|
140
|
+
url: string;
|
|
141
|
+
folder?: string;
|
|
142
|
+
metadata?: Record<string, unknown>;
|
|
143
|
+
createdAt: string;
|
|
144
|
+
}
|
|
145
|
+
export interface LogService {
|
|
146
|
+
info(message: string, data?: Record<string, unknown>): void;
|
|
147
|
+
warn(message: string, data?: Record<string, unknown>): void;
|
|
148
|
+
error(message: string, data?: Record<string, unknown>): void;
|
|
149
|
+
event(name: string, properties?: Record<string, unknown>): void;
|
|
150
|
+
}
|
|
151
|
+
export interface ConfigService {
|
|
152
|
+
readonly features: Record<string, unknown>;
|
|
153
|
+
readonly app: {
|
|
154
|
+
id?: string;
|
|
155
|
+
name?: string;
|
|
156
|
+
environment?: string;
|
|
157
|
+
};
|
|
158
|
+
get(key: string): Promise<unknown>;
|
|
159
|
+
}
|
|
160
|
+
export interface EntityChangeEvent {
|
|
161
|
+
changeType: string;
|
|
162
|
+
entityId?: string;
|
|
163
|
+
id?: string;
|
|
164
|
+
namespace?: string;
|
|
165
|
+
timestamp?: number;
|
|
166
|
+
}
|
|
167
|
+
export interface FoundationClient {
|
|
168
|
+
readonly ready: Promise<void>;
|
|
169
|
+
readonly isReady: boolean;
|
|
170
|
+
auth: AuthService;
|
|
171
|
+
theme: ThemeService;
|
|
172
|
+
router: RouterService;
|
|
173
|
+
db: DbService;
|
|
174
|
+
ui: UIService;
|
|
175
|
+
storage: StorageService;
|
|
176
|
+
files: FilesService;
|
|
177
|
+
log: LogService;
|
|
178
|
+
config: ConfigService;
|
|
179
|
+
onEntityChange(callback: (event: EntityChangeEvent) => void): () => void;
|
|
180
|
+
readonly entities: EntityDefinition[];
|
|
181
|
+
}
|
|
182
|
+
export interface SDKReadyPayload {
|
|
183
|
+
user?: User | null;
|
|
184
|
+
config?: {
|
|
185
|
+
features?: Record<string, unknown>;
|
|
186
|
+
app?: {
|
|
187
|
+
id?: string;
|
|
188
|
+
name?: string;
|
|
189
|
+
environment?: string;
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
theme?: Theme;
|
|
193
|
+
router?: RouterState;
|
|
194
|
+
entities?: EntityDefinition[];
|
|
195
|
+
}
|
|
196
|
+
export interface SDKMessage {
|
|
197
|
+
id: number;
|
|
198
|
+
namespace: string;
|
|
199
|
+
type: string;
|
|
200
|
+
data: Record<string, unknown>;
|
|
201
|
+
}
|
|
202
|
+
export interface SDKResponse {
|
|
203
|
+
id: number;
|
|
204
|
+
success: boolean;
|
|
205
|
+
data?: unknown;
|
|
206
|
+
error?: string;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/vue.cjs
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const vue = require("vue");
|
|
4
|
+
const index = require("./index.cjs");
|
|
5
|
+
let client = null;
|
|
6
|
+
let isReady = null;
|
|
7
|
+
let user = null;
|
|
8
|
+
let isDark = null;
|
|
9
|
+
let themeMode = null;
|
|
10
|
+
let routerPath = null;
|
|
11
|
+
let routerQuery = null;
|
|
12
|
+
let routerHash = null;
|
|
13
|
+
let entities = null;
|
|
14
|
+
let initialized = false;
|
|
15
|
+
function initializeState() {
|
|
16
|
+
if (initialized) return;
|
|
17
|
+
client = index.createFoundationClient();
|
|
18
|
+
isReady = vue.ref(false);
|
|
19
|
+
user = vue.shallowRef(null);
|
|
20
|
+
isDark = vue.ref(false);
|
|
21
|
+
themeMode = vue.ref("system");
|
|
22
|
+
routerPath = vue.ref("/");
|
|
23
|
+
routerQuery = vue.shallowRef({});
|
|
24
|
+
routerHash = vue.ref("");
|
|
25
|
+
entities = vue.shallowRef([]);
|
|
26
|
+
client.ready.then(() => {
|
|
27
|
+
isReady.value = true;
|
|
28
|
+
user.value = client.auth.user;
|
|
29
|
+
isDark.value = client.theme.isDark;
|
|
30
|
+
themeMode.value = client.theme.mode;
|
|
31
|
+
routerPath.value = client.router.path;
|
|
32
|
+
routerQuery.value = client.router.query;
|
|
33
|
+
routerHash.value = client.router.hash;
|
|
34
|
+
entities.value = client.entities;
|
|
35
|
+
});
|
|
36
|
+
client.auth.onChange((newUser) => {
|
|
37
|
+
user.value = newUser;
|
|
38
|
+
});
|
|
39
|
+
client.theme.onChange((theme) => {
|
|
40
|
+
isDark.value = theme.isDark;
|
|
41
|
+
themeMode.value = theme.mode;
|
|
42
|
+
});
|
|
43
|
+
client.router.onChange((route) => {
|
|
44
|
+
routerPath.value = route.path;
|
|
45
|
+
routerQuery.value = route.query;
|
|
46
|
+
routerHash.value = route.hash;
|
|
47
|
+
});
|
|
48
|
+
initialized = true;
|
|
49
|
+
}
|
|
50
|
+
function useFoundation() {
|
|
51
|
+
initializeState();
|
|
52
|
+
return {
|
|
53
|
+
// Reactive state (readonly to prevent external mutation)
|
|
54
|
+
isReady: vue.readonly(isReady),
|
|
55
|
+
user: vue.readonly(user),
|
|
56
|
+
isDark: vue.readonly(isDark),
|
|
57
|
+
themeMode: vue.readonly(themeMode),
|
|
58
|
+
routerPath: vue.readonly(routerPath),
|
|
59
|
+
routerQuery: vue.readonly(routerQuery),
|
|
60
|
+
routerHash: vue.readonly(routerHash),
|
|
61
|
+
entities: vue.readonly(entities),
|
|
62
|
+
// Computed helpers
|
|
63
|
+
get isAuthenticated() {
|
|
64
|
+
return !!user.value;
|
|
65
|
+
},
|
|
66
|
+
get currentUser() {
|
|
67
|
+
return user.value;
|
|
68
|
+
},
|
|
69
|
+
// Direct access to SDK client for non-reactive operations
|
|
70
|
+
client,
|
|
71
|
+
// Shorthand service access
|
|
72
|
+
auth: client.auth,
|
|
73
|
+
ui: client.ui,
|
|
74
|
+
db: client.db,
|
|
75
|
+
router: client.router,
|
|
76
|
+
config: client.config,
|
|
77
|
+
files: client.files,
|
|
78
|
+
storage: client.storage,
|
|
79
|
+
log: client.log,
|
|
80
|
+
theme: client.theme,
|
|
81
|
+
// Theme control methods
|
|
82
|
+
setTheme: (mode) => client.theme.setTheme(mode),
|
|
83
|
+
toggleTheme: () => client.theme.toggle(),
|
|
84
|
+
// Entity change subscription
|
|
85
|
+
onEntityChange: client.onEntityChange.bind(client)
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
exports.useFoundation = useFoundation;
|
|
89
|
+
//# sourceMappingURL=vue.cjs.map
|
package/dist/vue.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue.cjs","sources":["../src/vue.ts"],"sourcesContent":["/**\n * Vue composable wrapper for Foundation SDK\n *\n * Provides Vue reactivity around the framework-agnostic SDK client.\n */\nimport { ref, readonly, shallowRef, type Ref, type ShallowRef, type DeepReadonly } from 'vue'\nimport { createFoundationClient } from './client'\nimport type {\n FoundationClient,\n User,\n Theme,\n RouterState,\n EntityDefinition,\n EntityChangeEvent\n} from './types'\n\n// Singleton client\nlet client: FoundationClient | null = null\n\n// Reactive state (module-level singletons)\nlet isReady: Ref<boolean> | null = null\nlet user: ShallowRef<User | null> | null = null\nlet isDark: Ref<boolean> | null = null\nlet themeMode: Ref<Theme['mode']> | null = null\nlet routerPath: Ref<string> | null = null\nlet routerQuery: ShallowRef<Record<string, string>> | null = null\nlet routerHash: Ref<string> | null = null\nlet entities: ShallowRef<EntityDefinition[]> | null = null\n\nlet initialized = false\n\nfunction initializeState() {\n if (initialized) return\n\n client = createFoundationClient()\n\n isReady = ref(false)\n user = shallowRef<User | null>(null)\n isDark = ref(false)\n themeMode = ref<Theme['mode']>('system')\n routerPath = ref('/')\n routerQuery = shallowRef<Record<string, string>>({})\n routerHash = ref('')\n entities = shallowRef<EntityDefinition[]>([])\n\n // Initialize reactive state when SDK is ready\n client.ready.then(() => {\n isReady!.value = true\n user!.value = client!.auth.user\n isDark!.value = client!.theme.isDark\n themeMode!.value = client!.theme.mode\n routerPath!.value = client!.router.path\n routerQuery!.value = client!.router.query\n routerHash!.value = client!.router.hash\n entities!.value = client!.entities\n })\n\n // Subscribe to changes\n client.auth.onChange((newUser) => {\n user!.value = newUser\n })\n\n client.theme.onChange((theme) => {\n isDark!.value = theme.isDark\n themeMode!.value = theme.mode\n })\n\n client.router.onChange((route) => {\n routerPath!.value = route.path\n routerQuery!.value = route.query\n routerHash!.value = route.hash\n })\n\n initialized = true\n}\n\nexport interface UseFoundationReturn {\n // Reactive state (readonly to prevent external mutation)\n isReady: DeepReadonly<Ref<boolean>>\n user: DeepReadonly<ShallowRef<User | null>>\n isDark: DeepReadonly<Ref<boolean>>\n themeMode: DeepReadonly<Ref<Theme['mode']>>\n routerPath: DeepReadonly<Ref<string>>\n routerQuery: DeepReadonly<ShallowRef<Record<string, string>>>\n routerHash: DeepReadonly<Ref<string>>\n entities: DeepReadonly<ShallowRef<EntityDefinition[]>>\n\n // Computed helpers\n readonly isAuthenticated: boolean\n readonly currentUser: User | null\n\n // Direct access to SDK client for non-reactive operations\n client: FoundationClient\n\n // Shorthand service access\n auth: FoundationClient['auth']\n ui: FoundationClient['ui']\n db: FoundationClient['db']\n router: FoundationClient['router']\n config: FoundationClient['config']\n files: FoundationClient['files']\n storage: FoundationClient['storage']\n log: FoundationClient['log']\n theme: FoundationClient['theme']\n\n // Theme control methods\n setTheme: (mode: Theme['mode']) => Promise<void>\n toggleTheme: () => Promise<void>\n\n // Entity change subscription\n onEntityChange: (callback: (event: EntityChangeEvent) => void) => () => void\n}\n\n/**\n * Main composable for accessing Foundation SDK with Vue reactivity\n */\nexport function useFoundation(): UseFoundationReturn {\n initializeState()\n\n return {\n // Reactive state (readonly to prevent external mutation)\n isReady: readonly(isReady!),\n user: readonly(user!),\n isDark: readonly(isDark!),\n themeMode: readonly(themeMode!),\n routerPath: readonly(routerPath!),\n routerQuery: readonly(routerQuery!),\n routerHash: readonly(routerHash!),\n entities: readonly(entities!),\n\n // Computed helpers\n get isAuthenticated() {\n return !!user!.value\n },\n\n get currentUser() {\n return user!.value\n },\n\n // Direct access to SDK client for non-reactive operations\n client: client!,\n\n // Shorthand service access\n auth: client!.auth,\n ui: client!.ui,\n db: client!.db,\n router: client!.router,\n config: client!.config,\n files: client!.files,\n storage: client!.storage,\n log: client!.log,\n theme: client!.theme,\n\n // Theme control methods\n setTheme: (mode: Theme['mode']) => client!.theme.setTheme(mode),\n toggleTheme: () => client!.theme.toggle(),\n\n // Entity change subscription\n onEntityChange: client!.onEntityChange.bind(client)\n }\n}\n\n// Re-export types for convenience\nexport type { User, Theme, RouterState, EntityDefinition, EntityChangeEvent }\n"],"names":["createFoundationClient","ref","shallowRef","readonly"],"mappings":";;;;AAiBA,IAAI,SAAkC;AAGtC,IAAI,UAA+B;AACnC,IAAI,OAAuC;AAC3C,IAAI,SAA8B;AAClC,IAAI,YAAuC;AAC3C,IAAI,aAAiC;AACrC,IAAI,cAAyD;AAC7D,IAAI,aAAiC;AACrC,IAAI,WAAkD;AAEtD,IAAI,cAAc;AAElB,SAAS,kBAAkB;AACzB,MAAI,YAAa;AAEjB,WAASA,MAAAA,uBAAA;AAET,YAAUC,IAAAA,IAAI,KAAK;AACnB,SAAOC,IAAAA,WAAwB,IAAI;AACnC,WAASD,IAAAA,IAAI,KAAK;AAClB,cAAYA,IAAAA,IAAmB,QAAQ;AACvC,eAAaA,IAAAA,IAAI,GAAG;AACpB,gBAAcC,IAAAA,WAAmC,EAAE;AACnD,eAAaD,IAAAA,IAAI,EAAE;AACnB,aAAWC,IAAAA,WAA+B,EAAE;AAG5C,SAAO,MAAM,KAAK,MAAM;AACtB,YAAS,QAAQ;AACjB,SAAM,QAAQ,OAAQ,KAAK;AAC3B,WAAQ,QAAQ,OAAQ,MAAM;AAC9B,cAAW,QAAQ,OAAQ,MAAM;AACjC,eAAY,QAAQ,OAAQ,OAAO;AACnC,gBAAa,QAAQ,OAAQ,OAAO;AACpC,eAAY,QAAQ,OAAQ,OAAO;AACnC,aAAU,QAAQ,OAAQ;AAAA,EAC5B,CAAC;AAGD,SAAO,KAAK,SAAS,CAAC,YAAY;AAChC,SAAM,QAAQ;AAAA,EAChB,CAAC;AAED,SAAO,MAAM,SAAS,CAAC,UAAU;AAC/B,WAAQ,QAAQ,MAAM;AACtB,cAAW,QAAQ,MAAM;AAAA,EAC3B,CAAC;AAED,SAAO,OAAO,SAAS,CAAC,UAAU;AAChC,eAAY,QAAQ,MAAM;AAC1B,gBAAa,QAAQ,MAAM;AAC3B,eAAY,QAAQ,MAAM;AAAA,EAC5B,CAAC;AAED,gBAAc;AAChB;AA0CO,SAAS,gBAAqC;AACnD,kBAAA;AAEA,SAAO;AAAA;AAAA,IAEL,SAASC,IAAAA,SAAS,OAAQ;AAAA,IAC1B,MAAMA,IAAAA,SAAS,IAAK;AAAA,IACpB,QAAQA,IAAAA,SAAS,MAAO;AAAA,IACxB,WAAWA,IAAAA,SAAS,SAAU;AAAA,IAC9B,YAAYA,IAAAA,SAAS,UAAW;AAAA,IAChC,aAAaA,IAAAA,SAAS,WAAY;AAAA,IAClC,YAAYA,IAAAA,SAAS,UAAW;AAAA,IAChC,UAAUA,IAAAA,SAAS,QAAS;AAAA;AAAA,IAG5B,IAAI,kBAAkB;AACpB,aAAO,CAAC,CAAC,KAAM;AAAA,IACjB;AAAA,IAEA,IAAI,cAAc;AAChB,aAAO,KAAM;AAAA,IACf;AAAA;AAAA,IAGA;AAAA;AAAA,IAGA,MAAM,OAAQ;AAAA,IACd,IAAI,OAAQ;AAAA,IACZ,IAAI,OAAQ;AAAA,IACZ,QAAQ,OAAQ;AAAA,IAChB,QAAQ,OAAQ;AAAA,IAChB,OAAO,OAAQ;AAAA,IACf,SAAS,OAAQ;AAAA,IACjB,KAAK,OAAQ;AAAA,IACb,OAAO,OAAQ;AAAA;AAAA,IAGf,UAAU,CAAC,SAAwB,OAAQ,MAAM,SAAS,IAAI;AAAA,IAC9D,aAAa,MAAM,OAAQ,MAAM,OAAA;AAAA;AAAA,IAGjC,gBAAgB,OAAQ,eAAe,KAAK,MAAM;AAAA,EAAA;AAEtD;;"}
|
package/dist/vue.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Ref, ShallowRef, DeepReadonly } from 'vue';
|
|
2
|
+
import { FoundationClient, User, Theme, RouterState, EntityDefinition, EntityChangeEvent } from './types';
|
|
3
|
+
export interface UseFoundationReturn {
|
|
4
|
+
isReady: DeepReadonly<Ref<boolean>>;
|
|
5
|
+
user: DeepReadonly<ShallowRef<User | null>>;
|
|
6
|
+
isDark: DeepReadonly<Ref<boolean>>;
|
|
7
|
+
themeMode: DeepReadonly<Ref<Theme['mode']>>;
|
|
8
|
+
routerPath: DeepReadonly<Ref<string>>;
|
|
9
|
+
routerQuery: DeepReadonly<ShallowRef<Record<string, string>>>;
|
|
10
|
+
routerHash: DeepReadonly<Ref<string>>;
|
|
11
|
+
entities: DeepReadonly<ShallowRef<EntityDefinition[]>>;
|
|
12
|
+
readonly isAuthenticated: boolean;
|
|
13
|
+
readonly currentUser: User | null;
|
|
14
|
+
client: FoundationClient;
|
|
15
|
+
auth: FoundationClient['auth'];
|
|
16
|
+
ui: FoundationClient['ui'];
|
|
17
|
+
db: FoundationClient['db'];
|
|
18
|
+
router: FoundationClient['router'];
|
|
19
|
+
config: FoundationClient['config'];
|
|
20
|
+
files: FoundationClient['files'];
|
|
21
|
+
storage: FoundationClient['storage'];
|
|
22
|
+
log: FoundationClient['log'];
|
|
23
|
+
theme: FoundationClient['theme'];
|
|
24
|
+
setTheme: (mode: Theme['mode']) => Promise<void>;
|
|
25
|
+
toggleTheme: () => Promise<void>;
|
|
26
|
+
onEntityChange: (callback: (event: EntityChangeEvent) => void) => () => void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Main composable for accessing Foundation SDK with Vue reactivity
|
|
30
|
+
*/
|
|
31
|
+
export declare function useFoundation(): UseFoundationReturn;
|
|
32
|
+
export type { User, Theme, RouterState, EntityDefinition, EntityChangeEvent };
|
|
33
|
+
//# sourceMappingURL=vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue.d.ts","sourceRoot":"","sources":["../src/vue.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAA6B,KAAK,GAAG,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,KAAK,CAAA;AAE7F,OAAO,KAAK,EACV,gBAAgB,EAChB,IAAI,EACJ,KAAK,EACL,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,SAAS,CAAA;AA8DhB,MAAM,WAAW,mBAAmB;IAElC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IACnC,IAAI,EAAE,YAAY,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAA;IAC3C,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IAClC,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC3C,UAAU,EAAE,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IACrC,WAAW,EAAE,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;IAC7D,UAAU,EAAE,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IACrC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAA;IAGtD,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;IAGjC,MAAM,EAAE,gBAAgB,CAAA;IAGxB,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC9B,EAAE,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAA;IAC1B,EAAE,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAA;IAC1B,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IAClC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IAClC,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAChC,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAA;IACpC,GAAG,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAA;IAC5B,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAGhC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAChD,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAGhC,cAAc,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;CAC7E;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,mBAAmB,CA4CnD;AAGD,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,CAAA"}
|
package/dist/vue.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { readonly, ref, shallowRef } from "vue";
|
|
2
|
+
import { createFoundationClient } from "./index.js";
|
|
3
|
+
let client = null;
|
|
4
|
+
let isReady = null;
|
|
5
|
+
let user = null;
|
|
6
|
+
let isDark = null;
|
|
7
|
+
let themeMode = null;
|
|
8
|
+
let routerPath = null;
|
|
9
|
+
let routerQuery = null;
|
|
10
|
+
let routerHash = null;
|
|
11
|
+
let entities = null;
|
|
12
|
+
let initialized = false;
|
|
13
|
+
function initializeState() {
|
|
14
|
+
if (initialized) return;
|
|
15
|
+
client = createFoundationClient();
|
|
16
|
+
isReady = ref(false);
|
|
17
|
+
user = shallowRef(null);
|
|
18
|
+
isDark = ref(false);
|
|
19
|
+
themeMode = ref("system");
|
|
20
|
+
routerPath = ref("/");
|
|
21
|
+
routerQuery = shallowRef({});
|
|
22
|
+
routerHash = ref("");
|
|
23
|
+
entities = shallowRef([]);
|
|
24
|
+
client.ready.then(() => {
|
|
25
|
+
isReady.value = true;
|
|
26
|
+
user.value = client.auth.user;
|
|
27
|
+
isDark.value = client.theme.isDark;
|
|
28
|
+
themeMode.value = client.theme.mode;
|
|
29
|
+
routerPath.value = client.router.path;
|
|
30
|
+
routerQuery.value = client.router.query;
|
|
31
|
+
routerHash.value = client.router.hash;
|
|
32
|
+
entities.value = client.entities;
|
|
33
|
+
});
|
|
34
|
+
client.auth.onChange((newUser) => {
|
|
35
|
+
user.value = newUser;
|
|
36
|
+
});
|
|
37
|
+
client.theme.onChange((theme) => {
|
|
38
|
+
isDark.value = theme.isDark;
|
|
39
|
+
themeMode.value = theme.mode;
|
|
40
|
+
});
|
|
41
|
+
client.router.onChange((route) => {
|
|
42
|
+
routerPath.value = route.path;
|
|
43
|
+
routerQuery.value = route.query;
|
|
44
|
+
routerHash.value = route.hash;
|
|
45
|
+
});
|
|
46
|
+
initialized = true;
|
|
47
|
+
}
|
|
48
|
+
function useFoundation() {
|
|
49
|
+
initializeState();
|
|
50
|
+
return {
|
|
51
|
+
// Reactive state (readonly to prevent external mutation)
|
|
52
|
+
isReady: readonly(isReady),
|
|
53
|
+
user: readonly(user),
|
|
54
|
+
isDark: readonly(isDark),
|
|
55
|
+
themeMode: readonly(themeMode),
|
|
56
|
+
routerPath: readonly(routerPath),
|
|
57
|
+
routerQuery: readonly(routerQuery),
|
|
58
|
+
routerHash: readonly(routerHash),
|
|
59
|
+
entities: readonly(entities),
|
|
60
|
+
// Computed helpers
|
|
61
|
+
get isAuthenticated() {
|
|
62
|
+
return !!user.value;
|
|
63
|
+
},
|
|
64
|
+
get currentUser() {
|
|
65
|
+
return user.value;
|
|
66
|
+
},
|
|
67
|
+
// Direct access to SDK client for non-reactive operations
|
|
68
|
+
client,
|
|
69
|
+
// Shorthand service access
|
|
70
|
+
auth: client.auth,
|
|
71
|
+
ui: client.ui,
|
|
72
|
+
db: client.db,
|
|
73
|
+
router: client.router,
|
|
74
|
+
config: client.config,
|
|
75
|
+
files: client.files,
|
|
76
|
+
storage: client.storage,
|
|
77
|
+
log: client.log,
|
|
78
|
+
theme: client.theme,
|
|
79
|
+
// Theme control methods
|
|
80
|
+
setTheme: (mode) => client.theme.setTheme(mode),
|
|
81
|
+
toggleTheme: () => client.theme.toggle(),
|
|
82
|
+
// Entity change subscription
|
|
83
|
+
onEntityChange: client.onEntityChange.bind(client)
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export {
|
|
87
|
+
useFoundation
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=vue.js.map
|
package/dist/vue.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vue.js","sources":["../src/vue.ts"],"sourcesContent":["/**\n * Vue composable wrapper for Foundation SDK\n *\n * Provides Vue reactivity around the framework-agnostic SDK client.\n */\nimport { ref, readonly, shallowRef, type Ref, type ShallowRef, type DeepReadonly } from 'vue'\nimport { createFoundationClient } from './client'\nimport type {\n FoundationClient,\n User,\n Theme,\n RouterState,\n EntityDefinition,\n EntityChangeEvent\n} from './types'\n\n// Singleton client\nlet client: FoundationClient | null = null\n\n// Reactive state (module-level singletons)\nlet isReady: Ref<boolean> | null = null\nlet user: ShallowRef<User | null> | null = null\nlet isDark: Ref<boolean> | null = null\nlet themeMode: Ref<Theme['mode']> | null = null\nlet routerPath: Ref<string> | null = null\nlet routerQuery: ShallowRef<Record<string, string>> | null = null\nlet routerHash: Ref<string> | null = null\nlet entities: ShallowRef<EntityDefinition[]> | null = null\n\nlet initialized = false\n\nfunction initializeState() {\n if (initialized) return\n\n client = createFoundationClient()\n\n isReady = ref(false)\n user = shallowRef<User | null>(null)\n isDark = ref(false)\n themeMode = ref<Theme['mode']>('system')\n routerPath = ref('/')\n routerQuery = shallowRef<Record<string, string>>({})\n routerHash = ref('')\n entities = shallowRef<EntityDefinition[]>([])\n\n // Initialize reactive state when SDK is ready\n client.ready.then(() => {\n isReady!.value = true\n user!.value = client!.auth.user\n isDark!.value = client!.theme.isDark\n themeMode!.value = client!.theme.mode\n routerPath!.value = client!.router.path\n routerQuery!.value = client!.router.query\n routerHash!.value = client!.router.hash\n entities!.value = client!.entities\n })\n\n // Subscribe to changes\n client.auth.onChange((newUser) => {\n user!.value = newUser\n })\n\n client.theme.onChange((theme) => {\n isDark!.value = theme.isDark\n themeMode!.value = theme.mode\n })\n\n client.router.onChange((route) => {\n routerPath!.value = route.path\n routerQuery!.value = route.query\n routerHash!.value = route.hash\n })\n\n initialized = true\n}\n\nexport interface UseFoundationReturn {\n // Reactive state (readonly to prevent external mutation)\n isReady: DeepReadonly<Ref<boolean>>\n user: DeepReadonly<ShallowRef<User | null>>\n isDark: DeepReadonly<Ref<boolean>>\n themeMode: DeepReadonly<Ref<Theme['mode']>>\n routerPath: DeepReadonly<Ref<string>>\n routerQuery: DeepReadonly<ShallowRef<Record<string, string>>>\n routerHash: DeepReadonly<Ref<string>>\n entities: DeepReadonly<ShallowRef<EntityDefinition[]>>\n\n // Computed helpers\n readonly isAuthenticated: boolean\n readonly currentUser: User | null\n\n // Direct access to SDK client for non-reactive operations\n client: FoundationClient\n\n // Shorthand service access\n auth: FoundationClient['auth']\n ui: FoundationClient['ui']\n db: FoundationClient['db']\n router: FoundationClient['router']\n config: FoundationClient['config']\n files: FoundationClient['files']\n storage: FoundationClient['storage']\n log: FoundationClient['log']\n theme: FoundationClient['theme']\n\n // Theme control methods\n setTheme: (mode: Theme['mode']) => Promise<void>\n toggleTheme: () => Promise<void>\n\n // Entity change subscription\n onEntityChange: (callback: (event: EntityChangeEvent) => void) => () => void\n}\n\n/**\n * Main composable for accessing Foundation SDK with Vue reactivity\n */\nexport function useFoundation(): UseFoundationReturn {\n initializeState()\n\n return {\n // Reactive state (readonly to prevent external mutation)\n isReady: readonly(isReady!),\n user: readonly(user!),\n isDark: readonly(isDark!),\n themeMode: readonly(themeMode!),\n routerPath: readonly(routerPath!),\n routerQuery: readonly(routerQuery!),\n routerHash: readonly(routerHash!),\n entities: readonly(entities!),\n\n // Computed helpers\n get isAuthenticated() {\n return !!user!.value\n },\n\n get currentUser() {\n return user!.value\n },\n\n // Direct access to SDK client for non-reactive operations\n client: client!,\n\n // Shorthand service access\n auth: client!.auth,\n ui: client!.ui,\n db: client!.db,\n router: client!.router,\n config: client!.config,\n files: client!.files,\n storage: client!.storage,\n log: client!.log,\n theme: client!.theme,\n\n // Theme control methods\n setTheme: (mode: Theme['mode']) => client!.theme.setTheme(mode),\n toggleTheme: () => client!.theme.toggle(),\n\n // Entity change subscription\n onEntityChange: client!.onEntityChange.bind(client)\n }\n}\n\n// Re-export types for convenience\nexport type { User, Theme, RouterState, EntityDefinition, EntityChangeEvent }\n"],"names":[],"mappings":";;AAiBA,IAAI,SAAkC;AAGtC,IAAI,UAA+B;AACnC,IAAI,OAAuC;AAC3C,IAAI,SAA8B;AAClC,IAAI,YAAuC;AAC3C,IAAI,aAAiC;AACrC,IAAI,cAAyD;AAC7D,IAAI,aAAiC;AACrC,IAAI,WAAkD;AAEtD,IAAI,cAAc;AAElB,SAAS,kBAAkB;AACzB,MAAI,YAAa;AAEjB,WAAS,uBAAA;AAET,YAAU,IAAI,KAAK;AACnB,SAAO,WAAwB,IAAI;AACnC,WAAS,IAAI,KAAK;AAClB,cAAY,IAAmB,QAAQ;AACvC,eAAa,IAAI,GAAG;AACpB,gBAAc,WAAmC,EAAE;AACnD,eAAa,IAAI,EAAE;AACnB,aAAW,WAA+B,EAAE;AAG5C,SAAO,MAAM,KAAK,MAAM;AACtB,YAAS,QAAQ;AACjB,SAAM,QAAQ,OAAQ,KAAK;AAC3B,WAAQ,QAAQ,OAAQ,MAAM;AAC9B,cAAW,QAAQ,OAAQ,MAAM;AACjC,eAAY,QAAQ,OAAQ,OAAO;AACnC,gBAAa,QAAQ,OAAQ,OAAO;AACpC,eAAY,QAAQ,OAAQ,OAAO;AACnC,aAAU,QAAQ,OAAQ;AAAA,EAC5B,CAAC;AAGD,SAAO,KAAK,SAAS,CAAC,YAAY;AAChC,SAAM,QAAQ;AAAA,EAChB,CAAC;AAED,SAAO,MAAM,SAAS,CAAC,UAAU;AAC/B,WAAQ,QAAQ,MAAM;AACtB,cAAW,QAAQ,MAAM;AAAA,EAC3B,CAAC;AAED,SAAO,OAAO,SAAS,CAAC,UAAU;AAChC,eAAY,QAAQ,MAAM;AAC1B,gBAAa,QAAQ,MAAM;AAC3B,eAAY,QAAQ,MAAM;AAAA,EAC5B,CAAC;AAED,gBAAc;AAChB;AA0CO,SAAS,gBAAqC;AACnD,kBAAA;AAEA,SAAO;AAAA;AAAA,IAEL,SAAS,SAAS,OAAQ;AAAA,IAC1B,MAAM,SAAS,IAAK;AAAA,IACpB,QAAQ,SAAS,MAAO;AAAA,IACxB,WAAW,SAAS,SAAU;AAAA,IAC9B,YAAY,SAAS,UAAW;AAAA,IAChC,aAAa,SAAS,WAAY;AAAA,IAClC,YAAY,SAAS,UAAW;AAAA,IAChC,UAAU,SAAS,QAAS;AAAA;AAAA,IAG5B,IAAI,kBAAkB;AACpB,aAAO,CAAC,CAAC,KAAM;AAAA,IACjB;AAAA,IAEA,IAAI,cAAc;AAChB,aAAO,KAAM;AAAA,IACf;AAAA;AAAA,IAGA;AAAA;AAAA,IAGA,MAAM,OAAQ;AAAA,IACd,IAAI,OAAQ;AAAA,IACZ,IAAI,OAAQ;AAAA,IACZ,QAAQ,OAAQ;AAAA,IAChB,QAAQ,OAAQ;AAAA,IAChB,OAAO,OAAQ;AAAA,IACf,SAAS,OAAQ;AAAA,IACjB,KAAK,OAAQ;AAAA,IACb,OAAO,OAAQ;AAAA;AAAA,IAGf,UAAU,CAAC,SAAwB,OAAQ,MAAM,SAAS,IAAI;AAAA,IAC9D,aAAa,MAAM,OAAQ,MAAM,OAAA;AAAA;AAAA,IAGjC,gBAAgB,OAAQ,eAAe,KAAK,MAAM;AAAA,EAAA;AAEtD;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "foundation-sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "SDK for apps embedded in the Foundation container iframe",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -16,6 +16,16 @@
|
|
|
16
16
|
"types": "./dist/index.d.ts",
|
|
17
17
|
"default": "./dist/index.cjs"
|
|
18
18
|
}
|
|
19
|
+
},
|
|
20
|
+
"./vue": {
|
|
21
|
+
"import": {
|
|
22
|
+
"types": "./dist/vue.d.ts",
|
|
23
|
+
"default": "./dist/vue.js"
|
|
24
|
+
},
|
|
25
|
+
"require": {
|
|
26
|
+
"types": "./dist/vue.d.ts",
|
|
27
|
+
"default": "./dist/vue.cjs"
|
|
28
|
+
}
|
|
19
29
|
}
|
|
20
30
|
},
|
|
21
31
|
"files": [
|
|
@@ -36,10 +46,19 @@
|
|
|
36
46
|
],
|
|
37
47
|
"author": "",
|
|
38
48
|
"license": "MIT",
|
|
49
|
+
"peerDependencies": {
|
|
50
|
+
"vue": "^3.0.0"
|
|
51
|
+
},
|
|
52
|
+
"peerDependenciesMeta": {
|
|
53
|
+
"vue": {
|
|
54
|
+
"optional": true
|
|
55
|
+
}
|
|
56
|
+
},
|
|
39
57
|
"devDependencies": {
|
|
40
58
|
"typescript": "^5.0.0",
|
|
41
59
|
"vite": "^6.0.0",
|
|
42
|
-
"vite-plugin-dts": "^4.0.0"
|
|
60
|
+
"vite-plugin-dts": "^4.0.0",
|
|
61
|
+
"vue": "^3.5.0"
|
|
43
62
|
},
|
|
44
63
|
"sideEffects": false
|
|
45
64
|
}
|