@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,208 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.exportDescope = exportDescope;
4
+ exports.mapDescopeUser = mapDescopeUser;
5
+ exports.roleKey = roleKey;
6
+ const csv_1 = require("../../import/csv");
7
+ const record_set_1 = require("./record-set");
8
+ const vendor_http_1 = require("./vendor-http");
9
+ const PAGE = 100;
10
+ async function exportDescope(opts) {
11
+ const set = new record_set_1.RecordSet();
12
+ if (!/^P[A-Za-z0-9]{10,}$/.test(opts.projectId))
13
+ throw new Error(`Not a Descope project id: ${opts.projectId}`);
14
+ if (!opts.managementKey)
15
+ throw new Error('Descope export needs a management key (DESCOPE_MANAGEMENT_KEY).');
16
+ const progress = opts.onProgress ?? (() => undefined);
17
+ const http = new vendor_http_1.VendorHttp({
18
+ vendor: 'Descope',
19
+ baseUrl: (opts.baseUrl ?? 'https://api.descope.com').replace(/\/+$/, ''),
20
+ headers: { authorization: `Bearer ${opts.projectId}:${opts.managementKey}` },
21
+ fetchImpl: opts.fetchImpl,
22
+ sleep: opts.sleep,
23
+ });
24
+ progress('tenants');
25
+ const tenants = (0, record_set_1.objs)((await http.get('/v1/mgmt/tenant/all')).body?.tenants);
26
+ const tenantIds = new Set();
27
+ for (const t of tenants) {
28
+ const id = (0, record_set_1.str)(t.id);
29
+ const name = (0, record_set_1.str)(t.name) ?? id;
30
+ if (!id || !name)
31
+ continue;
32
+ tenantIds.add(id);
33
+ set.add('organization', (0, record_set_1.compact)({ id, name, domains: (0, record_set_1.strs)(t.selfProvisioningDomains), public_metadata: (0, record_set_1.bag)(t.customAttributes) }));
34
+ }
35
+ progress('roles');
36
+ const roles = (0, record_set_1.objs)((await optional(http, 'GET', '/v1/mgmt/role/all'))?.roles);
37
+ for (const r of roles) {
38
+ const name = (0, record_set_1.str)(r.name);
39
+ if (!name)
40
+ continue;
41
+ const tenantId = (0, record_set_1.str)(r.tenantId);
42
+ const key = roleKey(name);
43
+ // A Descope role serves both project-level assignment and tenant
44
+ // membership: it becomes an app role and an organization role.
45
+ set.add('role', (0, record_set_1.compact)({ key, name, description: (0, record_set_1.str)(r.description), scope: 'app', permissions: (0, record_set_1.strs)(r.permissionNames) }), `app:${key}`);
46
+ set.add('role', (0, record_set_1.compact)({ key, name, description: (0, record_set_1.str)(r.description), scope: 'organization', organization_id: tenantId && tenantIds.has(tenantId) ? tenantId : undefined, permissions: (0, record_set_1.strs)(r.permissionNames) }), `org:${tenantId ?? ''}:${key}`);
47
+ }
48
+ progress('users');
49
+ const hashes = opts.hashesText ? indexHashes(opts.hashesText) : null;
50
+ const userIds = new Set();
51
+ let withHash = 0;
52
+ for (let page = 0;; page++) {
53
+ const { body } = await http.post('/v2/mgmt/user/search', { limit: PAGE, page, withTestUser: false });
54
+ const users = (0, record_set_1.objs)(body?.users);
55
+ for (const u of users) {
56
+ const user = mapDescopeUser(u);
57
+ if (!user) {
58
+ set.omit('user', u.test === true ? 'test user' : 'no email, phone number or login id');
59
+ continue;
60
+ }
61
+ const h = hashes ? (hashes.get(user.id) ?? (0, record_set_1.strs)(u.loginIds).map((l) => hashes.get(l.toLowerCase())).find(Boolean)) : undefined;
62
+ if (h) {
63
+ user.password = { algorithm: 'auto', hash: h };
64
+ withHash++;
65
+ }
66
+ set.add('user', user);
67
+ userIds.add(user.id);
68
+ for (const t of (0, record_set_1.objs)(u.userTenants)) {
69
+ const tid = (0, record_set_1.str)(t.tenantId);
70
+ if (!tid || !tenantIds.has(tid))
71
+ continue;
72
+ set.add('membership', { organization_id: tid, user_id: user.id, role: (0, record_set_1.strs)(t.roleNames)[0] ? roleKey((0, record_set_1.strs)(t.roleNames)[0]) : 'member' }, `${tid}:${user.id}`);
73
+ if ((0, record_set_1.strs)(t.roleNames).length > 1)
74
+ set.warn('Some tenant members hold several Descope roles; Atlas seats each member with one role (the first).');
75
+ }
76
+ if ((0, record_set_1.isObj)(u.OAuth) && Object.values(u.OAuth).some(Boolean)) {
77
+ set.omit('identity', "Descope does not export social accounts' provider user ids: they relink by verified email on first social sign-in");
78
+ }
79
+ if (u.TOTP === true)
80
+ set.omit('mfa_factor', 'Descope does not export TOTP seeds; re-enrol in Atlas');
81
+ if (u.webauthn === true)
82
+ set.omit('passkey', 'Descope does not export passkey public keys; register again in Atlas');
83
+ }
84
+ const total = typeof body?.total === 'number' ? body.total : undefined;
85
+ if (users.length < PAGE || (total !== undefined && (page + 1) * PAGE >= total))
86
+ break;
87
+ }
88
+ if (!hashes && set.count('user') > 0) {
89
+ set.warn('No password hashes: Descope exports them only through its support team. Pass that file with --descope-hashes-file, or turn on the descope lazy-migration preset so each password moves on its first sign-in.');
90
+ }
91
+ else if (hashes && withHash === 0) {
92
+ set.warn('The hash file matched no user (by user id or login id): check its columns.');
93
+ }
94
+ progress('sso');
95
+ for (const tid of tenantIds)
96
+ await addSso(set, http, tid);
97
+ progress('access keys');
98
+ const keys = (0, record_set_1.objs)((await optional(http, 'POST', '/v1/mgmt/accesskey/search', { tenantIds: [] }))?.keys);
99
+ if (keys.length)
100
+ set.omit('api_key', 'Descope never reveals access-key secrets: reissue them as Atlas API keys', keys.length);
101
+ set.manifest = { origin: opts.projectId, settings: { project_id: opts.projectId } };
102
+ return set;
103
+ }
104
+ /** One Descope user (search result) → a user record. */
105
+ function mapDescopeUser(u) {
106
+ const id = (0, record_set_1.str)(u.userId);
107
+ if (!id || u.test === true)
108
+ return null;
109
+ const email = (0, record_set_1.str)(u.email)?.toLowerCase();
110
+ const phone = (0, record_set_1.e164)(u.phone);
111
+ const loginIds = (0, record_set_1.strs)(u.loginIds);
112
+ // A login id that is neither the email nor the phone is a username.
113
+ const username = loginIds.find((l) => l.toLowerCase() !== email && (0, record_set_1.e164)(l) !== phone && !l.includes('@'));
114
+ const status = (0, record_set_1.str)(u.status);
115
+ const user = (0, record_set_1.compact)({
116
+ id,
117
+ emails: email ? [{ email, verified: u.verifiedEmail === true, primary: true }] : [],
118
+ phones: phone ? [{ phone, verified: u.verifiedPhone === true, primary: !email }] : [],
119
+ username,
120
+ first_name: (0, record_set_1.str)(u.givenName),
121
+ last_name: (0, record_set_1.str)(u.familyName),
122
+ name: !(0, record_set_1.str)(u.givenName) && !(0, record_set_1.str)(u.familyName) ? (0, record_set_1.str)(u.name) : undefined,
123
+ image_url: (0, record_set_1.str)(u.picture),
124
+ roles: (0, record_set_1.strs)(u.roleNames).map(roleKey),
125
+ banned: status === 'disabled' ? true : undefined,
126
+ private_metadata: (0, record_set_1.bag)({ ...((0, record_set_1.isObj)(u.customAttributes) ? u.customAttributes : {}), ...((0, record_set_1.strs)(u.externalIds).length ? { descope_external_ids: (0, record_set_1.strs)(u.externalIds) } : {}) }),
127
+ created_at: typeof u.createdTime === 'number' ? u.createdTime * 1000 : undefined,
128
+ });
129
+ return user.emails?.length || user.phones?.length || user.username ? user : null;
130
+ }
131
+ /** Descope role names are free text: `Tenant Admin` → `tenant_admin`. */
132
+ function roleKey(name) {
133
+ return name.trim().toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '') || 'role';
134
+ }
135
+ /**
136
+ * The support export, by user id and login id (lowercased). Its exact layout
137
+ * is not published: accepted as CSV with a hash column and a user id / login
138
+ * id / email column, or NDJSON objects with the same names.
139
+ */
140
+ function indexHashes(text) {
141
+ const t = text.trim();
142
+ const rows = t.startsWith('{') ? t.split(/\r?\n/).filter((l) => l.trim()).map((l) => JSON.parse(l)) : (0, csv_1.parseCsv)(t);
143
+ const out = new Map();
144
+ for (const r of rows) {
145
+ const keys = Object.keys(r);
146
+ const hashKey = keys.find((k) => /hash/i.test(k) && !/algo/i.test(k));
147
+ const hash = hashKey ? (0, record_set_1.str)(r[hashKey]) : undefined;
148
+ if (!hash)
149
+ continue;
150
+ for (const k of keys) {
151
+ if (/^(user_?id|userid|login_?id|loginid|email|login_?ids)$/i.test(k)) {
152
+ for (const v of String(r[k] ?? '').split(/[|,;]/))
153
+ if (v.trim())
154
+ out.set(/user_?id/i.test(k) ? v.trim() : v.trim().toLowerCase(), hash);
155
+ }
156
+ }
157
+ }
158
+ return out;
159
+ }
160
+ async function addSso(set, http, tenantId) {
161
+ const body = (await optional(http, 'GET', `/v2/mgmt/sso/settings?tenantId=${encodeURIComponent(tenantId)}`)) ?? (await optional(http, 'GET', `/v1/mgmt/sso/settings?tenantId=${encodeURIComponent(tenantId)}`));
162
+ if (!body)
163
+ return;
164
+ const saml = (0, record_set_1.isObj)(body.saml) ? body.saml : undefined;
165
+ const oidc = (0, record_set_1.isObj)(body.oidc) ? body.oidc : undefined;
166
+ const domains = [...(0, record_set_1.strs)(body.domains), ...((0, record_set_1.str)(body.domain) ? [(0, record_set_1.str)(body.domain)] : []), ...((0, record_set_1.isObj)(body.tenant) ? (0, record_set_1.strs)(body.tenant.domains) : [])];
167
+ if (saml && ((0, record_set_1.str)(saml.idpEntityId) || (0, record_set_1.str)(saml.idpMetadataUrl) || (0, record_set_1.str)(saml.idpSSOUrl))) {
168
+ const mapping = (0, record_set_1.isObj)(saml.attributeMapping) ? saml.attributeMapping : undefined;
169
+ set.add('sso_connection', (0, record_set_1.compact)({
170
+ id: `${tenantId}:saml`,
171
+ name: `${tenantId} SAML`,
172
+ organization_id: tenantId,
173
+ protocol: 'saml',
174
+ domains: [...new Set(domains)],
175
+ saml: (0, record_set_1.compact)({
176
+ idp_entity_id: (0, record_set_1.str)(saml.idpEntityId),
177
+ idp_sso_url: (0, record_set_1.str)(saml.idpSSOUrl),
178
+ idp_certificate: (0, record_set_1.str)(saml.idpCertificate),
179
+ idp_metadata_url: (0, record_set_1.str)(saml.idpMetadataUrl),
180
+ sp_entity_id: (0, record_set_1.str)(saml.spEntityId),
181
+ sp_acs_url: (0, record_set_1.str)(saml.spACSUrl),
182
+ attribute_mapping: mapping ? Object.fromEntries(Object.entries(mapping).filter(([, v]) => typeof v === 'string' && v)) : undefined,
183
+ }),
184
+ }));
185
+ }
186
+ else if (oidc && ((0, record_set_1.str)(oidc.issuer) || (0, record_set_1.str)(oidc.clientId))) {
187
+ set.add('sso_connection', (0, record_set_1.compact)({
188
+ id: `${tenantId}:oidc`,
189
+ name: (0, record_set_1.str)(oidc.name) ?? `${tenantId} OIDC`,
190
+ organization_id: tenantId,
191
+ protocol: 'oidc',
192
+ domains: [...new Set(domains)],
193
+ oidc: (0, record_set_1.compact)({ issuer: (0, record_set_1.str)(oidc.issuer), discovery_url: (0, record_set_1.str)(oidc.wellKnownUrl), client_id: (0, record_set_1.str)(oidc.clientId), scopes: (0, record_set_1.strs)(oidc.scope) }),
194
+ }));
195
+ set.warn(`Tenant ${tenantId} OIDC SSO: Descope does not return the client secret; enter it in Atlas after the import.`);
196
+ }
197
+ }
198
+ async function optional(http, method, path, body) {
199
+ try {
200
+ return (await http.request(method, path, body)).body;
201
+ }
202
+ catch (err) {
203
+ if (err instanceof vendor_http_1.VendorApiError && [400, 403, 404, 405].includes(err.status))
204
+ return null;
205
+ throw err;
206
+ }
207
+ }
208
+ //# sourceMappingURL=descope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descope.js","sourceRoot":"","sources":["../../../src/migrate/export/descope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * A fake vendor API for exporter tests: routes are `METHOD path?query` (the
3
+ * query as the exporter sends it) → a JSON body, a status + body, or a
4
+ * function of the request. Unrouted calls answer 404, so an exporter that
5
+ * calls something unexpected degrades the way it would against a vendor that
6
+ * lacks the endpoint. Every call is recorded (with its headers) for assertions.
7
+ */
8
+ export type Route = unknown | {
9
+ status: number;
10
+ body?: unknown;
11
+ headers?: Record<string, string>;
12
+ } | ((req: {
13
+ url: URL;
14
+ body: unknown;
15
+ headers: Headers;
16
+ }) => unknown);
17
+ export interface FakeVendor {
18
+ fetchImpl: typeof fetch;
19
+ calls: Array<{
20
+ method: string;
21
+ url: string;
22
+ headers: Headers;
23
+ body: unknown;
24
+ }>;
25
+ }
26
+ export declare function fakeVendor(origin: string, routes: Record<string, Route>): FakeVendor;
27
+ export declare const noSleep: () => Promise<undefined>;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.noSleep = void 0;
4
+ exports.fakeVendor = fakeVendor;
5
+ const isStatus = (v) => typeof v === 'object' && v !== null && 'status' in v && typeof v.status === 'number' && Object.keys(v).every((k) => ['status', 'body', 'headers'].includes(k));
6
+ function fakeVendor(origin, routes) {
7
+ const calls = [];
8
+ const fetchImpl = (async (input, init = {}) => {
9
+ const url = new URL(String(input));
10
+ const method = (init.method ?? 'GET').toUpperCase();
11
+ const headers = new Headers(init.headers);
12
+ let body = init.body;
13
+ if (typeof body === 'string') {
14
+ try {
15
+ body = JSON.parse(body);
16
+ }
17
+ catch {
18
+ // form-encoded or plain text: kept as the string
19
+ }
20
+ }
21
+ calls.push({ method, url: url.toString(), headers, body });
22
+ const key = url.origin === origin ? `${method} ${url.pathname}${url.search}` : `${method} ${url.toString()}`;
23
+ let route = routes[key];
24
+ if (route === undefined)
25
+ route = routes[`${method} ${url.pathname}`];
26
+ if (route === undefined)
27
+ return new Response(JSON.stringify({ message: `no route for ${key}` }), { status: 404 });
28
+ const value = typeof route === 'function' ? route({ url, body, headers }) : route;
29
+ if (value instanceof Uint8Array)
30
+ return new Response(value, { status: 200 });
31
+ const resolved = isStatus(value) ? value : { status: 200, body: value };
32
+ return new Response(resolved.body === undefined ? '' : JSON.stringify(resolved.body), {
33
+ status: resolved.status,
34
+ headers: { 'content-type': 'application/json', ...(resolved.headers ?? {}) },
35
+ });
36
+ });
37
+ return { fetchImpl, calls };
38
+ }
39
+ const noSleep = async () => undefined;
40
+ exports.noSleep = noSleep;
41
+ //# sourceMappingURL=fake-vendor.test-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-vendor.test-helper.js","sourceRoot":"","sources":["../../../src/migrate/export/fake-vendor.test-helper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { FrameworkExport, type Tables } from './tables';
2
+ /**
3
+ * Passport.js and iron-session leave the user store to the app: there is no
4
+ * schema to recognise, only conventions. This mapper reads the app's users
5
+ * table with column names you can override, and recognises the common shapes:
6
+ *
7
+ * - a password column holding a self-describing hash (bcrypt / bcryptjs,
8
+ * argon2 / @node-rs/argon2, Django-style PBKDF2, oslo scrypt);
9
+ * - passport-local-mongoose's `salt` + `hash` fields (PBKDF2-SHA256, 25000
10
+ * iterations, 512-byte key — `sha1` for apps on its pre-v5 default);
11
+ * - provider id columns the Passport strategies' `verify` callbacks fill
12
+ * (`googleId`, `github_id`, `facebookId` …), or a separate identities table;
13
+ *
14
+ * and, for Passport, the express-session store the app used (connect-pg-simple,
15
+ * connect-mongo, connect-redis via a JSON dump, connect-session-sequelize,
16
+ * knex/typeorm stores): each live session's `passport.user` becomes a session
17
+ * record keyed by sha256 of the session id, which the bridge reads out of the
18
+ * `connect.sid` cookie.
19
+ */
20
+ export interface AppUsersExportOptions {
21
+ usersTable?: string;
22
+ idColumn?: string;
23
+ emailColumn?: string;
24
+ emailVerifiedColumn?: string;
25
+ usernameColumn?: string;
26
+ nameColumn?: string;
27
+ passwordColumn?: string;
28
+ /** passport-local-mongoose's digest (`sha256`, or `sha1` before v5). */
29
+ plmDigest?: 'sha1' | 'sha256' | 'sha512';
30
+ plmIterations?: number;
31
+ /** `provider=column` pairs for provider id columns on the users row. */
32
+ identityColumns?: Record<string, string>;
33
+ /** A separate identities table (`user_id`, `provider`, `provider_user_id` / `provider_id` / `uid`). */
34
+ identitiesTable?: string;
35
+ /** The session store table / collection (default: detected). */
36
+ sessionsTable?: string;
37
+ /** Where the user id sits in the session JSON (default `passport.user`, then `passport.user.id`). */
38
+ sessionUserPath?: string;
39
+ sessions?: boolean;
40
+ now?: Date;
41
+ }
42
+ export declare function exportAppUsers(tables: Tables, options?: AppUsersExportOptions): FrameworkExport;
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.exportAppUsers = exportAppUsers;
4
+ const tables_1 = require("./tables");
5
+ const DEFAULT_IDENTITY_COLUMNS = {
6
+ google: ['googleId', 'google_id'],
7
+ github: ['githubId', 'github_id'],
8
+ facebook: ['facebookId', 'facebook_id'],
9
+ twitter: ['twitterId', 'twitter_id'],
10
+ microsoft: ['microsoftId', 'microsoft_id'],
11
+ apple: ['appleId', 'apple_id'],
12
+ discord: ['discordId', 'discord_id'],
13
+ gitlab: ['gitlabId', 'gitlab_id'],
14
+ linkedin: ['linkedinId', 'linkedin_id'],
15
+ slack: ['slackId', 'slack_id'],
16
+ };
17
+ /** passlib adapted base64 (what Atlas's PHC PBKDF2 verifier reads). */
18
+ function ab64(b) {
19
+ return b.toString('base64').replace(/\+/g, '.').replace(/=+$/, '');
20
+ }
21
+ function exportAppUsers(tables, options = {}) {
22
+ const out = new tables_1.FrameworkExport();
23
+ const now = (options.now ?? new Date()).getTime();
24
+ const users = tables.find(...(options.usersTable ? [options.usersTable] : ['users', 'user', 'User', 'accounts']));
25
+ if (!users) {
26
+ out.warn('No users table found (looked for users, user, accounts; pass --users-table).');
27
+ return out;
28
+ }
29
+ const ids = new Set();
30
+ const providers = new Set();
31
+ let plm = 0;
32
+ let unknown = 0;
33
+ for (const row of users.rows) {
34
+ const id = (0, tables_1.text)(options.idColumn ? (0, tables_1.col)(row, options.idColumn) : (0, tables_1.col)(row, 'id', '_id', 'uuid'));
35
+ if (!id) {
36
+ out.omit('user', 'row without an id');
37
+ continue;
38
+ }
39
+ const email = (0, tables_1.text)(options.emailColumn ? (0, tables_1.col)(row, options.emailColumn) : (0, tables_1.col)(row, 'email', 'emailAddress', 'email_address'))?.toLowerCase();
40
+ const username = (0, tables_1.text)(options.usernameColumn ? (0, tables_1.col)(row, options.usernameColumn) : (0, tables_1.col)(row, 'username', 'login'));
41
+ if (!email && !username) {
42
+ out.omit('user', 'no email or username');
43
+ continue;
44
+ }
45
+ let password;
46
+ const salt = (0, tables_1.text)((0, tables_1.col)(row, 'salt'));
47
+ const plmHash = (0, tables_1.text)((0, tables_1.col)(row, 'hash'));
48
+ if (!options.passwordColumn && salt && plmHash && /^([0-9a-f]{2})+$/i.test(plmHash)) {
49
+ const digestName = options.plmDigest ?? 'sha256';
50
+ const rounds = options.plmIterations ?? 25000;
51
+ password = {
52
+ algorithm: 'auto',
53
+ hash: `$pbkdf2-${digestName}$${rounds}$${ab64(Buffer.from(salt, 'utf8'))}$${ab64(Buffer.from(plmHash, 'hex'))}`,
54
+ };
55
+ plm++;
56
+ }
57
+ else {
58
+ const digest = (0, tables_1.text)(options.passwordColumn
59
+ ? (0, tables_1.col)(row, options.passwordColumn)
60
+ : (0, tables_1.col)(row, 'password', 'passwordHash', 'password_hash', 'hashedPassword', 'hashed_password', 'encrypted_password'));
61
+ if (digest) {
62
+ password = (0, tables_1.selfDescribingHash)(digest) ?? undefined;
63
+ if (!password)
64
+ unknown++;
65
+ }
66
+ }
67
+ const verified = options.emailVerifiedColumn
68
+ ? (0, tables_1.bool)((0, tables_1.col)(row, options.emailVerifiedColumn))
69
+ : (0, tables_1.bool)((0, tables_1.col)(row, 'emailVerified', 'email_verified', 'verified', 'isVerified', 'is_verified', 'confirmed'));
70
+ const name = (0, tables_1.text)(options.nameColumn ? (0, tables_1.col)(row, options.nameColumn) : (0, tables_1.col)(row, 'name', 'displayName', 'display_name', 'fullName', 'full_name'));
71
+ ids.add(id);
72
+ out.add('user', {
73
+ id,
74
+ emails: email ? [{ email, verified, primary: true }] : undefined,
75
+ username,
76
+ name,
77
+ first_name: (0, tables_1.text)((0, tables_1.col)(row, 'firstName', 'first_name', 'givenName', 'given_name')) ?? (0, tables_1.splitName)(name).first_name,
78
+ last_name: (0, tables_1.text)((0, tables_1.col)(row, 'lastName', 'last_name', 'familyName', 'family_name')) ?? (0, tables_1.splitName)(name).last_name,
79
+ image_url: (0, tables_1.text)((0, tables_1.col)(row, 'image', 'avatar', 'avatarUrl', 'avatar_url', 'picture')),
80
+ password,
81
+ created_at: (0, tables_1.time)((0, tables_1.col)(row, 'createdAt', 'created_at', 'date_joined')),
82
+ });
83
+ const identityColumns = options.identityColumns
84
+ ? Object.fromEntries(Object.entries(options.identityColumns).map(([p, c]) => [p, [c]]))
85
+ : DEFAULT_IDENTITY_COLUMNS;
86
+ for (const [provider, columns] of Object.entries(identityColumns)) {
87
+ const subject = (0, tables_1.text)((0, tables_1.col)(row, ...columns));
88
+ if (!subject)
89
+ continue;
90
+ providers.add(provider);
91
+ out.add('identity', { user_id: id, provider, provider_user_id: subject, kind: 'oauth' });
92
+ }
93
+ }
94
+ if (plm)
95
+ out.warn(`${plm} passport-local-mongoose password(s) carried over as PBKDF2 (${options.plmDigest ?? 'sha256'}).`);
96
+ if (unknown)
97
+ out.warn(`${unknown} password value(s) are not a format Atlas verifies: those users reset their password or migrate lazily.`);
98
+ const identities = tables.find(...(options.identitiesTable ? [options.identitiesTable] : ['identities', 'user_identities', 'federated_credentials', 'oauth_accounts']));
99
+ for (const row of identities?.rows ?? []) {
100
+ const userId = (0, tables_1.text)((0, tables_1.col)(row, 'user_id', 'userId'));
101
+ const provider = (0, tables_1.text)((0, tables_1.col)(row, 'provider'))?.replace(/^https?:\/\//, '').replace(/\/.*$/, '');
102
+ const subject = (0, tables_1.text)((0, tables_1.col)(row, 'provider_user_id', 'providerUserId', 'subject', 'uid', 'provider_id'));
103
+ if (!userId || !provider || !subject || !ids.has(userId)) {
104
+ out.omit('identity', 'identity row without a known user, provider or subject');
105
+ continue;
106
+ }
107
+ providers.add(provider);
108
+ out.add('identity', { user_id: userId, provider, provider_user_id: subject, kind: 'oauth' });
109
+ }
110
+ out.manifest.providers = [...providers].sort();
111
+ if (options.sessions !== false)
112
+ exportExpressSessions(tables, out, ids, options, now);
113
+ return out;
114
+ }
115
+ /** connect-* session stores → session records (Passport). */
116
+ function exportExpressSessions(tables, out, ids, options, now) {
117
+ const store = tables.find(...(options.sessionsTable ? [options.sessionsTable] : ['session', 'sessions', 'Sessions', 'redis_sessions']));
118
+ if (!store)
119
+ return;
120
+ for (const row of store.rows) {
121
+ // connect-redis dumps carry the key `sess:<sid>`.
122
+ const redisKey = (0, tables_1.text)((0, tables_1.col)(row, 'key'));
123
+ const sid = (0, tables_1.text)((0, tables_1.col)(row, 'sid', '_id', 'session_id', 'id')) ?? (redisKey?.startsWith('sess:') ? redisKey.slice(5) : undefined);
124
+ const data = (0, tables_1.json)((0, tables_1.col)(row, 'sess', 'session', 'data', 'value'));
125
+ if (!sid || !data) {
126
+ out.omit('session', 'session row without an id or session data');
127
+ continue;
128
+ }
129
+ const userId = sessionUser(data, options.sessionUserPath);
130
+ if (!userId) {
131
+ out.omit('session', 'anonymous session (no passport.user)');
132
+ continue;
133
+ }
134
+ if (!ids.has(userId)) {
135
+ out.omit('session', 'session of a user not in the export');
136
+ continue;
137
+ }
138
+ const cookie = (0, tables_1.json)(data.cookie);
139
+ const ttl = Number((0, tables_1.col)(row, 'ttl'));
140
+ const expires = (0, tables_1.timeMs)((0, tables_1.col)(row, 'expire', 'expires', 'expired', 'expires_at')) ??
141
+ (0, tables_1.timeMs)(cookie?.expires) ??
142
+ (Number.isFinite(ttl) && ttl > 0 ? now + ttl * 1000 : undefined);
143
+ if (expires === undefined) {
144
+ out.omit('session', 'browser-session cookie with no expiry in the store');
145
+ continue;
146
+ }
147
+ if (expires <= now) {
148
+ out.omit('session', 'expired');
149
+ continue;
150
+ }
151
+ out.add('session', { id: (0, tables_1.sha256Hex)(sid).slice(0, 32), user_id: userId, token_hash: (0, tables_1.sha256Hex)(sid), expires_at: new Date(expires).toISOString() });
152
+ }
153
+ out.manifest.settings = { ...(out.manifest.settings ?? {}), session_cookie: 'connect.sid' };
154
+ }
155
+ function sessionUser(data, path) {
156
+ const at = (p) => p.split('.').reduce((cur, k) => (cur && typeof cur === 'object' ? cur[k] : undefined), data);
157
+ if (path)
158
+ return (0, tables_1.text)(at(path));
159
+ return (0, tables_1.text)(at('passport.user')) ?? (0, tables_1.text)(at('passport.user.id')) ?? (0, tables_1.text)(at('passport.user._id')) ?? (0, tables_1.text)(at('userId'));
160
+ }
161
+ //# sourceMappingURL=app-users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-users.js","sourceRoot":"","sources":["../../../../src/migrate/export/frameworks/app-users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { FrameworkExport, type Tables } from './tables';
2
+ /**
3
+ * Auth.js / NextAuth (v4 and v5) → canonical records, from the adapter's tables.
4
+ *
5
+ * Every official adapter keeps the same four models under its own table and
6
+ * column spelling — Prisma `User`/`Account`/`Session`/`Authenticator`, Drizzle
7
+ * `user`/`account`/`session`/`authenticator`, `@auth/pg-adapter` and Kysely
8
+ * `users`/`accounts`/`sessions`, TypeORM, Sequelize, the Supabase adapter's
9
+ * `next_auth` schema, MongoDB's `users`/`accounts`/`sessions` collections — so
10
+ * the mapper accepts each spelling (camelCase, snake_case, Mongo `_id`).
11
+ *
12
+ * users → user (email + emailVerified, name, image; a password column
13
+ * the app's Credentials provider filled, when it is a format
14
+ * Atlas verifies)
15
+ * accounts → identity (oauth / oidc; tokens only with `oauthTokens`)
16
+ * authenticators → passkey (the WebAuthn provider; needs the RP id)
17
+ * sessions → session (database strategy; sha256 of `sessionToken`)
18
+ *
19
+ * Not exported: `verification_token` rows (magic-link tokens live minutes), the
20
+ * Credentials provider's `authorize` logic (it is app code: Atlas owns
21
+ * passwords now), JWT-strategy sessions (they live only in the browser — the
22
+ * bridge reads them with the app's AUTH_SECRET instead).
23
+ */
24
+ export interface AuthJsExportOptions {
25
+ /** The WebAuthn RP id the Passkey provider registered against (your domain). */
26
+ rpId?: string;
27
+ /** Include OAuth access / refresh tokens on identities. Default false. */
28
+ oauthTokens?: boolean;
29
+ /** Include live database sessions for the bridge. Default true. */
30
+ sessions?: boolean;
31
+ /** The users-table column holding a Credentials-provider password hash (auto-detected otherwise). */
32
+ passwordColumn?: string;
33
+ now?: Date;
34
+ }
35
+ export declare const AUTHJS_TABLES: {
36
+ readonly user: readonly ["User", "users", "user", "next_auth.users"];
37
+ readonly account: readonly ["Account", "accounts", "account", "next_auth.accounts"];
38
+ readonly session: readonly ["Session", "sessions", "session", "next_auth.sessions"];
39
+ readonly authenticator: readonly ["Authenticator", "authenticators", "authenticator"];
40
+ };
41
+ export declare function exportAuthJs(tables: Tables, options?: AuthJsExportOptions): FrameworkExport;