@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.
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@togglely/sdk-svelte",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "Svelte SDK for Togglely - Feature toggles with stores",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",