@atlasauth/cli 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -1
- package/dist/args.d.ts +18 -0
- package/dist/args.js +9 -0
- package/dist/args.js.map +1 -1
- package/dist/commands/config.js +72 -7
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/dev.d.ts +8 -0
- package/dist/commands/dev.js +84 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/fga.d.ts +10 -0
- package/dist/commands/fga.js +105 -0
- package/dist/commands/fga.js.map +1 -0
- package/dist/commands/pages.d.ts +14 -0
- package/dist/commands/pages.js +113 -0
- package/dist/commands/pages.js.map +1 -0
- package/dist/context.d.ts +1 -1
- package/dist/help.d.ts +1 -1
- package/dist/help.js +71 -2
- package/dist/help.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/migrate/appwrite/plugin.d.ts +2 -0
- package/dist/migrate/appwrite/plugin.js +103 -0
- package/dist/migrate/appwrite/plugin.js.map +1 -0
- package/dist/migrate/authentik/plugin.d.ts +2 -0
- package/dist/migrate/authentik/plugin.js +135 -0
- package/dist/migrate/authentik/plugin.js.map +1 -0
- package/dist/migrate/azure-ad-b2c/plugin.d.ts +8 -0
- package/dist/migrate/azure-ad-b2c/plugin.js +165 -0
- package/dist/migrate/azure-ad-b2c/plugin.js.map +1 -0
- package/dist/migrate/cognito/plugin.d.ts +5 -0
- package/dist/migrate/cognito/plugin.js +170 -0
- package/dist/migrate/cognito/plugin.js.map +1 -0
- package/dist/migrate/corbado/plugin.d.ts +2 -0
- package/dist/migrate/corbado/plugin.js +63 -0
- package/dist/migrate/corbado/plugin.js.map +1 -0
- package/dist/migrate/entra-external-id/plugin.d.ts +8 -0
- package/dist/migrate/entra-external-id/plugin.js +12 -0
- package/dist/migrate/entra-external-id/plugin.js.map +1 -0
- package/dist/migrate/export/appwrite-config.d.ts +28 -0
- package/dist/migrate/export/appwrite-config.js +170 -0
- package/dist/migrate/export/appwrite-config.js.map +1 -0
- package/dist/migrate/export/appwrite.d.ts +51 -0
- package/dist/migrate/export/appwrite.js +288 -0
- package/dist/migrate/export/appwrite.js.map +1 -0
- package/dist/migrate/export/authentik-config.d.ts +45 -0
- package/dist/migrate/export/authentik-config.js +357 -0
- package/dist/migrate/export/authentik-config.js.map +1 -0
- package/dist/migrate/export/authentik.d.ts +110 -0
- package/dist/migrate/export/authentik.js +838 -0
- package/dist/migrate/export/authentik.js.map +1 -0
- package/dist/migrate/export/azure-config.d.ts +58 -0
- package/dist/migrate/export/azure-config.js +344 -0
- package/dist/migrate/export/azure-config.js.map +1 -0
- package/dist/migrate/export/azure.d.ts +85 -0
- package/dist/migrate/export/azure.js +373 -0
- package/dist/migrate/export/azure.js.map +1 -0
- package/dist/migrate/export/cognito-config.d.ts +25 -0
- package/dist/migrate/export/cognito-config.js +273 -0
- package/dist/migrate/export/cognito-config.js.map +1 -0
- package/dist/migrate/export/cognito.d.ts +103 -0
- package/dist/migrate/export/cognito.js +441 -0
- package/dist/migrate/export/cognito.js.map +1 -0
- package/dist/migrate/export/corbado-config.d.ts +20 -0
- package/dist/migrate/export/corbado-config.js +63 -0
- package/dist/migrate/export/corbado-config.js.map +1 -0
- package/dist/migrate/export/corbado.d.ts +37 -0
- package/dist/migrate/export/corbado.js +132 -0
- package/dist/migrate/export/corbado.js.map +1 -0
- package/dist/migrate/export/firebase-config.d.ts +24 -0
- package/dist/migrate/export/firebase-config.js +215 -0
- package/dist/migrate/export/firebase-config.js.map +1 -0
- package/dist/migrate/export/firebase.d.ts +102 -0
- package/dist/migrate/export/firebase.js +464 -0
- package/dist/migrate/export/firebase.js.map +1 -0
- package/dist/migrate/export/frontegg-config.d.ts +29 -0
- package/dist/migrate/export/frontegg-config.js +238 -0
- package/dist/migrate/export/frontegg-config.js.map +1 -0
- package/dist/migrate/export/frontegg.d.ts +67 -0
- package/dist/migrate/export/frontegg.js +410 -0
- package/dist/migrate/export/frontegg.js.map +1 -0
- package/dist/migrate/export/fusionauth-config.d.ts +26 -0
- package/dist/migrate/export/fusionauth-config.js +226 -0
- package/dist/migrate/export/fusionauth-config.js.map +1 -0
- package/dist/migrate/export/fusionauth.d.ts +99 -0
- package/dist/migrate/export/fusionauth.js +642 -0
- package/dist/migrate/export/fusionauth.js.map +1 -0
- package/dist/migrate/export/hanko-config.d.ts +27 -0
- package/dist/migrate/export/hanko-config.js +265 -0
- package/dist/migrate/export/hanko-config.js.map +1 -0
- package/dist/migrate/export/hanko.d.ts +52 -0
- package/dist/migrate/export/hanko.js +605 -0
- package/dist/migrate/export/hanko.js.map +1 -0
- package/dist/migrate/export/keycloak-config.d.ts +19 -0
- package/dist/migrate/export/keycloak-config.js +219 -0
- package/dist/migrate/export/keycloak-config.js.map +1 -0
- package/dist/migrate/export/keycloak.d.ts +155 -0
- package/dist/migrate/export/keycloak.js +878 -0
- package/dist/migrate/export/keycloak.js.map +1 -0
- package/dist/migrate/export/ldap.d.ts +53 -0
- package/dist/migrate/export/ldap.js +277 -0
- package/dist/migrate/export/ldap.js.map +1 -0
- package/dist/migrate/export/logto-config.d.ts +27 -0
- package/dist/migrate/export/logto-config.js +264 -0
- package/dist/migrate/export/logto-config.js.map +1 -0
- package/dist/migrate/export/logto.d.ts +150 -0
- package/dist/migrate/export/logto.js +809 -0
- package/dist/migrate/export/logto.js.map +1 -0
- package/dist/migrate/export/magic-config.d.ts +14 -0
- package/dist/migrate/export/magic-config.js +28 -0
- package/dist/migrate/export/magic-config.js.map +1 -0
- package/dist/migrate/export/magic.d.ts +31 -0
- package/dist/migrate/export/magic.js +93 -0
- package/dist/migrate/export/magic.js.map +1 -0
- package/dist/migrate/export/mini-yaml.d.ts +19 -0
- package/dist/migrate/export/mini-yaml.js +581 -0
- package/dist/migrate/export/mini-yaml.js.map +1 -0
- package/dist/migrate/export/nhost-config.d.ts +26 -0
- package/dist/migrate/export/nhost-config.js +360 -0
- package/dist/migrate/export/nhost-config.js.map +1 -0
- package/dist/migrate/export/nhost.d.ts +64 -0
- package/dist/migrate/export/nhost.js +304 -0
- package/dist/migrate/export/nhost.js.map +1 -0
- package/dist/migrate/export/onelogin.d.ts +22 -0
- package/dist/migrate/export/onelogin.js +123 -0
- package/dist/migrate/export/onelogin.js.map +1 -0
- package/dist/migrate/export/ory-config.d.ts +58 -0
- package/dist/migrate/export/ory-config.js +451 -0
- package/dist/migrate/export/ory-config.js.map +1 -0
- package/dist/migrate/export/ory.d.ts +81 -0
- package/dist/migrate/export/ory.js +555 -0
- package/dist/migrate/export/ory.js.map +1 -0
- package/dist/migrate/export/password-detect.d.ts +29 -0
- package/dist/migrate/export/password-detect.js +81 -0
- package/dist/migrate/export/password-detect.js.map +1 -0
- package/dist/migrate/export/pingone.d.ts +36 -0
- package/dist/migrate/export/pingone.js +218 -0
- package/dist/migrate/export/pingone.js.map +1 -0
- package/dist/migrate/export/pocketbase-config.d.ts +28 -0
- package/dist/migrate/export/pocketbase-config.js +180 -0
- package/dist/migrate/export/pocketbase-config.js.map +1 -0
- package/dist/migrate/export/pocketbase.d.ts +52 -0
- package/dist/migrate/export/pocketbase.js +243 -0
- package/dist/migrate/export/pocketbase.js.map +1 -0
- package/dist/migrate/export/project-files.d.ts +15 -0
- package/dist/migrate/export/project-files.js +43 -0
- package/dist/migrate/export/project-files.js.map +1 -0
- package/dist/migrate/export/propelauth-config.d.ts +18 -0
- package/dist/migrate/export/propelauth-config.js +58 -0
- package/dist/migrate/export/propelauth-config.js.map +1 -0
- package/dist/migrate/export/propelauth-harness.test-helper.d.ts +62 -0
- package/dist/migrate/export/propelauth-harness.test-helper.js +109 -0
- package/dist/migrate/export/propelauth-harness.test-helper.js.map +1 -0
- package/dist/migrate/export/propelauth.d.ts +48 -0
- package/dist/migrate/export/propelauth.js +255 -0
- package/dist/migrate/export/propelauth.js.map +1 -0
- package/dist/migrate/export/source-lines.d.ts +17 -0
- package/dist/migrate/export/source-lines.js +43 -0
- package/dist/migrate/export/source-lines.js.map +1 -0
- package/dist/migrate/export/sso-metadata.d.ts +47 -0
- package/dist/migrate/export/sso-metadata.js +180 -0
- package/dist/migrate/export/sso-metadata.js.map +1 -0
- package/dist/migrate/export/stytch-config.d.ts +22 -0
- package/dist/migrate/export/stytch-config.js +102 -0
- package/dist/migrate/export/stytch-config.js.map +1 -0
- package/dist/migrate/export/stytch.d.ts +68 -0
- package/dist/migrate/export/stytch.js +510 -0
- package/dist/migrate/export/stytch.js.map +1 -0
- package/dist/migrate/export/supabase-config.d.ts +48 -0
- package/dist/migrate/export/supabase-config.js +408 -0
- package/dist/migrate/export/supabase-config.js.map +1 -0
- package/dist/migrate/export/supabase.d.ts +86 -0
- package/dist/migrate/export/supabase.js +524 -0
- package/dist/migrate/export/supabase.js.map +1 -0
- package/dist/migrate/export/supertokens-config.d.ts +20 -0
- package/dist/migrate/export/supertokens-config.js +150 -0
- package/dist/migrate/export/supertokens-config.js.map +1 -0
- package/dist/migrate/export/supertokens.d.ts +125 -0
- package/dist/migrate/export/supertokens.js +464 -0
- package/dist/migrate/export/supertokens.js.map +1 -0
- package/dist/migrate/export/table.d.ts +35 -0
- package/dist/migrate/export/table.js +248 -0
- package/dist/migrate/export/table.js.map +1 -0
- package/dist/migrate/export/userfront-config.d.ts +15 -0
- package/dist/migrate/export/userfront-config.js +49 -0
- package/dist/migrate/export/userfront-config.js.map +1 -0
- package/dist/migrate/export/userfront.d.ts +38 -0
- package/dist/migrate/export/userfront.js +189 -0
- package/dist/migrate/export/userfront.js.map +1 -0
- package/dist/migrate/export/workos-config.d.ts +23 -0
- package/dist/migrate/export/workos-config.js +125 -0
- package/dist/migrate/export/workos-config.js.map +1 -0
- package/dist/migrate/export/workos.d.ts +46 -0
- package/dist/migrate/export/workos.js +272 -0
- package/dist/migrate/export/workos.js.map +1 -0
- package/dist/migrate/export/zitadel-config.d.ts +37 -0
- package/dist/migrate/export/zitadel-config.js +279 -0
- package/dist/migrate/export/zitadel-config.js.map +1 -0
- package/dist/migrate/export/zitadel.d.ts +82 -0
- package/dist/migrate/export/zitadel.js +447 -0
- package/dist/migrate/export/zitadel.js.map +1 -0
- package/dist/migrate/firebase/plugin.d.ts +2 -0
- package/dist/migrate/firebase/plugin.js +152 -0
- package/dist/migrate/firebase/plugin.js.map +1 -0
- package/dist/migrate/framework/builtins.js +35 -6
- package/dist/migrate/framework/builtins.js.map +1 -1
- package/dist/migrate/framework/orchestrator.js +3 -2
- package/dist/migrate/framework/orchestrator.js.map +1 -1
- package/dist/migrate/framework/plugin.d.ts +2 -0
- package/dist/migrate/frontegg/plugin.d.ts +2 -0
- package/dist/migrate/frontegg/plugin.js +78 -0
- package/dist/migrate/frontegg/plugin.js.map +1 -0
- package/dist/migrate/fusionauth/plugin.d.ts +2 -0
- package/dist/migrate/fusionauth/plugin.js +109 -0
- package/dist/migrate/fusionauth/plugin.js.map +1 -0
- package/dist/migrate/hanko/plugin.d.ts +2 -0
- package/dist/migrate/hanko/plugin.js +100 -0
- package/dist/migrate/hanko/plugin.js.map +1 -0
- package/dist/migrate/keycloak/plugin.d.ts +2 -0
- package/dist/migrate/keycloak/plugin.js +148 -0
- package/dist/migrate/keycloak/plugin.js.map +1 -0
- package/dist/migrate/ldap/plugin.d.ts +2 -0
- package/dist/migrate/ldap/plugin.js +73 -0
- package/dist/migrate/ldap/plugin.js.map +1 -0
- package/dist/migrate/logto/plugin.d.ts +2 -0
- package/dist/migrate/logto/plugin.js +131 -0
- package/dist/migrate/logto/plugin.js.map +1 -0
- package/dist/migrate/magic/plugin.d.ts +2 -0
- package/dist/migrate/magic/plugin.js +56 -0
- package/dist/migrate/magic/plugin.js.map +1 -0
- package/dist/migrate/nhost/plugin.d.ts +2 -0
- package/dist/migrate/nhost/plugin.js +115 -0
- package/dist/migrate/nhost/plugin.js.map +1 -0
- package/dist/migrate/oidc/plugin.d.ts +2 -0
- package/dist/migrate/oidc/plugin.js +73 -0
- package/dist/migrate/oidc/plugin.js.map +1 -0
- package/dist/migrate/onelogin/plugin.d.ts +2 -0
- package/dist/migrate/onelogin/plugin.js +61 -0
- package/dist/migrate/onelogin/plugin.js.map +1 -0
- package/dist/migrate/ory/plugin.d.ts +2 -0
- package/dist/migrate/ory/plugin.js +186 -0
- package/dist/migrate/ory/plugin.js.map +1 -0
- package/dist/migrate/ping-identity/plugin.d.ts +2 -0
- package/dist/migrate/ping-identity/plugin.js +100 -0
- package/dist/migrate/ping-identity/plugin.js.map +1 -0
- package/dist/migrate/pocketbase/plugin.d.ts +2 -0
- package/dist/migrate/pocketbase/plugin.js +99 -0
- package/dist/migrate/pocketbase/plugin.js.map +1 -0
- package/dist/migrate/propelauth/plugin.d.ts +2 -0
- package/dist/migrate/propelauth/plugin.js +65 -0
- package/dist/migrate/propelauth/plugin.js.map +1 -0
- package/dist/migrate/saml/plugin.d.ts +2 -0
- package/dist/migrate/saml/plugin.js +79 -0
- package/dist/migrate/saml/plugin.js.map +1 -0
- package/dist/migrate/stytch/plugin.d.ts +2 -0
- package/dist/migrate/stytch/plugin.js +97 -0
- package/dist/migrate/stytch/plugin.js.map +1 -0
- package/dist/migrate/supabase/plugin.d.ts +2 -0
- package/dist/migrate/supabase/plugin.js +149 -0
- package/dist/migrate/supabase/plugin.js.map +1 -0
- package/dist/migrate/supertokens/plugin.d.ts +2 -0
- package/dist/migrate/supertokens/plugin.js +114 -0
- package/dist/migrate/supertokens/plugin.js.map +1 -0
- package/dist/migrate/user-table/plugin.d.ts +2 -0
- package/dist/migrate/user-table/plugin.js +62 -0
- package/dist/migrate/user-table/plugin.js.map +1 -0
- package/dist/migrate/userfront/plugin.d.ts +2 -0
- package/dist/migrate/userfront/plugin.js +60 -0
- package/dist/migrate/userfront/plugin.js.map +1 -0
- package/dist/migrate/workos/plugin.d.ts +2 -0
- package/dist/migrate/workos/plugin.js +81 -0
- package/dist/migrate/workos/plugin.js.map +1 -0
- package/dist/migrate/zitadel/plugin.d.ts +2 -0
- package/dist/migrate/zitadel/plugin.js +114 -0
- package/dist/migrate/zitadel/plugin.js.map +1 -0
- package/dist/run.js +6 -0
- package/dist/run.js.map +1 -1
- package/github-action/fga-test/action.yml +43 -0
- package/package.json +9 -6
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchLogtoConfig = fetchLogtoConfig;
|
|
4
|
+
exports.translateLogtoConfig = translateLogtoConfig;
|
|
5
|
+
const record_set_1 = require("./record-set");
|
|
6
|
+
const translate_kit_1 = require("./translate-kit");
|
|
7
|
+
const vendor_http_1 = require("./vendor-http");
|
|
8
|
+
const PAGE = 100;
|
|
9
|
+
async function fetchLogtoConfig(http, endpoint, tenantId) {
|
|
10
|
+
const optional = async (fn, empty) => {
|
|
11
|
+
try {
|
|
12
|
+
return await fn();
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
if (err instanceof vendor_http_1.VendorApiError && [401, 403, 404, 501].includes(err.status))
|
|
16
|
+
return empty;
|
|
17
|
+
throw err;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const list = (path) => optional(async () => {
|
|
21
|
+
const out = [];
|
|
22
|
+
const sep = path.includes('?') ? '&' : '?';
|
|
23
|
+
for (let page = 1; page <= 10_000; page++) {
|
|
24
|
+
const rows = (0, record_set_1.objs)((await http.get(`${path}${sep}page=${page}&page_size=${PAGE}`)).body);
|
|
25
|
+
out.push(...rows);
|
|
26
|
+
if (rows.length < PAGE)
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
}, []);
|
|
31
|
+
const resources = (await list('/api/resources'));
|
|
32
|
+
for (const r of resources) {
|
|
33
|
+
const id = (0, record_set_1.str)(r.id);
|
|
34
|
+
if (id)
|
|
35
|
+
r.scopes = await optional(async () => (0, record_set_1.objs)((await http.get(`/api/resources/${encodeURIComponent(id)}/scopes?page=1&page_size=${PAGE}`)).body), []);
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
endpoint,
|
|
39
|
+
tenantId,
|
|
40
|
+
signInExp: await optional(async () => {
|
|
41
|
+
const { body } = await http.get('/api/sign-in-exp');
|
|
42
|
+
return (0, record_set_1.isObj)(body) ? body : {};
|
|
43
|
+
}, {}),
|
|
44
|
+
connectors: await optional(async () => (0, record_set_1.objs)((await http.get('/api/connectors')).body), []),
|
|
45
|
+
applications: await list('/api/applications'),
|
|
46
|
+
resources,
|
|
47
|
+
roles: (await list('/api/roles')).filter((r) => (0, record_set_1.str)(r.type) !== 'MachineToMachine'),
|
|
48
|
+
hooks: await optional(async () => (0, record_set_1.objs)((await http.get('/api/hooks')).body), []),
|
|
49
|
+
jwtCustomizers: await optional(async () => (0, record_set_1.objs)((await http.get('/api/configs/jwt-customizer')).body), []),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const num = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : undefined);
|
|
53
|
+
function translateLogtoConfig(snap) {
|
|
54
|
+
const b = new translate_kit_1.ConfigBuilder();
|
|
55
|
+
const exp = snap.signInExp;
|
|
56
|
+
const area = 'sign-in experience';
|
|
57
|
+
// ── identifiers and sign-in methods ──
|
|
58
|
+
const methods = (0, record_set_1.objs)((0, record_set_1.isObj)(exp.signIn) ? exp.signIn.methods : undefined);
|
|
59
|
+
const signUp = (0, record_set_1.isObj)(exp.signUp) ? exp.signUp : {};
|
|
60
|
+
const identifiers = new Set([...methods.map((m) => (0, record_set_1.str)(m.identifier)), ...(0, record_set_1.strs)(signUp.identifiers)].filter((x) => !!x));
|
|
61
|
+
const anyPassword = methods.some((m) => m.password === true) || signUp.password === true;
|
|
62
|
+
if (anyPassword) {
|
|
63
|
+
b.set('strategies.password', true);
|
|
64
|
+
b.add('differs', area, 'signIn.methods[].password', 'Password sign-in. Logto password hashes move with a database export (Argon2, bcrypt, SHA-family); a Management API export carries them from Logto 2026.3, and lazy migration (logto preset) covers the rest.', 'auth_config.strategies.password');
|
|
65
|
+
}
|
|
66
|
+
if (identifiers.has('username')) {
|
|
67
|
+
b.set('strategies.username', true);
|
|
68
|
+
b.add('mapped', area, 'signIn.methods[identifier=username]', 'Sign in with a username.', 'auth_config.strategies.username');
|
|
69
|
+
}
|
|
70
|
+
if (methods.some((m) => (0, record_set_1.str)(m.identifier) === 'email' && m.verificationCode === true)) {
|
|
71
|
+
b.set('strategies.emailCode', true);
|
|
72
|
+
b.add('mapped', area, 'signIn.methods[identifier=email].verificationCode', 'Email verification code sign-in.', 'auth_config.strategies.emailCode');
|
|
73
|
+
}
|
|
74
|
+
if (methods.some((m) => (0, record_set_1.str)(m.identifier) === 'phone' && m.verificationCode === true)) {
|
|
75
|
+
b.set('strategies.phoneCode', true);
|
|
76
|
+
b.add('mapped', area, 'signIn.methods[identifier=phone].verificationCode', 'SMS code sign-in (bring your own SMS provider).', 'auth_config.strategies.phoneCode');
|
|
77
|
+
}
|
|
78
|
+
const passkey = (0, record_set_1.isObj)(exp.passkeySignIn) ? exp.passkeySignIn : {};
|
|
79
|
+
if (passkey.enabled === true) {
|
|
80
|
+
b.set('strategies.passkey', true);
|
|
81
|
+
b.add('differs', area, 'passkeySignIn', 'Passkey sign-in. Passkeys move with a database export (public credentials); users keep them when your Atlas domain matches the relying-party id.', 'auth_config.strategies.passkey');
|
|
82
|
+
}
|
|
83
|
+
if (signUp.verify === true && identifiers.has('email')) {
|
|
84
|
+
b.set('requireEmailVerification', true);
|
|
85
|
+
b.add('mapped', area, 'signUp.verify', 'Emails are verified at sign-up.', 'auth_config.requireEmailVerification');
|
|
86
|
+
}
|
|
87
|
+
const mode = (0, record_set_1.str)(exp.signInMode);
|
|
88
|
+
if (mode === 'SignIn') {
|
|
89
|
+
b.set('signUpMode', 'restricted');
|
|
90
|
+
b.add('mapped', area, 'signInMode', 'Self sign-up is closed (invitations and the allowlist still work).', 'auth_config.signUpMode');
|
|
91
|
+
}
|
|
92
|
+
else if (mode === 'Register') {
|
|
93
|
+
b.add('differs', area, 'signInMode', 'Register-only mode has no Atlas counterpart; the sign-in page also signs existing users in.');
|
|
94
|
+
}
|
|
95
|
+
if ((0, record_set_1.isObj)(exp.forgotPasswordMethods) || Array.isArray(exp.forgotPasswordMethods)) {
|
|
96
|
+
b.add('mapped', area, 'forgotPasswordMethods', 'Password reset by email or SMS code follows the enabled strategies.', 'auth_config.accountUx.passwordReset');
|
|
97
|
+
}
|
|
98
|
+
if ((0, record_set_1.str)(exp.agreeToTermsPolicy) && (0, record_set_1.str)(exp.agreeToTermsPolicy) !== 'Automatic') {
|
|
99
|
+
b.add('manual', area, 'agreeToTermsPolicy', 'Terms acceptance at sign-up: configure a policy acceptance requirement in Atlas.', 'policy_acceptance');
|
|
100
|
+
}
|
|
101
|
+
// ── password policy ──
|
|
102
|
+
const pw = (0, record_set_1.isObj)(exp.passwordPolicy) ? exp.passwordPolicy : {};
|
|
103
|
+
const length = (0, record_set_1.isObj)(pw.length) ? pw.length : {};
|
|
104
|
+
const min = num(length.min);
|
|
105
|
+
if (min !== undefined) {
|
|
106
|
+
b.set('passwordPolicy.minLength', Math.max(8, min));
|
|
107
|
+
b.add(min < 8 ? 'differs' : 'mapped', `${area} passwordPolicy`, 'length.min', `${min}${min < 8 ? ' (Atlas requires at least 8; existing passwords still sign in)' : ''}.`, 'auth_config.passwordPolicy.minLength');
|
|
108
|
+
}
|
|
109
|
+
const max = num(length.max);
|
|
110
|
+
if (max !== undefined && max >= 8) {
|
|
111
|
+
b.set('passwordPolicy.maxLength', Math.min(max, 4096));
|
|
112
|
+
b.add('mapped', `${area} passwordPolicy`, 'length.max', `${max}.`, 'auth_config.passwordPolicy.maxLength');
|
|
113
|
+
}
|
|
114
|
+
const rejects = (0, record_set_1.isObj)(pw.rejects) ? pw.rejects : {};
|
|
115
|
+
if (rejects.pwned === true) {
|
|
116
|
+
b.set('passwordPolicy.checkBreaches', true);
|
|
117
|
+
b.add('mapped', `${area} passwordPolicy`, 'rejects.pwned', 'Breached passwords are refused.', 'auth_config.passwordPolicy.checkBreaches');
|
|
118
|
+
}
|
|
119
|
+
if (rejects.userInfo === true) {
|
|
120
|
+
b.set('passwordPolicy.rejectIdentifierSubstring', true);
|
|
121
|
+
b.add('mapped', `${area} passwordPolicy`, 'rejects.userInfo', 'Passwords containing the user\'s own identifiers are refused.', 'auth_config.passwordPolicy.rejectIdentifierSubstring');
|
|
122
|
+
}
|
|
123
|
+
if (rejects.repeatedIdentical === true || rejects.sequential === true || (0, record_set_1.strs)(rejects.words).length) {
|
|
124
|
+
b.add('differs', `${area} passwordPolicy`, 'rejects.repeatedIdentical / sequential / words', 'Atlas follows NIST 800-63B: length and breached-password checks, no pattern or custom-word rules.', 'auth_config.passwordPolicy');
|
|
125
|
+
}
|
|
126
|
+
const types = (0, record_set_1.isObj)(pw.characterTypes) ? num(pw.characterTypes.min) : undefined;
|
|
127
|
+
if (types && types > 1) {
|
|
128
|
+
b.add('differs', `${area} passwordPolicy`, 'characterTypes.min', 'Atlas has no character-class rules (NIST 800-63B); length and the breach check apply.', 'auth_config.passwordPolicy');
|
|
129
|
+
}
|
|
130
|
+
// ── multi-factor ──
|
|
131
|
+
const mfa = (0, record_set_1.isObj)(exp.mfa) ? exp.mfa : {};
|
|
132
|
+
const factors = (0, record_set_1.strs)(mfa.factors);
|
|
133
|
+
if (factors.includes('Totp')) {
|
|
134
|
+
b.set('mfa.factors.totp', true);
|
|
135
|
+
b.add('mapped', `${area} mfa`, 'factors Totp', 'Authenticator apps; TOTP secrets move with a database export.', 'auth_config.mfa.factors.totp');
|
|
136
|
+
}
|
|
137
|
+
if (factors.includes('WebAuthn')) {
|
|
138
|
+
b.set('mfa.factors.passkey', true);
|
|
139
|
+
b.add('differs', `${area} mfa`, 'factors WebAuthn', 'Security keys and passkeys as a second factor; credentials move with a database export.', 'auth_config.mfa.factors.passkey');
|
|
140
|
+
}
|
|
141
|
+
if (factors.includes('BackupCode'))
|
|
142
|
+
b.add('mapped', `${area} mfa`, 'factors BackupCode', 'Backup codes (unused ones move with a database export).', 'auth_config.mfa');
|
|
143
|
+
const policy = (0, record_set_1.str)(mfa.policy);
|
|
144
|
+
if (policy === 'Mandatory') {
|
|
145
|
+
b.set('mfaPolicy', 'required');
|
|
146
|
+
b.add('mapped', `${area} mfa`, 'policy Mandatory', 'A second factor on every sign-in.', 'auth_config.mfaPolicy');
|
|
147
|
+
}
|
|
148
|
+
else if (factors.length) {
|
|
149
|
+
b.set('mfaPolicy', 'optional');
|
|
150
|
+
b.add('differs', `${area} mfa`, `policy ${policy ?? 'UserControlled'}`, 'Users may enrol a second factor; Atlas does not prompt for enrolment at sign-in (use a step-up rule or require MFA).', 'auth_config.mfaPolicy');
|
|
151
|
+
}
|
|
152
|
+
if ((0, record_set_1.isObj)(exp.adaptiveMfa) && exp.adaptiveMfa.enabled === true)
|
|
153
|
+
b.add('differs', `${area} mfa`, 'adaptiveMfa', 'Adaptive MFA: Atlas uses step-up and risk policies instead; review auth_config.stepUp.', 'auth_config.stepUp');
|
|
154
|
+
// ── social and message connectors ──
|
|
155
|
+
for (const c of snap.connectors) {
|
|
156
|
+
const target = (0, record_set_1.str)(c.target) ?? (0, record_set_1.str)(c.connectorId) ?? '';
|
|
157
|
+
const type = (0, record_set_1.str)(c.type);
|
|
158
|
+
const name = (0, record_set_1.str)((0, record_set_1.isObj)(c.metadata) && (0, record_set_1.isObj)(c.metadata.name) ? c.metadata.name.en : undefined) ?? (0, record_set_1.str)(c.connectorId) ?? target;
|
|
159
|
+
if (type === 'Email' || type === 'Sms' || /-(mail|sms)$/.test(target)) {
|
|
160
|
+
b.add('manual', 'connectors', `${name} (${type ?? target})`, 'Message delivery: Atlas sends through your own email / SMS provider (bring-your-own keys): configure it in the dashboard.', 'email_provider');
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const key = (0, translate_kit_1.socialKey)(target);
|
|
164
|
+
if (!key) {
|
|
165
|
+
b.add('manual', 'connectors', `${name} (${target})`, 'No built-in Atlas provider: add it as a custom OAuth provider.', 'custom_oauth_providers');
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const config = (0, record_set_1.isObj)(c.config) ? c.config : {};
|
|
169
|
+
b.socialProvider({ atlasKey: key, vendorName: name, area: 'connectors', setting: `${name} (${target})`, clientId: (0, record_set_1.str)(config.clientId), scopes: (0, record_set_1.str)(config.scope)?.split(/[ ,]+/).filter(Boolean) });
|
|
170
|
+
}
|
|
171
|
+
const targets = (0, record_set_1.strs)(exp.socialSignInConnectorTargets);
|
|
172
|
+
if (targets.length)
|
|
173
|
+
b.add('mapped', area, 'socialSignInConnectorTargets', `${targets.join(', ')} shown on the sign-in page: each enabled provider appears on Atlas's.`, 'oauth_providers');
|
|
174
|
+
if (exp.singleSignOnEnabled === true)
|
|
175
|
+
b.add('mapped', area, 'singleSignOnEnabled', 'Enterprise SSO connectors move with the data export as Atlas SSO connections (update each IdP with Atlas\'s ACS URL / redirect URI).', 'sso_connections');
|
|
176
|
+
// ── applications → redirect URLs and origins ──
|
|
177
|
+
const origins = new Set();
|
|
178
|
+
const redirects = new Set();
|
|
179
|
+
for (const app of snap.applications) {
|
|
180
|
+
const type = (0, record_set_1.str)(app.type);
|
|
181
|
+
const appName = (0, record_set_1.str)(app.name) ?? (0, record_set_1.str)(app.id) ?? '?';
|
|
182
|
+
if (type === 'MachineToMachine') {
|
|
183
|
+
b.add('manual', `applications ${appName}`, 'type MachineToMachine', 'A service app: create an Atlas M2M client for it.', 'oauth_clients');
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (type === 'SAML') {
|
|
187
|
+
b.add('manual', `applications ${appName}`, 'type SAML', 'Logto acting as a SAML identity provider for this app: register it as an Atlas SAML application.', 'oauth_clients');
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (type === 'Protected') {
|
|
191
|
+
b.add('manual', `applications ${appName}`, 'type Protected', 'A Logto protected app (the hosted reverse proxy) has no Atlas counterpart: protect the origin with the Atlas middleware.');
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const oidc = (0, record_set_1.isObj)(app.oidcClientMetadata) ? app.oidcClientMetadata : {};
|
|
195
|
+
for (const u of [...(0, record_set_1.strs)(oidc.redirectUris), ...(0, record_set_1.strs)(oidc.postLogoutRedirectUris)])
|
|
196
|
+
redirects.add(u);
|
|
197
|
+
const custom = (0, record_set_1.isObj)(app.customClientMetadata) ? app.customClientMetadata : {};
|
|
198
|
+
for (const o of (0, record_set_1.strs)(custom.corsAllowedOrigins))
|
|
199
|
+
origins.add(o);
|
|
200
|
+
if (num(custom.idTokenTtl) || num(custom.refreshTokenTtl)) {
|
|
201
|
+
b.add('differs', `applications ${appName}`, 'customClientMetadata idTokenTtl / refreshTokenTtl', 'Atlas sets token lifetimes per instance (auth_config.session), not per application.', 'auth_config.session');
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
let exact = 0;
|
|
205
|
+
for (const url of redirects) {
|
|
206
|
+
if (url.includes('*')) {
|
|
207
|
+
b.add('differs', 'applications', `redirectUris ${url}`, 'Atlas redirect URLs are exact (no wildcards).', 'redirect_urls');
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (!/^https?:\/\//.test(url)) {
|
|
211
|
+
b.add('differs', 'applications', `redirectUris ${url}`, 'A native-app scheme: register it with the Atlas native app, not as a web redirect URL.', 'native_apps');
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
b.push('redirect_urls', { url });
|
|
215
|
+
exact++;
|
|
216
|
+
}
|
|
217
|
+
if (exact)
|
|
218
|
+
b.add('mapped', 'applications', 'oidcClientMetadata.redirectUris / postLogoutRedirectUris', `${exact} redirect URL(s).`, 'redirect_urls');
|
|
219
|
+
if (origins.size) {
|
|
220
|
+
b.instance.allowed_origins = [...origins].filter((o) => !o.includes('*'));
|
|
221
|
+
b.add('mapped', 'applications', 'customClientMetadata.corsAllowedOrigins', 'Allowed origins for the browser SDK.', 'instance.allowed_origins');
|
|
222
|
+
}
|
|
223
|
+
// ── API resources ──
|
|
224
|
+
for (const r of snap.resources) {
|
|
225
|
+
const indicator = (0, record_set_1.str)(r.indicator);
|
|
226
|
+
if (!indicator)
|
|
227
|
+
continue;
|
|
228
|
+
const scopes = (r.scopes ?? []).map((s) => (0, record_set_1.str)(s.name)).filter((s) => !!s);
|
|
229
|
+
b.push('resource_servers', { identifier: indicator, name: (0, record_set_1.str)(r.name) ?? indicator, scopes });
|
|
230
|
+
b.add('mapped', `api resources ${(0, record_set_1.str)(r.name) ?? indicator}`, `indicator ${indicator}`, `An API with ${scopes.length} scope(s); Atlas access tokens for it keep "aud": "${indicator}".`, `resource_servers ${indicator}`);
|
|
231
|
+
if (num(r.accessTokenTtl) && num(r.accessTokenTtl) !== 3600)
|
|
232
|
+
b.add('differs', `api resources ${(0, record_set_1.str)(r.name) ?? indicator}`, 'accessTokenTtl', 'Atlas access-token lifetime is an instance setting (auth_config.session.jwtTtlSeconds).', 'auth_config.session.jwtTtlSeconds');
|
|
233
|
+
}
|
|
234
|
+
// ── roles ──
|
|
235
|
+
for (const r of snap.roles) {
|
|
236
|
+
const name = (0, record_set_1.str)(r.name);
|
|
237
|
+
if (!name)
|
|
238
|
+
continue;
|
|
239
|
+
const key = (0, translate_kit_1.keyOf)(name);
|
|
240
|
+
b.roles[name] = key;
|
|
241
|
+
b.push('roles', { key, name, description: (0, record_set_1.str)(r.description) ?? '', permissions: [] });
|
|
242
|
+
}
|
|
243
|
+
if (snap.roles.length)
|
|
244
|
+
b.add('differs', 'roles', 'roles', `${snap.roles.length} role(s) become Atlas app roles; their API permissions and the user assignments move with the data export.`, 'roles');
|
|
245
|
+
// ── things with no 1:1 ──
|
|
246
|
+
for (const h of snap.hooks) {
|
|
247
|
+
if (h.enabled === false)
|
|
248
|
+
continue;
|
|
249
|
+
const events = [...(0, record_set_1.strs)(h.events), ...((0, record_set_1.str)(h.event) ? [(0, record_set_1.str)(h.event)] : [])];
|
|
250
|
+
b.add('manual', 'webhooks', `${(0, record_set_1.str)(h.name) ?? (0, record_set_1.str)(h.id) ?? '?'} (${events.join(', ') || 'events unknown'})`, 'A Logto webhook: create an Atlas webhook endpoint for the matching events and re-verify the signature in your receiver.', 'webhooks');
|
|
251
|
+
}
|
|
252
|
+
for (const j of snap.jwtCustomizers) {
|
|
253
|
+
const kind = (0, record_set_1.str)(j.key) ?? 'custom JWT';
|
|
254
|
+
b.add('manual', 'custom token claims', kind, 'A custom claims script: recreate its claims as an Atlas JWT template / session claims.', 'jwt_templates');
|
|
255
|
+
}
|
|
256
|
+
if ((0, record_set_1.str)(exp.customCss) || (0, record_set_1.str)(exp.customContent))
|
|
257
|
+
b.add('manual', area, 'customCss / customContent', 'Custom CSS and page content: restyle the Atlas components with the appearance settings.', 'branding');
|
|
258
|
+
b.add('differs', 'sessions', 'session lifetime', 'Logto sessions are not configurable per tenant; set the idle and absolute session windows you want in Atlas (auth_config.session).', 'auth_config.session');
|
|
259
|
+
return b.result(`Logto tenant ${snap.tenantId} (${snap.endpoint})`, {
|
|
260
|
+
bridge: { preset: 'logto', vars: { base_url: snap.endpoint } },
|
|
261
|
+
lazy: { preset: 'logto', config: { base_url: snap.endpoint } },
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=logto-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logto-config.js","sourceRoot":"","sources":["../../../src/migrate/export/logto-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { PasswordHash, UserRecord } from '@atlasauth/migrate';
|
|
2
|
+
import { type Row, type Tables } from './frameworks/tables';
|
|
3
|
+
import { RecordSet, type Obj } from './record-set';
|
|
4
|
+
import { VendorHttp } from './vendor-http';
|
|
5
|
+
/**
|
|
6
|
+
* `atlas migrate export logto` — Logto (self-hosted OSS and Logto Cloud) onto
|
|
7
|
+
* the canonical bundle models. Two ways in:
|
|
8
|
+
*
|
|
9
|
+
* - a DATABASE DUMP of a self-hosted Logto (one file per table, made with
|
|
10
|
+
* `psql \copy … csv header` or `json_agg`, see the guide): everything,
|
|
11
|
+
* including MFA secrets — TOTP keys, WebAuthn credentials (passkeys) and
|
|
12
|
+
* backup codes live in `users.mfa_verifications`, which no API returns;
|
|
13
|
+
* - the MANAGEMENT API with a machine-to-machine app (`client_credentials`
|
|
14
|
+
* against `{endpoint}/oidc/token`, resource `https://{tenant}.logto.app/api`,
|
|
15
|
+
* `default` for OSS): users, roles, organizations, invitations, SSO
|
|
16
|
+
* connectors. The API is asked for password hashes too
|
|
17
|
+
* (`includePasswordHash=true`) and uses them when a Logto version returns
|
|
18
|
+
* them; otherwise passwords move by lazy migration. MFA secrets never
|
|
19
|
+
* leave over the API: those users enrol again.
|
|
20
|
+
*
|
|
21
|
+
* What maps where:
|
|
22
|
+
* - users: username, primary email / phone (Logto only stores them once
|
|
23
|
+
* verified, or set by an admin), name, avatar, OIDC profile, custom data;
|
|
24
|
+
* suspended users arrive banned. `user.id` is the Logto user id, the `sub`
|
|
25
|
+
* of every Logto token.
|
|
26
|
+
* - passwords: Argon2i/id/d PHC strings, bcrypt, unsalted MD5/SHA1/SHA256
|
|
27
|
+
* hex, and `Legacy` expressions (`["sha256", ["salt", "@"], "…"]`): the
|
|
28
|
+
* plain shapes map onto the registry's ids, the rest keep the expression
|
|
29
|
+
* for the `logto_legacy` verifier.
|
|
30
|
+
* - social identities (`users.identities`, keyed by connector target) and
|
|
31
|
+
* enterprise SSO identities (`user_sso_identities`, with their connector);
|
|
32
|
+
* - roles (tenant "User" roles with their API scopes as permissions; M2M
|
|
33
|
+
* roles are app credentials and stay behind), organizations (JIT email
|
|
34
|
+
* domains as verified domains), organization roles with organization and
|
|
35
|
+
* API scopes, memberships, invitations;
|
|
36
|
+
* - personal access tokens (stored in plain text by Logto: Atlas keeps the
|
|
37
|
+
* sha256, so they keep working);
|
|
38
|
+
* - the tenant's public signing keys (`/oidc/jwks`) for the cutover.
|
|
39
|
+
*/
|
|
40
|
+
export interface LogtoExportOptions {
|
|
41
|
+
/** A self-hosted Logto database dump (one table per file). */
|
|
42
|
+
tables?: Tables;
|
|
43
|
+
/** The Logto endpoint (`https://auth.example.com`, `https://abc123.logto.app`): the Management API, the JWKS, the passkey rp id and SAML SP URLs. */
|
|
44
|
+
endpoint?: string;
|
|
45
|
+
/** A machine-to-machine app with the Management API role (API export). */
|
|
46
|
+
m2m?: {
|
|
47
|
+
appId: string;
|
|
48
|
+
appSecret: string;
|
|
49
|
+
};
|
|
50
|
+
/** The tenant: `default` on a self-hosted Logto, the Cloud tenant id (the `abc123` of abc123.logto.app). */
|
|
51
|
+
tenantId?: string;
|
|
52
|
+
/** The WebAuthn relying-party id passkeys were registered on (default: the endpoint's host). */
|
|
53
|
+
rpId?: string;
|
|
54
|
+
/** API export: read each user's personal access tokens too (one call per user). */
|
|
55
|
+
personalAccessTokens?: boolean;
|
|
56
|
+
fetchImpl?: typeof fetch;
|
|
57
|
+
sleep?: (ms: number) => Promise<void>;
|
|
58
|
+
onProgress?: (message: string) => void;
|
|
59
|
+
}
|
|
60
|
+
/** Everything the record mapping needs, the same shape from a dump or the API (camelCase rows). */
|
|
61
|
+
export interface LogtoSnapshot {
|
|
62
|
+
source: 'database' | 'api';
|
|
63
|
+
users: Obj[];
|
|
64
|
+
/** Tenant roles of type User (machine-to-machine roles are left out). */
|
|
65
|
+
roles: Obj[];
|
|
66
|
+
/** Role id → permission (scope) names. */
|
|
67
|
+
rolePermissions: Map<string, string[]>;
|
|
68
|
+
/** User id → role ids. */
|
|
69
|
+
userRoles: Map<string, string[]>;
|
|
70
|
+
organizations: Obj[];
|
|
71
|
+
organizationRoles: Obj[];
|
|
72
|
+
/** Organization role id → organization scope and API scope names. */
|
|
73
|
+
organizationRolePermissions: Map<string, string[]>;
|
|
74
|
+
members: Array<{
|
|
75
|
+
organizationId: string;
|
|
76
|
+
userId: string;
|
|
77
|
+
roleIds: string[];
|
|
78
|
+
}>;
|
|
79
|
+
invitations: Array<{
|
|
80
|
+
row: Obj;
|
|
81
|
+
roleIds: string[];
|
|
82
|
+
}>;
|
|
83
|
+
/** Organization id → JIT email domains. */
|
|
84
|
+
organizationDomains: Map<string, string[]>;
|
|
85
|
+
ssoConnectors: Obj[];
|
|
86
|
+
ssoIdentities: Obj[];
|
|
87
|
+
personalAccessTokens: Obj[];
|
|
88
|
+
jwks: Obj[];
|
|
89
|
+
/** Users carry `mfaVerifications` (a database dump); the API never returns factor secrets. */
|
|
90
|
+
hasFactors: boolean;
|
|
91
|
+
}
|
|
92
|
+
export declare function exportLogto(opts: LogtoExportOptions): Promise<RecordSet>;
|
|
93
|
+
/** `https://auth.example.com/` → `https://auth.example.com` (https only, no path). */
|
|
94
|
+
export declare function normalizeEndpoint(raw: string): string;
|
|
95
|
+
/** The Cloud tenant id of `https://abc123.logto.app`, or null for any other host. */
|
|
96
|
+
export declare function tenantOfEndpoint(endpoint: string): string | null;
|
|
97
|
+
/** The Management API resource indicator of a tenant. */
|
|
98
|
+
export declare function managementResource(tenantId: string): string;
|
|
99
|
+
/** A database row as the Management API would spell it: camelCase keys, JSONB parsed. */
|
|
100
|
+
export declare function logtoRow(row: Row): Obj;
|
|
101
|
+
/** One table's rows of one tenant (a dump made with `where tenant_id = …` has every row already). */
|
|
102
|
+
export declare function tenantRows(tables: Tables, name: string, tenantId: string): Obj[];
|
|
103
|
+
export declare function snapshotFromTables(tables: Tables, tenantId: string): LogtoSnapshot;
|
|
104
|
+
/** A Management API client: an M2M access token fetched (and refreshed) on this machine. */
|
|
105
|
+
export declare function logtoManagementHttp(o: {
|
|
106
|
+
endpoint: string;
|
|
107
|
+
m2m: {
|
|
108
|
+
appId: string;
|
|
109
|
+
appSecret: string;
|
|
110
|
+
};
|
|
111
|
+
tenantId: string;
|
|
112
|
+
fetchImpl?: typeof fetch;
|
|
113
|
+
sleep?: (ms: number) => Promise<void>;
|
|
114
|
+
now?: () => number;
|
|
115
|
+
}): VendorHttp;
|
|
116
|
+
export declare function fetchLogtoSnapshot(o: Omit<LogtoExportOptions, 'tables' | 'endpoint' | 'm2m'> & {
|
|
117
|
+
endpoint: string;
|
|
118
|
+
m2m: {
|
|
119
|
+
appId: string;
|
|
120
|
+
appSecret: string;
|
|
121
|
+
};
|
|
122
|
+
tenantId: string;
|
|
123
|
+
onProgress: (m: string) => void;
|
|
124
|
+
warnings?: string[];
|
|
125
|
+
}): Promise<LogtoSnapshot & {
|
|
126
|
+
warnings: string[];
|
|
127
|
+
}>;
|
|
128
|
+
/** A Logto `Legacy` expression `["algorithm", [args with "@"], "hash"]`, or null. */
|
|
129
|
+
export declare function parseLegacyExpression(value: string): {
|
|
130
|
+
algorithm: string;
|
|
131
|
+
args: string[];
|
|
132
|
+
hash: string;
|
|
133
|
+
} | null;
|
|
134
|
+
/**
|
|
135
|
+
* A Logto password digest and its `password_encryption_method` → the bundle's
|
|
136
|
+
* password. Null when the user has none or Logto itself could not verify it.
|
|
137
|
+
*/
|
|
138
|
+
export declare function mapLogtoPassword(digest: unknown, method: unknown): PasswordHash | null;
|
|
139
|
+
/** One Logto user → a user record (null when it has nothing to sign in with). */
|
|
140
|
+
export declare function mapLogtoUser(u: Obj, roles?: string[]): {
|
|
141
|
+
user: UserRecord | null;
|
|
142
|
+
passwordUnsupported: boolean;
|
|
143
|
+
};
|
|
144
|
+
export declare function buildLogtoRecordSet(snap: LogtoSnapshot & {
|
|
145
|
+
warnings?: string[];
|
|
146
|
+
}, o: {
|
|
147
|
+
endpoint?: string;
|
|
148
|
+
tenantId: string;
|
|
149
|
+
rpId?: string;
|
|
150
|
+
}): RecordSet;
|