@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,22 @@
1
+ import type { TranslationResult } from '../framework/plugin';
2
+ import { type Obj } from './record-set';
3
+ import { type StytchProduct } from './stytch';
4
+ import { type VendorHttp } from './vendor-http';
5
+ /**
6
+ * `atlas migrate stytch config` — what Stytch's project API exposes: the RBAC
7
+ * policy (roles, resources and their actions) and, for B2B, the organizations
8
+ * with their SSO connections. Password strength, session duration, OAuth
9
+ * providers, MFA and branding are dashboard-only settings: the report lists
10
+ * each as manual, with where to find it. The bridge and lazy-migration presets
11
+ * are carried to the next step.
12
+ */
13
+ export interface StytchConfigSnapshot {
14
+ projectId: string;
15
+ product: StytchProduct;
16
+ roles: Obj[];
17
+ resources: Obj[];
18
+ organizations: number;
19
+ ssoConnections: number;
20
+ }
21
+ export declare function fetchStytchConfig(http: VendorHttp, projectId: string, product: StytchProduct): Promise<StytchConfigSnapshot>;
22
+ export declare function translateStytchConfig(snap: StytchConfigSnapshot): TranslationResult;
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchStytchConfig = fetchStytchConfig;
4
+ exports.translateStytchConfig = translateStytchConfig;
5
+ const record_set_1 = require("./record-set");
6
+ const stytch_1 = require("./stytch");
7
+ const translate_kit_1 = require("./translate-kit");
8
+ const vendor_http_1 = require("./vendor-http");
9
+ async function optionalGet(http, path) {
10
+ try {
11
+ const body = (await http.get(path)).body;
12
+ return (0, record_set_1.isObj)(body) ? body : null;
13
+ }
14
+ catch (err) {
15
+ if (err instanceof vendor_http_1.VendorApiError && [400, 403, 404].includes(err.status))
16
+ return null;
17
+ throw err;
18
+ }
19
+ }
20
+ async function fetchStytchConfig(http, projectId, product) {
21
+ // The consumer policy endpoint is UNCONFIRMED; a project without it just reports no roles.
22
+ const res = await optionalGet(http, product === 'b2b' ? '/v1/b2b/rbac/policy' : '/v1/rbac/policy');
23
+ const policy = res && (0, record_set_1.isObj)(res.policy) ? res.policy : {};
24
+ let organizations = 0;
25
+ let ssoConnections = 0;
26
+ if (product === 'b2b') {
27
+ try {
28
+ const { body } = await http.post('/v1/b2b/organizations/search', { limit: 1000 });
29
+ const orgs = (0, record_set_1.objs)((0, record_set_1.isObj)(body) ? body.organizations : undefined);
30
+ organizations = orgs.length;
31
+ for (const o of orgs) {
32
+ const id = (0, record_set_1.str)(o.organization_id);
33
+ const sso = id ? await optionalGet(http, `/v1/b2b/sso/${encodeURIComponent(id)}`) : null;
34
+ if (sso)
35
+ ssoConnections += (0, record_set_1.objs)(sso.saml_connections).length + (0, record_set_1.objs)(sso.oidc_connections).length;
36
+ }
37
+ }
38
+ catch (err) {
39
+ if (!(err instanceof vendor_http_1.VendorApiError))
40
+ throw err;
41
+ }
42
+ }
43
+ return { projectId, product, roles: (0, record_set_1.objs)(policy.roles), resources: (0, record_set_1.objs)(policy.resources), organizations, ssoConnections };
44
+ }
45
+ function translateStytchConfig(snap) {
46
+ const b = new translate_kit_1.ConfigBuilder();
47
+ const permissions = new Set();
48
+ for (const r of snap.resources) {
49
+ const resource = (0, record_set_1.str)(r.resource_id);
50
+ if (resource)
51
+ for (const a of (0, record_set_1.strs)(r.actions))
52
+ permissions.add(`${resource}:${a}`);
53
+ }
54
+ let roles = 0;
55
+ for (const r of snap.roles) {
56
+ const id = (0, record_set_1.str)(r.role_id);
57
+ if (!id)
58
+ continue;
59
+ const key = (0, stytch_1.stytchRoleKey)(id);
60
+ const perms = (0, record_set_1.objs)(r.permissions).flatMap((p) => (0, record_set_1.strs)(p.actions).map((a) => `${(0, record_set_1.str)(p.resource_id) ?? '*'}:${a}`));
61
+ for (const p of perms)
62
+ if (!p.startsWith('*:'))
63
+ permissions.add(p);
64
+ // Built-in roles already exist in Atlas as admin and member.
65
+ if (key !== id)
66
+ continue;
67
+ roles++;
68
+ b.roles[id] = key;
69
+ b.push('roles', { key, name: key, description: (0, record_set_1.str)(r.description) ?? '', permissions: perms });
70
+ }
71
+ for (const key of permissions)
72
+ b.push('permissions', { key, name: key, description: '' });
73
+ if (permissions.size)
74
+ b.add('mapped', 'authorization', 'RBAC resources and actions', `${permissions.size} permission(s), keyed resource:action.`, 'permissions');
75
+ if (roles)
76
+ b.add('mapped', 'authorization', 'custom roles', `${roles} role(s); members keep the same role id as their Atlas role key. stytch_admin and stytch_member map to Atlas's admin and member.`, 'roles');
77
+ if (snap.roles.length === 0)
78
+ b.add('manual', 'authorization', 'RBAC policy', 'No RBAC policy was returned; default roles carry over as admin and member.');
79
+ if (snap.ssoConnections)
80
+ b.add('mapped', 'enterprise', `${snap.ssoConnections} SSO connection(s) in ${snap.organizations} organization(s)`, 'Move with the data export as Atlas SSO connections.', 'sso_connections');
81
+ if (snap.product === 'b2b')
82
+ b.add('manual', 'organizations', 'organization MFA policy, allowed auth methods, JIT provisioning', 'Per-organization settings are kept in the exported organization metadata; set the matching policy on each Atlas organization.');
83
+ for (const [setting, where] of [
84
+ ['password strength (zxcvbn / LUDS) and breach check', 'Dashboard → Authentication → Passwords; set Atlas password rules under auth_config.password'],
85
+ ['session duration and JWT lifetime', 'Dashboard → Sessions; set the Atlas session lifetime'],
86
+ ['OAuth providers (client ids and secrets)', 'Dashboard → OAuth; use the same OAuth apps in Atlas so imported accounts relink'],
87
+ ['redirect URLs and authorized domains', 'Dashboard → Redirect URLs, SDK configuration'],
88
+ ['multi-factor authentication (TOTP, SMS)', 'Dashboard → Authentication → MFA'],
89
+ ['email templates, SMS and branding', 'Dashboard → Email templates, Branding'],
90
+ ['custom claims and JWT templates', 'Dashboard → Sessions → JWT templates'],
91
+ ['webhooks', 'Dashboard → Webhooks (create Atlas webhook endpoints)'],
92
+ ]) {
93
+ b.add('manual', 'settings not in the API', setting, `Stytch does not expose this through the project API; copy it from ${where}.`);
94
+ }
95
+ const test = snap.projectId.startsWith('project-test-');
96
+ const vars = { project_id: snap.projectId, ...(test ? { api_host: 'test.stytch.com' } : {}), ...(snap.product === 'b2b' ? { jwks_path: 'b2b/sessions' } : {}) };
97
+ return b.result(`Stytch project ${snap.projectId}`, {
98
+ bridge: { preset: 'stytch', vars },
99
+ lazy: { preset: 'stytch', config: { project_id: snap.projectId, product: snap.product } },
100
+ });
101
+ }
102
+ //# sourceMappingURL=stytch-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stytch-config.js","sourceRoot":"","sources":["../../../src/migrate/export/stytch-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { PasswordHash, UserRecord } from '@atlasauth/migrate';
2
+ import { RecordSet, type Obj } from './record-set';
3
+ import { VendorHttp } from './vendor-http';
4
+ /**
5
+ * `atlas migrate export stytch` — Stytch (consumer and B2B) onto the canonical
6
+ * bundle models, from the Stytch API with the project id and secret (on this
7
+ * machine only).
8
+ *
9
+ * consumer `POST /v1/users/search` (cursor paging, 1000 per page): emails
10
+ * and phone numbers with their verified flags, name, OAuth
11
+ * providers, metadata, roles, lock state.
12
+ * B2B `POST /v1/b2b/organizations/search`, then per organization
13
+ * `POST /v1/b2b/organizations/members/search`, `GET /v1/b2b/sso/{org}`
14
+ * and the RBAC policy (`GET /v1/b2b/rbac/policy`).
15
+ *
16
+ * Stytch members belong to ONE organization each (`member_id` is per
17
+ * organization). Atlas users are people, so members sharing an email become one
18
+ * user: the earliest member's id is the user id (the session JWT `sub` of that
19
+ * member maps to it) and the others' ids are kept in `private_metadata`.
20
+ *
21
+ * Password hashes never leave Stytch through the API: they come from the export
22
+ * Stytch support sends on request (support@stytch.com), given as `--stytch-hashes`
23
+ * (CSV, JSON or NDJSON). Until then the `stytch` lazy-migration preset checks
24
+ * passwords against Stytch on first sign-in. TOTP secrets, passkeys and crypto
25
+ * wallets are not exported.
26
+ */
27
+ export type StytchProduct = 'consumer' | 'b2b';
28
+ export interface StytchExportOptions {
29
+ projectId: string;
30
+ secret: string;
31
+ /** Detected from the project when omitted. */
32
+ product?: StytchProduct;
33
+ /** Override `https://api.stytch.com` (live) / `https://test.stytch.com` (test), e.g. a custom domain. */
34
+ baseUrl?: string;
35
+ /** The support-provided password export (CSV, JSON array or NDJSON text). */
36
+ hashesText?: string;
37
+ fetchImpl?: typeof fetch;
38
+ sleep?: (ms: number) => Promise<void>;
39
+ onProgress?: (message: string) => void;
40
+ }
41
+ /** The API host for a project id: live projects are on api.stytch.com, test projects on test.stytch.com. */
42
+ export declare function stytchBaseUrl(projectId: string): string;
43
+ /** HTTP Basic credentials for the project. */
44
+ export declare function stytchAuthorization(projectId: string, secret: string): string;
45
+ export declare function stytchHttp(o: Pick<StytchExportOptions, 'projectId' | 'secret' | 'baseUrl' | 'fetchImpl' | 'sleep'>): VendorHttp;
46
+ /** Is this a B2B project? Its organization search answers; a consumer project refuses the endpoint. */
47
+ export declare function detectStytchProduct(http: VendorHttp): Promise<StytchProduct>;
48
+ /** Stytch's cursor paging: `results_metadata.next_cursor` until it is null. */
49
+ export declare function stytchSearch(http: VendorHttp, path: string, body: Obj, key: string): Promise<Obj[]>;
50
+ export declare function exportStytch(opts: StytchExportOptions): Promise<RecordSet>;
51
+ /** One Stytch user object → a user record; null with nothing to sign in with. */
52
+ export declare function mapStytchUser(u: Obj): UserRecord | null;
53
+ export declare function stytchRoleKey(roleId: string): string;
54
+ /**
55
+ * Parse the password export Stytch support sends: a JSON array (or an object
56
+ * holding one under `users` / `members` / `results`), NDJSON, or CSV with a
57
+ * header row. Keys are lower-cased; a nested `scrypt_config` etc. is flattened.
58
+ */
59
+ export declare function parseStytchHashes(text: string): Obj[];
60
+ /**
61
+ * One row of the support export → the bundle's password hash. Field names
62
+ * follow Stytch's own password-migration API (`hash`, `hash_type`, and the
63
+ * `scrypt_config` / `pbkdf_2_config` / salt fields), which is the format the
64
+ * export mirrors (UNCONFIRMED: Stytch support documents it per request).
65
+ */
66
+ export declare function stytchPasswordHash(row: Obj): PasswordHash | {
67
+ reason: string;
68
+ };