@togglely/sdk-svelte 1.1.7 → 1.2.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 +181 -40
- package/package.json +36 -36
package/README.md
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Togglely Svelte SDK
|
|
2
2
|
|
|
3
|
-
Svelte
|
|
3
|
+
Svelte stores and actions for [Togglely](https://togglely.io) feature flag management.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🎣 **Svelte Stores** - `toggle`, `stringToggle`, `numberToggle`, `jsonToggle`
|
|
8
|
+
- 🎯 **Actions** - `use:featureToggle` for declarative UI
|
|
9
|
+
- 💾 **Offline Support** - Built-in offline fallback
|
|
10
|
+
- 🔒 **TypeScript** - Full type safety
|
|
11
|
+
- ⚡ **Reactive** - Automatic updates with Svelte's reactivity
|
|
6
12
|
|
|
7
13
|
## Installation
|
|
8
14
|
|
|
@@ -10,109 +16,147 @@ No automatic polling - manual refresh or use WebSockets for real-time updates.
|
|
|
10
16
|
npm install @togglely/sdk-svelte
|
|
11
17
|
```
|
|
12
18
|
|
|
13
|
-
##
|
|
14
|
-
|
|
15
|
-
### Initialize
|
|
19
|
+
## Quick Start
|
|
16
20
|
|
|
17
21
|
```svelte
|
|
22
|
+
<!-- App.svelte -->
|
|
18
23
|
<script>
|
|
19
|
-
import { initTogglely } from '@togglely/sdk-svelte';
|
|
24
|
+
import { initTogglely, toggle } from '@togglely/sdk-svelte';
|
|
20
25
|
|
|
26
|
+
// Initialize once (usually in your root layout)
|
|
21
27
|
initTogglely({
|
|
22
28
|
apiKey: 'your-api-key',
|
|
29
|
+
project: 'my-project',
|
|
23
30
|
environment: 'production',
|
|
24
|
-
baseUrl: 'https://
|
|
31
|
+
baseUrl: 'https://togglely.io',
|
|
25
32
|
});
|
|
33
|
+
|
|
34
|
+
// Use the store
|
|
35
|
+
const isEnabled = toggle('new-feature', false);
|
|
26
36
|
</script>
|
|
37
|
+
|
|
38
|
+
{#if $isEnabled}
|
|
39
|
+
<NewFeature />
|
|
40
|
+
{:else}
|
|
41
|
+
<OldFeature />
|
|
42
|
+
{/if}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Initialization
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
import { initTogglely, getTogglelyClient, destroyTogglely } from '@togglely/sdk-svelte';
|
|
49
|
+
|
|
50
|
+
// Initialize
|
|
51
|
+
initTogglely({
|
|
52
|
+
apiKey: 'your-api-key',
|
|
53
|
+
project: 'my-project',
|
|
54
|
+
environment: 'production',
|
|
55
|
+
baseUrl: 'https://togglely.io',
|
|
56
|
+
tenantId: 'brand-a', // For multi-brand projects
|
|
57
|
+
offlineJsonPath: '/toggles.json', // Offline fallback
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// Access client directly
|
|
61
|
+
const client = getTogglelyClient();
|
|
62
|
+
|
|
63
|
+
// Cleanup on app destroy
|
|
64
|
+
destroyTogglely();
|
|
27
65
|
```
|
|
28
66
|
|
|
29
|
-
|
|
67
|
+
## Stores
|
|
30
68
|
|
|
31
|
-
|
|
69
|
+
### toggle
|
|
32
70
|
|
|
33
|
-
|
|
71
|
+
Boolean toggle store:
|
|
34
72
|
|
|
35
73
|
```svelte
|
|
36
74
|
<script>
|
|
37
75
|
import { toggle } from '@togglely/sdk-svelte';
|
|
38
|
-
|
|
39
76
|
const isEnabled = toggle('new-feature', false);
|
|
40
77
|
</script>
|
|
41
78
|
|
|
42
79
|
{#if $isEnabled}
|
|
43
|
-
<
|
|
44
|
-
{:else}
|
|
45
|
-
<OldFeature />
|
|
80
|
+
<div>New Feature!</div>
|
|
46
81
|
{/if}
|
|
47
82
|
```
|
|
48
83
|
|
|
49
|
-
|
|
84
|
+
### stringToggle
|
|
50
85
|
|
|
51
|
-
|
|
86
|
+
String toggle store:
|
|
52
87
|
|
|
53
88
|
```svelte
|
|
54
89
|
<script>
|
|
55
|
-
|
|
90
|
+
import { stringToggle } from '@togglely/sdk-svelte';
|
|
91
|
+
const message = stringToggle('welcome-message', 'Hello!');
|
|
56
92
|
</script>
|
|
57
93
|
|
|
58
|
-
<
|
|
94
|
+
<h1>{$message}</h1>
|
|
59
95
|
```
|
|
60
96
|
|
|
61
|
-
|
|
97
|
+
### numberToggle
|
|
62
98
|
|
|
63
|
-
|
|
99
|
+
Number toggle store:
|
|
64
100
|
|
|
65
101
|
```svelte
|
|
66
102
|
<script>
|
|
103
|
+
import { numberToggle } from '@togglely/sdk-svelte';
|
|
67
104
|
const limit = numberToggle('max-items', 10);
|
|
68
105
|
</script>
|
|
69
106
|
|
|
70
107
|
<p>Max items: {$limit}</p>
|
|
71
108
|
```
|
|
72
109
|
|
|
73
|
-
|
|
110
|
+
### jsonToggle
|
|
74
111
|
|
|
75
|
-
|
|
112
|
+
JSON toggle store:
|
|
76
113
|
|
|
77
114
|
```svelte
|
|
78
115
|
<script>
|
|
79
|
-
|
|
116
|
+
import { jsonToggle } from '@togglely/sdk-svelte';
|
|
117
|
+
const config = jsonToggle('app-config', { theme: 'dark' });
|
|
80
118
|
</script>
|
|
81
119
|
|
|
82
|
-
<
|
|
120
|
+
<div data-theme={$config.theme}>
|
|
121
|
+
Content
|
|
122
|
+
</div>
|
|
83
123
|
```
|
|
84
124
|
|
|
85
|
-
|
|
125
|
+
### toggles
|
|
86
126
|
|
|
87
|
-
|
|
127
|
+
All toggles store:
|
|
88
128
|
|
|
89
129
|
```svelte
|
|
90
130
|
<script>
|
|
91
|
-
|
|
131
|
+
import { toggles } from '@togglely/sdk-svelte';
|
|
132
|
+
const all = toggles();
|
|
92
133
|
</script>
|
|
93
134
|
|
|
94
|
-
{#each Object.entries($
|
|
95
|
-
<p>{key}: {toggle.
|
|
135
|
+
{#each Object.entries($all) as [key, toggle]}
|
|
136
|
+
<p>{key}: {toggle.enabled ? 'ON' : 'OFF'}</p>
|
|
96
137
|
{/each}
|
|
97
138
|
```
|
|
98
139
|
|
|
99
|
-
|
|
140
|
+
### togglelyState
|
|
100
141
|
|
|
101
|
-
|
|
142
|
+
SDK state store:
|
|
102
143
|
|
|
103
144
|
```svelte
|
|
104
145
|
<script>
|
|
146
|
+
import { togglelyState } from '@togglely/sdk-svelte';
|
|
105
147
|
const state = togglelyState();
|
|
106
148
|
</script>
|
|
107
149
|
|
|
108
|
-
{#if
|
|
109
|
-
<p>
|
|
150
|
+
{#if !$state.isReady}
|
|
151
|
+
<p>Loading...</p>
|
|
152
|
+
{:else if $state.isOffline}
|
|
153
|
+
<p>Offline mode</p>
|
|
110
154
|
{/if}
|
|
111
155
|
```
|
|
112
156
|
|
|
113
|
-
|
|
157
|
+
## Actions
|
|
114
158
|
|
|
115
|
-
|
|
159
|
+
### featureToggle
|
|
116
160
|
|
|
117
161
|
```svelte
|
|
118
162
|
<script>
|
|
@@ -120,16 +164,113 @@ Use the `featureToggle` action to show/hide elements:
|
|
|
120
164
|
</script>
|
|
121
165
|
|
|
122
166
|
<div use:featureToggle={'new-feature'}>
|
|
123
|
-
Only visible when
|
|
167
|
+
Only visible when enabled
|
|
124
168
|
</div>
|
|
125
169
|
```
|
|
126
170
|
|
|
127
|
-
|
|
171
|
+
## Context
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
import { setTogglelyContext, getTogglelyContext, clearTogglelyContext } from '@togglely/sdk-svelte';
|
|
175
|
+
|
|
176
|
+
// Set targeting context
|
|
177
|
+
setTogglelyContext({ userId: '123', country: 'DE' });
|
|
178
|
+
|
|
179
|
+
// Get current context
|
|
180
|
+
const context = getTogglelyContext();
|
|
181
|
+
|
|
182
|
+
// Clear context
|
|
183
|
+
clearTogglelyContext();
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## SSR (SvelteKit)
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
// src/lib/togglely.ts
|
|
190
|
+
import { initTogglely } from '@togglely/sdk-svelte';
|
|
191
|
+
|
|
192
|
+
export function loadTogglely() {
|
|
193
|
+
initTogglely({
|
|
194
|
+
apiKey: import.meta.env.VITE_TOGGLELY_APIKEY,
|
|
195
|
+
project: 'my-project',
|
|
196
|
+
environment: 'production',
|
|
197
|
+
baseUrl: 'https://togglely.io',
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
```svelte
|
|
203
|
+
<!-- src/routes/+layout.svelte -->
|
|
204
|
+
<script>
|
|
205
|
+
import { browser } from '$app/environment';
|
|
206
|
+
import { initTogglely } from '@togglely/sdk-svelte';
|
|
207
|
+
|
|
208
|
+
if (browser) {
|
|
209
|
+
initTogglely({
|
|
210
|
+
apiKey: import.meta.env.VITE_TOGGLELY_APIKEY,
|
|
211
|
+
project: 'my-project',
|
|
212
|
+
environment: 'production',
|
|
213
|
+
baseUrl: 'https://togglely.io',
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
</script>
|
|
217
|
+
|
|
218
|
+
<slot />
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Build-Time JSON Generation
|
|
222
|
+
|
|
223
|
+
```json
|
|
224
|
+
{
|
|
225
|
+
"scripts": {
|
|
226
|
+
"build": "togglely-pull --apiKey=$TOGGLELY_APIKEY --project=my-project --environment=production --output=./static/toggles.json && vite build"
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
```typescript
|
|
232
|
+
// app.ts
|
|
233
|
+
initTogglely({
|
|
234
|
+
apiKey: 'your-api-key',
|
|
235
|
+
project: 'my-project',
|
|
236
|
+
environment: 'production',
|
|
237
|
+
baseUrl: 'https://togglely.io',
|
|
238
|
+
offlineJsonPath: '/toggles.json',
|
|
239
|
+
});
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## FeatureToggle Component Example
|
|
243
|
+
|
|
244
|
+
Create your own wrapper component:
|
|
128
245
|
|
|
129
246
|
```svelte
|
|
247
|
+
<!-- FeatureToggle.svelte -->
|
|
130
248
|
<script>
|
|
131
|
-
import {
|
|
249
|
+
import { toggle } from '@togglely/sdk-svelte';
|
|
250
|
+
|
|
251
|
+
export let name;
|
|
252
|
+
export let defaultValue = false;
|
|
132
253
|
|
|
133
|
-
|
|
254
|
+
const isEnabled = toggle(name, defaultValue);
|
|
134
255
|
</script>
|
|
256
|
+
|
|
257
|
+
{#if $isEnabled}
|
|
258
|
+
<slot />
|
|
259
|
+
{:else}
|
|
260
|
+
<slot name="fallback" />
|
|
261
|
+
{/if}
|
|
135
262
|
```
|
|
263
|
+
|
|
264
|
+
```svelte
|
|
265
|
+
<!-- Usage -->
|
|
266
|
+
<FeatureToggle name="new-feature">
|
|
267
|
+
<NewVersion />
|
|
268
|
+
<svelte:fragment slot="fallback">
|
|
269
|
+
<OldVersion />
|
|
270
|
+
</svelte:fragment>
|
|
271
|
+
</FeatureToggle>
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## License
|
|
275
|
+
|
|
276
|
+
MIT
|
package/package.json
CHANGED
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@togglely/sdk-svelte",
|
|
3
|
-
"version": "1.1
|
|
4
|
-
"description": "Svelte SDK for Togglely - Feature toggles with stores",
|
|
5
|
-
"main": "dist/index.js",
|
|
6
|
-
"module": "dist/index.esm.js",
|
|
7
|
-
"types": "dist/index.d.ts",
|
|
8
|
-
"svelte": "dist/index.js",
|
|
9
|
-
"files": [
|
|
10
|
-
"dist"
|
|
11
|
-
],
|
|
12
|
-
"scripts": {
|
|
13
|
-
"build": "tsc && rollup -c",
|
|
14
|
-
"test": "jest"
|
|
15
|
-
},
|
|
16
|
-
"keywords": [
|
|
17
|
-
"feature-flags",
|
|
18
|
-
"feature-toggles",
|
|
19
|
-
"togglely",
|
|
20
|
-
"svelte",
|
|
21
|
-
"stores"
|
|
22
|
-
],
|
|
23
|
-
"author": "Togglely",
|
|
24
|
-
"license": "MIT",
|
|
25
|
-
"peerDependencies": {
|
|
26
|
-
"svelte": "^3.0.0 || ^4.0.0 || ^5.0.0"
|
|
27
|
-
},
|
|
28
|
-
"dependencies": {
|
|
29
|
-
"@togglely/sdk-core": "^1.0.0"
|
|
30
|
-
},
|
|
31
|
-
"devDependencies": {
|
|
32
|
-
"@rollup/plugin-typescript": "^11.1.5",
|
|
33
|
-
"rollup": "^4.9.1",
|
|
34
|
-
"tslib": "^2.6.2",
|
|
35
|
-
"typescript": "^5.3.3"
|
|
36
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@togglely/sdk-svelte",
|
|
3
|
+
"version": "1.2.1",
|
|
4
|
+
"description": "Svelte SDK for Togglely - Feature toggles with stores",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.esm.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"svelte": "dist/index.js",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc && rollup -c",
|
|
14
|
+
"test": "jest"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"feature-flags",
|
|
18
|
+
"feature-toggles",
|
|
19
|
+
"togglely",
|
|
20
|
+
"svelte",
|
|
21
|
+
"stores"
|
|
22
|
+
],
|
|
23
|
+
"author": "Togglely",
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"svelte": "^3.0.0 || ^4.0.0 || ^5.0.0"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@togglely/sdk-core": "^1.0.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@rollup/plugin-typescript": "^11.1.5",
|
|
33
|
+
"rollup": "^4.9.1",
|
|
34
|
+
"tslib": "^2.6.2",
|
|
35
|
+
"typescript": "^5.3.3"
|
|
36
|
+
}
|
|
37
37
|
}
|