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