@togglely/sdk-svelte 1.0.0 → 1.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/dist/index.d.ts +129 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +233 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +261 -0
- package/dist/index.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Togglely Svelte SDK
|
|
3
|
+
*
|
|
4
|
+
* Provides Svelte stores for feature toggles
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```svelte
|
|
8
|
+
* <script>
|
|
9
|
+
* import { toggle, toggles, togglelyState, setTogglelyContext } from '@togglely/sdk-svelte';
|
|
10
|
+
* import { TogglelyClient } from '@togglely/sdk-svelte';
|
|
11
|
+
*
|
|
12
|
+
* // Initialize client
|
|
13
|
+
* const client = new TogglelyClient({
|
|
14
|
+
* apiKey: 'your-api-key',
|
|
15
|
+
* environment: 'production',
|
|
16
|
+
* baseUrl: 'https://your-togglely-instance.com'
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* // Use stores
|
|
20
|
+
* const isEnabled = toggle('new-feature', false);
|
|
21
|
+
* const allToggles = toggles();
|
|
22
|
+
* const state = togglelyState();
|
|
23
|
+
*
|
|
24
|
+
* // Set context
|
|
25
|
+
* setTogglelyContext({ userId: '123' });
|
|
26
|
+
* </script>
|
|
27
|
+
*
|
|
28
|
+
* {#if $isEnabled}
|
|
29
|
+
* <NewFeature />
|
|
30
|
+
* {:else}
|
|
31
|
+
* <OldFeature />
|
|
32
|
+
* {/if}
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
import { type Readable } from 'svelte/store';
|
|
36
|
+
import { TogglelyClient, TogglelyConfig, ToggleContext, TogglelyState } from '@togglely/sdk-core';
|
|
37
|
+
export declare function initTogglely(config: TogglelyConfig): TogglelyClient;
|
|
38
|
+
export declare function getTogglelyClient(): TogglelyClient;
|
|
39
|
+
export declare function destroyTogglely(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Store that tracks the Togglely state
|
|
42
|
+
*/
|
|
43
|
+
export declare function togglelyState(): Readable<TogglelyState>;
|
|
44
|
+
/**
|
|
45
|
+
* Store for a boolean toggle
|
|
46
|
+
*/
|
|
47
|
+
export declare function toggle(key: string, defaultValue?: boolean): Readable<boolean>;
|
|
48
|
+
/**
|
|
49
|
+
* Store for a string toggle
|
|
50
|
+
*/
|
|
51
|
+
export declare function stringToggle(key: string, defaultValue?: string): Readable<string>;
|
|
52
|
+
/**
|
|
53
|
+
* Store for a number toggle
|
|
54
|
+
*/
|
|
55
|
+
export declare function numberToggle(key: string, defaultValue?: number): Readable<number>;
|
|
56
|
+
/**
|
|
57
|
+
* Store for a JSON toggle
|
|
58
|
+
*/
|
|
59
|
+
export declare function jsonToggle<T = any>(key: string, defaultValue?: T): Readable<T>;
|
|
60
|
+
/**
|
|
61
|
+
* Store for all toggles
|
|
62
|
+
*/
|
|
63
|
+
export declare function toggles(): Readable<Record<string, {
|
|
64
|
+
value: any;
|
|
65
|
+
enabled: boolean;
|
|
66
|
+
}>>;
|
|
67
|
+
/**
|
|
68
|
+
* Derived store that returns true when toggles are ready
|
|
69
|
+
*/
|
|
70
|
+
export declare function togglelyReady(): Readable<boolean>;
|
|
71
|
+
/**
|
|
72
|
+
* Derived store that returns true when in offline mode
|
|
73
|
+
*/
|
|
74
|
+
export declare function togglelyOffline(): Readable<boolean>;
|
|
75
|
+
/**
|
|
76
|
+
* Set context for toggle evaluation
|
|
77
|
+
*/
|
|
78
|
+
export declare function setTogglelyContext(context: ToggleContext): void;
|
|
79
|
+
/**
|
|
80
|
+
* Get current context
|
|
81
|
+
*/
|
|
82
|
+
export declare function getTogglelyContext(): ToggleContext;
|
|
83
|
+
/**
|
|
84
|
+
* Clear context
|
|
85
|
+
*/
|
|
86
|
+
export declare function clearTogglelyContext(): void;
|
|
87
|
+
/**
|
|
88
|
+
* Creates a reactive toggle value using Svelte 5 runes
|
|
89
|
+
* For Svelte 5+ users
|
|
90
|
+
*/
|
|
91
|
+
export declare function createToggle(key: string, defaultValue?: boolean): {
|
|
92
|
+
value: boolean;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Svelte action to show/hide elements based on a feature toggle
|
|
96
|
+
*
|
|
97
|
+
* Usage:
|
|
98
|
+
* ```svelte
|
|
99
|
+
* <div use:featureToggle={'new-feature'}>
|
|
100
|
+
* This is only visible when 'new-feature' is enabled
|
|
101
|
+
* </div>
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export declare function featureToggle(node: HTMLElement, key: string): {
|
|
105
|
+
destroy(): void;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Example FeatureToggle component for Svelte:
|
|
109
|
+
*
|
|
110
|
+
* ```svelte
|
|
111
|
+
* <!-- FeatureToggle.svelte -->
|
|
112
|
+
* <script>
|
|
113
|
+
* import { toggle } from '@togglely/sdk-svelte';
|
|
114
|
+
*
|
|
115
|
+
* export let name: string;
|
|
116
|
+
* export let defaultValue: boolean = false;
|
|
117
|
+
*
|
|
118
|
+
* const isEnabled = toggle(name, defaultValue);
|
|
119
|
+
* </script>
|
|
120
|
+
*
|
|
121
|
+
* {#if $isEnabled}
|
|
122
|
+
* <slot />
|
|
123
|
+
* {:else}
|
|
124
|
+
* <slot name="fallback" />
|
|
125
|
+
* {/if}
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
export { TogglelyClient, TogglelyConfig, ToggleContext, TogglelyState, createOfflineTogglesScript, togglesToEnvVars } from '@togglely/sdk-core';
|
|
129
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAA8C,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EACL,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,EACd,MAAM,oBAAoB,CAAC;AAM5B,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAQnE;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD;AAED,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAID;;GAEG;AACH,wBAAgB,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC,CAkBvD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,GAAE,OAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,CAepF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,GAAE,MAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAarF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,GAAE,MAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAapF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,GAAE,CAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,CAavF;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CAYpF;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,QAAQ,CAAC,OAAO,CAAC,CAEjD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,QAAQ,CAAC,OAAO,CAAC,CAEnD;AAID;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAG/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CAGlD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,GAAE,OAAe,GAAG;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAiB3F;AAID;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,OAAO,IAAI,IAAI,CAAA;CAAE,CAmBjF;AAOD;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EACL,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,EACb,0BAA0B,EAC1B,gBAAgB,EACjB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { readable, derived } from 'svelte/store';
|
|
2
|
+
import { TogglelyClient } from '@togglely/sdk-core';
|
|
3
|
+
export { TogglelyClient, createOfflineTogglesScript, togglesToEnvVars } from '@togglely/sdk-core';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Togglely Svelte SDK
|
|
7
|
+
*
|
|
8
|
+
* Provides Svelte stores for feature toggles
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```svelte
|
|
12
|
+
* <script>
|
|
13
|
+
* import { toggle, toggles, togglelyState, setTogglelyContext } from '@togglely/sdk-svelte';
|
|
14
|
+
* import { TogglelyClient } from '@togglely/sdk-svelte';
|
|
15
|
+
*
|
|
16
|
+
* // Initialize client
|
|
17
|
+
* const client = new TogglelyClient({
|
|
18
|
+
* apiKey: 'your-api-key',
|
|
19
|
+
* environment: 'production',
|
|
20
|
+
* baseUrl: 'https://your-togglely-instance.com'
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* // Use stores
|
|
24
|
+
* const isEnabled = toggle('new-feature', false);
|
|
25
|
+
* const allToggles = toggles();
|
|
26
|
+
* const state = togglelyState();
|
|
27
|
+
*
|
|
28
|
+
* // Set context
|
|
29
|
+
* setTogglelyContext({ userId: '123' });
|
|
30
|
+
* </script>
|
|
31
|
+
*
|
|
32
|
+
* {#if $isEnabled}
|
|
33
|
+
* <NewFeature />
|
|
34
|
+
* {:else}
|
|
35
|
+
* <OldFeature />
|
|
36
|
+
* {/if}
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
// ==================== Client Instance ====================
|
|
40
|
+
let globalClient = null;
|
|
41
|
+
function initTogglely(config) {
|
|
42
|
+
if (globalClient) {
|
|
43
|
+
console.warn('[Togglely] Client already initialized, destroying old instance');
|
|
44
|
+
globalClient.destroy();
|
|
45
|
+
}
|
|
46
|
+
globalClient = new TogglelyClient(config);
|
|
47
|
+
return globalClient;
|
|
48
|
+
}
|
|
49
|
+
function getTogglelyClient() {
|
|
50
|
+
if (!globalClient) {
|
|
51
|
+
throw new Error('Togglely not initialized. Call initTogglely first.');
|
|
52
|
+
}
|
|
53
|
+
return globalClient;
|
|
54
|
+
}
|
|
55
|
+
function destroyTogglely() {
|
|
56
|
+
if (globalClient) {
|
|
57
|
+
globalClient.destroy();
|
|
58
|
+
globalClient = null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// ==================== Stores ====================
|
|
62
|
+
/**
|
|
63
|
+
* Store that tracks the Togglely state
|
|
64
|
+
*/
|
|
65
|
+
function togglelyState() {
|
|
66
|
+
const client = getTogglelyClient();
|
|
67
|
+
return readable(client.getState(), (set) => {
|
|
68
|
+
// Update on all events
|
|
69
|
+
const handlers = [];
|
|
70
|
+
['ready', 'update', 'error', 'offline', 'online'].forEach((event) => {
|
|
71
|
+
const unsubscribe = client.on(event, (state) => {
|
|
72
|
+
set(state);
|
|
73
|
+
});
|
|
74
|
+
handlers.push(unsubscribe);
|
|
75
|
+
});
|
|
76
|
+
return () => {
|
|
77
|
+
handlers.forEach(unsubscribe => unsubscribe());
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Store for a boolean toggle
|
|
83
|
+
*/
|
|
84
|
+
function toggle(key, defaultValue = false) {
|
|
85
|
+
const client = getTogglelyClient();
|
|
86
|
+
return readable(defaultValue, (set) => {
|
|
87
|
+
// Initial check
|
|
88
|
+
client.isEnabled(key, defaultValue).then(set);
|
|
89
|
+
// Update on toggle updates
|
|
90
|
+
const unsubscribe = client.on('update', async () => {
|
|
91
|
+
const value = await client.isEnabled(key, defaultValue);
|
|
92
|
+
set(value);
|
|
93
|
+
});
|
|
94
|
+
return unsubscribe;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Store for a string toggle
|
|
99
|
+
*/
|
|
100
|
+
function stringToggle(key, defaultValue = '') {
|
|
101
|
+
const client = getTogglelyClient();
|
|
102
|
+
return readable(defaultValue, (set) => {
|
|
103
|
+
client.getString(key, defaultValue).then(set);
|
|
104
|
+
const unsubscribe = client.on('update', async () => {
|
|
105
|
+
const value = await client.getString(key, defaultValue);
|
|
106
|
+
set(value);
|
|
107
|
+
});
|
|
108
|
+
return unsubscribe;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Store for a number toggle
|
|
113
|
+
*/
|
|
114
|
+
function numberToggle(key, defaultValue = 0) {
|
|
115
|
+
const client = getTogglelyClient();
|
|
116
|
+
return readable(defaultValue, (set) => {
|
|
117
|
+
client.getNumber(key, defaultValue).then(set);
|
|
118
|
+
const unsubscribe = client.on('update', async () => {
|
|
119
|
+
const value = await client.getNumber(key, defaultValue);
|
|
120
|
+
set(value);
|
|
121
|
+
});
|
|
122
|
+
return unsubscribe;
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Store for a JSON toggle
|
|
127
|
+
*/
|
|
128
|
+
function jsonToggle(key, defaultValue = {}) {
|
|
129
|
+
const client = getTogglelyClient();
|
|
130
|
+
return readable(defaultValue, (set) => {
|
|
131
|
+
client.getJSON(key, defaultValue).then(set);
|
|
132
|
+
const unsubscribe = client.on('update', async () => {
|
|
133
|
+
const value = await client.getJSON(key, defaultValue);
|
|
134
|
+
set(value);
|
|
135
|
+
});
|
|
136
|
+
return unsubscribe;
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Store for all toggles
|
|
141
|
+
*/
|
|
142
|
+
function toggles() {
|
|
143
|
+
const client = getTogglelyClient();
|
|
144
|
+
return readable({}, (set) => {
|
|
145
|
+
set(client.getAllToggles());
|
|
146
|
+
const unsubscribe = client.on('update', () => {
|
|
147
|
+
set(client.getAllToggles());
|
|
148
|
+
});
|
|
149
|
+
return unsubscribe;
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Derived store that returns true when toggles are ready
|
|
154
|
+
*/
|
|
155
|
+
function togglelyReady() {
|
|
156
|
+
return derived(togglelyState(), $state => $state.isReady);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Derived store that returns true when in offline mode
|
|
160
|
+
*/
|
|
161
|
+
function togglelyOffline() {
|
|
162
|
+
return derived(togglelyState(), $state => $state.isOffline);
|
|
163
|
+
}
|
|
164
|
+
// ==================== Context ====================
|
|
165
|
+
/**
|
|
166
|
+
* Set context for toggle evaluation
|
|
167
|
+
*/
|
|
168
|
+
function setTogglelyContext(context) {
|
|
169
|
+
const client = getTogglelyClient();
|
|
170
|
+
client.setContext(context);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get current context
|
|
174
|
+
*/
|
|
175
|
+
function getTogglelyContext() {
|
|
176
|
+
const client = getTogglelyClient();
|
|
177
|
+
return client.getContext();
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Clear context
|
|
181
|
+
*/
|
|
182
|
+
function clearTogglelyContext() {
|
|
183
|
+
const client = getTogglelyClient();
|
|
184
|
+
client.clearContext();
|
|
185
|
+
}
|
|
186
|
+
// ==================== Components (Svelte 5 Runes Support) ====================
|
|
187
|
+
/**
|
|
188
|
+
* Creates a reactive toggle value using Svelte 5 runes
|
|
189
|
+
* For Svelte 5+ users
|
|
190
|
+
*/
|
|
191
|
+
function createToggle(key, defaultValue = false) {
|
|
192
|
+
const client = getTogglelyClient();
|
|
193
|
+
// This is a placeholder for Svelte 5 runes syntax
|
|
194
|
+
// Users would use: let enabled = $state(createToggle('feature'))
|
|
195
|
+
let value = defaultValue;
|
|
196
|
+
client.isEnabled(key, defaultValue).then(v => { value = v; });
|
|
197
|
+
client.on('update', async () => {
|
|
198
|
+
value = await client.isEnabled(key, defaultValue);
|
|
199
|
+
});
|
|
200
|
+
// Cleanup would need to be handled by the component
|
|
201
|
+
return {
|
|
202
|
+
get value() { return value; }
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
// ==================== Action ====================
|
|
206
|
+
/**
|
|
207
|
+
* Svelte action to show/hide elements based on a feature toggle
|
|
208
|
+
*
|
|
209
|
+
* Usage:
|
|
210
|
+
* ```svelte
|
|
211
|
+
* <div use:featureToggle={'new-feature'}>
|
|
212
|
+
* This is only visible when 'new-feature' is enabled
|
|
213
|
+
* </div>
|
|
214
|
+
* ```
|
|
215
|
+
*/
|
|
216
|
+
function featureToggle(node, key) {
|
|
217
|
+
const client = getTogglelyClient();
|
|
218
|
+
let currentKey = key;
|
|
219
|
+
async function updateVisibility() {
|
|
220
|
+
const isEnabled = await client.isEnabled(currentKey, false);
|
|
221
|
+
node.style.display = isEnabled ? '' : 'none';
|
|
222
|
+
}
|
|
223
|
+
updateVisibility();
|
|
224
|
+
const unsubscribe = client.on('update', updateVisibility);
|
|
225
|
+
return {
|
|
226
|
+
destroy() {
|
|
227
|
+
unsubscribe();
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export { clearTogglelyContext, createToggle, destroyTogglely, featureToggle, getTogglelyClient, getTogglelyContext, initTogglely, jsonToggle, numberToggle, setTogglelyContext, stringToggle, toggle, togglelyOffline, togglelyReady, togglelyState, toggles };
|
|
233
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var store = require('svelte/store');
|
|
4
|
+
var sdkCore = require('@togglely/sdk-core');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Togglely Svelte SDK
|
|
8
|
+
*
|
|
9
|
+
* Provides Svelte stores for feature toggles
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* ```svelte
|
|
13
|
+
* <script>
|
|
14
|
+
* import { toggle, toggles, togglelyState, setTogglelyContext } from '@togglely/sdk-svelte';
|
|
15
|
+
* import { TogglelyClient } from '@togglely/sdk-svelte';
|
|
16
|
+
*
|
|
17
|
+
* // Initialize client
|
|
18
|
+
* const client = new TogglelyClient({
|
|
19
|
+
* apiKey: 'your-api-key',
|
|
20
|
+
* environment: 'production',
|
|
21
|
+
* baseUrl: 'https://your-togglely-instance.com'
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* // Use stores
|
|
25
|
+
* const isEnabled = toggle('new-feature', false);
|
|
26
|
+
* const allToggles = toggles();
|
|
27
|
+
* const state = togglelyState();
|
|
28
|
+
*
|
|
29
|
+
* // Set context
|
|
30
|
+
* setTogglelyContext({ userId: '123' });
|
|
31
|
+
* </script>
|
|
32
|
+
*
|
|
33
|
+
* {#if $isEnabled}
|
|
34
|
+
* <NewFeature />
|
|
35
|
+
* {:else}
|
|
36
|
+
* <OldFeature />
|
|
37
|
+
* {/if}
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
// ==================== Client Instance ====================
|
|
41
|
+
let globalClient = null;
|
|
42
|
+
function initTogglely(config) {
|
|
43
|
+
if (globalClient) {
|
|
44
|
+
console.warn('[Togglely] Client already initialized, destroying old instance');
|
|
45
|
+
globalClient.destroy();
|
|
46
|
+
}
|
|
47
|
+
globalClient = new sdkCore.TogglelyClient(config);
|
|
48
|
+
return globalClient;
|
|
49
|
+
}
|
|
50
|
+
function getTogglelyClient() {
|
|
51
|
+
if (!globalClient) {
|
|
52
|
+
throw new Error('Togglely not initialized. Call initTogglely first.');
|
|
53
|
+
}
|
|
54
|
+
return globalClient;
|
|
55
|
+
}
|
|
56
|
+
function destroyTogglely() {
|
|
57
|
+
if (globalClient) {
|
|
58
|
+
globalClient.destroy();
|
|
59
|
+
globalClient = null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// ==================== Stores ====================
|
|
63
|
+
/**
|
|
64
|
+
* Store that tracks the Togglely state
|
|
65
|
+
*/
|
|
66
|
+
function togglelyState() {
|
|
67
|
+
const client = getTogglelyClient();
|
|
68
|
+
return store.readable(client.getState(), (set) => {
|
|
69
|
+
// Update on all events
|
|
70
|
+
const handlers = [];
|
|
71
|
+
['ready', 'update', 'error', 'offline', 'online'].forEach((event) => {
|
|
72
|
+
const unsubscribe = client.on(event, (state) => {
|
|
73
|
+
set(state);
|
|
74
|
+
});
|
|
75
|
+
handlers.push(unsubscribe);
|
|
76
|
+
});
|
|
77
|
+
return () => {
|
|
78
|
+
handlers.forEach(unsubscribe => unsubscribe());
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Store for a boolean toggle
|
|
84
|
+
*/
|
|
85
|
+
function toggle(key, defaultValue = false) {
|
|
86
|
+
const client = getTogglelyClient();
|
|
87
|
+
return store.readable(defaultValue, (set) => {
|
|
88
|
+
// Initial check
|
|
89
|
+
client.isEnabled(key, defaultValue).then(set);
|
|
90
|
+
// Update on toggle updates
|
|
91
|
+
const unsubscribe = client.on('update', async () => {
|
|
92
|
+
const value = await client.isEnabled(key, defaultValue);
|
|
93
|
+
set(value);
|
|
94
|
+
});
|
|
95
|
+
return unsubscribe;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Store for a string toggle
|
|
100
|
+
*/
|
|
101
|
+
function stringToggle(key, defaultValue = '') {
|
|
102
|
+
const client = getTogglelyClient();
|
|
103
|
+
return store.readable(defaultValue, (set) => {
|
|
104
|
+
client.getString(key, defaultValue).then(set);
|
|
105
|
+
const unsubscribe = client.on('update', async () => {
|
|
106
|
+
const value = await client.getString(key, defaultValue);
|
|
107
|
+
set(value);
|
|
108
|
+
});
|
|
109
|
+
return unsubscribe;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Store for a number toggle
|
|
114
|
+
*/
|
|
115
|
+
function numberToggle(key, defaultValue = 0) {
|
|
116
|
+
const client = getTogglelyClient();
|
|
117
|
+
return store.readable(defaultValue, (set) => {
|
|
118
|
+
client.getNumber(key, defaultValue).then(set);
|
|
119
|
+
const unsubscribe = client.on('update', async () => {
|
|
120
|
+
const value = await client.getNumber(key, defaultValue);
|
|
121
|
+
set(value);
|
|
122
|
+
});
|
|
123
|
+
return unsubscribe;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Store for a JSON toggle
|
|
128
|
+
*/
|
|
129
|
+
function jsonToggle(key, defaultValue = {}) {
|
|
130
|
+
const client = getTogglelyClient();
|
|
131
|
+
return store.readable(defaultValue, (set) => {
|
|
132
|
+
client.getJSON(key, defaultValue).then(set);
|
|
133
|
+
const unsubscribe = client.on('update', async () => {
|
|
134
|
+
const value = await client.getJSON(key, defaultValue);
|
|
135
|
+
set(value);
|
|
136
|
+
});
|
|
137
|
+
return unsubscribe;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Store for all toggles
|
|
142
|
+
*/
|
|
143
|
+
function toggles() {
|
|
144
|
+
const client = getTogglelyClient();
|
|
145
|
+
return store.readable({}, (set) => {
|
|
146
|
+
set(client.getAllToggles());
|
|
147
|
+
const unsubscribe = client.on('update', () => {
|
|
148
|
+
set(client.getAllToggles());
|
|
149
|
+
});
|
|
150
|
+
return unsubscribe;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Derived store that returns true when toggles are ready
|
|
155
|
+
*/
|
|
156
|
+
function togglelyReady() {
|
|
157
|
+
return store.derived(togglelyState(), $state => $state.isReady);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Derived store that returns true when in offline mode
|
|
161
|
+
*/
|
|
162
|
+
function togglelyOffline() {
|
|
163
|
+
return store.derived(togglelyState(), $state => $state.isOffline);
|
|
164
|
+
}
|
|
165
|
+
// ==================== Context ====================
|
|
166
|
+
/**
|
|
167
|
+
* Set context for toggle evaluation
|
|
168
|
+
*/
|
|
169
|
+
function setTogglelyContext(context) {
|
|
170
|
+
const client = getTogglelyClient();
|
|
171
|
+
client.setContext(context);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get current context
|
|
175
|
+
*/
|
|
176
|
+
function getTogglelyContext() {
|
|
177
|
+
const client = getTogglelyClient();
|
|
178
|
+
return client.getContext();
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Clear context
|
|
182
|
+
*/
|
|
183
|
+
function clearTogglelyContext() {
|
|
184
|
+
const client = getTogglelyClient();
|
|
185
|
+
client.clearContext();
|
|
186
|
+
}
|
|
187
|
+
// ==================== Components (Svelte 5 Runes Support) ====================
|
|
188
|
+
/**
|
|
189
|
+
* Creates a reactive toggle value using Svelte 5 runes
|
|
190
|
+
* For Svelte 5+ users
|
|
191
|
+
*/
|
|
192
|
+
function createToggle(key, defaultValue = false) {
|
|
193
|
+
const client = getTogglelyClient();
|
|
194
|
+
// This is a placeholder for Svelte 5 runes syntax
|
|
195
|
+
// Users would use: let enabled = $state(createToggle('feature'))
|
|
196
|
+
let value = defaultValue;
|
|
197
|
+
client.isEnabled(key, defaultValue).then(v => { value = v; });
|
|
198
|
+
client.on('update', async () => {
|
|
199
|
+
value = await client.isEnabled(key, defaultValue);
|
|
200
|
+
});
|
|
201
|
+
// Cleanup would need to be handled by the component
|
|
202
|
+
return {
|
|
203
|
+
get value() { return value; }
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
// ==================== Action ====================
|
|
207
|
+
/**
|
|
208
|
+
* Svelte action to show/hide elements based on a feature toggle
|
|
209
|
+
*
|
|
210
|
+
* Usage:
|
|
211
|
+
* ```svelte
|
|
212
|
+
* <div use:featureToggle={'new-feature'}>
|
|
213
|
+
* This is only visible when 'new-feature' is enabled
|
|
214
|
+
* </div>
|
|
215
|
+
* ```
|
|
216
|
+
*/
|
|
217
|
+
function featureToggle(node, key) {
|
|
218
|
+
const client = getTogglelyClient();
|
|
219
|
+
let currentKey = key;
|
|
220
|
+
async function updateVisibility() {
|
|
221
|
+
const isEnabled = await client.isEnabled(currentKey, false);
|
|
222
|
+
node.style.display = isEnabled ? '' : 'none';
|
|
223
|
+
}
|
|
224
|
+
updateVisibility();
|
|
225
|
+
const unsubscribe = client.on('update', updateVisibility);
|
|
226
|
+
return {
|
|
227
|
+
destroy() {
|
|
228
|
+
unsubscribe();
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
Object.defineProperty(exports, "TogglelyClient", {
|
|
234
|
+
enumerable: true,
|
|
235
|
+
get: function () { return sdkCore.TogglelyClient; }
|
|
236
|
+
});
|
|
237
|
+
Object.defineProperty(exports, "createOfflineTogglesScript", {
|
|
238
|
+
enumerable: true,
|
|
239
|
+
get: function () { return sdkCore.createOfflineTogglesScript; }
|
|
240
|
+
});
|
|
241
|
+
Object.defineProperty(exports, "togglesToEnvVars", {
|
|
242
|
+
enumerable: true,
|
|
243
|
+
get: function () { return sdkCore.togglesToEnvVars; }
|
|
244
|
+
});
|
|
245
|
+
exports.clearTogglelyContext = clearTogglelyContext;
|
|
246
|
+
exports.createToggle = createToggle;
|
|
247
|
+
exports.destroyTogglely = destroyTogglely;
|
|
248
|
+
exports.featureToggle = featureToggle;
|
|
249
|
+
exports.getTogglelyClient = getTogglelyClient;
|
|
250
|
+
exports.getTogglelyContext = getTogglelyContext;
|
|
251
|
+
exports.initTogglely = initTogglely;
|
|
252
|
+
exports.jsonToggle = jsonToggle;
|
|
253
|
+
exports.numberToggle = numberToggle;
|
|
254
|
+
exports.setTogglelyContext = setTogglelyContext;
|
|
255
|
+
exports.stringToggle = stringToggle;
|
|
256
|
+
exports.toggle = toggle;
|
|
257
|
+
exports.togglelyOffline = togglelyOffline;
|
|
258
|
+
exports.togglelyReady = togglelyReady;
|
|
259
|
+
exports.togglelyState = togglelyState;
|
|
260
|
+
exports.toggles = toggles;
|
|
261
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":["TogglelyClient","readable","derived"],"mappings":"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"}
|