@ops-ai/toggly-docusaurus-plugin 0.2.0 → 0.4.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/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +24 -1
- package/dist/client/index.js.map +1 -1
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +142 -58
- package/dist/index.js.map +1 -1
- package/dist/lib/toggly-client.d.ts +10 -0
- package/dist/lib/toggly-client.d.ts.map +1 -1
- package/dist/lib/toggly-client.js +111 -3
- package/dist/lib/toggly-client.js.map +1 -1
- package/package.json +13 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAc,EAOZ,SAAS,EACV,MAAM,OAAO,CAAC;AACf,OAAO,EAAyC,KAAK,YAAY,EAAE,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE5G,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAID;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EAAE,cAAc,EACtB,QAAQ,GACT,EAAE,mBAAmB,GAAG,GAAG,CAAC,OAAO,CA4EnC;AAED;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,kBAAkB,CAM9C;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,OAAO,GACrB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAiBxC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,QAAQ,EAAE,SAAS,CAAC;IACpB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACrB;AAOD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,OAAO,CAAC,EACtB,IAAI,EACJ,QAAQ,EACR,QAAe,EACf,YAAoB,EACpB,EAAE,EAAE,OAAe,GACpB,EAAE,YAAY,GAAG,GAAG,CAAC,OAAO,CAyB5B"}
|
package/dist/client/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
|
4
4
|
*
|
|
5
5
|
* Provides React context, hooks, and components for feature flag evaluation
|
|
6
6
|
*/
|
|
7
|
-
import { createContext, useContext, useState, useEffect, } from 'react';
|
|
7
|
+
import { createContext, useContext, useState, useEffect, useRef, } from 'react';
|
|
8
8
|
import { createTogglyClient } from '../lib/toggly-client';
|
|
9
9
|
const TogglyContext = createContext(null);
|
|
10
10
|
/**
|
|
@@ -44,7 +44,11 @@ export function TogglyProvider({ config: providedConfig, children, }) {
|
|
|
44
44
|
const [flags, setFlags] = useState({});
|
|
45
45
|
const [isReady, setIsReady] = useState(false);
|
|
46
46
|
const [error, setError] = useState(null);
|
|
47
|
+
// Keep a ref to the latest flags so the polling interval can detect changes
|
|
48
|
+
const flagsRef = useRef(flags);
|
|
49
|
+
flagsRef.current = flags;
|
|
47
50
|
useEffect(() => {
|
|
51
|
+
let pollTimer = null;
|
|
48
52
|
// Initialize client and load flags
|
|
49
53
|
client
|
|
50
54
|
.getFlags()
|
|
@@ -56,6 +60,25 @@ export function TogglyProvider({ config: providedConfig, children, }) {
|
|
|
56
60
|
setError(err);
|
|
57
61
|
setIsReady(true); // Still mark as ready even on error
|
|
58
62
|
});
|
|
63
|
+
// Start WebSocket for live updates
|
|
64
|
+
client.startWebSocket();
|
|
65
|
+
// Poll periodically so React state picks up refreshes triggered by WebSocket
|
|
66
|
+
pollTimer = setInterval(() => {
|
|
67
|
+
client.getFlags().then((latest) => {
|
|
68
|
+
// Only update state when flags actually changed
|
|
69
|
+
if (JSON.stringify(latest) !== JSON.stringify(flagsRef.current)) {
|
|
70
|
+
setFlags(latest);
|
|
71
|
+
}
|
|
72
|
+
}).catch(() => {
|
|
73
|
+
// Silently ignore polling errors
|
|
74
|
+
});
|
|
75
|
+
}, config.featureFlagsRefreshInterval ?? 3 * 60 * 1000);
|
|
76
|
+
return () => {
|
|
77
|
+
client.stopWebSocket();
|
|
78
|
+
if (pollTimer) {
|
|
79
|
+
clearInterval(pollTimer);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
59
82
|
}, [client]);
|
|
60
83
|
const getFlag = async (key, defaultValue) => {
|
|
61
84
|
return client.getFlag(key, defaultValue);
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAc,EACZ,aAAa,EACb,UAAU,EACV,QAAQ,EACR,SAAS,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,20 @@
|
|
|
5
5
|
* for gating documentation content with Toggly feature flags.
|
|
6
6
|
*/
|
|
7
7
|
import type { Plugin, LoadContext } from '@docusaurus/types';
|
|
8
|
+
/**
|
|
9
|
+
* A docs-style content directory that the plugin should scan for x-feature frontmatter.
|
|
10
|
+
*
|
|
11
|
+
* Mirrors @docusaurus/plugin-content-docs's `path` and `routeBasePath` options.
|
|
12
|
+
* Use this when your site has multiple plugin-content-docs instances
|
|
13
|
+
* (e.g. `docs/`, `sdks/`, `guides/`) — by default the plugin auto-detects them
|
|
14
|
+
* from `siteConfig.plugins`, but you can override the discovery here.
|
|
15
|
+
*/
|
|
16
|
+
export interface TogglyContentRoot {
|
|
17
|
+
/** Directory (relative to siteDir) containing MD/MDX files. */
|
|
18
|
+
path: string;
|
|
19
|
+
/** URL prefix for routes generated from this directory (no leading/trailing slash needed). */
|
|
20
|
+
routeBasePath: string;
|
|
21
|
+
}
|
|
8
22
|
export interface TogglyPluginOptions {
|
|
9
23
|
/** Base URI for the Toggly API (default: 'https://client.toggly.io') */
|
|
10
24
|
baseURI?: string;
|
|
@@ -34,11 +48,45 @@ export interface TogglyPluginOptions {
|
|
|
34
48
|
* (default: true)
|
|
35
49
|
*/
|
|
36
50
|
renderAllDuringBuild?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Explicit list of docs-style content directories to scan. When omitted,
|
|
53
|
+
* the plugin auto-detects content-docs plugin instances from `siteConfig.plugins`
|
|
54
|
+
* and always includes the classic preset's default `{ path: 'docs', routeBasePath: 'docs' }`.
|
|
55
|
+
* Set this to take full manual control of discovery.
|
|
56
|
+
*/
|
|
57
|
+
contentRoots?: TogglyContentRoot[];
|
|
37
58
|
}
|
|
38
59
|
/**
|
|
39
60
|
* Docusaurus plugin for Toggly feature flag gating
|
|
40
61
|
*/
|
|
41
62
|
export default function togglyPlugin(context: LoadContext, options: TogglyPluginOptions): Plugin;
|
|
63
|
+
/**
|
|
64
|
+
* Resolve the set of content roots the plugin should scan.
|
|
65
|
+
*
|
|
66
|
+
* Strategy:
|
|
67
|
+
* 1. If `contentRootsOverride` is provided, use it verbatim (caller knows best).
|
|
68
|
+
* 2. Otherwise, auto-detect by scanning `siteConfig.plugins` for
|
|
69
|
+
* `@docusaurus/plugin-content-docs` instances and reading each one's
|
|
70
|
+
* `path`/`routeBasePath` options. The classic preset's default
|
|
71
|
+
* `{ path: 'docs', routeBasePath: 'docs' }` is always included so existing
|
|
72
|
+
* sites keep working without configuration.
|
|
73
|
+
*
|
|
74
|
+
* Exported for testing.
|
|
75
|
+
*/
|
|
76
|
+
export declare function resolveContentRoots(context: LoadContext, contentRootsOverride?: TogglyContentRoot[]): TogglyContentRoot[];
|
|
77
|
+
/**
|
|
78
|
+
* Inspect `siteConfig.plugins` for plugin-content-docs instances and return
|
|
79
|
+
* their { path, routeBasePath } pairs. Plugin entries can be:
|
|
80
|
+
* - 'plugin-id' → no options
|
|
81
|
+
* - ['plugin-id', { path, routeBasePath }] → options inline
|
|
82
|
+
* - a function/object plugin → not introspectable, skip
|
|
83
|
+
*
|
|
84
|
+
* If a plugin omits `path` or `routeBasePath`, those default to 'docs'
|
|
85
|
+
* (matching @docusaurus/plugin-content-docs's own defaults).
|
|
86
|
+
*
|
|
87
|
+
* Exported for testing.
|
|
88
|
+
*/
|
|
89
|
+
export declare function discoverContentRootsFromConfig(context: LoadContext): TogglyContentRoot[];
|
|
42
90
|
export { TogglyProvider, useToggly, useFlag, Feature } from './client';
|
|
43
91
|
export type { TogglyProviderProps, TogglyContextValue, FeatureProps, } from './client';
|
|
44
92
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAA8B,MAAM,mBAAmB,CAAC;AAMzF,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,YAAY,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC1C,mFAAmF;IACnF,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;OAQG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAA8B,MAAM,mBAAmB,CAAC;AAMzF;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,YAAY,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC1C,mFAAmF;IACnF,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;OAQG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACpC;AAmBD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAClC,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,mBAAmB,GAC3B,MAAM,CAoLR;AAGD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,WAAW,EACpB,oBAAoB,CAAC,EAAE,iBAAiB,EAAE,GACzC,iBAAiB,EAAE,CAkBrB;AAoBD;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,WAAW,GAAG,iBAAiB,EAAE,CAsBxF;AAmGD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACvE,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,GACb,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ import webpack from 'webpack';
|
|
|
13
13
|
*/
|
|
14
14
|
export default function togglyPlugin(context, options) {
|
|
15
15
|
const { baseURI = 'https://client.toggly.io', appKey, environment = 'Production', flagDefaults = {}, featureFlagsRefreshInterval = 3 * 60 * 1000, isDebug = false, connectTimeout = 5 * 1000, identity, renderAllDuringBuild = true, // Default to true for better DX
|
|
16
|
-
|
|
16
|
+
contentRoots, } = options;
|
|
17
17
|
// Store page feature mapping for postBuild
|
|
18
18
|
let pageFeatureMapping = {};
|
|
19
19
|
return {
|
|
@@ -43,10 +43,18 @@ export default function togglyPlugin(context, options) {
|
|
|
43
43
|
async contentLoaded({ content, actions }) {
|
|
44
44
|
try {
|
|
45
45
|
const { config: pluginConfig } = content;
|
|
46
|
-
// Extract page feature mapping from files
|
|
47
|
-
// We parse files directly to get x-feature frontmatter
|
|
48
|
-
//
|
|
49
|
-
|
|
46
|
+
// Extract page feature mapping from files.
|
|
47
|
+
// We parse files directly to get x-feature frontmatter and map to
|
|
48
|
+
// routes using each content root's routeBasePath. Roots are either
|
|
49
|
+
// supplied explicitly via `contentRoots` or auto-detected from
|
|
50
|
+
// `siteConfig.plugins` (with the classic preset's `docs/` always included).
|
|
51
|
+
const roots = resolveContentRoots(context, contentRoots);
|
|
52
|
+
if (isDebug) {
|
|
53
|
+
console.log(`[Toggly Plugin] Scanning content roots: ${roots
|
|
54
|
+
.map(r => `${r.path} -> /${r.routeBasePath}`)
|
|
55
|
+
.join(', ')}`);
|
|
56
|
+
}
|
|
57
|
+
pageFeatureMapping = await extractFromFiles(context, roots);
|
|
50
58
|
// Store data for configureWebpack and postBuild
|
|
51
59
|
this.__togglyPluginData = {
|
|
52
60
|
pageFeatureMapping,
|
|
@@ -145,74 +153,150 @@ export default function togglyPlugin(context, options) {
|
|
|
145
153
|
};
|
|
146
154
|
}
|
|
147
155
|
/**
|
|
148
|
-
*
|
|
149
|
-
*
|
|
156
|
+
* Resolve the set of content roots the plugin should scan.
|
|
157
|
+
*
|
|
158
|
+
* Strategy:
|
|
159
|
+
* 1. If `contentRootsOverride` is provided, use it verbatim (caller knows best).
|
|
160
|
+
* 2. Otherwise, auto-detect by scanning `siteConfig.plugins` for
|
|
161
|
+
* `@docusaurus/plugin-content-docs` instances and reading each one's
|
|
162
|
+
* `path`/`routeBasePath` options. The classic preset's default
|
|
163
|
+
* `{ path: 'docs', routeBasePath: 'docs' }` is always included so existing
|
|
164
|
+
* sites keep working without configuration.
|
|
165
|
+
*
|
|
166
|
+
* Exported for testing.
|
|
150
167
|
*/
|
|
151
|
-
|
|
168
|
+
export function resolveContentRoots(context, contentRootsOverride) {
|
|
169
|
+
if (contentRootsOverride && contentRootsOverride.length > 0) {
|
|
170
|
+
return contentRootsOverride.map(normalizeContentRoot);
|
|
171
|
+
}
|
|
172
|
+
const discovered = discoverContentRootsFromConfig(context);
|
|
173
|
+
const roots = new Map();
|
|
174
|
+
// Always include the classic preset's docs root.
|
|
175
|
+
const fallback = normalizeContentRoot({ path: 'docs', routeBasePath: 'docs' });
|
|
176
|
+
roots.set(rootKey(fallback), fallback);
|
|
177
|
+
for (const root of discovered) {
|
|
178
|
+
const normalized = normalizeContentRoot(root);
|
|
179
|
+
roots.set(rootKey(normalized), normalized);
|
|
180
|
+
}
|
|
181
|
+
return Array.from(roots.values());
|
|
182
|
+
}
|
|
183
|
+
function normalizeContentRoot(root) {
|
|
184
|
+
const trimmedPath = root.path.replace(/^[/\\]+|[/\\]+$/g, '');
|
|
185
|
+
const trimmedRouteBasePath = root.routeBasePath.replace(/^\/+|\/+$/g, '');
|
|
186
|
+
return {
|
|
187
|
+
path: trimmedPath,
|
|
188
|
+
routeBasePath: trimmedRouteBasePath,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function rootKey(root) {
|
|
192
|
+
return `${root.path}|${root.routeBasePath}`;
|
|
193
|
+
}
|
|
194
|
+
const CONTENT_DOCS_PLUGIN_NAMES = new Set([
|
|
195
|
+
'@docusaurus/plugin-content-docs',
|
|
196
|
+
'plugin-content-docs',
|
|
197
|
+
]);
|
|
198
|
+
/**
|
|
199
|
+
* Inspect `siteConfig.plugins` for plugin-content-docs instances and return
|
|
200
|
+
* their { path, routeBasePath } pairs. Plugin entries can be:
|
|
201
|
+
* - 'plugin-id' → no options
|
|
202
|
+
* - ['plugin-id', { path, routeBasePath }] → options inline
|
|
203
|
+
* - a function/object plugin → not introspectable, skip
|
|
204
|
+
*
|
|
205
|
+
* If a plugin omits `path` or `routeBasePath`, those default to 'docs'
|
|
206
|
+
* (matching @docusaurus/plugin-content-docs's own defaults).
|
|
207
|
+
*
|
|
208
|
+
* Exported for testing.
|
|
209
|
+
*/
|
|
210
|
+
export function discoverContentRootsFromConfig(context) {
|
|
211
|
+
const result = [];
|
|
212
|
+
const plugins = (context.siteConfig?.plugins ?? []);
|
|
213
|
+
for (const entry of plugins) {
|
|
214
|
+
if (!Array.isArray(entry) || entry.length === 0) {
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const [name, opts] = entry;
|
|
218
|
+
if (typeof name !== 'string')
|
|
219
|
+
continue;
|
|
220
|
+
if (!CONTENT_DOCS_PLUGIN_NAMES.has(name))
|
|
221
|
+
continue;
|
|
222
|
+
const options = (opts && typeof opts === 'object' ? opts : {});
|
|
223
|
+
const pathValue = typeof options.path === 'string' ? options.path : 'docs';
|
|
224
|
+
const routeBasePathValue = typeof options.routeBasePath === 'string' ? options.routeBasePath : 'docs';
|
|
225
|
+
result.push({ path: pathValue, routeBasePath: routeBasePathValue });
|
|
226
|
+
}
|
|
227
|
+
return result;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Extract page feature mapping by parsing MD/MDX files in the given content roots.
|
|
231
|
+
* Maps file paths to Docusaurus route paths using each root's `routeBasePath`.
|
|
232
|
+
*/
|
|
233
|
+
async function extractFromFiles(context, roots) {
|
|
234
|
+
const pageFeatureMapping = {};
|
|
235
|
+
for (const root of roots) {
|
|
236
|
+
const rootMappings = await extractFromRoot(context, root);
|
|
237
|
+
Object.assign(pageFeatureMapping, rootMappings);
|
|
238
|
+
}
|
|
239
|
+
return pageFeatureMapping;
|
|
240
|
+
}
|
|
241
|
+
async function extractFromRoot(context, root) {
|
|
152
242
|
const { siteDir, baseUrl } = context;
|
|
153
|
-
const
|
|
243
|
+
const rootDir = path.isAbsolute(root.path)
|
|
244
|
+
? root.path
|
|
245
|
+
: path.join(siteDir, root.path);
|
|
154
246
|
const pageFeatureMapping = {};
|
|
155
|
-
|
|
156
|
-
if (!fs.existsSync(docsDir)) {
|
|
247
|
+
if (!fs.existsSync(rootDir)) {
|
|
157
248
|
return pageFeatureMapping;
|
|
158
249
|
}
|
|
159
|
-
// Find all MD/MDX files in the docs directory
|
|
160
250
|
const files = await glob('**/*.{md,mdx}', {
|
|
161
|
-
cwd:
|
|
251
|
+
cwd: rootDir,
|
|
162
252
|
absolute: false,
|
|
163
253
|
ignore: ['node_modules/**'],
|
|
164
254
|
});
|
|
165
255
|
const stripOrderPrefix = (seg) => seg.replace(/^\d+-/, '');
|
|
256
|
+
const normalizedRouteBase = root.routeBasePath; // already trimmed of slashes
|
|
166
257
|
for (const file of files) {
|
|
167
|
-
const filePath = path.join(
|
|
258
|
+
const filePath = path.join(rootDir, file);
|
|
168
259
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
169
|
-
// Extract frontmatter
|
|
170
260
|
const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---\s*\n/);
|
|
171
|
-
if (frontmatterMatch)
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
let routePath = normalized.replace(/\.(md|mdx)$/, '');
|
|
189
|
-
// Handle index files - they become the parent directory route
|
|
190
|
-
if (path.basename(routePath) === 'index') {
|
|
191
|
-
routePath = path.dirname(routePath);
|
|
192
|
-
if (routePath === '.') {
|
|
193
|
-
routePath = '';
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
// Ensure path starts with /
|
|
197
|
-
if (!routePath.startsWith('/')) {
|
|
198
|
-
routePath = '/' + routePath;
|
|
199
|
-
}
|
|
200
|
-
// Prepend /docs/ if not already there
|
|
201
|
-
if (!routePath.startsWith('/docs')) {
|
|
202
|
-
routePath = '/docs' + routePath;
|
|
203
|
-
}
|
|
204
|
-
// Remove trailing slash (except for root /docs)
|
|
205
|
-
routePath = routePath.replace(/\/$/, '') || '/docs';
|
|
206
|
-
// Prepend baseUrl if not root
|
|
207
|
-
// baseUrl is typically '/' but can be '/project-name/' for GitHub Pages
|
|
208
|
-
let fullRoutePath = routePath;
|
|
209
|
-
if (baseUrl !== '/') {
|
|
210
|
-
const normalizedBaseUrl = baseUrl.replace(/\/$/, '');
|
|
211
|
-
fullRoutePath = normalizedBaseUrl + routePath;
|
|
212
|
-
}
|
|
213
|
-
pageFeatureMapping[fullRoutePath] = featureKey;
|
|
261
|
+
if (!frontmatterMatch)
|
|
262
|
+
continue;
|
|
263
|
+
const xFeatureMatch = frontmatterMatch[1].match(/^x-feature:\s*(.+)$/m);
|
|
264
|
+
if (!xFeatureMatch)
|
|
265
|
+
continue;
|
|
266
|
+
const featureKey = xFeatureMatch[1].trim().replace(/^["']|["']$/g, '');
|
|
267
|
+
const normalized = file
|
|
268
|
+
.replace(/\\/g, '/')
|
|
269
|
+
.split('/')
|
|
270
|
+
.map(stripOrderPrefix)
|
|
271
|
+
.join('/');
|
|
272
|
+
let relativeRoute = normalized.replace(/\.(md|mdx)$/, '');
|
|
273
|
+
// Index files become the parent directory route
|
|
274
|
+
if (path.basename(relativeRoute) === 'index') {
|
|
275
|
+
relativeRoute = path.dirname(relativeRoute);
|
|
276
|
+
if (relativeRoute === '.') {
|
|
277
|
+
relativeRoute = '';
|
|
214
278
|
}
|
|
215
279
|
}
|
|
280
|
+
relativeRoute = relativeRoute.replace(/^\/+/, '');
|
|
281
|
+
let routePath;
|
|
282
|
+
if (normalizedRouteBase === '') {
|
|
283
|
+
// Root-level routes (routeBasePath: '/') — file paths map directly under '/'.
|
|
284
|
+
routePath = relativeRoute === '' ? '/' : `/${relativeRoute}`;
|
|
285
|
+
}
|
|
286
|
+
else if (relativeRoute === '') {
|
|
287
|
+
routePath = `/${normalizedRouteBase}`;
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
routePath = `/${normalizedRouteBase}/${relativeRoute}`;
|
|
291
|
+
}
|
|
292
|
+
routePath = routePath.replace(/\/+$/, '') || '/';
|
|
293
|
+
// Prepend baseUrl when the site is served from a subpath (e.g. GitHub Pages).
|
|
294
|
+
let fullRoutePath = routePath;
|
|
295
|
+
if (baseUrl && baseUrl !== '/') {
|
|
296
|
+
const normalizedBaseUrl = baseUrl.replace(/\/+$/, '');
|
|
297
|
+
fullRoutePath = routePath === '/' ? normalizedBaseUrl || '/' : normalizedBaseUrl + routePath;
|
|
298
|
+
}
|
|
299
|
+
pageFeatureMapping[fullRoutePath] = featureKey;
|
|
216
300
|
}
|
|
217
301
|
return pageFeatureMapping;
|
|
218
302
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,OAAO,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,6 +56,16 @@ export interface TogglyClient {
|
|
|
56
56
|
* @returns Promise that resolves when flags have been refreshed
|
|
57
57
|
*/
|
|
58
58
|
refreshFlags(): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Start a WebSocket connection for live flag updates.
|
|
61
|
+
* Only works in browser environments (requires window and WebSocket).
|
|
62
|
+
* Automatically reconnects on close with a 5-second delay.
|
|
63
|
+
*/
|
|
64
|
+
startWebSocket(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Stop the WebSocket connection and clean up reconnect timers.
|
|
67
|
+
*/
|
|
68
|
+
stopWebSocket(): void;
|
|
59
69
|
}
|
|
60
70
|
/**
|
|
61
71
|
* Creates a new Toggly client instance
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toggly-client.d.ts","sourceRoot":"","sources":["../../src/lib/toggly-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,YAAY,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC1C,mFAAmF;IACnF,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IAE3B;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/D;;;OAGG;IACH,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"toggly-client.d.ts","sourceRoot":"","sources":["../../src/lib/toggly-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,YAAY,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC1C,mFAAmF;IACnF,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IAE3B;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/D;;;OAGG;IACH,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9B;;;;OAIG;IACH,cAAc,IAAI,IAAI,CAAC;IAEvB;;OAEG;IACH,aAAa,IAAI,IAAI,CAAC;CACvB;AAOD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,YAAiB,GAAG,YAAY,CAqR1E"}
|
|
@@ -25,6 +25,13 @@ export function createTogglyClient(config = {}) {
|
|
|
25
25
|
else {
|
|
26
26
|
throw new Error('fetch is not available. Please provide a fetch implementation via config.fetch');
|
|
27
27
|
}
|
|
28
|
+
// WebSocket live-update support
|
|
29
|
+
const FALLBACK_REFRESH_INTERVAL = 20 * 60 * 1000; // 20 minutes
|
|
30
|
+
const WS_RECONNECT_DELAY = 5000; // 5 seconds
|
|
31
|
+
let _ws = null;
|
|
32
|
+
let _wsConnected = false;
|
|
33
|
+
let _wsReconnectTimer = null;
|
|
34
|
+
let _lastFallbackRefresh = 0;
|
|
28
35
|
let cache = null;
|
|
29
36
|
const getApiUrl = () => {
|
|
30
37
|
const baseUrl = baseURI.replace(/\/$/, ''); // Remove trailing slash
|
|
@@ -32,7 +39,7 @@ export function createTogglyClient(config = {}) {
|
|
|
32
39
|
if (!appKey) {
|
|
33
40
|
return '';
|
|
34
41
|
}
|
|
35
|
-
let url = `${baseUrl}/${appKey}
|
|
42
|
+
let url = `${baseUrl}/${appKey}/${environment}`;
|
|
36
43
|
// Add identity parameter if provided
|
|
37
44
|
if (identity) {
|
|
38
45
|
url += `?u=${identity}`;
|
|
@@ -43,7 +50,9 @@ export function createTogglyClient(config = {}) {
|
|
|
43
50
|
if (!cache)
|
|
44
51
|
return false;
|
|
45
52
|
const age = Date.now() - cache.timestamp;
|
|
46
|
-
|
|
53
|
+
// When WebSocket is connected, use a longer fallback interval for polling
|
|
54
|
+
const interval = _wsConnected ? FALLBACK_REFRESH_INTERVAL : featureFlagsRefreshInterval;
|
|
55
|
+
return age < interval;
|
|
47
56
|
};
|
|
48
57
|
const fetchFlags = async () => {
|
|
49
58
|
const url = getApiUrl();
|
|
@@ -68,7 +77,8 @@ export function createTogglyClient(config = {}) {
|
|
|
68
77
|
if (!response.ok) {
|
|
69
78
|
throw new Error(`Failed to fetch flags from Toggly API: ${response.status} ${response.statusText}`);
|
|
70
79
|
}
|
|
71
|
-
const
|
|
80
|
+
const payload = await response.json();
|
|
81
|
+
const flags = (payload && typeof payload === 'object' && 'defs' in payload ? payload.defs : payload);
|
|
72
82
|
if (isDebug) {
|
|
73
83
|
console.log(`Toggly.fetchFeatureFlags - ${JSON.stringify(flags)}`);
|
|
74
84
|
}
|
|
@@ -123,10 +133,108 @@ export function createTogglyClient(config = {}) {
|
|
|
123
133
|
// Fall back to flagDefaults if available
|
|
124
134
|
return flagDefaults[key] ?? false;
|
|
125
135
|
};
|
|
136
|
+
const startWebSocket = () => {
|
|
137
|
+
// Only run in browser environments
|
|
138
|
+
if (typeof window === 'undefined' || typeof WebSocket === 'undefined') {
|
|
139
|
+
if (isDebug) {
|
|
140
|
+
console.log('Toggly.ws - skipped (not a browser environment)');
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (!appKey) {
|
|
145
|
+
if (isDebug) {
|
|
146
|
+
console.log('Toggly.ws - skipped (no appKey)');
|
|
147
|
+
}
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// Build WebSocket URL from baseURI: https:// -> wss://, http:// -> ws://
|
|
151
|
+
const wsUrl = baseURI
|
|
152
|
+
.replace(/^https:\/\//, 'wss://')
|
|
153
|
+
.replace(/^http:\/\//, 'ws://')
|
|
154
|
+
.replace(/\/$/, '') + `/${appKey}/ws`;
|
|
155
|
+
if (isDebug) {
|
|
156
|
+
console.log(`Toggly.ws - connecting to ${wsUrl}`);
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
_ws = new WebSocket(wsUrl);
|
|
160
|
+
_ws.onopen = () => {
|
|
161
|
+
_wsConnected = true;
|
|
162
|
+
_lastFallbackRefresh = Date.now();
|
|
163
|
+
if (isDebug) {
|
|
164
|
+
console.log('Toggly.ws - connected');
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
_ws.onmessage = (event) => {
|
|
168
|
+
try {
|
|
169
|
+
const data = JSON.parse(event.data);
|
|
170
|
+
if (isDebug) {
|
|
171
|
+
console.log(`Toggly.ws - message: ${JSON.stringify(data)}`);
|
|
172
|
+
}
|
|
173
|
+
// Skip ping messages
|
|
174
|
+
if (data.type === 'ping') {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// On flags-updated or update messages, refresh flags from the API
|
|
178
|
+
if (data.type === 'flags-updated' || data.type === 'update') {
|
|
179
|
+
if (isDebug) {
|
|
180
|
+
console.log('Toggly.ws - flags updated, refreshing');
|
|
181
|
+
}
|
|
182
|
+
void refreshFlags();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Ignore malformed messages
|
|
187
|
+
if (isDebug) {
|
|
188
|
+
console.log('Toggly.ws - failed to parse message');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
_ws.onerror = (event) => {
|
|
193
|
+
if (isDebug) {
|
|
194
|
+
console.log('Toggly.ws - error', event);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
_ws.onclose = () => {
|
|
198
|
+
_wsConnected = false;
|
|
199
|
+
_ws = null;
|
|
200
|
+
if (isDebug) {
|
|
201
|
+
console.log(`Toggly.ws - closed, reconnecting in ${WS_RECONNECT_DELAY}ms`);
|
|
202
|
+
}
|
|
203
|
+
// Reconnect after delay
|
|
204
|
+
_wsReconnectTimer = setTimeout(() => {
|
|
205
|
+
_wsReconnectTimer = null;
|
|
206
|
+
startWebSocket();
|
|
207
|
+
}, WS_RECONNECT_DELAY);
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
if (isDebug) {
|
|
212
|
+
console.log('Toggly.ws - failed to connect', error);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
const stopWebSocket = () => {
|
|
217
|
+
if (_wsReconnectTimer !== null) {
|
|
218
|
+
clearTimeout(_wsReconnectTimer);
|
|
219
|
+
_wsReconnectTimer = null;
|
|
220
|
+
}
|
|
221
|
+
if (_ws) {
|
|
222
|
+
// Remove onclose handler to prevent auto-reconnect
|
|
223
|
+
_ws.onclose = null;
|
|
224
|
+
_ws.close();
|
|
225
|
+
_ws = null;
|
|
226
|
+
}
|
|
227
|
+
_wsConnected = false;
|
|
228
|
+
if (isDebug) {
|
|
229
|
+
console.log('Toggly.ws - stopped');
|
|
230
|
+
}
|
|
231
|
+
};
|
|
126
232
|
return {
|
|
127
233
|
getFlags,
|
|
128
234
|
getFlag,
|
|
129
235
|
refreshFlags,
|
|
236
|
+
startWebSocket,
|
|
237
|
+
stopWebSocket,
|
|
130
238
|
};
|
|
131
239
|
}
|
|
132
240
|
//# sourceMappingURL=toggly-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toggly-client.js","sourceRoot":"","sources":["../../src/lib/toggly-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"toggly-client.js","sourceRoot":"","sources":["../../src/lib/toggly-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ops-ai/toggly-docusaurus-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Docusaurus plugin and React bindings for Toggly feature flag gating",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -26,8 +26,9 @@
|
|
|
26
26
|
"clean": "rm -rf dist",
|
|
27
27
|
"typecheck": "tsc --noEmit",
|
|
28
28
|
"lint": "eslint src --ext .ts,.tsx",
|
|
29
|
-
"test": "
|
|
30
|
-
"test:watch": "
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"test:watch": "vitest --watch",
|
|
31
|
+
"test:coverage": "vitest run --coverage"
|
|
31
32
|
},
|
|
32
33
|
"keywords": [
|
|
33
34
|
"toggly",
|
|
@@ -59,16 +60,20 @@
|
|
|
59
60
|
"@docusaurus/types": "^3.9.2",
|
|
60
61
|
"@testing-library/jest-dom": "^6.0.0",
|
|
61
62
|
"@testing-library/react": "^14.0.0",
|
|
62
|
-
"@types/jest": "^29.0.0",
|
|
63
63
|
"@types/node": "^20.0.0",
|
|
64
64
|
"@types/react": "^18.2.0",
|
|
65
65
|
"@types/react-dom": "^18.2.0",
|
|
66
66
|
"@types/webpack": "^5.28.0",
|
|
67
|
-
"
|
|
68
|
-
"
|
|
67
|
+
"@types/ws": "^8.0.0",
|
|
68
|
+
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
69
|
+
"@typescript-eslint/parser": "^6.0.0",
|
|
70
|
+
"eslint": "^8.57.0",
|
|
71
|
+
"eslint-config-prettier": "^9.1.0",
|
|
69
72
|
"react": "^18.3.1",
|
|
70
|
-
"ts-jest": "^29.0.0",
|
|
71
73
|
"typescript": "^5.3.3",
|
|
72
|
-
"
|
|
74
|
+
"vitest": "^1.6.0",
|
|
75
|
+
"@vitest/coverage-v8": "^1.6.0",
|
|
76
|
+
"webpack": "^5.104.1",
|
|
77
|
+
"ws": "^8.0.0"
|
|
73
78
|
}
|
|
74
79
|
}
|