@atlasauth/cli 0.11.0 → 0.12.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 (127) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/args.d.ts +106 -0
  3. package/dist/args.js +38 -0
  4. package/dist/args.js.map +1 -1
  5. package/dist/commands/init.js +13 -8
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/migrate.d.ts +6 -2
  8. package/dist/commands/migrate.js +13 -3
  9. package/dist/commands/migrate.js.map +1 -1
  10. package/dist/help.d.ts +1 -1
  11. package/dist/help.js +38 -0
  12. package/dist/help.js.map +1 -1
  13. package/dist/migrate/auth0/plugin.d.ts +2 -0
  14. package/dist/migrate/auth0/plugin.js +126 -0
  15. package/dist/migrate/auth0/plugin.js.map +1 -0
  16. package/dist/migrate/clerk/plugin.d.ts +2 -0
  17. package/dist/migrate/clerk/plugin.js +76 -0
  18. package/dist/migrate/clerk/plugin.js.map +1 -0
  19. package/dist/migrate/descope/plugin.d.ts +2 -0
  20. package/dist/migrate/descope/plugin.js +83 -0
  21. package/dist/migrate/descope/plugin.js.map +1 -0
  22. package/dist/migrate/export/auth0-config.d.ts +29 -0
  23. package/dist/migrate/export/auth0-config.js +249 -0
  24. package/dist/migrate/export/auth0-config.js.map +1 -0
  25. package/dist/migrate/export/auth0.d.ts +62 -0
  26. package/dist/migrate/export/auth0.js +575 -0
  27. package/dist/migrate/export/auth0.js.map +1 -0
  28. package/dist/migrate/export/clerk-config.d.ts +26 -0
  29. package/dist/migrate/export/clerk-config.js +227 -0
  30. package/dist/migrate/export/clerk-config.js.map +1 -0
  31. package/dist/migrate/export/clerk.d.ts +46 -0
  32. package/dist/migrate/export/clerk.js +486 -0
  33. package/dist/migrate/export/clerk.js.map +1 -0
  34. package/dist/migrate/export/descope.d.ts +35 -0
  35. package/dist/migrate/export/descope.js +208 -0
  36. package/dist/migrate/export/descope.js.map +1 -0
  37. package/dist/migrate/export/fake-vendor.test-helper.d.ts +27 -0
  38. package/dist/migrate/export/fake-vendor.test-helper.js +41 -0
  39. package/dist/migrate/export/fake-vendor.test-helper.js.map +1 -0
  40. package/dist/migrate/export/frameworks/app-users.d.ts +42 -0
  41. package/dist/migrate/export/frameworks/app-users.js +161 -0
  42. package/dist/migrate/export/frameworks/app-users.js.map +1 -0
  43. package/dist/migrate/export/frameworks/authjs.d.ts +41 -0
  44. package/dist/migrate/export/frameworks/authjs.js +146 -0
  45. package/dist/migrate/export/frameworks/authjs.js.map +1 -0
  46. package/dist/migrate/export/frameworks/devise.d.ts +39 -0
  47. package/dist/migrate/export/frameworks/devise.js +218 -0
  48. package/dist/migrate/export/frameworks/devise.js.map +1 -0
  49. package/dist/migrate/export/frameworks/django.d.ts +45 -0
  50. package/dist/migrate/export/frameworks/django.js +315 -0
  51. package/dist/migrate/export/frameworks/django.js.map +1 -0
  52. package/dist/migrate/export/frameworks/lucia.d.ts +42 -0
  53. package/dist/migrate/export/frameworks/lucia.js +263 -0
  54. package/dist/migrate/export/frameworks/lucia.js.map +1 -0
  55. package/dist/migrate/export/frameworks/tables.d.ts +90 -0
  56. package/dist/migrate/export/frameworks/tables.js +325 -0
  57. package/dist/migrate/export/frameworks/tables.js.map +1 -0
  58. package/dist/migrate/export/frameworks/webauthn.d.ts +25 -0
  59. package/dist/migrate/export/frameworks/webauthn.js +130 -0
  60. package/dist/migrate/export/frameworks/webauthn.js.map +1 -0
  61. package/dist/migrate/export/kinde-descope-config.d.ts +38 -0
  62. package/dist/migrate/export/kinde-descope-config.js +172 -0
  63. package/dist/migrate/export/kinde-descope-config.js.map +1 -0
  64. package/dist/migrate/export/kinde.d.ts +57 -0
  65. package/dist/migrate/export/kinde.js +333 -0
  66. package/dist/migrate/export/kinde.js.map +1 -0
  67. package/dist/migrate/export/okta-config.d.ts +30 -0
  68. package/dist/migrate/export/okta-config.js +205 -0
  69. package/dist/migrate/export/okta-config.js.map +1 -0
  70. package/dist/migrate/export/okta.d.ts +43 -0
  71. package/dist/migrate/export/okta.js +337 -0
  72. package/dist/migrate/export/okta.js.map +1 -0
  73. package/dist/migrate/export/plugin-kit.d.ts +25 -0
  74. package/dist/migrate/export/plugin-kit.js +82 -0
  75. package/dist/migrate/export/plugin-kit.js.map +1 -0
  76. package/dist/migrate/export/record-set.d.ts +44 -0
  77. package/dist/migrate/export/record-set.js +98 -0
  78. package/dist/migrate/export/record-set.js.map +1 -0
  79. package/dist/migrate/export/translate-kit.d.ts +46 -0
  80. package/dist/migrate/export/translate-kit.js +148 -0
  81. package/dist/migrate/export/translate-kit.js.map +1 -0
  82. package/dist/migrate/export/vendor-http.d.ts +46 -0
  83. package/dist/migrate/export/vendor-http.js +138 -0
  84. package/dist/migrate/export/vendor-http.js.map +1 -0
  85. package/dist/migrate/export/zip.d.ts +8 -0
  86. package/dist/migrate/export/zip.js +66 -0
  87. package/dist/migrate/export/zip.js.map +1 -0
  88. package/dist/migrate/framework/builtins.d.ts +2 -0
  89. package/dist/migrate/framework/builtins.js +23 -0
  90. package/dist/migrate/framework/builtins.js.map +1 -0
  91. package/dist/migrate/framework/commands.d.ts +20 -0
  92. package/dist/migrate/framework/commands.js +58 -0
  93. package/dist/migrate/framework/commands.js.map +1 -0
  94. package/dist/migrate/framework/custom.d.ts +12 -0
  95. package/dist/migrate/framework/custom.js +96 -0
  96. package/dist/migrate/framework/custom.js.map +1 -0
  97. package/dist/migrate/framework/orchestrator.d.ts +113 -0
  98. package/dist/migrate/framework/orchestrator.js +531 -0
  99. package/dist/migrate/framework/orchestrator.js.map +1 -0
  100. package/dist/migrate/framework/plugin.d.ts +165 -0
  101. package/dist/migrate/framework/plugin.js +3 -0
  102. package/dist/migrate/framework/plugin.js.map +1 -0
  103. package/dist/migrate/framework/registry.d.ts +11 -0
  104. package/dist/migrate/framework/registry.js +44 -0
  105. package/dist/migrate/framework/registry.js.map +1 -0
  106. package/dist/migrate/framework/report.d.ts +17 -0
  107. package/dist/migrate/framework/report.js +103 -0
  108. package/dist/migrate/framework/report.js.map +1 -0
  109. package/dist/migrate/frameworks/plugins.d.ts +29 -0
  110. package/dist/migrate/frameworks/plugins.js +402 -0
  111. package/dist/migrate/frameworks/plugins.js.map +1 -0
  112. package/dist/migrate/frameworks/report.d.ts +92 -0
  113. package/dist/migrate/frameworks/report.js +207 -0
  114. package/dist/migrate/frameworks/report.js.map +1 -0
  115. package/dist/migrate/frameworks/translate-js.d.ts +5 -0
  116. package/dist/migrate/frameworks/translate-js.js +503 -0
  117. package/dist/migrate/frameworks/translate-js.js.map +1 -0
  118. package/dist/migrate/frameworks/translate-rails-django.d.ts +3 -0
  119. package/dist/migrate/frameworks/translate-rails-django.js +1391 -0
  120. package/dist/migrate/frameworks/translate-rails-django.js.map +1 -0
  121. package/dist/migrate/kinde/plugin.d.ts +2 -0
  122. package/dist/migrate/kinde/plugin.js +105 -0
  123. package/dist/migrate/kinde/plugin.js.map +1 -0
  124. package/dist/migrate/okta/plugin.d.ts +2 -0
  125. package/dist/migrate/okta/plugin.js +105 -0
  126. package/dist/migrate/okta/plugin.js.map +1 -0
  127. package/package.json +5 -4
