@atlasauth/cli 0.12.0 → 0.14.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 (280) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/dist/args.d.ts +18 -0
  3. package/dist/args.js +9 -0
  4. package/dist/args.js.map +1 -1
  5. package/dist/commands/config.js +72 -7
  6. package/dist/commands/config.js.map +1 -1
  7. package/dist/commands/dev.d.ts +8 -0
  8. package/dist/commands/dev.js +84 -0
  9. package/dist/commands/dev.js.map +1 -0
  10. package/dist/commands/fga.d.ts +10 -0
  11. package/dist/commands/fga.js +105 -0
  12. package/dist/commands/fga.js.map +1 -0
  13. package/dist/commands/pages.d.ts +14 -0
  14. package/dist/commands/pages.js +113 -0
  15. package/dist/commands/pages.js.map +1 -0
  16. package/dist/context.d.ts +1 -1
  17. package/dist/help.d.ts +1 -1
  18. package/dist/help.js +71 -2
  19. package/dist/help.js.map +1 -1
  20. package/dist/index.d.ts +1 -0
  21. package/dist/index.js +3 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/migrate/appwrite/plugin.d.ts +2 -0
  24. package/dist/migrate/appwrite/plugin.js +103 -0
  25. package/dist/migrate/appwrite/plugin.js.map +1 -0
  26. package/dist/migrate/authentik/plugin.d.ts +2 -0
  27. package/dist/migrate/authentik/plugin.js +135 -0
  28. package/dist/migrate/authentik/plugin.js.map +1 -0
  29. package/dist/migrate/azure-ad-b2c/plugin.d.ts +8 -0
  30. package/dist/migrate/azure-ad-b2c/plugin.js +165 -0
  31. package/dist/migrate/azure-ad-b2c/plugin.js.map +1 -0
  32. package/dist/migrate/cognito/plugin.d.ts +5 -0
  33. package/dist/migrate/cognito/plugin.js +170 -0
  34. package/dist/migrate/cognito/plugin.js.map +1 -0
  35. package/dist/migrate/corbado/plugin.d.ts +2 -0
  36. package/dist/migrate/corbado/plugin.js +63 -0
  37. package/dist/migrate/corbado/plugin.js.map +1 -0
  38. package/dist/migrate/entra-external-id/plugin.d.ts +8 -0
  39. package/dist/migrate/entra-external-id/plugin.js +12 -0
  40. package/dist/migrate/entra-external-id/plugin.js.map +1 -0
  41. package/dist/migrate/export/appwrite-config.d.ts +28 -0
  42. package/dist/migrate/export/appwrite-config.js +170 -0
  43. package/dist/migrate/export/appwrite-config.js.map +1 -0
  44. package/dist/migrate/export/appwrite.d.ts +51 -0
  45. package/dist/migrate/export/appwrite.js +288 -0
  46. package/dist/migrate/export/appwrite.js.map +1 -0
  47. package/dist/migrate/export/authentik-config.d.ts +45 -0
  48. package/dist/migrate/export/authentik-config.js +357 -0
  49. package/dist/migrate/export/authentik-config.js.map +1 -0
  50. package/dist/migrate/export/authentik.d.ts +110 -0
  51. package/dist/migrate/export/authentik.js +838 -0
  52. package/dist/migrate/export/authentik.js.map +1 -0
  53. package/dist/migrate/export/azure-config.d.ts +58 -0
  54. package/dist/migrate/export/azure-config.js +344 -0
  55. package/dist/migrate/export/azure-config.js.map +1 -0
  56. package/dist/migrate/export/azure.d.ts +85 -0
  57. package/dist/migrate/export/azure.js +373 -0
  58. package/dist/migrate/export/azure.js.map +1 -0
  59. package/dist/migrate/export/cognito-config.d.ts +25 -0
  60. package/dist/migrate/export/cognito-config.js +273 -0
  61. package/dist/migrate/export/cognito-config.js.map +1 -0
  62. package/dist/migrate/export/cognito.d.ts +103 -0
  63. package/dist/migrate/export/cognito.js +441 -0
  64. package/dist/migrate/export/cognito.js.map +1 -0
  65. package/dist/migrate/export/corbado-config.d.ts +20 -0
  66. package/dist/migrate/export/corbado-config.js +63 -0
  67. package/dist/migrate/export/corbado-config.js.map +1 -0
  68. package/dist/migrate/export/corbado.d.ts +37 -0
  69. package/dist/migrate/export/corbado.js +132 -0
  70. package/dist/migrate/export/corbado.js.map +1 -0
  71. package/dist/migrate/export/firebase-config.d.ts +24 -0
  72. package/dist/migrate/export/firebase-config.js +215 -0
  73. package/dist/migrate/export/firebase-config.js.map +1 -0
  74. package/dist/migrate/export/firebase.d.ts +102 -0
  75. package/dist/migrate/export/firebase.js +464 -0
  76. package/dist/migrate/export/firebase.js.map +1 -0
  77. package/dist/migrate/export/frontegg-config.d.ts +29 -0
  78. package/dist/migrate/export/frontegg-config.js +238 -0
  79. package/dist/migrate/export/frontegg-config.js.map +1 -0
  80. package/dist/migrate/export/frontegg.d.ts +67 -0
  81. package/dist/migrate/export/frontegg.js +410 -0
  82. package/dist/migrate/export/frontegg.js.map +1 -0
  83. package/dist/migrate/export/fusionauth-config.d.ts +26 -0
  84. package/dist/migrate/export/fusionauth-config.js +226 -0
  85. package/dist/migrate/export/fusionauth-config.js.map +1 -0
  86. package/dist/migrate/export/fusionauth.d.ts +99 -0
  87. package/dist/migrate/export/fusionauth.js +642 -0
  88. package/dist/migrate/export/fusionauth.js.map +1 -0
  89. package/dist/migrate/export/hanko-config.d.ts +27 -0
  90. package/dist/migrate/export/hanko-config.js +265 -0
  91. package/dist/migrate/export/hanko-config.js.map +1 -0
  92. package/dist/migrate/export/hanko.d.ts +52 -0
  93. package/dist/migrate/export/hanko.js +605 -0
  94. package/dist/migrate/export/hanko.js.map +1 -0
  95. package/dist/migrate/export/keycloak-config.d.ts +19 -0
  96. package/dist/migrate/export/keycloak-config.js +219 -0
  97. package/dist/migrate/export/keycloak-config.js.map +1 -0
  98. package/dist/migrate/export/keycloak.d.ts +155 -0
  99. package/dist/migrate/export/keycloak.js +878 -0
  100. package/dist/migrate/export/keycloak.js.map +1 -0
  101. package/dist/migrate/export/ldap.d.ts +53 -0
  102. package/dist/migrate/export/ldap.js +277 -0
  103. package/dist/migrate/export/ldap.js.map +1 -0
  104. package/dist/migrate/export/logto-config.d.ts +27 -0
  105. package/dist/migrate/export/logto-config.js +264 -0
  106. package/dist/migrate/export/logto-config.js.map +1 -0
  107. package/dist/migrate/export/logto.d.ts +150 -0
  108. package/dist/migrate/export/logto.js +809 -0
  109. package/dist/migrate/export/logto.js.map +1 -0
  110. package/dist/migrate/export/magic-config.d.ts +14 -0
  111. package/dist/migrate/export/magic-config.js +28 -0
  112. package/dist/migrate/export/magic-config.js.map +1 -0
  113. package/dist/migrate/export/magic.d.ts +31 -0
  114. package/dist/migrate/export/magic.js +93 -0
  115. package/dist/migrate/export/magic.js.map +1 -0
  116. package/dist/migrate/export/mini-yaml.d.ts +19 -0
  117. package/dist/migrate/export/mini-yaml.js +581 -0
  118. package/dist/migrate/export/mini-yaml.js.map +1 -0
  119. package/dist/migrate/export/nhost-config.d.ts +26 -0
  120. package/dist/migrate/export/nhost-config.js +360 -0
  121. package/dist/migrate/export/nhost-config.js.map +1 -0
  122. package/dist/migrate/export/nhost.d.ts +64 -0
  123. package/dist/migrate/export/nhost.js +304 -0
  124. package/dist/migrate/export/nhost.js.map +1 -0
  125. package/dist/migrate/export/onelogin.d.ts +22 -0
  126. package/dist/migrate/export/onelogin.js +123 -0
  127. package/dist/migrate/export/onelogin.js.map +1 -0
  128. package/dist/migrate/export/ory-config.d.ts +58 -0
  129. package/dist/migrate/export/ory-config.js +451 -0
  130. package/dist/migrate/export/ory-config.js.map +1 -0
  131. package/dist/migrate/export/ory.d.ts +81 -0
  132. package/dist/migrate/export/ory.js +555 -0
  133. package/dist/migrate/export/ory.js.map +1 -0
  134. package/dist/migrate/export/password-detect.d.ts +29 -0
  135. package/dist/migrate/export/password-detect.js +81 -0
  136. package/dist/migrate/export/password-detect.js.map +1 -0
  137. package/dist/migrate/export/pingone.d.ts +36 -0
  138. package/dist/migrate/export/pingone.js +218 -0
  139. package/dist/migrate/export/pingone.js.map +1 -0
  140. package/dist/migrate/export/pocketbase-config.d.ts +28 -0
  141. package/dist/migrate/export/pocketbase-config.js +180 -0
  142. package/dist/migrate/export/pocketbase-config.js.map +1 -0
  143. package/dist/migrate/export/pocketbase.d.ts +52 -0
  144. package/dist/migrate/export/pocketbase.js +243 -0
  145. package/dist/migrate/export/pocketbase.js.map +1 -0
  146. package/dist/migrate/export/project-files.d.ts +15 -0
  147. package/dist/migrate/export/project-files.js +43 -0
  148. package/dist/migrate/export/project-files.js.map +1 -0
  149. package/dist/migrate/export/propelauth-config.d.ts +18 -0
  150. package/dist/migrate/export/propelauth-config.js +58 -0
  151. package/dist/migrate/export/propelauth-config.js.map +1 -0
  152. package/dist/migrate/export/propelauth-harness.test-helper.d.ts +62 -0
  153. package/dist/migrate/export/propelauth-harness.test-helper.js +109 -0
  154. package/dist/migrate/export/propelauth-harness.test-helper.js.map +1 -0
  155. package/dist/migrate/export/propelauth.d.ts +48 -0
  156. package/dist/migrate/export/propelauth.js +255 -0
  157. package/dist/migrate/export/propelauth.js.map +1 -0
  158. package/dist/migrate/export/source-lines.d.ts +17 -0
  159. package/dist/migrate/export/source-lines.js +43 -0
  160. package/dist/migrate/export/source-lines.js.map +1 -0
  161. package/dist/migrate/export/sso-metadata.d.ts +47 -0
  162. package/dist/migrate/export/sso-metadata.js +180 -0
  163. package/dist/migrate/export/sso-metadata.js.map +1 -0
  164. package/dist/migrate/export/stytch-config.d.ts +22 -0
  165. package/dist/migrate/export/stytch-config.js +102 -0
  166. package/dist/migrate/export/stytch-config.js.map +1 -0
  167. package/dist/migrate/export/stytch.d.ts +68 -0
  168. package/dist/migrate/export/stytch.js +510 -0
  169. package/dist/migrate/export/stytch.js.map +1 -0
  170. package/dist/migrate/export/supabase-config.d.ts +48 -0
  171. package/dist/migrate/export/supabase-config.js +408 -0
  172. package/dist/migrate/export/supabase-config.js.map +1 -0
  173. package/dist/migrate/export/supabase.d.ts +86 -0
  174. package/dist/migrate/export/supabase.js +524 -0
  175. package/dist/migrate/export/supabase.js.map +1 -0
  176. package/dist/migrate/export/supertokens-config.d.ts +20 -0
  177. package/dist/migrate/export/supertokens-config.js +150 -0
  178. package/dist/migrate/export/supertokens-config.js.map +1 -0
  179. package/dist/migrate/export/supertokens.d.ts +125 -0
  180. package/dist/migrate/export/supertokens.js +464 -0
  181. package/dist/migrate/export/supertokens.js.map +1 -0
  182. package/dist/migrate/export/table.d.ts +35 -0
  183. package/dist/migrate/export/table.js +248 -0
  184. package/dist/migrate/export/table.js.map +1 -0
  185. package/dist/migrate/export/userfront-config.d.ts +15 -0
  186. package/dist/migrate/export/userfront-config.js +49 -0
  187. package/dist/migrate/export/userfront-config.js.map +1 -0
  188. package/dist/migrate/export/userfront.d.ts +38 -0
  189. package/dist/migrate/export/userfront.js +189 -0
  190. package/dist/migrate/export/userfront.js.map +1 -0
  191. package/dist/migrate/export/workos-config.d.ts +23 -0
  192. package/dist/migrate/export/workos-config.js +125 -0
  193. package/dist/migrate/export/workos-config.js.map +1 -0
  194. package/dist/migrate/export/workos.d.ts +46 -0
  195. package/dist/migrate/export/workos.js +272 -0
  196. package/dist/migrate/export/workos.js.map +1 -0
  197. package/dist/migrate/export/zitadel-config.d.ts +37 -0
  198. package/dist/migrate/export/zitadel-config.js +279 -0
  199. package/dist/migrate/export/zitadel-config.js.map +1 -0
  200. package/dist/migrate/export/zitadel.d.ts +82 -0
  201. package/dist/migrate/export/zitadel.js +447 -0
  202. package/dist/migrate/export/zitadel.js.map +1 -0
  203. package/dist/migrate/firebase/plugin.d.ts +2 -0
  204. package/dist/migrate/firebase/plugin.js +152 -0
  205. package/dist/migrate/firebase/plugin.js.map +1 -0
  206. package/dist/migrate/framework/builtins.js +35 -6
  207. package/dist/migrate/framework/builtins.js.map +1 -1
  208. package/dist/migrate/framework/orchestrator.js +3 -2
  209. package/dist/migrate/framework/orchestrator.js.map +1 -1
  210. package/dist/migrate/framework/plugin.d.ts +2 -0
  211. package/dist/migrate/frontegg/plugin.d.ts +2 -0
  212. package/dist/migrate/frontegg/plugin.js +78 -0
  213. package/dist/migrate/frontegg/plugin.js.map +1 -0
  214. package/dist/migrate/fusionauth/plugin.d.ts +2 -0
  215. package/dist/migrate/fusionauth/plugin.js +109 -0
  216. package/dist/migrate/fusionauth/plugin.js.map +1 -0
  217. package/dist/migrate/hanko/plugin.d.ts +2 -0
  218. package/dist/migrate/hanko/plugin.js +100 -0
  219. package/dist/migrate/hanko/plugin.js.map +1 -0
  220. package/dist/migrate/keycloak/plugin.d.ts +2 -0
  221. package/dist/migrate/keycloak/plugin.js +148 -0
  222. package/dist/migrate/keycloak/plugin.js.map +1 -0
  223. package/dist/migrate/ldap/plugin.d.ts +2 -0
  224. package/dist/migrate/ldap/plugin.js +73 -0
  225. package/dist/migrate/ldap/plugin.js.map +1 -0
  226. package/dist/migrate/logto/plugin.d.ts +2 -0
  227. package/dist/migrate/logto/plugin.js +131 -0
  228. package/dist/migrate/logto/plugin.js.map +1 -0
  229. package/dist/migrate/magic/plugin.d.ts +2 -0
  230. package/dist/migrate/magic/plugin.js +56 -0
  231. package/dist/migrate/magic/plugin.js.map +1 -0
  232. package/dist/migrate/nhost/plugin.d.ts +2 -0
  233. package/dist/migrate/nhost/plugin.js +115 -0
  234. package/dist/migrate/nhost/plugin.js.map +1 -0
  235. package/dist/migrate/oidc/plugin.d.ts +2 -0
  236. package/dist/migrate/oidc/plugin.js +73 -0
  237. package/dist/migrate/oidc/plugin.js.map +1 -0
  238. package/dist/migrate/onelogin/plugin.d.ts +2 -0
  239. package/dist/migrate/onelogin/plugin.js +61 -0
  240. package/dist/migrate/onelogin/plugin.js.map +1 -0
  241. package/dist/migrate/ory/plugin.d.ts +2 -0
  242. package/dist/migrate/ory/plugin.js +186 -0
  243. package/dist/migrate/ory/plugin.js.map +1 -0
  244. package/dist/migrate/ping-identity/plugin.d.ts +2 -0
  245. package/dist/migrate/ping-identity/plugin.js +100 -0
  246. package/dist/migrate/ping-identity/plugin.js.map +1 -0
  247. package/dist/migrate/pocketbase/plugin.d.ts +2 -0
  248. package/dist/migrate/pocketbase/plugin.js +99 -0
  249. package/dist/migrate/pocketbase/plugin.js.map +1 -0
  250. package/dist/migrate/propelauth/plugin.d.ts +2 -0
  251. package/dist/migrate/propelauth/plugin.js +65 -0
  252. package/dist/migrate/propelauth/plugin.js.map +1 -0
  253. package/dist/migrate/saml/plugin.d.ts +2 -0
  254. package/dist/migrate/saml/plugin.js +79 -0
  255. package/dist/migrate/saml/plugin.js.map +1 -0
  256. package/dist/migrate/stytch/plugin.d.ts +2 -0
  257. package/dist/migrate/stytch/plugin.js +97 -0
  258. package/dist/migrate/stytch/plugin.js.map +1 -0
  259. package/dist/migrate/supabase/plugin.d.ts +2 -0
  260. package/dist/migrate/supabase/plugin.js +149 -0
  261. package/dist/migrate/supabase/plugin.js.map +1 -0
  262. package/dist/migrate/supertokens/plugin.d.ts +2 -0
  263. package/dist/migrate/supertokens/plugin.js +114 -0
  264. package/dist/migrate/supertokens/plugin.js.map +1 -0
  265. package/dist/migrate/user-table/plugin.d.ts +2 -0
  266. package/dist/migrate/user-table/plugin.js +62 -0
  267. package/dist/migrate/user-table/plugin.js.map +1 -0
  268. package/dist/migrate/userfront/plugin.d.ts +2 -0
  269. package/dist/migrate/userfront/plugin.js +60 -0
  270. package/dist/migrate/userfront/plugin.js.map +1 -0
  271. package/dist/migrate/workos/plugin.d.ts +2 -0
  272. package/dist/migrate/workos/plugin.js +81 -0
  273. package/dist/migrate/workos/plugin.js.map +1 -0
  274. package/dist/migrate/zitadel/plugin.d.ts +2 -0
  275. package/dist/migrate/zitadel/plugin.js +114 -0
  276. package/dist/migrate/zitadel/plugin.js.map +1 -0
  277. package/dist/run.js +6 -0
  278. package/dist/run.js.map +1 -1
  279. package/github-action/fga-test/action.yml +43 -0
  280. package/package.json +9 -6
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchWorkosConfig = fetchWorkosConfig;
4
+ exports.translateWorkosConfig = translateWorkosConfig;
5
+ const record_set_1 = require("./record-set");
6
+ const translate_kit_1 = require("./translate-kit");
7
+ const vendor_http_1 = require("./vendor-http");
8
+ async function listOf(http, path) {
9
+ const out = [];
10
+ let after;
11
+ try {
12
+ for (;;) {
13
+ const q = new URLSearchParams({ limit: '100', order: 'asc' });
14
+ if (after)
15
+ q.set('after', after);
16
+ const body = (await http.get(`${path}?${q.toString()}`)).body;
17
+ out.push(...(0, record_set_1.objs)((0, record_set_1.isObj)(body) ? body.data : undefined));
18
+ const next = (0, record_set_1.isObj)(body) && (0, record_set_1.isObj)(body.list_metadata) ? (0, record_set_1.str)(body.list_metadata.after) : undefined;
19
+ if (!next || next === after)
20
+ break;
21
+ after = next;
22
+ }
23
+ }
24
+ catch (err) {
25
+ // Absent on this environment (RBAC off, endpoint not offered, no permission).
26
+ if (err instanceof vendor_http_1.VendorApiError && [400, 403, 404, 405].includes(err.status))
27
+ return out;
28
+ throw err;
29
+ }
30
+ return out;
31
+ }
32
+ async function plainList(http, path) {
33
+ try {
34
+ const body = (await http.get(path)).body;
35
+ return (0, record_set_1.objs)((0, record_set_1.isObj)(body) ? body.data : undefined);
36
+ }
37
+ catch (err) {
38
+ if (err instanceof vendor_http_1.VendorApiError && [400, 403, 404, 405].includes(err.status))
39
+ return [];
40
+ throw err;
41
+ }
42
+ }
43
+ async function fetchWorkosConfig(http, clientId) {
44
+ return {
45
+ ...(clientId ? { clientId } : {}),
46
+ // The roles listing is not paginated.
47
+ roles: await plainList(http, '/authorization/roles'),
48
+ permissions: await listOf(http, '/authorization/permissions'),
49
+ redirectUris: await listOf(http, '/user_management/redirect_uris'),
50
+ corsOrigins: await listOf(http, '/user_management/cors_origins'),
51
+ connections: await listOf(http, '/connections'),
52
+ directories: (await listOf(http, '/directories')).length,
53
+ };
54
+ }
55
+ function translateWorkosConfig(snap) {
56
+ const b = new translate_kit_1.ConfigBuilder();
57
+ for (const p of snap.permissions) {
58
+ const key = (0, record_set_1.str)(p.slug);
59
+ if (key)
60
+ b.push('permissions', { key, name: (0, record_set_1.str)(p.name) ?? key, description: (0, record_set_1.str)(p.description) ?? '' });
61
+ }
62
+ if (snap.permissions.length)
63
+ b.add('mapped', 'authorization', 'permissions', `${snap.permissions.length} permission(s).`, 'permissions');
64
+ let roles = 0;
65
+ for (const r of snap.roles) {
66
+ const slug = (0, record_set_1.str)(r.slug);
67
+ // Organization-specific roles are exported per organization with the data.
68
+ if (!slug || (0, record_set_1.str)(r.type) === 'OrganizationRole')
69
+ continue;
70
+ roles++;
71
+ b.roles[slug] = slug;
72
+ b.push('roles', { key: slug, name: (0, record_set_1.str)(r.name) ?? slug, description: (0, record_set_1.str)(r.description) ?? '', permissions: (0, record_set_1.strs)(r.permissions) });
73
+ }
74
+ if (roles)
75
+ b.add('mapped', 'authorization', 'environment roles', `${roles} role(s); members keep the same role slug as their Atlas role key.`, 'roles');
76
+ if (snap.roles.length === 0)
77
+ b.add('manual', 'authorization', 'roles', 'No roles were returned (RBAC may be off for this environment); the default "admin" and "member" roles carry over as Atlas organization roles.');
78
+ const redirects = new Set();
79
+ for (const u of snap.redirectUris) {
80
+ const uri = (0, record_set_1.str)(u.uri);
81
+ if (uri)
82
+ redirects.add(uri);
83
+ }
84
+ for (const url of redirects) {
85
+ if (url.includes('*'))
86
+ b.add('differs', 'redirect URIs', url, 'Atlas redirect URLs are exact (no wildcards).', 'redirect_urls');
87
+ else
88
+ b.push('redirect_urls', { url });
89
+ }
90
+ const exact = [...redirects].filter((u) => !u.includes('*')).length;
91
+ if (exact)
92
+ b.add('mapped', 'redirect URIs', 'redirect_uris', `${exact} redirect URI(s).`, 'redirect_urls');
93
+ if (redirects.size === 0)
94
+ b.add('manual', 'redirect URIs', 'redirect_uris', 'WorkOS did not list its redirect URIs by API: add your app\'s post-sign-in URLs to Atlas (redirect_urls).', 'redirect_urls');
95
+ for (const o of snap.corsOrigins) {
96
+ const origin = (0, record_set_1.str)(o.origin);
97
+ if (origin)
98
+ b.add('manual', 'CORS origins', origin, 'Add this origin to the allowed origins of your Atlas instance (Atlas dashboard → Settings → Allowed origins).');
99
+ }
100
+ const sso = snap.connections.length;
101
+ if (sso)
102
+ b.add('mapped', 'enterprise', `${sso} SSO connection(s)`, 'Move with the data export as Atlas SSO connections. WorkOS does not return the identity provider details: each customer\'s IdP is set up again against the new Atlas service-provider settings.', 'sso_connections');
103
+ if (snap.directories)
104
+ b.add('manual', 'enterprise', `${snap.directories} Directory Sync directory(ies)`, 'Reconnect through Atlas SCIM provisioning; the identity provider re-provisions users and groups.');
105
+ for (const [setting, where] of [
106
+ ['authentication methods (password, Magic Auth, social, passkeys)', 'Authentication → Methods'],
107
+ ['social connections (client ids and secrets)', 'Authentication → Social login (use the same OAuth apps in Atlas so imported accounts relink)'],
108
+ ['multi-factor authentication policy', 'Authentication → Multi-Factor Auth'],
109
+ ['session lifetime and access token lifetime', 'Authentication → Sessions'],
110
+ ['sign-up rules, email verification and domain restrictions', 'Authentication → Sign-up'],
111
+ ['branding, hosted-page text and email templates', 'Branding and Email'],
112
+ ['JWT templates and custom claims', 'Authentication → Sessions → JWT template'],
113
+ ['custom authentication domain', 'Domains'],
114
+ ['Radar (bot and fraud rules)', 'Radar'],
115
+ ['webhooks and events', 'Webhooks (create Atlas webhook endpoints)'],
116
+ ]) {
117
+ b.add('manual', 'settings not in the API', setting, `WorkOS does not expose this by API; copy it from the WorkOS dashboard (${where}).`);
118
+ }
119
+ return b.result(`WorkOS environment${snap.clientId ? ` ${snap.clientId}` : ''}`, {
120
+ ...(snap.clientId
121
+ ? { bridge: { preset: 'workos', vars: { client_id: snap.clientId } }, lazy: { preset: 'workos', config: { client_id: snap.clientId } } }
122
+ : {}),
123
+ });
124
+ }
125
+ //# sourceMappingURL=workos-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workos-config.js","sourceRoot":"","sources":["../../../src/migrate/export/workos-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { UserRecord } from '@atlasauth/migrate';
2
+ import { RecordSet, type Obj } from './record-set';
3
+ /**
4
+ * `atlas migrate export workos` — a WorkOS environment (AuthKit + SSO +
5
+ * Directory Sync) onto the canonical bundle models, read with an API key on
6
+ * this machine.
7
+ *
8
+ * - organizations (verified domains, metadata), environment roles and each
9
+ * organization's custom roles, memberships with their role slug, pending
10
+ * and past invitations;
11
+ * - users (verified email, names, avatar, metadata, last sign-in) with the
12
+ * OAuth identities WorkOS holds for them (provider user ids, so social
13
+ * sign-in relinks exactly);
14
+ * - SSO connections (SAML / OIDC) with the IdP signing certificates WorkOS
15
+ * returns; the IdP entity id, SSO URL and OIDC client secret are NOT
16
+ * available through the API, so the customer's IdP is reconfigured against
17
+ * the new Atlas connection;
18
+ * - password hashes: WorkOS publishes no export of them (only an import
19
+ * path). If WorkOS support gives you a hash file, pass it
20
+ * (--workos-hashes-file); otherwise turn on the `workos` lazy-migration
21
+ * preset, which checks each password against WorkOS on first sign-in.
22
+ *
23
+ * Not exportable: TOTP secrets and passkeys (users enrol again), API key
24
+ * secrets (reissue as Atlas API keys), sessions (the `workos` bridge preset
25
+ * exchanges the access token). Directory Sync directories are reconnected in
26
+ * Atlas SCIM.
27
+ */
28
+ export interface WorkosExportOptions {
29
+ apiKey: string;
30
+ /** For the manifest only (the client id appears in token issuers). */
31
+ clientId?: string;
32
+ /** API base (default https://api.workos.com). */
33
+ baseUrl?: string;
34
+ /** A password-hash export from WorkOS support (CSV or NDJSON), when the owner has one. */
35
+ hashesText?: string;
36
+ /** Also count TOTP / SMS / WebAuthn factors per user (one more request each) so the report says how many re-enrol. */
37
+ countFactors?: boolean;
38
+ fetchImpl?: typeof fetch;
39
+ sleep?: (ms: number) => Promise<void>;
40
+ onProgress?: (message: string) => void;
41
+ }
42
+ export declare function exportWorkos(opts: WorkosExportOptions): Promise<RecordSet>;
43
+ /** One WorkOS user → a user record (a user always has an email). */
44
+ export declare function mapWorkosUser(u: Obj): UserRecord | null;
45
+ /** `GoogleOAuth` → `google`, `GitHubOAuth` → `github`: the provider name an Atlas provider key is looked up by. */
46
+ export declare function providerKey(provider: string): string;
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.exportWorkos = exportWorkos;
4
+ exports.mapWorkosUser = mapWorkosUser;
5
+ exports.providerKey = providerKey;
6
+ const csv_1 = require("../../import/csv");
7
+ const record_set_1 = require("./record-set");
8
+ const vendor_http_1 = require("./vendor-http");
9
+ const PAGE = 100;
10
+ async function exportWorkos(opts) {
11
+ const set = new record_set_1.RecordSet();
12
+ if (!/^sk_[A-Za-z0-9_]+$/.test(opts.apiKey)) {
13
+ throw new Error('Not a WorkOS API key: it starts with sk_ (WORKOS_API_KEY).');
14
+ }
15
+ const progress = opts.onProgress ?? (() => undefined);
16
+ const http = new vendor_http_1.VendorHttp({
17
+ vendor: 'WorkOS',
18
+ baseUrl: (opts.baseUrl ?? 'https://api.workos.com').replace(/\/+$/, ''),
19
+ headers: { authorization: `Bearer ${opts.apiKey}` },
20
+ fetchImpl: opts.fetchImpl,
21
+ sleep: opts.sleep,
22
+ });
23
+ progress('organizations');
24
+ const orgIds = [];
25
+ for (const o of await listAll(http, '/organizations')) {
26
+ const id = (0, record_set_1.str)(o.id);
27
+ const name = (0, record_set_1.str)(o.name);
28
+ if (!id || !name)
29
+ continue;
30
+ orgIds.push(id);
31
+ set.add('organization', (0, record_set_1.compact)({
32
+ id,
33
+ name,
34
+ // Only domains WorkOS has verified let members join by domain.
35
+ domains: (0, record_set_1.objs)(o.domains)
36
+ .filter((d) => ['verified', 'legacy_verified'].includes((0, record_set_1.str)(d.state) ?? ''))
37
+ .map((d) => (0, record_set_1.str)(d.domain)?.toLowerCase())
38
+ .filter((d) => !!d),
39
+ public_metadata: (0, record_set_1.bag)(o.metadata),
40
+ private_metadata: (0, record_set_1.str)(o.external_id) ? { workos_external_id: (0, record_set_1.str)(o.external_id) } : undefined,
41
+ created_at: (0, record_set_1.str)(o.created_at),
42
+ }));
43
+ }
44
+ progress('roles');
45
+ const envRoles = await optional(http, '/authorization/roles');
46
+ for (const r of (0, record_set_1.objs)(envRoles?.data))
47
+ addRole(set, r, undefined);
48
+ for (const id of orgIds) {
49
+ for (const r of (0, record_set_1.objs)((await optional(http, `/authorization/organizations/${encodeURIComponent(id)}/roles`))?.data)) {
50
+ // The listing repeats the environment roles; only the organization's own are new.
51
+ if ((0, record_set_1.str)(r.type) === 'OrganizationRole')
52
+ addRole(set, r, id);
53
+ }
54
+ }
55
+ progress('users');
56
+ const hashes = opts.hashesText ? indexHashes(opts.hashesText) : null;
57
+ let withHash = 0;
58
+ let factorUsers = 0;
59
+ let passkeyUsers = 0;
60
+ for (const u of await listAll(http, '/user_management/users')) {
61
+ const user = mapWorkosUser(u);
62
+ if (!user) {
63
+ set.omit('user', 'no email address');
64
+ continue;
65
+ }
66
+ const h = hashes && (hashes.get(user.id) ?? hashes.get(user.emails[0].email) ?? ((0, record_set_1.str)(u.external_id) ? hashes.get((0, record_set_1.str)(u.external_id)) : undefined));
67
+ if (h) {
68
+ user.password = { algorithm: 'auto', hash: h };
69
+ withHash++;
70
+ }
71
+ set.add('user', user);
72
+ const email = user.emails[0];
73
+ const identities = await optional(http, `/user_management/users/${encodeURIComponent(user.id)}/identities`);
74
+ // The identities endpoint answers with a bare array.
75
+ for (const i of (0, record_set_1.objs)(Array.isArray(identities) ? identities : identities?.data)) {
76
+ const sub = (0, record_set_1.str)(i.idp_id);
77
+ const provider = (0, record_set_1.str)(i.provider);
78
+ if (!sub || !provider)
79
+ continue;
80
+ set.add('identity', (0, record_set_1.compact)({ user_id: user.id, provider: providerKey(provider), provider_user_id: sub, kind: 'oauth', email: email.email, email_verified: email.verified }), `${user.id}:${provider}:${sub}`);
81
+ }
82
+ if (opts.countFactors) {
83
+ const factors = (0, record_set_1.objs)((await optional(http, `/user_management/users/${encodeURIComponent(user.id)}/auth_factors`))?.data);
84
+ if (factors.some((f) => ['totp', 'sms', 'generic_otp'].includes((0, record_set_1.str)(f.type) ?? '')))
85
+ factorUsers++;
86
+ if (factors.some((f) => (0, record_set_1.str)(f.type) === 'webauthn'))
87
+ passkeyUsers++;
88
+ }
89
+ }
90
+ if (factorUsers)
91
+ set.omit('mfa_factor', 'WorkOS never returns TOTP secrets (they are shown only when a factor is enrolled); users enrol again in Atlas', factorUsers);
92
+ if (passkeyUsers)
93
+ set.omit('passkey', 'WorkOS does not export WebAuthn public keys; users register a passkey again in Atlas', passkeyUsers);
94
+ if (!opts.countFactors && set.count('user') > 0) {
95
+ set.warn('Second factors were not counted: WorkOS never exports TOTP secrets or passkeys, so users with a second factor enrol again (pass --set workos-factors=1 to count them).');
96
+ }
97
+ if (!hashes && set.count('user') > 0) {
98
+ set.warn('No password hashes: WorkOS has no password export. If WorkOS support provided one, pass it with --workos-hashes-file; otherwise turn on the workos lazy-migration preset so each password moves on its first sign-in.');
99
+ }
100
+ else if (hashes && withHash === 0) {
101
+ set.warn('The hash file matched no user (by user id, email or external id): check its columns.');
102
+ }
103
+ progress('memberships');
104
+ let multiRole = false;
105
+ for (const id of orgIds) {
106
+ for (const m of await listAll(http, '/user_management/organization_memberships', { organization_id: id, statuses: 'active' })) {
107
+ const userId = (0, record_set_1.str)(m.user_id);
108
+ if (!userId)
109
+ continue;
110
+ const roles = [(0, record_set_1.str)((0, record_set_1.isObj)(m.role) ? m.role.slug : undefined), ...(0, record_set_1.objs)(m.roles).map((r) => (0, record_set_1.str)(r.slug))].filter((s) => !!s);
111
+ const unique = [...new Set(roles)];
112
+ if (unique.length > 1)
113
+ multiRole = true;
114
+ set.add('membership', (0, record_set_1.compact)({ id: (0, record_set_1.str)(m.id), organization_id: id, user_id: userId, role: unique[0] ?? 'member', created_at: (0, record_set_1.str)(m.created_at) }), `${id}:${userId}`);
115
+ }
116
+ }
117
+ if (multiRole)
118
+ set.warn('Some members hold several WorkOS roles; Atlas seats each member with one role (the first).');
119
+ progress('invitations');
120
+ for (const inv of await optionalAll(http, '/user_management/invitations')) {
121
+ const id = (0, record_set_1.str)(inv.id);
122
+ const email = (0, record_set_1.str)(inv.email)?.toLowerCase();
123
+ if (!id || !email)
124
+ continue;
125
+ const state = (0, record_set_1.str)(inv.state);
126
+ set.add('invitation', (0, record_set_1.compact)({
127
+ id,
128
+ organization_id: (0, record_set_1.str)(inv.organization_id),
129
+ email,
130
+ role: (0, record_set_1.str)(inv.role_slug),
131
+ status: state && ['pending', 'accepted', 'revoked', 'expired'].includes(state) ? state : undefined,
132
+ inviter_user_id: (0, record_set_1.str)(inv.inviter_user_id),
133
+ expires_at: (0, record_set_1.str)(inv.expires_at),
134
+ created_at: (0, record_set_1.str)(inv.created_at),
135
+ }));
136
+ }
137
+ progress('sso');
138
+ let idpManual = 0;
139
+ for (const c of await optionalAll(http, '/connections')) {
140
+ const id = (0, record_set_1.str)(c.id);
141
+ if (!id)
142
+ continue;
143
+ const type = (0, record_set_1.str)(c.connection_type) ?? '';
144
+ const protocol = /oidc/i.test(type) ? 'oidc' : 'saml';
145
+ let cert;
146
+ if (protocol === 'saml') {
147
+ const certs = await optional(http, `/connections/${encodeURIComponent(id)}/saml_idp_signing_certs`);
148
+ cert = (0, record_set_1.str)((0, record_set_1.objs)(certs?.data)[0]?.value);
149
+ }
150
+ idpManual++;
151
+ set.add('sso_connection', (0, record_set_1.compact)({
152
+ id,
153
+ name: (0, record_set_1.str)(c.name) ?? `${type || protocol} ${id}`,
154
+ organization_id: (0, record_set_1.str)(c.organization_id),
155
+ protocol,
156
+ domains: (0, record_set_1.objs)(c.domains).map((d) => (0, record_set_1.str)(d.domain)?.toLowerCase()).filter((d) => !!d),
157
+ saml: protocol === 'saml' && cert ? { idp_certificate: cert } : undefined,
158
+ enabled: (0, record_set_1.str)(c.state) ? (0, record_set_1.str)(c.state) === 'active' : undefined,
159
+ }));
160
+ }
161
+ if (idpManual) {
162
+ set.warn(`${idpManual} SSO connection(s): WorkOS does not return the identity provider's entity id, SSO URL or OIDC client secret. Each customer's IdP admin sets the connection up again against the new Atlas service-provider details (or send them Atlas's metadata URL).`);
163
+ }
164
+ progress('directories');
165
+ const directories = await optionalAll(http, '/directories');
166
+ if (directories.length) {
167
+ set.warn(`${directories.length} Directory Sync directory(ies): reconnect each through Atlas SCIM provisioning (the directory's users and groups are re-provisioned by the identity provider).`);
168
+ }
169
+ progress('api keys');
170
+ let keys = 0;
171
+ for (const id of orgIds)
172
+ keys += (await optionalAll(http, `/organizations/${encodeURIComponent(id)}/api_keys`)).length;
173
+ if (keys)
174
+ set.omit('api_key', 'WorkOS shows an API key secret only once: reissue them as Atlas API keys', keys);
175
+ set.manifest = { origin: opts.clientId ?? 'api.workos.com', ...(opts.clientId ? { settings: { client_id: opts.clientId } } : {}) };
176
+ return set;
177
+ }
178
+ function addRole(set, r, organizationId) {
179
+ const key = (0, record_set_1.str)(r.slug);
180
+ if (!key)
181
+ return;
182
+ set.add('role', (0, record_set_1.compact)({ key, name: (0, record_set_1.str)(r.name), description: (0, record_set_1.str)(r.description), scope: 'organization', organization_id: organizationId, permissions: (0, record_set_1.strs)(r.permissions) }), `${organizationId ?? ''}:${key}`);
183
+ }
184
+ /** One WorkOS user → a user record (a user always has an email). */
185
+ function mapWorkosUser(u) {
186
+ const id = (0, record_set_1.str)(u.id);
187
+ const email = (0, record_set_1.str)(u.email)?.toLowerCase();
188
+ if (!id || !email)
189
+ return null;
190
+ const metadata = (0, record_set_1.bag)(u.metadata);
191
+ return (0, record_set_1.compact)({
192
+ id,
193
+ emails: [{ email, verified: u.email_verified === true, primary: true }],
194
+ first_name: (0, record_set_1.str)(u.first_name),
195
+ last_name: (0, record_set_1.str)(u.last_name),
196
+ image_url: (0, record_set_1.str)(u.profile_picture_url),
197
+ public_metadata: metadata,
198
+ private_metadata: (0, record_set_1.str)(u.external_id) ? { workos_external_id: (0, record_set_1.str)(u.external_id) } : undefined,
199
+ created_at: (0, record_set_1.str)(u.created_at),
200
+ last_sign_in_at: (0, record_set_1.str)(u.last_sign_in_at),
201
+ });
202
+ }
203
+ /** `GoogleOAuth` → `google`, `GitHubOAuth` → `github`: the provider name an Atlas provider key is looked up by. */
204
+ function providerKey(provider) {
205
+ return provider.replace(/OAuth$/i, '').toLowerCase();
206
+ }
207
+ /**
208
+ * The support hash file, by user id, email and external id. Its layout is not
209
+ * published: CSV with a hash column and an id / email column, or NDJSON.
210
+ */
211
+ function indexHashes(text) {
212
+ const t = text.trim();
213
+ const rows = t.startsWith('{') ? t.split(/\r?\n/).filter((l) => l.trim()).map((l) => JSON.parse(l)) : (0, csv_1.parseCsv)(t);
214
+ const out = new Map();
215
+ for (const r of rows) {
216
+ const keys = Object.keys(r);
217
+ const hashKey = keys.find((k) => /hash/i.test(k) && !/type|algo/i.test(k));
218
+ const hash = hashKey ? (0, record_set_1.str)(r[hashKey]) : undefined;
219
+ if (!hash)
220
+ continue;
221
+ for (const k of keys) {
222
+ const v = (0, record_set_1.str)(r[k]);
223
+ if (!v)
224
+ continue;
225
+ if (/^(user_?id|id|external_?id)$/i.test(k))
226
+ out.set(v, hash);
227
+ else if (/^email$/i.test(k))
228
+ out.set(v.toLowerCase(), hash);
229
+ }
230
+ }
231
+ return out;
232
+ }
233
+ /** Every page of a WorkOS list endpoint (`{ data, list_metadata: { after } }`), in a stable order. */
234
+ async function listAll(http, path, params = {}) {
235
+ const out = [];
236
+ let after;
237
+ for (;;) {
238
+ const q = new URLSearchParams({ limit: String(PAGE), order: 'asc', ...params });
239
+ if (after)
240
+ q.set('after', after);
241
+ const body = (await http.get(`${path}?${q.toString()}`)).body;
242
+ out.push(...(0, record_set_1.objs)(body?.data));
243
+ const next = (0, record_set_1.isObj)(body) && (0, record_set_1.isObj)(body.list_metadata) ? (0, record_set_1.str)(body.list_metadata.after) : undefined;
244
+ if (!next || next === after)
245
+ break;
246
+ after = next;
247
+ }
248
+ return out;
249
+ }
250
+ /** A call whose absence (feature off, no permission, unknown path) is not an export failure. */
251
+ async function optional(http, path) {
252
+ try {
253
+ return (await http.get(path)).body;
254
+ }
255
+ catch (err) {
256
+ if (err instanceof vendor_http_1.VendorApiError && [400, 403, 404].includes(err.status))
257
+ return null;
258
+ throw err;
259
+ }
260
+ }
261
+ /** {@link listAll} for an endpoint the environment may not have (feature off, no permission). */
262
+ async function optionalAll(http, path, params = {}) {
263
+ try {
264
+ return await listAll(http, path, params);
265
+ }
266
+ catch (err) {
267
+ if (err instanceof vendor_http_1.VendorApiError && [400, 403, 404].includes(err.status))
268
+ return [];
269
+ throw err;
270
+ }
271
+ }
272
+ //# sourceMappingURL=workos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workos.js","sourceRoot":"","sources":["../../../src/migrate/export/workos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { TranslationResult } from '../framework/plugin';
2
+ import { type ZitadelApiOptions } from './zitadel';
3
+ import { type Obj } from './record-set';
4
+ import { VendorHttp } from './vendor-http';
5
+ /**
6
+ * `atlas migrate zitadel config` — ZITADEL settings → Atlas config.
7
+ *
8
+ * One reader, two sources: ZITADEL's own export document (`zitadel export`, or
9
+ * `POST /admin/v1/export` with passwords and secrets OFF), which carries each
10
+ * organization's policies, projects with their roles, OIDC / API applications,
11
+ * identity providers and actions; plus, through the API, the INSTANCE default
12
+ * policies (login, password complexity, lockout, second factors), which an
13
+ * organization without an override inherits.
14
+ */
15
+ export interface ZitadelPolicies {
16
+ login?: Obj;
17
+ passwordComplexity?: Obj;
18
+ lockout?: Obj;
19
+ secondFactors?: string[];
20
+ multiFactors?: string[];
21
+ }
22
+ export interface ZitadelConfigSnapshot {
23
+ origin: string;
24
+ orgs: Obj[];
25
+ idpTemplates: Obj[];
26
+ /** Instance default policies (live API read only). */
27
+ defaults: ZitadelPolicies;
28
+ /** The instance URL: the bridge issuer and the lazy-migration base URL. */
29
+ instance?: string;
30
+ }
31
+ /** An export document (`{ orgs }`) as a config snapshot; no instance defaults. */
32
+ export declare function configSnapshotFromExport(doc: unknown, origin: string, instance?: string): ZitadelConfigSnapshot;
33
+ /** The instance's default policies, best effort (a narrow role or an old version answers 4xx for some). */
34
+ export declare function fetchZitadelPolicies(http: VendorHttp): Promise<ZitadelPolicies>;
35
+ /** Read the instance through the Admin API (an IAM_OWNER token): the export WITHOUT secrets, plus the default policies. */
36
+ export declare function fetchZitadelConfig(o: Pick<ZitadelApiOptions, 'instance' | 'token' | 'fetchImpl' | 'sleep'>): Promise<ZitadelConfigSnapshot>;
37
+ export declare function translateZitadelConfig(snap: ZitadelConfigSnapshot): TranslationResult;