workos 0.11.2 → 0.12.0-beta.1

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 (169) hide show
  1. package/README.md +163 -6
  2. package/dist/bin.js +20 -1
  3. package/dist/bin.js.map +1 -1
  4. package/dist/check-coverage.ts +237 -0
  5. package/dist/commands/dev.d.ts +23 -0
  6. package/dist/commands/dev.js +139 -0
  7. package/dist/commands/dev.js.map +1 -0
  8. package/dist/commands/emulate.d.ts +6 -0
  9. package/dist/commands/emulate.js +64 -0
  10. package/dist/commands/emulate.js.map +1 -0
  11. package/dist/emulate/core/id.d.ts +33 -0
  12. package/dist/emulate/core/id.js +58 -0
  13. package/dist/emulate/core/id.js.map +1 -0
  14. package/dist/emulate/core/index.d.ts +8 -0
  15. package/dist/emulate/core/index.js +8 -0
  16. package/dist/emulate/core/index.js.map +1 -0
  17. package/dist/emulate/core/jwt.d.ts +28 -0
  18. package/dist/emulate/core/jwt.js +78 -0
  19. package/dist/emulate/core/jwt.js.map +1 -0
  20. package/dist/emulate/core/middleware/auth.d.ts +18 -0
  21. package/dist/emulate/core/middleware/auth.js +28 -0
  22. package/dist/emulate/core/middleware/auth.js.map +1 -0
  23. package/dist/emulate/core/middleware/error-handler.d.ts +22 -0
  24. package/dist/emulate/core/middleware/error-handler.js +72 -0
  25. package/dist/emulate/core/middleware/error-handler.js.map +1 -0
  26. package/dist/emulate/core/pagination.d.ts +21 -0
  27. package/dist/emulate/core/pagination.js +35 -0
  28. package/dist/emulate/core/pagination.js.map +1 -0
  29. package/dist/emulate/core/plugin.d.ts +15 -0
  30. package/dist/emulate/core/plugin.js +2 -0
  31. package/dist/emulate/core/plugin.js.map +1 -0
  32. package/dist/emulate/core/server.d.ts +17 -0
  33. package/dist/emulate/core/server.js +116 -0
  34. package/dist/emulate/core/server.js.map +1 -0
  35. package/dist/emulate/core/store.d.ts +42 -0
  36. package/dist/emulate/core/store.js +148 -0
  37. package/dist/emulate/core/store.js.map +1 -0
  38. package/dist/emulate/index.d.ts +25 -0
  39. package/dist/emulate/index.js +47 -0
  40. package/dist/emulate/index.js.map +1 -0
  41. package/dist/emulate/workos/entities.d.ts +360 -0
  42. package/dist/emulate/workos/entities.js +2 -0
  43. package/dist/emulate/workos/entities.js.map +1 -0
  44. package/dist/emulate/workos/event-bus.d.ts +12 -0
  45. package/dist/emulate/workos/event-bus.js +45 -0
  46. package/dist/emulate/workos/event-bus.js.map +1 -0
  47. package/dist/emulate/workos/helpers.d.ts +63 -0
  48. package/dist/emulate/workos/helpers.js +518 -0
  49. package/dist/emulate/workos/helpers.js.map +1 -0
  50. package/dist/emulate/workos/index.d.ts +91 -0
  51. package/dist/emulate/workos/index.js +319 -0
  52. package/dist/emulate/workos/index.js.map +1 -0
  53. package/dist/emulate/workos/routes/api-keys.d.ts +2 -0
  54. package/dist/emulate/workos/routes/api-keys.js +35 -0
  55. package/dist/emulate/workos/routes/api-keys.js.map +1 -0
  56. package/dist/emulate/workos/routes/audit-logs.d.ts +2 -0
  57. package/dist/emulate/workos/routes/audit-logs.js +107 -0
  58. package/dist/emulate/workos/routes/audit-logs.js.map +1 -0
  59. package/dist/emulate/workos/routes/auth-challenges.d.ts +2 -0
  60. package/dist/emulate/workos/routes/auth-challenges.js +51 -0
  61. package/dist/emulate/workos/routes/auth-challenges.js.map +1 -0
  62. package/dist/emulate/workos/routes/auth-factors.d.ts +2 -0
  63. package/dist/emulate/workos/routes/auth-factors.js +51 -0
  64. package/dist/emulate/workos/routes/auth-factors.js.map +1 -0
  65. package/dist/emulate/workos/routes/auth.d.ts +2 -0
  66. package/dist/emulate/workos/routes/auth.js +349 -0
  67. package/dist/emulate/workos/routes/auth.js.map +1 -0
  68. package/dist/emulate/workos/routes/authorization-checks.d.ts +10 -0
  69. package/dist/emulate/workos/routes/authorization-checks.js +135 -0
  70. package/dist/emulate/workos/routes/authorization-checks.js.map +1 -0
  71. package/dist/emulate/workos/routes/authorization-org-roles.d.ts +2 -0
  72. package/dist/emulate/workos/routes/authorization-org-roles.js +206 -0
  73. package/dist/emulate/workos/routes/authorization-org-roles.js.map +1 -0
  74. package/dist/emulate/workos/routes/authorization-permissions.d.ts +2 -0
  75. package/dist/emulate/workos/routes/authorization-permissions.js +78 -0
  76. package/dist/emulate/workos/routes/authorization-permissions.js.map +1 -0
  77. package/dist/emulate/workos/routes/authorization-resources.d.ts +2 -0
  78. package/dist/emulate/workos/routes/authorization-resources.js +128 -0
  79. package/dist/emulate/workos/routes/authorization-resources.js.map +1 -0
  80. package/dist/emulate/workos/routes/authorization-roles.d.ts +2 -0
  81. package/dist/emulate/workos/routes/authorization-roles.js +136 -0
  82. package/dist/emulate/workos/routes/authorization-roles.js.map +1 -0
  83. package/dist/emulate/workos/routes/config.d.ts +2 -0
  84. package/dist/emulate/workos/routes/config.js +56 -0
  85. package/dist/emulate/workos/routes/config.js.map +1 -0
  86. package/dist/emulate/workos/routes/connect.d.ts +2 -0
  87. package/dist/emulate/workos/routes/connect.js +69 -0
  88. package/dist/emulate/workos/routes/connect.js.map +1 -0
  89. package/dist/emulate/workos/routes/connections.d.ts +2 -0
  90. package/dist/emulate/workos/routes/connections.js +77 -0
  91. package/dist/emulate/workos/routes/connections.js.map +1 -0
  92. package/dist/emulate/workos/routes/data-integrations.d.ts +2 -0
  93. package/dist/emulate/workos/routes/data-integrations.js +55 -0
  94. package/dist/emulate/workos/routes/data-integrations.js.map +1 -0
  95. package/dist/emulate/workos/routes/directories.d.ts +2 -0
  96. package/dist/emulate/workos/routes/directories.js +106 -0
  97. package/dist/emulate/workos/routes/directories.js.map +1 -0
  98. package/dist/emulate/workos/routes/email-verification.d.ts +2 -0
  99. package/dist/emulate/workos/routes/email-verification.js +49 -0
  100. package/dist/emulate/workos/routes/email-verification.js.map +1 -0
  101. package/dist/emulate/workos/routes/events.d.ts +2 -0
  102. package/dist/emulate/workos/routes/events.js +21 -0
  103. package/dist/emulate/workos/routes/events.js.map +1 -0
  104. package/dist/emulate/workos/routes/feature-flags.d.ts +2 -0
  105. package/dist/emulate/workos/routes/feature-flags.js +131 -0
  106. package/dist/emulate/workos/routes/feature-flags.js.map +1 -0
  107. package/dist/emulate/workos/routes/invitations.d.ts +2 -0
  108. package/dist/emulate/workos/routes/invitations.js +125 -0
  109. package/dist/emulate/workos/routes/invitations.js.map +1 -0
  110. package/dist/emulate/workos/routes/legacy-mfa.d.ts +2 -0
  111. package/dist/emulate/workos/routes/legacy-mfa.js +75 -0
  112. package/dist/emulate/workos/routes/legacy-mfa.js.map +1 -0
  113. package/dist/emulate/workos/routes/magic-auth.d.ts +2 -0
  114. package/dist/emulate/workos/routes/magic-auth.js +32 -0
  115. package/dist/emulate/workos/routes/magic-auth.js.map +1 -0
  116. package/dist/emulate/workos/routes/memberships.d.ts +2 -0
  117. package/dist/emulate/workos/routes/memberships.js +118 -0
  118. package/dist/emulate/workos/routes/memberships.js.map +1 -0
  119. package/dist/emulate/workos/routes/organization-domains.d.ts +2 -0
  120. package/dist/emulate/workos/routes/organization-domains.js +58 -0
  121. package/dist/emulate/workos/routes/organization-domains.js.map +1 -0
  122. package/dist/emulate/workos/routes/organizations.d.ts +2 -0
  123. package/dist/emulate/workos/routes/organizations.js +133 -0
  124. package/dist/emulate/workos/routes/organizations.js.map +1 -0
  125. package/dist/emulate/workos/routes/password-reset.d.ts +2 -0
  126. package/dist/emulate/workos/routes/password-reset.js +61 -0
  127. package/dist/emulate/workos/routes/password-reset.js.map +1 -0
  128. package/dist/emulate/workos/routes/pipes.d.ts +2 -0
  129. package/dist/emulate/workos/routes/pipes.js +86 -0
  130. package/dist/emulate/workos/routes/pipes.js.map +1 -0
  131. package/dist/emulate/workos/routes/portal.d.ts +2 -0
  132. package/dist/emulate/workos/routes/portal.js +18 -0
  133. package/dist/emulate/workos/routes/portal.js.map +1 -0
  134. package/dist/emulate/workos/routes/radar.d.ts +2 -0
  135. package/dist/emulate/workos/routes/radar.js +45 -0
  136. package/dist/emulate/workos/routes/radar.js.map +1 -0
  137. package/dist/emulate/workos/routes/sessions.d.ts +2 -0
  138. package/dist/emulate/workos/routes/sessions.js +51 -0
  139. package/dist/emulate/workos/routes/sessions.js.map +1 -0
  140. package/dist/emulate/workos/routes/sso.d.ts +2 -0
  141. package/dist/emulate/workos/routes/sso.js +160 -0
  142. package/dist/emulate/workos/routes/sso.js.map +1 -0
  143. package/dist/emulate/workos/routes/user-features.d.ts +2 -0
  144. package/dist/emulate/workos/routes/user-features.js +50 -0
  145. package/dist/emulate/workos/routes/user-features.js.map +1 -0
  146. package/dist/emulate/workos/routes/users.d.ts +2 -0
  147. package/dist/emulate/workos/routes/users.js +133 -0
  148. package/dist/emulate/workos/routes/users.js.map +1 -0
  149. package/dist/emulate/workos/routes/webhook-endpoints.d.ts +2 -0
  150. package/dist/emulate/workos/routes/webhook-endpoints.js +70 -0
  151. package/dist/emulate/workos/routes/webhook-endpoints.js.map +1 -0
  152. package/dist/emulate/workos/routes/widgets.d.ts +2 -0
  153. package/dist/emulate/workos/routes/widgets.js +27 -0
  154. package/dist/emulate/workos/routes/widgets.js.map +1 -0
  155. package/dist/emulate/workos/store.d.ts +48 -0
  156. package/dist/emulate/workos/store.js +93 -0
  157. package/dist/emulate/workos/store.js.map +1 -0
  158. package/dist/emulate/workos/webhook-signer.d.ts +1 -0
  159. package/dist/emulate/workos/webhook-signer.js +8 -0
  160. package/dist/emulate/workos/webhook-signer.js.map +1 -0
  161. package/dist/gen-routes-lib.spec.ts +659 -0
  162. package/dist/gen-routes-lib.ts +647 -0
  163. package/dist/gen-routes.ts +96 -0
  164. package/dist/lib/dev-command.d.ts +26 -0
  165. package/dist/lib/dev-command.js +122 -0
  166. package/dist/lib/dev-command.js.map +1 -0
  167. package/dist/utils/help-json.js +23 -0
  168. package/dist/utils/help-json.js.map +1 -1
  169. package/package.json +20 -7
