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 CHANGED
@@ -1,4 +1,4 @@
1
- # foundation-iframe-sdk
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-iframe-sdk
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-iframe-sdk'
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
- // ... more types
405
- } from 'foundation-iframe-sdk'
547
+ StorageService,
548
+ FilesService,
549
+ FileMetadata,
550
+ LogService,
551
+ ConfigService
552
+ } from 'foundation-sdk'
406
553
  ```
407
554
 
408
555
  ---
@@ -0,0 +1,4 @@
1
+ import { FoundationClient } from './types';
2
+ export declare function createFoundationClient(): FoundationClient;
3
+ export declare function resetFoundationClient(): void;
4
+ //# sourceMappingURL=client.d.ts.map
@@ -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 declare interface AuthService {
2
- readonly user: User | null;
3
- readonly isAuthenticated: boolean;
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"}
@@ -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
@@ -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
@@ -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.0",
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
  }