退役旧创作模板业务并保留数据壳

保留 SpacetimeDB 历史表、迁移白名单与最小兼容读取定义
移除旧创作前后端、worker、业务过程及纯业务 crate 的编译依赖
恢复现役创作、项目、我的入口及桌面移动导航
收紧 Vite、TypeScript、ESLint、Vitest 与静态资源退役边界
补齐开发栈、网关、原生壳和文档退役约束
This commit is contained in:
2026-07-18 22:02:22 +08:00
parent 9c9c8f468a
commit 7ea463ed08
776 changed files with 2073 additions and 27260 deletions
@@ -110,7 +110,7 @@ describe('PlatformEntryActiveFlowShell', () => {
it('keeps the active desktop rail and the shared account capsule', async () => {
const setSelectionStage = vi.fn();
const { container } = render(
const { container, rerender } = render(
<PlatformEntryFlowShellImpl
selectionStage="creation-home"
setSelectionStage={setSelectionStage}
@@ -154,9 +154,19 @@ describe('PlatformEntryActiveFlowShell', () => {
fireEvent.click(within(navigation).getByRole('button', { name: '我的' }));
expect(window.location.pathname).toBe('/profile');
expect(setSelectionStage).toHaveBeenCalledWith('profile', {
path: '/profile',
});
rerender(
<PlatformEntryFlowShellImpl
selectionStage="profile"
setSelectionStage={setSelectionStage}
/>,
);
expect(await screen.findByRole('main', { name: '我的' })).toBeTruthy();
expect(window.location.pathname).toBe('/');
expect(setSelectionStage).toHaveBeenCalledWith('platform', { path: '/' });
expect(
within(navigation)
.getByRole('button', { name: '我的' })
@@ -164,6 +174,36 @@ describe('PlatformEntryActiveFlowShell', () => {
).toBe('page');
});
it('keeps creation, project, and profile reachable from the mobile dock', async () => {
const setSelectionStage = vi.fn();
render(
<PlatformEntryFlowShellImpl
selectionStage="project"
setSelectionStage={setSelectionStage}
/>,
);
const navigation = await screen.findByRole('navigation', {
name: '移动平台导航',
});
expect(
within(navigation)
.getAllByRole('button')
.map((button) => button.getAttribute('aria-label')),
).toEqual(['创作', '项目', '我的']);
expect(
within(navigation)
.getByRole('button', { name: '项目' })
.getAttribute('aria-current'),
).toBe('page');
fireEvent.click(within(navigation).getByRole('button', { name: '我的' }));
expect(window.location.pathname).toBe('/profile');
expect(setSelectionStage).toHaveBeenCalledWith('profile', {
path: '/profile',
});
});
it('switches between creation and projects and passes search to the active page', async () => {
const setSelectionStage = vi.fn();
const { rerender } = render(