@atlasauth/backend 0.24.0 → 0.26.0

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.
Files changed (201) hide show
  1. package/CHANGELOG.md +39 -1
  2. package/dist/client/abac.d.ts +521 -0
  3. package/dist/client/abac.js +146 -0
  4. package/dist/client/abac.js.map +1 -0
  5. package/dist/client/access-policies.d.ts +100 -0
  6. package/dist/client/access-policies.js +29 -0
  7. package/dist/client/access-policies.js.map +1 -0
  8. package/dist/client/action-gallery.d.ts +1 -1
  9. package/dist/client/action-gallery.js.map +1 -1
  10. package/dist/client/actions.d.ts +129 -6
  11. package/dist/client/actions.js +4 -0
  12. package/dist/client/actions.js.map +1 -1
  13. package/dist/client/analytics-reports.d.ts +215 -0
  14. package/dist/client/analytics-reports.js +56 -0
  15. package/dist/client/analytics-reports.js.map +1 -0
  16. package/dist/client/app-catalog.d.ts +74 -0
  17. package/dist/client/app-catalog.js +30 -0
  18. package/dist/client/app-catalog.js.map +1 -0
  19. package/dist/client/attack-protection.d.ts +10 -0
  20. package/dist/client/attack-protection.js +8 -0
  21. package/dist/client/attack-protection.js.map +1 -1
  22. package/dist/client/audit-events.d.ts +71 -0
  23. package/dist/client/audit-events.js +28 -0
  24. package/dist/client/audit-events.js.map +1 -1
  25. package/dist/client/authz-decisions.d.ts +108 -0
  26. package/dist/client/authz-decisions.js +40 -0
  27. package/dist/client/authz-decisions.js.map +1 -0
  28. package/dist/client/connections.d.ts +507 -0
  29. package/dist/client/connections.js +164 -0
  30. package/dist/client/connections.js.map +1 -0
  31. package/dist/client/credentials.d.ts +8 -0
  32. package/dist/client/credentials.js.map +1 -1
  33. package/dist/client/custom-oauth-providers.d.ts +15 -0
  34. package/dist/client/custom-oauth-providers.js.map +1 -1
  35. package/dist/client/delegated-ui-proxy.d.ts +25 -0
  36. package/dist/client/delegated-ui-proxy.js +46 -0
  37. package/dist/client/delegated-ui-proxy.js.map +1 -0
  38. package/dist/client/desktop-mfa.d.ts +104 -0
  39. package/dist/client/desktop-mfa.js +44 -0
  40. package/dist/client/desktop-mfa.js.map +1 -0
  41. package/dist/client/devices.d.ts +44 -0
  42. package/dist/client/devices.js +26 -0
  43. package/dist/client/devices.js.map +1 -0
  44. package/dist/client/email-templates.d.ts +1 -1
  45. package/dist/client/email-templates.js.map +1 -1
  46. package/dist/client/fga.d.ts +125 -4
  47. package/dist/client/fga.js +40 -0
  48. package/dist/client/fga.js.map +1 -1
  49. package/dist/client/flags.d.ts +101 -0
  50. package/dist/client/flags.js +104 -0
  51. package/dist/client/flags.js.map +1 -0
  52. package/dist/client/groups.d.ts +146 -0
  53. package/dist/client/groups.js +67 -0
  54. package/dist/client/groups.js.map +1 -0
  55. package/dist/client/identity-verification.d.ts +62 -0
  56. package/dist/client/identity-verification.js +39 -0
  57. package/dist/client/identity-verification.js.map +1 -0
  58. package/dist/client/iga.d.ts +436 -0
  59. package/dist/client/iga.js +82 -0
  60. package/dist/client/iga.js.map +1 -0
  61. package/dist/client/index.d.ts +1433 -4
  62. package/dist/client/index.js +96 -0
  63. package/dist/client/index.js.map +1 -1
  64. package/dist/client/journeys.d.ts +108 -0
  65. package/dist/client/journeys.js +35 -0
  66. package/dist/client/journeys.js.map +1 -0
  67. package/dist/client/least-privilege.d.ts +95 -0
  68. package/dist/client/least-privilege.js +28 -0
  69. package/dist/client/least-privilege.js.map +1 -0
  70. package/dist/client/log-streams.d.ts +1 -1
  71. package/dist/client/managed-grants.d.ts +52 -0
  72. package/dist/client/managed-grants.js +28 -0
  73. package/dist/client/managed-grants.js.map +1 -0
  74. package/dist/client/marketing.d.ts +67 -0
  75. package/dist/client/marketing.js +26 -0
  76. package/dist/client/marketing.js.map +1 -0
  77. package/dist/client/mcp-gateways.d.ts +126 -0
  78. package/dist/client/mcp-gateways.js +47 -0
  79. package/dist/client/mcp-gateways.js.map +1 -0
  80. package/dist/client/messaging.d.ts +14 -3
  81. package/dist/client/messaging.js.map +1 -1
  82. package/dist/client/mfa-factors.d.ts +120 -0
  83. package/dist/client/mfa-factors.js +73 -0
  84. package/dist/client/mfa-factors.js.map +1 -0
  85. package/dist/client/migrations.d.ts +1 -1
  86. package/dist/client/migrations.js.map +1 -1
  87. package/dist/client/network-acls.d.ts +6 -1
  88. package/dist/client/network-acls.js.map +1 -1
  89. package/dist/client/network-zones.d.ts +56 -0
  90. package/dist/client/network-zones.js +29 -0
  91. package/dist/client/network-zones.js.map +1 -0
  92. package/dist/client/notifications.d.ts +1 -1
  93. package/dist/client/notifications.js.map +1 -1
  94. package/dist/client/oauth-clients.d.ts +187 -3
  95. package/dist/client/oauth-clients.js +64 -0
  96. package/dist/client/oauth-clients.js.map +1 -1
  97. package/dist/client/openfga.d.ts +90 -3
  98. package/dist/client/openfga.js +27 -1
  99. package/dist/client/openfga.js.map +1 -1
  100. package/dist/client/org-role-grants.d.ts +57 -0
  101. package/dist/client/org-role-grants.js +40 -0
  102. package/dist/client/org-role-grants.js.map +1 -0
  103. package/dist/client/organizations.d.ts +52 -0
  104. package/dist/client/organizations.js +44 -0
  105. package/dist/client/organizations.js.map +1 -1
  106. package/dist/client/page-templates.d.ts +78 -0
  107. package/dist/client/page-templates.js +31 -0
  108. package/dist/client/page-templates.js.map +1 -0
  109. package/dist/client/passkey-api.d.ts +73 -0
  110. package/dist/client/passkey-api.js +34 -0
  111. package/dist/client/passkey-api.js.map +1 -0
  112. package/dist/client/policy-bundles.d.ts +105 -0
  113. package/dist/client/policy-bundles.js +38 -0
  114. package/dist/client/policy-bundles.js.map +1 -0
  115. package/dist/client/resources.d.ts +150 -0
  116. package/dist/client/resources.js +73 -0
  117. package/dist/client/resources.js.map +1 -0
  118. package/dist/client/risk-based-mfa.d.ts +147 -0
  119. package/dist/client/risk-based-mfa.js +30 -0
  120. package/dist/client/risk-based-mfa.js.map +1 -1
  121. package/dist/client/roles.d.ts +4 -0
  122. package/dist/client/roles.js.map +1 -1
  123. package/dist/client/service-connectors.d.ts +83 -0
  124. package/dist/client/service-connectors.js +33 -0
  125. package/dist/client/service-connectors.js.map +1 -0
  126. package/dist/client/ssf.d.ts +112 -0
  127. package/dist/client/ssf.js +49 -0
  128. package/dist/client/ssf.js.map +1 -0
  129. package/dist/client/sso-onboarding.d.ts +6 -0
  130. package/dist/client/sso-onboarding.js.map +1 -1
  131. package/dist/client/users.d.ts +302 -0
  132. package/dist/client/users.js +125 -0
  133. package/dist/client/users.js.map +1 -1
  134. package/dist/client/vault.d.ts +85 -0
  135. package/dist/client/vault.js +50 -0
  136. package/dist/client/vault.js.map +1 -0
  137. package/dist/client/vc.d.ts +136 -0
  138. package/dist/client/vc.js +43 -0
  139. package/dist/client/vc.js.map +1 -0
  140. package/dist/client/webhooks.d.ts +31 -2
  141. package/dist/client/webhooks.js.map +1 -1
  142. package/dist/client/workflows.d.ts +131 -0
  143. package/dist/client/workflows.js +36 -0
  144. package/dist/client/workflows.js.map +1 -0
  145. package/dist/index.d.ts +5 -0
  146. package/dist/index.js +11 -2
  147. package/dist/index.js.map +1 -1
  148. package/dist/magic-did.d.ts +5 -0
  149. package/dist/magic-did.js +49 -0
  150. package/dist/magic-did.js.map +1 -0
  151. package/dist/migration-bridge.d.ts +9 -0
  152. package/dist/migration-bridge.js +28 -2
  153. package/dist/migration-bridge.js.map +1 -1
  154. package/dist/migration-presets-g3.d.ts +2 -0
  155. package/dist/migration-presets-g3.js +254 -0
  156. package/dist/migration-presets-g3.js.map +1 -0
  157. package/dist/migration-presets-g4/authentik.d.ts +14 -0
  158. package/dist/migration-presets-g4/authentik.js +37 -0
  159. package/dist/migration-presets-g4/authentik.js.map +1 -0
  160. package/dist/migration-presets-g4/fusionauth.d.ts +2 -0
  161. package/dist/migration-presets-g4/fusionauth.js +52 -0
  162. package/dist/migration-presets-g4/fusionauth.js.map +1 -0
  163. package/dist/migration-presets-g4/hanko.d.ts +12 -0
  164. package/dist/migration-presets-g4/hanko.js +46 -0
  165. package/dist/migration-presets-g4/hanko.js.map +1 -0
  166. package/dist/migration-presets-g4/keycloak.d.ts +16 -0
  167. package/dist/migration-presets-g4/keycloak.js +37 -0
  168. package/dist/migration-presets-g4/keycloak.js.map +1 -0
  169. package/dist/migration-presets-g4/logto.d.ts +12 -0
  170. package/dist/migration-presets-g4/logto.js +35 -0
  171. package/dist/migration-presets-g4/logto.js.map +1 -0
  172. package/dist/migration-presets-g4/ory.d.ts +2 -0
  173. package/dist/migration-presets-g4/ory.js +67 -0
  174. package/dist/migration-presets-g4/ory.js.map +1 -0
  175. package/dist/migration-presets-g4/supertokens.d.ts +13 -0
  176. package/dist/migration-presets-g4/supertokens.js +35 -0
  177. package/dist/migration-presets-g4/supertokens.js.map +1 -0
  178. package/dist/migration-presets-g4/zitadel.d.ts +2 -0
  179. package/dist/migration-presets-g4/zitadel.js +36 -0
  180. package/dist/migration-presets-g4/zitadel.js.map +1 -0
  181. package/dist/migration-presets-g4.d.ts +10 -0
  182. package/dist/migration-presets-g4.js +30 -0
  183. package/dist/migration-presets-g4.js.map +1 -0
  184. package/dist/migration-presets.d.ts +6 -0
  185. package/dist/migration-presets.js +102 -6
  186. package/dist/migration-presets.js.map +1 -1
  187. package/dist/policy-bundle.d.ts +110 -0
  188. package/dist/policy-bundle.js +289 -0
  189. package/dist/policy-bundle.js.map +1 -0
  190. package/dist/request-auth.d.ts +32 -0
  191. package/dist/request-auth.js +72 -0
  192. package/dist/request-auth.js.map +1 -0
  193. package/dist/uma.d.ts +77 -0
  194. package/dist/uma.js +95 -0
  195. package/dist/uma.js.map +1 -0
  196. package/dist/verify.d.ts +2 -0
  197. package/dist/verify.js.map +1 -1
  198. package/dist/workos-session.d.ts +30 -0
  199. package/dist/workos-session.js +123 -0
  200. package/dist/workos-session.js.map +1 -0
  201. package/package.json +2 -2
