@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.
Files changed (2) hide show
  1. package/README.md +182 -39
  2. package/package.json +36 -36
package/README.md CHANGED
@@ -1,6 +1,14 @@
1
- # @togglely/sdk-svelte
1
+ # Togglely Svelte SDK
2
2
 
3
- Svelte SDK for Togglely - Feature toggles with stores.
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
- ## Usage
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://your-togglely-instance.com'
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
- ### Stores
45
+ ## Initialization
28
46
 
29
- #### `toggle(key, defaultValue)`
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
- Check if a boolean feature toggle is enabled:
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
- <NewFeature />
42
- {:else}
43
- <OldFeature />
80
+ <div>New Feature!</div>
44
81
  {/if}
45
82
  ```
46
83
 
47
- #### `stringToggle(key, defaultValue)`
84
+ ### stringToggle
48
85
 
49
- Get a string toggle value:
86
+ String toggle store:
50
87
 
51
88
  ```svelte
52
89
  <script>
53
- const message = stringToggle('welcome-message', 'Hello');
90
+ import { stringToggle } from '@togglely/sdk-svelte';
91
+ const message = stringToggle('welcome-message', 'Hello!');
54
92
  </script>
55
93
 
56
- <p>{$message}</p>
94
+ <h1>{$message}</h1>
57
95
  ```
58
96
 
59
- #### `numberToggle(key, defaultValue)`
97
+ ### numberToggle
60
98
 
61
- Get a number toggle value:
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
- #### `jsonToggle(key, defaultValue)`
110
+ ### jsonToggle
72
111
 
73
- Get a JSON toggle value:
112
+ JSON toggle store:
74
113
 
75
114
  ```svelte
76
115
  <script>
77
- const config = jsonToggle('app-config', { theme: 'light' });
116
+ import { jsonToggle } from '@togglely/sdk-svelte';
117
+ const config = jsonToggle('app-config', { theme: 'dark' });
78
118
  </script>
79
119
 
80
- <p>Theme: {$config.theme}</p>
120
+ <div data-theme={$config.theme}>
121
+ Content
122
+ </div>
81
123
  ```
82
124
 
83
- #### `toggles()`
125
+ ### toggles
84
126
 
85
- Get all toggles:
127
+ All toggles store:
86
128
 
87
129
  ```svelte
88
130
  <script>
89
- const allToggles = toggles();
131
+ import { toggles } from '@togglely/sdk-svelte';
132
+ const all = toggles();
90
133
  </script>
91
134
 
92
- {#each Object.entries($allToggles) as [key, toggle]}
93
- <p>{key}: {toggle.value}</p>
135
+ {#each Object.entries($all) as [key, toggle]}
136
+ <p>{key}: {toggle.enabled ? 'ON' : 'OFF'}</p>
94
137
  {/each}
95
138
  ```
96
139
 
97
- #### `togglelyState()`
140
+ ### togglelyState
98
141
 
99
- Get the SDK state:
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 $state.isOffline}
107
- <p>Using offline mode</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
- ### Action
157
+ ## Actions
112
158
 
113
- Use the `featureToggle` action to show/hide elements:
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 toggle is enabled
167
+ Only visible when enabled
122
168
  </div>
123
169
  ```
124
170
 
125
- ### Context
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 { setTogglelyContext } from '@togglely/sdk-svelte';
249
+ import { toggle } from '@togglely/sdk-svelte';
250
+
251
+ export let name;
252
+ export let defaultValue = false;
130
253
 
131
- setTogglelyContext({ userId: '123', email: 'user@example.com' });
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.1.2",
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
  }