@lobehub/lobehub 2.0.0-next.13 → 2.0.0-next.15
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/.github/workflows/desktop-pr-build.yml +6 -6
- package/.github/workflows/release-desktop-beta.yml +4 -4
- package/.github/workflows/release.yml +1 -2
- package/.github/workflows/test.yml +4 -5
- package/.nvmrc +1 -1
- package/CHANGELOG.md +42 -0
- package/apps/desktop/tsconfig.json +0 -1
- package/changelog/v1.json +14 -0
- package/e2e/tsconfig.json +0 -1
- package/package.json +58 -58
- package/packages/const/src/version.ts +3 -3
- package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
- package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
- package/packages/web-crawler/tsconfig.json +0 -1
- package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
- package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
- package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
- package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
- package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
- package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
- package/src/app/[variants]/(main)/image/page.tsx +0 -2
- package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
- package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
- package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
- package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
- package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
- package/src/app/[variants]/loading/index.tsx +1 -10
- package/src/components/Link.tsx +12 -0
- package/src/envs/app.ts +5 -8
- package/src/features/DataImporter/index.tsx +15 -60
- package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
- package/src/hooks/useInterceptingRoutes.test.ts +21 -3
- package/src/libs/trpc/client/index.ts +0 -1
- package/src/libs/trpc/client/lambda.ts +8 -5
- package/src/server/routers/desktop/mcp.ts +1 -3
- package/src/server/routers/lambda/config/index.test.ts +2 -2
- package/src/server/routers/tools/mcp.ts +2 -3
- package/src/server/routers/tools/search.test.ts +1 -7
- package/src/server/routers/tools/search.ts +1 -4
- package/src/services/__tests__/tool.test.ts +0 -3
- package/src/services/aiModel/index.test.ts +0 -3
- package/src/services/aiModel/index.ts +1 -7
- package/src/services/aiProvider/index.test.ts +0 -3
- package/src/services/aiProvider/index.ts +1 -7
- package/src/services/chatGroup/index.ts +1 -10
- package/src/services/config.ts +1 -65
- package/src/services/export/index.ts +1 -4
- package/src/services/file/index.ts +1 -11
- package/src/services/import/index.ts +1 -7
- package/src/services/message/index.ts +1 -11
- package/src/services/plugin/index.ts +1 -11
- package/src/services/session/index.ts +1 -11
- package/src/services/tableViewer/client.ts +12 -15
- package/src/services/thread/index.ts +1 -7
- package/src/services/topic/index.ts +1 -11
- package/src/services/user/index.ts +1 -13
- package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
- package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
- package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
- package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +1 -138
- package/src/store/user/slices/common/action.test.ts +1 -4
- package/tsconfig.json +0 -1
- package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
- package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
- package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
- package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
- package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
- package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
- package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
- package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
- package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
- package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
- package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
- package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
- package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
- package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
- package/src/app/[variants]/loading/Client/Content.tsx +0 -48
- package/src/app/[variants]/loading/Client/Error.tsx +0 -27
- package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
- package/src/app/[variants]/loading/Client/index.tsx +0 -22
- package/src/components/InnerLink.tsx +0 -20
- package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
- package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
- package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
- package/src/database/_deprecated/core/db.ts +0 -246
- package/src/database/_deprecated/core/index.ts +0 -2
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
- package/src/database/_deprecated/core/model.ts +0 -218
- package/src/database/_deprecated/core/schemas.ts +0 -88
- package/src/database/_deprecated/core/types/db.ts +0 -15
- package/src/database/_deprecated/models/__DEBUG.ts +0 -124
- package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
- package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
- package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
- package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
- package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
- package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
- package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
- package/src/database/_deprecated/models/file.ts +0 -51
- package/src/database/_deprecated/models/message.ts +0 -277
- package/src/database/_deprecated/models/plugin.ts +0 -62
- package/src/database/_deprecated/models/session.ts +0 -271
- package/src/database/_deprecated/models/sessionGroup.ts +0 -93
- package/src/database/_deprecated/models/topic.ts +0 -250
- package/src/database/_deprecated/models/user.ts +0 -69
- package/src/database/_deprecated/schemas/files.ts +0 -39
- package/src/database/_deprecated/schemas/message.ts +0 -50
- package/src/database/_deprecated/schemas/plugin.ts +0 -12
- package/src/database/_deprecated/schemas/session.ts +0 -54
- package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
- package/src/database/_deprecated/schemas/topic.ts +0 -12
- package/src/database/_deprecated/schemas/user.ts +0 -40
- package/src/features/DataImporter/_deprecated.ts +0 -43
- package/src/features/InitClientDB/EnableModal.tsx +0 -118
- package/src/features/InitClientDB/ErrorResult.tsx +0 -143
- package/src/features/InitClientDB/InitIndicator.tsx +0 -124
- package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
- package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
- package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
- package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
- package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
- package/src/features/InitClientDB/index.tsx +0 -37
- package/src/libs/trpc/client/edge.ts +0 -26
- package/src/libs/trpc/edge/context.ts +0 -71
- package/src/libs/trpc/edge/index.ts +0 -45
- package/src/libs/trpc/edge/init.ts +0 -26
- package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
- package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
- package/src/migrations/FromV0ToV1.ts +0 -10
- package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
- package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
- package/src/migrations/FromV1ToV2/index.ts +0 -82
- package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
- package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
- package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
- package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
- package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
- package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
- package/src/migrations/FromV2ToV3/index.ts +0 -30
- package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
- package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
- package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
- package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
- package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
- package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
- package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
- package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
- package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
- package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
- package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
- package/src/migrations/FromV3ToV4/index.ts +0 -102
- package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
- package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
- package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
- package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
- package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
- package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
- package/src/migrations/FromV4ToV5/index.ts +0 -58
- package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
- package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
- package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
- package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
- package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
- package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
- package/src/migrations/FromV5ToV6/index.ts +0 -61
- package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
- package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
- package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
- package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
- package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
- package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
- package/src/migrations/FromV6ToV7/index.ts +0 -101
- package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
- package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
- package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
- package/src/migrations/VersionController.test.ts +0 -88
- package/src/migrations/VersionController.ts +0 -67
- package/src/migrations/index.ts +0 -61
- package/src/server/routers/edge/appStatus.ts +0 -3
- package/src/server/routers/edge/index.ts +0 -14
- package/src/server/routers/edge/upload.ts +0 -16
- package/src/services/aiModel/client.ts +0 -70
- package/src/services/aiProvider/client.ts +0 -58
- package/src/services/baseClientService/index.ts +0 -9
- package/src/services/chatGroup/client.ts +0 -63
- package/src/services/export/_deprecated.ts +0 -155
- package/src/services/export/client.ts +0 -15
- package/src/services/file/_deprecated.test.ts +0 -119
- package/src/services/file/_deprecated.ts +0 -80
- package/src/services/file/client.test.ts +0 -199
- package/src/services/file/client.ts +0 -85
- package/src/services/import/_deprecated.ts +0 -115
- package/src/services/import/client.test.ts +0 -1015
- package/src/services/import/client.ts +0 -64
- package/src/services/message/_deprecated.test.ts +0 -398
- package/src/services/message/_deprecated.ts +0 -168
- package/src/services/message/client.test.ts +0 -410
- package/src/services/message/client.ts +0 -192
- package/src/services/plugin/_deprecated.test.ts +0 -162
- package/src/services/plugin/_deprecated.ts +0 -42
- package/src/services/plugin/client.test.ts +0 -177
- package/src/services/plugin/client.ts +0 -46
- package/src/services/session/_deprecated.test.ts +0 -440
- package/src/services/session/_deprecated.ts +0 -190
- package/src/services/session/client.test.ts +0 -413
- package/src/services/session/client.ts +0 -193
- package/src/services/thread/client.ts +0 -51
- package/src/services/topic/_deprecated.test.ts +0 -245
- package/src/services/topic/_deprecated.ts +0 -75
- package/src/services/topic/client.ts +0 -89
- package/src/services/topic/pglite.test.ts +0 -212
- package/src/services/user/_deprecated.test.ts +0 -101
- package/src/services/user/_deprecated.ts +0 -70
- package/src/services/user/client.test.ts +0 -111
- package/src/services/user/client.ts +0 -104
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { Alert, Button, Highlighter, Icon } from '@lobehub/ui';
|
|
2
|
-
import { Popconfirm, Result } from 'antd';
|
|
3
|
-
import { useTheme } from 'antd-style';
|
|
4
|
-
import { createStore, del, get, set } from 'idb-keyval';
|
|
5
|
-
import { ShieldAlert } from 'lucide-react';
|
|
6
|
-
import Link from 'next/link';
|
|
7
|
-
import { lighten } from 'polished';
|
|
8
|
-
import { memo } from 'react';
|
|
9
|
-
import { Trans, useTranslation } from 'react-i18next';
|
|
10
|
-
import { Flexbox } from 'react-layout-kit';
|
|
11
|
-
import Balancer from 'react-wrap-balancer';
|
|
12
|
-
|
|
13
|
-
import { GITHUB_ISSUES } from '@/const/url';
|
|
14
|
-
import { githubService } from '@/services/github';
|
|
15
|
-
|
|
16
|
-
import ExportConfigButton from './ExportConfigButton';
|
|
17
|
-
import UpgradeButton from './UpgradeButton';
|
|
18
|
-
import { MigrationError, UpgradeStatus, V1DB_NAME, V1DB_TABLE_NAME } from './const';
|
|
19
|
-
|
|
20
|
-
const clearLocal = async () => {
|
|
21
|
-
const store = createStore(V1DB_NAME, V1DB_TABLE_NAME);
|
|
22
|
-
// delete the state key and back it up to state_backup for reproduce
|
|
23
|
-
const state = await get('state', store);
|
|
24
|
-
await del('state');
|
|
25
|
-
await set('state_backup', state, store);
|
|
26
|
-
location.reload();
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
interface FailedProps {
|
|
30
|
-
error?: MigrationError;
|
|
31
|
-
setError: (error: MigrationError) => void;
|
|
32
|
-
setUpgradeStatus: (status: UpgradeStatus) => void;
|
|
33
|
-
state: any;
|
|
34
|
-
upgradeStatus: UpgradeStatus;
|
|
35
|
-
}
|
|
36
|
-
const Failed = memo<FailedProps>(({ error, state, setUpgradeStatus, setError, upgradeStatus }) => {
|
|
37
|
-
const { t } = useTranslation('migration');
|
|
38
|
-
const theme = useTheme();
|
|
39
|
-
|
|
40
|
-
return (
|
|
41
|
-
<Result
|
|
42
|
-
extra={
|
|
43
|
-
<Flexbox gap={24}>
|
|
44
|
-
{!!error && (
|
|
45
|
-
<Alert
|
|
46
|
-
extra={
|
|
47
|
-
<Highlighter actionIconSize={'small'} language={'json'}>
|
|
48
|
-
{JSON.stringify(error)}
|
|
49
|
-
</Highlighter>
|
|
50
|
-
}
|
|
51
|
-
message={error.message}
|
|
52
|
-
style={{ flex: 1 }}
|
|
53
|
-
type={'error'}
|
|
54
|
-
/>
|
|
55
|
-
)}
|
|
56
|
-
<Flexbox
|
|
57
|
-
gap={16}
|
|
58
|
-
horizontal
|
|
59
|
-
justify={'center'}
|
|
60
|
-
style={{
|
|
61
|
-
alignSelf: 'center',
|
|
62
|
-
flexWrap: 'wrap',
|
|
63
|
-
}}
|
|
64
|
-
>
|
|
65
|
-
<ExportConfigButton primary state={state} />
|
|
66
|
-
<Popconfirm
|
|
67
|
-
arrow={false}
|
|
68
|
-
okButtonProps={{
|
|
69
|
-
danger: true,
|
|
70
|
-
type: 'primary',
|
|
71
|
-
}}
|
|
72
|
-
onConfirm={clearLocal}
|
|
73
|
-
styles={{
|
|
74
|
-
body: { background: lighten(0.03, theme.colorBgElevated) },
|
|
75
|
-
root: { width: 340 },
|
|
76
|
-
}}
|
|
77
|
-
title={t('dbV1.clear.confirm')}
|
|
78
|
-
>
|
|
79
|
-
<Button size={'large'}>{t('dbV1.action.clearDB')}</Button>
|
|
80
|
-
</Popconfirm>
|
|
81
|
-
<UpgradeButton
|
|
82
|
-
primary={false}
|
|
83
|
-
setError={setError}
|
|
84
|
-
setUpgradeStatus={setUpgradeStatus}
|
|
85
|
-
state={state}
|
|
86
|
-
upgradeStatus={upgradeStatus}
|
|
87
|
-
>
|
|
88
|
-
{t('dbV1.action.reUpgrade')}
|
|
89
|
-
</UpgradeButton>
|
|
90
|
-
</Flexbox>
|
|
91
|
-
</Flexbox>
|
|
92
|
-
}
|
|
93
|
-
icon={<Icon icon={ShieldAlert} />}
|
|
94
|
-
status={'error'}
|
|
95
|
-
style={{ paddingBlock: 24, width: 450 }}
|
|
96
|
-
subTitle={
|
|
97
|
-
<Balancer>
|
|
98
|
-
<Trans i18nKey="dbV1.upgrade.error.subTitle" ns={'migration'}>
|
|
99
|
-
非常抱歉,数据库升级过程发生异常。请重试升级,或
|
|
100
|
-
<Link
|
|
101
|
-
aria-label={'issue'}
|
|
102
|
-
href={GITHUB_ISSUES}
|
|
103
|
-
onClick={(e) => {
|
|
104
|
-
e.preventDefault();
|
|
105
|
-
githubService.submitDBV1UpgradeError(1, error!);
|
|
106
|
-
}}
|
|
107
|
-
target="_blank"
|
|
108
|
-
>
|
|
109
|
-
提交问题
|
|
110
|
-
</Link>
|
|
111
|
-
我们将会第一时间帮你排查问题。
|
|
112
|
-
</Trans>
|
|
113
|
-
</Balancer>
|
|
114
|
-
}
|
|
115
|
-
title={t('dbV1.upgrade.error.title')}
|
|
116
|
-
/>
|
|
117
|
-
);
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
export default Failed;
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { Button, Icon } from '@lobehub/ui';
|
|
2
|
-
import { Result } from 'antd';
|
|
3
|
-
import { CheckCircle, CpuIcon } from 'lucide-react';
|
|
4
|
-
import { memo, useState } from 'react';
|
|
5
|
-
import { useTranslation } from 'react-i18next';
|
|
6
|
-
import { Center } from 'react-layout-kit';
|
|
7
|
-
|
|
8
|
-
import DataStyleModal from '@/components/DataStyleModal';
|
|
9
|
-
import { BRANDING_NAME } from '@/const/branding';
|
|
10
|
-
|
|
11
|
-
import Failed from './Failed';
|
|
12
|
-
import MigrationStart from './Start';
|
|
13
|
-
import { MigrationError, UpgradeStatus } from './const';
|
|
14
|
-
|
|
15
|
-
interface MigrationModalProps {
|
|
16
|
-
open: boolean;
|
|
17
|
-
setOpen: (open: boolean) => void;
|
|
18
|
-
state: any;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const MigrationModal = memo<MigrationModalProps>(({ setOpen, open, state: dbState }) => {
|
|
22
|
-
const { t } = useTranslation('migration');
|
|
23
|
-
const [upgradeStatus, setUpgradeStatus] = useState<UpgradeStatus>(UpgradeStatus.START);
|
|
24
|
-
|
|
25
|
-
const [error, setError] = useState<MigrationError>();
|
|
26
|
-
|
|
27
|
-
const close = () => {
|
|
28
|
-
setOpen(false);
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
const renderContent = () => {
|
|
32
|
-
switch (upgradeStatus) {
|
|
33
|
-
case UpgradeStatus.START:
|
|
34
|
-
case UpgradeStatus.UPGRADING: {
|
|
35
|
-
return (
|
|
36
|
-
<MigrationStart
|
|
37
|
-
setError={setError}
|
|
38
|
-
setUpgradeStatus={setUpgradeStatus}
|
|
39
|
-
state={dbState}
|
|
40
|
-
upgradeStatus={upgradeStatus}
|
|
41
|
-
/>
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
case UpgradeStatus.UPGRADED: {
|
|
45
|
-
return (
|
|
46
|
-
<Result
|
|
47
|
-
extra={
|
|
48
|
-
<Button onClick={close} size={'large'} type={'primary'}>
|
|
49
|
-
{t('dbV1.action.start')}
|
|
50
|
-
</Button>
|
|
51
|
-
}
|
|
52
|
-
icon={<Icon icon={CheckCircle} />}
|
|
53
|
-
status={'success'}
|
|
54
|
-
style={{ paddingBlock: 24 }}
|
|
55
|
-
subTitle={t('dbV1.upgrade.success.subTitle', { appName: BRANDING_NAME })}
|
|
56
|
-
title={t('dbV1.upgrade.success.title')}
|
|
57
|
-
/>
|
|
58
|
-
);
|
|
59
|
-
}
|
|
60
|
-
case UpgradeStatus.UPGRADE_FAILED: {
|
|
61
|
-
return (
|
|
62
|
-
<Failed
|
|
63
|
-
error={error}
|
|
64
|
-
setError={setError}
|
|
65
|
-
setUpgradeStatus={setUpgradeStatus}
|
|
66
|
-
state={dbState}
|
|
67
|
-
upgradeStatus={upgradeStatus}
|
|
68
|
-
/>
|
|
69
|
-
);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
return (
|
|
75
|
-
<DataStyleModal icon={CpuIcon} open={open} title={t('dbV1.title', { appName: BRANDING_NAME })}>
|
|
76
|
-
<Center gap={48}>{renderContent()}</Center>
|
|
77
|
-
</DataStyleModal>
|
|
78
|
-
);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
export default MigrationModal;
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { Icon } from '@lobehub/ui';
|
|
2
|
-
import { createStyles } from 'antd-style';
|
|
3
|
-
import { Database, SearchCheck, Zap } from 'lucide-react';
|
|
4
|
-
import { memo } from 'react';
|
|
5
|
-
import { useTranslation } from 'react-i18next';
|
|
6
|
-
import { Center, Flexbox } from 'react-layout-kit';
|
|
7
|
-
import Balancer from 'react-wrap-balancer';
|
|
8
|
-
|
|
9
|
-
import { BRANDING_NAME } from '@/const/branding';
|
|
10
|
-
|
|
11
|
-
import ExportConfigButton from './ExportConfigButton';
|
|
12
|
-
import UpgradeButton, { UpgradeButtonProps } from './UpgradeButton';
|
|
13
|
-
|
|
14
|
-
const useStyles = createStyles(({ css, token, isDarkMode, responsive }) => ({
|
|
15
|
-
desc: css`
|
|
16
|
-
width: 280px;
|
|
17
|
-
color: ${token.colorTextSecondary};
|
|
18
|
-
|
|
19
|
-
${responsive.mobile} {
|
|
20
|
-
line-height: ${token.lineHeight};
|
|
21
|
-
}
|
|
22
|
-
`,
|
|
23
|
-
hint: css`
|
|
24
|
-
font-size: ${token.fontSizeSM}px;
|
|
25
|
-
color: ${token.colorTextTertiary};
|
|
26
|
-
text-align: center;
|
|
27
|
-
`,
|
|
28
|
-
icon: css`
|
|
29
|
-
color: ${isDarkMode ? token.blue : token.geekblue};
|
|
30
|
-
`,
|
|
31
|
-
iconCtn: css`
|
|
32
|
-
width: 72px;
|
|
33
|
-
height: 72px;
|
|
34
|
-
border-radius: 50%;
|
|
35
|
-
background: ${isDarkMode ? token.blue1 : token.geekblue1};
|
|
36
|
-
`,
|
|
37
|
-
intro: css`
|
|
38
|
-
${responsive.mobile} {
|
|
39
|
-
width: 350px;
|
|
40
|
-
margin-block-start: 24px;
|
|
41
|
-
line-height: ${token.lineHeight};
|
|
42
|
-
}
|
|
43
|
-
`,
|
|
44
|
-
|
|
45
|
-
title: css`
|
|
46
|
-
font-size: ${token.fontSizeLG}px;
|
|
47
|
-
font-weight: bold;
|
|
48
|
-
`,
|
|
49
|
-
}));
|
|
50
|
-
|
|
51
|
-
const MigrationStart = memo<UpgradeButtonProps>((props) => {
|
|
52
|
-
const { t } = useTranslation('migration');
|
|
53
|
-
const { styles } = useStyles();
|
|
54
|
-
|
|
55
|
-
const features = [
|
|
56
|
-
{
|
|
57
|
-
avatar: Database,
|
|
58
|
-
desc: t('dbV1.features.capability.desc'),
|
|
59
|
-
title: t('dbV1.features.capability.title'),
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
avatar: Zap,
|
|
63
|
-
desc: t('dbV1.features.performance.desc'),
|
|
64
|
-
title: t('dbV1.features.performance.title'),
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
avatar: SearchCheck,
|
|
68
|
-
desc: t('dbV1.features.use.desc'),
|
|
69
|
-
title: t('dbV1.features.use.title'),
|
|
70
|
-
},
|
|
71
|
-
];
|
|
72
|
-
|
|
73
|
-
return (
|
|
74
|
-
<>
|
|
75
|
-
<Flexbox>
|
|
76
|
-
<Flexbox className={styles.intro} style={{ textAlign: 'center' }} width={460}>
|
|
77
|
-
{t('dbV1.description', { appName: BRANDING_NAME })}
|
|
78
|
-
</Flexbox>
|
|
79
|
-
</Flexbox>
|
|
80
|
-
<Flexbox gap={32}>
|
|
81
|
-
{features.map((item) => {
|
|
82
|
-
return (
|
|
83
|
-
<Flexbox align={'flex-start'} gap={24} horizontal key={item.title}>
|
|
84
|
-
<Center className={styles.iconCtn}>
|
|
85
|
-
<Icon className={styles.icon} icon={item.avatar} size={36} />
|
|
86
|
-
</Center>
|
|
87
|
-
<Flexbox gap={8}>
|
|
88
|
-
<p className={styles.title}>{item.title}</p>
|
|
89
|
-
<p className={styles.desc}>{item.desc}</p>
|
|
90
|
-
</Flexbox>
|
|
91
|
-
</Flexbox>
|
|
92
|
-
);
|
|
93
|
-
})}
|
|
94
|
-
</Flexbox>
|
|
95
|
-
<Flexbox align={'center'} gap={16} style={{ paddingBottom: 16 }}>
|
|
96
|
-
<Flexbox gap={16} horizontal justify={'center'} style={{ flexWrap: 'wrap' }}>
|
|
97
|
-
<ExportConfigButton state={props.state} />
|
|
98
|
-
<UpgradeButton {...props} />
|
|
99
|
-
</Flexbox>
|
|
100
|
-
<Flexbox align={'center'} className={styles.hint}>
|
|
101
|
-
<Balancer>{t('dbV1.upgradeTip', { appName: BRANDING_NAME })}</Balancer>
|
|
102
|
-
</Flexbox>
|
|
103
|
-
</Flexbox>
|
|
104
|
-
</>
|
|
105
|
-
);
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
export default MigrationStart;
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { Button } from '@lobehub/ui';
|
|
2
|
-
import { ReactNode, memo } from 'react';
|
|
3
|
-
import { useTranslation } from 'react-i18next';
|
|
4
|
-
|
|
5
|
-
import { ClientService } from '@/services/import/_deprecated';
|
|
6
|
-
import { useChatStore } from '@/store/chat';
|
|
7
|
-
import { useSessionStore } from '@/store/session';
|
|
8
|
-
|
|
9
|
-
import { MigrationError, UpgradeStatus } from './const';
|
|
10
|
-
|
|
11
|
-
export interface UpgradeButtonProps {
|
|
12
|
-
children?: ReactNode;
|
|
13
|
-
primary?: boolean;
|
|
14
|
-
setError: (error: MigrationError) => void;
|
|
15
|
-
setUpgradeStatus: (status: UpgradeStatus) => void;
|
|
16
|
-
state: any;
|
|
17
|
-
upgradeStatus: UpgradeStatus;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const UpgradeButton = memo<UpgradeButtonProps>(
|
|
21
|
-
({ setUpgradeStatus, upgradeStatus, state, setError, primary = true, children }) => {
|
|
22
|
-
const { t } = useTranslation('migration');
|
|
23
|
-
|
|
24
|
-
const refreshSession = useSessionStore((s) => s.refreshSessions);
|
|
25
|
-
const [refreshMessages, refreshTopic] = useChatStore((s) => [
|
|
26
|
-
s.refreshMessages,
|
|
27
|
-
s.refreshTopic,
|
|
28
|
-
]);
|
|
29
|
-
|
|
30
|
-
const upgrade = async () => {
|
|
31
|
-
try {
|
|
32
|
-
setUpgradeStatus(UpgradeStatus.UPGRADING);
|
|
33
|
-
|
|
34
|
-
const configService = new ClientService();
|
|
35
|
-
await configService.importConfigState({
|
|
36
|
-
exportType: 'sessions',
|
|
37
|
-
state: state,
|
|
38
|
-
version: 7,
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
await refreshSession();
|
|
42
|
-
await refreshMessages();
|
|
43
|
-
await refreshTopic();
|
|
44
|
-
|
|
45
|
-
localStorage.setItem('V2DB_IS_MIGRATED', '1');
|
|
46
|
-
|
|
47
|
-
setUpgradeStatus(UpgradeStatus.UPGRADED);
|
|
48
|
-
|
|
49
|
-
return { success: true };
|
|
50
|
-
} catch (error) {
|
|
51
|
-
setUpgradeStatus(UpgradeStatus.UPGRADE_FAILED);
|
|
52
|
-
const err = error as { message: string; stack: string };
|
|
53
|
-
|
|
54
|
-
setError({ message: err.message, stack: err.stack });
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
return (
|
|
59
|
-
<Button
|
|
60
|
-
color={primary ? undefined : 'default'}
|
|
61
|
-
loading={upgradeStatus === UpgradeStatus.UPGRADING}
|
|
62
|
-
onClick={upgrade}
|
|
63
|
-
size={'large'}
|
|
64
|
-
>
|
|
65
|
-
{children ?? t('dbV1.action.upgrade')}
|
|
66
|
-
</Button>
|
|
67
|
-
);
|
|
68
|
-
},
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
export default UpgradeButton;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export const MIGRATE_KEY = 'migrated';
|
|
2
|
-
export enum UpgradeStatus {
|
|
3
|
-
START,
|
|
4
|
-
UPGRADING,
|
|
5
|
-
UPGRADED,
|
|
6
|
-
UPGRADE_FAILED,
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export const V1DB_NAME = 'LobeHub';
|
|
10
|
-
export const V1DB_TABLE_NAME = 'LOBE_CHAT';
|
|
11
|
-
|
|
12
|
-
export interface MigrationError {
|
|
13
|
-
message: string;
|
|
14
|
-
stack: string;
|
|
15
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { Spin } from 'antd';
|
|
4
|
-
import dynamic from 'next/dynamic';
|
|
5
|
-
import { memo, useEffect, useState } from 'react';
|
|
6
|
-
|
|
7
|
-
import { isServerMode } from '@/const/version';
|
|
8
|
-
import { useGlobalStore } from '@/store/global';
|
|
9
|
-
import { systemStatusSelectors } from '@/store/global/selectors';
|
|
10
|
-
|
|
11
|
-
import { V2DBReader } from './DBReader';
|
|
12
|
-
|
|
13
|
-
const Modal = dynamic(() => import('./Modal'), { loading: () => <Spin fullscreen />, ssr: false });
|
|
14
|
-
|
|
15
|
-
const Migration = memo(() => {
|
|
16
|
-
const [dbState, setDbState] = useState(null);
|
|
17
|
-
const [open, setOpen] = useState(false);
|
|
18
|
-
|
|
19
|
-
const isPgliteInited = useGlobalStore(systemStatusSelectors.isPgliteInited);
|
|
20
|
-
|
|
21
|
-
const checkMigration = async () => {
|
|
22
|
-
const isMigrated = localStorage.getItem('V2DB_IS_MIGRATED');
|
|
23
|
-
// if db have migrated already, don't show modal
|
|
24
|
-
if (isMigrated || isServerMode) return;
|
|
25
|
-
|
|
26
|
-
const dbReader = new V2DBReader([
|
|
27
|
-
'messages',
|
|
28
|
-
'files',
|
|
29
|
-
'plugins',
|
|
30
|
-
'sessionGroups',
|
|
31
|
-
'sessions',
|
|
32
|
-
'topics',
|
|
33
|
-
'users',
|
|
34
|
-
]);
|
|
35
|
-
const data = await dbReader.readAllData();
|
|
36
|
-
console.log('migration data:', data);
|
|
37
|
-
const state = await dbReader.convertToImportData(data);
|
|
38
|
-
console.log('import state', state);
|
|
39
|
-
setDbState(state as any);
|
|
40
|
-
setOpen(true);
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
useEffect(() => {
|
|
44
|
-
if (isPgliteInited) checkMigration();
|
|
45
|
-
}, [isPgliteInited]);
|
|
46
|
-
|
|
47
|
-
return open && <Modal open={open} setOpen={setOpen} state={dbState} />;
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
export default Migration;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import dynamic from 'next/dynamic';
|
|
2
|
-
import React, { memo } from 'react';
|
|
3
|
-
import { useTranslation } from 'react-i18next';
|
|
4
|
-
|
|
5
|
-
import FullscreenLoading from '@/components/Loading/FullscreenLoading';
|
|
6
|
-
import { useGlobalStore } from '@/store/global';
|
|
7
|
-
import { systemStatusSelectors } from '@/store/global/selectors';
|
|
8
|
-
import { DatabaseLoadingState } from '@/types/clientDB';
|
|
9
|
-
|
|
10
|
-
import { CLIENT_LOADING_STAGES } from '../stage';
|
|
11
|
-
|
|
12
|
-
const InitError = dynamic(() => import('./Error'), { ssr: false });
|
|
13
|
-
|
|
14
|
-
interface InitProps {
|
|
15
|
-
setActiveStage: (value: string) => void;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const Init = memo<InitProps>(({ setActiveStage }) => {
|
|
19
|
-
const useInitClientDB = useGlobalStore((s) => s.useInitClientDB);
|
|
20
|
-
|
|
21
|
-
useInitClientDB({ onStateChange: setActiveStage });
|
|
22
|
-
|
|
23
|
-
return null;
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
interface ContentProps {
|
|
27
|
-
loadingStage: string;
|
|
28
|
-
setActiveStage: (value: string) => void;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const Content = memo<ContentProps>(({ loadingStage, setActiveStage }) => {
|
|
32
|
-
const { t } = useTranslation('common');
|
|
33
|
-
const isPgliteNotInited = useGlobalStore(systemStatusSelectors.isPgliteNotInited);
|
|
34
|
-
const isError = useGlobalStore((s) => s.initClientDBStage === DatabaseLoadingState.Error);
|
|
35
|
-
|
|
36
|
-
return (
|
|
37
|
-
<>
|
|
38
|
-
{isPgliteNotInited && <Init setActiveStage={setActiveStage} />}
|
|
39
|
-
<FullscreenLoading
|
|
40
|
-
activeStage={CLIENT_LOADING_STAGES.indexOf(loadingStage)}
|
|
41
|
-
contentRender={isError && <InitError />}
|
|
42
|
-
stages={CLIENT_LOADING_STAGES.map((key) => t(`appLoading.${key}` as any))}
|
|
43
|
-
/>
|
|
44
|
-
</>
|
|
45
|
-
);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
export default Content;
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Button } from '@lobehub/ui';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { useTranslation } from 'react-i18next';
|
|
4
|
-
import { Center } from 'react-layout-kit';
|
|
5
|
-
|
|
6
|
-
import ErrorResult from '@/features/InitClientDB/ErrorResult';
|
|
7
|
-
|
|
8
|
-
const InitError = () => {
|
|
9
|
-
const { t } = useTranslation('common');
|
|
10
|
-
|
|
11
|
-
return (
|
|
12
|
-
<ErrorResult>
|
|
13
|
-
{({ setOpen }) => (
|
|
14
|
-
<Center gap={8}>
|
|
15
|
-
{t('appLoading.failed')}
|
|
16
|
-
<div>
|
|
17
|
-
<Button onClick={() => setOpen(true)} type={'primary'}>
|
|
18
|
-
{t('appLoading.showDetail')}
|
|
19
|
-
</Button>
|
|
20
|
-
</div>
|
|
21
|
-
</Center>
|
|
22
|
-
)}
|
|
23
|
-
</ErrorResult>
|
|
24
|
-
);
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export default InitError;
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useRouter } from 'next/navigation';
|
|
4
|
-
import { memo, useEffect } from 'react';
|
|
5
|
-
|
|
6
|
-
import { useGlobalStore } from '@/store/global';
|
|
7
|
-
import { systemStatusSelectors } from '@/store/global/selectors';
|
|
8
|
-
import { useUserStore } from '@/store/user';
|
|
9
|
-
|
|
10
|
-
import { AppLoadingStage } from '../stage';
|
|
11
|
-
|
|
12
|
-
interface RedirectProps {
|
|
13
|
-
setActiveStage: (value: AppLoadingStage) => void;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const Redirect = memo<RedirectProps>(({ setActiveStage }) => {
|
|
17
|
-
const router = useRouter();
|
|
18
|
-
const isUserStateInit = useUserStore((s) => s.isUserStateInit);
|
|
19
|
-
|
|
20
|
-
const isPgliteNotEnabled = useGlobalStore(systemStatusSelectors.isPgliteNotEnabled);
|
|
21
|
-
|
|
22
|
-
const navToChat = () => {
|
|
23
|
-
setActiveStage(AppLoadingStage.GoToChat);
|
|
24
|
-
router.replace('/chat');
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
useEffect(() => {
|
|
28
|
-
// if pglite is not enabled, redirect to chat
|
|
29
|
-
if (isPgliteNotEnabled) {
|
|
30
|
-
navToChat();
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// if user state not init, wait for loading
|
|
35
|
-
if (!isUserStateInit) {
|
|
36
|
-
setActiveStage(AppLoadingStage.InitUser);
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// finally check the conversation status
|
|
41
|
-
navToChat();
|
|
42
|
-
}, [isUserStateInit, isPgliteNotEnabled]);
|
|
43
|
-
|
|
44
|
-
return null;
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
export default Redirect;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useState } from 'react';
|
|
4
|
-
|
|
5
|
-
import { AppLoadingStage } from '../stage';
|
|
6
|
-
import Content from './Content';
|
|
7
|
-
import Redirect from './Redirect';
|
|
8
|
-
|
|
9
|
-
const ClientMode = () => {
|
|
10
|
-
const [activeStage, setActiveStage] = useState<string>(AppLoadingStage.Initializing);
|
|
11
|
-
|
|
12
|
-
return (
|
|
13
|
-
<>
|
|
14
|
-
<Content loadingStage={activeStage} setActiveStage={setActiveStage} />
|
|
15
|
-
<Redirect setActiveStage={setActiveStage} />
|
|
16
|
-
</>
|
|
17
|
-
);
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
ClientMode.displayName = 'ClientMode';
|
|
21
|
-
|
|
22
|
-
export default ClientMode;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import Link, { LinkProps } from 'next/link';
|
|
4
|
-
import { AnchorHTMLAttributes, ReactNode } from 'react';
|
|
5
|
-
|
|
6
|
-
import { useServerConfigStore } from '@/store/serverConfig';
|
|
7
|
-
|
|
8
|
-
interface InnerLinkProps
|
|
9
|
-
extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, keyof LinkProps>,
|
|
10
|
-
LinkProps {
|
|
11
|
-
children?: ReactNode | undefined;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const InnerLink = ({ href, ...props }: InnerLinkProps) => {
|
|
15
|
-
const variants = useServerConfigStore((s) => s.segmentVariants);
|
|
16
|
-
|
|
17
|
-
return <Link {...props} as={href} href={`/${variants}${href}`} />;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export default InnerLink;
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import Dexie from 'dexie';
|
|
2
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
3
|
-
|
|
4
|
-
import { BrowserDB } from '../db';
|
|
5
|
-
import { dbSchemaV3 } from '../schemas';
|
|
6
|
-
import { LOBE_CHAT_LOCAL_DB_NAME } from '../types/db';
|
|
7
|
-
|
|
8
|
-
beforeEach(async () => {
|
|
9
|
-
// 确保在测试开始前删除数据库
|
|
10
|
-
await Dexie.delete(LOBE_CHAT_LOCAL_DB_NAME);
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
afterEach(async () => {
|
|
14
|
-
// 确保在测试结束后删除数据库
|
|
15
|
-
await Dexie.delete(LOBE_CHAT_LOCAL_DB_NAME);
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
describe('LocalDB migration', () => {
|
|
19
|
-
it('should upgrade from version 3 to version 4 correctly', async () => {
|
|
20
|
-
// 使用版本3的schema创建数据库实例并填充测试数据
|
|
21
|
-
const dbV3 = new Dexie(LOBE_CHAT_LOCAL_DB_NAME);
|
|
22
|
-
dbV3.version(3).stores(dbSchemaV3);
|
|
23
|
-
await dbV3.open();
|
|
24
|
-
await dbV3.table('sessions').bulkAdd([
|
|
25
|
-
{ id: 's1', group: 'pinned' },
|
|
26
|
-
{ id: 's2', group: 'default' },
|
|
27
|
-
]);
|
|
28
|
-
dbV3.close();
|
|
29
|
-
|
|
30
|
-
// 创建新的数据库实例,包含版本4的迁移逻辑
|
|
31
|
-
const dbV4 = new BrowserDB();
|
|
32
|
-
await dbV4.open();
|
|
33
|
-
|
|
34
|
-
// 验证迁移后的数据
|
|
35
|
-
const updatedSession1 = await dbV4.sessions.get('s1');
|
|
36
|
-
const updatedSession2 = await dbV4.sessions.get('s2');
|
|
37
|
-
expect(updatedSession1).toEqual({ id: 's1', pinned: 1, group: 'default' });
|
|
38
|
-
expect(updatedSession2).toEqual({ id: 's2', pinned: 0, group: 'default' });
|
|
39
|
-
|
|
40
|
-
dbV4.close();
|
|
41
|
-
});
|
|
42
|
-
});
|