@togglely/sdk-svelte 1.1.2 → 1.2.0
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 +182 -39
- package/package.json +36 -36
package/README.md
CHANGED
|
@@ -1,6 +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
|
+
|
|
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
|
|
4
12
|
|
|
5
13
|
## Installation
|
|
6
14
|
|
|
@@ -8,109 +16,147 @@ Svelte SDK for Togglely - Feature toggles with stores.
|
|
|
8
16
|
npm install @togglely/sdk-svelte
|
|
9
17
|
```
|
|
10
18
|
|
|
11
|
-
##
|
|
12
|
-
|
|
13
|
-
### Initialize
|
|
19
|
+
## Quick Start
|
|
14
20
|
|
|
15
21
|
```svelte
|
|
22
|
+
<!-- App.svelte -->
|
|
16
23
|
<script>
|
|
17
|
-
import { initTogglely } from '@togglely/sdk-svelte';
|
|
24
|
+
import { initTogglely, toggle } from '@togglely/sdk-svelte';
|
|
18
25
|
|
|
26
|
+
// Initialize once (usually in your root layout)
|
|
19
27
|
initTogglely({
|
|
20
28
|
apiKey: 'your-api-key',
|
|
29
|
+
project: 'my-project',
|
|
21
30
|
environment: 'production',
|
|
22
|
-
baseUrl: 'https://
|
|
31
|
+
baseUrl: 'https://togglely.io',
|
|
23
32
|
});
|
|
33
|
+
|
|
34
|
+
// Use the store
|
|
35
|
+
const isEnabled = toggle('new-feature', false);
|
|
24
36
|
</script>
|
|
37
|
+
|
|
38
|
+
{#if $isEnabled}
|
|
39
|
+
<NewFeature />
|
|
40
|
+
{:else}
|
|
41
|
+
<OldFeature />
|
|
42
|
+
{/if}
|
|
25
43
|
```
|
|
26
44
|
|
|
27
|
-
|
|
45
|
+
## Initialization
|
|
28
46
|
|
|
29
|
-
|
|
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();
|
|
65
|
+
```
|
|
30
66
|
|
|
31
|
-
|
|
67
|
+
## Stores
|
|
68
|
+
|
|
69
|
+
### toggle
|
|
70
|
+
|
|
71
|
+
Boolean toggle store:
|
|
32
72
|
|
|
33
73
|
```svelte
|
|
34
74
|
<script>
|
|
35
75
|
import { toggle } from '@togglely/sdk-svelte';
|
|
36
|
-
|
|
37
76
|
const isEnabled = toggle('new-feature', false);
|
|
38
77
|
</script>
|
|
39
78
|
|
|
40
79
|
{#if $isEnabled}
|
|
41
|
-
<
|
|
42
|
-
{:else}
|
|
43
|
-
<OldFeature />
|
|
80
|
+
<div>New Feature!</div>
|
|
44
81
|
{/if}
|
|
45
82
|
```
|
|
46
83
|
|
|
47
|
-
|
|
84
|
+
### stringToggle
|
|
48
85
|
|
|
49
|
-
|
|
86
|
+
String toggle store:
|
|
50
87
|
|
|
51
88
|
```svelte
|
|
52
89
|
<script>
|
|
53
|
-
|
|
90
|
+
import { stringToggle } from '@togglely/sdk-svelte';
|
|
91
|
+
const message = stringToggle('welcome-message', 'Hello!');
|
|
54
92
|
</script>
|
|
55
93
|
|
|
56
|
-
<
|
|
94
|
+
<h1>{$message}</h1>
|
|
57
95
|
```
|
|
58
96
|
|
|
59
|
-
|
|
97
|
+
### numberToggle
|
|
60
98
|
|
|
61
|
-
|
|
99
|
+
Number toggle store:
|
|
62
100
|
|
|
63
101
|
```svelte
|
|
64
102
|
<script>
|
|
103
|
+
import { numberToggle } from '@togglely/sdk-svelte';
|
|
65
104
|
const limit = numberToggle('max-items', 10);
|
|
66
105
|
</script>
|
|
67
106
|
|
|
68
107
|
<p>Max items: {$limit}</p>
|
|
69
108
|
```
|
|
70
109
|
|
|
71
|
-
|
|
110
|
+
### jsonToggle
|
|
72
111
|
|
|
73
|
-
|
|
112
|
+
JSON toggle store:
|
|
74
113
|
|
|
75
114
|
```svelte
|
|
76
115
|
<script>
|
|
77
|
-
|
|
116
|
+
import { jsonToggle } from '@togglely/sdk-svelte';
|
|
117
|
+
const config = jsonToggle('app-config', { theme: 'dark' });
|
|
78
118
|
</script>
|
|
79
119
|
|
|
80
|
-
<
|
|
120
|
+
<div data-theme={$config.theme}>
|
|
121
|
+
Content
|
|
122
|
+
</div>
|
|
81
123
|
```
|
|
82
124
|
|
|
83
|
-
|
|
125
|
+
### toggles
|
|
84
126
|
|
|
85
|
-
|
|
127
|
+
All toggles store:
|
|
86
128
|
|
|
87
129
|
```svelte
|
|
88
130
|
<script>
|
|
89
|
-
|
|
131
|
+
import { toggles } from '@togglely/sdk-svelte';
|
|
132
|
+
const all = toggles();
|
|
90
133
|
</script>
|
|
91
134
|
|
|
92
|
-
{#each Object.entries($
|
|
93
|
-
<p>{key}: {toggle.
|
|
135
|
+
{#each Object.entries($all) as [key, toggle]}
|
|
136
|
+
<p>{key}: {toggle.enabled ? 'ON' : 'OFF'}</p>
|
|
94
137
|
{/each}
|
|
95
138
|
```
|
|
96
139
|
|
|
97
|
-
|
|
140
|
+
### togglelyState
|
|
98
141
|
|
|
99
|
-
|
|
142
|
+
SDK state store:
|
|
100
143
|
|
|
101
144
|
```svelte
|
|
102
145
|
<script>
|
|
146
|
+
import { togglelyState } from '@togglely/sdk-svelte';
|
|
103
147
|
const state = togglelyState();
|
|
104
148
|
</script>
|
|
105
149
|
|
|
106
|
-
{#if
|
|
107
|
-
<p>
|
|
150
|
+
{#if !$state.isReady}
|
|
151
|
+
<p>Loading...</p>
|
|
152
|
+
{:else if $state.isOffline}
|
|
153
|
+
<p>Offline mode</p>
|
|
108
154
|
{/if}
|
|
109
155
|
```
|
|
110
156
|
|
|
111
|
-
|
|
157
|
+
## Actions
|
|
112
158
|
|
|
113
|
-
|
|
159
|
+
### featureToggle
|
|
114
160
|
|
|
115
161
|
```svelte
|
|
116
162
|
<script>
|
|
@@ -118,16 +164,113 @@ Use the `featureToggle` action to show/hide elements:
|
|
|
118
164
|
</script>
|
|
119
165
|
|
|
120
166
|
<div use:featureToggle={'new-feature'}>
|
|
121
|
-
Only visible when
|
|
167
|
+
Only visible when enabled
|
|
122
168
|
</div>
|
|
123
169
|
```
|
|
124
170
|
|
|
125
|
-
|
|
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:
|
|
126
245
|
|
|
127
246
|
```svelte
|
|
247
|
+
<!-- FeatureToggle.svelte -->
|
|
128
248
|
<script>
|
|
129
|
-
import {
|
|
249
|
+
import { toggle } from '@togglely/sdk-svelte';
|
|
250
|
+
|
|
251
|
+
export let name;
|
|
252
|
+
export let defaultValue = false;
|
|
130
253
|
|
|
131
|
-
|
|
254
|
+
const isEnabled = toggle(name, defaultValue);
|
|
132
255
|
</script>
|
|
256
|
+
|
|
257
|
+
{#if $isEnabled}
|
|
258
|
+
<slot />
|
|
259
|
+
{:else}
|
|
260
|
+
<slot name="fallback" />
|
|
261
|
+
{/if}
|
|
133
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.
|
|
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.0",
|
|
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
|
}
|