( flagsList: Flag[] = defaultFlags, sdkKeysList: SdkKey[] = defaultSdkKeys, settings: FlagSettings = defaultFlagSettings, segmentsList: Segment[] = defaultSegments )
| 227 | ]; |
| 228 | |
| 229 | export function useFlags( |
| 230 | flagsList: Flag[] = defaultFlags, |
| 231 | sdkKeysList: SdkKey[] = defaultSdkKeys, |
| 232 | settings: FlagSettings = defaultFlagSettings, |
| 233 | segmentsList: Segment[] = defaultSegments |
| 234 | ) { |
| 235 | // Get flag settings |
| 236 | client.scenario.get( |
| 237 | '/v1/projects/:projectId/feature-flags/settings', |
| 238 | (_req, res) => { |
| 239 | res.json(settings); |
| 240 | } |
| 241 | ); |
| 242 | |
| 243 | // List flags (v2: paginated, supports tag/createdBy/maintainerId filters) |
| 244 | client.scenario.get( |
| 245 | '/v2/projects/:projectId/feature-flags/flags', |
| 246 | (req, res) => { |
| 247 | const state = req.query.state || 'active'; |
| 248 | const createdBy = req.query.createdBy as string | undefined; |
| 249 | const tags = toArray(req.query.tags); |
| 250 | const maintainerIds = toArray(req.query.maintainerIds); |
| 251 | |
| 252 | let filteredFlags = flagsList.filter(f => f.state === state); |
| 253 | if (createdBy) { |
| 254 | filteredFlags = filteredFlags.filter(f => f.createdBy === createdBy); |
| 255 | } |
| 256 | if (tags.length > 0) { |
| 257 | filteredFlags = filteredFlags.filter(f => |
| 258 | tags.every(tag => (f.tags ?? []).includes(tag)) |
| 259 | ); |
| 260 | } |
| 261 | if (maintainerIds.length > 0) { |
| 262 | filteredFlags = filteredFlags.filter(f => |
| 263 | maintainerIds.some(id => (f.maintainerIds ?? []).includes(id)) |
| 264 | ); |
| 265 | } |
| 266 | |
| 267 | // The CLI always sends `limit`; fall back to a single full page otherwise. |
| 268 | const limit = req.query.limit |
| 269 | ? Number(req.query.limit) |
| 270 | : filteredFlags.length; |
| 271 | const offset = req.query.cursor ? Number(req.query.cursor) : 0; |
| 272 | const page = filteredFlags.slice(offset, offset + limit); |
| 273 | const nextOffset = offset + limit; |
| 274 | const next = |
| 275 | nextOffset < filteredFlags.length ? String(nextOffset) : null; |
| 276 | |
| 277 | res.json({ data: page, pagination: { next } }); |
| 278 | } |
| 279 | ); |
| 280 | |
| 281 | // Get single flag |
| 282 | client.scenario.get( |
| 283 | '/v1/projects/:projectId/feature-flags/flags/:flagIdOrSlug', |
| 284 | (req, res) => { |
| 285 | const { flagIdOrSlug } = req.params; |
| 286 | const flag = flagsList.find( |
no test coverage detected