@atlasauth/cli 0.24.0 → 0.25.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 (530) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/package.json +4 -4
  3. package/dist/args.d.ts +0 -601
  4. package/dist/args.js +0 -289
  5. package/dist/args.js.map +0 -1
  6. package/dist/cli.d.ts +0 -2
  7. package/dist/cli.js +0 -19
  8. package/dist/cli.js.map +0 -1
  9. package/dist/commands/actions-gallery.d.ts +0 -8
  10. package/dist/commands/actions-gallery.js +0 -197
  11. package/dist/commands/actions-gallery.js.map +0 -1
  12. package/dist/commands/actions.d.ts +0 -13
  13. package/dist/commands/actions.js +0 -135
  14. package/dist/commands/actions.js.map +0 -1
  15. package/dist/commands/admin.d.ts +0 -49
  16. package/dist/commands/admin.js +0 -353
  17. package/dist/commands/admin.js.map +0 -1
  18. package/dist/commands/api-keys.d.ts +0 -4
  19. package/dist/commands/api-keys.js +0 -96
  20. package/dist/commands/api-keys.js.map +0 -1
  21. package/dist/commands/auth.d.ts +0 -25
  22. package/dist/commands/auth.js +0 -102
  23. package/dist/commands/auth.js.map +0 -1
  24. package/dist/commands/config.d.ts +0 -104
  25. package/dist/commands/config.js +0 -1506
  26. package/dist/commands/config.js.map +0 -1
  27. package/dist/commands/csp.d.ts +0 -32
  28. package/dist/commands/csp.js +0 -180
  29. package/dist/commands/csp.js.map +0 -1
  30. package/dist/commands/dev.d.ts +0 -8
  31. package/dist/commands/dev.js +0 -84
  32. package/dist/commands/dev.js.map +0 -1
  33. package/dist/commands/fga.d.ts +0 -10
  34. package/dist/commands/fga.js +0 -146
  35. package/dist/commands/fga.js.map +0 -1
  36. package/dist/commands/golive.d.ts +0 -40
  37. package/dist/commands/golive.js +0 -285
  38. package/dist/commands/golive.js.map +0 -1
  39. package/dist/commands/id-accounts.d.ts +0 -13
  40. package/dist/commands/id-accounts.js +0 -195
  41. package/dist/commands/id-accounts.js.map +0 -1
  42. package/dist/commands/import-better-auth.d.ts +0 -3
  43. package/dist/commands/import-better-auth.js +0 -164
  44. package/dist/commands/import-better-auth.js.map +0 -1
  45. package/dist/commands/import.d.ts +0 -3
  46. package/dist/commands/import.js +0 -123
  47. package/dist/commands/import.js.map +0 -1
  48. package/dist/commands/info.d.ts +0 -75
  49. package/dist/commands/info.js +0 -362
  50. package/dist/commands/info.js.map +0 -1
  51. package/dist/commands/init.d.ts +0 -3
  52. package/dist/commands/init.js +0 -438
  53. package/dist/commands/init.js.map +0 -1
  54. package/dist/commands/integrations.d.ts +0 -8
  55. package/dist/commands/integrations.js +0 -112
  56. package/dist/commands/integrations.js.map +0 -1
  57. package/dist/commands/listen.d.ts +0 -17
  58. package/dist/commands/listen.js +0 -223
  59. package/dist/commands/listen.js.map +0 -1
  60. package/dist/commands/mcp.d.ts +0 -38
  61. package/dist/commands/mcp.js +0 -111
  62. package/dist/commands/mcp.js.map +0 -1
  63. package/dist/commands/migrate.d.ts +0 -16
  64. package/dist/commands/migrate.js +0 -114
  65. package/dist/commands/migrate.js.map +0 -1
  66. package/dist/commands/move-origin.d.ts +0 -11
  67. package/dist/commands/move-origin.js +0 -95
  68. package/dist/commands/move-origin.js.map +0 -1
  69. package/dist/commands/operator.d.ts +0 -18
  70. package/dist/commands/operator.js +0 -238
  71. package/dist/commands/operator.js.map +0 -1
  72. package/dist/commands/orgs.d.ts +0 -4
  73. package/dist/commands/orgs.js +0 -72
  74. package/dist/commands/orgs.js.map +0 -1
  75. package/dist/commands/pages.d.ts +0 -14
  76. package/dist/commands/pages.js +0 -113
  77. package/dist/commands/pages.js.map +0 -1
  78. package/dist/commands/partner-platforms.d.ts +0 -10
  79. package/dist/commands/partner-platforms.js +0 -157
  80. package/dist/commands/partner-platforms.js.map +0 -1
  81. package/dist/commands/project-commands.d.ts +0 -38
  82. package/dist/commands/project-commands.js +0 -361
  83. package/dist/commands/project-commands.js.map +0 -1
  84. package/dist/commands/referrals.d.ts +0 -69
  85. package/dist/commands/referrals.js +0 -1056
  86. package/dist/commands/referrals.js.map +0 -1
  87. package/dist/commands/resources.d.ts +0 -44
  88. package/dist/commands/resources.js +0 -234
  89. package/dist/commands/resources.js.map +0 -1
  90. package/dist/commands/sessions.d.ts +0 -4
  91. package/dist/commands/sessions.js +0 -28
  92. package/dist/commands/sessions.js.map +0 -1
  93. package/dist/commands/shared.d.ts +0 -38
  94. package/dist/commands/shared.js +0 -69
  95. package/dist/commands/shared.js.map +0 -1
  96. package/dist/commands/status.d.ts +0 -3
  97. package/dist/commands/status.js +0 -77
  98. package/dist/commands/status.js.map +0 -1
  99. package/dist/commands/users.d.ts +0 -4
  100. package/dist/commands/users.js +0 -100
  101. package/dist/commands/users.js.map +0 -1
  102. package/dist/commands/webhooks.d.ts +0 -34
  103. package/dist/commands/webhooks.js +0 -301
  104. package/dist/commands/webhooks.js.map +0 -1
  105. package/dist/config-http.d.ts +0 -29
  106. package/dist/config-http.js +0 -64
  107. package/dist/config-http.js.map +0 -1
  108. package/dist/config.d.ts +0 -64
  109. package/dist/config.js +0 -69
  110. package/dist/config.js.map +0 -1
  111. package/dist/context.d.ts +0 -72
  112. package/dist/context.js +0 -27
  113. package/dist/context.js.map +0 -1
  114. package/dist/define-config.d.ts +0 -9
  115. package/dist/define-config.js +0 -8
  116. package/dist/define-config.js.map +0 -1
  117. package/dist/errors.d.ts +0 -15
  118. package/dist/errors.js +0 -25
  119. package/dist/errors.js.map +0 -1
  120. package/dist/help.d.ts +0 -8
  121. package/dist/help.js +0 -868
  122. package/dist/help.js.map +0 -1
  123. package/dist/import/csv.d.ts +0 -6
  124. package/dist/import/csv.js +0 -63
  125. package/dist/import/csv.js.map +0 -1
  126. package/dist/import/vendors.d.ts +0 -57
  127. package/dist/import/vendors.js +0 -568
  128. package/dist/import/vendors.js.map +0 -1
  129. package/dist/index.d.ts +0 -33
  130. package/dist/index.js +0 -81
  131. package/dist/index.js.map +0 -1
  132. package/dist/io.d.ts +0 -21
  133. package/dist/io.js +0 -28
  134. package/dist/io.js.map +0 -1
  135. package/dist/migrate/appwrite/plugin.d.ts +0 -2
  136. package/dist/migrate/appwrite/plugin.js +0 -103
  137. package/dist/migrate/appwrite/plugin.js.map +0 -1
  138. package/dist/migrate/auth0/plugin.d.ts +0 -2
  139. package/dist/migrate/auth0/plugin.js +0 -126
  140. package/dist/migrate/auth0/plugin.js.map +0 -1
  141. package/dist/migrate/authentik/plugin.d.ts +0 -2
  142. package/dist/migrate/authentik/plugin.js +0 -135
  143. package/dist/migrate/authentik/plugin.js.map +0 -1
  144. package/dist/migrate/azure-ad-b2c/plugin.d.ts +0 -8
  145. package/dist/migrate/azure-ad-b2c/plugin.js +0 -165
  146. package/dist/migrate/azure-ad-b2c/plugin.js.map +0 -1
  147. package/dist/migrate/better-auth/integration.d.ts +0 -59
  148. package/dist/migrate/better-auth/integration.js +0 -81
  149. package/dist/migrate/better-auth/integration.js.map +0 -1
  150. package/dist/migrate/better-auth/orchestrator.d.ts +0 -43
  151. package/dist/migrate/better-auth/orchestrator.js +0 -525
  152. package/dist/migrate/better-auth/orchestrator.js.map +0 -1
  153. package/dist/migrate/better-auth/output.d.ts +0 -20
  154. package/dist/migrate/better-auth/output.js +0 -146
  155. package/dist/migrate/better-auth/output.js.map +0 -1
  156. package/dist/migrate/better-auth/translate.d.ts +0 -77
  157. package/dist/migrate/better-auth/translate.js +0 -1989
  158. package/dist/migrate/better-auth/translate.js.map +0 -1
  159. package/dist/migrate/clerk/plugin.d.ts +0 -2
  160. package/dist/migrate/clerk/plugin.js +0 -76
  161. package/dist/migrate/clerk/plugin.js.map +0 -1
  162. package/dist/migrate/cognito/plugin.d.ts +0 -5
  163. package/dist/migrate/cognito/plugin.js +0 -170
  164. package/dist/migrate/cognito/plugin.js.map +0 -1
  165. package/dist/migrate/corbado/plugin.d.ts +0 -2
  166. package/dist/migrate/corbado/plugin.js +0 -63
  167. package/dist/migrate/corbado/plugin.js.map +0 -1
  168. package/dist/migrate/descope/plugin.d.ts +0 -2
  169. package/dist/migrate/descope/plugin.js +0 -83
  170. package/dist/migrate/descope/plugin.js.map +0 -1
  171. package/dist/migrate/entra-external-id/plugin.d.ts +0 -8
  172. package/dist/migrate/entra-external-id/plugin.js +0 -12
  173. package/dist/migrate/entra-external-id/plugin.js.map +0 -1
  174. package/dist/migrate/export/appwrite-config.d.ts +0 -28
  175. package/dist/migrate/export/appwrite-config.js +0 -170
  176. package/dist/migrate/export/appwrite-config.js.map +0 -1
  177. package/dist/migrate/export/appwrite.d.ts +0 -51
  178. package/dist/migrate/export/appwrite.js +0 -288
  179. package/dist/migrate/export/appwrite.js.map +0 -1
  180. package/dist/migrate/export/auth0-config.d.ts +0 -29
  181. package/dist/migrate/export/auth0-config.js +0 -249
  182. package/dist/migrate/export/auth0-config.js.map +0 -1
  183. package/dist/migrate/export/auth0.d.ts +0 -62
  184. package/dist/migrate/export/auth0.js +0 -575
  185. package/dist/migrate/export/auth0.js.map +0 -1
  186. package/dist/migrate/export/authentik-config.d.ts +0 -45
  187. package/dist/migrate/export/authentik-config.js +0 -357
  188. package/dist/migrate/export/authentik-config.js.map +0 -1
  189. package/dist/migrate/export/authentik.d.ts +0 -110
  190. package/dist/migrate/export/authentik.js +0 -838
  191. package/dist/migrate/export/authentik.js.map +0 -1
  192. package/dist/migrate/export/azure-config.d.ts +0 -58
  193. package/dist/migrate/export/azure-config.js +0 -344
  194. package/dist/migrate/export/azure-config.js.map +0 -1
  195. package/dist/migrate/export/azure.d.ts +0 -85
  196. package/dist/migrate/export/azure.js +0 -373
  197. package/dist/migrate/export/azure.js.map +0 -1
  198. package/dist/migrate/export/clerk-config.d.ts +0 -26
  199. package/dist/migrate/export/clerk-config.js +0 -227
  200. package/dist/migrate/export/clerk-config.js.map +0 -1
  201. package/dist/migrate/export/clerk.d.ts +0 -46
  202. package/dist/migrate/export/clerk.js +0 -486
  203. package/dist/migrate/export/clerk.js.map +0 -1
  204. package/dist/migrate/export/cognito-config.d.ts +0 -25
  205. package/dist/migrate/export/cognito-config.js +0 -273
  206. package/dist/migrate/export/cognito-config.js.map +0 -1
  207. package/dist/migrate/export/cognito.d.ts +0 -103
  208. package/dist/migrate/export/cognito.js +0 -441
  209. package/dist/migrate/export/cognito.js.map +0 -1
  210. package/dist/migrate/export/corbado-config.d.ts +0 -20
  211. package/dist/migrate/export/corbado-config.js +0 -63
  212. package/dist/migrate/export/corbado-config.js.map +0 -1
  213. package/dist/migrate/export/corbado.d.ts +0 -37
  214. package/dist/migrate/export/corbado.js +0 -132
  215. package/dist/migrate/export/corbado.js.map +0 -1
  216. package/dist/migrate/export/descope.d.ts +0 -35
  217. package/dist/migrate/export/descope.js +0 -208
  218. package/dist/migrate/export/descope.js.map +0 -1
  219. package/dist/migrate/export/fake-vendor.test-helper.d.ts +0 -27
  220. package/dist/migrate/export/fake-vendor.test-helper.js +0 -41
  221. package/dist/migrate/export/fake-vendor.test-helper.js.map +0 -1
  222. package/dist/migrate/export/firebase-config.d.ts +0 -24
  223. package/dist/migrate/export/firebase-config.js +0 -215
  224. package/dist/migrate/export/firebase-config.js.map +0 -1
  225. package/dist/migrate/export/firebase.d.ts +0 -102
  226. package/dist/migrate/export/firebase.js +0 -464
  227. package/dist/migrate/export/firebase.js.map +0 -1
  228. package/dist/migrate/export/frameworks/app-users.d.ts +0 -42
  229. package/dist/migrate/export/frameworks/app-users.js +0 -161
  230. package/dist/migrate/export/frameworks/app-users.js.map +0 -1
  231. package/dist/migrate/export/frameworks/authjs.d.ts +0 -41
  232. package/dist/migrate/export/frameworks/authjs.js +0 -146
  233. package/dist/migrate/export/frameworks/authjs.js.map +0 -1
  234. package/dist/migrate/export/frameworks/devise.d.ts +0 -39
  235. package/dist/migrate/export/frameworks/devise.js +0 -218
  236. package/dist/migrate/export/frameworks/devise.js.map +0 -1
  237. package/dist/migrate/export/frameworks/django.d.ts +0 -45
  238. package/dist/migrate/export/frameworks/django.js +0 -315
  239. package/dist/migrate/export/frameworks/django.js.map +0 -1
  240. package/dist/migrate/export/frameworks/lucia.d.ts +0 -42
  241. package/dist/migrate/export/frameworks/lucia.js +0 -263
  242. package/dist/migrate/export/frameworks/lucia.js.map +0 -1
  243. package/dist/migrate/export/frameworks/tables.d.ts +0 -90
  244. package/dist/migrate/export/frameworks/tables.js +0 -325
  245. package/dist/migrate/export/frameworks/tables.js.map +0 -1
  246. package/dist/migrate/export/frameworks/webauthn.d.ts +0 -25
  247. package/dist/migrate/export/frameworks/webauthn.js +0 -130
  248. package/dist/migrate/export/frameworks/webauthn.js.map +0 -1
  249. package/dist/migrate/export/frontegg-config.d.ts +0 -29
  250. package/dist/migrate/export/frontegg-config.js +0 -238
  251. package/dist/migrate/export/frontegg-config.js.map +0 -1
  252. package/dist/migrate/export/frontegg.d.ts +0 -67
  253. package/dist/migrate/export/frontegg.js +0 -410
  254. package/dist/migrate/export/frontegg.js.map +0 -1
  255. package/dist/migrate/export/fusionauth-config.d.ts +0 -26
  256. package/dist/migrate/export/fusionauth-config.js +0 -226
  257. package/dist/migrate/export/fusionauth-config.js.map +0 -1
  258. package/dist/migrate/export/fusionauth.d.ts +0 -99
  259. package/dist/migrate/export/fusionauth.js +0 -642
  260. package/dist/migrate/export/fusionauth.js.map +0 -1
  261. package/dist/migrate/export/hanko-config.d.ts +0 -27
  262. package/dist/migrate/export/hanko-config.js +0 -265
  263. package/dist/migrate/export/hanko-config.js.map +0 -1
  264. package/dist/migrate/export/hanko.d.ts +0 -52
  265. package/dist/migrate/export/hanko.js +0 -605
  266. package/dist/migrate/export/hanko.js.map +0 -1
  267. package/dist/migrate/export/keycloak-config.d.ts +0 -19
  268. package/dist/migrate/export/keycloak-config.js +0 -219
  269. package/dist/migrate/export/keycloak-config.js.map +0 -1
  270. package/dist/migrate/export/keycloak.d.ts +0 -155
  271. package/dist/migrate/export/keycloak.js +0 -878
  272. package/dist/migrate/export/keycloak.js.map +0 -1
  273. package/dist/migrate/export/kinde-descope-config.d.ts +0 -38
  274. package/dist/migrate/export/kinde-descope-config.js +0 -172
  275. package/dist/migrate/export/kinde-descope-config.js.map +0 -1
  276. package/dist/migrate/export/kinde.d.ts +0 -57
  277. package/dist/migrate/export/kinde.js +0 -333
  278. package/dist/migrate/export/kinde.js.map +0 -1
  279. package/dist/migrate/export/ldap.d.ts +0 -53
  280. package/dist/migrate/export/ldap.js +0 -277
  281. package/dist/migrate/export/ldap.js.map +0 -1
  282. package/dist/migrate/export/logto-config.d.ts +0 -27
  283. package/dist/migrate/export/logto-config.js +0 -264
  284. package/dist/migrate/export/logto-config.js.map +0 -1
  285. package/dist/migrate/export/logto.d.ts +0 -150
  286. package/dist/migrate/export/logto.js +0 -809
  287. package/dist/migrate/export/logto.js.map +0 -1
  288. package/dist/migrate/export/magic-config.d.ts +0 -14
  289. package/dist/migrate/export/magic-config.js +0 -28
  290. package/dist/migrate/export/magic-config.js.map +0 -1
  291. package/dist/migrate/export/magic.d.ts +0 -31
  292. package/dist/migrate/export/magic.js +0 -93
  293. package/dist/migrate/export/magic.js.map +0 -1
  294. package/dist/migrate/export/mini-yaml.d.ts +0 -19
  295. package/dist/migrate/export/mini-yaml.js +0 -581
  296. package/dist/migrate/export/mini-yaml.js.map +0 -1
  297. package/dist/migrate/export/nhost-config.d.ts +0 -26
  298. package/dist/migrate/export/nhost-config.js +0 -360
  299. package/dist/migrate/export/nhost-config.js.map +0 -1
  300. package/dist/migrate/export/nhost.d.ts +0 -64
  301. package/dist/migrate/export/nhost.js +0 -304
  302. package/dist/migrate/export/nhost.js.map +0 -1
  303. package/dist/migrate/export/okta-config.d.ts +0 -30
  304. package/dist/migrate/export/okta-config.js +0 -205
  305. package/dist/migrate/export/okta-config.js.map +0 -1
  306. package/dist/migrate/export/okta.d.ts +0 -43
  307. package/dist/migrate/export/okta.js +0 -337
  308. package/dist/migrate/export/okta.js.map +0 -1
  309. package/dist/migrate/export/onelogin.d.ts +0 -22
  310. package/dist/migrate/export/onelogin.js +0 -123
  311. package/dist/migrate/export/onelogin.js.map +0 -1
  312. package/dist/migrate/export/ory-config.d.ts +0 -58
  313. package/dist/migrate/export/ory-config.js +0 -451
  314. package/dist/migrate/export/ory-config.js.map +0 -1
  315. package/dist/migrate/export/ory.d.ts +0 -81
  316. package/dist/migrate/export/ory.js +0 -555
  317. package/dist/migrate/export/ory.js.map +0 -1
  318. package/dist/migrate/export/password-detect.d.ts +0 -29
  319. package/dist/migrate/export/password-detect.js +0 -81
  320. package/dist/migrate/export/password-detect.js.map +0 -1
  321. package/dist/migrate/export/pingone.d.ts +0 -36
  322. package/dist/migrate/export/pingone.js +0 -218
  323. package/dist/migrate/export/pingone.js.map +0 -1
  324. package/dist/migrate/export/plugin-kit.d.ts +0 -25
  325. package/dist/migrate/export/plugin-kit.js +0 -82
  326. package/dist/migrate/export/plugin-kit.js.map +0 -1
  327. package/dist/migrate/export/pocketbase-config.d.ts +0 -28
  328. package/dist/migrate/export/pocketbase-config.js +0 -180
  329. package/dist/migrate/export/pocketbase-config.js.map +0 -1
  330. package/dist/migrate/export/pocketbase.d.ts +0 -52
  331. package/dist/migrate/export/pocketbase.js +0 -243
  332. package/dist/migrate/export/pocketbase.js.map +0 -1
  333. package/dist/migrate/export/project-files.d.ts +0 -15
  334. package/dist/migrate/export/project-files.js +0 -43
  335. package/dist/migrate/export/project-files.js.map +0 -1
  336. package/dist/migrate/export/propelauth-config.d.ts +0 -18
  337. package/dist/migrate/export/propelauth-config.js +0 -58
  338. package/dist/migrate/export/propelauth-config.js.map +0 -1
  339. package/dist/migrate/export/propelauth-harness.test-helper.d.ts +0 -62
  340. package/dist/migrate/export/propelauth-harness.test-helper.js +0 -109
  341. package/dist/migrate/export/propelauth-harness.test-helper.js.map +0 -1
  342. package/dist/migrate/export/propelauth.d.ts +0 -48
  343. package/dist/migrate/export/propelauth.js +0 -255
  344. package/dist/migrate/export/propelauth.js.map +0 -1
  345. package/dist/migrate/export/record-set.d.ts +0 -44
  346. package/dist/migrate/export/record-set.js +0 -98
  347. package/dist/migrate/export/record-set.js.map +0 -1
  348. package/dist/migrate/export/source-lines.d.ts +0 -17
  349. package/dist/migrate/export/source-lines.js +0 -43
  350. package/dist/migrate/export/source-lines.js.map +0 -1
  351. package/dist/migrate/export/sso-metadata.d.ts +0 -47
  352. package/dist/migrate/export/sso-metadata.js +0 -180
  353. package/dist/migrate/export/sso-metadata.js.map +0 -1
  354. package/dist/migrate/export/stytch-config.d.ts +0 -22
  355. package/dist/migrate/export/stytch-config.js +0 -102
  356. package/dist/migrate/export/stytch-config.js.map +0 -1
  357. package/dist/migrate/export/stytch.d.ts +0 -68
  358. package/dist/migrate/export/stytch.js +0 -510
  359. package/dist/migrate/export/stytch.js.map +0 -1
  360. package/dist/migrate/export/supabase-config.d.ts +0 -48
  361. package/dist/migrate/export/supabase-config.js +0 -408
  362. package/dist/migrate/export/supabase-config.js.map +0 -1
  363. package/dist/migrate/export/supabase.d.ts +0 -86
  364. package/dist/migrate/export/supabase.js +0 -524
  365. package/dist/migrate/export/supabase.js.map +0 -1
  366. package/dist/migrate/export/supertokens-config.d.ts +0 -20
  367. package/dist/migrate/export/supertokens-config.js +0 -150
  368. package/dist/migrate/export/supertokens-config.js.map +0 -1
  369. package/dist/migrate/export/supertokens.d.ts +0 -125
  370. package/dist/migrate/export/supertokens.js +0 -464
  371. package/dist/migrate/export/supertokens.js.map +0 -1
  372. package/dist/migrate/export/table.d.ts +0 -35
  373. package/dist/migrate/export/table.js +0 -248
  374. package/dist/migrate/export/table.js.map +0 -1
  375. package/dist/migrate/export/translate-kit.d.ts +0 -46
  376. package/dist/migrate/export/translate-kit.js +0 -148
  377. package/dist/migrate/export/translate-kit.js.map +0 -1
  378. package/dist/migrate/export/userfront-config.d.ts +0 -15
  379. package/dist/migrate/export/userfront-config.js +0 -49
  380. package/dist/migrate/export/userfront-config.js.map +0 -1
  381. package/dist/migrate/export/userfront.d.ts +0 -38
  382. package/dist/migrate/export/userfront.js +0 -189
  383. package/dist/migrate/export/userfront.js.map +0 -1
  384. package/dist/migrate/export/vendor-http.d.ts +0 -46
  385. package/dist/migrate/export/vendor-http.js +0 -138
  386. package/dist/migrate/export/vendor-http.js.map +0 -1
  387. package/dist/migrate/export/workos-config.d.ts +0 -23
  388. package/dist/migrate/export/workos-config.js +0 -125
  389. package/dist/migrate/export/workos-config.js.map +0 -1
  390. package/dist/migrate/export/workos.d.ts +0 -46
  391. package/dist/migrate/export/workos.js +0 -272
  392. package/dist/migrate/export/workos.js.map +0 -1
  393. package/dist/migrate/export/zip.d.ts +0 -8
  394. package/dist/migrate/export/zip.js +0 -66
  395. package/dist/migrate/export/zip.js.map +0 -1
  396. package/dist/migrate/export/zitadel-config.d.ts +0 -37
  397. package/dist/migrate/export/zitadel-config.js +0 -279
  398. package/dist/migrate/export/zitadel-config.js.map +0 -1
  399. package/dist/migrate/export/zitadel.d.ts +0 -82
  400. package/dist/migrate/export/zitadel.js +0 -447
  401. package/dist/migrate/export/zitadel.js.map +0 -1
  402. package/dist/migrate/firebase/plugin.d.ts +0 -2
  403. package/dist/migrate/firebase/plugin.js +0 -152
  404. package/dist/migrate/firebase/plugin.js.map +0 -1
  405. package/dist/migrate/framework/builtins.d.ts +0 -2
  406. package/dist/migrate/framework/builtins.js +0 -52
  407. package/dist/migrate/framework/builtins.js.map +0 -1
  408. package/dist/migrate/framework/commands.d.ts +0 -20
  409. package/dist/migrate/framework/commands.js +0 -58
  410. package/dist/migrate/framework/commands.js.map +0 -1
  411. package/dist/migrate/framework/custom.d.ts +0 -12
  412. package/dist/migrate/framework/custom.js +0 -96
  413. package/dist/migrate/framework/custom.js.map +0 -1
  414. package/dist/migrate/framework/orchestrator.d.ts +0 -113
  415. package/dist/migrate/framework/orchestrator.js +0 -532
  416. package/dist/migrate/framework/orchestrator.js.map +0 -1
  417. package/dist/migrate/framework/plugin.d.ts +0 -167
  418. package/dist/migrate/framework/plugin.js +0 -3
  419. package/dist/migrate/framework/plugin.js.map +0 -1
  420. package/dist/migrate/framework/registry.d.ts +0 -11
  421. package/dist/migrate/framework/registry.js +0 -44
  422. package/dist/migrate/framework/registry.js.map +0 -1
  423. package/dist/migrate/framework/report.d.ts +0 -17
  424. package/dist/migrate/framework/report.js +0 -103
  425. package/dist/migrate/framework/report.js.map +0 -1
  426. package/dist/migrate/frameworks/plugins.d.ts +0 -29
  427. package/dist/migrate/frameworks/plugins.js +0 -402
  428. package/dist/migrate/frameworks/plugins.js.map +0 -1
  429. package/dist/migrate/frameworks/report.d.ts +0 -92
  430. package/dist/migrate/frameworks/report.js +0 -207
  431. package/dist/migrate/frameworks/report.js.map +0 -1
  432. package/dist/migrate/frameworks/translate-js.d.ts +0 -5
  433. package/dist/migrate/frameworks/translate-js.js +0 -503
  434. package/dist/migrate/frameworks/translate-js.js.map +0 -1
  435. package/dist/migrate/frameworks/translate-rails-django.d.ts +0 -3
  436. package/dist/migrate/frameworks/translate-rails-django.js +0 -1391
  437. package/dist/migrate/frameworks/translate-rails-django.js.map +0 -1
  438. package/dist/migrate/frontegg/plugin.d.ts +0 -2
  439. package/dist/migrate/frontegg/plugin.js +0 -78
  440. package/dist/migrate/frontegg/plugin.js.map +0 -1
  441. package/dist/migrate/fusionauth/plugin.d.ts +0 -2
  442. package/dist/migrate/fusionauth/plugin.js +0 -109
  443. package/dist/migrate/fusionauth/plugin.js.map +0 -1
  444. package/dist/migrate/hanko/plugin.d.ts +0 -2
  445. package/dist/migrate/hanko/plugin.js +0 -100
  446. package/dist/migrate/hanko/plugin.js.map +0 -1
  447. package/dist/migrate/keycloak/plugin.d.ts +0 -2
  448. package/dist/migrate/keycloak/plugin.js +0 -148
  449. package/dist/migrate/keycloak/plugin.js.map +0 -1
  450. package/dist/migrate/kinde/plugin.d.ts +0 -2
  451. package/dist/migrate/kinde/plugin.js +0 -105
  452. package/dist/migrate/kinde/plugin.js.map +0 -1
  453. package/dist/migrate/ldap/plugin.d.ts +0 -2
  454. package/dist/migrate/ldap/plugin.js +0 -73
  455. package/dist/migrate/ldap/plugin.js.map +0 -1
  456. package/dist/migrate/logto/plugin.d.ts +0 -2
  457. package/dist/migrate/logto/plugin.js +0 -131
  458. package/dist/migrate/logto/plugin.js.map +0 -1
  459. package/dist/migrate/magic/plugin.d.ts +0 -2
  460. package/dist/migrate/magic/plugin.js +0 -56
  461. package/dist/migrate/magic/plugin.js.map +0 -1
  462. package/dist/migrate/nhost/plugin.d.ts +0 -2
  463. package/dist/migrate/nhost/plugin.js +0 -115
  464. package/dist/migrate/nhost/plugin.js.map +0 -1
  465. package/dist/migrate/oidc/plugin.d.ts +0 -2
  466. package/dist/migrate/oidc/plugin.js +0 -73
  467. package/dist/migrate/oidc/plugin.js.map +0 -1
  468. package/dist/migrate/okta/plugin.d.ts +0 -2
  469. package/dist/migrate/okta/plugin.js +0 -105
  470. package/dist/migrate/okta/plugin.js.map +0 -1
  471. package/dist/migrate/onelogin/plugin.d.ts +0 -2
  472. package/dist/migrate/onelogin/plugin.js +0 -61
  473. package/dist/migrate/onelogin/plugin.js.map +0 -1
  474. package/dist/migrate/ory/plugin.d.ts +0 -2
  475. package/dist/migrate/ory/plugin.js +0 -186
  476. package/dist/migrate/ory/plugin.js.map +0 -1
  477. package/dist/migrate/ping-identity/plugin.d.ts +0 -2
  478. package/dist/migrate/ping-identity/plugin.js +0 -100
  479. package/dist/migrate/ping-identity/plugin.js.map +0 -1
  480. package/dist/migrate/pocketbase/plugin.d.ts +0 -2
  481. package/dist/migrate/pocketbase/plugin.js +0 -99
  482. package/dist/migrate/pocketbase/plugin.js.map +0 -1
  483. package/dist/migrate/propelauth/plugin.d.ts +0 -2
  484. package/dist/migrate/propelauth/plugin.js +0 -65
  485. package/dist/migrate/propelauth/plugin.js.map +0 -1
  486. package/dist/migrate/saml/plugin.d.ts +0 -2
  487. package/dist/migrate/saml/plugin.js +0 -79
  488. package/dist/migrate/saml/plugin.js.map +0 -1
  489. package/dist/migrate/stytch/plugin.d.ts +0 -2
  490. package/dist/migrate/stytch/plugin.js +0 -97
  491. package/dist/migrate/stytch/plugin.js.map +0 -1
  492. package/dist/migrate/supabase/plugin.d.ts +0 -2
  493. package/dist/migrate/supabase/plugin.js +0 -149
  494. package/dist/migrate/supabase/plugin.js.map +0 -1
  495. package/dist/migrate/supertokens/plugin.d.ts +0 -2
  496. package/dist/migrate/supertokens/plugin.js +0 -114
  497. package/dist/migrate/supertokens/plugin.js.map +0 -1
  498. package/dist/migrate/user-table/plugin.d.ts +0 -2
  499. package/dist/migrate/user-table/plugin.js +0 -62
  500. package/dist/migrate/user-table/plugin.js.map +0 -1
  501. package/dist/migrate/userfront/plugin.d.ts +0 -2
  502. package/dist/migrate/userfront/plugin.js +0 -60
  503. package/dist/migrate/userfront/plugin.js.map +0 -1
  504. package/dist/migrate/workos/plugin.d.ts +0 -2
  505. package/dist/migrate/workos/plugin.js +0 -81
  506. package/dist/migrate/workos/plugin.js.map +0 -1
  507. package/dist/migrate/zitadel/plugin.d.ts +0 -2
  508. package/dist/migrate/zitadel/plugin.js +0 -114
  509. package/dist/migrate/zitadel/plugin.js.map +0 -1
  510. package/dist/output.d.ts +0 -41
  511. package/dist/output.js +0 -72
  512. package/dist/output.js.map +0 -1
  513. package/dist/project.d.ts +0 -64
  514. package/dist/project.js +0 -86
  515. package/dist/project.js.map +0 -1
  516. package/dist/prompt.d.ts +0 -15
  517. package/dist/prompt.js +0 -46
  518. package/dist/prompt.js.map +0 -1
  519. package/dist/run.d.ts +0 -12
  520. package/dist/run.js +0 -157
  521. package/dist/run.js.map +0 -1
  522. package/dist/secrets.d.ts +0 -41
  523. package/dist/secrets.js +0 -142
  524. package/dist/secrets.js.map +0 -1
  525. package/dist/serialize.d.ts +0 -30
  526. package/dist/serialize.js +0 -131
  527. package/dist/serialize.js.map +0 -1
  528. package/dist/version.d.ts +0 -7
  529. package/dist/version.js +0 -21
  530. package/dist/version.js.map +0 -1