@@ -0,0 +1,486 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.exportClerk = exportClerk;
4
+ exports.clerkPasswordHash = clerkPasswordHash;
5
+ exports.roleKey = roleKey;
6
+ exports.permissionKey = permissionKey;
7
+ const node_crypto_1 = require("node:crypto");
8
+ const csv_1 = require("../../import/csv");
9
+ const record_set_1 = require("./record-set");
10
+ const vendor_http_1 = require("./vendor-http");
11
+ const PAGE = 500;
12
+ async function exportClerk(opts) {
13
+ const set = new record_set_1.RecordSet();
14
+ if (!opts.secretKey && !opts.csv)
15
+ throw new Error('Clerk export needs the secret key (CLERK_SECRET_KEY) or the dashboard CSV export.');
16
+ const csvRows = opts.csv ? (0, csv_1.parseCsv)(opts.csv) : [];
17
+ const csvById = new Map(csvRows.filter((r) => (0, record_set_1.str)(r.id)).map((r) => [r.id, r]));
18
+ if (!opts.secretKey) {
19
+ // CSV only: users, passwords and TOTP — no orgs, social accounts or metadata.
20
+ set.warn('Exported from the dashboard CSV only: organizations, social accounts and metadata need the Backend API (pass the secret key).');
21
+ for (const row of csvRows)
22
+ addCsvUser(set, row);
23
+ finishManifest(set, null);
24
+ return set;
25
+ }
26
+ const http = new vendor_http_1.VendorHttp({
27
+ vendor: 'Clerk',
28
+ baseUrl: opts.apiUrl ?? 'https://api.clerk.com',
29
+ headers: { authorization: `Bearer ${opts.secretKey}` },
30
+ fetchImpl: opts.fetchImpl,
31
+ sleep: opts.sleep,
32
+ });
33
+ const progress = opts.onProgress ?? (() => undefined);
34
+ // Organizations first: memberships and invitations point at them.
35
+ progress('organizations');
36
+ const orgs = await listAll(http, '/v1/organizations?include_members_count=false');
37
+ for (const o of orgs) {
38
+ const id = (0, record_set_1.str)(o.id);
39
+ const name = (0, record_set_1.str)(o.name);
40
+ if (!id || !name)
41
+ continue;
42
+ const domains = await optionalList(http, `/v1/organizations/${id}/domains`);
43
+ set.add('organization', (0, record_set_1.compact)({
44
+ id,
45
+ name,
46
+ slug: (0, record_set_1.str)(o.slug),
47
+ image_url: (0, record_set_1.str)(o.image_url),
48
+ domains: domains.filter((d) => (0, record_set_1.isObj)(d.verification) && d.verification.status === 'verified').map((d) => (0, record_set_1.str)(d.name)).filter((d) => !!d),
49
+ max_members: typeof o.max_allowed_memberships === 'number' && o.max_allowed_memberships > 0 ? o.max_allowed_memberships : undefined,
50
+ public_metadata: (0, record_set_1.bag)(o.public_metadata),
51
+ private_metadata: (0, record_set_1.bag)(o.private_metadata),
52
+ created_at: typeof o.created_at === 'number' ? o.created_at : undefined,
53
+ }));
54
+ }
55
+ progress('roles');
56
+ for (const r of await optionalList(http, '/v1/organization_roles')) {
57
+ const key = (0, record_set_1.str)(r.key);
58
+ if (!key)
59
+ continue;
60
+ set.add('role', (0, record_set_1.compact)({
61
+ key: roleKey(key),
62
+ name: (0, record_set_1.str)(r.name),
63
+ description: (0, record_set_1.str)(r.description),
64
+ scope: 'organization',
65
+ permissions: (0, record_set_1.objs)(r.permissions).map((p) => (0, record_set_1.str)(p.key)).filter((p) => !!p).map(permissionKey),
66
+ }), key);
67
+ }
68
+ progress('users');
69
+ const users = await listAll(http, '/v1/users?order_by=%2Bcreated_at');
70
+ const apiIds = new Set();
71
+ for (const u of users) {
72
+ const id = (0, record_set_1.str)(u.id);
73
+ if (!id)
74
+ continue;
75
+ apiIds.add(id);
76
+ addApiUser(set, u, csvById.get(id));
77
+ }
78
+ // A CSV row the API no longer lists (deleted since the export) is skipped.
79
+ const stale = csvRows.filter((r) => (0, record_set_1.str)(r.id) && !apiIds.has(r.id)).length;
80
+ if (stale)
81
+ set.omit('user', 'in the CSV export but no longer in Clerk (deleted since)', stale);
82
+ if (!opts.csv && users.some((u) => u.password_enabled === true)) {
83
+ set.warn('No password digests: Clerk only exports them in the dashboard CSV (Users → Export). Pass it with --clerk-csv, or enable lazy migration so passwords move on first sign-in.');
84
+ }
85
+ progress('memberships');
86
+ for (const o of orgs) {
87
+ const orgId = (0, record_set_1.str)(o.id);
88
+ if (!orgId)
89
+ continue;
90
+ for (const m of await listAll(http, `/v1/organizations/${orgId}/memberships`)) {
91
+ const userId = (0, record_set_1.str)((0, record_set_1.isObj)(m.public_user_data) ? m.public_user_data.user_id : undefined);
92
+ const role = (0, record_set_1.str)(m.role);
93
+ if (!userId || !role || !apiIds.has(userId))
94
+ continue;
95
+ set.add('membership', (0, record_set_1.compact)({ id: (0, record_set_1.str)(m.id), organization_id: orgId, user_id: userId, role: roleKey(role), created_at: num(m.created_at) }), `${orgId}:${userId}`);
96
+ }
97
+ }
98
+ progress('invitations');
99
+ for (const o of orgs) {
100
+ const orgId = (0, record_set_1.str)(o.id);
101
+ if (!orgId)
102
+ continue;
103
+ for (const inv of await listAll(http, `/v1/organizations/${orgId}/invitations?status=pending`)) {
104
+ const id = (0, record_set_1.str)(inv.id);
105
+ const email = (0, record_set_1.str)(inv.email_address);
106
+ if (!id || !email)
107
+ continue;
108
+ set.add('invitation', (0, record_set_1.compact)({ id, organization_id: orgId, email, role: (0, record_set_1.str)(inv.role) ? roleKey((0, record_set_1.str)(inv.role)) : undefined, status: 'pending', expires_at: num(inv.expires_at), created_at: num(inv.created_at) }));
109
+ }
110
+ }
111
+ for (const inv of await optionalList(http, '/v1/invitations?status=pending')) {
112
+ const id = (0, record_set_1.str)(inv.id);
113
+ const email = (0, record_set_1.str)(inv.email_address);
114
+ if (id && email)
115
+ set.add('invitation', (0, record_set_1.compact)({ id, email, status: 'pending', expires_at: num(inv.expires_at), created_at: num(inv.created_at) }));
116
+ }
117
+ if (!opts.skipApiKeys) {
118
+ progress('api keys');
119
+ await addApiKeys(set, http, apiIds, new Set(orgs.map((o) => (0, record_set_1.str)(o.id)).filter((x) => !!x)));
120
+ }
121
+ progress('enterprise connections');
122
+ await addSsoConnections(set, http);
123
+ progress('signing keys');
124
+ const jwks = await optionalGet(http, '/v1/jwks');
125
+ for (const k of (0, record_set_1.objs)(jwks?.keys)) {
126
+ const kid = (0, record_set_1.str)(k.kid);
127
+ if (kid)
128
+ set.add('jwks', { kid, jwk: k });
129
+ }
130
+ finishManifest(set, opts.apiUrl ?? 'https://api.clerk.com');
131
+ return set;
132
+ }
133
+ function finishManifest(set, origin) {
134
+ const providers = new Set(set.list('identity').map((i) => i.provider));
135
+ set.manifest = { ...set.manifest, origin, providers: [...providers].sort() };
136
+ set.warn('Clerk does not export passkeys or backup codes: those users register a passkey / new codes after the move.');
137
+ }
138
+ // ── users ───────────────────────────────────────────────────────────────────
139
+ function addApiUser(set, u, csv) {
140
+ const id = (0, record_set_1.str)(u.id);
141
+ const emails = (0, record_set_1.objs)(u.email_addresses)
142
+ .filter((e) => (0, record_set_1.str)(e.email_address))
143
+ .map((e) => ({
144
+ email: (0, record_set_1.str)(e.email_address).toLowerCase(),
145
+ verified: (0, record_set_1.isObj)(e.verification) && e.verification.status === 'verified',
146
+ primary: e.id === u.primary_email_address_id,
147
+ }));
148
+ const phones = (0, record_set_1.objs)(u.phone_numbers)
149
+ .map((p) => ({ phone: (0, record_set_1.e164)(p.phone_number), verified: (0, record_set_1.isObj)(p.verification) && p.verification.status === 'verified', primary: p.id === u.primary_phone_number_id }))
150
+ .filter((p) => !!p.phone);
151
+ const user = (0, record_set_1.compact)({
152
+ id,
153
+ emails,
154
+ phones,
155
+ username: (0, record_set_1.str)(u.username),
156
+ first_name: (0, record_set_1.str)(u.first_name),
157
+ last_name: (0, record_set_1.str)(u.last_name),
158
+ image_url: u.has_image === false ? undefined : (0, record_set_1.str)(u.image_url),
159
+ banned: u.banned === true ? true : undefined,
160
+ locked: u.locked === true ? true : undefined,
161
+ public_metadata: (0, record_set_1.bag)(u.public_metadata),
162
+ private_metadata: (0, record_set_1.bag)(u.private_metadata),
163
+ unsafe_metadata: (0, record_set_1.bag)(u.unsafe_metadata),
164
+ created_at: num(u.created_at),
165
+ last_sign_in_at: num(u.last_sign_in_at),
166
+ });
167
+ if (csv)
168
+ attachCsvPassword(set, user, csv);
169
+ else if (u.password_enabled === true)
170
+ set.omit('password', 'password digests are only in the dashboard CSV export');
171
+ if (!user.emails?.length && !user.phones?.length && !user.username) {
172
+ // A web3-wallet-only user: Clerk's wallet sign-in has no Atlas identifier to carry.
173
+ set.omit('user', 'no email, phone or username (wallet-only users)');
174
+ return;
175
+ }
176
+ set.add('user', user);
177
+ for (const ext of (0, record_set_1.objs)(u.external_accounts)) {
178
+ const provider = (0, record_set_1.str)(ext.provider);
179
+ const sub = (0, record_set_1.str)(ext.provider_user_id) ?? (0, record_set_1.str)(ext.external_id);
180
+ if (!provider || !sub)
181
+ continue;
182
+ set.add('identity', (0, record_set_1.compact)({
183
+ id: (0, record_set_1.str)(ext.id),
184
+ user_id: id,
185
+ provider,
186
+ provider_user_id: sub,
187
+ kind: 'oauth',
188
+ email: (0, record_set_1.str)(ext.email_address),
189
+ email_verified: (0, record_set_1.isObj)(ext.verification) ? ext.verification.status === 'verified' : undefined,
190
+ scopes: (0, record_set_1.str)(ext.approved_scopes)?.split(/\s+/),
191
+ profile: (0, record_set_1.bag)((0, record_set_1.compact)({ first_name: (0, record_set_1.str)(ext.first_name), last_name: (0, record_set_1.str)(ext.last_name), image_url: (0, record_set_1.str)(ext.image_url), username: (0, record_set_1.str)(ext.username) })),
192
+ }));
193
+ }
194
+ for (const ent of [...(0, record_set_1.objs)(u.enterprise_accounts), ...(0, record_set_1.objs)(u.saml_accounts)]) {
195
+ const conn = (0, record_set_1.isObj)(ent.enterprise_connection) ? ent.enterprise_connection : (0, record_set_1.isObj)(ent.saml_connection) ? ent.saml_connection : undefined;
196
+ const sub = (0, record_set_1.str)(ent.provider_user_id);
197
+ if (!sub || ent.active === false)
198
+ continue;
199
+ set.add('identity', (0, record_set_1.compact)({
200
+ id: (0, record_set_1.str)(ent.id),
201
+ user_id: id,
202
+ provider: (0, record_set_1.str)(ent.provider) ?? 'saml',
203
+ provider_user_id: sub,
204
+ kind: (0, record_set_1.str)(ent.protocol) === 'oauth' || (0, record_set_1.str)(ent.provider)?.startsWith('oidc') ? 'oidc' : 'saml',
205
+ sso_connection_id: (0, record_set_1.str)(conn?.id),
206
+ email: (0, record_set_1.str)(ent.email_address),
207
+ }), `ent:${(0, record_set_1.str)(ent.id) ?? sub}`);
208
+ }
209
+ const totp = csv ? (0, record_set_1.str)(csv.totp_secret) : undefined;
210
+ if (totp)
211
+ set.add('mfa_factor', { user_id: id, type: 'totp', secret_base32: totp.replace(/\s+/g, '').toUpperCase(), digits: 6, period: 30, algorithm: 'SHA1', verified: true });
212
+ else if (u.totp_enabled === true)
213
+ set.omit('mfa_factor', 'TOTP secrets are only in the dashboard CSV export');
214
+ if (u.backup_code_enabled === true)
215
+ set.omit('mfa_factor', 'Clerk does not export backup codes');
216
+ if ((0, record_set_1.objs)(u.passkeys).length)
217
+ set.omit('passkey', 'Clerk does not export passkey public keys', (0, record_set_1.objs)(u.passkeys).length);
218
+ }
219
+ /** A user from the CSV alone (no API access). */
220
+ function addCsvUser(set, r) {
221
+ const id = (0, record_set_1.str)(r.id);
222
+ if (!id)
223
+ return;
224
+ const verified = split(r.verified_email_addresses);
225
+ const unverified = split(r.unverified_email_addresses);
226
+ const primary = (0, record_set_1.str)(r.primary_email_address)?.toLowerCase();
227
+ const emails = [...new Set([...(primary ? [primary] : []), ...verified, ...unverified].map((e) => e.toLowerCase()))].map((email) => ({
228
+ email,
229
+ verified: verified.map((e) => e.toLowerCase()).includes(email),
230
+ primary: email === primary,
231
+ }));
232
+ const vPhones = split(r.verified_phone_numbers);
233
+ const phones = [...new Set([(0, record_set_1.str)(r.primary_phone_number), ...vPhones, ...split(r.unverified_phone_numbers)].filter((p) => !!p))]
234
+ .map((p) => ({ phone: (0, record_set_1.e164)(p), verified: vPhones.includes(p), primary: p === (0, record_set_1.str)(r.primary_phone_number) }))
235
+ .filter((p) => !!p.phone);
236
+ const user = (0, record_set_1.compact)({ id, emails, phones, username: (0, record_set_1.str)(r.username), first_name: (0, record_set_1.str)(r.first_name), last_name: (0, record_set_1.str)(r.last_name) });
237
+ attachCsvPassword(set, user, r);
238
+ if (!user.emails?.length && !user.phones?.length && !user.username) {
239
+ set.omit('user', 'no email, phone or username');
240
+ return;
241
+ }
242
+ set.add('user', user);
243
+ const totp = (0, record_set_1.str)(r.totp_secret);
244
+ if (totp)
245
+ set.add('mfa_factor', { user_id: id, type: 'totp', secret_base32: totp.replace(/\s+/g, '').toUpperCase(), digits: 6, period: 30, algorithm: 'SHA1', verified: true });
246
+ }
247
+ function attachCsvPassword(set, user, r) {
248
+ const digest = (0, record_set_1.str)(r.password_digest);
249
+ if (!digest)
250
+ return;
251
+ const mapped = clerkPasswordHash((0, record_set_1.str)(r.password_hasher) ?? 'bcrypt', digest);
252
+ if ('reason' in mapped) {
253
+ set.omit('password', mapped.reason);
254
+ return;
255
+ }
256
+ user.password = mapped;
257
+ }
258
+ const split = (v) => (v ?? '').split(/[|,;]/).map((s) => s.trim()).filter(Boolean);
259
+ /**
260
+ * A Clerk `password_digest` + `password_hasher` → the bundle's password hash
261
+ * (an Atlas hash-registry algorithm with its parameters). Formats per Clerk's
262
+ * `createUser` reference. Returns a reason when the digest cannot move: those
263
+ * users sign in through lazy migration (Clerk's verify_password) instead.
264
+ */
265
+ function clerkPasswordHash(hasher, digest) {
266
+ const h = hasher.trim().toLowerCase();
267
+ const parts = digest.split('$');
268
+ const int = (v) => (v && /^\d+$/.test(v) ? Number(v) : NaN);
269
+ const isHex = (v) => v.length % 2 === 0 && /^[0-9a-f]+$/i.test(v);
270
+ switch (h) {
271
+ case 'bcrypt':
272
+ return { algorithm: 'bcrypt', hash: digest };
273
+ case 'bcrypt_sha256_django':
274
+ return { algorithm: 'bcrypt_sha256_django', hash: digest };
275
+ case 'argon2i':
276
+ case 'argon2id':
277
+ return { algorithm: 'argon2', hash: digest };
278
+ case 'phpass':
279
+ case 'md5_phpass':
280
+ return { algorithm: 'phpass', hash: digest };
281
+ case 'ldap_ssha':
282
+ return { algorithm: 'ldap_ssha', hash: digest };
283
+ case 'md5':
284
+ case 'sha256':
285
+ return /^[0-9a-f]+$/i.test(digest) ? { algorithm: h, hash: digest.toLowerCase(), params: { encoding: 'hex' } } : { reason: `${h} digest is not hex` };
286
+ case 'md5_salted':
287
+ case 'sha256_salted':
288
+ // Clerk does not document whether the salt is prepended or appended; a
289
+ // guess that is wrong would lock the user out, so these verify lazily.
290
+ return { reason: `${h}: Clerk does not document the salt position; these users move through lazy migration` };
291
+ case 'pbkdf2_sha256_django':
292
+ return { algorithm: 'pbkdf2_django', hash: digest };
293
+ case 'pbkdf2_sha256': {
294
+ // pbkdf2_sha256$<iterations>$<base64 salt>$<base64 hash>
295
+ const [, it, salt, hash] = parts;
296
+ if (parts.length !== 4 || !Number.isFinite(int(it)) || !salt || !hash)
297
+ return { reason: 'malformed pbkdf2_sha256 digest' };
298
+ return { algorithm: 'pbkdf2', hash, salt, params: { digest: 'sha256', iterations: int(it), encoding: 'base64', salt_encoding: 'base64' } };
299
+ }
300
+ case 'pbkdf2_sha1': {
301
+ // pbkdf2_sha1$<iterations>$<salt>$<hex hash>[$<key length>]; the salt is
302
+ // hex when it parses as hex, raw bytes otherwise.
303
+ const [, it, salt, hash, keylen] = parts;
304
+ if ((parts.length !== 4 && parts.length !== 5) || !Number.isFinite(int(it)) || !salt || !hash || !isHex(hash))
305
+ return { reason: 'malformed pbkdf2_sha1 digest' };
306
+ const params = { digest: 'sha1', iterations: int(it), encoding: 'hex', salt_encoding: isHex(salt) ? 'hex' : 'utf8' };
307
+ if (keylen && Number.isFinite(int(keylen)))
308
+ params.key_length = int(keylen);
309
+ return { algorithm: 'pbkdf2', hash, salt, params };
310
+ }
311
+ case 'pbkdf2_sha512':
312
+ case 'pbkdf2_sha512_hex': {
313
+ const [, it, salt, hash] = parts;
314
+ if (parts.length !== 4 || !Number.isFinite(int(it)) || !salt || !hash || !isHex(hash))
315
+ return { reason: `malformed ${h} digest` };
316
+ return { algorithm: 'pbkdf2', hash, salt, params: { digest: 'sha512', iterations: int(it), encoding: 'hex', salt_encoding: h === 'pbkdf2_sha512_hex' ? 'hex' : 'utf8' } };
317
+ }
318
+ case 'scrypt_firebase': {
319
+ // <hash>$<salt>$<signer key>$<salt separator>$<rounds>$<memory cost>
320
+ const [hash, salt, signerKey, saltSeparator, rounds, mem] = parts;
321
+ if (parts.length !== 6 || !hash || !signerKey)
322
+ return { reason: 'malformed scrypt_firebase digest' };
323
+ return {
324
+ algorithm: 'scrypt_firebase',
325
+ hash,
326
+ salt: salt ?? '',
327
+ params: { signer_key: signerKey, salt_separator: saltSeparator ?? '', rounds: int(rounds), mem_cost: int(mem) },
328
+ };
329
+ }
330
+ case 'scrypt_werkzeug': {
331
+ // Werkzeug writes `scrypt:N:r:p$salt$<hex>`; Clerk documents the layout with
332
+ // a leading `$` and a base64 hash. Normalise to Werkzeug's own form.
333
+ const m = /^\$?(scrypt:\d+:\d+:\d+)\$([^$]+)\$([^$]+)$/.exec(digest);
334
+ if (!m)
335
+ return { reason: 'malformed scrypt_werkzeug digest' };
336
+ const hex = isHex(m[3]) ? m[3].toLowerCase() : Buffer.from(m[3], 'base64').toString('hex');
337
+ return hex ? { algorithm: 'scrypt_werkzeug', hash: `${m[1]}$${m[2]}$${hex}` } : { reason: 'malformed scrypt_werkzeug digest' };
338
+ }
339
+ case 'sha512_symfony': {
340
+ // sha512_symfony$<iterations>$<salt>$<base64 hash>
341
+ const [, it, salt, hash] = parts;
342
+ if (parts.length !== 4 || !Number.isFinite(int(it)) || salt === undefined || !hash)
343
+ return { reason: 'malformed sha512_symfony digest' };
344
+ return { algorithm: 'sha512_symfony', hash, salt, params: { iterations: int(it), encoding: 'base64' } };
345
+ }
346
+ case 'bcrypt_peppered':
347
+ return { reason: 'bcrypt_peppered: the pepper never leaves Clerk; these users move through lazy migration' };
348
+ case 'awscognito':
349
+ return { reason: 'awscognito: the password still lives in Amazon Cognito; these users move through lazy migration' };
350
+ default:
351
+ return { reason: `password hasher "${hasher}" is not supported; these users move through lazy migration` };
352
+ }
353
+ }
354
+ // ── organizations, keys, connections ────────────────────────────────────────
355
+ /** Clerk role keys carry an `org:` prefix; the bundle uses the bare key. */
356
+ function roleKey(key) {
357
+ return key.replace(/^org:/, '');
358
+ }
359
+ /** `org:invoices:read` → `invoices:read`; system permissions keep their `sys_` key. */
360
+ function permissionKey(key) {
361
+ return key.replace(/^org:/, '');
362
+ }
363
+ async function addApiKeys(set, http, users, orgs) {
364
+ let keys;
365
+ try {
366
+ keys = await listAll(http, '/v1/api_keys', 100);
367
+ }
368
+ catch (err) {
369
+ if (err instanceof vendor_http_1.VendorApiError && (err.status === 404 || err.status === 403))
370
+ return;
371
+ throw err;
372
+ }
373
+ for (const k of keys) {
374
+ const id = (0, record_set_1.str)(k.id);
375
+ const subject = (0, record_set_1.str)(k.subject);
376
+ if (!id || !subject || k.revoked === true)
377
+ continue;
378
+ // Clerk returns the secret on request: Atlas stores only its sha256, so
379
+ // the key keeps working after the move.
380
+ const secret = await optionalGet(http, `/v1/api_keys/${id}/secret`);
381
+ const value = (0, record_set_1.str)(secret?.secret);
382
+ if (!value) {
383
+ set.omit('api_key', 'secret not retrievable; reissue');
384
+ continue;
385
+ }
386
+ set.add('api_key', (0, record_set_1.compact)({
387
+ id,
388
+ user_id: users.has(subject) ? subject : undefined,
389
+ organization_id: orgs.has(subject) ? subject : undefined,
390
+ name: (0, record_set_1.str)(k.name),
391
+ hash: (0, node_crypto_1.createHash)('sha256').update(value, 'utf8').digest('hex'),
392
+ hash_algorithm: 'sha256',
393
+ start: value.slice(0, 8),
394
+ scopes: (0, record_set_1.strs)(k.scopes),
395
+ expires_at: num(k.expiration),
396
+ last_used_at: num(k.last_used_at),
397
+ created_at: num(k.created_at),
398
+ }));
399
+ }
400
+ }
401
+ async function addSsoConnections(set, http) {
402
+ let conns = await optionalList(http, '/v1/enterprise_connections');
403
+ if (!conns.length)
404
+ conns = await optionalList(http, '/v1/saml_connections');
405
+ for (const c of conns) {
406
+ const id = (0, record_set_1.str)(c.id);
407
+ if (!id)
408
+ continue;
409
+ const saml = (0, record_set_1.isObj)(c.saml_connection) ? c.saml_connection : c;
410
+ const oidc = (0, record_set_1.isObj)(c.oauth_config) ? c.oauth_config : (0, record_set_1.isObj)(c.oidc_connection) ? c.oidc_connection : undefined;
411
+ const protocol = oidc && !(0, record_set_1.str)(saml.idp_sso_url) ? 'oidc' : 'saml';
412
+ const domains = [...(0, record_set_1.strs)(c.domains), ...((0, record_set_1.str)(c.domain) ? [(0, record_set_1.str)(c.domain)] : [])];
413
+ const mapping = (0, record_set_1.isObj)(saml.attribute_mapping) ? saml.attribute_mapping : undefined;
414
+ set.add('sso_connection', (0, record_set_1.compact)({
415
+ id,
416
+ name: (0, record_set_1.str)(c.name),
417
+ organization_id: (0, record_set_1.str)(c.organization_id),
418
+ protocol: protocol,
419
+ domains: [...new Set(domains)],
420
+ enabled: c.active !== false,
421
+ saml: protocol === 'saml'
422
+ ? (0, record_set_1.compact)({
423
+ idp_entity_id: (0, record_set_1.str)(saml.idp_entity_id),
424
+ idp_sso_url: (0, record_set_1.str)(saml.idp_sso_url),
425
+ idp_certificate: (0, record_set_1.str)(saml.idp_certificate),
426
+ idp_metadata_url: (0, record_set_1.str)(saml.idp_metadata_url),
427
+ idp_metadata_xml: (0, record_set_1.str)(saml.idp_metadata),
428
+ sp_entity_id: (0, record_set_1.str)(saml.sp_entity_id),
429
+ sp_acs_url: (0, record_set_1.str)(saml.acs_url),
430
+ attribute_mapping: mapping
431
+ ? Object.fromEntries(Object.entries(mapping).filter(([, v]) => typeof v === 'string' && v))
432
+ : undefined,
433
+ })
434
+ : undefined,
435
+ oidc: protocol === 'oidc' && oidc
436
+ ? (0, record_set_1.compact)({ discovery_url: (0, record_set_1.str)(oidc.discovery_url), issuer: (0, record_set_1.str)(oidc.issuer), client_id: (0, record_set_1.str)(oidc.client_id), scopes: (0, record_set_1.str)(oidc.scopes)?.split(/\s+/) })
437
+ : undefined,
438
+ }));
439
+ if (protocol === 'oidc')
440
+ set.warn(`Enterprise OIDC connection ${(0, record_set_1.str)(c.name) ?? id}: Clerk does not return its client secret; enter it in Atlas after the import.`);
441
+ }
442
+ }
443
+ // ── paging ──────────────────────────────────────────────────────────────────
444
+ const num = (v) => (typeof v === 'number' && Number.isFinite(v) && v > 0 ? v : undefined);
445
+ /** Clerk lists answer either a bare array or `{ data, total_count }`. */
446
+ function rowsOf(body) {
447
+ if (Array.isArray(body))
448
+ return body.filter(record_set_1.isObj);
449
+ if ((0, record_set_1.isObj)(body) && Array.isArray(body.data))
450
+ return body.data.filter(record_set_1.isObj);
451
+ return [];
452
+ }
453
+ async function listAll(http, path, limit = PAGE) {
454
+ const out = [];
455
+ const sep = path.includes('?') ? '&' : '?';
456
+ for (let offset = 0;; offset += limit) {
457
+ const { body } = await http.get(`${path}${sep}limit=${limit}&offset=${offset}`);
458
+ const rows = rowsOf(body);
459
+ out.push(...rows);
460
+ const total = (0, record_set_1.isObj)(body) && typeof body.total_count === 'number' ? body.total_count : undefined;
461
+ if (rows.length < limit || (total !== undefined && out.length >= total))
462
+ return out;
463
+ }
464
+ }
465
+ /** A list that may not exist on this instance's plan or API version: empty instead of an error. */
466
+ async function optionalList(http, path) {
467
+ try {
468
+ return await listAll(http, path);
469
+ }
470
+ catch (err) {
471
+ if (err instanceof vendor_http_1.VendorApiError && [400, 402, 403, 404, 410, 422].includes(err.status))
472
+ return [];
473
+ throw err;
474
+ }
475
+ }
476
+ async function optionalGet(http, path) {
477
+ try {
478
+ return (await http.get(path)).body;
479
+ }
480
+ catch (err) {
481
+ if (err instanceof vendor_http_1.VendorApiError && [400, 402, 403, 404, 410, 422].includes(err.status))
482
+ return null;
483
+ throw err;
484
+ }
485
+ }
486
+ //# sourceMappingURL=clerk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clerk.js","sourceRoot":"","sources":["../../../src/migrate/export/clerk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { UserRecord } from '@atlasauth/migrate';
2
+ import { RecordSet, type Obj } from './record-set';
3
+ /**
4
+ * `atlas migrate export descope` — a Descope project onto the canonical
5
+ * bundle models, read with a management key on this machine.
6
+ *
7
+ * - users (login ids, verified email / phone, names, custom attributes,
8
+ * project roles, tenant memberships with their roles); test users skipped;
9
+ * - tenants → organizations (self-provisioning domains included), roles and
10
+ * permissions, and each tenant's SSO configuration (SAML or OIDC);
11
+ * - password hashes: Descope does not return them by API. Its support team
12
+ * can export them (Descope stores Argon2id); pass that file with
13
+ * --descope-hashes-file. Otherwise turn on the `descope` lazy-migration preset: Atlas
14
+ * checks each password against Descope's password sign-in on first use.
15
+ *
16
+ * Descope does not export TOTP seeds, passkeys or access-key secrets; those
17
+ * are re-enrolled / reissued. Sessions are Descope JWTs, bridged by the
18
+ * `descope` bridge preset (project JWKS).
19
+ */
20
+ export interface DescopeExportOptions {
21
+ projectId: string;
22
+ managementKey: string;
23
+ /** API base, for regional or custom-domain projects (default https://api.descope.com). */
24
+ baseUrl?: string;
25
+ /** The password-hash export from Descope support (CSV or NDJSON). */
26
+ hashesText?: string;
27
+ fetchImpl?: typeof fetch;
28
+ sleep?: (ms: number) => Promise<void>;
29
+ onProgress?: (message: string) => void;
30
+ }
31
+ export declare function exportDescope(opts: DescopeExportOptions): Promise<RecordSet>;
32
+ /** One Descope user (search result) → a user record. */
33
+ export declare function mapDescopeUser(u: Obj): UserRecord | null;
34
+ /** Descope role names are free text: `Tenant Admin` → `tenant_admin`. */
35
+ export declare function roleKey(name: string): string;