@ops-ai/toggly-docusaurus-plugin 0.3.0 → 0.4.3
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 +10 -26
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +13 -5
- 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/package.json +6 -7
package/dist/client/index.d.ts
CHANGED
|
@@ -68,33 +68,17 @@ export interface FeatureProps {
|
|
|
68
68
|
defaultValue?: boolean;
|
|
69
69
|
/**
|
|
70
70
|
* HTML element to use as wrapper (default: 'div').
|
|
71
|
-
*
|
|
72
|
-
*
|
|
71
|
+
*
|
|
72
|
+
* For 'div' and 'span' the wrapper uses `display: contents` so it does not
|
|
73
|
+
* affect layout — useful for inline content gating that should be invisible
|
|
74
|
+
* structurally.
|
|
75
|
+
*
|
|
76
|
+
* For other element types (e.g. 'li', 'tr', 'section'), no `display: contents`
|
|
77
|
+
* is applied so the wrapper participates in the surrounding layout. This is
|
|
78
|
+
* useful for gating list items so the entire bullet (including the marker)
|
|
79
|
+
* is removed when the flag is disabled, instead of leaving an empty bullet.
|
|
73
80
|
*/
|
|
74
|
-
as?:
|
|
81
|
+
as?: keyof JSX.IntrinsicElements;
|
|
75
82
|
}
|
|
76
|
-
/**
|
|
77
|
-
* Feature - React component for conditional rendering based on feature flags
|
|
78
|
-
*
|
|
79
|
-
* This component wraps children in a `data-feature` element that:
|
|
80
|
-
* 1. During static build: Renders all content (so anchors exist, build passes)
|
|
81
|
-
* 2. At the edge (Cloudflare Worker): HTMLRewriter removes disabled content
|
|
82
|
-
* 3. At runtime: Falls back to client-side evaluation if no edge worker
|
|
83
|
-
*
|
|
84
|
-
* The wrapper uses `display: contents` so it doesn't affect layout.
|
|
85
|
-
* Use the `as` prop to specify 'span' for inline content.
|
|
86
|
-
*
|
|
87
|
-
* @example
|
|
88
|
-
* ```tsx
|
|
89
|
-
* // Block content (default)
|
|
90
|
-
* <Feature flag="beta_advanced_filters">
|
|
91
|
-
* <h2>Advanced Filters (Beta)</h2>
|
|
92
|
-
* <p>This feature is in beta...</p>
|
|
93
|
-
* </Feature>
|
|
94
|
-
*
|
|
95
|
-
* // Inline content
|
|
96
|
-
* <Feature flag="beta" as="span">new beta feature</Feature>
|
|
97
|
-
* ```
|
|
98
|
-
*/
|
|
99
83
|
export declare function Feature({ flag, children, fallback, defaultValue, as: Element, }: FeatureProps): JSX.Element;
|
|
100
84
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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
|
|
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;;;;;;;;;;;OAWG;IACH,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,iBAAiB,CAAC;CAClC;AA4CD,wBAAgB,OAAO,CAAC,EACtB,IAAI,EACJ,QAAQ,EACR,QAAe,EACf,YAAoB,EACpB,EAAE,EAAE,OAAe,GACpB,EAAE,YAAY,GAAG,GAAG,CAAC,OAAO,CAwB5B"}
|
package/dist/client/index.js
CHANGED
|
@@ -154,9 +154,19 @@ const isSSR = typeof window === 'undefined';
|
|
|
154
154
|
* <Feature flag="beta" as="span">new beta feature</Feature>
|
|
155
155
|
* ```
|
|
156
156
|
*/
|
|
157
|
+
/**
|
|
158
|
+
* For 'div' and 'span' the wrapper should be invisible to layout. For any
|
|
159
|
+
* other element type the wrapper is part of the layout (e.g. an `<li>` inside
|
|
160
|
+
* a `<ul>`) and must render normally.
|
|
161
|
+
*/
|
|
162
|
+
function getWrapperStyle(element) {
|
|
163
|
+
if (element === 'div' || element === 'span') {
|
|
164
|
+
return { display: 'contents' };
|
|
165
|
+
}
|
|
166
|
+
return undefined;
|
|
167
|
+
}
|
|
157
168
|
export function Feature({ flag, children, fallback = null, defaultValue = false, as: Element = 'div', }) {
|
|
158
|
-
|
|
159
|
-
const wrapperStyle = { display: 'contents' };
|
|
169
|
+
const wrapperStyle = getWrapperStyle(Element);
|
|
160
170
|
// During SSR, render children with data-feature attribute
|
|
161
171
|
// The Cloudflare Worker will strip disabled features at the edge
|
|
162
172
|
if (isSSR) {
|
|
@@ -171,10 +181,8 @@ export function Feature({ flag, children, fallback = null, defaultValue = false,
|
|
|
171
181
|
*/
|
|
172
182
|
function FeatureClient({ flag, children, fallback = null, defaultValue = false, as: Element = 'div', }) {
|
|
173
183
|
const { enabled, isReady } = useFlag(flag, defaultValue);
|
|
174
|
-
|
|
175
|
-
const wrapperStyle = { display: 'contents' };
|
|
184
|
+
const wrapperStyle = getWrapperStyle(Element);
|
|
176
185
|
// Always wrap with data-feature for edge worker compatibility
|
|
177
|
-
// The wrapper is invisible to layout due to display: contents
|
|
178
186
|
// If still loading, show children wrapped (for hydration match with SSR)
|
|
179
187
|
if (!isReady) {
|
|
180
188
|
return (_jsx(Element, { "data-feature": flag, style: wrapperStyle, children: children }));
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"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
|
|
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,EAET,MAAM,GAEP,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,kBAAkB,EAAoD,MAAM,sBAAsB,CAAC;AAc5G,MAAM,aAAa,GAAG,aAAa,CAA4B,IAAI,CAAC,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,MAAM,EAAE,cAAc,EACtB,QAAQ,GACY;IACpB,iDAAiD;IACjD,MAAM,MAAM,GACV,cAAc;QACd,CAAC,OAAO,MAAM,KAAK,WAAW;YAC5B,CAAC,CAAE,MAAc,CAAC,iBAAiB,IAAI,EAAE;YACzC,CAAC,CAAC,EAAE,CAAC,CAAC;IACV,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE;QAC7B,gCAAgC;QAChC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YACpE,OAAO,CAAC,IAAI,CACV,mHAAmH,CACpH,CAAC;QACJ,CAAC;QACD,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAQ,EAAE,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,MAAM,CAAQ,KAAK,CAAC,CAAC;IACtC,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IAEzB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAA0C,IAAI,CAAC;QAE5D,mCAAmC;QACnC,MAAM;aACH,QAAQ,EAAE;aACV,IAAI,CAAC,CAAC,WAAkB,EAAE,EAAE;YAC3B,QAAQ,CAAC,WAAW,CAAC,CAAC;YACtB,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;YACpB,QAAQ,CAAC,GAAG,CAAC,CAAC;YACd,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,oCAAoC;QACxD,CAAC,CAAC,CAAC;QAEL,mCAAmC;QACnC,MAAM,CAAC,cAAc,EAAE,CAAC;QAExB,6EAA6E;QAC7E,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAC3B,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,MAAa,EAAE,EAAE;gBACvC,gDAAgD;gBAChD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAChE,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACZ,iCAAiC;YACnC,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,MAAM,CAAC,2BAA2B,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAExD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,SAAS,EAAE,CAAC;gBACd,aAAa,CAAC,SAAS,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,OAAO,GAAG,KAAK,EAAE,GAAW,EAAE,YAAsB,EAAoB,EAAE;QAC9E,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC3C,CAAC,CAAC;IAEF,MAAM,KAAK,GAAuB;QAChC,KAAK;QACL,OAAO;QACP,OAAO;QACP,KAAK;KACN,CAAC;IAEF,OAAO,CACL,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA0B,CAC1E,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CACrB,OAAe,EACf,YAAsB;IAEtB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC;IAChD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAU,YAAY,IAAI,KAAK,CAAC,CAAC;IAEvE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,2BAA2B;YAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;gBACjC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,4BAA4B;gBAC5B,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAErD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AA6BD;;GAEG;AACH,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH;;;;GAIG;AACH,SAAS,eAAe,CACtB,OAAoC;IAEpC,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC5C,OAAO,EAAE,OAAO,EAAE,UAAmB,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EACtB,IAAI,EACJ,QAAQ,EACR,QAAQ,GAAG,IAAI,EACf,YAAY,GAAG,KAAK,EACpB,EAAE,EAAE,OAAO,GAAG,KAAK,GACN;IACb,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE9C,0DAA0D;IAC1D,iEAAiE;IACjE,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CACL,KAAC,OAAO,oBAAe,IAAI,EAAE,KAAK,EAAE,YAAY,YAC7C,QAAQ,GACD,CACX,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,OAAO,CACL,KAAC,aAAa,IACZ,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,EAAE,EAAE,OAAO,YAEV,QAAQ,GACK,CACjB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,EACrB,IAAI,EACJ,QAAQ,EACR,QAAQ,GAAG,IAAI,EACf,YAAY,GAAG,KAAK,EACpB,EAAE,EAAE,OAAO,GAAG,KAAK,GACN;IACb,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE9C,8DAA8D;IAE9D,yEAAyE;IACzE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CACL,KAAC,OAAO,oBAAe,IAAI,EAAE,KAAK,EAAE,YAAY,YAC7C,QAAQ,GACD,CACX,CAAC;IACJ,CAAC;IAED,+CAA+C;IAC/C,iFAAiF;IACjF,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,KAAC,OAAO,oBAAe,IAAI,EAAE,KAAK,EAAE,YAAY,YAC7C,QAAQ,GACD,CACX,CAAC;IACJ,CAAC;IAED,4DAA4D;IAC5D,OAAO,4BAAG,QAAQ,GAAI,CAAC;AACzB,CAAC"}
|
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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ops-ai/toggly-docusaurus-plugin",
|
|
3
|
-
"version": "0.3
|
|
3
|
+
"version": "0.4.3",
|
|
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,7 +60,6 @@
|
|
|
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",
|
|
@@ -69,11 +69,10 @@
|
|
|
69
69
|
"@typescript-eslint/parser": "^6.0.0",
|
|
70
70
|
"eslint": "^8.57.0",
|
|
71
71
|
"eslint-config-prettier": "^9.1.0",
|
|
72
|
-
"jest": "^29.0.0",
|
|
73
|
-
"jest-environment-jsdom": "^29.0.0",
|
|
74
72
|
"react": "^18.3.1",
|
|
75
|
-
"ts-jest": "^29.0.0",
|
|
76
73
|
"typescript": "^5.3.3",
|
|
74
|
+
"vitest": "^1.6.0",
|
|
75
|
+
"@vitest/coverage-v8": "^1.6.0",
|
|
77
76
|
"webpack": "^5.104.1",
|
|
78
77
|
"ws": "^8.0.0"
|
|
79
78
|
}
|