create-fullstack-scaffold 0.4.25 → 0.5.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/dist/cli/index.js +432 -15
- package/dist/cli/index.js.map +1 -1
- package/package.json +10 -13
- package/template/eslint-rules/__tests__/no-merged-api-type-export.test.ts +96 -0
- package/template/eslint-rules/no-cross-module-service-import.js +4 -0
- package/template/eslint-rules/no-merged-api-type-export.js +190 -0
- package/template/eslint.config.js +3 -0
- package/template/package.json +9 -6
- package/template/scripts/sync-agent-hooks.mjs +189 -0
- package/template/src/admin/components/__tests__/StatsCard.test.tsx +2 -2
- package/template/src/admin/pages/ContentPage.tsx +1 -1
- package/template/src/admin/pages/DisputesPage.tsx +1 -1
- package/template/src/admin/pages/OrdersPage.tsx +1 -1
- package/template/src/admin/pages/TicketsPage.tsx +1 -1
- package/template/src/admin/pages/__tests__/ContentPage.test.tsx +5 -1
- package/template/src/admin/pages/__tests__/DashboardPage.test.tsx +62 -8
- package/template/src/admin/pages/__tests__/DisputesPage.test.tsx +8 -1
- package/template/src/admin/pages/__tests__/OrdersPage.test.tsx +4 -2
- package/template/src/admin/pages/__tests__/RegisterPage.test.tsx +40 -43
- package/template/src/admin/pages/__tests__/SettingsPage.test.tsx +83 -21
- package/template/src/admin/pages/__tests__/TicketsPage.test.tsx +3 -1
- package/template/src/admin/services/apiClient.ts +2 -3
- package/template/src/cli/modules/content/index.ts +3 -3
- package/template/src/cli/modules/dispute/index.ts +3 -3
- package/template/src/cli/modules/ticket/index.ts +3 -3
- package/template/src/cli/modules/todo/index.ts +1 -1
- package/template/src/cli/rpc/client.ts +3 -4
- package/template/src/cli/rpc/index.ts +1 -1
- package/template/src/client/App.tsx +3 -39
- package/template/src/client/AppRoutes.tsx +53 -0
- package/template/src/client/entry-server.tsx +75 -0
- package/template/src/client/main.tsx +3 -1
- package/template/src/client/pages/SearchPage.tsx +1 -1
- package/template/src/client/services/apiClient.ts +12 -4
- package/template/src/client/stores/__tests__/todoStore.test.ts +12 -3
- package/template/src/client/stores/entry-stores.ts +36 -0
- package/template/src/client/stores/notificationStore.ts +4 -4
- package/template/src/client/stores/todoStore.ts +2 -2
- package/template/src/merchant/pages/DisputesPage.tsx +3 -3
- package/template/src/merchant/pages/OrdersPage.tsx +1 -1
- package/template/src/merchant/pages/ProductsPage.tsx +1 -1
- package/template/src/merchant/pages/SettingsPage.tsx +1 -1
- package/template/src/server/__tests__/integration/isr-full-flow.test.ts +251 -0
- package/template/src/server/__tests__/integration/todos-api.test.ts +7 -4
- package/template/src/server/app.ts +6 -4
- package/template/src/server/core/__tests__/isr-cache.test.ts +96 -92
- package/template/src/server/core/__tests__/isr-invalidation.test.ts +29 -4
- package/template/src/server/core/__tests__/isr-registry.test.ts +215 -0
- package/template/src/server/core/__tests__/isr-renderer.test.ts +121 -0
- package/template/src/server/core/isr-cache.ts +6 -12
- package/template/src/server/core/isr-invalidation.ts +6 -12
- package/template/src/server/core/isr-registry.ts +104 -0
- package/template/src/server/core/isr-renderer.ts +75 -0
- package/template/src/server/db/schema/contents.ts +28 -20
- package/template/src/server/db/schema/disputes.ts +30 -22
- package/template/src/server/db/schema/notifications.ts +20 -14
- package/template/src/server/db/schema/orders.ts +23 -16
- package/template/src/server/db/schema/plugins.ts +56 -38
- package/template/src/server/db/schema/products.ts +24 -17
- package/template/src/server/db/schema/tickets.ts +44 -31
- package/template/src/server/db/schema/todos.ts +26 -18
- package/template/src/server/entries/cloudflare.ts +82 -19
- package/template/src/server/entries/node.ts +0 -2
- package/template/src/server/index.ts +0 -1
- package/template/src/server/isr-modules.ts +10 -0
- package/template/src/server/module-admin/__tests__/admin-service.test.ts +36 -12
- package/template/src/server/module-admin/routes/admin-notification-routes.ts +2 -1
- package/template/src/server/module-admin/routes/admin-routes.ts +3 -0
- package/template/src/server/module-admin/routes/dashboard-routes.ts +3 -0
- package/template/src/server/module-admin/services/admin-service.ts +57 -13
- package/template/src/server/module-auth/routes/auth-routes.ts +3 -0
- package/template/src/server/module-auth/routes/profile-routes.ts +3 -0
- package/template/src/server/module-captcha/routes/captcha-routes.ts +3 -0
- package/template/src/server/module-chat/routes/chat-routes.ts +4 -1
- package/template/src/server/module-content/__tests__/content-route.test.ts +2 -1
- package/template/src/server/module-content/__tests__/content-service.test.ts +2 -1
- package/template/src/server/module-content/__tests__/isr.test.ts +138 -0
- package/template/src/server/module-content/isr.ts +63 -0
- package/template/src/server/module-content/routes/content-routes.ts +10 -10
- package/template/src/server/module-content/routes/public-content-routes.ts +8 -4
- package/template/src/server/module-content/routes/topics-routes.ts +3 -0
- package/template/src/server/module-content/services/content-service.ts +23 -10
- package/template/src/server/module-dispute/__tests__/dispute-route.test.ts +2 -1
- package/template/src/server/module-dispute/__tests__/dispute-service.test.ts +2 -1
- package/template/src/server/module-dispute/routes/dispute-routes.ts +11 -10
- package/template/src/server/module-dispute/services/dispute-service.ts +15 -3
- package/template/src/server/module-file/routes/file-routes.ts +3 -0
- package/template/src/server/module-merchant/routes/merchant-routes.ts +3 -0
- package/template/src/server/module-merchant/services/merchant-service.ts +8 -8
- package/template/src/server/module-notifications/routes/notification-routes.ts +5 -1
- package/template/src/server/module-order/__tests__/order-route.test.ts +8 -8
- package/template/src/server/module-order/__tests__/order-service.test.ts +4 -3
- package/template/src/server/module-order/routes/cart-routes.ts +3 -0
- package/template/src/server/module-order/routes/order-routes.ts +9 -4
- package/template/src/server/module-order/routes/orders-mock-routes.ts +3 -0
- package/template/src/server/module-order/services/order-service.ts +25 -13
- package/template/src/server/module-permission/__tests__/audit-log-service.test.ts +464 -0
- package/template/src/server/module-permission/__tests__/role-service.test.ts +348 -0
- package/template/src/server/module-permission/routes/audit-log-routes.ts +3 -0
- package/template/src/server/module-permission/routes/permission-routes.ts +3 -0
- package/template/src/server/module-permission/routes/role-routes.ts +3 -0
- package/template/src/server/module-plugin/routes/plugin-admin-routes.ts +3 -0
- package/template/src/server/module-plugin/routes/plugin-routes.ts +3 -0
- package/template/src/server/module-plugin/services/admin-plugin-service.ts +10 -18
- package/template/src/server/module-plugin/services/admin-stats-service.ts +28 -9
- package/template/src/server/module-plugin/services/plugin-query-service.ts +42 -66
- package/template/src/server/module-tenant/routes/tenant-routes.ts +5 -1
- package/template/src/server/module-ticket/__tests__/ticket-route.test.ts +2 -1
- package/template/src/server/module-ticket/__tests__/ticket-service.test.ts +4 -3
- package/template/src/server/module-ticket/routes/ticket-routes.ts +11 -10
- package/template/src/server/module-ticket/services/ticket-service.ts +16 -5
- package/template/src/server/module-todos/__tests__/isr.test.ts +105 -0
- package/template/src/server/module-todos/__tests__/todo-service.test.ts +12 -9
- package/template/src/server/module-todos/__tests__/todos-route-rpc.test.ts +6 -6
- package/template/src/server/module-todos/isr.ts +41 -0
- package/template/src/server/module-todos/routes/todos-routes.ts +12 -5
- package/template/src/server/module-todos/services/todo-service.ts +31 -10
- package/template/src/server/route-registry.ts +0 -4
- package/template/src/server/rpc-merge.ts +27 -0
- package/template/src/server/rpc-surface.ts +117 -0
- package/template/src/server/rpc-type-canary.ts +80 -0
- package/template/src/server/test-utils/test-client.ts +7 -9
- package/template/src/server/test-utils/test-isr-helper.ts +140 -0
- package/template/src/shared/modules/content/schemas.ts +14 -0
- package/template/src/shared/modules/dispute/schemas.ts +14 -0
- package/template/src/shared/modules/order/schemas.ts +9 -1
- package/template/src/shared/modules/ticket/schemas.ts +14 -0
- package/template/src/shared/modules/todos/index.ts +4 -0
- package/template/src/shared/modules/todos/schemas.ts +14 -0
- package/template/src/shared/schemas/index.ts +18 -0
- package/template/tsup.config.ts +48 -1
- package/template/vitest.config.ts +19 -3
- package/template/vitest.setup.ts +68 -5
- package/template/patches/typescript+5.9.3.patch +0 -24
- /package/template/patches/{hono+4.12.16.patch → hono+4.12.34.patch} +0 -0
package/template/vitest.setup.ts
CHANGED
|
@@ -4,12 +4,75 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { afterEach, vi } from 'vitest'
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
// jest-dom 仅客户端组件测试需要;无 client 的 preset 未安装
|
|
8
|
+
const jestDomPkg = '@testing-library/jest-dom'
|
|
9
|
+
try {
|
|
10
|
+
await import(/* @vite-ignore */ jestDomPkg)
|
|
11
|
+
} catch {
|
|
12
|
+
// preset 无该依赖
|
|
13
|
+
}
|
|
14
|
+
// eventsource 仅客户端测试需要;无 client 的 preset 未安装该依赖。
|
|
15
|
+
// createRequire 放在块内避免与下方同名工具冲突
|
|
16
|
+
let EventSourceCtor: unknown = class {} as unknown
|
|
17
|
+
try {
|
|
18
|
+
const { createRequire: cr } = await import('node:module')
|
|
19
|
+
const req = cr(import.meta.url)
|
|
20
|
+
EventSourceCtor = req('eventsource').EventSource
|
|
21
|
+
} catch {
|
|
22
|
+
// preset 无该依赖
|
|
23
|
+
}
|
|
24
|
+
import { createRequire } from 'node:module'
|
|
25
|
+
|
|
26
|
+
// admin i18n 语言包仅存在于含 admin 模块的 preset(如 fullstack-admin);
|
|
27
|
+
// 不含 admin 的 preset(如 todo-app/minimal)没有该文件,缺省回退到 key 本身。
|
|
28
|
+
const require = createRequire(import.meta.url)
|
|
29
|
+
let zhCN: Record<string, unknown> = {}
|
|
30
|
+
try {
|
|
31
|
+
zhCN = (require('./src/admin/i18n/locales/zh-CN.json') as Record<string, unknown>) ?? {}
|
|
32
|
+
} catch {
|
|
33
|
+
zhCN = {}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function resolveTranslation(obj: Record<string, unknown>, key: string): string {
|
|
37
|
+
const keys = key.split('.')
|
|
38
|
+
let current: unknown = obj
|
|
39
|
+
for (const k of keys) {
|
|
40
|
+
if (current && typeof current === 'object' && k in (current as Record<string, unknown>)) {
|
|
41
|
+
current = (current as Record<string, unknown>)[k]
|
|
42
|
+
} else {
|
|
43
|
+
return key
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return typeof current === 'string' ? current : key
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const stableT = (key: string, params?: Record<string, unknown>) => {
|
|
50
|
+
let val = resolveTranslation(zhCN, key)
|
|
51
|
+
if (params) {
|
|
52
|
+
for (const [k, v] of Object.entries(params)) {
|
|
53
|
+
val = val.replace(`{{${k}}}`, String(v))
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return val
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
vi.mock('react-i18next', () => ({
|
|
60
|
+
useTranslation: () => ({
|
|
61
|
+
t: stableT,
|
|
62
|
+
i18n: {
|
|
63
|
+
language: 'zh-CN',
|
|
64
|
+
changeLanguage: () => {},
|
|
65
|
+
},
|
|
66
|
+
}),
|
|
67
|
+
initReactI18next: {
|
|
68
|
+
type: '3rdParty',
|
|
69
|
+
init: () => {},
|
|
70
|
+
},
|
|
71
|
+
}))
|
|
9
72
|
|
|
10
73
|
vi.mock('react-helmet-async', () => ({
|
|
11
|
-
Helmet: ({ children }: { children
|
|
12
|
-
HelmetProvider: ({ children }: { children
|
|
74
|
+
Helmet: ({ children }: { children?: unknown }) => children,
|
|
75
|
+
HelmetProvider: ({ children }: { children?: unknown }) => children,
|
|
13
76
|
}))
|
|
14
77
|
|
|
15
78
|
afterEach(() => {})
|
|
@@ -63,7 +126,7 @@ console.warn = (...args: unknown[]) => {
|
|
|
63
126
|
}
|
|
64
127
|
|
|
65
128
|
// EventSource can be used in both environments
|
|
66
|
-
global.EventSource =
|
|
129
|
+
global.EventSource = EventSourceCtor as unknown as typeof globalThis.EventSource
|
|
67
130
|
|
|
68
131
|
if (typeof globalThis.WebSocket === 'undefined') {
|
|
69
132
|
class MockWebSocket {
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
diff --git a/node_modules/typescript/lib/_tsc.js b/node_modules/typescript/lib/_tsc.js
|
|
2
|
-
--- a/node_modules/typescript/lib/_tsc.js
|
|
3
|
-
+++ b/node_modules/typescript/lib/_tsc.js
|
|
4
|
-
@@ -63591,7 +63591,7 @@ function createTypeChecker(host) {
|
|
5
|
-
if (!couldContainTypeVariables(type)) {
|
|
6
|
-
return type;
|
|
7
|
-
}
|
|
8
|
-
- if (instantiationDepth === 100 || instantiationCount >= 5e6) {
|
|
9
|
-
+ if (instantiationDepth === 1000 || instantiationCount >= 50e6) {
|
|
10
|
-
(_a = tracing) == null ? void 0 : _a.instant(tracing.Phase.CheckTypes, "instantiateType_DepthLimit", { typeId: type.id, instantiationDepth, instantiationCount });
|
|
11
|
-
error(currentNode, Diagnostics.Type_instantiation_is_excessively_deep_and_possibly_infinite);
|
|
12
|
-
return errorType;
|
|
13
|
-
diff --git a/node_modules/typescript/lib/typescript.js b/node_modules/typescript/lib/typescript.js
|
|
14
|
-
--- a/node_modules/typescript/lib/typescript.js
|
|
15
|
-
+++ b/node_modules/typescript/lib/typescript.js
|
|
16
|
-
@@ -68202,7 +68202,7 @@ function createTypeChecker(host) {
|
|
17
|
-
if (!couldContainTypeVariables(type)) {
|
|
18
|
-
return type;
|
|
19
|
-
}
|
|
20
|
-
- if (instantiationDepth === 100 || instantiationCount >= 5e6) {
|
|
21
|
-
+ if (instantiationDepth === 1000 || instantiationCount >= 50e6) {
|
|
22
|
-
(_a = tracing) == null ? void 0 : _a.instant(tracing.Phase.CheckTypes, "instantiateType_DepthLimit", { typeId: type.id, instantiationDepth, instantiationCount });
|
|
23
|
-
error2(currentNode, Diagnostics.Type_instantiation_is_excessively_deep_and_possibly_infinite);
|
|
24
|
-
return errorType;
|
|
File without changes
|