Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 29 additions & 1 deletion .oagen-manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
{
"version": 2,
"language": "node",
"generatedAt": "2026-06-16T18:02:10.415Z",
"files": [
"src/api-keys/interfaces/create-validation-options.interface.ts",
"src/api-keys/interfaces/delete-api-key-options.interface.ts",
Expand Down Expand Up @@ -59,6 +58,35 @@
"src/connect/serializers/user-consent-option.serializer.ts",
"src/connect/serializers/user-management-login-request.serializer.ts",
"src/connect/serializers/user-object.serializer.ts",
"src/flag-target-types/fixtures/create-flag-target-type.json",
"src/flag-target-types/fixtures/flag-target-type.json",
"src/flag-target-types/fixtures/list-flag-target-type.json",
"src/flag-target-types/flag-target-types.spec.ts",
"src/flag-target-types/flag-target-types.ts",
"src/flag-target-types/interfaces/create-flag-target-type-options.interface.ts",
"src/flag-target-types/interfaces/create-flag-target-type.interface.ts",
"src/flag-target-types/interfaces/flag-target-type.interface.ts",
"src/flag-target-types/interfaces/get-flag-target-type-options.interface.ts",
"src/flag-target-types/interfaces/index.ts",
"src/flag-target-types/interfaces/list-flag-target-types-options.interface.ts",
"src/flag-target-types/serializers/create-flag-target-type.serializer.ts",
"src/flag-target-types/serializers/flag-target-type.serializer.ts",
"src/flag-target-types/serializers/index.ts",
"src/flag-targets/fixtures/create-flag-target.json",
"src/flag-targets/fixtures/flag-target.json",
"src/flag-targets/fixtures/list-flag-target.json",
"src/flag-targets/flag-targets.spec.ts",
"src/flag-targets/flag-targets.ts",
"src/flag-targets/interfaces/create-flag-target-options.interface.ts",
"src/flag-targets/interfaces/create-flag-target.interface.ts",
"src/flag-targets/interfaces/delete-flag-target-options.interface.ts",
"src/flag-targets/interfaces/flag-target.interface.ts",
"src/flag-targets/interfaces/get-flag-target-options.interface.ts",
"src/flag-targets/interfaces/index.ts",
"src/flag-targets/interfaces/list-flag-targets-options.interface.ts",
"src/flag-targets/serializers/create-flag-target.serializer.ts",
"src/flag-targets/serializers/flag-target.serializer.ts",
"src/flag-targets/serializers/index.ts",
"src/groups/fixtures/create-group-membership.json",
"src/groups/fixtures/create-group.json",
"src/groups/fixtures/group.json",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export interface FlagTarget {
export interface FlagPollTarget {
id: string;
enabled: boolean;
}
Expand All @@ -14,8 +14,8 @@ export interface FlagPollEntry {
enabled: boolean;
default_value: boolean;
targets: {
users: FlagTarget[];
organizations: FlagTarget[];
users: FlagPollTarget[];
organizations: FlagPollTarget[];
/** Absent until the API's custom-targets rollout flag is enabled. */
custom_targets?: FlagCustomTarget[];
};
Expand Down
7 changes: 5 additions & 2 deletions src/feature-flags/runtime-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
FlagCustomTarget,
FlagPollEntry,
FlagPollResponse,
FlagTarget,
FlagPollTarget,
RuntimeClientOptions,
RuntimeClientLogger,
RuntimeClientStats,
Expand Down Expand Up @@ -300,7 +300,10 @@ export class FeatureFlagsRuntimeClient extends EventEmitter<RuntimeClientEvents>
return true;
}

const targetsChanged = (xs: FlagTarget[], ys: FlagTarget[]): boolean => {
const targetsChanged = (
xs: FlagPollTarget[],
ys: FlagPollTarget[],
): boolean => {
if (xs.length !== ys.length) return true;
const map = new Map(ys.map((t) => [t.id, t.enabled]));
return xs.some((t) => map.get(t.id) !== t.enabled);
Expand Down
3 changes: 3 additions & 0 deletions src/flag-target-types/fixtures/create-flag-target-type.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"slug": "workspace"
}
7 changes: 7 additions & 0 deletions src/flag-target-types/fixtures/flag-target-type.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"object": "flag_target_type",
"id": "flag_target_type_01EHZNVPK3SFK441A1RGBFSHRT",
"slug": "workspace",
"created_at": "2026-01-15T12:00:00.000Z",
"updated_at": "2026-01-15T12:00:00.000Z"
}
15 changes: 15 additions & 0 deletions src/flag-target-types/fixtures/list-flag-target-type.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"data": [
{
"object": "flag_target_type",
"id": "flag_target_type_01EHZNVPK3SFK441A1RGBFSHRT",
"slug": "workspace",
"created_at": "2026-01-15T12:00:00.000Z",
"updated_at": "2026-01-15T12:00:00.000Z"
}
],
"list_metadata": {
"before": null,
"after": null
}
}
78 changes: 78 additions & 0 deletions src/flag-target-types/flag-target-types.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// This file is auto-generated by oagen. Do not edit.

import fetch from 'jest-fetch-mock';
import {
fetchOnce,
fetchURL,
fetchMethod,
fetchSearchParams,
fetchBody,
} from '../common/utils/test-utils';
import { WorkOS } from '../workos';

import listFlagTargetTypeFixture from './fixtures/list-flag-target-type.json';
import flagTargetTypeFixture from './fixtures/flag-target-type.json';

const workos = new WorkOS('sk_test_Sz3IQjepeSWaI4cMS4ms4sMuU');

function expectFlagTargetType(result: any) {
expect(result.object).toBe('flag_target_type');
expect(result.id).toBe('flag_target_type_01EHZNVPK3SFK441A1RGBFSHRT');
expect(result.slug).toBe('workspace');
expect(result.createdAt.toISOString()).toBe('2026-01-15T12:00:00.000Z');
expect(result.updatedAt.toISOString()).toBe('2026-01-15T12:00:00.000Z');
}

describe('FlagTargetTypes', () => {
beforeEach(() => fetch.resetMocks());

describe('listFlagTargetTypes', () => {
it('returns paginated results', async () => {
fetchOnce(listFlagTargetTypeFixture);

const { data, listMetadata } =
await workos.flagTargetTypes.listFlagTargetTypes({ order: 'desc' });

expect(fetchMethod()).toBe('GET');
expect(new URL(String(fetchURL())).pathname).toBe('/flag_target_types');
expect(fetchSearchParams()).toHaveProperty('order');
expect(Array.isArray(data)).toBe(true);
expect(listMetadata).toBeDefined();
expect(data.length).toBeGreaterThan(0);
expectFlagTargetType(data[0]);
});
});

describe('createFlagTargetType', () => {
it('sends the correct request and returns result', async () => {
fetchOnce(flagTargetTypeFixture);

const result = await workos.flagTargetTypes.createFlagTargetType({
slug: 'test_slug',
});

expect(fetchMethod()).toBe('POST');
expect(new URL(String(fetchURL())).pathname).toBe('/flag_target_types');
expect(fetchBody()).toEqual(
expect.objectContaining({ slug: 'test_slug' }),
);
expectFlagTargetType(result);
});
});

describe('getFlagTargetType', () => {
it('returns the expected result', async () => {
fetchOnce(flagTargetTypeFixture);

const result = await workos.flagTargetTypes.getFlagTargetType({
id: 'test_id',
});

expect(fetchMethod()).toBe('GET');
expect(new URL(String(fetchURL())).pathname).toBe(
'/flag_target_types/test_id',
);
expectFlagTargetType(result);
});
});
});
87 changes: 87 additions & 0 deletions src/flag-target-types/flag-target-types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
// This file is auto-generated by oagen. Do not edit.

import type { WorkOS } from '../workos';
import { AutoPaginatable } from '../common/utils/pagination';
import { fetchAndDeserialize } from '../common/utils/fetch-and-deserialize';
import type { ListFlagTargetTypesOptions } from './interfaces/list-flag-target-types-options.interface';
import type { CreateFlagTargetTypeOptions } from './interfaces/create-flag-target-type-options.interface';
import type { GetFlagTargetTypeOptions } from './interfaces/get-flag-target-type-options.interface';
import type {
FlagTargetType,
FlagTargetTypeResponse,
} from './interfaces/flag-target-type.interface';
import type { CreateFlagTargetTypeResponse } from './interfaces/create-flag-target-type.interface';
import { deserializeFlagTargetType } from './serializers/flag-target-type.serializer';
import { serializeCreateFlagTargetType } from './serializers/create-flag-target-type.serializer';

export class FlagTargetTypes {
constructor(private readonly workos: WorkOS) {}

/**
* List flag target types
*
* Get a list of the custom Flag Target Types registered for the current environment's project. The built-in `user` and `organization` target types are not included.
* @param options - Pagination and filter options.
* @returns {Promise<AutoPaginatable<FlagTargetType>>}
* @throws {BadRequestException} 400
*/
async listFlagTargetTypes(
options?: ListFlagTargetTypesOptions,
): Promise<AutoPaginatable<FlagTargetType, ListFlagTargetTypesOptions>> {
const paginationOptions = options;
return new AutoPaginatable(
await fetchAndDeserialize<FlagTargetTypeResponse, FlagTargetType>(
this.workos,
'/flag_target_types',
deserializeFlagTargetType,
paginationOptions,
),
(params) =>
fetchAndDeserialize<FlagTargetTypeResponse, FlagTargetType>(
this.workos,
'/flag_target_types',
deserializeFlagTargetType,
params,
),
paginationOptions,
);
}

/**
* Create a flag target type
*
* Register a custom Flag Target Type, making its slug usable as the `target_type` of a Flag Target anywhere in the project.
* @returns {Promise<FlagTargetType>}
* @throws {BadRequestException} 400
*/
async createFlagTargetType(
options: CreateFlagTargetTypeOptions,
): Promise<FlagTargetType> {
const payload = options;
const { data } = await this.workos.post<
FlagTargetTypeResponse,
CreateFlagTargetTypeResponse
>('/flag_target_types', serializeCreateFlagTargetType(payload));
return deserializeFlagTargetType(data);
}

/**
* Get a flag target type
*
* Get the details of an existing Flag Target Type.
* @param options - The request options.
* @param options.id - Unique identifier of the Flag Target Type.
* @example "flag_target_type_01EHZNVPK3SFK441A1RGBFSHRT"
* @returns {Promise<FlagTargetType>}
* @throws {NotFoundException} 404
*/
async getFlagTargetType(
options: GetFlagTargetTypeOptions,
): Promise<FlagTargetType> {
const { id } = options;
const { data } = await this.workos.get<FlagTargetTypeResponse>(
`/flag_target_types/${encodeURIComponent(id)}`,
);
return deserializeFlagTargetType(data);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// This file is auto-generated by oagen. Do not edit.

export interface CreateFlagTargetTypeOptions {
/** A unique key used as the `target_type` of a Flag Target, scoped to the project. May contain lowercase letters, numbers, underscores and hyphens. */
slug: string;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// This file is auto-generated by oagen. Do not edit.

export interface CreateFlagTargetType {
/** A unique key used as the `target_type` of a Flag Target, scoped to the project. May contain lowercase letters, numbers, underscores and hyphens. */
slug: string;
}

export interface CreateFlagTargetTypeResponse {
slug: string;
}
22 changes: 22 additions & 0 deletions src/flag-target-types/interfaces/flag-target-type.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// This file is auto-generated by oagen. Do not edit.

export interface FlagTargetType {
/** Distinguishes the Flag Target Type object. */
object: 'flag_target_type';
/** Unique identifier of the Flag Target Type. */
id: string;
/** A unique key used as the `target_type` of a Flag Target, scoped to the project. */
slug: string;
/** An ISO 8601 timestamp. */
createdAt: Date;
/** An ISO 8601 timestamp. */
updatedAt: Date;
}

export interface FlagTargetTypeResponse {
object: 'flag_target_type';
id: string;
slug: string;
created_at: string;
updated_at: string;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// This file is auto-generated by oagen. Do not edit.

export interface GetFlagTargetTypeOptions {
/** Unique identifier of the Flag Target Type. */
id: string;
}
7 changes: 7 additions & 0 deletions src/flag-target-types/interfaces/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// This file is auto-generated by oagen. Do not edit.

export * from './create-flag-target-type-options.interface';
export * from './create-flag-target-type.interface';
export * from './flag-target-type.interface';
export * from './get-flag-target-type-options.interface';
export * from './list-flag-target-types-options.interface';
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// This file is auto-generated by oagen. Do not edit.

import type { PaginationOptions } from '../../common/interfaces/pagination-options.interface';

export type ListFlagTargetTypesOptions = PaginationOptions;
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// This file is auto-generated by oagen. Do not edit.

import type {
CreateFlagTargetType,
CreateFlagTargetTypeResponse,
} from '../interfaces/create-flag-target-type.interface';

export const serializeCreateFlagTargetType = (
model: CreateFlagTargetType,
): CreateFlagTargetTypeResponse => ({
slug: model.slug,
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// This file is auto-generated by oagen. Do not edit.

import type {
FlagTargetType,
FlagTargetTypeResponse,
} from '../interfaces/flag-target-type.interface';

export const deserializeFlagTargetType = (
response: FlagTargetTypeResponse,
): FlagTargetType => ({
object: response.object,
id: response.id,
slug: response.slug,
createdAt: new Date(response.created_at),
updatedAt: new Date(response.updated_at),
});
4 changes: 4 additions & 0 deletions src/flag-target-types/serializers/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// This file is auto-generated by oagen. Do not edit.

export * from './create-flag-target-type.serializer';
export * from './flag-target-type.serializer';
5 changes: 5 additions & 0 deletions src/flag-targets/fixtures/create-flag-target.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"flag_slug": "new-checkout",
"target_type": "organization",
"target_id": "org_01EHWNCE74X7JSDV0X3SZ3KJNY"
}
13 changes: 13 additions & 0 deletions src/flag-targets/fixtures/flag-target.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"object": "flag_target",
"id": "flag_target_01EHZNVPK3SFK441A1RGBFSHRT",
"flag_id": "flag_01EHZNVPK3SFK441A1RGBFSHRT",
"flag_slug": "new-checkout",
"environment_id": "environment_01EHWNCE74X7JSDV0X3SZ3KJNY",
"target_type": "organization",
"target_id": "org_01EHWNCE74X7JSDV0X3SZ3KJNY",
"value_type": "boolean",
"value": true,
"created_at": "2026-01-15T12:00:00.000Z",
"updated_at": "2026-01-15T12:00:00.000Z"
}
Loading