@nebulr-group/bridge-cli 0.4.0-beta.2 → 0.4.0-beta.5
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 +5 -0
- package/dist/commands/auth/login.command.js +1 -1
- package/dist/commands/auth/login.command.js.map +1 -1
- package/dist/commands/flag-init.command.d.ts.map +1 -1
- package/dist/commands/flag-init.command.js +171 -66
- package/dist/commands/flag-init.command.js.map +1 -1
- package/dist/commands/flag.command.d.ts +9 -41
- package/dist/commands/flag.command.d.ts.map +1 -1
- package/dist/commands/flag.command.js +190 -222
- package/dist/commands/flag.command.js.map +1 -1
- package/dist/commands/plan.command.d.ts +9 -0
- package/dist/commands/plan.command.d.ts.map +1 -1
- package/dist/commands/plan.command.js +33 -3
- package/dist/commands/plan.command.js.map +1 -1
- package/dist/prompts/auth-master-integration-prompt.md +2 -2
- package/dist/prompts/billing/master.md +11 -4
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -161,7 +161,12 @@ bridge plan price set pro --amount 290 --currency usd --interval year
|
|
|
161
161
|
bridge plan price rm pro --interval year
|
|
162
162
|
|
|
163
163
|
# Usage quotas (hard | metered caps)
|
|
164
|
+
# hard = block at the cap; metered = bill overage per unit (needs --price-amount)
|
|
164
165
|
bridge plan quota set pro --metric ai_completions --limit 1000 --policy hard
|
|
166
|
+
# Metered: first 1000 free, then $0.002/unit (currency from the plan's price)
|
|
167
|
+
bridge plan quota set pro --metric ai_completions --limit 1000 --policy metered --price-amount 0.002
|
|
168
|
+
# Pure per-unit (billed from unit 1)
|
|
169
|
+
bridge plan quota set pro --metric api_calls --limit 0 --policy metered --price-amount 0.01 --price-currency usd
|
|
165
170
|
bridge plan quota rm pro --metric ai_completions
|
|
166
171
|
```
|
|
167
172
|
|
|
@@ -11,7 +11,7 @@ export function registerAuthLoginCommand(auth) {
|
|
|
11
11
|
auth
|
|
12
12
|
.command('login')
|
|
13
13
|
.description('Authenticate via browser (loopback PKCE) and save credentials')
|
|
14
|
-
.option('--app <id|name>', 'Pin to a specific app
|
|
14
|
+
.option('--app <id|name>', 'Pin to a specific app: an app id skips the picker entirely; an app name is resolved on the consent screen (falls back to the picker if not found)')
|
|
15
15
|
.option('--label <text>', 'Friendly label stored on the token (default: "bridge-cli")')
|
|
16
16
|
.option('--no-browser', 'Print the authorization URL instead of opening a browser')
|
|
17
17
|
.option('--reauth', 'Force the consent screen to sign you out and prompt for credentials again')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.command.js","sourceRoot":"","sources":["../../../src/commands/auth/login.command.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,gBAAgB,EAA0B,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE/E,MAAM,oBAAoB,GAAG,2BAA2B,CAAC;AACzD,MAAM,qBAAqB,GAAG,4BAA4B,CAAC;AAa3D,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEpB,MAAM,UAAU,wBAAwB,CAAC,IAAa;IACpD,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CAAC,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"login.command.js","sourceRoot":"","sources":["../../../src/commands/auth/login.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flag-init.command.d.ts","sourceRoot":"","sources":["../../src/commands/flag-init.command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"flag-init.command.d.ts","sourceRoot":"","sources":["../../src/commands/flag-init.command.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,SAAS,GACT,SAAS,CAAC;AAEd,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,CA+DjE;AAID,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAwB1E;AAID,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,EAAE,UAAU,GAAG,MAAM,CA0ThF;AAuCD,mDAAmD;AACnD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D"}
|
|
@@ -2,10 +2,19 @@
|
|
|
2
2
|
//
|
|
3
3
|
// `bridge flag init` (alias for the eventual `bridge init --flags-only`).
|
|
4
4
|
// Detects the project framework from package.json and prints:
|
|
5
|
-
// - The
|
|
5
|
+
// - The framework's REAL flag-reading setup snippet
|
|
6
6
|
// - A `bridge-flags.config.json` next to package.json with appId + baseUrl
|
|
7
7
|
// + suggested provider config
|
|
8
8
|
//
|
|
9
|
+
// TBP-206 — every snippet below MUST correspond to a symbol that actually
|
|
10
|
+
// exists in the named package at an import specifier that actually resolves.
|
|
11
|
+
// The previous revision invented `createBridgeFlags()` middleware for express,
|
|
12
|
+
// `BridgeFlagsProvider` for react/nextjs and `provideBridgeFlags` for angular,
|
|
13
|
+
// and pointed every framework at a `/flags` subpath — several of which are not
|
|
14
|
+
// declared in the package's `exports` map. Agents followed the scaffold and
|
|
15
|
+
// wrote code that could not resolve, let alone run. If you change a snippet,
|
|
16
|
+
// re-verify it against the package source first.
|
|
17
|
+
//
|
|
9
18
|
// The command is deliberately NON-destructive: it never overwrites source
|
|
10
19
|
// files. The "scaffold" is text output (snippet + config file) for the agent
|
|
11
20
|
// or the developer to apply.
|
|
@@ -96,13 +105,26 @@ export async function detectFramework(cwd) {
|
|
|
96
105
|
return 'unknown';
|
|
97
106
|
}
|
|
98
107
|
export function renderSnippet(framework, ctx) {
|
|
108
|
+
// Import specifiers that actually resolve for each framework (TBP-206).
|
|
109
|
+
//
|
|
110
|
+
// svelte / react — declare "./flags" in their package.json `exports` map.
|
|
111
|
+
// nextjs — has NO "./flags" and NO "." key; FF 2.0 is folded into
|
|
112
|
+
// "./client", server-side flags live under "./server".
|
|
113
|
+
// angular — ships a single ng-packagr entry point; everything comes
|
|
114
|
+
// from the bare specifier.
|
|
115
|
+
// nestjs — has no `exports` map at all, so `<pkg>/flags` falls
|
|
116
|
+
// back to legacy resolution and 404s (the published
|
|
117
|
+
// tarball only ships `dist/`). `dist/flags` is the only
|
|
118
|
+
// specifier that resolves today.
|
|
119
|
+
// express — no `exports` map and no flags entry point; the flag
|
|
120
|
+
// surface is on the bare specifier.
|
|
99
121
|
const pkgFor = {
|
|
100
122
|
svelte: '@nebulr-group/bridge-svelte/flags',
|
|
101
123
|
react: '@nebulr-group/bridge-react/flags',
|
|
102
|
-
nextjs: '@nebulr-group/bridge-nextjs/
|
|
103
|
-
angular: '@nebulr-group/bridge-angular
|
|
104
|
-
nestjs: '@nebulr-group/bridge-nestjs/flags',
|
|
105
|
-
express: '@nebulr-group/bridge-express
|
|
124
|
+
nextjs: '@nebulr-group/bridge-nextjs/client',
|
|
125
|
+
angular: '@nebulr-group/bridge-angular',
|
|
126
|
+
nestjs: '@nebulr-group/bridge-nestjs/dist/flags',
|
|
127
|
+
express: '@nebulr-group/bridge-express',
|
|
106
128
|
};
|
|
107
129
|
if (framework === 'unknown') {
|
|
108
130
|
return [
|
|
@@ -113,14 +135,22 @@ export function renderSnippet(framework, ctx) {
|
|
|
113
135
|
'```ts',
|
|
114
136
|
`import { BridgeFlags } from '@nebulr-group/bridge-auth-core';`,
|
|
115
137
|
``,
|
|
116
|
-
|
|
117
|
-
|
|
138
|
+
`// 'backend' refuses to bucket rollout flags without an identity;`,
|
|
139
|
+
`// use 'frontend' in a browser runtime.`,
|
|
140
|
+
`export const bridge = new BridgeFlags({ mode: 'backend' });`,
|
|
118
141
|
``,
|
|
119
|
-
`//
|
|
120
|
-
`const
|
|
121
|
-
'
|
|
142
|
+
`// Load the rule set for your app (or let a framework SDK do it for you).`,
|
|
143
|
+
`const res = await fetch(`,
|
|
144
|
+
` '${ctx.baseUrl}/admin/flags-internal/flags-cache/${ctx.appId}',`,
|
|
145
|
+
`);`,
|
|
146
|
+
`bridge.hydrate(await res.json());`,
|
|
122
147
|
``,
|
|
123
|
-
`
|
|
148
|
+
`bridge.setContext({ identity: 'user-id', attributes: { /* plan, role, ... */ } });`,
|
|
149
|
+
``,
|
|
150
|
+
`// Read a flag — T is inferred from defaultValue (boolean | string | number | json).`,
|
|
151
|
+
`// Returns FlagEvalResult<T> = { value, passed }, NOT a bare value.`,
|
|
152
|
+
`const { value: newDashboard } = bridge.flag('new-dashboard', false);`,
|
|
153
|
+
'```',
|
|
124
154
|
].join('\n');
|
|
125
155
|
}
|
|
126
156
|
const pkg = pkgFor[framework];
|
|
@@ -135,17 +165,39 @@ export function renderSnippet(framework, ctx) {
|
|
|
135
165
|
' bun add @nebulr-group/bridge-svelte',
|
|
136
166
|
' ```',
|
|
137
167
|
'',
|
|
138
|
-
'2.
|
|
139
|
-
' ```
|
|
140
|
-
|
|
168
|
+
'2. Configure + mount the runtime once — `src/routes/+layout.svelte`:',
|
|
169
|
+
' ```svelte',
|
|
170
|
+
' <script lang="ts">',
|
|
171
|
+
` import { BridgeProvider, bridgeConfig } from '@nebulr-group/bridge-svelte';`,
|
|
172
|
+
'',
|
|
173
|
+
' bridgeConfig.initConfig({',
|
|
174
|
+
` appId: '${ctx.appId}',`,
|
|
175
|
+
` apiBaseUrl: '${ctx.baseUrl}',`,
|
|
176
|
+
' });',
|
|
177
|
+
'',
|
|
178
|
+
' let { children } = $props();',
|
|
179
|
+
' </script>',
|
|
141
180
|
'',
|
|
142
|
-
'
|
|
143
|
-
` bridge.configure({ appId: '${ctx.appId}', baseUrl: '${ctx.baseUrl}' });`,
|
|
181
|
+
' <BridgeProvider>{@render children()}</BridgeProvider>',
|
|
144
182
|
' ```',
|
|
145
183
|
'',
|
|
146
|
-
'3.
|
|
147
|
-
' ```
|
|
148
|
-
'
|
|
184
|
+
'3. Read a flag in any component under the provider:',
|
|
185
|
+
' ```svelte',
|
|
186
|
+
' <script lang="ts">',
|
|
187
|
+
` import { useFlag } from '${pkg}';`,
|
|
188
|
+
'',
|
|
189
|
+
' // Sync rune. Returns { value, passed } — NOT a bare value.',
|
|
190
|
+
' // T is inferred from the default: boolean | string | number | json.',
|
|
191
|
+
` const newDashboard = useFlag('new-dashboard', false);`,
|
|
192
|
+
' </script>',
|
|
193
|
+
'',
|
|
194
|
+
' {#if newDashboard.value}<V2 />{:else}<V1 />{/if}',
|
|
195
|
+
' ```',
|
|
196
|
+
'',
|
|
197
|
+
' Or declaratively:',
|
|
198
|
+
' ```svelte',
|
|
199
|
+
` import { FeatureFlag } from '${pkg}';`,
|
|
200
|
+
' <FeatureFlag flag="new-dashboard">…</FeatureFlag>',
|
|
149
201
|
' ```',
|
|
150
202
|
].join('\n');
|
|
151
203
|
case 'react':
|
|
@@ -157,24 +209,24 @@ export function renderSnippet(framework, ctx) {
|
|
|
157
209
|
' bun add @nebulr-group/bridge-react',
|
|
158
210
|
' ```',
|
|
159
211
|
'',
|
|
160
|
-
'2. In `src/main.tsx
|
|
212
|
+
'2. In `src/main.tsx` — flags ride on the core Bridge runtime, so mount',
|
|
213
|
+
' `<BridgeProvider>` (there is no separate flags provider):',
|
|
161
214
|
' ```tsx',
|
|
162
|
-
` import {
|
|
215
|
+
` import { BridgeProvider } from '@nebulr-group/bridge-react';`,
|
|
163
216
|
'',
|
|
164
|
-
|
|
165
|
-
` appId="${ctx.appId}"`,
|
|
166
|
-
` baseUrl="${ctx.baseUrl}"`,
|
|
167
|
-
' >',
|
|
217
|
+
` <BridgeProvider config={{ appId: '${ctx.appId}', apiBaseUrl: '${ctx.baseUrl}' }}>`,
|
|
168
218
|
' <App />',
|
|
169
|
-
' </
|
|
219
|
+
' </BridgeProvider>',
|
|
170
220
|
' ```',
|
|
221
|
+
' (`VITE_BRIDGE_APP_ID` / `VITE_BRIDGE_API_BASE_URL` override the props.)',
|
|
171
222
|
'',
|
|
172
223
|
'3. Use the hook in any component:',
|
|
173
224
|
' ```tsx',
|
|
174
225
|
` import { useFlag } from '${pkg}';`,
|
|
175
226
|
'',
|
|
176
227
|
' function NewDashboard() {',
|
|
177
|
-
'
|
|
228
|
+
' // Sync. Returns { value, passed } — destructure `value`.',
|
|
229
|
+
` const { value: enabled } = useFlag('new-dashboard', false);`,
|
|
178
230
|
' return enabled ? <V2 /> : <V1 />;',
|
|
179
231
|
' }',
|
|
180
232
|
' ```',
|
|
@@ -188,31 +240,42 @@ export function renderSnippet(framework, ctx) {
|
|
|
188
240
|
' bun add @nebulr-group/bridge-nextjs',
|
|
189
241
|
' ```',
|
|
190
242
|
'',
|
|
191
|
-
'2. Client side — `app/providers.tsx
|
|
243
|
+
'2. Client side — `app/providers.tsx`. FF 2.0 is folded into the',
|
|
244
|
+
' `./client` entry point; there is no `/flags` subpath and no separate',
|
|
245
|
+
' flags provider:',
|
|
192
246
|
' ```tsx',
|
|
193
247
|
` "use client";`,
|
|
194
|
-
` import {
|
|
248
|
+
` import { BridgeProvider } from '${pkg}';`,
|
|
195
249
|
'',
|
|
196
250
|
' export function Providers({ children }: { children: React.ReactNode }) {',
|
|
197
251
|
' return (',
|
|
198
|
-
|
|
199
|
-
` appId="${ctx.appId}"`,
|
|
200
|
-
` baseUrl="${ctx.baseUrl}"`,
|
|
201
|
-
' >',
|
|
252
|
+
` <BridgeProvider config={{ appId: '${ctx.appId}', apiBaseUrl: '${ctx.baseUrl}' }}>`,
|
|
202
253
|
' {children}',
|
|
203
|
-
' </
|
|
254
|
+
' </BridgeProvider>',
|
|
204
255
|
' );',
|
|
205
256
|
' }',
|
|
206
257
|
' ```',
|
|
207
258
|
'',
|
|
208
|
-
'
|
|
259
|
+
' Then in any client component:',
|
|
260
|
+
' ```tsx',
|
|
261
|
+
` import { useFlag } from '${pkg}';`,
|
|
262
|
+
` const { value: enabled } = useFlag('new-dashboard', false);`,
|
|
263
|
+
' ```',
|
|
264
|
+
'',
|
|
265
|
+
'3. Server side — Server Component / Route Handler / middleware. The',
|
|
266
|
+
' server flag surface is a singleton, and every read is async and takes',
|
|
267
|
+
' the `NextRequest` (that is where identity comes from):',
|
|
209
268
|
' ```ts',
|
|
210
|
-
` import {
|
|
211
|
-
'
|
|
269
|
+
` import { FeatureFlagServer } from '@nebulr-group/bridge-nextjs/server';`,
|
|
270
|
+
'',
|
|
271
|
+
' // Once at boot:',
|
|
272
|
+
' FeatureFlagServer.getInstance().init({',
|
|
212
273
|
` appId: '${ctx.appId}',`,
|
|
213
|
-
`
|
|
274
|
+
` apiBaseUrl: '${ctx.baseUrl}',`,
|
|
214
275
|
' });',
|
|
215
|
-
'
|
|
276
|
+
'',
|
|
277
|
+
' // Per request — evaluated locally in-process, no round trip per flag:',
|
|
278
|
+
` const enabled = await FeatureFlagServer.getInstance().flagServer('new-dashboard', false, request);`,
|
|
216
279
|
' ```',
|
|
217
280
|
].join('\n');
|
|
218
281
|
case 'angular':
|
|
@@ -224,27 +287,32 @@ export function renderSnippet(framework, ctx) {
|
|
|
224
287
|
' bun add @nebulr-group/bridge-angular',
|
|
225
288
|
' ```',
|
|
226
289
|
'',
|
|
227
|
-
'2. In `app.config.ts
|
|
290
|
+
'2. In `app.config.ts` — one provider covers auth + flags (the package',
|
|
291
|
+
' ships a single entry point, so import from the bare specifier):',
|
|
228
292
|
' ```ts',
|
|
229
|
-
` import {
|
|
293
|
+
` import { provideBridge } from '${pkg}';`,
|
|
230
294
|
'',
|
|
231
295
|
' export const appConfig: ApplicationConfig = {',
|
|
232
296
|
' providers: [',
|
|
233
|
-
'
|
|
297
|
+
' provideBridge({',
|
|
234
298
|
` appId: '${ctx.appId}',`,
|
|
235
|
-
`
|
|
299
|
+
` apiBaseUrl: '${ctx.baseUrl}',`,
|
|
236
300
|
' }),',
|
|
237
301
|
' ],',
|
|
238
302
|
' };',
|
|
239
303
|
' ```',
|
|
240
304
|
'',
|
|
241
|
-
'3. Inject
|
|
305
|
+
'3. Inject `BridgeService` — `flag()` returns a Signal of { value, passed }:',
|
|
242
306
|
' ```ts',
|
|
243
|
-
` import {
|
|
307
|
+
` import { BridgeService } from '${pkg}';`,
|
|
244
308
|
'',
|
|
245
|
-
'
|
|
309
|
+
' private bridge = inject(BridgeService);',
|
|
310
|
+
'',
|
|
311
|
+
` newDashboard = this.bridge.flag('new-dashboard', false);`,
|
|
312
|
+
' // template: {{ newDashboard().value }}',
|
|
246
313
|
'',
|
|
247
|
-
'
|
|
314
|
+
' // One-shot, non-reactive read:',
|
|
315
|
+
` // const { value } = this.bridge.evaluate('new-dashboard', false);`,
|
|
248
316
|
' ```',
|
|
249
317
|
].join('\n');
|
|
250
318
|
case 'nestjs':
|
|
@@ -256,16 +324,18 @@ export function renderSnippet(framework, ctx) {
|
|
|
256
324
|
' bun add @nebulr-group/bridge-nestjs',
|
|
257
325
|
' ```',
|
|
258
326
|
'',
|
|
259
|
-
'2. Import the module in `app.module.ts
|
|
327
|
+
'2. Import the module in `app.module.ts`. NOTE: the package declares no',
|
|
328
|
+
' `exports` map, so `@nebulr-group/bridge-nestjs/flags` does not resolve',
|
|
329
|
+
' — import from `/dist/flags` until that is fixed:',
|
|
260
330
|
' ```ts',
|
|
261
331
|
` import { BridgeFlagsModule } from '${pkg}';`,
|
|
262
332
|
'',
|
|
263
333
|
' @Module({',
|
|
264
334
|
' imports: [',
|
|
265
335
|
' BridgeFlagsModule.forRoot({',
|
|
266
|
-
`
|
|
267
|
-
`
|
|
268
|
-
|
|
336
|
+
` apiBaseUrl: '${ctx.baseUrl}',`,
|
|
337
|
+
` apiKey: '${ctx.appId}',`,
|
|
338
|
+
` mode: 'backend',`,
|
|
269
339
|
' }),',
|
|
270
340
|
' ],',
|
|
271
341
|
' })',
|
|
@@ -278,17 +348,22 @@ export function renderSnippet(framework, ctx) {
|
|
|
278
348
|
'',
|
|
279
349
|
' constructor(private flags: BridgeFlagsService) {}',
|
|
280
350
|
'',
|
|
281
|
-
'
|
|
282
|
-
'
|
|
283
|
-
|
|
284
|
-
'
|
|
351
|
+
' handleRequest(req) {',
|
|
352
|
+
' // Sync, evaluated locally in-process. Returns T directly.',
|
|
353
|
+
` const enabled = this.flags.flag('new-checkout', false, {`,
|
|
354
|
+
' identity: req.bridgeUser?.id,',
|
|
355
|
+
' attributes: { plan: req.bridgeUser?.plan },',
|
|
285
356
|
' });',
|
|
286
357
|
' }',
|
|
287
358
|
' ```',
|
|
288
359
|
].join('\n');
|
|
289
360
|
case 'express':
|
|
290
361
|
return [
|
|
291
|
-
'# Bridge Flags — Express
|
|
362
|
+
'# Bridge Flags — Express',
|
|
363
|
+
'',
|
|
364
|
+
' NOTE: express does not have a standalone flags runtime. Flags are',
|
|
365
|
+
' part of the auth middleware, are boolean-only, require a user JWT,',
|
|
366
|
+
' and are evaluated remotely by the Bridge API (see TBP-516).',
|
|
292
367
|
'',
|
|
293
368
|
`1. Install:`,
|
|
294
369
|
' ```bash',
|
|
@@ -297,22 +372,40 @@ export function renderSnippet(framework, ctx) {
|
|
|
297
372
|
'',
|
|
298
373
|
'2. At app bootstrap:',
|
|
299
374
|
' ```ts',
|
|
300
|
-
` import {
|
|
375
|
+
` import { createBridge } from '${pkg}';`,
|
|
301
376
|
'',
|
|
302
|
-
' const bridge =
|
|
377
|
+
' const bridge = createBridge({',
|
|
303
378
|
` appId: '${ctx.appId}',`,
|
|
304
|
-
`
|
|
305
|
-
'
|
|
379
|
+
` apiBaseUrl: '${ctx.baseUrl}',`,
|
|
380
|
+
' guard: { defaultAccess: \'protected\' },',
|
|
306
381
|
' });',
|
|
307
382
|
'',
|
|
308
|
-
' app.use(bridge.
|
|
383
|
+
' app.use(bridge.auth());',
|
|
309
384
|
' ```',
|
|
310
385
|
'',
|
|
311
|
-
'3.
|
|
386
|
+
'3. Gate a route on a flag — `featureFlag` accepts',
|
|
387
|
+
' `string | { any: string[] } | { all: string[] }`; a miss is a 403:',
|
|
312
388
|
' ```ts',
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
'
|
|
389
|
+
` app.get('/beta', bridge.protect({ featureFlag: 'new-home' }), (req, res) => {`,
|
|
390
|
+
` res.send('v2');`,
|
|
391
|
+
' });',
|
|
392
|
+
'',
|
|
393
|
+
' // Or centrally, via guard.rules:',
|
|
394
|
+
` // { path: '/beta/**', privilege: 'AUTHENTICATED', featureFlag: { any: ['new-home', 'beta'] } }`,
|
|
395
|
+
' ```',
|
|
396
|
+
'',
|
|
397
|
+
'4. Read a flag inside a handler:',
|
|
398
|
+
' ```ts',
|
|
399
|
+
` import { BridgeConfigService, FeatureFlagService } from '${pkg}';`,
|
|
400
|
+
'',
|
|
401
|
+
' const flags = new FeatureFlagService(',
|
|
402
|
+
` new BridgeConfigService({ appId: '${ctx.appId}', apiBaseUrl: '${ctx.baseUrl}' }),`,
|
|
403
|
+
' );',
|
|
404
|
+
'',
|
|
405
|
+
` app.get('/', bridge.protect(), async (req, res) => {`,
|
|
406
|
+
' // Boolean only. Async — remote evaluation, cached 5 min per token.',
|
|
407
|
+
` const enabled = await flags.isEnabled('new-home', req.bridgeAccessToken!);`,
|
|
408
|
+
` res.send(enabled ? 'v2' : 'v1');`,
|
|
316
409
|
' });',
|
|
317
410
|
' ```',
|
|
318
411
|
].join('\n');
|
|
@@ -320,7 +413,19 @@ export function renderSnippet(framework, ctx) {
|
|
|
320
413
|
}
|
|
321
414
|
// ── Provider config + next-steps blurbs ─────────────────────────────────────
|
|
322
415
|
function suggestedProviderConfig(framework) {
|
|
323
|
-
|
|
416
|
+
// Keys mirror the real option names on the framework's flags runtime
|
|
417
|
+
// (`createBridgeFlags` / `BridgeFlagsModule.forRoot`) — `mode` is
|
|
418
|
+
// `'frontend' | 'backend'`, `telemetry` is a partial TelemetryBatcherConfig.
|
|
419
|
+
if (framework === 'express') {
|
|
420
|
+
// express has no BridgeFlags runtime — nothing to configure. Flags are
|
|
421
|
+
// enforced through `bridge.protect({ featureFlag })` and evaluated remotely
|
|
422
|
+
// by the Bridge API. See TBP-516.
|
|
423
|
+
return {
|
|
424
|
+
runtime: 'none',
|
|
425
|
+
note: 'bridge-express evaluates flags remotely inside the auth middleware; there is no local flags provider to configure.',
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
if (framework === 'nestjs') {
|
|
324
429
|
return { mode: 'backend', telemetry: { enabled: true, flushIntervalMs: 5000 } };
|
|
325
430
|
}
|
|
326
431
|
return { mode: 'frontend', telemetry: { enabled: true, flushIntervalMs: 5000 } };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flag-init.command.js","sourceRoot":"","sources":["../../src/commands/flag-init.command.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,0EAA0E;AAC1E,8DAA8D;AAC9D,
|
|
1
|
+
{"version":3,"file":"flag-init.command.js","sourceRoot":"","sources":["../../src/commands/flag-init.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,7 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
operator: string;
|
|
6
|
-
value?: unknown;
|
|
7
|
-
}
|
|
8
|
-
interface Branch {
|
|
9
|
-
conditions: Condition[];
|
|
10
|
-
returnValue: unknown;
|
|
11
|
-
}
|
|
12
|
-
interface Rule {
|
|
13
|
-
branches: Branch[];
|
|
14
|
-
otherwiseValue: unknown;
|
|
15
|
-
rolloutPct: number;
|
|
16
|
-
groupRef?: string;
|
|
17
|
-
}
|
|
2
|
+
import { validateRule } from '@nebulr-group/bridge-auth-core';
|
|
3
|
+
import type { CachedFlag, EvalContext, EvalResult, FlagState, FlagValueType, Rule } from '@nebulr-group/bridge-auth-core';
|
|
4
|
+
export { validateRule };
|
|
18
5
|
export declare function registerFlagCommands(program: Command): void;
|
|
19
6
|
interface FlagDoc {
|
|
20
7
|
key: string;
|
|
@@ -65,31 +52,12 @@ export declare function buildFlagWritePayload(opts: FlagWriteOpts, { partial }?:
|
|
|
65
52
|
}): Record<string, unknown>;
|
|
66
53
|
export declare function coerceValue(raw: string, type: FlagValueType): unknown;
|
|
67
54
|
export declare function parseRuleArg(raw: string): Rule;
|
|
55
|
+
/**
|
|
56
|
+
* Normalize untrusted rule input (from --rule JSON or a flags file) to the
|
|
57
|
+
* canonical auth-core `Rule` shape. Throws on structural problems; operator
|
|
58
|
+
* validity is left to `validateRule` on the returned rule.
|
|
59
|
+
*/
|
|
60
|
+
export declare function normalizeRuleInput(input: unknown): Rule;
|
|
68
61
|
export declare function parseAttributes(pairs: string[]): Record<string, unknown>;
|
|
69
|
-
interface RuleValidationError {
|
|
70
|
-
branchIndex: number;
|
|
71
|
-
conditionIndex: number;
|
|
72
|
-
message: string;
|
|
73
|
-
}
|
|
74
|
-
export declare function validateRule(rule: unknown): RuleValidationError[];
|
|
75
|
-
interface EvalContext {
|
|
76
|
-
identity?: string;
|
|
77
|
-
attributes: Record<string, unknown>;
|
|
78
|
-
}
|
|
79
|
-
interface EvalResult {
|
|
80
|
-
value: unknown;
|
|
81
|
-
variantIndex: number;
|
|
82
|
-
matched: boolean;
|
|
83
|
-
excludedByRollout: boolean;
|
|
84
|
-
}
|
|
85
|
-
interface CachedFlag {
|
|
86
|
-
key: string;
|
|
87
|
-
state: FlagState;
|
|
88
|
-
valueType: FlagValueType;
|
|
89
|
-
offValue: unknown;
|
|
90
|
-
onValue: unknown;
|
|
91
|
-
rule?: Rule;
|
|
92
|
-
}
|
|
93
62
|
export declare function evaluateLocally(cached: CachedFlag, ctx: EvalContext): EvalResult;
|
|
94
|
-
export {};
|
|
95
63
|
//# sourceMappingURL=flag.command.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flag.command.d.ts","sourceRoot":"","sources":["../../src/commands/flag.command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"flag.command.d.ts","sourceRoot":"","sources":["../../src/commands/flag.command.ts"],"names":[],"mappings":"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"}
|