@@ -1,809 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.exportLogto = exportLogto;
4
- exports.normalizeEndpoint = normalizeEndpoint;
5
- exports.tenantOfEndpoint = tenantOfEndpoint;
6
- exports.managementResource = managementResource;
7
- exports.logtoRow = logtoRow;
8
- exports.tenantRows = tenantRows;
9
- exports.snapshotFromTables = snapshotFromTables;
10
- exports.logtoManagementHttp = logtoManagementHttp;
11
- exports.fetchLogtoSnapshot = fetchLogtoSnapshot;
12
- exports.parseLegacyExpression = parseLegacyExpression;
13
- exports.mapLogtoPassword = mapLogtoPassword;
14
- exports.mapLogtoUser = mapLogtoUser;
15
- exports.buildLogtoRecordSet = buildLogtoRecordSet;
16
- const tables_1 = require("./frameworks/tables");
17
- const record_set_1 = require("./record-set");
18
- const translate_kit_1 = require("./translate-kit");
19
- const vendor_http_1 = require("./vendor-http");
20
- /** Logto user columns the user record carries itself (the rest of `profile` lands in metadata). */
21
- const NAME_KEYS = new Set(['givenName', 'familyName']);
22
- /** The Management API's page size cap. */
23
- const PAGE = 100;
24
- /** TOTP as Logto runs it (otplib authenticator defaults). */
25
- const TOTP = { algorithm: 'SHA1', digits: 6, period: 30 };
26
- async function exportLogto(opts) {
27
- const progress = opts.onProgress ?? (() => undefined);
28
- const endpoint = opts.endpoint ? normalizeEndpoint(opts.endpoint) : undefined;
29
- // A dump names its tenant (`default` when self-hosted); the API's is in a Cloud endpoint.
30
- const tenantId = opts.tenantId ?? (!opts.tables && endpoint ? tenantOfEndpoint(endpoint) : null) ?? 'default';
31
- let snap;
32
- if (opts.tables) {
33
- progress('database dump');
34
- snap = snapshotFromTables(opts.tables, tenantId);
35
- // The public signing keys, when the endpoint is known (never from the dump: logto_configs holds the PRIVATE keys).
36
- if (endpoint)
37
- snap.jwks = await readJwks(new vendor_http_1.VendorHttp({ vendor: 'Logto', baseUrl: endpoint, fetchImpl: opts.fetchImpl, sleep: opts.sleep, attempts: 2 })).catch(() => []);
38
- }
39
- else {
40
- if (!endpoint)
41
- throw new Error('Logto export needs a database dump (--set logto-dump=<dir>) or the Logto endpoint and a machine-to-machine app for the Management API.');
42
- if (!opts.m2m)
43
- throw new Error('The Logto Management API needs a machine-to-machine app id and secret (LOGTO_M2M_APP_ID / LOGTO_M2M_APP_SECRET).');
44
- snap = await fetchLogtoSnapshot({ ...opts, endpoint, m2m: opts.m2m, tenantId, onProgress: progress });
45
- }
46
- return buildLogtoRecordSet(snap, { endpoint, tenantId, rpId: opts.rpId ?? (endpoint ? new URL(endpoint).hostname : undefined) });
47
- }
48
- /** `https://auth.example.com/` → `https://auth.example.com` (https only, no path). */
49
- function normalizeEndpoint(raw) {
50
- const withScheme = /^https?:\/\//.test(raw.trim()) ? raw.trim() : `https://${raw.trim()}`;
51
- const url = new URL(withScheme);
52
- if (url.protocol !== 'https:' && url.hostname !== 'localhost')
53
- throw new Error(`The Logto endpoint must be https: ${raw}`);
54
- return `${url.protocol}//${url.host}`;
55
- }
56
- /** The Cloud tenant id of `https://abc123.logto.app`, or null for any other host. */
57
- function tenantOfEndpoint(endpoint) {
58
- const m = /^https:\/\/([a-z0-9]+)\.logto\.app$/.exec(endpoint);
59
- return m ? m[1] : null;
60
- }
61
- /** The Management API resource indicator of a tenant. */
62
- function managementResource(tenantId) {
63
- return `https://${tenantId}.logto.app/api`;
64
- }
65
- // ── database dump ───────────────────────────────────────────────────────────
66
- /** JSONB columns (camelCase): a CSV dump carries them as JSON text. */
67
- const JSON_KEYS = new Set([
68
- 'profile',
69
- 'identities',
70
- 'customData',
71
- 'logtoConfig',
72
- 'mfaVerifications',
73
- 'config',
74
- 'domains',
75
- 'branding',
76
- 'color',
77
- 'metadata',
78
- 'detail',
79
- 'oidcClientMetadata',
80
- 'customClientMetadata',
81
- 'protectedAppMetadata',
82
- 'signIn',
83
- 'signUp',
84
- 'socialSignIn',
85
- 'socialSignInConnectorTargets',
86
- 'passwordPolicy',
87
- 'mfa',
88
- 'adaptiveMfa',
89
- 'trustedDevice',
90
- 'languageInfo',
91
- 'customContent',
92
- 'captchaPolicy',
93
- 'sentinelPolicy',
94
- 'emailBlocklistPolicy',
95
- 'verificationCodePolicy',
96
- 'forgotPasswordMethods',
97
- 'passkeySignIn',
98
- 'signUpProfileFields',
99
- 'passwordExpiration',
100
- 'usernamePolicy',
101
- ]);
102
- /** A database row as the Management API would spell it: camelCase keys, JSONB parsed. */
103
- function logtoRow(row) {
104
- const out = {};
105
- for (const [k, v] of Object.entries(row)) {
106
- const key = k.replace(/_([a-z0-9])/g, (_, c) => c.toUpperCase());
107
- out[key] = JSON_KEYS.has(key) && typeof v === 'string' ? parseJson(v) : v;
108
- }
109
- return out;
110
- }
111
- function parseJson(v) {
112
- const t = v.trim();
113
- if (!t)
114
- return undefined;
115
- try {
116
- return JSON.parse(t);
117
- }
118
- catch {
119
- return v;
120
- }
121
- }
122
- /** One table's rows of one tenant (a dump made with `where tenant_id = …` has every row already). */
123
- function tenantRows(tables, name, tenantId) {
124
- return tables
125
- .rows(name)
126
- .filter((r) => {
127
- const t = (0, tables_1.text)((0, tables_1.col)(r, 'tenant_id', 'tenantId'));
128
- return t === undefined || t === tenantId;
129
- })
130
- .map(logtoRow);
131
- }
132
- function group(rows, key, value) {
133
- const out = new Map();
134
- for (const r of rows) {
135
- const k = (0, record_set_1.str)(r[key]);
136
- const v = (0, record_set_1.str)(r[value]);
137
- if (!k || !v)
138
- continue;
139
- out.set(k, [...(out.get(k) ?? []), v]);
140
- }
141
- return out;
142
- }
143
- function snapshotFromTables(tables, tenantId) {
144
- const t = (name) => tenantRows(tables, name, tenantId);
145
- const roles = t('roles').filter((r) => (0, record_set_1.str)(r.type) !== 'MachineToMachine');
146
- const roleIds = new Set(roles.map((r) => (0, record_set_1.str)(r.id)).filter((x) => !!x));
147
- const scopeName = new Map(t('scopes').map((s) => [(0, record_set_1.str)(s.id) ?? '', (0, record_set_1.str)(s.name) ?? '']));
148
- const orgScopeName = new Map(t('organization_scopes').map((s) => [(0, record_set_1.str)(s.id) ?? '', (0, record_set_1.str)(s.name) ?? '']));
149
- const named = (ids, names) => (ids ?? []).map((id) => names.get(id)).filter((n) => !!n);
150
- const rolePermissions = new Map();
151
- for (const [roleId, scopeIds] of group(t('roles_scopes'), 'roleId', 'scopeId'))
152
- rolePermissions.set(roleId, named(scopeIds, scopeName));
153
- const userRoles = new Map();
154
- for (const [userId, ids] of group(t('users_roles'), 'userId', 'roleId'))
155
- userRoles.set(userId, ids.filter((id) => roleIds.has(id)));
156
- const organizationRoles = t('organization_roles').filter((r) => (0, record_set_1.str)(r.type) !== 'MachineToMachine');
157
- const orgScopes = group(t('organization_role_scope_relations'), 'organizationRoleId', 'organizationScopeId');
158
- const orgResourceScopes = group(t('organization_role_resource_scope_relations'), 'organizationRoleId', 'scopeId');
159
- const organizationRolePermissions = new Map();
160
- for (const r of organizationRoles) {
161
- const id = (0, record_set_1.str)(r.id);
162
- if (id)
163
- organizationRolePermissions.set(id, [...named(orgScopes.get(id), orgScopeName), ...named(orgResourceScopes.get(id), scopeName)]);
164
- }
165
- const memberRoles = new Map();
166
- for (const r of t('organization_role_user_relations')) {
167
- const k = `${(0, record_set_1.str)(r.organizationId)}:${(0, record_set_1.str)(r.userId)}`;
168
- const role = (0, record_set_1.str)(r.organizationRoleId);
169
- if (role)
170
- memberRoles.set(k, [...(memberRoles.get(k) ?? []), role]);
171
- }
172
- const members = t('organization_user_relations')
173
- .map((r) => ({ organizationId: (0, record_set_1.str)(r.organizationId) ?? '', userId: (0, record_set_1.str)(r.userId) ?? '' }))
174
- .filter((m) => m.organizationId && m.userId)
175
- .map((m) => ({ ...m, roleIds: memberRoles.get(`${m.organizationId}:${m.userId}`) ?? [] }));
176
- const invitationRoles = group(t('organization_invitation_role_relations'), 'organizationInvitationId', 'organizationRoleId');
177
- return {
178
- source: 'database',
179
- users: t('users'),
180
- roles,
181
- rolePermissions,
182
- userRoles,
183
- organizations: t('organizations'),
184
- organizationRoles,
185
- organizationRolePermissions,
186
- members,
187
- invitations: t('organization_invitations').map((row) => ({ row, roleIds: invitationRoles.get((0, record_set_1.str)(row.id) ?? '') ?? [] })),
188
- organizationDomains: group(t('organization_jit_email_domains'), 'organizationId', 'emailDomain'),
189
- ssoConnectors: t('sso_connectors'),
190
- ssoIdentities: t('user_sso_identities'),
191
- personalAccessTokens: t('personal_access_tokens'),
192
- jwks: [],
193
- hasFactors: true,
194
- };
195
- }
196
- // ── Management API ──────────────────────────────────────────────────────────
197
- /** A Management API client: an M2M access token fetched (and refreshed) on this machine. */
198
- function logtoManagementHttp(o) {
199
- const fetchImpl = o.fetchImpl ?? fetch;
200
- const now = o.now ?? Date.now;
201
- let cached = null;
202
- const token = async () => {
203
- if (cached && cached.until > now())
204
- return cached.token;
205
- const res = await fetchImpl(`${o.endpoint}/oidc/token`, {
206
- method: 'POST',
207
- headers: {
208
- 'content-type': 'application/x-www-form-urlencoded',
209
- accept: 'application/json',
210
- authorization: `Basic ${Buffer.from(`${o.m2m.appId}:${o.m2m.appSecret}`).toString('base64')}`,
211
- },
212
- body: new URLSearchParams({ grant_type: 'client_credentials', resource: managementResource(o.tenantId), scope: 'all' }).toString(),
213
- });
214
- const body = (await res.json().catch(() => null));
215
- const access = (0, record_set_1.str)(body?.access_token);
216
- if (res.status !== 200 || !access) {
217
- throw new vendor_http_1.VendorApiError('Logto', res.status, '/oidc/token', (0, record_set_1.str)(body?.error_description) ?? (0, record_set_1.str)(body?.error) ?? 'no access token (check the app id, secret and the Management API role)');
218
- }
219
- const ttl = typeof body?.expires_in === 'number' ? body.expires_in : 3600;
220
- cached = { token: access, until: now() + Math.max(ttl - 60, 30) * 1000 };
221
- return access;
222
- };
223
- return new vendor_http_1.VendorHttp({ vendor: 'Logto', baseUrl: o.endpoint, headers: async () => ({ authorization: `Bearer ${await token()}` }), fetchImpl: o.fetchImpl, sleep: o.sleep });
224
- }
225
- /** Every page of a paginated Management API listing (`page`, `page_size`). */
226
- async function pages(http, path) {
227
- const out = [];
228
- const sep = path.includes('?') ? '&' : '?';
229
- for (let page = 1; page <= 100_000; page++) {
230
- const { body } = await http.get(`${path}${sep}page=${page}&page_size=${PAGE}`);
231
- const rows = (0, record_set_1.objs)(body);
232
- out.push(...rows);
233
- if (rows.length < PAGE)
234
- break;
235
- }
236
- return out;
237
- }
238
- /** A listing an older Logto (or a narrower token) may not have: empty, with a warning. */
239
- async function optional(warnings, what, fn, empty) {
240
- try {
241
- return await fn();
242
- }
243
- catch (err) {
244
- if (err instanceof vendor_http_1.VendorApiError && [401, 403, 404, 501].includes(err.status)) {
245
- warnings.push(`${what} could not be read (${err.status}): skipped.`);
246
- return empty;
247
- }
248
- throw err;
249
- }
250
- }
251
- async function readJwks(http) {
252
- const { body } = await http.get('/oidc/jwks');
253
- return (0, record_set_1.objs)(body?.keys);
254
- }
255
- async function fetchLogtoSnapshot(o) {
256
- const http = logtoManagementHttp({ endpoint: o.endpoint, m2m: o.m2m, tenantId: o.tenantId, fetchImpl: o.fetchImpl, sleep: o.sleep });
257
- const warnings = o.warnings ?? [];
258
- o.onProgress('users');
259
- const users = await pages(http, '/api/users?includePasswordHash=true');
260
- o.onProgress('roles');
261
- const roles = (await pages(http, '/api/roles')).filter((r) => (0, record_set_1.str)(r.type) !== 'MachineToMachine');
262
- const rolePermissions = new Map();
263
- const userRoles = new Map();
264
- for (const r of roles) {
265
- const id = (0, record_set_1.str)(r.id);
266
- if (!id)
267
- continue;
268
- const { body } = await http.get(`/api/roles/${encodeURIComponent(id)}/scopes`);
269
- rolePermissions.set(id, (0, record_set_1.objs)(body).map((s) => (0, record_set_1.str)(s.name)).filter((s) => !!s));
270
- for (const u of await pages(http, `/api/roles/${encodeURIComponent(id)}/users`)) {
271
- const uid = (0, record_set_1.str)(u.id);
272
- if (uid)
273
- userRoles.set(uid, [...(userRoles.get(uid) ?? []), id]);
274
- }
275
- }
276
- o.onProgress('organizations');
277
- const organizations = await optional(warnings, 'Organizations', () => pages(http, '/api/organizations'), []);
278
- const organizationRoles = (await optional(warnings, 'Organization roles', () => pages(http, '/api/organization-roles'), [])).filter((r) => (0, record_set_1.str)(r.type) !== 'MachineToMachine');
279
- const organizationRolePermissions = new Map();
280
- for (const r of organizationRoles) {
281
- const id = (0, record_set_1.str)(r.id);
282
- if (!id)
283
- continue;
284
- organizationRolePermissions.set(id, [...(0, record_set_1.objs)(r.scopes), ...(0, record_set_1.objs)(r.resourceScopes)].map((s) => (0, record_set_1.str)(s.name)).filter((s) => !!s));
285
- }
286
- const members = [];
287
- const organizationDomains = new Map();
288
- for (const org of organizations) {
289
- const id = (0, record_set_1.str)(org.id);
290
- if (!id)
291
- continue;
292
- for (const u of await pages(http, `/api/organizations/${encodeURIComponent(id)}/users`)) {
293
- const uid = (0, record_set_1.str)(u.id);
294
- if (uid)
295
- members.push({ organizationId: id, userId: uid, roleIds: (0, record_set_1.objs)(u.organizationRoles).map((x) => (0, record_set_1.str)(x.id)).filter((x) => !!x) });
296
- }
297
- const domains = await optional(warnings, `JIT email domains of organization ${id}`, async () => (0, record_set_1.objs)((await http.get(`/api/organizations/${encodeURIComponent(id)}/jit/email-domains`)).body), []);
298
- const list = domains.map((d) => (0, record_set_1.str)(d.emailDomain)).filter((d) => !!d);
299
- if (list.length)
300
- organizationDomains.set(id, list);
301
- }
302
- const invitations = (await optional(warnings, 'Organization invitations', async () => (0, record_set_1.objs)((await http.get('/api/organization-invitations')).body), [])).map((row) => ({
303
- row,
304
- roleIds: (0, record_set_1.objs)(row.organizationRoles).map((x) => (0, record_set_1.str)(x.id)).filter((x) => !!x),
305
- }));
306
- o.onProgress('enterprise SSO');
307
- const ssoConnectors = await optional(warnings, 'SSO connectors', async () => (0, record_set_1.objs)((await http.get('/api/sso-connectors')).body), []);
308
- const ssoIdentities = [];
309
- if (ssoConnectors.length) {
310
- // SSO identities only come with the single-user read.
311
- for (const u of users) {
312
- const uid = (0, record_set_1.str)(u.id);
313
- if (!uid)
314
- continue;
315
- const { body } = await http.get(`/api/users/${encodeURIComponent(uid)}?includeSsoIdentities=true`);
316
- for (const s of (0, record_set_1.objs)((0, record_set_1.isObj)(body) ? body.ssoIdentities : undefined))
317
- ssoIdentities.push({ ...s, userId: (0, record_set_1.str)(s.userId) ?? uid });
318
- }
319
- }
320
- const personalAccessTokens = [];
321
- if (o.personalAccessTokens) {
322
- o.onProgress('personal access tokens');
323
- for (const u of users) {
324
- const uid = (0, record_set_1.str)(u.id);
325
- if (!uid)
326
- continue;
327
- const rows = await optional(warnings, 'Personal access tokens', async () => (0, record_set_1.objs)((await http.get(`/api/users/${encodeURIComponent(uid)}/personal-access-tokens`)).body), []);
328
- for (const p of rows)
329
- personalAccessTokens.push({ ...p, userId: (0, record_set_1.str)(p.userId) ?? uid });
330
- }
331
- }
332
- o.onProgress('signing keys');
333
- const jwks = await optional(warnings, 'The signing keys (/oidc/jwks)', () => readJwks(http), []);
334
- return {
335
- source: 'api',
336
- users,
337
- roles,
338
- rolePermissions,
339
- userRoles,
340
- organizations,
341
- organizationRoles,
342
- organizationRolePermissions,
343
- members,
344
- invitations,
345
- organizationDomains,
346
- ssoConnectors,
347
- ssoIdentities,
348
- personalAccessTokens,
349
- jwks,
350
- hasFactors: false,
351
- warnings: [...new Set(warnings)],
352
- };
353
- }
354
- // ── passwords ───────────────────────────────────────────────────────────────
355
- const PLAIN_DIGESTS = new Set(['md5', 'sha1', 'sha256', 'sha512']);
356
- const PBKDF2_DIGESTS = new Set(['sha1', 'sha256', 'sha384', 'sha512']);
357
- const HEX = /^[0-9a-f]+$/i;
358
- /** A Logto `Legacy` expression `["algorithm", [args with "@"], "hash"]`, or null. */
359
- function parseLegacyExpression(value) {
360
- let doc;
361
- try {
362
- doc = JSON.parse(value);
363
- }
364
- catch {
365
- return null;
366
- }
367
- if (!Array.isArray(doc) || doc.length !== 3)
368
- return null;
369
- const [algorithm, args, hash] = doc;
370
- if (typeof algorithm !== 'string' || typeof hash !== 'string' || !Array.isArray(args))
371
- return null;
372
- if (!args.every((a) => typeof a === 'string') || !args.includes('@'))
373
- return null;
374
- return { algorithm, args, hash };
375
- }
376
- /**
377
- * A Logto password digest and its `password_encryption_method` → the bundle's
378
- * password. Null when the user has none or Logto itself could not verify it.
379
- */
380
- function mapLogtoPassword(digest, method) {
381
- const d = typeof digest === 'string' ? digest.trim() : '';
382
- if (!d)
383
- return null;
384
- switch ((0, record_set_1.str)(method)) {
385
- case 'Argon2i':
386
- case 'Argon2id':
387
- case 'Argon2d':
388
- return /^\$argon2(id|i|d)\$/.test(d) ? { algorithm: 'argon2', hash: d } : null;
389
- case 'Bcrypt':
390
- return { algorithm: 'bcrypt', hash: d };
391
- // hash-wasm hex digests of the bare password.
392
- case 'MD5':
393
- return { algorithm: 'md5', hash: d, params: { encoding: 'hex' } };
394
- case 'SHA1':
395
- return { algorithm: 'sha1', hash: d, params: { encoding: 'hex' } };
396
- case 'SHA256':
397
- return { algorithm: 'sha256', hash: d, params: { encoding: 'hex' } };
398
- case 'Legacy':
399
- return mapLegacy(d);
400
- default:
401
- return null;
402
- }
403
- }
404
- function mapLegacy(d) {
405
- const e = parseLegacyExpression(d);
406
- if (!e)
407
- return null;
408
- const { algorithm, args, hash } = e;
409
- const at = args.indexOf('@');
410
- // The plain shapes onto the registry's own verifiers.
411
- if (PLAIN_DIGESTS.has(algorithm) && HEX.test(hash)) {
412
- if (args.length === 1)
413
- return { algorithm, hash, params: { encoding: 'hex' } };
414
- const salt = args.length === 2 ? args[at === 0 ? 1 : 0] : '@';
415
- if (salt !== '@')
416
- return { algorithm: `${algorithm}_salted`, hash, salt, params: { salt_position: at === 0 ? 'suffix' : 'prefix', encoding: 'hex' } };
417
- }
418
- if ((algorithm === 'pbkdf2' || algorithm === 'pbkdf2Sync') && args.length === 5 && at === 4) {
419
- const [salt, iterations, keylen, digest] = args;
420
- const hexSalt = salt.startsWith('hex:') ? salt.slice(4) : undefined;
421
- const ok = PBKDF2_DIGESTS.has(digest) && /^\d+$/.test(iterations) && /^\d+$/.test(keylen) && HEX.test(hash) && hash.length === Number(keylen) * 2 && (hexSalt === undefined || (HEX.test(hexSalt) && hexSalt.length % 2 === 0));
422
- if (ok) {
423
- return {
424
- algorithm: 'pbkdf2',
425
- hash,
426
- salt: hexSalt ?? salt,
427
- params: { digest, iterations: Number(iterations), key_length: Number(keylen), encoding: 'hex', salt_encoding: hexSalt === undefined ? 'utf8' : 'hex' },
428
- };
429
- }
430
- }
431
- if (algorithm === 'firebase-scrypt' && args.length === 6 && at === 5) {
432
- const [salt, signerKey, separator, rounds, memCost] = args;
433
- return { algorithm: 'scrypt_firebase', hash, salt, params: { signer_key: signerKey, salt_separator: separator, rounds: Number(rounds), mem_cost: Number(memCost) } };
434
- }
435
- // Everything else (several args around the password, other digests, PBKDF2
436
- // variants, SHA-crypt) keeps the expression for the logto_legacy verifier.
437
- return { algorithm: 'logto_legacy', hash: d };
438
- }
439
- // ── records ─────────────────────────────────────────────────────────────────
440
- /** A unique key per name within a scope (`Billing Admin` → `billing_admin`, then `billing_admin_x1y2`). */
441
- function keyer() {
442
- const used = new Set();
443
- return (name, id) => {
444
- let key = (0, translate_kit_1.keyOf)(name);
445
- if (used.has(key))
446
- key = `${key}_${id.slice(-4).toLowerCase()}`;
447
- used.add(key);
448
- return key;
449
- };
450
- }
451
- /** One Logto user → a user record (null when it has nothing to sign in with). */
452
- function mapLogtoUser(u, roles = []) {
453
- const id = (0, record_set_1.str)(u.id);
454
- if (!id)
455
- return { user: null, passwordUnsupported: false };
456
- const profile = (0, record_set_1.isObj)(u.profile) ? u.profile : {};
457
- const primary = (0, record_set_1.str)(u.primaryEmail)?.toLowerCase();
458
- const phone = (0, record_set_1.e164)(u.primaryPhone);
459
- const username = (0, record_set_1.str)(u.username);
460
- // Logto keeps no verified flag: an address is only set once verified (or by an admin).
461
- const emails = primary ? [{ email: primary, verified: true, primary: true }] : [];
462
- if (!primary && !phone && !username) {
463
- // A social-only account: the provider's address, unverified, so the user can be matched.
464
- const social = Object.values((0, record_set_1.isObj)(u.identities) ? u.identities : {})
465
- .map((i) => ((0, record_set_1.isObj)(i) && (0, record_set_1.isObj)(i.details) ? (0, record_set_1.str)(i.details.email)?.toLowerCase() : undefined))
466
- .find((e) => e?.includes('@'));
467
- if (social)
468
- emails.push({ email: social, verified: false, primary: true });
469
- }
470
- const digest = u.passwordEncrypted ?? u.passwordDigest;
471
- const method = u.passwordEncryptionMethod ?? u.passwordAlgorithm;
472
- const password = mapLogtoPassword(digest, method);
473
- const extraProfile = Object.fromEntries(Object.entries(profile).filter(([k, v]) => !NAME_KEYS.has(k) && v !== null && v !== undefined && v !== ''));
474
- const suspended = (0, tables_1.bool)(u.isSuspended);
475
- const user = (0, record_set_1.compact)({
476
- id,
477
- emails,
478
- phones: phone ? [{ phone, verified: true, primary: !primary }] : [],
479
- username,
480
- first_name: (0, record_set_1.str)(profile.givenName),
481
- last_name: (0, record_set_1.str)(profile.familyName),
482
- name: (0, record_set_1.str)(u.name),
483
- image_url: (0, record_set_1.str)(u.avatar),
484
- password: password ?? undefined,
485
- roles,
486
- banned: suspended ? true : undefined,
487
- ban_reason: suspended ? 'Suspended in Logto' : undefined,
488
- public_metadata: (0, record_set_1.bag)(u.customData),
489
- private_metadata: (0, record_set_1.bag)({
490
- ...(Object.keys(extraProfile).length ? { logto_profile: extraProfile } : {}),
491
- ...((0, record_set_1.str)(u.applicationId) ? { logto_application_id: (0, record_set_1.str)(u.applicationId) } : {}),
492
- ...((0, tables_1.bool)(u.isPasswordExpired) ? { logto_password_expired: true } : {}),
493
- }),
494
- created_at: (0, tables_1.time)(u.createdAt),
495
- last_sign_in_at: (0, tables_1.time)(u.lastSignInAt),
496
- });
497
- const ok = !!(user.emails?.length || user.phones?.length || user.username);
498
- return { user: ok ? user : null, passwordUnsupported: !password && typeof digest === 'string' && digest.trim() !== '' };
499
- }
500
- /** SAML providers vs OIDC ones (Logto's SsoProviderName). */
501
- const SAML_PROVIDERS = new Set(['SAML', 'AzureAD']);
502
- function mapSsoConnector(c, endpoint) {
503
- const id = (0, record_set_1.str)(c.id);
504
- const provider = (0, record_set_1.str)(c.providerName);
505
- if (!id || !provider)
506
- return null;
507
- const config = (0, record_set_1.isObj)(c.config) ? c.config : {};
508
- const domains = (0, record_set_1.strs)(c.domains);
509
- const name = (0, record_set_1.str)(c.connectorName) ?? provider;
510
- if (SAML_PROVIDERS.has(provider)) {
511
- const mapping = (0, record_set_1.isObj)(config.attributeMapping) ? Object.fromEntries(Object.entries(config.attributeMapping).filter((e) => typeof e[1] === 'string')) : {};
512
- return (0, record_set_1.compact)({
513
- id,
514
- name,
515
- protocol: 'saml',
516
- domains,
517
- enabled: true,
518
- saml: (0, record_set_1.compact)({
519
- idp_entity_id: (0, record_set_1.str)(config.entityId),
520
- idp_sso_url: (0, record_set_1.str)(config.signInEndpoint),
521
- idp_certificate: (0, record_set_1.str)(config.x509Certificate),
522
- idp_metadata_url: (0, record_set_1.str)(config.metadataUrl),
523
- idp_metadata_xml: (0, record_set_1.str)(config.metadata),
524
- // Logto's SP identifiers: the IdP must be updated when these change.
525
- sp_entity_id: endpoint ? `${endpoint}/enterprise-sso/${id}` : undefined,
526
- sp_acs_url: endpoint ? `${endpoint}/api/authn/single-sign-on/saml/${id}` : undefined,
527
- attribute_mapping: Object.keys(mapping).length ? mapping : undefined,
528
- }),
529
- });
530
- }
531
- // OIDC, Okta, Azure AD (OIDC) and Google Workspace are OpenID Connect underneath.
532
- const issuer = (0, record_set_1.str)(config.issuer) ?? (provider === 'GoogleWorkspace' ? 'https://accounts.google.com' : undefined);
533
- return (0, record_set_1.compact)({
534
- id,
535
- name,
536
- protocol: 'oidc',
537
- domains,
538
- enabled: true,
539
- oidc: (0, record_set_1.compact)({
540
- issuer,
541
- client_id: (0, record_set_1.str)(config.clientId),
542
- client_secret: (0, record_set_1.str)(config.clientSecret),
543
- scopes: (0, record_set_1.str)(config.scope)?.split(/[ +]/).filter(Boolean),
544
- }),
545
- });
546
- }
547
- const INVITATION_STATUS = { Pending: 'pending', Accepted: 'accepted', Revoked: 'revoked', Expired: 'expired' };
548
- function buildLogtoRecordSet(snap, o) {
549
- const set = new record_set_1.RecordSet();
550
- for (const w of snap.warnings ?? [])
551
- set.warn(w);
552
- // ── roles ──
553
- const appKey = keyer();
554
- const appRoleKey = new Map();
555
- const defaults = [];
556
- for (const r of snap.roles) {
557
- const id = (0, record_set_1.str)(r.id);
558
- const name = (0, record_set_1.str)(r.name);
559
- if (!id || !name)
560
- continue;
561
- const key = appKey(name, id);
562
- appRoleKey.set(id, key);
563
- if ((0, tables_1.bool)(r.isDefault))
564
- defaults.push(name);
565
- set.add('role', (0, record_set_1.compact)({ key, name, description: (0, record_set_1.str)(r.description), scope: 'app', permissions: snap.rolePermissions.get(id) ?? [] }), `app:${key}`);
566
- }
567
- if (defaults.length) {
568
- set.warn(`Logto gives every new user the default role(s) ${defaults.join(', ')}; Atlas does not assign roles at sign-up. Existing users keep them; give new users the role with an action or the Backend API.`);
569
- }
570
- const orgKey = keyer();
571
- const orgRoleKey = new Map();
572
- for (const r of snap.organizationRoles) {
573
- const id = (0, record_set_1.str)(r.id);
574
- const name = (0, record_set_1.str)(r.name);
575
- if (!id || !name)
576
- continue;
577
- const key = orgKey(name, id);
578
- orgRoleKey.set(id, key);
579
- set.add('role', (0, record_set_1.compact)({ key, name, description: (0, record_set_1.str)(r.description), scope: 'organization', permissions: snap.organizationRolePermissions.get(id) ?? [] }), `org:${key}`);
580
- }
581
- // ── organizations ──
582
- const orgIds = new Set();
583
- for (const org of snap.organizations) {
584
- const id = (0, record_set_1.str)(org.id);
585
- const name = (0, record_set_1.str)(org.name);
586
- if (!id || !name)
587
- continue;
588
- orgIds.add(id);
589
- const branding = (0, record_set_1.isObj)(org.branding) ? org.branding : {};
590
- set.add('organization', (0, record_set_1.compact)({
591
- id,
592
- name,
593
- image_url: (0, record_set_1.str)(branding.logoUrl),
594
- domains: snap.organizationDomains.get(id) ?? [],
595
- public_metadata: (0, record_set_1.bag)({ ...((0, record_set_1.isObj)(org.customData) ? org.customData : {}), ...((0, record_set_1.str)(org.description) ? { description: (0, record_set_1.str)(org.description) } : {}) }),
596
- private_metadata: (0, tables_1.bool)(org.isMfaRequired) ? { logto_mfa_required: true } : undefined,
597
- created_at: (0, tables_1.time)(org.createdAt),
598
- }));
599
- }
600
- if (snap.organizations.some((org) => (0, tables_1.bool)(org.isMfaRequired))) {
601
- set.warn('Some organizations require MFA of their members in Logto (private_metadata.logto_mfa_required): set an organization MFA policy in Atlas.');
602
- }
603
- // ── enterprise SSO ──
604
- const connectorProtocol = new Map();
605
- const connectorName = new Map();
606
- for (const c of snap.ssoConnectors) {
607
- const record = mapSsoConnector(c, o.endpoint);
608
- if (!record)
609
- continue;
610
- connectorProtocol.set(record.id, record.protocol);
611
- connectorName.set(record.id, record.name ?? record.id);
612
- set.add('sso_connection', record);
613
- }
614
- if (snap.ssoConnectors.some((c) => SAML_PROVIDERS.has((0, record_set_1.str)(c.providerName) ?? '')) && !o.endpoint) {
615
- set.warn('The Logto endpoint was not given, so the SAML connections carry no SP entity id / ACS URL: pass --set logto-endpoint=<url> to record them.');
616
- }
617
- // ── users ──
618
- const userIds = new Set();
619
- const algorithms = {};
620
- let unsupported = 0;
621
- let hashless = 0;
622
- for (const u of snap.users) {
623
- const id = (0, record_set_1.str)(u.id);
624
- const roles = (snap.userRoles.get(id ?? '') ?? []).map((r) => appRoleKey.get(r)).filter((k) => !!k);
625
- const { user, passwordUnsupported } = mapLogtoUser(u, roles);
626
- if (!user) {
627
- set.omit('user', 'no email, phone number or username');
628
- continue;
629
- }
630
- userIds.add(user.id);
631
- set.add('user', user);
632
- if (user.password)
633
- algorithms[user.password.algorithm] = (algorithms[user.password.algorithm] ?? 0) + 1;
634
- if (passwordUnsupported)
635
- unsupported++;
636
- if (!user.password && !passwordUnsupported && u.hasPassword === true)
637
- hashless++;
638
- }
639
- if (unsupported)
640
- set.warn(`${unsupported} user(s) have a password hash Logto itself cannot verify (unknown method or malformed Legacy expression): they reset their password, or move by lazy migration.`);
641
- if (hashless) {
642
- set.warn(`${hashless} user(s) have a password the Management API did not return (the Management API does not return hashes on every Logto version, or the token is read-only): turn on the logto lazy-migration preset, or export from the database.`);
643
- }
644
- if (snap.source === 'api' && userIds.size) {
645
- set.warn('The Management API never returns MFA secrets (TOTP keys, WebAuthn credentials, backup codes): users with MFA enrol again in Atlas, or export from the database to keep them.');
646
- }
647
- // ── identities ──
648
- for (const u of snap.users) {
649
- const id = (0, record_set_1.str)(u.id);
650
- if (!id || !userIds.has(id))
651
- continue;
652
- for (const [target, identity] of Object.entries((0, record_set_1.isObj)(u.identities) ? u.identities : {})) {
653
- if (!(0, record_set_1.isObj)(identity))
654
- continue;
655
- const providerUserId = (0, record_set_1.str)(identity.userId);
656
- if (!providerUserId)
657
- continue;
658
- const details = (0, record_set_1.isObj)(identity.details) ? identity.details : {};
659
- set.add('identity', (0, record_set_1.compact)({ user_id: id, provider: target, provider_user_id: providerUserId, kind: 'oauth', email: (0, record_set_1.str)(details.email)?.toLowerCase(), profile: (0, record_set_1.bag)(details) }), `${target}:${providerUserId}`);
660
- }
661
- }
662
- for (const s of snap.ssoIdentities) {
663
- const userId = (0, record_set_1.str)(s.userId);
664
- const connectorId = (0, record_set_1.str)(s.ssoConnectorId);
665
- const identityId = (0, record_set_1.str)(s.identityId);
666
- if (!userId || !userIds.has(userId) || !connectorId || !identityId)
667
- continue;
668
- if (!connectorProtocol.has(connectorId)) {
669
- set.omit('identity', 'SSO identity of a connector the export does not carry');
670
- continue;
671
- }
672
- const detail = (0, record_set_1.isObj)(s.detail) ? s.detail : {};
673
- set.add('identity', (0, record_set_1.compact)({
674
- id: (0, record_set_1.str)(s.id),
675
- user_id: userId,
676
- provider: connectorName.get(connectorId) ?? connectorId,
677
- provider_user_id: identityId,
678
- kind: connectorProtocol.get(connectorId),
679
- sso_connection_id: connectorId,
680
- email: (0, record_set_1.str)(detail.email)?.toLowerCase(),
681
- profile: (0, record_set_1.bag)({ ...detail, ...((0, record_set_1.str)(s.issuer) ? { issuer: (0, record_set_1.str)(s.issuer) } : {}) }),
682
- }), `sso:${connectorId}:${identityId}`);
683
- }
684
- // ── second factors and passkeys (database dumps) ──
685
- if (snap.hasFactors) {
686
- for (const u of snap.users) {
687
- const userId = (0, record_set_1.str)(u.id);
688
- if (!userId || !userIds.has(userId))
689
- continue;
690
- const factors = Array.isArray(u.mfaVerifications) ? (0, record_set_1.objs)(u.mfaVerifications) : [];
691
- for (const f of factors)
692
- addFactor(set, userId, f, o.rpId);
693
- }
694
- }
695
- // ── memberships and invitations ──
696
- let multiRole = 0;
697
- let fallback = false;
698
- for (const m of snap.members) {
699
- if (!orgIds.has(m.organizationId) || !userIds.has(m.userId))
700
- continue;
701
- const keys = m.roleIds.map((r) => orgRoleKey.get(r)).filter((k) => !!k);
702
- if (keys.length > 1)
703
- multiRole++;
704
- if (!keys.length)
705
- fallback = true;
706
- set.add('membership', { organization_id: m.organizationId, user_id: m.userId, role: keys[0] ?? 'member' }, `${m.organizationId}:${m.userId}`);
707
- }
708
- if (fallback && !set.list('role').some((r) => r.scope === 'organization' && r.key === 'member')) {
709
- set.add('role', { key: 'member', name: 'Member', scope: 'organization' }, 'org:member');
710
- }
711
- if (multiRole) {
712
- set.warn(`${multiRole} membership(s) hold several organization roles in Logto; Atlas keeps one role per membership (the first). Merge the permissions into one role where a member needs both.`);
713
- }
714
- for (const { row, roleIds } of snap.invitations) {
715
- const id = (0, record_set_1.str)(row.id);
716
- const email = (0, record_set_1.str)(row.invitee)?.toLowerCase();
717
- const organizationId = (0, record_set_1.str)(row.organizationId);
718
- if (!id || !email || !email.includes('@')) {
719
- set.omit('invitation', 'the invitee is not an email address');
720
- continue;
721
- }
722
- if (organizationId && !orgIds.has(organizationId))
723
- continue;
724
- set.add('invitation', (0, record_set_1.compact)({
725
- id,
726
- organization_id: organizationId,
727
- email,
728
- role: roleIds.map((r) => orgRoleKey.get(r)).find((k) => !!k),
729
- status: INVITATION_STATUS[(0, record_set_1.str)(row.status) ?? ''],
730
- inviter_user_id: (0, record_set_1.str)(row.inviterId),
731
- expires_at: (0, tables_1.time)(row.expiresAt),
732
- created_at: (0, tables_1.time)(row.createdAt),
733
- }));
734
- }
735
- // ── personal access tokens ──
736
- for (const p of snap.personalAccessTokens) {
737
- const userId = (0, record_set_1.str)(p.userId);
738
- const name = (0, record_set_1.str)(p.name);
739
- const value = (0, record_set_1.str)(p.value);
740
- if (!userId || !userIds.has(userId) || !name || !value)
741
- continue;
742
- set.add('api_key', (0, record_set_1.compact)({ id: `${userId}:${name}`, user_id: userId, name, hash: (0, tables_1.sha256Hex)(value), hash_algorithm: 'sha256', start: value.slice(0, 8), expires_at: (0, tables_1.time)(p.expiresAt), created_at: (0, tables_1.time)(p.createdAt) }));
743
- }
744
- // ── signing keys ──
745
- for (const k of snap.jwks) {
746
- const kid = (0, record_set_1.str)(k.kid);
747
- if (kid)
748
- set.add('jwks', { kid, jwk: k });
749
- }
750
- set.manifest = {
751
- origin: o.endpoint ? new URL(o.endpoint).host : `Logto database (tenant ${o.tenantId})`,
752
- ...(o.rpId ? { rpId: o.rpId } : {}),
753
- providers: [...new Set(set.list('identity').map((i) => i.provider))].sort(),
754
- settings: { tenant_id: o.tenantId, read_from: snap.source, password_algorithms: algorithms, totp: TOTP },
755
- };
756
- return set;
757
- }
758
- /** One `mfa_verifications` entry → a factor or a passkey. */
759
- function addFactor(set, userId, f, rpId) {
760
- const type = (0, record_set_1.str)(f.type);
761
- const created = (0, tables_1.time)(f.createdAt);
762
- if (type === 'Totp') {
763
- const secret = (0, record_set_1.str)(f.key)?.replace(/[\s=]/g, '').toUpperCase();
764
- if (!secret || !/^[A-Z2-7]+$/.test(secret)) {
765
- set.omit('mfa_factor', 'a TOTP key that is not base32');
766
- return;
767
- }
768
- set.add('mfa_factor', (0, record_set_1.compact)({ id: (0, record_set_1.str)(f.id), user_id: userId, type: 'totp', secret_base32: secret, ...TOTP, verified: true, created_at: created }));
769
- }
770
- else if (type === 'BackupCode') {
771
- const codes = (0, record_set_1.objs)(f.codes)
772
- .filter((c) => !(0, record_set_1.str)(c.usedAt))
773
- .map((c) => (0, record_set_1.str)(c.code))
774
- .filter((c) => !!c);
775
- if (!codes.length) {
776
- set.omit('mfa_factor', 'every backup code already used');
777
- return;
778
- }
779
- set.add('mfa_factor', (0, record_set_1.compact)({ id: (0, record_set_1.str)(f.id), user_id: userId, type: 'backup_codes', backup_codes: codes, verified: true, created_at: created }));
780
- }
781
- else if (type === 'WebAuthn') {
782
- const credentialId = (0, tables_1.base64url)(f.credentialId);
783
- const publicKey = (0, tables_1.base64url)(f.publicKey);
784
- const rp = (0, record_set_1.str)(f.rpId) ?? rpId;
785
- if (!credentialId || !publicKey) {
786
- set.omit('passkey', 'a WebAuthn credential without its id or public key');
787
- return;
788
- }
789
- if (!rp) {
790
- set.omit('passkey', 'the relying-party id is unknown (pass --set logto-endpoint=<url> or --set rp-id=<host>)');
791
- return;
792
- }
793
- set.add('passkey', (0, record_set_1.compact)({
794
- id: (0, record_set_1.str)(f.id),
795
- user_id: userId,
796
- credential_id: credentialId,
797
- public_key: publicKey,
798
- sign_count: typeof f.counter === 'number' ? f.counter : undefined,
799
- rp_id: rp,
800
- transports: (0, record_set_1.strs)(f.transports),
801
- name: (0, record_set_1.str)(f.name) ?? (0, record_set_1.str)(f.agent),
802
- created_at: created,
803
- }));
804
- }
805
- else {
806
- set.omit('mfa_factor', `Logto factor type ${type ?? 'unknown'}`);
807
- }
808
- }
809
- //# sourceMappingURL=logto.js.map