@@ -29,13 +29,31 @@ export interface FgaTuple {
29
29
  relation: string;
30
30
  /** The object of the tuple as `type:id`. */
31
31
  target: string;
32
+ condition?: FgaTupleCondition;
32
33
  created_at: number;
33
34
  }
35
+ /** A model condition bound to a tuple, with the parameter values fixed on it. */
36
+ export interface FgaTupleCondition {
37
+ name: string;
38
+ context?: Record<string, unknown>;
39
+ }
34
40
  /** A tuple key. `object` is the target as `type:id`; `target` is accepted too. */
35
41
  export interface FgaTupleKey {
36
42
  user: string;
37
43
  relation: string;
38
44
  object: string;
45
+ /** The tuple grants only while this model condition holds. */
46
+ condition?: FgaTupleCondition;
47
+ }
48
+ /**
49
+ * Freshness of a read. `MINIMIZE_LATENCY` (and the default) may be served from a
50
+ * short-lived cache; `HIGHER_CONSISTENCY` reads the primary.
51
+ */
52
+ export type FgaConsistency = 'UNSPECIFIED' | 'MINIMIZE_LATENCY' | 'HIGHER_CONSISTENCY';
53
+ export interface FgaConsistencyOptions {
54
+ consistency?: FgaConsistency;
55
+ /** A token from a write: the read reflects at least that write. */
56
+ consistency_token?: string;
39
57
  }