@@ -0,0 +1,148 @@
1
+ import { generateId } from './id.js';
2
+ import { cursorPaginate } from './pagination.js';
3
+ export class Collection {
4
+ prefix;
5
+ indexFields;
6
+ items = new Map();
7
+ indexes = new Map();
8
+ hooks = {};
9
+ fieldNames;
10
+ constructor(prefix, indexFields = []) {
11
+ this.prefix = prefix;
12
+ this.indexFields = indexFields;
13
+ this.fieldNames = indexFields.map(String).sort();
14
+ for (const field of indexFields) {
15
+ this.indexes.set(String(field), new Map());
16
+ }
17
+ }
18
+ addToIndex(item) {
19
+ for (const field of this.indexFields) {
20
+ const value = item[field];
21
+ if (value === undefined || value === null)
22
+ continue;
23
+ const indexMap = this.indexes.get(String(field));
24
+ const key = String(value);
25
+ if (!indexMap.has(key)) {
26
+ indexMap.set(key, new Set());
27
+ }
28
+ indexMap.get(key).add(item.id);
29
+ }
30
+ }
31
+ removeFromIndex(item) {
32
+ for (const field of this.indexFields) {
33
+ const value = item[field];
34
+ if (value === undefined || value === null)
35
+ continue;
36
+ const indexMap = this.indexes.get(String(field));
37
+ const key = String(value);
38
+ indexMap.get(key)?.delete(item.id);
39
+ }
40
+ }
41
+ insert(data) {
42
+ const now = new Date().toISOString();
43
+ const id = data.id ?? generateId(this.prefix);
44
+ const item = {
45
+ ...data,
46
+ id,
47
+ created_at: now,
48
+ updated_at: now,
49
+ };
50
+ this.items.set(id, item);
51
+ this.addToIndex(item);
52
+ this.hooks.onInsert?.(item);
53
+ return item;
54
+ }
55
+ get(id) {
56
+ return this.items.get(id);
57
+ }
58
+ findBy(field, value) {
59
+ if (this.indexes.has(String(field))) {
60
+ const ids = this.indexes.get(String(field)).get(String(value));
61
+ if (!ids)
62
+ return [];
63
+ return Array.from(ids)
64
+ .map((id) => this.items.get(id))
65
+ .filter(Boolean);
66
+ }
67
+ return this.all().filter((item) => item[field] === value);
68
+ }
69
+ findOneBy(field, value) {
70
+ return this.findBy(field, value)[0];
71
+ }
72
+ update(id, data) {
73
+ const existing = this.items.get(id);
74
+ if (!existing)
75
+ return undefined;
76
+ this.removeFromIndex(existing);
77
+ const updated = {
78
+ ...existing,
79
+ ...data,
80
+ id,
81
+ updated_at: new Date().toISOString(),
82
+ };
83
+ this.items.set(id, updated);
84
+ this.addToIndex(updated);
85
+ this.hooks.onUpdate?.(updated);
86
+ return updated;
87
+ }
88
+ delete(id) {
89
+ const existing = this.items.get(id);
90
+ if (!existing)
91
+ return false;
92
+ this.hooks.onDelete?.(existing);
93
+ this.removeFromIndex(existing);
94
+ return this.items.delete(id);
95
+ }
96
+ setHooks(hooks) {
97
+ this.hooks = hooks;
98
+ }
99
+ all() {
100
+ return Array.from(this.items.values());
101
+ }
102
+ list(options = {}) {
103
+ return cursorPaginate(this.all(), options);
104
+ }
105
+ count(filter) {
106
+ if (!filter)
107
+ return this.items.size;
108
+ return this.all().filter(filter).length;
109
+ }
110
+ clear() {
111
+ this.items.clear();
112
+ for (const indexMap of this.indexes.values()) {
113
+ indexMap.clear();
114
+ }
115
+ }
116
+ }
117
+ export class Store {
118
+ collections = new Map();
119
+ _data = new Map();
120
+ collection(name, prefix, indexFields = []) {
121
+ const existing = this.collections.get(name);
122
+ if (existing) {
123
+ if (indexFields.length > 0) {
124
+ const requested = indexFields.map(String).sort();
125
+ if (existing.fieldNames.length !== requested.length || existing.fieldNames.some((f, i) => f !== requested[i])) {
126
+ throw new Error(`Collection "${name}" already exists with indexes [${existing.fieldNames}] but was requested with [${requested}]`);
127
+ }
128
+ }
129
+ return existing;
130
+ }
131
+ const col = new Collection(prefix, indexFields);
132
+ this.collections.set(name, col);
133
+ return col;
134
+ }
135
+ getData(key) {
136
+ return this._data.get(key);
137
+ }
138
+ setData(key, value) {
139
+ this._data.set(key, value);
140
+ }
141
+ reset() {
142
+ for (const collection of this.collections.values()) {
143
+ collection.clear();
144
+ }
145
+ this._data.clear();
146
+ }
147
+ }
148
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/emulate/core/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { generateId } from './id.js';\nimport { cursorPaginate, type Entity, type CursorPaginationOptions, type CursorPaginatedResult } from './pagination.js';\n\nexport type { Entity };\n\nexport type InsertInput<T extends Entity> = Omit<T, 'id' | 'created_at' | 'updated_at'> & {\n id?: string;\n};\n\nexport type FilterFn<T> = (item: T) => boolean;\nexport type SortFn<T> = (a: T, b: T) => number;\n\nexport interface CollectionHooks<T extends Entity> {\n onInsert?: (item: T) => void;\n onUpdate?: (item: T) => void;\n onDelete?: (item: T) => void;\n}\n\nexport class Collection<T extends Entity> {\n private items = new Map<string, T>();\n private indexes = new Map<string, Map<string, Set<string>>>();\n private hooks: CollectionHooks<T> = {};\n readonly fieldNames: string[];\n\n constructor(\n private prefix: string,\n private indexFields: (keyof T)[] = [],\n ) {\n this.fieldNames = indexFields.map(String).sort();\n for (const field of indexFields) {\n this.indexes.set(String(field), new Map());\n }\n }\n\n private addToIndex(item: T): void {\n for (const field of this.indexFields) {\n const value = item[field];\n if (value === undefined || value === null) continue;\n const indexMap = this.indexes.get(String(field))!;\n const key = String(value);\n if (!indexMap.has(key)) {\n indexMap.set(key, new Set());\n }\n indexMap.get(key)!.add(item.id);\n }\n }\n\n private removeFromIndex(item: T): void {\n for (const field of this.indexFields) {\n const value = item[field];\n if (value === undefined || value === null) continue;\n const indexMap = this.indexes.get(String(field))!;\n const key = String(value);\n indexMap.get(key)?.delete(item.id);\n }\n }\n\n insert(data: InsertInput<T>): T {\n const now = new Date().toISOString();\n const id = data.id ?? generateId(this.prefix);\n const item = {\n ...data,\n id,\n created_at: now,\n updated_at: now,\n } as unknown as T;\n this.items.set(id, item);\n this.addToIndex(item);\n this.hooks.onInsert?.(item);\n return item;\n }\n\n get(id: string): T | undefined {\n return this.items.get(id);\n }\n\n findBy(field: keyof T, value: string | number): T[] {\n if (this.indexes.has(String(field))) {\n const ids = this.indexes.get(String(field))!.get(String(value));\n if (!ids) return [];\n return Array.from(ids)\n .map((id) => this.items.get(id)!)\n .filter(Boolean);\n }\n return this.all().filter((item) => item[field] === value);\n }\n\n findOneBy(field: keyof T, value: string | number): T | undefined {\n return this.findBy(field, value)[0];\n }\n\n update(id: string, data: Partial<T>): T | undefined {\n const existing = this.items.get(id);\n if (!existing) return undefined;\n this.removeFromIndex(existing);\n const updated = {\n ...existing,\n ...data,\n id,\n updated_at: new Date().toISOString(),\n } as T;\n this.items.set(id, updated);\n this.addToIndex(updated);\n this.hooks.onUpdate?.(updated);\n return updated;\n }\n\n delete(id: string): boolean {\n const existing = this.items.get(id);\n if (!existing) return false;\n this.hooks.onDelete?.(existing);\n this.removeFromIndex(existing);\n return this.items.delete(id);\n }\n\n setHooks(hooks: CollectionHooks<T>): void {\n this.hooks = hooks;\n }\n\n all(): T[] {\n return Array.from(this.items.values());\n }\n\n list(options: CursorPaginationOptions<T> = {}): CursorPaginatedResult<T> {\n return cursorPaginate(this.all(), options);\n }\n\n count(filter?: FilterFn<T>): number {\n if (!filter) return this.items.size;\n return this.all().filter(filter).length;\n }\n\n clear(): void {\n this.items.clear();\n for (const indexMap of this.indexes.values()) {\n indexMap.clear();\n }\n }\n}\n\nexport class Store {\n private collections = new Map<string, Collection<any>>();\n private _data = new Map<string, unknown>();\n\n collection<T extends Entity>(name: string, prefix: string, indexFields: (keyof T)[] = []): Collection<T> {\n const existing = this.collections.get(name);\n if (existing) {\n if (indexFields.length > 0) {\n const requested = indexFields.map(String).sort();\n if (existing.fieldNames.length !== requested.length || existing.fieldNames.some((f, i) => f !== requested[i])) {\n throw new Error(\n `Collection \"${name}\" already exists with indexes [${existing.fieldNames}] but was requested with [${requested}]`,\n );\n }\n }\n return existing as Collection<T>;\n }\n const col = new Collection<T>(prefix, indexFields);\n this.collections.set(name, col);\n return col;\n }\n\n getData<V>(key: string): V | undefined {\n return this._data.get(key) as V | undefined;\n }\n\n setData<V>(key: string, value: V): void {\n this._data.set(key, value);\n }\n\n reset(): void {\n for (const collection of this.collections.values()) {\n collection.clear();\n }\n this._data.clear();\n }\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import { type WorkOSSeedConfig } from './workos/index.js';
2
+ export interface EmulatorSeedConfig {
3
+ apiKeys?: Record<string, {
4
+ environment: string;
5
+ }>;
6
+ organizations?: WorkOSSeedConfig['organizations'];
7
+ users?: WorkOSSeedConfig['users'];
8
+ connections?: WorkOSSeedConfig['connections'];
9
+ invitations?: WorkOSSeedConfig['invitations'];
10
+ roles?: WorkOSSeedConfig['roles'];
11
+ permissions?: WorkOSSeedConfig['permissions'];
12
+ webhookEndpoints?: WorkOSSeedConfig['webhookEndpoints'];
13
+ }
14
+ export interface EmulatorOptions {
15
+ port?: number;
16
+ seed?: EmulatorSeedConfig;
17
+ }
18
+ export interface Emulator {
19
+ url: string;
20
+ port: number;
21
+ apiKey: string;
22
+ close(): Promise<void>;
23
+ reset(): void;
24
+ }
25
+ export declare function createEmulator(options?: EmulatorOptions): Promise<Emulator>;
@@ -0,0 +1,47 @@
1
+ import { createServer } from './core/index.js';
2
+ import { workosPlugin, seedFromConfig } from './workos/index.js';
3
+ import { serve } from '@hono/node-server';
4
+ export async function createEmulator(options = {}) {
5
+ const port = options.port ?? 4100;
6
+ const baseUrl = `http://localhost:${port}`;
7
+ const apiKeys = options.seed?.apiKeys ?? {
8
+ sk_test_default: { environment: 'test' },
9
+ };
10
+ const { app, store, jwt } = createServer(workosPlugin, {
11
+ port,
12
+ baseUrl,
13
+ apiKeys,
14
+ });
15
+ // Health check endpoint
16
+ app.get('/health', (c) => c.json({ status: 'ok' }));
17
+ const seedFn = () => {
18
+ workosPlugin.seed?.(store, baseUrl);
19
+ if (options.seed) {
20
+ seedFromConfig(store, baseUrl, options.seed);
21
+ }
22
+ };
23
+ seedFn();
24
+ const httpServer = serve({ fetch: app.fetch, port });
25
+ // Resolve actual port (important for port: 0)
26
+ const addr = httpServer.address();
27
+ const actualPort = typeof addr === 'object' && addr ? addr.port : port;
28
+ const url = `http://localhost:${actualPort}`;
29
+ // Update JWT issuer to reflect the actual bound URL (matters when port: 0)
30
+ jwt.issuer = url;
31
+ const primaryApiKey = Object.keys(apiKeys)[0];
32
+ return {
33
+ url,
34
+ port: actualPort,
35
+ apiKey: primaryApiKey,
36
+ reset() {
37
+ store.reset();
38
+ seedFn();
39
+ },
40
+ close() {
41
+ return new Promise((resolve, reject) => {
42
+ httpServer.close((err) => (err ? reject(err) : resolve()));
43
+ });
44
+ },
45
+ };
46
+ }
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/emulate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAyB,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AA0B1C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAA2B,EAAE;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAClC,MAAM,OAAO,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAE3C,MAAM,OAAO,GAAc,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI;QAClD,eAAe,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE;KACzC,CAAC;IAEF,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,YAAY,EAAE;QACrD,IAAI;QACJ,OAAO;QACP,OAAO;KACR,CAAC,CAAC;IAEH,wBAAwB;IACxB,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACpC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC;IACF,MAAM,EAAE,CAAC;IAET,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAErD,8CAA8C;IAC9C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,MAAM,GAAG,GAAG,oBAAoB,UAAU,EAAE,CAAC;IAE7C,2EAA2E;IAC3E,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;IAEjB,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9C,OAAO;QACL,GAAG;QACH,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,aAAa;QACrB,KAAK;YACH,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,EAAE,CAAC;QACX,CAAC;QACD,KAAK;YACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { createServer, type ApiKeyMap } from './core/index.js';\nimport { workosPlugin, seedFromConfig, type WorkOSSeedConfig } from './workos/index.js';\nimport { serve } from '@hono/node-server';\n\nexport interface EmulatorSeedConfig {\n apiKeys?: Record<string, { environment: string }>;\n organizations?: WorkOSSeedConfig['organizations'];\n users?: WorkOSSeedConfig['users'];\n connections?: WorkOSSeedConfig['connections'];\n invitations?: WorkOSSeedConfig['invitations'];\n roles?: WorkOSSeedConfig['roles'];\n permissions?: WorkOSSeedConfig['permissions'];\n webhookEndpoints?: WorkOSSeedConfig['webhookEndpoints'];\n}\n\nexport interface EmulatorOptions {\n port?: number;\n seed?: EmulatorSeedConfig;\n}\n\nexport interface Emulator {\n url: string;\n port: number;\n apiKey: string;\n close(): Promise<void>;\n reset(): void;\n}\n\nexport async function createEmulator(options: EmulatorOptions = {}): Promise<Emulator> {\n const port = options.port ?? 4100;\n const baseUrl = `http://localhost:${port}`;\n\n const apiKeys: ApiKeyMap = options.seed?.apiKeys ?? {\n sk_test_default: { environment: 'test' },\n };\n\n const { app, store, jwt } = createServer(workosPlugin, {\n port,\n baseUrl,\n apiKeys,\n });\n\n // Health check endpoint\n app.get('/health', (c) => c.json({ status: 'ok' }));\n\n const seedFn = () => {\n workosPlugin.seed?.(store, baseUrl);\n if (options.seed) {\n seedFromConfig(store, baseUrl, options.seed);\n }\n };\n seedFn();\n\n const httpServer = serve({ fetch: app.fetch, port });\n\n // Resolve actual port (important for port: 0)\n const addr = httpServer.address();\n const actualPort = typeof addr === 'object' && addr ? addr.port : port;\n const url = `http://localhost:${actualPort}`;\n\n // Update JWT issuer to reflect the actual bound URL (matters when port: 0)\n jwt.issuer = url;\n\n const primaryApiKey = Object.keys(apiKeys)[0];\n\n return {\n url,\n port: actualPort,\n apiKey: primaryApiKey,\n reset() {\n store.reset();\n seedFn();\n },\n close(): Promise<void> {\n return new Promise((resolve, reject) => {\n httpServer.close((err) => (err ? reject(err) : resolve()));\n });\n },\n };\n}\n"]}
@@ -0,0 +1,360 @@
1
+ import type { Entity } from '../core/index.js';
2
+ export interface WorkOSOrganization extends Entity {
3
+ object: 'organization';
4
+ name: string;
5
+ external_id: string | null;
6
+ metadata: Record<string, string>;
7
+ stripe_customer_id: string | null;
8
+ }
9
+ export interface WorkOSOrganizationDomain extends Entity {
10
+ object: 'organization_domain';
11
+ organization_id: string;
12
+ domain: string;
13
+ state: 'verified' | 'pending';
14
+ verification_strategy: 'manual' | 'dns';
15
+ verification_token: string;
16
+ verification_prefix: string;
17
+ }
18
+ export interface WorkOSOrganizationMembership extends Entity {
19
+ object: 'organization_membership';
20
+ organization_id: string;
21
+ user_id: string;
22
+ role: {
23
+ slug: string;
24
+ };
25
+ status: 'active' | 'inactive' | 'pending';
26
+ external_id: string | null;
27
+ metadata: Record<string, string>;
28
+ }
29
+ export interface WorkOSUser extends Entity {
30
+ object: 'user';
31
+ email: string;
32
+ first_name: string | null;
33
+ last_name: string | null;
34
+ email_verified: boolean;
35
+ profile_picture_url: string | null;
36
+ last_sign_in_at: string | null;
37
+ external_id: string | null;
38
+ metadata: Record<string, string>;
39
+ locale: string | null;
40
+ password_hash: string | null;
41
+ impersonator: {
42
+ email: string;
43
+ reason: string;
44
+ } | null;
45
+ }
46
+ export interface WorkOSSession extends Entity {
47
+ object: 'session';
48
+ user_id: string;
49
+ organization_id: string | null;
50
+ ip_address: string | null;
51
+ user_agent: string | null;
52
+ }
53
+ export interface WorkOSEmailVerification extends Entity {
54
+ object: 'email_verification';
55
+ user_id: string;
56
+ email: string;
57
+ code: string;
58
+ expires_at: string;
59
+ }
60
+ export interface WorkOSPasswordReset extends Entity {
61
+ object: 'password_reset';
62
+ user_id: string;
63
+ email: string;
64
+ token: string;
65
+ expires_at: string;
66
+ }
67
+ export interface WorkOSMagicAuth extends Entity {
68
+ object: 'magic_auth';
69
+ user_id: string;
70
+ email: string;
71
+ code: string;
72
+ expires_at: string;
73
+ }
74
+ export interface WorkOSAuthenticationFactor extends Entity {
75
+ object: 'authentication_factor';
76
+ user_id: string;
77
+ type: 'totp';
78
+ totp: {
79
+ issuer: string;
80
+ user: string;
81
+ uri: string;
82
+ };
83
+ }
84
+ export interface WorkOSAuthorizationCode extends Entity {
85
+ user_id: string;
86
+ organization_id: string | null;
87
+ code: string;
88
+ redirect_uri: string;
89
+ expires_at: string;
90
+ code_challenge: string | null;
91
+ code_challenge_method: string | null;
92
+ }
93
+ export interface WorkOSIdentity extends Entity {
94
+ object: 'identity';
95
+ user_id: string;
96
+ provider: string;
97
+ provider_id: string;
98
+ type: 'OAuth';
99
+ }
100
+ export type WorkOSConnectionType = 'ADFSSAML' | 'AzureSAML' | 'GenericOIDC' | 'GenericSAML' | 'GoogleOAuth' | 'GoogleSAML' | 'OktaSAML' | 'OneLoginSAML' | 'PingFederateSAML' | 'PingOneSAML' | 'GitHubOAuth' | 'MicrosoftOAuth' | 'AppleOAuth';
101
+ export interface WorkOSConnectionDomain {
102
+ object: 'connection_domain';
103
+ id: string;
104
+ domain: string;
105
+ }
106
+ export interface WorkOSConnection extends Entity {
107
+ object: 'connection';
108
+ organization_id: string;
109
+ connection_type: WorkOSConnectionType;
110
+ name: string;
111
+ state: 'active' | 'inactive' | 'validating';
112
+ domains: WorkOSConnectionDomain[];
113
+ }
114
+ export interface WorkOSSSOProfile extends Entity {
115
+ object: 'profile';
116
+ connection_id: string;
117
+ connection_type: WorkOSConnectionType;
118
+ organization_id: string;
119
+ idp_id: string;
120
+ email: string;
121
+ first_name: string | null;
122
+ last_name: string | null;
123
+ groups: string[];
124
+ raw_attributes: Record<string, unknown>;
125
+ }
126
+ export interface WorkOSSSOAuthorization extends Entity {
127
+ code: string;
128
+ connection_id: string;
129
+ organization_id: string;
130
+ profile_id: string;
131
+ redirect_uri: string;
132
+ state: string | null;
133
+ expires_at: string;
134
+ }
135
+ export interface WorkOSInvitation extends Entity {
136
+ object: 'invitation';
137
+ email: string;
138
+ state: 'pending' | 'accepted' | 'expired' | 'revoked';
139
+ token: string;
140
+ accept_invitation_url: string;
141
+ organization_id: string | null;
142
+ inviter_user_id: string | null;
143
+ role_slug: string | null;
144
+ expires_at: string;
145
+ }
146
+ export interface WorkOSRedirectUri extends Entity {
147
+ object: 'redirect_uri';
148
+ uri: string;
149
+ }
150
+ export interface WorkOSCorsOrigin extends Entity {
151
+ object: 'cors_origin';
152
+ origin: string;
153
+ }
154
+ export interface WorkOSAuthorizedApplication extends Entity {
155
+ object: 'authorized_application';
156
+ user_id: string;
157
+ name: string;
158
+ redirect_uri: string;
159
+ }
160
+ export interface WorkOSConnectedAccount extends Entity {
161
+ object: 'connected_account';
162
+ user_id: string;
163
+ provider: string;
164
+ provider_id: string;
165
+ }
166
+ export type PipeProvider = 'github' | 'slack' | 'google' | 'salesforce';
167
+ export type PipeConnectionStatus = 'connected' | 'disconnected' | 'requires_reauth';
168
+ export interface WorkOSPipeConnection extends Entity {
169
+ object: 'pipe_connection';
170
+ user_id: string;
171
+ provider: PipeProvider;
172
+ scopes: string[];
173
+ status: PipeConnectionStatus;
174
+ external_account_id: string | null;
175
+ }
176
+ export interface WorkOSRefreshToken extends Entity {
177
+ token: string;
178
+ user_id: string;
179
+ organization_id: string | null;
180
+ session_id: string;
181
+ expires_at: string;
182
+ }
183
+ export interface WorkOSAuthenticationChallenge extends Entity {
184
+ object: 'authentication_challenge';
185
+ user_id: string;
186
+ factor_id: string;
187
+ expires_at: string;
188
+ code: string | null;
189
+ }
190
+ export interface WorkOSDeviceAuthorization extends Entity {
191
+ device_code: string;
192
+ user_code: string;
193
+ user_id: string | null;
194
+ client_id: string;
195
+ expires_at: string;
196
+ interval: number;
197
+ }
198
+ export interface WorkOSRole extends Entity {
199
+ object: 'role';
200
+ slug: string;
201
+ name: string;
202
+ description: string | null;
203
+ type: 'EnvironmentRole' | 'OrganizationRole';
204
+ organization_id: string | null;
205
+ is_default_role: boolean;
206
+ priority: number;
207
+ }
208
+ export interface WorkOSPermission extends Entity {
209
+ object: 'permission';
210
+ slug: string;
211
+ name: string;
212
+ description: string | null;
213
+ }
214
+ export interface WorkOSRolePermission extends Entity {
215
+ role_id: string;
216
+ permission_id: string;
217
+ }
218
+ export interface WorkOSAuthorizationResource extends Entity {
219
+ object: 'authorization_resource';
220
+ resource_type_slug: string;
221
+ external_id: string;
222
+ organization_id: string;
223
+ metadata: Record<string, string>;
224
+ }
225
+ export interface WorkOSRoleAssignment extends Entity {
226
+ object: 'role_assignment';
227
+ organization_membership_id: string;
228
+ role_id: string;
229
+ }
230
+ export interface WorkOSDirectory extends Entity {
231
+ object: 'directory';
232
+ name: string;
233
+ organization_id: string | null;
234
+ domain: string | null;
235
+ type: string;
236
+ state: 'linked' | 'unlinked' | 'deleting' | 'invalid_credentials';
237
+ external_key: string | null;
238
+ }
239
+ export interface WorkOSDirectoryUser extends Entity {
240
+ object: 'directory_user';
241
+ directory_id: string;
242
+ organization_id: string | null;
243
+ idp_id: string;
244
+ first_name: string | null;
245
+ last_name: string | null;
246
+ email: string | null;
247
+ username: string | null;
248
+ state: 'active' | 'inactive';
249
+ role: {
250
+ slug: string;
251
+ } | null;
252
+ custom_attributes: Record<string, unknown>;
253
+ raw_attributes: Record<string, unknown>;
254
+ groups: Array<{
255
+ object: 'directory_group';
256
+ id: string;
257
+ name: string;
258
+ }>;
259
+ }
260
+ export interface WorkOSDirectoryGroup extends Entity {
261
+ object: 'directory_group';
262
+ directory_id: string;
263
+ organization_id: string | null;
264
+ idp_id: string;
265
+ name: string;
266
+ raw_attributes: Record<string, unknown>;
267
+ }
268
+ export interface WorkOSAuditLogAction extends Entity {
269
+ object: 'audit_log_action';
270
+ name: string;
271
+ description: string | null;
272
+ condition: string | null;
273
+ }
274
+ export interface WorkOSAuditLogEvent extends Entity {
275
+ object: 'audit_log_event';
276
+ organization_id: string;
277
+ action: {
278
+ name: string;
279
+ type: string;
280
+ id: string;
281
+ };
282
+ actor: Record<string, unknown>;
283
+ targets: Array<Record<string, unknown>>;
284
+ metadata: Record<string, unknown> | null;
285
+ occurred_at: string;
286
+ }
287
+ export interface WorkOSAuditLogExport extends Entity {
288
+ object: 'audit_log_export';
289
+ organization_id: string;
290
+ state: 'pending' | 'ready' | 'error';
291
+ url: string | null;
292
+ filters: Record<string, unknown>;
293
+ }
294
+ export interface WorkOSFeatureFlag extends Entity {
295
+ object: 'feature_flag';
296
+ slug: string;
297
+ name: string;
298
+ description: string | null;
299
+ type: 'boolean' | 'string' | 'number';
300
+ default_value: unknown;
301
+ enabled: boolean;
302
+ }
303
+ export interface WorkOSFlagTarget extends Entity {
304
+ object: 'flag_target';
305
+ flag_slug: string;
306
+ resource_id: string;
307
+ resource_type: string;
308
+ value: unknown;
309
+ }
310
+ export interface WorkOSConnectApplication extends Entity {
311
+ object: 'connect_application';
312
+ name: string;
313
+ redirect_uris: string[];
314
+ client_id: string;
315
+ logo_url: string | null;
316
+ }
317
+ export interface WorkOSClientSecret extends Entity {
318
+ object: 'client_secret';
319
+ application_id: string;
320
+ value: string;
321
+ last_four: string;
322
+ }
323
+ export interface WorkOSDataIntegrationAuth extends Entity {
324
+ slug: string;
325
+ code: string;
326
+ redirect_uri: string;
327
+ state: string | null;
328
+ expires_at: string;
329
+ }
330
+ export interface WorkOSRadarAttempt extends Entity {
331
+ object: 'radar_attempt';
332
+ user_id: string | null;
333
+ ip_address: string;
334
+ user_agent: string | null;
335
+ verdict: 'allow' | 'deny' | 'challenge';
336
+ signals: Array<{
337
+ type: string;
338
+ confidence: number;
339
+ }>;
340
+ }
341
+ export interface WorkOSApiKey extends Entity {
342
+ object: 'api_key';
343
+ name: string;
344
+ key: string;
345
+ environment: string;
346
+ }
347
+ export interface WorkOSEvent extends Entity {
348
+ object: 'event';
349
+ event: string;
350
+ data: Record<string, unknown>;
351
+ environment_id: string | null;
352
+ }
353
+ export interface WorkOSWebhookEndpoint extends Entity {
354
+ object: 'webhook_endpoint';
355
+ url: string;
356
+ secret: string;
357
+ enabled: boolean;
358
+ events: string[];
359
+ description: string | null;
360
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../src/emulate/workos/entities.ts"],"names":[],"mappings":"","sourcesContent":["import type { Entity } from '../core/index.js';\n\nexport interface WorkOSOrganization extends Entity {\n object: 'organization';\n name: string;\n external_id: string | null;\n metadata: Record<string, string>;\n stripe_customer_id: string | null;\n}\n\nexport interface WorkOSOrganizationDomain extends Entity {\n object: 'organization_domain';\n organization_id: string;\n domain: string;\n state: 'verified' | 'pending';\n verification_strategy: 'manual' | 'dns';\n verification_token: string;\n verification_prefix: string;\n}\n\nexport interface WorkOSOrganizationMembership extends Entity {\n object: 'organization_membership';\n organization_id: string;\n user_id: string;\n role: { slug: string };\n status: 'active' | 'inactive' | 'pending';\n external_id: string | null;\n metadata: Record<string, string>;\n}\n\nexport interface WorkOSUser extends Entity {\n object: 'user';\n email: string;\n first_name: string | null;\n last_name: string | null;\n email_verified: boolean;\n profile_picture_url: string | null;\n last_sign_in_at: string | null;\n external_id: string | null;\n metadata: Record<string, string>;\n locale: string | null;\n password_hash: string | null;\n impersonator: { email: string; reason: string } | null;\n}\n\nexport interface WorkOSSession extends Entity {\n object: 'session';\n user_id: string;\n organization_id: string | null;\n ip_address: string | null;\n user_agent: string | null;\n}\n\nexport interface WorkOSEmailVerification extends Entity {\n object: 'email_verification';\n user_id: string;\n email: string;\n code: string;\n expires_at: string;\n}\n\nexport interface WorkOSPasswordReset extends Entity {\n object: 'password_reset';\n user_id: string;\n email: string;\n token: string;\n expires_at: string;\n}\n\nexport interface WorkOSMagicAuth extends Entity {\n object: 'magic_auth';\n user_id: string;\n email: string;\n code: string;\n expires_at: string;\n}\n\nexport interface WorkOSAuthenticationFactor extends Entity {\n object: 'authentication_factor';\n user_id: string;\n type: 'totp';\n totp: {\n issuer: string;\n user: string;\n uri: string;\n };\n}\n\nexport interface WorkOSAuthorizationCode extends Entity {\n user_id: string;\n organization_id: string | null;\n code: string;\n redirect_uri: string;\n expires_at: string;\n code_challenge: string | null;\n code_challenge_method: string | null;\n}\n\nexport interface WorkOSIdentity extends Entity {\n object: 'identity';\n user_id: string;\n provider: string;\n provider_id: string;\n type: 'OAuth';\n}\n\nexport type WorkOSConnectionType =\n | 'ADFSSAML'\n | 'AzureSAML'\n | 'GenericOIDC'\n | 'GenericSAML'\n | 'GoogleOAuth'\n | 'GoogleSAML'\n | 'OktaSAML'\n | 'OneLoginSAML'\n | 'PingFederateSAML'\n | 'PingOneSAML'\n | 'GitHubOAuth'\n | 'MicrosoftOAuth'\n | 'AppleOAuth';\n\nexport interface WorkOSConnectionDomain {\n object: 'connection_domain';\n id: string;\n domain: string;\n}\n\nexport interface WorkOSConnection extends Entity {\n object: 'connection';\n organization_id: string;\n connection_type: WorkOSConnectionType;\n name: string;\n state: 'active' | 'inactive' | 'validating';\n domains: WorkOSConnectionDomain[];\n}\n\nexport interface WorkOSSSOProfile extends Entity {\n object: 'profile';\n connection_id: string;\n connection_type: WorkOSConnectionType;\n organization_id: string;\n idp_id: string;\n email: string;\n first_name: string | null;\n last_name: string | null;\n groups: string[];\n raw_attributes: Record<string, unknown>;\n}\n\nexport interface WorkOSSSOAuthorization extends Entity {\n code: string;\n connection_id: string;\n organization_id: string;\n profile_id: string;\n redirect_uri: string;\n state: string | null;\n expires_at: string;\n}\n\nexport interface WorkOSInvitation extends Entity {\n object: 'invitation';\n email: string;\n state: 'pending' | 'accepted' | 'expired' | 'revoked';\n token: string;\n accept_invitation_url: string;\n organization_id: string | null;\n inviter_user_id: string | null;\n role_slug: string | null;\n expires_at: string;\n}\n\nexport interface WorkOSRedirectUri extends Entity {\n object: 'redirect_uri';\n uri: string;\n}\n\nexport interface WorkOSCorsOrigin extends Entity {\n object: 'cors_origin';\n origin: string;\n}\n\nexport interface WorkOSAuthorizedApplication extends Entity {\n object: 'authorized_application';\n user_id: string;\n name: string;\n redirect_uri: string;\n}\n\nexport interface WorkOSConnectedAccount extends Entity {\n object: 'connected_account';\n user_id: string;\n provider: string;\n provider_id: string;\n}\n\nexport type PipeProvider = 'github' | 'slack' | 'google' | 'salesforce';\nexport type PipeConnectionStatus = 'connected' | 'disconnected' | 'requires_reauth';\n\nexport interface WorkOSPipeConnection extends Entity {\n object: 'pipe_connection';\n user_id: string;\n provider: PipeProvider;\n scopes: string[];\n status: PipeConnectionStatus;\n external_account_id: string | null;\n}\n\nexport interface WorkOSRefreshToken extends Entity {\n token: string;\n user_id: string;\n organization_id: string | null;\n session_id: string;\n expires_at: string;\n}\n\nexport interface WorkOSAuthenticationChallenge extends Entity {\n object: 'authentication_challenge';\n user_id: string;\n factor_id: string;\n expires_at: string;\n code: string | null;\n}\n\nexport interface WorkOSDeviceAuthorization extends Entity {\n device_code: string;\n user_code: string;\n user_id: string | null;\n client_id: string;\n expires_at: string;\n interval: number;\n}\n\nexport interface WorkOSRole extends Entity {\n object: 'role';\n slug: string;\n name: string;\n description: string | null;\n type: 'EnvironmentRole' | 'OrganizationRole';\n organization_id: string | null;\n is_default_role: boolean;\n priority: number;\n}\n\nexport interface WorkOSPermission extends Entity {\n object: 'permission';\n slug: string;\n name: string;\n description: string | null;\n}\n\nexport interface WorkOSRolePermission extends Entity {\n role_id: string;\n permission_id: string;\n}\n\nexport interface WorkOSAuthorizationResource extends Entity {\n object: 'authorization_resource';\n resource_type_slug: string;\n external_id: string;\n organization_id: string;\n metadata: Record<string, string>;\n}\n\nexport interface WorkOSRoleAssignment extends Entity {\n object: 'role_assignment';\n organization_membership_id: string;\n role_id: string;\n}\n\n// --- Phase 4: CRUD Domains ---\n\nexport interface WorkOSDirectory extends Entity {\n object: 'directory';\n name: string;\n organization_id: string | null;\n domain: string | null;\n type: string;\n state: 'linked' | 'unlinked' | 'deleting' | 'invalid_credentials';\n external_key: string | null;\n}\n\nexport interface WorkOSDirectoryUser extends Entity {\n object: 'directory_user';\n directory_id: string;\n organization_id: string | null;\n idp_id: string;\n first_name: string | null;\n last_name: string | null;\n email: string | null;\n username: string | null;\n state: 'active' | 'inactive';\n role: { slug: string } | null;\n custom_attributes: Record<string, unknown>;\n raw_attributes: Record<string, unknown>;\n groups: Array<{ object: 'directory_group'; id: string; name: string }>;\n}\n\nexport interface WorkOSDirectoryGroup extends Entity {\n object: 'directory_group';\n directory_id: string;\n organization_id: string | null;\n idp_id: string;\n name: string;\n raw_attributes: Record<string, unknown>;\n}\n\nexport interface WorkOSAuditLogAction extends Entity {\n object: 'audit_log_action';\n name: string;\n description: string | null;\n condition: string | null;\n}\n\nexport interface WorkOSAuditLogEvent extends Entity {\n object: 'audit_log_event';\n organization_id: string;\n action: { name: string; type: string; id: string };\n actor: Record<string, unknown>;\n targets: Array<Record<string, unknown>>;\n metadata: Record<string, unknown> | null;\n occurred_at: string;\n}\n\nexport interface WorkOSAuditLogExport extends Entity {\n object: 'audit_log_export';\n organization_id: string;\n state: 'pending' | 'ready' | 'error';\n url: string | null;\n filters: Record<string, unknown>;\n}\n\nexport interface WorkOSFeatureFlag extends Entity {\n object: 'feature_flag';\n slug: string;\n name: string;\n description: string | null;\n type: 'boolean' | 'string' | 'number';\n default_value: unknown;\n enabled: boolean;\n}\n\nexport interface WorkOSFlagTarget extends Entity {\n object: 'flag_target';\n flag_slug: string;\n resource_id: string;\n resource_type: string;\n value: unknown;\n}\n\nexport interface WorkOSConnectApplication extends Entity {\n object: 'connect_application';\n name: string;\n redirect_uris: string[];\n client_id: string;\n logo_url: string | null;\n}\n\nexport interface WorkOSClientSecret extends Entity {\n object: 'client_secret';\n application_id: string;\n value: string;\n last_four: string;\n}\n\nexport interface WorkOSDataIntegrationAuth extends Entity {\n slug: string;\n code: string;\n redirect_uri: string;\n state: string | null;\n expires_at: string;\n}\n\nexport interface WorkOSRadarAttempt extends Entity {\n object: 'radar_attempt';\n user_id: string | null;\n ip_address: string;\n user_agent: string | null;\n verdict: 'allow' | 'deny' | 'challenge';\n signals: Array<{ type: string; confidence: number }>;\n}\n\nexport interface WorkOSApiKey extends Entity {\n object: 'api_key';\n name: string;\n key: string;\n environment: string;\n}\n\nexport interface WorkOSEvent extends Entity {\n object: 'event';\n event: string;\n data: Record<string, unknown>;\n environment_id: string | null;\n}\n\nexport interface WorkOSWebhookEndpoint extends Entity {\n object: 'webhook_endpoint';\n url: string;\n secret: string;\n enabled: boolean;\n events: string[];\n description: string | null;\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import type { Store } from '../core/index.js';
2
+ export interface EventPayload {
3
+ event: string;
4
+ data: Record<string, unknown>;
5
+ environment_id?: string;
6
+ }
7
+ export declare class EventBus {
8
+ private store;
9
+ constructor(store: Store);
10
+ emit(payload: EventPayload): void;
11
+ private deliver;
12
+ }