@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.
- package/CHANGELOG.md +9 -0
- package/dist/args.d.ts +106 -0
- package/dist/args.js +38 -0
- package/dist/args.js.map +1 -1
- package/dist/commands/init.js +13 -8
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.d.ts +6 -2
- package/dist/commands/migrate.js +13 -3
- package/dist/commands/migrate.js.map +1 -1
- package/dist/help.d.ts +1 -1
- package/dist/help.js +38 -0
- package/dist/help.js.map +1 -1
- package/dist/migrate/auth0/plugin.d.ts +2 -0
- package/dist/migrate/auth0/plugin.js +126 -0
- package/dist/migrate/auth0/plugin.js.map +1 -0
- package/dist/migrate/clerk/plugin.d.ts +2 -0
- package/dist/migrate/clerk/plugin.js +76 -0
- package/dist/migrate/clerk/plugin.js.map +1 -0
- package/dist/migrate/descope/plugin.d.ts +2 -0
- package/dist/migrate/descope/plugin.js +83 -0
- package/dist/migrate/descope/plugin.js.map +1 -0
- package/dist/migrate/export/auth0-config.d.ts +29 -0
- package/dist/migrate/export/auth0-config.js +249 -0
- package/dist/migrate/export/auth0-config.js.map +1 -0
- package/dist/migrate/export/auth0.d.ts +62 -0
- package/dist/migrate/export/auth0.js +575 -0
- package/dist/migrate/export/auth0.js.map +1 -0
- package/dist/migrate/export/clerk-config.d.ts +26 -0
- package/dist/migrate/export/clerk-config.js +227 -0
- package/dist/migrate/export/clerk-config.js.map +1 -0
- package/dist/migrate/export/clerk.d.ts +46 -0
- package/dist/migrate/export/clerk.js +486 -0
- package/dist/migrate/export/clerk.js.map +1 -0
- package/dist/migrate/export/descope.d.ts +35 -0
- package/dist/migrate/export/descope.js +208 -0
- package/dist/migrate/export/descope.js.map +1 -0
- package/dist/migrate/export/fake-vendor.test-helper.d.ts +27 -0
- package/dist/migrate/export/fake-vendor.test-helper.js +41 -0
- package/dist/migrate/export/fake-vendor.test-helper.js.map +1 -0
- package/dist/migrate/export/frameworks/app-users.d.ts +42 -0
- package/dist/migrate/export/frameworks/app-users.js +161 -0
- package/dist/migrate/export/frameworks/app-users.js.map +1 -0
- package/dist/migrate/export/frameworks/authjs.d.ts +41 -0
- package/dist/migrate/export/frameworks/authjs.js +146 -0
- package/dist/migrate/export/frameworks/authjs.js.map +1 -0
- package/dist/migrate/export/frameworks/devise.d.ts +39 -0
- package/dist/migrate/export/frameworks/devise.js +218 -0
- package/dist/migrate/export/frameworks/devise.js.map +1 -0
- package/dist/migrate/export/frameworks/django.d.ts +45 -0
- package/dist/migrate/export/frameworks/django.js +315 -0
- package/dist/migrate/export/frameworks/django.js.map +1 -0
- package/dist/migrate/export/frameworks/lucia.d.ts +42 -0
- package/dist/migrate/export/frameworks/lucia.js +263 -0
- package/dist/migrate/export/frameworks/lucia.js.map +1 -0
- package/dist/migrate/export/frameworks/tables.d.ts +90 -0
- package/dist/migrate/export/frameworks/tables.js +325 -0
- package/dist/migrate/export/frameworks/tables.js.map +1 -0
- package/dist/migrate/export/frameworks/webauthn.d.ts +25 -0
- package/dist/migrate/export/frameworks/webauthn.js +130 -0
- package/dist/migrate/export/frameworks/webauthn.js.map +1 -0
- package/dist/migrate/export/kinde-descope-config.d.ts +38 -0
- package/dist/migrate/export/kinde-descope-config.js +172 -0
- package/dist/migrate/export/kinde-descope-config.js.map +1 -0
- package/dist/migrate/export/kinde.d.ts +57 -0
- package/dist/migrate/export/kinde.js +333 -0
- package/dist/migrate/export/kinde.js.map +1 -0
- package/dist/migrate/export/okta-config.d.ts +30 -0
- package/dist/migrate/export/okta-config.js +205 -0
- package/dist/migrate/export/okta-config.js.map +1 -0
- package/dist/migrate/export/okta.d.ts +43 -0
- package/dist/migrate/export/okta.js +337 -0
- package/dist/migrate/export/okta.js.map +1 -0
- package/dist/migrate/export/plugin-kit.d.ts +25 -0
- package/dist/migrate/export/plugin-kit.js +82 -0
- package/dist/migrate/export/plugin-kit.js.map +1 -0
- package/dist/migrate/export/record-set.d.ts +44 -0
- package/dist/migrate/export/record-set.js +98 -0
- package/dist/migrate/export/record-set.js.map +1 -0
- package/dist/migrate/export/translate-kit.d.ts +46 -0
- package/dist/migrate/export/translate-kit.js +148 -0
- package/dist/migrate/export/translate-kit.js.map +1 -0
- package/dist/migrate/export/vendor-http.d.ts +46 -0
- package/dist/migrate/export/vendor-http.js +138 -0
- package/dist/migrate/export/vendor-http.js.map +1 -0
- package/dist/migrate/export/zip.d.ts +8 -0
- package/dist/migrate/export/zip.js +66 -0
- package/dist/migrate/export/zip.js.map +1 -0
- package/dist/migrate/framework/builtins.d.ts +2 -0
- package/dist/migrate/framework/builtins.js +23 -0
- package/dist/migrate/framework/builtins.js.map +1 -0
- package/dist/migrate/framework/commands.d.ts +20 -0
- package/dist/migrate/framework/commands.js +58 -0
- package/dist/migrate/framework/commands.js.map +1 -0
- package/dist/migrate/framework/custom.d.ts +12 -0
- package/dist/migrate/framework/custom.js +96 -0
- package/dist/migrate/framework/custom.js.map +1 -0
- package/dist/migrate/framework/orchestrator.d.ts +113 -0
- package/dist/migrate/framework/orchestrator.js +531 -0
- package/dist/migrate/framework/orchestrator.js.map +1 -0
- package/dist/migrate/framework/plugin.d.ts +165 -0
- package/dist/migrate/framework/plugin.js +3 -0
- package/dist/migrate/framework/plugin.js.map +1 -0
- package/dist/migrate/framework/registry.d.ts +11 -0
- package/dist/migrate/framework/registry.js +44 -0
- package/dist/migrate/framework/registry.js.map +1 -0
- package/dist/migrate/framework/report.d.ts +17 -0
- package/dist/migrate/framework/report.js +103 -0
- package/dist/migrate/framework/report.js.map +1 -0
- package/dist/migrate/frameworks/plugins.d.ts +29 -0
- package/dist/migrate/frameworks/plugins.js +402 -0
- package/dist/migrate/frameworks/plugins.js.map +1 -0
- package/dist/migrate/frameworks/report.d.ts +92 -0
- package/dist/migrate/frameworks/report.js +207 -0
- package/dist/migrate/frameworks/report.js.map +1 -0
- package/dist/migrate/frameworks/translate-js.d.ts +5 -0
- package/dist/migrate/frameworks/translate-js.js +503 -0
- package/dist/migrate/frameworks/translate-js.js.map +1 -0
- package/dist/migrate/frameworks/translate-rails-django.d.ts +3 -0
- package/dist/migrate/frameworks/translate-rails-django.js +1391 -0
- package/dist/migrate/frameworks/translate-rails-django.js.map +1 -0
- package/dist/migrate/kinde/plugin.d.ts +2 -0
- package/dist/migrate/kinde/plugin.js +105 -0
- package/dist/migrate/kinde/plugin.js.map +1 -0
- package/dist/migrate/okta/plugin.d.ts +2 -0
- package/dist/migrate/okta/plugin.js +105 -0
- package/dist/migrate/okta/plugin.js.map +1 -0
- 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;
|