@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,248 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseDelimited = parseDelimited;
4
+ exports.parseTable = parseTable;
5
+ exports.parseKeyValues = parseKeyValues;
6
+ exports.typedParams = typedParams;
7
+ exports.mapTable = mapTable;
8
+ const password_detect_1 = require("./password-detect");
9
+ const record_set_1 = require("./record-set");
10
+ const translate_kit_1 = require("./translate-kit");
11
+ // ── parsing ─────────────────────────────────────────────────────────────────
12
+ /** RFC 4180 CSV with a sniffed delimiter (`,` `;` tab `|`), quoted fields, doubled quotes, embedded newlines. */
13
+ function parseDelimited(text) {
14
+ const src = text.replace(/^\ufeff/, '');
15
+ const first = src.split(/\r?\n/, 1)[0] ?? '';
16
+ const delimiter = [',', ';', '\t', '|'].map((d) => [d, first.split(d).length]).sort((a, b) => b[1] - a[1])[0][0];
17
+ const rows = [];
18
+ let row = [];
19
+ let field = '';
20
+ let quoted = false;
21
+ for (let i = 0; i < src.length; i++) {
22
+ const c = src[i];
23
+ if (quoted) {
24
+ if (c === '"') {
25
+ if (src[i + 1] === '"') {
26
+ field += '"';
27
+ i++;
28
+ }
29
+ else
30
+ quoted = false;
31
+ }
32
+ else
33
+ field += c;
34
+ }
35
+ else if (c === '"' && field === '')
36
+ quoted = true;
37
+ else if (c === delimiter) {
38
+ row.push(field);
39
+ field = '';
40
+ }
41
+ else if (c === '\n' || c === '\r') {
42
+ if (c === '\r' && src[i + 1] === '\n')
43
+ i++;
44
+ row.push(field);
45
+ field = '';
46
+ if (row.some((f) => f !== ''))
47
+ rows.push(row);
48
+ row = [];
49
+ }
50
+ else
51
+ field += c;
52
+ }
53
+ row.push(field);
54
+ if (row.some((f) => f !== ''))
55
+ rows.push(row);
56
+ const header = (rows.shift() ?? []).map((h) => h.trim());
57
+ return rows.map((r) => Object.fromEntries(header.map((h, i) => [h, r[i] ?? ''])));
58
+ }
59
+ /** Rows from CSV/TSV, a JSON array (of objects, or `{ users: [...] }`) or NDJSON. */
60
+ function parseTable(text) {
61
+ const t = text.trim();
62
+ if (t.startsWith('[') || t.startsWith('{')) {
63
+ try {
64
+ const v = JSON.parse(t);
65
+ if (Array.isArray(v))
66
+ return v.filter(record_set_1.isObj);
67
+ if ((0, record_set_1.isObj)(v)) {
68
+ const list = Object.values(v).find(Array.isArray);
69
+ if (list)
70
+ return list.filter(record_set_1.isObj);
71
+ return [v];
72
+ }
73
+ }
74
+ catch {
75
+ // NDJSON: one object per line
76
+ return t.split(/\r?\n/).filter((l) => l.trim()).map((l, i) => {
77
+ try {
78
+ const o = JSON.parse(l);
79
+ if (!(0, record_set_1.isObj)(o))
80
+ throw new Error('not an object');
81
+ return o;
82
+ }
83
+ catch {
84
+ throw new Error(`Line ${i + 1} is not a JSON object.`);
85
+ }
86
+ });
87
+ }
88
+ }
89
+ return parseDelimited(t);
90
+ }
91
+ // ── column recognition ──────────────────────────────────────────────────────
92
+ const NAMES = {
93
+ id: ['id', 'user_id', 'userid', 'uid', 'uuid', 'sub', 'external_id'],
94
+ email: ['email', 'email_address', 'emailaddress', 'mail', 'e_mail'],
95
+ email_verified: ['email_verified', 'emailverified', 'verified', 'is_verified', 'email_confirmed', 'email_confirmed_at', 'confirmed_at', 'email_verified_at'],
96
+ username: ['username', 'user_name', 'login', 'handle', 'screen_name'],
97
+ first_name: ['first_name', 'firstname', 'given_name', 'givenname', 'fname'],
98
+ last_name: ['last_name', 'lastname', 'family_name', 'surname', 'lname'],
99
+ name: ['name', 'full_name', 'fullname', 'display_name', 'displayname'],
100
+ phone: ['phone', 'phone_number', 'phonenumber', 'mobile', 'mobile_phone', 'tel'],
101
+ password: ['password_hash', 'passwordhash', 'encrypted_password', 'hashed_password', 'password_digest', 'pwd_hash', 'password', 'passwd', 'hash', 'pass'],
102
+ salt: ['password_salt', 'salt', 'pwd_salt', 'passwordsalt'],
103
+ created_at: ['created_at', 'createdat', 'created', 'date_joined', 'registered_at', 'signup_date'],
104
+ last_sign_in_at: ['last_sign_in_at', 'last_login', 'last_login_at', 'last_seen', 'lastlogin'],
105
+ roles: ['roles', 'role', 'groups'],
106
+ disabled: ['disabled', 'banned', 'is_banned', 'blocked', 'is_blocked', 'suspended', 'locked'],
107
+ active: ['active', 'is_active', 'enabled'],
108
+ image_url: ['image_url', 'avatar', 'avatar_url', 'picture', 'photo'],
109
+ };
110
+ const truthy = (v) => {
111
+ if (typeof v === 'boolean')
112
+ return v;
113
+ if (typeof v === 'number')
114
+ return v !== 0;
115
+ const s = String(v ?? '').trim().toLowerCase();
116
+ return ['1', 'true', 't', 'yes', 'y'].includes(s) || (s !== '' && !['0', 'false', 'f', 'no', 'n', 'null', 'nil', 'none'].includes(s) && /^\d{4}-|^\d{9,}$/.test(s));
117
+ };
118
+ function columnFinder(row, map = {}) {
119
+ const lower = new Map(Object.keys(row).map((k) => [k.toLowerCase().replace(/[\s-]+/g, '_'), k]));
120
+ return (field) => {
121
+ const wanted = map[field];
122
+ if (wanted)
123
+ return Object.keys(row).find((k) => k === wanted) ?? lower.get(wanted.toLowerCase());
124
+ for (const n of NAMES[field] ?? [])
125
+ if (lower.has(n))
126
+ return lower.get(n);
127
+ return undefined;
128
+ };
129
+ }
130
+ const isoTime = (v) => {
131
+ const s = (0, record_set_1.str)(v);
132
+ if (!s)
133
+ return undefined;
134
+ const n = /^\d{9,13}$/.test(s) ? Number(s) * (s.length >= 12 ? 1 : 1000) : Date.parse(s);
135
+ return Number.isFinite(n) && n > 0 ? new Date(n).toISOString() : undefined;
136
+ };
137
+ function passwordFor(hash, salt, o) {
138
+ const algorithm = o.hashAlgorithm?.toLowerCase();
139
+ if (algorithm === 'plaintext') {
140
+ const d = (0, password_detect_1.detectPasswordHash)(hash, { plaintext: true });
141
+ return d.ok ? { password: d.password } : { reason: d.reason };
142
+ }
143
+ if (!algorithm || algorithm === 'auto') {
144
+ const d = (0, password_detect_1.detectPasswordHash)(hash);
145
+ if (d.ok)
146
+ return { password: d.password, weak: d.weak };
147
+ return { reason: `${d.reason}; name its algorithm with --set hash-algorithm=<id>` };
148
+ }
149
+ if (!(0, password_detect_1.isKnownAlgorithm)(algorithm))
150
+ return { reason: `unknown hash algorithm "${algorithm}"` };
151
+ const params = { ...(o.hashParams ?? {}) };
152
+ if (o.saltPosition)
153
+ params.salt_position = o.saltPosition;
154
+ if (o.hashEncoding)
155
+ params.encoding = o.hashEncoding;
156
+ return { password: (0, record_set_1.compact)({ algorithm, hash, salt, params: Object.keys(params).length ? params : undefined }) };
157
+ }
158
+ /** Parse `a=1,b=two,c=true` into typed params. */
159
+ function parseKeyValues(raw) {
160
+ const out = {};
161
+ for (const part of (raw ?? '').split(',')) {
162
+ const i = part.indexOf('=');
163
+ if (i > 0)
164
+ out[part.slice(0, i).trim()] = part.slice(i + 1).trim();
165
+ }
166
+ return out;
167
+ }
168
+ function typedParams(raw) {
169
+ return Object.fromEntries(Object.entries(parseKeyValues(raw)).map(([k, v]) => [k, v === 'true' ? true : v === 'false' ? false : /^\d+$/.test(v) ? Number(v) : v]));
170
+ }
171
+ // ── mapping ─────────────────────────────────────────────────────────────────
172
+ function mapTable(rows, options = {}) {
173
+ const set = new record_set_1.RecordSet();
174
+ set.manifest = { origin: options.origin ?? 'user table' };
175
+ const ids = new Set();
176
+ let n = 0;
177
+ const unusable = new Map();
178
+ let weak = 0;
179
+ for (const row of rows) {
180
+ n++;
181
+ const col = columnFinder(row, options.map);
182
+ const get = (f) => {
183
+ const c = col(f);
184
+ return c === undefined ? undefined : row[c];
185
+ };
186
+ const emailRaw = (0, record_set_1.str)(get('email'))?.toLowerCase();
187
+ const email = emailRaw?.includes('@') ? emailRaw : undefined;
188
+ const phone = (0, record_set_1.e164)(get('phone'));
189
+ const username = (0, record_set_1.str)(get('username'));
190
+ if (!email && !phone && !username) {
191
+ set.omit('user', 'no email, phone or username', 1);
192
+ continue;
193
+ }
194
+ const id = (0, record_set_1.str)(get('id')) ?? email ?? username ?? String(n);
195
+ if (ids.has(id)) {
196
+ set.omit('user', 'duplicate id', 1);
197
+ continue;
198
+ }
199
+ ids.add(id);
200
+ const verifiedCol = col('email_verified');
201
+ const emails = email ? [{ email, verified: options.trustEmails === true || (verifiedCol !== undefined && truthy(row[verifiedCol])), primary: true }] : [];
202
+ const phones = phone ? [{ phone, verified: false, primary: true }] : [];
203
+ const record = (0, record_set_1.compact)({
204
+ id,
205
+ emails,
206
+ phones,
207
+ username,
208
+ first_name: (0, record_set_1.str)(get('first_name')),
209
+ last_name: (0, record_set_1.str)(get('last_name')),
210
+ name: (0, record_set_1.str)(get('name')),
211
+ image_url: (0, record_set_1.str)(get('image_url')),
212
+ created_at: isoTime(get('created_at')),
213
+ last_sign_in_at: isoTime(get('last_sign_in_at')),
214
+ });
215
+ const roleValue = get('roles');
216
+ const roles = (Array.isArray(roleValue) ? (0, record_set_1.strs)(roleValue) : ((0, record_set_1.str)(roleValue) ?? '').split(/[;,|]/)).map((r) => r.trim()).filter(Boolean).map(translate_kit_1.keyOf);
217
+ for (const r of roles)
218
+ set.add('role', { key: r, name: r, scope: 'app' }, r);
219
+ if (roles.length)
220
+ record.roles = [...new Set(roles)];
221
+ if (truthy(get('disabled')) && col('disabled') !== undefined) {
222
+ record.banned = true;
223
+ record.ban_reason = 'Disabled in the source table';
224
+ }
225
+ else if (col('active') !== undefined && get('active') !== '' && get('active') !== undefined && !truthy(get('active'))) {
226
+ record.banned = true;
227
+ record.ban_reason = 'Inactive in the source table';
228
+ }
229
+ const hash = (0, record_set_1.str)(get('password'));
230
+ if (hash) {
231
+ const r = passwordFor(hash, (0, record_set_1.str)(get('salt')), options);
232
+ if (r.password) {
233
+ record.password = r.password;
234
+ if (r.weak)
235
+ weak++;
236
+ }
237
+ else
238
+ unusable.set(r.reason, (unusable.get(r.reason) ?? 0) + 1);
239
+ }
240
+ set.add('user', record, id);
241
+ }
242
+ for (const [reason, count] of unusable)
243
+ set.warn(`${count} password(s) left out: ${reason}.`);
244
+ if (weak)
245
+ set.warn(`${weak} password(s) use a weak legacy hash; Atlas re-hashes each to Argon2id on that user's first sign-in.`);
246
+ return set;
247
+ }
248
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/migrate/export/table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { TranslationResult } from '../framework/plugin';
2
+ import { type VendorHttp } from './vendor-http';
3
+ /**
4
+ * `atlas migrate userfront config` — what Userfront's admin API exposes about
5
+ * a tenant's configuration: its roles. Sign-in methods, forms, password and
6
+ * MFA rules, session lifetimes, domains and branding live only in the
7
+ * Userfront dashboard: the report lists each as manual with where to look.
8
+ * Passwords move by the `userfront` lazy-migration preset.
9
+ */
10
+ export interface UserfrontConfigSnapshot {
11
+ tenantId: string;
12
+ roles: string[];
13
+ }
14
+ export declare function fetchUserfrontConfig(http: VendorHttp, tenantId: string): Promise<UserfrontConfigSnapshot>;
15
+ export declare function translateUserfrontConfig(snap: UserfrontConfigSnapshot): TranslationResult;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchUserfrontConfig = fetchUserfrontConfig;
4
+ exports.translateUserfrontConfig = translateUserfrontConfig;
5
+ const record_set_1 = require("./record-set");
6
+ const translate_kit_1 = require("./translate-kit");
7
+ const userfront_1 = require("./userfront");
8
+ const vendor_http_1 = require("./vendor-http");
9
+ async function fetchUserfrontConfig(http, tenantId) {
10
+ const tid = (0, userfront_1.checkTenantId)(tenantId);
11
+ let body = null;
12
+ try {
13
+ body = (await http.get(`/tenants/${tid}/roles`)).body;
14
+ }
15
+ catch (err) {
16
+ if (!(err instanceof vendor_http_1.VendorApiError) || ![400, 403, 404].includes(err.status))
17
+ throw err;
18
+ }
19
+ return { tenantId: tid, roles: (0, record_set_1.objs)(body?.roles).map((r) => (0, record_set_1.str)(r.name)).filter((n) => !!n) };
20
+ }
21
+ function translateUserfrontConfig(snap) {
22
+ const b = new translate_kit_1.ConfigBuilder();
23
+ const seen = new Set();
24
+ for (const name of snap.roles) {
25
+ const key = (0, translate_kit_1.keyOf)(name);
26
+ if (seen.has(key))
27
+ continue;
28
+ seen.add(key);
29
+ b.roles[name] = key;
30
+ b.push('roles', { key, name, description: '', permissions: [] });
31
+ }
32
+ if (seen.size)
33
+ b.add('mapped', 'authorization', 'roles', `${seen.size} role(s) (tenant roles become app roles; members keep theirs with the data export).`, 'roles');
34
+ b.add('mapped', 'authentication', 'password sign-in', 'Userfront never returns password hashes: the userfront lazy-migration preset checks each password against Userfront on the first Atlas sign-in.', 'auth_config.strategies.password');
35
+ for (const [setting, where] of [
36
+ ['sign-in methods (password, email link, code, social, SSO)', 'Dashboard → Authentication'],
37
+ ['multi-factor authentication', 'Dashboard → Authentication → Multi-factor'],
38
+ ['session and token lifetimes', 'Dashboard → Settings → Sessions'],
39
+ ['social provider credentials', 'Dashboard → Authentication → Social (re-enter each client id and secret as an Atlas oauth provider)'],
40
+ ['domains and redirect URLs', 'Dashboard → Settings → Domains'],
41
+ ['forms and branding', 'Dashboard → Toolkit / Branding (use the Atlas components and theme)'],
42
+ ['custom emails', 'Dashboard → Emails (use the Atlas email templates)'],
43
+ ]) {
44
+ b.add('manual', 'settings not in the API', setting, `Userfront does not expose this by API; copy it from the dashboard (${where}).`);
45
+ }
46
+ b.add('differs', 'sessions', 'access and ID tokens', 'Userfront tokens carry no issuer claim, so the zero-logout bridge cannot verify them: users sign in once more after the switch.', 'migration bridge');
47
+ return b.result(`Userfront tenant ${snap.tenantId}`, { lazy: { preset: 'userfront', config: { tenant_id: snap.tenantId } } });
48
+ }
49
+ //# sourceMappingURL=userfront-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userfront-config.js","sourceRoot":"","sources":["../../../src/migrate/export/userfront-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { UserRecord } from '@atlasauth/migrate';
2
+ import { RecordSet, type Obj } from './record-set';
3
+ import { VendorHttp } from './vendor-http';
4
+ /**
5
+ * `atlas migrate export userfront` — a Userfront tenant onto the canonical
6
+ * bundle models, read with an admin API key (`uf_live_admin_…`) on this
7
+ * machine.
8
+ *
9
+ * - users (email, username, phone, names, image, custom `data`, confirmed
10
+ * flags, locked) with their roles on the tenant;
11
+ * - sub-tenants → organizations, with each member's role in them;
12
+ * - roles (the tenant's role list plus any a user holds).
13
+ *
14
+ * Userfront never returns password hashes, so passwords move by lazy
15
+ * migration: the `userfront` preset checks each password against Userfront's
16
+ * own sign-in on a member's first Atlas sign-in. Not exportable: second
17
+ * factors (re-enrol), passkeys (register again), social account ids (relink
18
+ * by verified email), pending invitations (create only, no listing).
19
+ */
20
+ export interface UserfrontExportOptions {
21
+ tenantId: string;
22
+ /** An admin key: `uf_live_admin_…` for the live tenant, `uf_test_admin_…` for test mode. */
23
+ apiKey: string;
24
+ apiBase?: string;
25
+ fetchImpl?: typeof fetch;
26
+ sleep?: (ms: number) => Promise<void>;
27
+ onProgress?: (message: string) => void;
28
+ }
29
+ export declare function checkTenantId(tenantId: string): string;
30
+ export declare function userfrontHttp(o: {
31
+ apiKey: string;
32
+ apiBase?: string;
33
+ fetchImpl?: typeof fetch;
34
+ sleep?: (ms: number) => Promise<void>;
35
+ }): VendorHttp;
36
+ export declare function exportUserfront(opts: UserfrontExportOptions): Promise<RecordSet>;
37
+ /** One Userfront user (users/find result) → a user record. */
38
+ export declare function mapUserfrontUser(u: Obj, tenantId: string): UserRecord | null;
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkTenantId = checkTenantId;
4
+ exports.userfrontHttp = userfrontHttp;
5
+ exports.exportUserfront = exportUserfront;
6
+ exports.mapUserfrontUser = mapUserfrontUser;
7
+ const record_set_1 = require("./record-set");
8
+ const translate_kit_1 = require("./translate-kit");
9
+ const vendor_http_1 = require("./vendor-http");
10
+ const API = 'https://api.userfront.com/v0';
11
+ const MAX_PAGES = 100_000;
12
+ /** First-factor strategies that are not a social login. */
13
+ const NON_SOCIAL = new Set(['password', 'link', 'verificationCode', 'totp', 'sso', 'saml', 'passkey', 'webauthn', 'email', 'phone']);
14
+ function checkTenantId(tenantId) {
15
+ const t = tenantId.trim();
16
+ if (!/^[A-Za-z0-9]{4,16}$/.test(t))
17
+ throw new Error(`Not a Userfront tenant id: ${tenantId}`);
18
+ return t;
19
+ }
20
+ function userfrontHttp(o) {
21
+ return new vendor_http_1.VendorHttp({
22
+ vendor: 'Userfront',
23
+ baseUrl: (o.apiBase ?? API).replace(/\/+$/, ''),
24
+ headers: { authorization: `Bearer ${o.apiKey}` },
25
+ fetchImpl: o.fetchImpl,
26
+ sleep: o.sleep,
27
+ });
28
+ }
29
+ async function exportUserfront(opts) {
30
+ const set = new record_set_1.RecordSet();
31
+ const tid = checkTenantId(opts.tenantId);
32
+ if (!/^uf_(test|live)_admin_/.test(opts.apiKey))
33
+ throw new Error('Userfront export needs an admin API key (uf_live_admin_… or uf_test_admin_…).');
34
+ const progress = opts.onProgress ?? (() => undefined);
35
+ const http = userfrontHttp(opts);
36
+ progress('organizations');
37
+ const orgIds = new Set();
38
+ await walk(async (page) => (await http.get(`/tenants/${tid}/tenants?page=${page}`)).body, (body) => (0, record_set_1.objs)(body?.results).concat((0, record_set_1.objs)(body?.tenants)), (body) => {
39
+ const n = body?.totalPages;
40
+ return typeof n === 'number' ? n : undefined;
41
+ }, (t) => {
42
+ const id = (0, record_set_1.str)(t.tenantId);
43
+ if (!id || id === tid || orgIds.has(id))
44
+ return false;
45
+ orgIds.add(id);
46
+ set.add('organization', (0, record_set_1.compact)({ id, name: (0, record_set_1.str)(t.name) ?? id, image_url: (0, record_set_1.str)(t.image), public_metadata: (0, record_set_1.bag)(t.data), created_at: (0, record_set_1.str)(t.createdAt) }), id);
47
+ return true;
48
+ });
49
+ progress('roles');
50
+ const roleNames = new Set();
51
+ const rolesBody = await optional(async () => (await http.get(`/tenants/${tid}/roles`)).body);
52
+ for (const r of (0, record_set_1.objs)(rolesBody?.roles)) {
53
+ const name = (0, record_set_1.str)(r.name);
54
+ if (name)
55
+ roleNames.add(name);
56
+ }
57
+ progress('users');
58
+ const seen = new Set();
59
+ let unknownOrgs = 0;
60
+ let mfa = 0;
61
+ let passkeys = 0;
62
+ let social = 0;
63
+ await walk((page) => findUsers(http, tid, page), (body) => (0, record_set_1.objs)(body?.results), (body) => {
64
+ const meta = body?.meta;
65
+ return (0, record_set_1.isObj)(meta) && typeof meta.totalPages === 'number' ? meta.totalPages : undefined;
66
+ }, (u) => {
67
+ const rawId = (0, record_set_1.str)(u.userId);
68
+ if (rawId && seen.has(rawId))
69
+ return false;
70
+ if (rawId)
71
+ seen.add(rawId);
72
+ const user = mapUserfrontUser(u, tid);
73
+ if (!user) {
74
+ set.omit('user', 'no email, phone number or username');
75
+ return true;
76
+ }
77
+ const authz = (0, record_set_1.isObj)(u.authorization) ? u.authorization : {};
78
+ const mine = authz[tid];
79
+ const own = (0, record_set_1.isObj)(mine) ? (0, record_set_1.strs)(mine.roles) : [];
80
+ if (own.length)
81
+ user.roles = own.map(translate_kit_1.keyOf);
82
+ for (const n of own)
83
+ roleNames.add(n);
84
+ set.add('user', user, user.id);
85
+ for (const [orgId, raw] of Object.entries(authz)) {
86
+ if (orgId === tid || !(0, record_set_1.isObj)(raw))
87
+ continue;
88
+ if (!orgIds.has(orgId)) {
89
+ unknownOrgs++;
90
+ continue;
91
+ }
92
+ const roles = (0, record_set_1.strs)(raw.roles).map(translate_kit_1.keyOf);
93
+ set.add('membership', { organization_id: orgId, user_id: user.id, role: roles[0] ?? 'member' }, `${orgId}:${user.id}`);
94
+ for (const r of (0, record_set_1.strs)(raw.roles))
95
+ roleNames.add(r);
96
+ if (roles.length > 1)
97
+ set.warn('Some organization members hold several Userfront roles; Atlas seats each member with one role (the first).');
98
+ }
99
+ const auth = (0, record_set_1.isObj)(u.authentication) ? u.authentication : {};
100
+ if (u.isMfaRequired === true || (0, record_set_1.objs)(auth.secondFactors).length > 0)
101
+ mfa++;
102
+ for (const f of (0, record_set_1.objs)(auth.firstFactors)) {
103
+ const strategy = (0, record_set_1.str)(f.strategy);
104
+ if (strategy && /passkey|webauthn/i.test(strategy))
105
+ passkeys++;
106
+ else if (strategy && !NON_SOCIAL.has(strategy))
107
+ social++;
108
+ }
109
+ return true;
110
+ });
111
+ if (unknownOrgs > 0) {
112
+ set.warn(`${unknownOrgs} organization grant(s) name a tenant that is not in the organization listing; those memberships were left out.`);
113
+ }
114
+ if (mfa > 0)
115
+ set.omit('mfa_factor', 'Userfront does not export second-factor secrets; members enrol again in Atlas', mfa);
116
+ if (passkeys > 0)
117
+ set.omit('passkey', 'Userfront does not export passkey public keys; register again in Atlas', passkeys);
118
+ if (social > 0)
119
+ set.omit('identity', "Userfront does not export social accounts' provider user ids: they relink by verified email on first social sign-in", social);
120
+ if (set.count('user') > 0) {
121
+ set.warn('Userfront never returns password hashes: turn on the userfront lazy-migration preset so each password moves on its first Atlas sign-in.');
122
+ }
123
+ for (const name of roleNames) {
124
+ const key = (0, translate_kit_1.keyOf)(name);
125
+ set.add('role', { key, name, scope: 'app' }, `app:${key}`);
126
+ if (orgIds.size > 0)
127
+ set.add('role', { key, name, scope: 'organization' }, `org:${key}`);
128
+ }
129
+ set.manifest = { origin: tid, settings: { tenant_id: tid } };
130
+ return set;
131
+ }
132
+ /**
133
+ * Walk a paged listing whose page numbering Userfront does not document: page
134
+ * 0 is probed, then pages go up from 1 until one is empty, past the reported
135
+ * total, or adds nobody new (a row seen twice is taken once).
136
+ */
137
+ async function walk(get, rowsOf, totalPages, take) {
138
+ for (let page = 0; page < MAX_PAGES; page++) {
139
+ const body = await optional(() => get(page));
140
+ const rows = rowsOf(body);
141
+ let fresh = 0;
142
+ for (const r of rows)
143
+ if (take(r))
144
+ fresh++;
145
+ const pages = totalPages(body);
146
+ if (page > 0 && (rows.length === 0 || (pages !== undefined && page > pages)))
147
+ break;
148
+ if (page >= 2 && fresh === 0)
149
+ break;
150
+ }
151
+ }
152
+ async function findUsers(http, tenantId, page) {
153
+ return (await http.post(`/tenants/${tenantId}/users/find`, { filters: {}, page, order: [['createdAt', 'ASC']] })).body;
154
+ }
155
+ /** One Userfront user (users/find result) → a user record. */
156
+ function mapUserfrontUser(u, tenantId) {
157
+ const id = (0, record_set_1.str)(u.userId);
158
+ if (!id)
159
+ return null;
160
+ const email = (0, record_set_1.str)(u.email)?.toLowerCase();
161
+ const phone = (0, record_set_1.e164)(u.phoneNumber);
162
+ const username = (0, record_set_1.str)(u.username);
163
+ const uuid = (0, record_set_1.str)(u.userUuid);
164
+ const user = (0, record_set_1.compact)({
165
+ id,
166
+ emails: email ? [{ email, verified: u.isEmailConfirmed === true || (u.isEmailConfirmed === undefined && u.isConfirmed === true), primary: true }] : [],
167
+ phones: phone ? [{ phone, verified: u.isPhoneNumberConfirmed === true, primary: !email }] : [],
168
+ username,
169
+ name: (0, record_set_1.str)(u.name),
170
+ image_url: (0, record_set_1.str)(u.image),
171
+ locked: u.locked === true ? true : undefined,
172
+ public_metadata: (0, record_set_1.bag)(u.data),
173
+ private_metadata: (0, record_set_1.bag)({ ...(uuid ? { userfront_user_uuid: uuid } : {}), userfront_tenant_id: tenantId }),
174
+ created_at: (0, record_set_1.str)(u.createdAt),
175
+ last_sign_in_at: (0, record_set_1.str)(u.lastActiveAt),
176
+ });
177
+ return user.emails?.length || user.phones?.length || user.username ? user : null;
178
+ }
179
+ async function optional(fn) {
180
+ try {
181
+ return await fn();
182
+ }
183
+ catch (err) {
184
+ if (err instanceof vendor_http_1.VendorApiError && [400, 403, 404, 405].includes(err.status))
185
+ return null;
186
+ throw err;
187
+ }
188
+ }
189
+ //# sourceMappingURL=userfront.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userfront.js","sourceRoot":"","sources":["../../../src/migrate/export/userfront.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { TranslationResult } from '../framework/plugin';
2
+ import { type Obj } from './record-set';
3
+ import { type VendorHttp } from './vendor-http';
4
+ /**
5
+ * `atlas migrate workos config` — what WorkOS's API exposes of an environment:
6
+ * roles and permissions (RBAC), the redirect URIs and CORS origins registered
7
+ * for AuthKit, and the SSO connections / Directory Sync directories (which
8
+ * move with the data export). Authentication methods, MFA policy, session and
9
+ * token lifetimes, branding, email templates, JWT templates and signup rules
10
+ * live only in the WorkOS dashboard: the report lists each as manual, with
11
+ * where to find it.
12
+ */
13
+ export interface WorkosConfigSnapshot {
14
+ clientId?: string;
15
+ roles: Obj[];
16
+ permissions: Obj[];
17
+ redirectUris: Obj[];
18
+ corsOrigins: Obj[];
19
+ connections: Obj[];
20
+ directories: number;
21
+ }
22
+ export declare function fetchWorkosConfig(http: VendorHttp, clientId?: string): Promise<WorkosConfigSnapshot>;
23
+ export declare function translateWorkosConfig(snap: WorkosConfigSnapshot): TranslationResult;