rlz-engine 1.0.53 → 1.0.55
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/README.md +225 -0
- package/dist/back/auth/admin-secret.d.ts +4 -0
- package/dist/back/auth/admin-secret.js +86 -0
- package/dist/back/auth/admin-secret.js.map +1 -0
- package/dist/back/auth/cookies.d.ts +12 -0
- package/dist/back/auth/cookies.js +20 -0
- package/dist/back/auth/cookies.js.map +1 -0
- package/dist/back/auth/csrf.d.ts +8 -0
- package/dist/back/auth/csrf.js +47 -0
- package/dist/back/auth/csrf.js.map +1 -0
- package/dist/back/auth/model.d.ts +7 -3
- package/dist/back/auth/module.d.ts +14 -0
- package/dist/back/auth/module.js +121 -0
- package/dist/back/auth/module.js.map +1 -0
- package/dist/back/auth/rate-limit.d.ts +11 -0
- package/dist/back/auth/rate-limit.js +59 -0
- package/dist/back/auth/rate-limit.js.map +1 -0
- package/dist/back/auth/session.d.ts +22 -0
- package/dist/back/auth/session.js +55 -0
- package/dist/back/auth/session.js.map +1 -0
- package/dist/back/auth/storage.d.ts +9 -9
- package/dist/back/auth/storage.js +39 -36
- package/dist/back/auth/storage.js.map +1 -1
- package/dist/back/auth/utils.d.ts +10 -8
- package/dist/back/auth/utils.js +43 -56
- package/dist/back/auth/utils.js.map +1 -1
- package/dist/back/certificate/adm-rpc.d.ts +5 -0
- package/dist/back/certificate/adm-rpc.js +52 -0
- package/dist/back/certificate/adm-rpc.js.map +1 -0
- package/dist/back/certificate/module.d.ts +13 -0
- package/dist/back/certificate/module.js +19 -0
- package/dist/back/certificate/module.js.map +1 -0
- package/dist/back/cli/cli-engine.d.ts +25 -0
- package/dist/back/cli/cli-engine.js +68 -0
- package/dist/back/cli/cli-engine.js.map +1 -0
- package/dist/back/http/module.d.ts +7 -0
- package/dist/back/http/module.js +34 -0
- package/dist/back/http/module.js.map +1 -0
- package/dist/back/http/server.d.ts +22 -0
- package/dist/back/http/server.js +126 -0
- package/dist/back/http/server.js.map +1 -0
- package/dist/back/logger/adm-rpc.d.ts +2 -0
- package/dist/back/logger/adm-rpc.js +50 -0
- package/dist/back/logger/adm-rpc.js.map +1 -0
- package/dist/back/logger/audit-logger.d.ts +97 -0
- package/dist/back/logger/audit-logger.js +155 -0
- package/dist/back/logger/audit-logger.js.map +1 -0
- package/dist/back/logger/cli.d.ts +2 -0
- package/dist/back/logger/cli.js +43 -0
- package/dist/back/logger/cli.js.map +1 -0
- package/dist/back/logger/format.d.ts +3 -0
- package/dist/back/logger/format.js +27 -0
- package/dist/back/logger/format.js.map +1 -0
- package/dist/back/logger/module.d.ts +14 -0
- package/dist/back/logger/module.js +24 -0
- package/dist/back/logger/module.js.map +1 -0
- package/dist/back/logger/sqlite-storage.d.ts +27 -0
- package/dist/back/logger/sqlite-storage.js +169 -0
- package/dist/back/logger/sqlite-storage.js.map +1 -0
- package/dist/back/logger/system-logger.d.ts +27 -0
- package/dist/back/logger/system-logger.js +82 -0
- package/dist/back/logger/system-logger.js.map +1 -0
- package/dist/back/module/composer.d.ts +34 -0
- package/dist/back/module/composer.js +57 -0
- package/dist/back/module/composer.js.map +1 -0
- package/dist/back/rpc/gen.d.ts +2 -1
- package/dist/back/rpc/gen.js +38 -17
- package/dist/back/rpc/gen.js.map +1 -1
- package/dist/back/rpc/module.d.ts +14 -0
- package/dist/back/rpc/module.js +43 -0
- package/dist/back/rpc/module.js.map +1 -0
- package/dist/back/rpc/rpc.d.ts +53 -6
- package/dist/back/rpc/rpc.js +72 -29
- package/dist/back/rpc/rpc.js.map +1 -1
- package/dist/back/storage/db.js +5 -3
- package/dist/back/storage/db.js.map +1 -1
- package/dist/back/storage/model.d.ts +2 -2
- package/dist/back/storage/model.js +2 -2
- package/dist/back/storage/model.js.map +1 -1
- package/dist/back/storage/sync.d.ts +5 -2
- package/dist/back/storage/sync.js +1 -3
- package/dist/back/storage/sync.js.map +1 -1
- package/dist/client/adm/admin.d.ts +17 -0
- package/dist/client/adm/admin.js +62 -0
- package/dist/client/adm/admin.js.map +1 -0
- package/dist/client/adm/audit-logs.d.ts +5 -0
- package/dist/client/adm/audit-logs.js +68 -0
- package/dist/client/adm/audit-logs.js.map +1 -0
- package/dist/client/adm/certificate.d.ts +5 -0
- package/dist/client/adm/certificate.js +48 -0
- package/dist/client/adm/certificate.js.map +1 -0
- package/dist/client/config.d.ts +2 -0
- package/dist/client/config.js +7 -0
- package/dist/client/config.js.map +1 -1
- package/dist/client/rpc.d.ts +4 -4
- package/dist/client/rpc.js +19 -7
- package/dist/client/rpc.js.map +1 -1
- package/dist/client/screens/404.js.map +1 -1
- package/dist/client/screens/SignupSigninScreen.d.ts +13 -1
- package/dist/client/screens/SignupSigninScreen.js +41 -37
- package/dist/client/screens/SignupSigninScreen.js.map +1 -1
- package/dist/client/state/auth.d.ts +13 -7
- package/dist/client/state/auth.js +24 -19
- package/dist/client/state/auth.js.map +1 -1
- package/dist/client/sync.d.ts +7 -2
- package/dist/client/sync.js +5 -3
- package/dist/client/sync.js.map +1 -1
- package/dist/client/widgets/ItemsSelect.js +15 -8
- package/dist/client/widgets/ItemsSelect.js.map +1 -1
- package/package.json +87 -77
- package/dist/back/auth/controllers.d.ts +0 -7
- package/dist/back/auth/controllers.js +0 -39
- package/dist/back/auth/controllers.js.map +0 -1
- package/dist/back/esbuild-plugin-pino.d.ts +0 -6
- package/dist/back/esbuild-plugin-pino.js +0 -87
- package/dist/back/esbuild-plugin-pino.js.map +0 -1
- package/dist/back/logger.d.ts +0 -7
- package/dist/back/logger.js +0 -43
- package/dist/back/logger.js.map +0 -1
- package/dist/back/server.d.ts +0 -17
- package/dist/back/server.js +0 -94
- package/dist/back/server.js.map +0 -1
- package/dist/client/api/api.d.ts +0 -22
- package/dist/client/api/api.js +0 -87
- package/dist/client/api/api.js.map +0 -1
- package/dist/client/api/auth.d.ts +0 -5
- package/dist/client/api/auth.js +0 -22
- package/dist/client/api/auth.js.map +0 -1
- package/dist/shared/api/auth.d.ts +0 -19
- package/dist/shared/api/auth.js +0 -17
- package/dist/shared/api/auth.js.map +0 -1
- package/dist/shared/api/sync.d.ts +0 -21
- package/dist/shared/api/sync.js +0 -22
- package/dist/shared/api/sync.js.map +0 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { LockOutlined, Logout, SecurityOutlined } from '@mui/icons-material';
|
|
2
|
+
import { Alert, AppBar, Box, Button, Container, Drawer, List, ListItemButton, ListItemText, TextField, Toolbar, Typography } from '@mui/material';
|
|
3
|
+
import React, { useState } from 'react';
|
|
4
|
+
export function AdminApp({ modules }) {
|
|
5
|
+
const [secret, setSecret] = useState('');
|
|
6
|
+
const [draft, setDraft] = useState('');
|
|
7
|
+
const [active, setActive] = useState(modules[0]?.name ?? '');
|
|
8
|
+
const [error, setError] = useState('');
|
|
9
|
+
const [authKey, setAuthKey] = useState(0);
|
|
10
|
+
const selected = modules.find((module) => module.name === active) ?? modules[0];
|
|
11
|
+
const authenticate = async () => {
|
|
12
|
+
const candidate = draft.trim();
|
|
13
|
+
if (!candidate)
|
|
14
|
+
return;
|
|
15
|
+
if (modules.length === 0) {
|
|
16
|
+
setError('No administration modules are registered.');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
setError('');
|
|
20
|
+
try {
|
|
21
|
+
if (modules[0])
|
|
22
|
+
await modules[0].verify({ adminSecret: candidate });
|
|
23
|
+
setSecret(candidate);
|
|
24
|
+
setDraft('');
|
|
25
|
+
setAuthKey((key) => key + 1);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
setError('The secret was rejected. Check it and try again.');
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
if (!secret) {
|
|
32
|
+
return (React.createElement(Container, { maxWidth: "xs", sx: { py: 12 } },
|
|
33
|
+
React.createElement(Box, { component: "form", onSubmit: (event) => {
|
|
34
|
+
event.preventDefault();
|
|
35
|
+
void authenticate();
|
|
36
|
+
}, sx: { display: 'grid', gap: 2 } },
|
|
37
|
+
React.createElement(SecurityOutlined, { color: "primary", sx: { fontSize: 48, justifySelf: 'center' } }),
|
|
38
|
+
React.createElement(Typography, { variant: "h5", sx: { textAlign: 'center' } }, "Administration"),
|
|
39
|
+
React.createElement(Typography, { color: "text.secondary", sx: { textAlign: 'center' } }, "Enter the generated admin secret to continue."),
|
|
40
|
+
React.createElement(TextField, { autoFocus: true, label: "Admin secret", type: "password", value: draft, onChange: (event) => setDraft(event.target.value) }),
|
|
41
|
+
error && React.createElement(Alert, { severity: "error" }, error),
|
|
42
|
+
React.createElement(Button, { type: "submit", variant: "contained", startIcon: React.createElement(LockOutlined, null) }, "Sign in"))));
|
|
43
|
+
}
|
|
44
|
+
const Content = selected?.component;
|
|
45
|
+
return (React.createElement(Box, { sx: { minHeight: '100vh', bgcolor: 'background.default' } },
|
|
46
|
+
React.createElement(AppBar, { position: "static" },
|
|
47
|
+
React.createElement(Toolbar, null,
|
|
48
|
+
React.createElement(Typography, { variant: "h6", sx: { flexGrow: 1 } }, "Administration"),
|
|
49
|
+
React.createElement(Button, { color: "inherit", startIcon: React.createElement(Logout, null), onClick: () => {
|
|
50
|
+
setSecret('');
|
|
51
|
+
setActive(modules[0]?.name ?? '');
|
|
52
|
+
} }, "Sign out"))),
|
|
53
|
+
React.createElement(Box, { sx: { display: 'flex' } },
|
|
54
|
+
React.createElement(Drawer, { variant: "permanent", sx: { width: 240, flexShrink: 0, '& .MuiDrawer-paper': { width: 240, top: 64, boxSizing: 'border-box' } } },
|
|
55
|
+
React.createElement(List, null, modules.map((module) => (React.createElement(ListItemButton, { key: module.name, selected: module.name === selected?.name, onClick: () => setActive(module.name) },
|
|
56
|
+
React.createElement(ListItemText, { primary: module.title })))))),
|
|
57
|
+
React.createElement(Container, { maxWidth: "xl", sx: { py: 4 } }, Content ? (React.createElement(Content, { key: authKey, auth: { adminSecret: secret } })) : (React.createElement(Typography, null, "No administration modules are registered."))))));
|
|
58
|
+
}
|
|
59
|
+
export function AdmPanel({ children }) {
|
|
60
|
+
return React.createElement(Box, { sx: { display: 'grid', gap: 2 } }, children);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/client/adm/admin.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Alert, Button, Chip, MenuItem, Paper, Stack, Table, TableBody, TableCell, TableHead, TableRow, TextField, Typography } from '@mui/material';
|
|
2
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
3
|
+
import { admRpcCall } from '../rpc.js';
|
|
4
|
+
export function AuditLogs({ auth }) {
|
|
5
|
+
const [page, setPage] = useState();
|
|
6
|
+
const [level, setLevel] = useState('');
|
|
7
|
+
const [moduleName, setModuleName] = useState('');
|
|
8
|
+
const [offset, setOffset] = useState(0);
|
|
9
|
+
const [error, setError] = useState('');
|
|
10
|
+
const load = useCallback(async () => {
|
|
11
|
+
try {
|
|
12
|
+
setError('');
|
|
13
|
+
setPage(await admRpcCall(auth, 'audit', 'logs', 1, {
|
|
14
|
+
...(moduleName ? { module: moduleName } : {}),
|
|
15
|
+
...(level ? { level: level } : {}),
|
|
16
|
+
limit: 100,
|
|
17
|
+
offset
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
catch (cause) {
|
|
21
|
+
setError(cause instanceof Error ? cause.message : 'Unable to load audit records.');
|
|
22
|
+
}
|
|
23
|
+
}, [auth, level, moduleName, offset]);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
void load();
|
|
26
|
+
}, [load]);
|
|
27
|
+
return (React.createElement(Stack, { spacing: 2 },
|
|
28
|
+
React.createElement(Typography, { variant: "h4" }, "Audit log"),
|
|
29
|
+
React.createElement(Stack, { direction: "row", spacing: 2 },
|
|
30
|
+
React.createElement(TextField, { label: "Module", value: moduleName, onChange: (event) => {
|
|
31
|
+
setModuleName(event.target.value);
|
|
32
|
+
setOffset(0);
|
|
33
|
+
} }),
|
|
34
|
+
React.createElement(TextField, { select: true, label: "Level", value: level, onChange: (event) => {
|
|
35
|
+
setLevel(event.target.value);
|
|
36
|
+
setOffset(0);
|
|
37
|
+
}, sx: { minWidth: 140 } },
|
|
38
|
+
React.createElement(MenuItem, { value: "" }, "All levels"),
|
|
39
|
+
['fatal', 'error', 'warn', 'info', 'debug', 'trace'].map((value) => (React.createElement(MenuItem, { key: value, value: value }, value)))),
|
|
40
|
+
React.createElement(Button, { onClick: () => void load() }, "Refresh")),
|
|
41
|
+
error && React.createElement(Alert, { severity: "error" }, error),
|
|
42
|
+
React.createElement(Paper, { variant: "outlined", sx: { overflowX: 'auto' } },
|
|
43
|
+
React.createElement(Table, { size: "small" },
|
|
44
|
+
React.createElement(TableHead, null,
|
|
45
|
+
React.createElement(TableRow, null,
|
|
46
|
+
React.createElement(TableCell, null, "Time"),
|
|
47
|
+
React.createElement(TableCell, null, "Level"),
|
|
48
|
+
React.createElement(TableCell, null, "Module"),
|
|
49
|
+
React.createElement(TableCell, null, "Event"),
|
|
50
|
+
React.createElement(TableCell, null, "Details"))),
|
|
51
|
+
React.createElement(TableBody, null, page?.records.map((record) => (React.createElement(TableRow, { key: record.id, hover: true },
|
|
52
|
+
React.createElement(TableCell, { sx: { whiteSpace: 'nowrap' } }, new Date(record.time).toLocaleString()),
|
|
53
|
+
React.createElement(TableCell, null,
|
|
54
|
+
React.createElement(Chip, { size: "small", label: record.level, color: record.level === 'error' || record.level === 'fatal'
|
|
55
|
+
? 'error'
|
|
56
|
+
: record.level === 'warn'
|
|
57
|
+
? 'warning'
|
|
58
|
+
: 'default' })),
|
|
59
|
+
React.createElement(TableCell, null, record.module),
|
|
60
|
+
React.createElement(TableCell, null, record.type),
|
|
61
|
+
React.createElement(TableCell, { sx: { minWidth: 300, maxWidth: 560 } },
|
|
62
|
+
React.createElement("pre", { style: { margin: 0, whiteSpace: 'pre-wrap', overflowWrap: 'anywhere' } }, JSON.stringify({ ...(record.data ?? {}), ...(record.error ? { error: record.error } : {}) }, null, 2))))))))),
|
|
63
|
+
React.createElement(Stack, { direction: "row", spacing: 2, sx: { alignItems: 'center' } },
|
|
64
|
+
React.createElement(Typography, { color: "text.secondary" }, page ? `${page.total} records` : 'Loading…'),
|
|
65
|
+
React.createElement(Button, { disabled: offset === 0, onClick: () => setOffset(Math.max(0, offset - 100)) }, "Newer"),
|
|
66
|
+
React.createElement(Button, { disabled: !page || offset + 100 >= page.total, onClick: () => setOffset(offset + 100) }, "Older"))));
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=audit-logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-logs.js","sourceRoot":"","sources":["../../../src/client/adm/audit-logs.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Alert, Button, Chip, Paper, Stack, Typography } from '@mui/material';
|
|
2
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
3
|
+
import { admRpcCall } from '../rpc.js';
|
|
4
|
+
function formatDate(value) {
|
|
5
|
+
return value === undefined ? '—' : new Date(value).toLocaleString();
|
|
6
|
+
}
|
|
7
|
+
export function CertificateStatus({ auth }) {
|
|
8
|
+
const [status, setStatus] = useState();
|
|
9
|
+
const [error, setError] = useState('');
|
|
10
|
+
const load = useCallback(async () => {
|
|
11
|
+
try {
|
|
12
|
+
setError('');
|
|
13
|
+
setStatus(await admRpcCall(auth, 'certificate', 'status', 1, {}));
|
|
14
|
+
}
|
|
15
|
+
catch (cause) {
|
|
16
|
+
setError(cause instanceof Error ? cause.message : 'Unable to load certificate status.');
|
|
17
|
+
}
|
|
18
|
+
}, [auth]);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
void load();
|
|
21
|
+
}, [load]);
|
|
22
|
+
return (React.createElement(Stack, { spacing: 2 },
|
|
23
|
+
React.createElement(Typography, { variant: "h4" }, "TLS certificate"),
|
|
24
|
+
error && React.createElement(Alert, { severity: "error" }, error),
|
|
25
|
+
status && (React.createElement(Paper, { variant: "outlined", sx: { p: 3 } },
|
|
26
|
+
React.createElement(Stack, { spacing: 2 },
|
|
27
|
+
React.createElement(Stack, { direction: "row", spacing: 2, sx: { alignItems: 'center' } },
|
|
28
|
+
React.createElement(Typography, { variant: "h6" }, status.domain),
|
|
29
|
+
React.createElement(Chip, { label: !status.certificateFound
|
|
30
|
+
? 'Missing'
|
|
31
|
+
: status.expired
|
|
32
|
+
? 'Expired'
|
|
33
|
+
: status.renewalOverdue
|
|
34
|
+
? 'Renewal due'
|
|
35
|
+
: 'Valid', color: status.expired ? 'error' : !status.certificateFound || status.renewalOverdue ? 'warning' : 'success' })),
|
|
36
|
+
!status.certificateFound && (React.createElement(Alert, { severity: "warning" }, "No certificate is available yet. The server will request one during startup.")),
|
|
37
|
+
React.createElement(Typography, null,
|
|
38
|
+
"Issued: ",
|
|
39
|
+
formatDate(status.issuedAt)),
|
|
40
|
+
React.createElement(Typography, null,
|
|
41
|
+
"Expires: ",
|
|
42
|
+
formatDate(status.expiresAt)),
|
|
43
|
+
React.createElement(Typography, null,
|
|
44
|
+
"Renewal window starts: ",
|
|
45
|
+
formatDate(status.renewalAt)),
|
|
46
|
+
React.createElement(Button, { onClick: () => void load(), sx: { alignSelf: 'flex-start' } }, "Refresh"))))));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=certificate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"certificate.js","sourceRoot":"","sources":["../../../src/client/adm/certificate.tsx"],"names":[],"mappings":"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"}
|
package/dist/client/config.d.ts
CHANGED
|
@@ -2,5 +2,7 @@ export declare const PRODUCTION: boolean;
|
|
|
2
2
|
export interface FrontConfig {
|
|
3
3
|
apiDomain: string;
|
|
4
4
|
}
|
|
5
|
+
export declare function setCsrfToken(token: string | null): void;
|
|
6
|
+
export declare function getCsrfToken(): string | null;
|
|
5
7
|
export declare function initFrontConfig(cfg: FrontConfig): void;
|
|
6
8
|
export declare function getFrontConfig(): FrontConfig;
|
package/dist/client/config.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
export const PRODUCTION = process.env.NODE_ENV === 'production';
|
|
2
2
|
let frontConfig = null;
|
|
3
|
+
let csrfToken = null;
|
|
4
|
+
export function setCsrfToken(token) {
|
|
5
|
+
csrfToken = token;
|
|
6
|
+
}
|
|
7
|
+
export function getCsrfToken() {
|
|
8
|
+
return csrfToken;
|
|
9
|
+
}
|
|
3
10
|
export function initFrontConfig(cfg) {
|
|
4
11
|
if (frontConfig !== null) {
|
|
5
12
|
throw Error('frontConfig already initialized!');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/client/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAA;AAM/D,IAAI,WAAW,GAAuB,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/client/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAA;AAM/D,IAAI,WAAW,GAAuB,IAAI,CAAA;AAC1C,IAAI,SAAS,GAAkB,IAAI,CAAA;AAEnC,MAAM,UAAU,YAAY,CAAC,KAAoB;IAC7C,SAAS,GAAG,KAAK,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,YAAY;IACxB,OAAO,SAAS,CAAA;AACpB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAgB;IAC5C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACnD,CAAC;IAED,WAAW,GAAG,GAAG,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,cAAc;IAC1B,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACvB,WAAW,GAAG;YACV,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,wBAAwB;SACzD,CAAA;IACL,CAAC;IAED,OAAO,WAAW,CAAA;AACtB,CAAC"}
|
package/dist/client/rpc.d.ts
CHANGED
|
@@ -14,8 +14,8 @@ export declare class Forbidden extends HttpError {
|
|
|
14
14
|
export declare class NotFound extends HttpError {
|
|
15
15
|
constructor(url: string, statusText: string);
|
|
16
16
|
}
|
|
17
|
-
export interface
|
|
18
|
-
|
|
19
|
-
tempPassword: string;
|
|
17
|
+
export interface AdmAuthParam {
|
|
18
|
+
adminSecret: string;
|
|
20
19
|
}
|
|
21
|
-
export declare function rpcCall<BodyT extends object, RespT extends object>(
|
|
20
|
+
export declare function rpcCall<BodyT extends object, RespT extends object>(rpcName: string, callName: string, version: number, bodyObject: BodyT): Promise<RespT>;
|
|
21
|
+
export declare function admRpcCall<BodyT extends object, RespT extends object>(auth: AdmAuthParam, rpcName: string, callName: string, version: number, bodyObject: BodyT): Promise<RespT>;
|
package/dist/client/rpc.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getFrontConfig } from './config.js';
|
|
1
|
+
import { getCsrfToken, getFrontConfig } from './config.js';
|
|
2
2
|
export class HttpError extends Error {
|
|
3
3
|
method;
|
|
4
4
|
url;
|
|
@@ -31,6 +31,10 @@ function url(rpcName, callName, version) {
|
|
|
31
31
|
const domain = getFrontConfig().apiDomain;
|
|
32
32
|
return `${domain}rpc/${rpcName}_${callName}_v${version}`;
|
|
33
33
|
}
|
|
34
|
+
function admUrl(rpcName, callName, version) {
|
|
35
|
+
const domain = getFrontConfig().apiDomain;
|
|
36
|
+
return `${domain}.adm/rpc/${rpcName}_${callName}_v${version}`;
|
|
37
|
+
}
|
|
34
38
|
const GZIP_THRESHOLD = 16 * 1024;
|
|
35
39
|
async function prepareBody(request) {
|
|
36
40
|
const textBody = JSON.stringify(request);
|
|
@@ -41,7 +45,14 @@ async function prepareBody(request) {
|
|
|
41
45
|
const bodyStreamCompressed = bodyStream.pipeThrough(new CompressionStream('gzip'));
|
|
42
46
|
return new Response(bodyStreamCompressed).blob();
|
|
43
47
|
}
|
|
44
|
-
export async function rpcCall(
|
|
48
|
+
export async function rpcCall(rpcName, callName, version, bodyObject) {
|
|
49
|
+
const csrfToken = getCsrfToken() ?? undefined;
|
|
50
|
+
return request(url(rpcName, callName, version), undefined, bodyObject, csrfToken);
|
|
51
|
+
}
|
|
52
|
+
export async function admRpcCall(auth, rpcName, callName, version, bodyObject) {
|
|
53
|
+
return request(admUrl(rpcName, callName, version), `Bearer ${auth.adminSecret}`, bodyObject);
|
|
54
|
+
}
|
|
55
|
+
async function request(u, authorization, bodyObject, csrfToken) {
|
|
45
56
|
const headers = {};
|
|
46
57
|
const body = await prepareBody(bodyObject);
|
|
47
58
|
if (body !== undefined) {
|
|
@@ -50,14 +61,15 @@ export async function rpcCall(auth, rpcName, callName, version, bodyObject) {
|
|
|
50
61
|
headers['content-encoding'] = 'gzip';
|
|
51
62
|
}
|
|
52
63
|
}
|
|
53
|
-
if (
|
|
54
|
-
headers['authorization'] =
|
|
55
|
-
|
|
56
|
-
|
|
64
|
+
if (authorization !== undefined)
|
|
65
|
+
headers['authorization'] = authorization;
|
|
66
|
+
if (csrfToken !== undefined)
|
|
67
|
+
headers['x-csrf-token'] = csrfToken;
|
|
57
68
|
const resp = await fetch(u, {
|
|
58
69
|
method: 'post',
|
|
59
70
|
headers,
|
|
60
|
-
body
|
|
71
|
+
body,
|
|
72
|
+
credentials: 'same-origin'
|
|
61
73
|
});
|
|
62
74
|
if (!resp.ok) {
|
|
63
75
|
if (resp.status === 401) {
|
package/dist/client/rpc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/client/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/client/rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"404.js","sourceRoot":"","sources":["../../../src/client/screens/404.tsx"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,mBAAmB,CAAA;AACnC,OAAO,KAAK,MAAM,qBAAqB,CAAA;AACvC,OAAO,UAAU,MAAM,0BAA0B,CAAA;AACjD,OAAO,KAAc,MAAM,OAAO,CAAA;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEvC,MAAM,UAAU,QAAQ;IACpB,OAAO,CACH,oBAAC,KAAK,IACF,EAAE,EAAE;YACA,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,OAAO;YACf,cAAc,EAAE,QAAQ;YACxB,UAAU,EAAE,QAAQ;SACvB;QAED,oBAAC,GAAG,IAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAG,KAAK,CAAO;QACzC,oBAAC,GAAG;YACA,oBAAC,IAAI,IAAC,EAAE,EAAE,GAAG;
|
|
1
|
+
{"version":3,"file":"404.js","sourceRoot":"","sources":["../../../src/client/screens/404.tsx"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,mBAAmB,CAAA;AACnC,OAAO,KAAK,MAAM,qBAAqB,CAAA;AACvC,OAAO,UAAU,MAAM,0BAA0B,CAAA;AACjD,OAAO,KAAc,MAAM,OAAO,CAAA;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEvC,MAAM,UAAU,QAAQ;IACpB,OAAO,CACH,oBAAC,KAAK,IACF,EAAE,EAAE;YACA,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,OAAO;YACf,cAAc,EAAE,QAAQ;YACxB,UAAU,EAAE,QAAQ;SACvB;QAED,oBAAC,GAAG,IAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAG,KAAK,CAAO;QACzC,oBAAC,GAAG;YACA,oBAAC,IAAI,IAAC,EAAE,EAAE,GAAG;gBACT,oBAAC,UAAU,IAAC,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,IACjE,cAAc,CACN,CACV,CACL,CACF,CACX,CAAA;AACL,CAAC"}
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import { JSX } from 'react';
|
|
2
|
+
export interface SignupSigninAuthClient {
|
|
3
|
+
signup: (name: string, email: string, password: string) => Promise<void>;
|
|
4
|
+
signin: (name: string, password: string) => Promise<AuthResult>;
|
|
5
|
+
session: () => Promise<AuthResult>;
|
|
6
|
+
}
|
|
7
|
+
interface AuthResult {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
email: string;
|
|
11
|
+
csrfToken: string;
|
|
12
|
+
}
|
|
2
13
|
interface SignupSigninScreenProps {
|
|
3
14
|
appName: string;
|
|
15
|
+
authClient: SignupSigninAuthClient;
|
|
4
16
|
}
|
|
5
|
-
export declare function SignupSigninScreen({ appName }: SignupSigninScreenProps): JSX.Element;
|
|
17
|
+
export declare function SignupSigninScreen({ appName, authClient }: SignupSigninScreenProps): JSX.Element;
|
|
6
18
|
export {};
|
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
import { Box, Button, CircularProgress, Stack, Tab, Tabs, TextField, Typography } from '@mui/material';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import { useCallback, useState } from 'react';
|
|
3
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
4
4
|
import { useLocation, useNavigate } from 'react-router-dom';
|
|
5
5
|
import { z } from 'zod';
|
|
6
|
-
import { apiSignin, apiSignup } from '../api/auth.js';
|
|
7
6
|
import { useAuthState } from '../state/auth.js';
|
|
8
|
-
export function SignupSigninScreen({ appName }) {
|
|
7
|
+
export function SignupSigninScreen({ appName, authClient }) {
|
|
9
8
|
const location = useLocation();
|
|
10
9
|
const navigate = useNavigate();
|
|
10
|
+
const login = useAuthState((state) => state.login);
|
|
11
11
|
const tab = location.pathname.substring(1);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
let active = true;
|
|
14
|
+
void authClient
|
|
15
|
+
.session()
|
|
16
|
+
.then((session) => {
|
|
17
|
+
if (!active)
|
|
18
|
+
return;
|
|
19
|
+
login(session.id, session.name, session.email, session.csrfToken);
|
|
20
|
+
void navigate('/');
|
|
21
|
+
})
|
|
22
|
+
.catch(() => { });
|
|
23
|
+
return () => {
|
|
24
|
+
active = false;
|
|
25
|
+
};
|
|
26
|
+
}, [authClient, login, navigate]);
|
|
12
27
|
return (React.createElement(Stack, { sx: { p: 1, gap: 1, maxWidth: '500px', mx: 'auto', mt: 10 } },
|
|
13
28
|
React.createElement(Typography, { variant: 'h3', sx: { textAlign: 'center' } }, appName),
|
|
14
29
|
React.createElement(Tabs, { value: tab, variant: 'fullWidth', onChange: (_, tab) => {
|
|
@@ -16,14 +31,12 @@ export function SignupSigninScreen({ appName }) {
|
|
|
16
31
|
} },
|
|
17
32
|
React.createElement(Tab, { value: 'signin', label: 'Signin' }),
|
|
18
33
|
React.createElement(Tab, { value: 'signup', label: 'Signup' })),
|
|
19
|
-
tab === 'signup'
|
|
20
|
-
|
|
21
|
-
tab === 'signin'
|
|
22
|
-
&& React.createElement(SigninForm, null)));
|
|
34
|
+
tab === 'signup' && React.createElement(SignupForm, { authClient: authClient }),
|
|
35
|
+
tab === 'signin' && React.createElement(SigninForm, { authClient: authClient })));
|
|
23
36
|
}
|
|
24
|
-
function SignupForm() {
|
|
37
|
+
function SignupForm({ authClient }) {
|
|
25
38
|
const navigate = useNavigate();
|
|
26
|
-
const login = useAuthState(i => i.login);
|
|
39
|
+
const login = useAuthState((i) => i.login);
|
|
27
40
|
const [syncInProgress, setSyncInProgress] = useState(false);
|
|
28
41
|
const [name, setName] = useState('');
|
|
29
42
|
const [nameActivated, setNameActivated] = useState(false);
|
|
@@ -37,7 +50,7 @@ function SignupForm() {
|
|
|
37
50
|
setSyncInProgress(true);
|
|
38
51
|
setTimeout(async () => {
|
|
39
52
|
try {
|
|
40
|
-
await signup(login, name, email, password, password2);
|
|
53
|
+
await signup(authClient, login, name, email, password, password2);
|
|
41
54
|
void navigate('/');
|
|
42
55
|
}
|
|
43
56
|
finally {
|
|
@@ -50,19 +63,15 @@ function SignupForm() {
|
|
|
50
63
|
setNameActivated(true);
|
|
51
64
|
setName(e.target.value);
|
|
52
65
|
}, autoFocus: true }),
|
|
53
|
-
React.createElement(TextField, { label: 'E-mail', type: 'email', value: email, error: emailActivated && !isValidEmail(email), helperText: emailActivated ? (isValidEmail(email) ? 'ok' : 'Invalid e-mail address') : 'required', onChange: e => setEmail(e.target.value), onFocus: () => setEmailActivated(true) }),
|
|
54
|
-
React.createElement(TextField, { label: 'Password', type: 'password', value: password, error: passwordActivated && password
|
|
55
|
-
React.createElement(TextField, { label: 'Confirm password', type: 'password', value: password2, error: password2Activated && password2 !== password, helperText: password2Activated ? (password2 !== password ? 'Do not match' : 'ok') : 'required', onChange: e => setPassword2(e.target.value), onFocus: () => setPassword2Activated(true), onKeyDown: (e) => {
|
|
66
|
+
React.createElement(TextField, { label: 'E-mail', type: 'email', value: email, error: emailActivated && !isValidEmail(email), helperText: emailActivated ? (isValidEmail(email) ? 'ok' : 'Invalid e-mail address') : 'required', onChange: (e) => setEmail(e.target.value), onFocus: () => setEmailActivated(true) }),
|
|
67
|
+
React.createElement(TextField, { label: 'Password', type: 'password', value: password, error: passwordActivated && password.length < 12, helperText: passwordActivated ? (password.length < 12 ? 'Use at least 12 characters' : 'ok') : 'required', onChange: (e) => setPassword(e.target.value), onFocus: () => setPasswordActivated(true) }),
|
|
68
|
+
React.createElement(TextField, { label: 'Confirm password', type: 'password', value: password2, error: password2Activated && password2 !== password, helperText: password2Activated ? (password2 !== password ? 'Do not match' : 'ok') : 'required', onChange: (e) => setPassword2(e.target.value), onFocus: () => setPassword2Activated(true), onKeyDown: (e) => {
|
|
56
69
|
if (e.key === 'Enter') {
|
|
57
70
|
doSignUp();
|
|
58
71
|
}
|
|
59
72
|
} }),
|
|
60
73
|
React.createElement(Box, { sx: { m: 1, position: 'relative' } },
|
|
61
|
-
React.createElement(Button, { variant: 'contained', fullWidth: true, disabled: name === ''
|
|
62
|
-
|| !isValidEmail(email)
|
|
63
|
-
|| password === ''
|
|
64
|
-
|| password2 !== password
|
|
65
|
-
|| syncInProgress, onClick: doSignUp }, 'Signup'),
|
|
74
|
+
React.createElement(Button, { variant: 'contained', fullWidth: true, disabled: name === '' || !isValidEmail(email) || password.length < 12 || password2 !== password || syncInProgress, onClick: doSignUp }, 'Signup'),
|
|
66
75
|
syncInProgress && (React.createElement(CircularProgress, { size: 24, sx: {
|
|
67
76
|
position: 'absolute',
|
|
68
77
|
top: '50%',
|
|
@@ -71,18 +80,15 @@ function SignupForm() {
|
|
|
71
80
|
marginLeft: '-12px'
|
|
72
81
|
} })))));
|
|
73
82
|
}
|
|
74
|
-
async function signup(login, name, email, password, password2) {
|
|
75
|
-
if (name === ''
|
|
76
|
-
|| !isValidEmail(email)
|
|
77
|
-
|| password === ''
|
|
78
|
-
|| password2 !== password) {
|
|
83
|
+
async function signup(authClient, login, name, email, password, password2) {
|
|
84
|
+
if (name === '' || !isValidEmail(email) || password.length < 12 || password2 !== password) {
|
|
79
85
|
return;
|
|
80
86
|
}
|
|
81
|
-
|
|
82
|
-
|
|
87
|
+
await authClient.signup(name, email, password);
|
|
88
|
+
await signin(authClient, login, name, password);
|
|
83
89
|
}
|
|
84
|
-
function SigninForm() {
|
|
85
|
-
const login = useAuthState(i => i.login);
|
|
90
|
+
function SigninForm({ authClient }) {
|
|
91
|
+
const login = useAuthState((i) => i.login);
|
|
86
92
|
const [syncInProgress, setSyncInProgress] = useState(false);
|
|
87
93
|
const navigate = useNavigate();
|
|
88
94
|
const [name, setName] = useState('');
|
|
@@ -91,7 +97,7 @@ function SigninForm() {
|
|
|
91
97
|
setSyncInProgress(true);
|
|
92
98
|
setTimeout(async () => {
|
|
93
99
|
try {
|
|
94
|
-
await signin(login, name, password);
|
|
100
|
+
await signin(authClient, login, name, password);
|
|
95
101
|
void navigate('/');
|
|
96
102
|
}
|
|
97
103
|
finally {
|
|
@@ -100,16 +106,14 @@ function SigninForm() {
|
|
|
100
106
|
}, 0);
|
|
101
107
|
}, [name, password]);
|
|
102
108
|
return (React.createElement(Stack, { sx: { gap: 2, mt: 2 } },
|
|
103
|
-
React.createElement(TextField, { label: 'Name', value: name, onChange: e => setName(e.target.value), autoFocus: true }),
|
|
104
|
-
React.createElement(TextField, { label: 'Password', type: 'password', value: password, onChange: e => setPassword(e.target.value), onKeyDown: (e) => {
|
|
109
|
+
React.createElement(TextField, { label: 'Name', value: name, onChange: (e) => setName(e.target.value), autoFocus: true }),
|
|
110
|
+
React.createElement(TextField, { label: 'Password', type: 'password', value: password, onChange: (e) => setPassword(e.target.value), onKeyDown: (e) => {
|
|
105
111
|
if (e.key === 'Enter') {
|
|
106
112
|
doSignIn();
|
|
107
113
|
}
|
|
108
114
|
} }),
|
|
109
115
|
React.createElement(Box, { sx: { m: 1, position: 'relative' } },
|
|
110
|
-
React.createElement(Button, { variant: 'contained', fullWidth: true, disabled: name === ''
|
|
111
|
-
|| password === ''
|
|
112
|
-
|| syncInProgress, onClick: doSignIn }, 'Signin'),
|
|
116
|
+
React.createElement(Button, { variant: 'contained', fullWidth: true, disabled: name === '' || password === '' || syncInProgress, onClick: doSignIn }, 'Signin'),
|
|
113
117
|
syncInProgress && (React.createElement(CircularProgress, { size: 24, sx: {
|
|
114
118
|
position: 'absolute',
|
|
115
119
|
top: '50%',
|
|
@@ -118,11 +122,11 @@ function SigninForm() {
|
|
|
118
122
|
marginLeft: '-12px'
|
|
119
123
|
} })))));
|
|
120
124
|
}
|
|
121
|
-
async function signin(login, name, password) {
|
|
122
|
-
const resp = await
|
|
123
|
-
login(resp.id, resp.name, resp.email, resp.
|
|
125
|
+
async function signin(authClient, login, name, password) {
|
|
126
|
+
const resp = await authClient.signin(name, password);
|
|
127
|
+
login(resp.id, resp.name, resp.email, resp.csrfToken);
|
|
124
128
|
}
|
|
125
129
|
function isValidEmail(s) {
|
|
126
|
-
return z.
|
|
130
|
+
return z.email().safeParse(s).success;
|
|
127
131
|
}
|
|
128
132
|
//# sourceMappingURL=SignupSigninScreen.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignupSigninScreen.js","sourceRoot":"","sources":["../../../src/client/screens/SignupSigninScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AACtG,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAO,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"SignupSigninScreen.js","sourceRoot":"","sources":["../../../src/client/screens/SignupSigninScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AACtG,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAO,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAa,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAoB1D,MAAM,UAAU,kBAAkB,CAAC,EAAE,OAAO,EAAE,UAAU,EAA2B;IAC/E,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAClD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAE1C,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,MAAM,GAAG,IAAI,CAAA;QACjB,KAAK,UAAU;aACV,OAAO,EAAE;aACT,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YACd,IAAI,CAAC,MAAM;gBAAE,OAAM;YACnB,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;YACjE,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACpB,OAAO,GAAG,EAAE;YACR,MAAM,GAAG,KAAK,CAAA;QAClB,CAAC,CAAA;IACL,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEjC,OAAO,CACH,oBAAC,KAAK,IAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE;QAC9D,oBAAC,UAAU,IAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,IACjD,OAAO,CACC;QACb,oBAAC,IAAI,IACD,KAAK,EAAE,GAAG,EACV,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;gBACjB,KAAK,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,CAAA;YAC5B,CAAC;YAED,oBAAC,GAAG,IAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAI;YACzC,oBAAC,GAAG,IAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAI,CACtC;QACN,GAAG,KAAK,QAAQ,IAAI,oBAAC,UAAU,IAAC,UAAU,EAAE,UAAU,GAAI;QAC1D,GAAG,KAAK,QAAQ,IAAI,oBAAC,UAAU,IAAC,UAAU,EAAE,UAAU,GAAI,CACvD,CACX,CAAA;AACL,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,UAAU,EAA0C;IACtE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IAC1C,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACpC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACzD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACtC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5C,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACjE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC9C,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEnE,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACvB,UAAU,CAAC,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC;gBACD,MAAM,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;gBACjE,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAA;YACtB,CAAC;oBAAS,CAAC;gBACP,iBAAiB,CAAC,KAAK,CAAC,CAAA;YAC5B,CAAC;QACL,CAAC,EAAE,CAAC,CAAC,CAAA;IACT,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;IAEtC,OAAO,CACH,oBAAC,KAAK,IAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;QACxB,oBAAC,SAAS,IACN,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,IAAI,EACX,KAAK,EAAE,aAAa,IAAI,IAAI,KAAK,EAAE,EACnC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAC1F,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gBACZ,gBAAgB,CAAC,IAAI,CAAC,CAAA;gBACtB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC3B,CAAC,EACD,SAAS,SACX;QACF,oBAAC,SAAS,IACN,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,cAAc,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAC7C,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,UAAU,EACjG,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,GACxC;QACF,oBAAC,SAAS,IACN,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,iBAAiB,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,EAChD,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EACzG,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5C,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAC3C;QACF,oBAAC,SAAS,IACN,KAAK,EAAE,kBAAkB,EACzB,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,kBAAkB,IAAI,SAAS,KAAK,QAAQ,EACnD,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAC9F,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC7C,OAAO,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAC1C,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;oBACpB,QAAQ,EAAE,CAAA;gBACd,CAAC;YACL,CAAC,GACH;QACF,oBAAC,GAAG,IAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE;YACnC,oBAAC,MAAM,IACH,OAAO,EAAE,WAAW,EACpB,SAAS,QACT,QAAQ,EAAE,IAAI,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,IAAI,SAAS,KAAK,QAAQ,IAAI,cAAc,EACjH,OAAO,EAAE,QAAQ,IAEhB,QAAQ,CACJ;YACR,cAAc,IAAI,CACf,oBAAC,gBAAgB,IACb,IAAI,EAAE,EAAE,EACR,EAAE,EAAE;oBACA,QAAQ,EAAE,UAAU;oBACpB,GAAG,EAAE,KAAK;oBACV,IAAI,EAAE,KAAK;oBACX,SAAS,EAAE,OAAO;oBAClB,UAAU,EAAE,OAAO;iBACtB,GACH,CACL,CACC,CACF,CACX,CAAA;AACL,CAAC;AAED,KAAK,UAAU,MAAM,CACjB,UAAkC,EAClC,KAAyB,EACzB,IAAY,EACZ,KAAa,EACb,QAAgB,EAChB,SAAiB;IAEjB,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QACxF,OAAM;IACV,CAAC;IAED,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IAC9C,MAAM,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;AACnD,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,UAAU,EAA0C;IACtE,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IAC1C,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3D,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACpC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAE5C,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACvB,UAAU,CAAC,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC;gBACD,MAAM,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;gBAC/C,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAA;YACtB,CAAC;oBAAS,CAAC;gBACP,iBAAiB,CAAC,KAAK,CAAC,CAAA;YAC5B,CAAC;QACL,CAAC,EAAE,CAAC,CAAC,CAAA;IACT,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEpB,OAAO,CACH,oBAAC,KAAK,IAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;QACxB,oBAAC,SAAS,IAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,SAAG;QAC7F,oBAAC,SAAS,IACN,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5C,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;oBACpB,QAAQ,EAAE,CAAA;gBACd,CAAC;YACL,CAAC,GACH;QACF,oBAAC,GAAG,IAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE;YACnC,oBAAC,MAAM,IAAC,OAAO,EAAE,WAAW,EAAE,SAAS,QAAC,QAAQ,EAAE,IAAI,KAAK,EAAE,IAAI,QAAQ,KAAK,EAAE,IAAI,cAAc,EAAE,OAAO,EAAE,QAAQ,IAChH,QAAQ,CACJ;YACR,cAAc,IAAI,CACf,oBAAC,gBAAgB,IACb,IAAI,EAAE,EAAE,EACR,EAAE,EAAE;oBACA,QAAQ,EAAE,UAAU;oBACpB,GAAG,EAAE,KAAK;oBACV,IAAI,EAAE,KAAK;oBACX,SAAS,EAAE,OAAO;oBAClB,UAAU,EAAE,OAAO;iBACtB,GACH,CACL,CACC,CACF,CACX,CAAA;AACL,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,UAAkC,EAAE,KAAyB,EAAE,IAAY,EAAE,QAAgB;IAC/G,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IACpD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;AACzD,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;AACzC,CAAC"}
|
|
@@ -1,23 +1,29 @@
|
|
|
1
|
-
import { AuthParam } from '../api/api.js';
|
|
2
1
|
export interface AuthState {
|
|
3
2
|
id: string | null;
|
|
4
3
|
name: string | null;
|
|
5
4
|
email: string | null;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
login: (id: string, name: string, email: string, tempPassword: string) => void;
|
|
5
|
+
csrfToken: string | null;
|
|
6
|
+
login: (id: string, name: string, email: string, csrfToken: string) => void;
|
|
9
7
|
logout: () => void;
|
|
10
8
|
}
|
|
11
|
-
export declare const useAuthState: import("zustand").UseBoundStore<Omit<import("zustand").StoreApi<AuthState>, "
|
|
9
|
+
export declare const useAuthState: import("zustand").UseBoundStore<Omit<import("zustand").StoreApi<AuthState>, "persist" | "setState"> & {
|
|
12
10
|
setState(partial: AuthState | Partial<AuthState> | ((state: AuthState) => AuthState | Partial<AuthState>), replace?: false | undefined): unknown;
|
|
13
11
|
setState(state: AuthState | ((state: AuthState) => AuthState), replace: true): unknown;
|
|
14
12
|
persist: {
|
|
15
|
-
setOptions: (options: Partial<import("zustand/middleware").PersistOptions<AuthState,
|
|
13
|
+
setOptions: (options: Partial<import("zustand/middleware").PersistOptions<AuthState, {
|
|
14
|
+
id: string | null;
|
|
15
|
+
name: string | null;
|
|
16
|
+
email: string | null;
|
|
17
|
+
}, unknown>>) => void;
|
|
16
18
|
clearStorage: () => void;
|
|
17
19
|
rehydrate: () => Promise<void> | void;
|
|
18
20
|
hasHydrated: () => boolean;
|
|
19
21
|
onHydrate: (fn: (state: AuthState) => void) => () => void;
|
|
20
22
|
onFinishHydration: (fn: (state: AuthState) => void) => () => void;
|
|
21
|
-
getOptions: () => Partial<import("zustand/middleware").PersistOptions<AuthState,
|
|
23
|
+
getOptions: () => Partial<import("zustand/middleware").PersistOptions<AuthState, {
|
|
24
|
+
id: string | null;
|
|
25
|
+
name: string | null;
|
|
26
|
+
email: string | null;
|
|
27
|
+
}, unknown>>;
|
|
22
28
|
};
|
|
23
29
|
}>;
|