40
58
  /** An OpenFGA authorization model to persist. Validated before storage. */
41
59
  export interface FgaAuthorizationModelInput {
@@ -48,20 +66,80 @@ export interface FgaAuthorizationModelInput {
48
66
  export type FgaTupleKeys = FgaTupleKey[] | {
49
67
  tuple_keys: FgaTupleKey[];
50
68
  };
51
- export interface FgaCheckBody {
69
+ export interface FgaCheckBody extends FgaConsistencyOptions {
52
70
  user: string;
53
71
  relation: string;
54
72
  object: string;
55
73
  /** Defaults to the store's latest model. */
56
74
  authorization_model_id?: string;
57
75
  contextual_tuples?: FgaTupleKeys;
76
+ /** Values for tuple-condition parameters (a tuple's own context wins). */
77
+ context?: Record<string, unknown>;
58
78
  }
59
- export interface FgaListObjectsBody {
79
+ export interface FgaListObjectsBody extends FgaConsistencyOptions {
60
80
  user: string;
61
81
  relation: string;
62
82
  type: string;
63
83
  authorization_model_id?: string;
64
84
  contextual_tuples?: FgaTupleKeys;
85
+ /** Page size; without it every object is returned. */
86
+ limit?: number;
87
+ /** The `next_cursor` of the previous page. */
88
+ starting_after?: string;
89
+ context?: Record<string, unknown>;
90
+ }
91
+ export interface FgaListUsersBody extends FgaConsistencyOptions {
92
+ /** `type:id`. */
93
+ object: string;
94
+ relation: string;
95
+ /** Exactly one filter; add `relation` to get usersets such as `group:eng#member`. */
96
+ user_filters: [{
97
+ type: string;
98
+ relation?: string;
99
+ }];
100
+ authorization_model_id?: string;
101
+ contextual_tuples?: FgaTupleKeys;
102
+ context?: Record<string, unknown>;
103
+ /** 1–1000; defaults to 1000. */
104
+ page_size?: number;
105
+ continuation_token?: string;
106
+ }
107
+ export interface FgaListUsersResult {
108
+ object: 'fga.list_users';
109
+ /** `type:id`, `type:id#relation`, or `type:*` for a public wildcard. */
110
+ users: string[];
111
+ /** Ids a wildcard in `users` does not cover. */
112
+ excluded_users: string[];
113
+ /** Pass back for the next page; null on the last. */
114
+ continuation_token: string | null;
115
+ authorization_model_id: string;
116
+ consistency_token: string;
117
+ }
118
+ export interface FgaReadChangesParams {
119
+ /** Only changes to tuples on objects of this type. */
120
+ type?: string;
121
+ /** 1–100; defaults to 50. */
122
+ page_size?: number;
123
+ continuation_token?: string;
124
+ /** RFC 3339: only changes at or after it. */
125
+ start_time?: string;
126
+ }
127
+ export interface FgaTupleChange {
128
+ object: 'fga.tuple_change';
129
+ operation: 'write' | 'delete';
130
+ user: string;
131
+ relation: string;
132
+ target: string;
133
+ condition?: FgaTupleCondition;
134
+ consistency_token: string;
135
+ created_at: number;
136
+ }
137
+ export interface FgaChangesPage {
138
+ object: 'list';
139
+ data: FgaTupleChange[];
140
+ has_more: boolean;
141
+ /** Save it and call again later to receive only newer changes. */
142
+ continuation_token: string;
65
143
  }
66
144
  /** One item in a batch check; `correlation_id` is echoed back to match results. */
67
145
  export interface FgaBatchCheckItem {
@@ -70,16 +148,33 @@ export interface FgaBatchCheckItem {
70
148
  object: string;
71
149
  correlation_id?: string;
72
150
  contextual_tuples?: FgaTupleKeys;
151
+ context?: Record<string, unknown>;
73
152
  }
74
153
  export interface FgaBatchCheckResult {
75
154
  object: 'fga.batch_check';
76
155
  authorization_model_id: string;
156
+ consistency_token: string;
77
157
  result: Array<{
78
158
  correlation_id: string;
79
159
  allowed: boolean;
80
160
  }>;
81
161
  }
162
+ /** How the instance runs FGA reads and keeps its tuple change log. */
163
+ export interface FgaSettings {
164
+ object: 'fga.settings';
165
+ /** Result-cache TTL in ms; null uses the platform default, 0 turns the cache off. */
166
+ cache_ttl_ms: number | null;
167
+ /** Applied to reads that name no `consistency`. */
168
+ default_consistency: FgaConsistency;
169
+ /** Days of tuple change log kept; null keeps all of it. */
170
+ changelog_retention_days: number | null;
171
+ }
172
+ export type UpdateFgaSettingsBody = Partial<Omit<FgaSettings, 'object'>>;
82
173
  export declare function fgaResource(request: RequestFn): {
174
+ settings: {
175
+ get(): Promise<FgaSettings>;
176
+ update(body: UpdateFgaSettingsBody): Promise<FgaSettings>;
177
+ };
83
178
  stores: {
84
179
  list(): Promise<ListPage<FgaStore>>;
85
180
  create(body: {
@@ -105,6 +200,7 @@ export declare function fgaResource(request: RequestFn): {
105
200
  object: "fga.write_result";
106
201
  writes: number;
107
202
  deletes: number;
203
+ consistency_token: string;
108
204
  }>;
109
205
  /** Query stored tuples by any of user / relation / object. */
110
206
  read(storeId: string, body: {
@@ -117,18 +213,35 @@ export declare function fgaResource(request: RequestFn): {
117
213
  object: "fga.check";
118
214
  allowed: boolean;
119
215
  authorization_model_id: string;
216
+ consistency_token: string;
120
217
  }>;
121
218
  /** Resolve MANY access questions in one round trip (list-authorization UIs). */
122
219
  batchCheck(storeId: string, body: {
123
220
  checks: FgaBatchCheckItem[];
124
221
  authorization_model_id?: string;
125
- }): Promise<FgaBatchCheckResult>;
222
+ } & FgaConsistencyOptions): Promise<FgaBatchCheckResult>;
126
223
  /** List the objects of a type a user has a relation to. */
127
224
  listObjects(storeId: string, body: FgaListObjectsBody): Promise<{
128
225
  object: "fga.list_objects";
129
226
  objects: string[];
227
+ has_more: boolean;
228
+ next_cursor: string | null;
130
229
  authorization_model_id: string;
230
+ consistency_token: string;
131
231
  }>;
232
+ /**
233
+ * Who has a relation on an object: concrete users, usersets (give the filter
234
+ * a `relation`) and the `type:*` wildcard with `excluded_users`. One page.
235
+ */
236
+ listUsers(storeId: string, body: FgaListUsersBody): Promise<FgaListUsersResult>;
237
+ /** {@link listUsers} following `continuation_token` until every page is collected. */
238
+ listAllUsers(storeId: string, body: FgaListUsersBody): Promise<FgaListUsersResult>;
239
+ /**
240
+ * The store's tuple change log, in commit order. The returned
241
+ * `continuation_token` works even on the last page: persist it and call again
242
+ * to receive only what changed since.
243
+ */
244
+ readChanges(storeId: string, params?: FgaReadChangesParams): Promise<FgaChangesPage>;
132
245
  /** Expand the full userset tree for an object#relation. */
133
246
  expand(storeId: string, body: {
134
247
  object: string;
@@ -153,6 +266,7 @@ export declare function fgaResource(request: RequestFn): {
153
266
  object: "fga.write_result";
154
267
  writes: number;
155
268
  deletes: number;
269
+ consistency_token: string;
156
270
  }>;
157
271
  read: (body: {
158
272
  user?: string;
@@ -163,16 +277,23 @@ export declare function fgaResource(request: RequestFn): {
163
277
  object: "fga.check";
164
278
  allowed: boolean;
165
279
  authorization_model_id: string;
280
+ consistency_token: string;
166
281
  }>;
167
282
  batchCheck: (body: {
168
283
  checks: FgaBatchCheckItem[];
169
284
  authorization_model_id?: string;
170
- }) => Promise<FgaBatchCheckResult>;
285
+ } & FgaConsistencyOptions) => Promise<FgaBatchCheckResult>;
171
286
  listObjects: (body: FgaListObjectsBody) => Promise<{
172
287
  object: "fga.list_objects";
173
288
  objects: string[];
289
+ has_more: boolean;
290
+ next_cursor: string | null;
174
291
  authorization_model_id: string;
292
+ consistency_token: string;
175
293
  }>;
294
+ listUsers: (body: FgaListUsersBody) => Promise<FgaListUsersResult>;
295
+ listAllUsers: (body: FgaListUsersBody) => Promise<FgaListUsersResult>;
296
+ readChanges: (params?: FgaReadChangesParams) => Promise<FgaChangesPage>;
176
297
  expand: (body: {
177
298
  object: string;
178
299
  relation: string;
@@ -4,6 +4,14 @@ exports.fgaResource = fgaResource;
4
4
  const request_1 = require("./request");
5
5
  function fgaResource(request) {
6
6
  const api = {
7
+ settings: {
8
+ get() {
9
+ return request({ method: 'GET', path: '/v1/fga/settings' });
10
+ },
11
+ update(body) {
12
+ return request({ method: 'PUT', path: '/v1/fga/settings', body });
13
+ },
14
+ },
7
15
  stores: {
8
16
  list() {
9
17
  return request({ method: 'GET', path: '/v1/fga/stores' });
@@ -60,6 +68,35 @@ function fgaResource(request) {
60
68
  listObjects(storeId, body) {
61
69
  return request({ method: 'POST', path: `/v1/fga/stores/${(0, request_1.enc)(storeId)}/list-objects`, body });
62
70
  },
71
+ /**
72
+ * Who has a relation on an object: concrete users, usersets (give the filter
73
+ * a `relation`) and the `type:*` wildcard with `excluded_users`. One page.
74
+ */
75
+ listUsers(storeId, body) {
76
+ return request({ method: 'POST', path: `/v1/fga/stores/${(0, request_1.enc)(storeId)}/list-users`, body });
77
+ },
78
+ /** {@link listUsers} following `continuation_token` until every page is collected. */
79
+ async listAllUsers(storeId, body) {
80
+ let page = await api.listUsers(storeId, body);
81
+ const users = [...page.users];
82
+ while (page.continuation_token) {
83
+ page = await api.listUsers(storeId, { ...body, continuation_token: page.continuation_token });
84
+ users.push(...page.users);
85
+ }
86
+ return { ...page, users };
87
+ },
88
+ /**
89
+ * The store's tuple change log, in commit order. The returned
90
+ * `continuation_token` works even on the last page: persist it and call again
91
+ * to receive only what changed since.
92
+ */
93
+ readChanges(storeId, params = {}) {
94
+ return request({
95
+ method: 'GET',
96
+ path: `/v1/fga/stores/${(0, request_1.enc)(storeId)}/changes`,
97
+ query: { ...params },
98
+ });
99
+ },
63
100
  /** Expand the full userset tree for an object#relation. */
64
101
  expand(storeId, body) {
65
102
  return request({ method: 'POST', path: `/v1/fga/stores/${(0, request_1.enc)(storeId)}/expand`, body });
@@ -77,6 +114,9 @@ function fgaResource(request) {
77
114
  check: (body) => api.check(storeId, body),
78
115
  batchCheck: (body) => api.batchCheck(storeId, body),
79
116
  listObjects: (body) => api.listObjects(storeId, body),
117
+ listUsers: (body) => api.listUsers(storeId, body),
118
+ listAllUsers: (body) => api.listAllUsers(storeId, body),
119
+ readChanges: (params) => api.readChanges(storeId, params),
80
120
  expand: (body) => api.expand(storeId, body),
81
121
  models: {
82
122
  list: () => api.models.list(storeId),
@@ -1 +1 @@
1
- {"version":3,"file":"fga.js","sourceRoot":"","sources":["../../src/client/fga.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fga.js","sourceRoot":"","sources":["../../src/client/fga.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import { type RequestFn } from './request';
2
+ import type { CursorParams } from './types';
3
+ export type FeatureFlagType = 'boolean' | 'string' | 'int' | 'json';
4
+ export type FeatureFlagValue = boolean | string | number | Record<string, unknown> | unknown[];
5
+ /** Who a flag is evaluated for. `user_id` (else `org_id`) seeds percentage rollouts. */
6
+ export interface FeatureFlagSubject {
7
+ user_id?: string | null;
8
+ org_id?: string | null;
9
+ plan?: string | null;
10
+ }
11
+ /** Every given `match` dimension must hold; an empty rule matches everyone. */
12
+ export interface FeatureFlagRule {
13
+ match?: {
14
+ user_ids?: string[];
15
+ org_ids?: string[];
16
+ plans?: string[];
17
+ };
18
+ /** 0–100: the share of matching subjects, stable per flag and subject. */
19
+ percentage?: number;
20
+ value: FeatureFlagValue;
21
+ }
22
+ export interface FeatureFlag {
23
+ object: 'feature_flag';
24
+ id: string;
25
+ key: string;
26
+ type: FeatureFlagType;
27
+ description: string | null;
28
+ enabled: boolean;
29
+ default_value: FeatureFlagValue;
30
+ /** Returned while the flag is switched off. */
31
+ off_value: FeatureFlagValue;
32
+ rules: FeatureFlagRule[];
33
+ created_at: number;
34
+ updated_at: number;
35
+ }
36
+ export interface CreateFeatureFlagBody {
37
+ key: string;
38
+ type: FeatureFlagType;
39
+ default_value: FeatureFlagValue;
40
+ description?: string;
41
+ enabled?: boolean;
42
+ off_value?: FeatureFlagValue;
43
+ rules?: FeatureFlagRule[];
44
+ }
45
+ export type UpdateFeatureFlagBody = Partial<Omit<CreateFeatureFlagBody, 'key' | 'type'>>;
46
+ export interface FeatureFlagEvaluation {
47
+ object: 'feature_flag_evaluation';
48
+ subject: FeatureFlagSubject;
49
+ flags: Record<string, {
50
+ value: FeatureFlagValue;
51
+ reason: string;
52
+ }>;
53
+ }
54
+ export interface AssignEntitlementsBody {
55
+ plan?: string | null;
56
+ features?: string[] | null;
57
+ limits?: Record<string, unknown> | null;
58
+ /** Epoch ms; omit for open-ended. */
59
+ expires_at?: number | null;
60
+ }
61
+ export interface AssignedEntitlements {
62
+ object: 'assigned_entitlements';
63
+ subject_type: 'user' | 'org';
64
+ subject_id: string;
65
+ plan: string | null;
66
+ features: string[] | null;
67
+ limits: Record<string, unknown> | null;
68
+ expires_at: number | null;
69
+ }
70
+ /** Evaluate a flag definition for a subject (first matching in-bucket rule wins, else the default). */
71
+ export declare function evaluateFeatureFlag(flag: FeatureFlag, subject: FeatureFlagSubject): FeatureFlagValue;
72
+ export declare function flagsResource(request: RequestFn, cacheTtlMs?: number): {
73
+ create(body: CreateFeatureFlagBody, idempotencyKey?: string): Promise<FeatureFlag>;
74
+ /** `starting_after` is the key of the last flag of the previous page. */
75
+ list(params?: CursorParams): Promise<{
76
+ object: "list";
77
+ data: FeatureFlag[];
78
+ has_more: boolean;
79
+ }>;
80
+ retrieve(key: string): Promise<FeatureFlag>;
81
+ update(key: string, body: UpdateFeatureFlagBody): Promise<FeatureFlag>;
82
+ delete(key: string): Promise<{
83
+ object: "feature_flag";
84
+ id: string;
85
+ key: string;
86
+ deleted: boolean;
87
+ }>;
88
+ /** Server-side evaluation; `plan` defaults to the org's (else the user's) resolved plan. */
89
+ evaluate(body: FeatureFlagSubject & {
90
+ keys?: string[];
91
+ }): Promise<FeatureFlagEvaluation>;
92
+ /** Local evaluation against cached definitions. `plan` is not looked up here — pass it for plan rules. */
93
+ get<T extends FeatureFlagValue>(key: string, subject: FeatureFlagSubject, fallback: T): Promise<T>;
94
+ /** True only for a boolean flag that evaluates to true; an unknown flag is false. */
95
+ isEnabled(key: string, subject?: FeatureFlagSubject): Promise<boolean>;
96
+ /** Drop the cached definitions (e.g. after changing a flag). */
97
+ invalidate(): void;
98
+ /** Replace the entitlements assigned to an organization (an empty body clears them). */
99
+ assignOrganizationEntitlements(orgId: string, body: AssignEntitlementsBody): Promise<AssignedEntitlements>;
100
+ assignUserEntitlements(userId: string, body: AssignEntitlementsBody): Promise<AssignedEntitlements>;
101
+ };
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateFeatureFlag = evaluateFeatureFlag;
4
+ exports.flagsResource = flagsResource;
5
+ const sha256_1 = require("@noble/hashes/sha256");
6
+ const request_1 = require("./request");
7
+ /** Same bucketing as the server: the same subject lands in the same bucket everywhere. */
8
+ function bucket(flagKey, subjectKey) {
9
+ const d = (0, sha256_1.sha256)(new TextEncoder().encode(`${flagKey}:${subjectKey}`));
10
+ return (((d[0] << 24) | (d[1] << 16) | (d[2] << 8) | d[3]) >>> 0) % 100;
11
+ }
12
+ /** Evaluate a flag definition for a subject (first matching in-bucket rule wins, else the default). */
13
+ function evaluateFeatureFlag(flag, subject) {
14
+ if (!flag.enabled)
15
+ return flag.off_value;
16
+ const seed = subject.user_id ?? subject.org_id ?? '';
17
+ for (const rule of flag.rules) {
18
+ const m = rule.match ?? {};
19
+ if (m.user_ids && (!subject.user_id || !m.user_ids.includes(subject.user_id)))
20
+ continue;
21
+ if (m.org_ids && (!subject.org_id || !m.org_ids.includes(subject.org_id)))
22
+ continue;
23
+ if (m.plans && (!subject.plan || !m.plans.includes(subject.plan)))
24
+ continue;
25
+ if (rule.percentage !== undefined && (!seed || bucket(flag.key, seed) >= rule.percentage))
26
+ continue;
27
+ return rule.value;
28
+ }
29
+ return flag.default_value;
30
+ }
31
+ const pageAll = async (request) => {
32
+ const out = [];
33
+ let after;
34
+ for (;;) {
35
+ const page = await request({
36
+ method: 'GET',
37
+ path: '/v1/feature_flags',
38
+ query: { limit: 200, starting_after: after },
39
+ });
40
+ out.push(...page.data);
41
+ if (!page.has_more || page.data.length === 0)
42
+ return out;
43
+ after = page.data[page.data.length - 1].key;
44
+ }
45
+ };
46
+ function flagsResource(request, cacheTtlMs = 30_000) {
47
+ let cache;
48
+ let inflight;
49
+ /** All flag definitions, cached for `cacheTtlMs`; concurrent callers share one fetch. */
50
+ const definitions = async () => {
51
+ if (cache && Date.now() - cache.at < cacheTtlMs)
52
+ return cache.flags;
53
+ inflight ??= pageAll(request)
54
+ .then((all) => {
55
+ cache = { at: Date.now(), flags: new Map(all.map((f) => [f.key, f])) };
56
+ return cache.flags;
57
+ })
58
+ .finally(() => { inflight = undefined; });
59
+ return inflight;
60
+ };
61
+ return {
62
+ create(body, idempotencyKey) {
63
+ return request({ method: 'POST', path: '/v1/feature_flags', body, idempotencyKey });
64
+ },
65
+ /** `starting_after` is the key of the last flag of the previous page. */
66
+ list(params = {}) {
67
+ return request({ method: 'GET', path: '/v1/feature_flags', query: params });
68
+ },
69
+ retrieve(key) {
70
+ return request({ method: 'GET', path: `/v1/feature_flags/${(0, request_1.enc)(key)}` });
71
+ },
72
+ update(key, body) {
73
+ return request({ method: 'PATCH', path: `/v1/feature_flags/${(0, request_1.enc)(key)}`, body });
74
+ },
75
+ delete(key) {
76
+ return request({ method: 'DELETE', path: `/v1/feature_flags/${(0, request_1.enc)(key)}` });
77
+ },
78
+ /** Server-side evaluation; `plan` defaults to the org's (else the user's) resolved plan. */
79
+ evaluate(body) {
80
+ return request({ method: 'POST', path: '/v1/feature_flags/evaluate', body });
81
+ },
82
+ /** Local evaluation against cached definitions. `plan` is not looked up here — pass it for plan rules. */
83
+ async get(key, subject, fallback) {
84
+ const flag = (await definitions()).get(key);
85
+ return flag ? evaluateFeatureFlag(flag, subject) : fallback;
86
+ },
87
+ /** True only for a boolean flag that evaluates to true; an unknown flag is false. */
88
+ async isEnabled(key, subject = {}) {
89
+ return (await this.get(key, subject, false)) === true;
90
+ },
91
+ /** Drop the cached definitions (e.g. after changing a flag). */
92
+ invalidate() {
93
+ cache = undefined;
94
+ },
95
+ /** Replace the entitlements assigned to an organization (an empty body clears them). */
96
+ assignOrganizationEntitlements(orgId, body) {
97
+ return request({ method: 'PUT', path: `/v1/organizations/${(0, request_1.enc)(orgId)}/entitlements`, body });
98
+ },
99
+ assignUserEntitlements(userId, body) {
100
+ return request({ method: 'PUT', path: `/v1/users/${(0, request_1.enc)(userId)}/entitlements`, body });
101
+ },
102
+ };
103
+ }
104
+ //# sourceMappingURL=flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/client/flags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,146 @@
1
+ import { type RequestFn } from './request';
2
+ import type { ListPage } from './types';
3
+ /**
4
+ * Instance-level groups (independent of organizations) and the rules engine.
5
+ * Groups nest, carry attributes, map to app roles, can ride the session token as
6
+ * `groups`, and fill by hand, by filter, from SSO claims or by rules.
7
+ */
8
+ export interface Group {
9
+ object: 'group';
10
+ id: string;
11
+ slug: string;
12
+ name: string;
13
+ description: string | null;
14
+ parent_id: string | null;
15
+ attributes: Record<string, unknown>;
16
+ app_role_keys: string[];
17
+ include_in_token: boolean;
18
+ dynamic_filter: Record<string, unknown> | null;
19
+ sso_match: {
20
+ claim: string;
21
+ equals?: string;
22
+ contains?: string;
23
+ matches?: string;
24
+ } | null;
25
+ member_count?: number;
26
+ /** `users.groups` only: how the user joined. */
27
+ source?: 'manual' | 'dynamic' | 'sso' | 'rule';
28
+ created_at: number;
29
+ updated_at: number;
30
+ }
31
+ export interface GroupBody {
32
+ slug?: string;
33
+ name?: string;
34
+ description?: string | null;
35
+ parent_id?: string | null;
36
+ attributes?: Record<string, unknown>;
37
+ app_role_keys?: string[];
38
+ include_in_token?: boolean;
39
+ /** A user-search filter tree. */
40
+ dynamic_filter?: Record<string, unknown> | null;
41
+ sso_match?: Group['sso_match'];
42
+ }
43
+ export interface GroupMember {
44
+ object: 'group_member';
45
+ group_id: string;
46
+ user_id: string;
47
+ source: 'manual' | 'dynamic' | 'sso' | 'rule';
48
+ source_ref: string | null;
49
+ created_at: number;
50
+ }
51
+ export type GroupRuleAction = {
52
+ type: 'add_to_group';
53
+ group: string;
54
+ } | {
55
+ type: 'add_app_role';
56
+ role: string;
57
+ } | {
58
+ type: 'set_trait';
59
+ key: string;
60
+ value: unknown;
61
+ };
62
+ export interface GroupRule {
63
+ object: 'group_rule';
64
+ id: string;
65
+ name: string;
66
+ enabled: boolean;
67
+ priority: number;
68
+ condition: Record<string, unknown>;
69
+ actions: GroupRuleAction[];
70
+ created_by: string | null;
71
+ created_at: number;
72
+ updated_at: number;
73
+ }
74
+ export interface GroupRuleBody {
75
+ name?: string;
76
+ enabled?: boolean;
77
+ priority?: number;
78
+ condition?: Record<string, unknown>;
79
+ actions?: GroupRuleAction[];
80
+ }
81
+ export interface GroupRuleResult {
82
+ object: 'group_rule_result';
83
+ rule_id: string;
84
+ matched: number;
85
+ groups_added: number;
86
+ groups_removed: number;
87
+ roles_granted: number;
88
+ traits_set: number;
89
+ }
90
+ export declare function groupsResource(request: RequestFn): {
91
+ list(): Promise<ListPage<Group>>;
92
+ get(idOrSlug: string): Promise<Group>;
93
+ create(body: GroupBody & {
94
+ slug: string;
95
+ name: string;
96
+ }, idempotencyKey?: string): Promise<Group>;
97
+ update(idOrSlug: string, body: GroupBody): Promise<Group>;
98
+ delete(idOrSlug: string): Promise<{
99
+ object: "group";
100
+ id: string;
101
+ deleted: true;
102
+ }>;
103
+ listMembers(idOrSlug: string, query?: {
104
+ limit?: number;
105
+ starting_after?: string;
106
+ }): Promise<ListPage<GroupMember> & {
107
+ next_cursor: string | null;
108
+ }>;
109
+ /** Add up to 500 users by hand. */
110
+ addMembers(idOrSlug: string, userIds: string[]): Promise<{
111
+ added: number;
112
+ promoted: number;
113
+ already_member: number;
114
+ skipped: number;
115
+ }>;
116
+ removeMembers(idOrSlug: string, userIds: string[]): Promise<{
117
+ removed: number;
118
+ }>;
119
+ /** Re-evaluate a dynamic group's filter now. */
120
+ reapply(idOrSlug: string): Promise<{
121
+ matched: number;
122
+ added: number;
123
+ removed: number;
124
+ }>;
125
+ /** A user's direct groups. */
126
+ forUser(userId: string): Promise<ListPage<Group>>;
127
+ rules: {
128
+ list(): Promise<ListPage<GroupRule>>;
129
+ get(id: string): Promise<GroupRule>;
130
+ create(body: GroupRuleBody & {
131
+ name: string;
132
+ condition: Record<string, unknown>;
133
+ actions: GroupRuleAction[];
134
+ }, idempotencyKey?: string): Promise<GroupRule>;
135
+ update(id: string, body: GroupRuleBody): Promise<GroupRule>;
136
+ delete(id: string): Promise<{
137
+ object: "group_rule";
138
+ id: string;
139
+ deleted: true;
140
+ }>;
141
+ /** Run one rule now. */
142
+ apply(id: string): Promise<GroupRuleResult>;
143
+ /** Run every enabled rule in priority order. */
144
+ applyAll(): Promise<ListPage<GroupRuleResult>>;
145
+ };
146
+ };