cloudflare
Version:
The official TypeScript library for the Cloudflare API
894 lines (737 loc) • 26.9 kB
text/typescript
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
import { APIResource } from '../../../../core/resource';
import {
CursorPaginationAfter,
type CursorPaginationAfterParams,
PagePromise,
} from '../../../../core/pagination';
import { RequestOptions } from '../../../../internal/request-options';
import { path } from '../../../../internal/utils/path';
export class BaseChangelog extends APIResource {
static override readonly _key: readonly ['flagship', 'apps', 'flags', 'changelog'] = Object.freeze([
'flagship',
'apps',
'flags',
'changelog',
] as const);
/**
* Returns the audit history for a flag, newest first. Each entry includes the
* event type and full flag state after the change; `update` entries include a
* field-level diff. Capped at 200 entries per flag.
*/
list(
flagKey: string,
params: ChangelogListParams,
options?: RequestOptions,
): PagePromise<ChangelogListResponsesCursorPaginationAfter, ChangelogListResponse> {
const { account_id, app_id, ...query } = params;
return this._client.getAPIList(
path`/accounts/${account_id}/flagship/apps/${app_id}/flags/${flagKey}/changelog`,
CursorPaginationAfter<ChangelogListResponse>,
{ query, ...options },
);
}
}
export class Changelog extends BaseChangelog {}
export type ChangelogListResponsesCursorPaginationAfter = CursorPaginationAfter<ChangelogListResponse>;
export type ChangelogListResponse =
| ChangelogListResponse.UnionMember0
| ChangelogListResponse.UnionMember1
| ChangelogListResponse.UnionMember2;
export namespace ChangelogListResponse {
export interface UnionMember0 {
after: UnionMember0.After;
event: 'create';
flag_key: string;
}
export namespace UnionMember0 {
export interface After {
/**
* Variation the API serves when the flag is off, or when it's on but no rule
* matches the context. Must be a key in `variations`.
*/
default_variation: string;
/**
* When false, the flag bypasses all rules and always serves `default_variation`.
*/
enabled: boolean;
/**
* Unique identifier for the flag within an app. Used in all evaluation and SDK
* calls.
*/
key: string;
/**
* Targeting rules evaluated in ascending `priority`; the first matching rule wins.
* An empty array means the flag always serves `default_variation`.
*/
rules: Array<After.Rule>;
/**
* Server-inferred value type shared by all of the flag's variations.
*/
type: 'boolean' | 'string' | 'number' | 'json';
/**
* Map of variation name to value. All values share the same type (boolean, string,
* number, or JSON object/array), and each serialized value stays within 10KB.
*/
variations: {
[key: string]: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
};
/**
* Optional operator-facing description. It does not affect flag evaluation.
*/
description?: string | null;
updated_at?: string;
updated_by?: string;
}
export namespace After {
export interface Rule {
/**
* Conditions the context must satisfy for this rule to match. An empty array
* matches all contexts.
*/
conditions: Array<Rule.UnionMember0 | Rule.UnionMember1>;
/**
* Evaluation order: the API evaluates rules with lower numbers first. Must be
* unique across the flag's rules.
*/
priority: number;
/**
* Variation the API serves when this rule matches. Must be a key in `variations`.
*/
serve_variation: string;
rollout?: Rule.Rollout;
}
export namespace Rule {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<
string | null | number | boolean | { [key: string]: unknown } | Array<unknown>
>;
logical_operator: 'AND' | 'OR';
}
}
}
}
}
}
export interface Rollout {
/**
* Percentage of matching traffic (0–100, up to 2 decimal places) served this
* variation. For multi-way splits, use cumulative upper bounds across rules (e.g.
* 30, 70, 100).
*/
percentage: number;
/**
* Context attribute used for sticky bucketing. Defaults to `targetingKey`. If
* absent at evaluation time, bucketing is random per request.
*/
attribute?: string;
}
}
}
}
export interface UnionMember1 {
after: UnionMember1.After;
event: 'delete';
flag_key: string;
}
export namespace UnionMember1 {
export interface After {
/**
* Variation the API serves when the flag is off, or when it's on but no rule
* matches the context. Must be a key in `variations`.
*/
default_variation: string;
/**
* When false, the flag bypasses all rules and always serves `default_variation`.
*/
enabled: boolean;
/**
* Unique identifier for the flag within an app. Used in all evaluation and SDK
* calls.
*/
key: string;
/**
* Targeting rules evaluated in ascending `priority`; the first matching rule wins.
* An empty array means the flag always serves `default_variation`.
*/
rules: Array<After.Rule>;
/**
* Server-inferred value type shared by all of the flag's variations.
*/
type: 'boolean' | 'string' | 'number' | 'json';
/**
* Map of variation name to value. All values share the same type (boolean, string,
* number, or JSON object/array), and each serialized value stays within 10KB.
*/
variations: {
[key: string]: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
};
/**
* Optional operator-facing description. It does not affect flag evaluation.
*/
description?: string | null;
updated_at?: string;
updated_by?: string;
}
export namespace After {
export interface Rule {
/**
* Conditions the context must satisfy for this rule to match. An empty array
* matches all contexts.
*/
conditions: Array<Rule.UnionMember0 | Rule.UnionMember1>;
/**
* Evaluation order: the API evaluates rules with lower numbers first. Must be
* unique across the flag's rules.
*/
priority: number;
/**
* Variation the API serves when this rule matches. Must be a key in `variations`.
*/
serve_variation: string;
rollout?: Rule.Rollout;
}
export namespace Rule {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<
string | null | number | boolean | { [key: string]: unknown } | Array<unknown>
>;
logical_operator: 'AND' | 'OR';
}
}
}
}
}
}
export interface Rollout {
/**
* Percentage of matching traffic (0–100, up to 2 decimal places) served this
* variation. For multi-way splits, use cumulative upper bounds across rules (e.g.
* 30, 70, 100).
*/
percentage: number;
/**
* Context attribute used for sticky bucketing. Defaults to `targetingKey`. If
* absent at evaluation time, bucketing is random per request.
*/
attribute?: string;
}
}
}
}
export interface UnionMember2 {
after: UnionMember2.After;
diff: { [key: string]: UnionMember2.Diff };
event: 'update';
flag_key: string;
}
export namespace UnionMember2 {
export interface After {
/**
* Variation the API serves when the flag is off, or when it's on but no rule
* matches the context. Must be a key in `variations`.
*/
default_variation: string;
/**
* When false, the flag bypasses all rules and always serves `default_variation`.
*/
enabled: boolean;
/**
* Unique identifier for the flag within an app. Used in all evaluation and SDK
* calls.
*/
key: string;
/**
* Targeting rules evaluated in ascending `priority`; the first matching rule wins.
* An empty array means the flag always serves `default_variation`.
*/
rules: Array<After.Rule>;
/**
* Server-inferred value type shared by all of the flag's variations.
*/
type: 'boolean' | 'string' | 'number' | 'json';
/**
* Map of variation name to value. All values share the same type (boolean, string,
* number, or JSON object/array), and each serialized value stays within 10KB.
*/
variations: {
[key: string]: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
};
/**
* Optional operator-facing description. It does not affect flag evaluation.
*/
description?: string | null;
updated_at?: string;
updated_by?: string;
}
export namespace After {
export interface Rule {
/**
* Conditions the context must satisfy for this rule to match. An empty array
* matches all contexts.
*/
conditions: Array<Rule.UnionMember0 | Rule.UnionMember1>;
/**
* Evaluation order: the API evaluates rules with lower numbers first. Must be
* unique across the flag's rules.
*/
priority: number;
/**
* Variation the API serves when this rule matches. Must be a key in `variations`.
*/
serve_variation: string;
rollout?: Rule.Rollout;
}
export namespace Rule {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<UnionMember1.UnionMember0 | UnionMember1.UnionMember1>;
logical_operator: 'AND' | 'OR';
}
export namespace UnionMember1 {
export interface UnionMember0 {
attribute: string;
operator:
| 'equals'
| 'not_equals'
| 'greater_than'
| 'less_than'
| 'greater_than_or_equals'
| 'less_than_or_equals'
| 'contains'
| 'starts_with'
| 'ends_with'
| 'in'
| 'not_in'
| 'has'
| 'not_has';
value: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
export interface UnionMember1 {
clauses: Array<
string | null | number | boolean | { [key: string]: unknown } | Array<unknown>
>;
logical_operator: 'AND' | 'OR';
}
}
}
}
}
}
export interface Rollout {
/**
* Percentage of matching traffic (0–100, up to 2 decimal places) served this
* variation. For multi-way splits, use cumulative upper bounds across rules (e.g.
* 30, 70, 100).
*/
percentage: number;
/**
* Context attribute used for sticky bucketing. Defaults to `targetingKey`. If
* absent at evaluation time, bucketing is random per request.
*/
attribute?: string;
}
}
}
export interface Diff {
from?: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
to?: string | null | number | boolean | { [key: string]: unknown } | Array<unknown>;
}
}
}
export interface ChangelogListParams extends CursorPaginationAfterParams {
/**
* Path param: Cloudflare account ID that owns the Flagship app.
*/
account_id: string;
/**
* Path param: Flagship app ID returned when the app was created.
*/
app_id: string;
/**
* Query param: Max items to return (1–200).
*/
limit?: number;
}
export declare namespace Changelog {
export {
type ChangelogListResponse as ChangelogListResponse,
type ChangelogListResponsesCursorPaginationAfter as ChangelogListResponsesCursorPaginationAfter,
type ChangelogListParams as ChangelogListParams,
};
}