@gadmin2n/schematics 0.0.153 → 0.0.154

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.
Files changed (69) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/.git-blame-ignore-revs +5 -0
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/.nvmrc +1 -0
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/CODEBUDDY.md +4 -4
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile.codegen +16 -9
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile.server +21 -13
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile.web +11 -11
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/Jenkinsfile +1 -1
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/PRODUCT.md +1 -1
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/compose-ctl.sh +1 -1
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/docker-compose.yml +4 -4
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/readme.md +22 -22
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.oxfmtrc.json +13 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.oxlintrc.json +17 -0
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +14 -13
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/pnpm-workspace.yaml +23 -0
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/auth.guard.ts +4 -1
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.ts +2 -2
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/tracing.ts +4 -6
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.service.ts +2 -2
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.ts +1 -1
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +6 -6
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.ts +1 -1
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +6 -6
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +4 -4
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +1 -1
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +4 -4
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +1 -1
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +2 -2
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.ts +1 -1
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/permTransfer/page-transfer.service.ts +1 -1
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.ts +1 -1
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.ts +1 -1
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.ts +1 -1
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/staffDirectory/staff-directory.service.spec.ts +1 -1
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.errors.ts +4 -1
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.ts +4 -4
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.types.ts +4 -4
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.ts +1 -1
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.ts +2 -2
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +4 -4
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +5 -5
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +2 -2
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +11 -11
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +3 -1
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.ts +1 -1
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.controller.ts +1 -1
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/start-prod.sh +4 -4
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.oxfmtrc.json +12 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.oxlintrc.json +24 -0
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/web/README.MD +2 -2
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/web/nginx.conf +0 -4
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +17 -17
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/web/pnpm-workspace.yaml +13 -0
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/VanillaJSONEditor/index.jsx +4 -4
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/propPatcher.ts +36 -8
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +24 -7
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +2 -2
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +1 -1
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +1 -1
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/test/setup.ts +1 -1
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +53 -41
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vitest.config.ts +8 -2
  63. package/package.json +1 -1
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.eslintrc.js +0 -28
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.prettierignore +0 -7
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.prettierrc +0 -4
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.eslintrc.json +0 -38
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.prettierignore +0 -2
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.prettierrc +0 -4
@@ -0,0 +1,5 @@
1
+ # git blame 忽略的批量格式化 commit(用法:git config blame.ignoreRevsFile .git-blame-ignore-revs)
2
+ #
3
+ # 提交后把对应 commit hash 填到下面(本文件需与 commit 同库才有意义):
4
+ #
5
+ # TODO: oxfmt 全量 reformat 的 commit hash(Prettier → Oxfmt 迁移时的纯格式化提交)
@@ -7,9 +7,9 @@
7
7
  ## 常用命令
8
8
 
9
9
  ```bash
10
- cd server && yarn start:dev # 后端,端口 8000(优先读 server/.env.local)
11
- cd web && yarn dev # 前端,端口 3000(优先读 web/.env.local)
12
- cd server && yarn seed # 执行 seed(页面/资源/权限声明)
10
+ cd server && pnpm start:dev # 后端,端口 8000(优先读 server/.env.local)
11
+ cd web && pnpm dev # 前端,端口 3000(优先读 web/.env.local)
12
+ cd server && pnpm seed # 执行 seed(页面/资源/权限声明)
13
13
  ```
14
14
 
15
15
  ## 架构概览
@@ -69,7 +69,7 @@ server/src/
69
69
  - 只改 ui 配置文件 → 执行 `gadmin2 g prisma`
70
70
  - 修改 `config/prisma/` 后必须同步检查 `server/seed/`:
71
71
  - raw SQL 引用的列/表、seed 数据的必填字段与字段名要与新 schema 一致
72
- - 改完需要提醒开发者 `yarn seed` 验证
72
+ - 改完需要提醒开发者 `pnpm seed` 验证
73
73
  - **优先使用 skill 解决问题**,具体走哪条路径见下方「项目改动路径决策」
74
74
 
75
75
  ### 代码修改范围
@@ -8,7 +8,8 @@
8
8
  # 本镜像不会被推送到 registry,仅在 Jenkins agent 本地 docker daemon 中存活,
9
9
  # 流水线末尾会清理。
10
10
 
11
- FROM node:20-alpine
11
+ # pin 到 22:pnpm 11 要求 node >= 22.13(见 server/package.json engines)
12
+ FROM node:22-alpine
12
13
 
13
14
  WORKDIR /app
14
15
 
@@ -18,18 +19,24 @@ RUN apk add --no-cache openssl
18
19
  # 禁止 husky 在无 .git 环境下报错
19
20
  ENV HUSKY=0
20
21
 
21
- # 配置腾讯软件源
22
- RUN yarn config set registry https://mirrors.cloud.tencent.com/npm/
22
+ # 腾讯软件源:npm_config_registry 对 npm 与 pnpm 均生效(server/.npmrc 亦含 registry,
23
+ # 但全局安装 gadmin2 CLI 发生在 COPY .npmrc 之前,需要环境变量兜底)
24
+ ENV npm_config_registry=https://mirrors.cloud.tencent.com/npm/
23
25
 
24
- # 安装 gadmin2 CLI
25
- RUN yarn global add @gadmin2n/cli@latest
26
+ # 启用 corepack 并激活 server/package.json packageManager 字段指定的 pnpm 版本
27
+ RUN corepack enable && corepack install --global pnpm@11.23.0
28
+
29
+ # 安装 gadmin2 CLI(全局工具,用镜像自带 npm 即可,避免配置 pnpm global bin 路径)
30
+ RUN npm i -g @gadmin2n/cli@latest
26
31
 
27
32
  # 先复制 server 依赖描述文件,源码未变时此层 layer cache 可复用
28
- # (prisma generators 是 server 的 devDependencies,必须先 yarn install)
29
- COPY server/package.json server/yarn.lock ./server/
33
+ # (prisma generators 是 server 的 devDependencies,必须先 pnpm install)
34
+ COPY server/package.json server/pnpm-lock.yaml server/pnpm-workspace.yaml server/.npmrc ./server/
30
35
 
31
- RUN --mount=type=cache,target=/root/.yarn \
32
- cd server && yarn install --frozen-lockfile
36
+ # 显式指定 store 路径:默认路径随 HOME 变化,写死才能让下方 cache mount 生效
37
+ ENV PNPM_STORE_DIR=/pnpm/store
38
+ RUN --mount=type=cache,target=/pnpm/store \
39
+ cd server && pnpm install --frozen-lockfile
33
40
 
34
41
  # 复制全部 codegen 输入:上层 config/、server/(含 schema.prisma 与 gadmin-cli.json)、web/
35
42
  COPY config/ ./config/
@@ -2,13 +2,14 @@
2
2
  #
3
3
  # 通过 ARG CODEGEN_IMAGE + FROM ${CODEGEN_IMAGE} 引用 Jenkins 流水线先行构建的 codegen 镜像。
4
4
  # 直接 COPY --from=gen /app/server,复用 codegen 已经装好的 server/node_modules
5
- # (含 prisma client 与 gadmin2 generators),避免重复 yarn install。
5
+ # (含 prisma client 与 gadmin2 generators),避免重复 pnpm install。
6
6
 
7
7
  ARG CODEGEN_IMAGE
8
8
  FROM ${CODEGEN_IMAGE} AS gen
9
9
 
10
10
  # ─── 阶段 1:构建 ────────────────────────────────────────────
11
- FROM node:20-alpine AS builder
11
+ # pin 到 22:pnpm 11 要求 node >= 22.13(见 server/package.json engines)
12
+ FROM node:22-alpine AS builder
12
13
 
13
14
  WORKDIR /app
14
15
 
@@ -18,14 +19,17 @@ RUN apk add --no-cache openssl
18
19
  # 禁止 husky 在无 .git 环境下报错
19
20
  ENV HUSKY=0
20
21
 
22
+ # 启用 corepack 并激活 server/package.json packageManager 字段指定的 pnpm 版本
23
+ RUN corepack enable && corepack install --global pnpm@11.23.0
24
+
21
25
  # 从 codegen 镜像取完整 server/(含已生成代码 + 已安装的 node_modules)
22
26
  COPY --from=gen /app/server ./server
23
27
 
24
28
  # 编译
25
- RUN cd server && yarn build
29
+ RUN cd server && pnpm build
26
30
 
27
31
  # ─── 阶段 2:运行 ────────────────────────────────────────────
28
- FROM node:20-alpine AS runner
32
+ FROM node:22-alpine AS runner
29
33
 
30
34
  # Prisma 运行时需要 openssl;中国项目默认时区上海
31
35
  RUN apk add --no-cache openssl tzdata && \
@@ -41,17 +45,21 @@ STOPSIGNAL SIGQUIT
41
45
  ENV HUSKY=0 \
42
46
  NODE_ENV=production
43
47
 
48
+ # 启用 corepack 并激活 server/package.json packageManager 字段指定的 pnpm 版本
49
+ RUN corepack enable && corepack install --global pnpm@11.23.0
50
+
44
51
  # 从 builder 复制依赖描述文件(其源头是 codegen 镜像)
45
- COPY --from=builder --chown=node:node /app/server/package.json /app/server/yarn.lock ./
52
+ COPY --from=builder --chown=node:node /app/server/package.json /app/server/pnpm-lock.yaml /app/server/pnpm-workspace.yaml /app/server/.npmrc ./
46
53
 
47
- # 注意:这里不能用 `yarn install --production`。
54
+ # 注意:这里不能用 `pnpm install --prod`。
48
55
  # start-prod.sh 启动时需要:
49
- # - prisma CLI(运行 `yarn migrate:deploy`)
50
- # - ts-node + dotenv-cli(运行 `yarn seed`)
51
- # 这三者在 package.json 中位于 devDependencies,--production 会跳过它们。
56
+ # - prisma CLI(运行 `pnpm migrate:deploy`)
57
+ # - ts-node + dotenv-cli(运行 `pnpm seed`)
58
+ # 这三者在 package.json 中位于 devDependencies,--prod 会跳过它们。
52
59
  # 故安装全量依赖;产物体积增加约 80MB,换来启动脚本统一可用。
53
- RUN --mount=type=cache,target=/root/.yarn \
54
- yarn install --frozen-lockfile
60
+ ENV PNPM_STORE_DIR=/pnpm/store
61
+ RUN --mount=type=cache,target=/pnpm/store \
62
+ pnpm install --frozen-lockfile
55
63
 
56
64
  # 从构建阶段复制 Prisma 生成的 Client(含平台原生二进制)
57
65
  COPY --from=builder --chown=node:node /app/server/node_modules/.prisma ./node_modules/.prisma
@@ -62,7 +70,7 @@ COPY --from=builder --chown=node:node /app/server/dist ./dist
62
70
  # 复制 Prisma schema(feature 分支部署时 prisma db push 需要)
63
71
  COPY --from=builder --chown=node:node /app/server/prisma ./prisma
64
72
 
65
- # 复制 seed 源码与其依赖的 scripts/lib(启动时 `yarn seed` 走 ts-node 直接执行 .ts)
73
+ # 复制 seed 源码与其依赖的 scripts/lib(启动时 `pnpm seed` 走 ts-node 直接执行 .ts)
66
74
  COPY --from=builder --chown=node:node /app/server/seed ./seed
67
75
  COPY --from=builder --chown=node:node /app/server/scripts ./scripts
68
76
  COPY --from=builder --chown=node:node /app/server/tsconfig.json ./tsconfig.json
@@ -87,4 +95,4 @@ EXPOSE 8000
87
95
  HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
88
96
  CMD wget -qO- http://127.0.0.1:8000/health/live || exit 1
89
97
 
90
- CMD ["yarn", "start:prod"]
98
+ CMD ["pnpm", "start:prod"]
@@ -11,25 +11,26 @@ ARG CODEGEN_IMAGE
11
11
  FROM ${CODEGEN_IMAGE} AS gen
12
12
 
13
13
  # ─── 阶段 1:构建 ────────────────────────────────────────────
14
- FROM node:20-alpine AS builder
14
+ # pin 到 22:pnpm 11 要求 node >= 22.13(见 web/package.json engines)
15
+ FROM node:22-alpine AS builder
15
16
 
16
17
  WORKDIR /app
17
18
 
18
19
  # 禁止 husky 在无 .git 环境下报错
19
20
  ENV HUSKY=0
20
21
 
21
- # 配置腾讯软件源
22
- RUN yarn config set registry https://mirrors.cloud.tencent.com/npm/
22
+ # 启用 corepack 并激活 web/package.json packageManager 字段指定的 pnpm 版本
23
+ RUN corepack enable && corepack install --global pnpm@11.23.0
23
24
 
24
- # 从 codegen 镜像取完整 web/(含生成代码、不含 node_modules)
25
- COPY --from=gen /app/web ./web
25
+ # 显式指定 store 路径:默认路径随 HOME 变化,写死才能让下方 cache mount 生效
26
+ ENV PNPM_STORE_DIR=/pnpm/store
26
27
 
27
- # 移除 yarn.lock 中的 resolved 地址,强制使用新的 registry
28
- RUN sed -i 's|https://registry.npmmirror.com/|https://mirrors.cloud.tencent.com/npm/|g' web/yarn.lock
28
+ # 从 codegen 镜像取完整 web/(含生成代码、不含 node_modules;registry 由 web/.npmrc 提供)
29
+ COPY --from=gen /app/web ./web
29
30
 
30
31
  # 安装依赖
31
- RUN --mount=type=cache,target=/root/.yarn \
32
- cd web && yarn install --frozen-lockfile
32
+ RUN --mount=type=cache,target=/pnpm/store \
33
+ cd web && pnpm install --frozen-lockfile
33
34
 
34
35
  # 声明构建参数
35
36
  ARG NODE_ENV=production
@@ -38,8 +39,7 @@ ARG DEPLOY_NAME
38
39
  ENV VITE_DEPLOY_NAME=${DEPLOY_NAME}
39
40
 
40
41
  # 编译
41
- RUN --mount=type=cache,target=/root/.yarn \
42
- cd web && yarn build --mode ${NODE_ENV}
42
+ RUN cd web && pnpm build --mode ${NODE_ENV}
43
43
 
44
44
  # ─── 阶段 2:运行 ────────────────────────────────────────────
45
45
  FROM nginx:alpine
@@ -88,7 +88,7 @@ pipeline {
88
88
  // 路径触发规则:
89
89
  // web/** → web
90
90
  // config/ui/** → web(前端 CRUD 代码由 config/ui 生成)
91
- // config/prisma/** → server + web(后端模型由 prisma 生成;前端 enums 通过 yarn sync:code 与后端同步)
91
+ // config/prisma/** → server + web(后端模型由 prisma 生成;前端 enums 通过 pnpm sync:code 与后端同步)
92
92
  // server/** → server
93
93
  buildWeb = matches(nonDoc, 'web/') || matches(nonDoc, 'config/ui/') || matches(nonDoc, 'config/prisma/')
94
94
  buildServer = matches(nonDoc, 'server/') || matches(nonDoc, 'config/prisma/')
@@ -61,7 +61,7 @@ gadmin2 是一个低代码生成工具:给它一份 Prisma schema + 一份 UI
61
61
  1. **数据优先于装饰** — 任何屏幕,先问「数据看清楚了吗」,再问「漂亮吗」。删掉一个分隔线、一个图标、一段说明文字而页面没有变难用,就该删。
62
62
  2. **冷静的信息密度** — 同屏可以塞很多东西,但不能让人焦虑。靠间距节奏、字重对比和层级排布承载密度,不靠颜色或边框。Cards 是惰性答案,能用一条横分隔线解决就别套卡片。
63
63
  3. **靠清晰建立信任** — 标签、错误信息、空状态、操作确认都用直白可执行的句子。不写「Oops!」「出了点小问题」之类粉饰;写「保存失败:第 3 行的 `email` 格式不合法」。
64
- 4. **配置即设计** — 因为页面由 prisma + ui 配置生成,所有视觉规范必须沉淀到 token、组件和默认值里,让一个新模型 `yarn generate` 出来就已经是合格的页面,工程师不需要写任何 CSS。
64
+ 4. **配置即设计** — 因为页面由 prisma + ui 配置生成,所有视觉规范必须沉淀到 token、组件和默认值里,让一个新模型 `pnpm generate` 出来就已经是合格的页面,工程师不需要写任何 CSS。
65
65
  5. **保留专家流速** — 内部用户每天要重复几百次同样的操作。键盘快捷键、批量选择、复制 ID、可分享链接的过滤状态、自动聚焦的输入框,都比「视觉打磨」优先级更高。任何「为新人友好」的改动都不能减慢老用户。
66
66
 
67
67
  ## Accessibility & Inclusion
@@ -189,7 +189,7 @@ print_post_up_guide() {
189
189
  清空数据回到种子状态 ./compose-ctl.sh --reset
190
190
 
191
191
  提示:
192
- · 前端开发请用 cd web && yarn dev (本 compose 的 web 是 nginx 静态镜像,无热更新)
192
+ · 前端开发请用 cd web && pnpm dev (本 compose 的 web 是 nginx 静态镜像,无热更新)
193
193
  · server-init 是一次性容器,跑完 migrate:deploy + seed 后退出 (Exited 0) 是正常的
194
194
  EOF
195
195
  }
@@ -36,7 +36,7 @@
36
36
  # 首次使用先跑 `bash dev/register-tenant.sh` 注册本项目为租户。
37
37
  #
38
38
  # 提示:
39
- # - web 是生产 nginx 镜像,不支持热更新;前端开发请直接 `cd web && yarn dev`
39
+ # - web 是生产 nginx 镜像,不支持热更新;前端开发请直接 `cd web && pnpm dev`
40
40
  # =============================================================================
41
41
 
42
42
  services:
@@ -116,9 +116,9 @@ services:
116
116
  - |
117
117
  set -e
118
118
  echo "[server-init] migrate deploy ..."
119
- yarn migrate:deploy
119
+ pnpm migrate:deploy
120
120
  echo "[server-init] seed ..."
121
- yarn seed
121
+ pnpm seed
122
122
  echo "[server-init] done."
123
123
 
124
124
  # ---------------------------------------------------------------------------
@@ -153,7 +153,7 @@ services:
153
153
  # ---------------------------------------------------------------------------
154
154
  # Web 前端(生产 nginx 镜像;本地仅用于完整集成验证)
155
155
  # 镜像构建依赖 codegen:先 `docker compose --profile codegen build codegen`
156
- # 开发态请用 `cd web && yarn dev`,热更新更顺手
156
+ # 开发态请用 `cd web && pnpm dev`,热更新更顺手
157
157
  # ---------------------------------------------------------------------------
158
158
  web:
159
159
  image: ${COMPOSE_PROJECT_NAME}-web:local
@@ -6,7 +6,7 @@ The gadmin2 CLI is a command-line interface tool that helps you to initialize, d
6
6
 
7
7
  ## Installation
8
8
  ```
9
- $ yarn global add @gadmin2n/cli@latest
9
+ $ npm i -g @gadmin2n/cli@latest
10
10
  ```
11
11
  Check CLI version
12
12
  ```
@@ -33,15 +33,15 @@ $ gadmin2 g prisma:dev # 生成 CRUD 代码 + 创建并应用迁移(内部调
33
33
  ### Start web DevServer
34
34
  ```
35
35
  $ cd web
36
- $ yarn #run once if dependancies installed failed
37
- $ yarn dev
36
+ $ pnpm install #run once if dependancies installed failed
37
+ $ pnpm dev
38
38
  ```
39
39
 
40
40
  ### Start server(nestjs) DevServer
41
41
  ```
42
42
  $ cd server
43
- $ yarn #run once if dependancies installed failed
44
- $ yarn start:dev
43
+ $ pnpm install #run once if dependancies installed failed
44
+ $ pnpm start:dev
45
45
  ```
46
46
  About nestjs server [read more](https://ptc.coding.intlgame.com/p/gadmin2/d/schematics/git/tree/master/src/lib/application/files/server/nest/README.md)
47
47
 
@@ -68,9 +68,9 @@ About nestjs server [read more](https://ptc.coding.intlgame.com/p/gadmin2/d/sche
68
68
  | 环境 | 允许的迁移命令 |
69
69
  |------|------|
70
70
  | 本地开发(各自本地库) | `gadmin2 g prisma:dev` |
71
- | 共享测试 / 生产库 | 仅 `yarn migrate:deploy` |
71
+ | 共享测试 / 生产库 | 仅 `pnpm migrate:deploy` |
72
72
 
73
- ### 命令详解:`gadmin2 g prisma:dev` vs `yarn migrate:deploy`
73
+ ### 命令详解:`gadmin2 g prisma:dev` vs `pnpm migrate:deploy`
74
74
 
75
75
  **`gadmin2 g prisma:dev`(内部调 `migrate:dev` = `prisma migrate dev --name auto`)**
76
76
 
@@ -86,7 +86,7 @@ About nestjs server [read more](https://ptc.coding.intlgame.com/p/gadmin2/d/sche
86
86
  - 检测到**漂移(drift)**(本地库和迁移历史对不上,如曾手动 `db push` 改过表)时,会**交互式提示重置数据库(drop 重建)**。纯拉取+应用别人迁移通常不触发;本地库被改脏才会。遇到时看清提示再决定,别盲目回车。
87
87
  - 因为会改本地库且交互,**绝不能对共享/生产库运行**。
88
88
 
89
- **`yarn migrate:deploy`(= `prisma migrate deploy`)**
89
+ **`pnpm migrate:deploy`(= `prisma migrate deploy`)**
90
90
 
91
91
  - **只回放 pending 迁移,从不生成迁移、从不删数据、无交互**,也不会因 drift 提示 reset。
92
92
  - **不重新生成后端 CRUD 代码**——若拉下来的变更带了新表/新字段需要 module 代码,还得再跑 `gadmin2 g prisma`(只生成代码、不碰库)。
@@ -97,14 +97,14 @@ About nestjs server [read more](https://ptc.coding.intlgame.com/p/gadmin2/d/sche
97
97
  | 我的情况 | 用哪条 |
98
98
  |------|------|
99
99
  | 本地开发,且/或自己也改了 schema,要生成代码 | `gadmin2 g prisma:dev` |
100
- | 本地开发,确定自己没改 schema,只想安全应用别人迁移 | `yarn migrate:deploy`(如需代码再 `gadmin2 g prisma`) |
101
- | 共享测试 / 生产库 | 只能 `yarn migrate:deploy` |
100
+ | 本地开发,确定自己没改 schema,只想安全应用别人迁移 | `pnpm migrate:deploy`(如需代码再 `gadmin2 g prisma`) |
101
+ | 共享测试 / 生产库 | 只能 `pnpm migrate:deploy` |
102
102
 
103
103
  ### 日常开发流
104
104
 
105
105
  ```
106
106
  1. 改 config/prisma/{module}.prisma # 唯一手写处
107
- 2. yarn migrate:create # 只生成迁移文件,不应用
107
+ 2. pnpm migrate:create # 只生成迁移文件,不应用
108
108
  3. 审查 server/prisma/migrations/xxx/migration.sql # 重点看 DROP / 改列类型 / NOT NULL
109
109
  4. gadmin2 g prisma:dev # 生成 CRUD 代码 + 应用迁移到本地库
110
110
  5. 提交 config/prisma/* + server/prisma/migrations/* + web/src/routes/*
@@ -119,7 +119,7 @@ About nestjs server [read more](https://ptc.coding.intlgame.com/p/gadmin2/d/sche
119
119
  - 含 `config/prisma/*` 或新迁移 → 运行 `gadmin2 g prisma:dev`(应用新迁移 + 重新生成后端代码)
120
120
  - 仅含 `config/ui/*` → 运行 `gadmin2 g prisma`(只重新生成前端代码)
121
121
 
122
- hook 只提示、不自动执行(`migrate:dev` 会改本地库且交互,不宜静默跑);需先在项目根跑过一次 `yarn`(触发 `husky install`)hook 才生效。
122
+ hook 只提示、不自动执行(`migrate:dev` 会改本地库且交互,不宜静默跑);需先在项目根在 web 或 server 跑过一次 `pnpm install`(触发 `husky install`)hook 才生效。
123
123
 
124
124
  ### 首次接入迁移(baseline)
125
125
 
@@ -129,7 +129,7 @@ hook 只提示、不自动执行(`migrate:dev` 会改本地库且交互,不
129
129
  |------|:---:|:---:|------|
130
130
  | 已有本地库(db push 建的) | ❌ 文件已入库 | ✅ 必须一次 | 正常 `gadmin2 g prisma:dev` |
131
131
  | 新环境 / 空库 | ❌ | ❌ 不需要 | 直接 `gadmin2 g prisma:dev` 建全表 |
132
- | 共享测试/生产库(现存非空) | ❌ | ✅ 首次一次 | 之后 `yarn migrate:deploy` |
132
+ | 共享测试/生产库(现存非空) | ❌ | ✅ 首次一次 | 之后 `pnpm migrate:deploy` |
133
133
 
134
134
  resolve 命令(在 `server/` 下执行,注意用本地 `dotenv-cli` 以避免命中全局 python-dotenv):
135
135
 
@@ -149,7 +149,7 @@ npx dotenv -e .env.local -e .env -- bash -c 'psql "${DATABASE_URL%%\?*}" -c "DEL
149
149
 
150
150
  ### 迁移冲突约定
151
151
 
152
- 两人各自基于同一父迁移生成迁移,合并后顺序会乱。约定:schema 改动**小步快合**;合并遇到迁移冲突时,**后合并者删掉自己的迁移文件、rebase 后重新 `yarn migrate:create`**,不要手改文件名时间戳。
152
+ 两人各自基于同一父迁移生成迁移,合并后顺序会乱。约定:schema 改动**小步快合**;合并遇到迁移冲突时,**后合并者删掉自己的迁移文件、rebase 后重新 `pnpm migrate:create`**,不要手改文件名时间戳。
153
153
 
154
154
  ## 构建与部署
155
155
 
@@ -191,7 +191,7 @@ docker compose up -d --build
191
191
 
192
192
  详细使用与端口分配见 `docker-compose.md`。
193
193
 
194
- > 注:开发态 web/server 推荐直接 `yarn dev` / `yarn start:dev`(见 Usage 章节),`docker compose` 是用于完整集成验证。
194
+ > 注:开发态 web/server 推荐直接 `pnpm dev` / `pnpm start:dev`(见 Usage 章节),`docker compose` 是用于完整集成验证。
195
195
 
196
196
  ### CI/CD 流水线
197
197
 
@@ -249,8 +249,8 @@ post.always: 清理本地 codegen 中间镜像
249
249
  │ • CREATE DATABASE temporal_visibility
250
250
  │
251
251
  ├── server-init(一次性容器,depends_on postgres healthy)
252
- │ • yarn migrate:deploy (prisma 把 schema 推到 gadmin_demo)
253
- │ • yarn seed (播种 RBAC 等基础数据,跑完即退出 Exited 0)
252
+ │ • pnpm migrate:deploy (prisma 把 schema 推到 gadmin_demo)
253
+ │ • pnpm seed (播种 RBAC 等基础数据,跑完即退出 Exited 0)
254
254
  │
255
255
  └── server / web / temporal-* (正常服务)
256
256
  ```
@@ -278,13 +278,13 @@ container start
278
278
  │ │
279
279
  │ ├─ A. 临时环境(feature*/bugfix*/hotfix*):每次启动都重建分支 schema
280
280
  │ │ • 改写 DATABASE_URL:schema=<DEPLOY_NAME>(- 与 / 替换为 _)
281
- │ │ • yarn migrate:deploy
281
+ │ │ • pnpm migrate:deploy
282
282
  │ │ • node migrate-between-pg-schemas.js (从 public schema 拷数据到分支 schema)
283
- │ │ • yarn seed (幂等,每次启动都跑)
283
+ │ │ • pnpm seed (幂等,每次启动都跑)
284
284
  │ │
285
285
  │ └─ B. 非临时环境(默认 / production):按需初始化
286
286
  │ • DATABASE_URL 兜底 schema=public
287
- │ • 探测 t_role:不存在或 count=0 → yarn migrate:deploy + yarn seed;否则跳过
287
+ │ • 探测 t_role:不存在或 count=0 → pnpm migrate:deploy + pnpm seed;否则跳过
288
288
  │ • 连接失败等异常 → 保守走初始化路径
289
289
  │
290
290
  └── exec node dist/src/main ← 启动 NestJS
@@ -301,8 +301,8 @@ container start
301
301
  | 对象 | 本地 compose | 生产 / 临时环境 |
302
302
  |---|---|---|
303
303
  | 数据库(`gadmin_demo`) | `dev/postgres/init.sql`(pgdata 卷为空时) | `ensure-database.js`(每次启动幂等) |
304
- | Schema + 表结构 | `server-init` 里 `yarn migrate:deploy` | `start-prod.sh` 按分支策略 `yarn migrate:deploy` |
305
- | 基础数据(seed) | `server-init` 里 `yarn seed` | `start-prod.sh` 按分支策略 `yarn seed` |
304
+ | Schema + 表结构 | `server-init` 里 `pnpm migrate:deploy` | `start-prod.sh` 按分支策略 `pnpm migrate:deploy` |
305
+ | 基础数据(seed) | `server-init` 里 `pnpm seed` | `start-prod.sh` 按分支策略 `pnpm seed` |
306
306
  | 临时环境 schema 隔离 | — | `start-prod.sh` 改写 DATABASE_URL + `migrate-between-pg-schemas.js` |
307
307
 
308
308
  ## Template Sync
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "./node_modules/oxfmt/configuration_schema.json",
3
+ "singleQuote": true,
4
+ "trailingComma": "all",
5
+ "printWidth": 80,
6
+ "sortPackageJson": false,
7
+ "ignorePatterns": [
8
+ "src/**/*.enum.ts",
9
+ "src/generated/**",
10
+ "dist/**",
11
+ "node_modules/**"
12
+ ]
13
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
3
+ "plugins": ["typescript"],
4
+ "categories": {
5
+ "correctness": "warn"
6
+ },
7
+ "rules": {
8
+ "typescript/no-explicit-any": "off",
9
+ "no-empty-function": "warn"
10
+ },
11
+ "ignorePatterns": [
12
+ "dist/**",
13
+ "node_modules/**",
14
+ "src/generated/**",
15
+ "src/**/*.enum.ts"
16
+ ]
17
+ }
@@ -8,7 +8,8 @@
8
8
  "scripts": {
9
9
  "prebuild": "rimraf dist",
10
10
  "build": "nest build -c gadmin-cli.json",
11
- "format": "prettier --write \"../config/*.ts\" \"src/**/*.ts\" \"test/**/*.ts\"",
11
+ "format": "oxfmt src test",
12
+ "format:check": "oxfmt src test --check",
12
13
  "prepare": "cd .. && husky install || true",
13
14
  "start": "dotenv -e .env.local -e .env -- nest start -c gadmin-cli.json",
14
15
  "start:dev": "dotenv -e .env.local -e .env -- nest start -c gadmin-cli.json --watch",
@@ -17,7 +18,8 @@
17
18
  "start:debug": "dotenv -e .env.local -e .env -- nest start -c gadmin-cli.json --debug --watch",
18
19
  "start:prod": "/bin/sh start-prod.sh",
19
20
  "typecheck": "tsc --noEmit",
20
- "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
21
+ "lint": "oxlint src test",
22
+ "lint:fix": "oxlint src test --fix",
21
23
  "test": "jest",
22
24
  "test:watch": "jest --watch",
23
25
  "test:cov": "jest --coverage",
@@ -28,7 +30,7 @@
28
30
  "migrate:deploy": "dotenv -e .env.local -e .env -- prisma migrate deploy",
29
31
  "migrate:status": "dotenv -e .env.local -e .env -- prisma migrate status",
30
32
  "generate": "dotenv -e .env.local -e .env -- npx prisma generate",
31
- "generate:dev": "npm run migrate:dev",
33
+ "generate:dev": "pnpm migrate:dev",
32
34
  "postgenerate:dev": "dotenv -e .env.local -e .env -- ts-node seed/data-mngt.seed.ts",
33
35
  "postgadminGenerate": "node scripts/notify-dev-servers.js",
34
36
  "push:db": "dotenv -e .env.local -e .env -- prisma db push --skip-generate",
@@ -69,8 +71,8 @@
69
71
  "cache-manager": "^6.4.3",
70
72
  "class-transformer": "^0.5.1",
71
73
  "class-validator": "^0.13.2",
72
- "cron-parser": "^5.0.0",
73
74
  "cookie-parser": "^1.4.6",
75
+ "cron-parser": "^5.0.0",
74
76
  "crypto-js": "^4.2.0",
75
77
  "csvtojson": "^2.0.10",
76
78
  "dayjs": "^1.10.7",
@@ -108,18 +110,13 @@
108
110
  "@types/multer": "^1.4.7",
109
111
  "@types/node": "^16.0.0",
110
112
  "@types/supertest": "^2.0.11",
111
- "@typescript-eslint/eslint-plugin": "^5.0.0",
112
- "@typescript-eslint/parser": "^5.0.0",
113
113
  "concurrently": "^9.1.0",
114
- "eslint": "^8.0.1",
115
- "eslint-config-prettier": "^8.3.0",
116
- "eslint-plugin-prettier": "^4.0.0",
117
114
  "husky": "^8.0.0",
118
115
  "jest": "^29.0.0",
119
116
  "lint-staged": "^13.0.0",
120
117
  "nodemon": "^3.1.7",
121
- "prettier": "^2.3.2",
122
- "prettier-plugin-organize-imports": "^3.0.3",
118
+ "oxfmt": "^0.68.0",
119
+ "oxlint": "^1.83.0",
123
120
  "prisma-dbml-generator": "^0.9.1",
124
121
  "source-map-support": "^0.5.20",
125
122
  "supertest": "^6.1.3",
@@ -149,10 +146,14 @@
149
146
  "_moduleAliases": {
150
147
  "@": "src"
151
148
  },
149
+ "packageManager": "pnpm@11.23.0",
150
+ "engines": {
151
+ "node": ">=22.13"
152
+ },
152
153
  "prisma": {
153
- "seed": "yarn seed"
154
+ "seed": "pnpm seed"
154
155
  },
155
156
  "lint-staged": {
156
- "**/*.{ts,tsx}": "prettier --write"
157
+ "**/*.{ts,tsx}": "oxfmt"
157
158
  }
158
159
  }
@@ -0,0 +1,23 @@
1
+ # pnpm 11 起,原先放在 package.json "pnpm" 字段的设置迁移至此文件。
2
+ # 本项目非 monorepo,此文件仅用于承载 pnpm 设置。
3
+
4
+ # gadmin2 CLI 与 nestjs-prisma 等工具按 yarn 扁平布局硬编码路径
5
+ # (如 server/node_modules/.prisma/client/index.d.ts),
6
+ # pnpm 默认的 isolated 布局会破坏它们,故使用 hoisted 模式(等价 yarn 扁平 node_modules)。
7
+ nodeLinker: hoisted
8
+
9
+ # 依赖的构建脚本默认被禁止执行(供应链安全考虑),需在此逐个放行。
10
+ allowBuilds:
11
+ # 必须放行:postinstall 负责下载/生成 Prisma 引擎与 Client,缺失则无法启动
12
+ prisma: true
13
+ '@prisma/client': true
14
+ '@prisma/engines': true
15
+ # nest build 使用的 SWC 原生二进制
16
+ '@swc/core': true
17
+ # esbuild(nest cli / ts-node 链路)原生二进制下载
18
+ esbuild: true
19
+ # temporal 链路依赖,postinstall 做 cli codegen 自检
20
+ protobufjs: true
21
+ # 以下脚本仅打印捐赠/统计信息,与产物无关,保持禁止
22
+ '@nestjs/core': false
23
+ '@scarf/scarf': false
@@ -97,7 +97,10 @@ async function issueGAdminTokenCookie(res, user: UserType) {
97
97
 
98
98
  @Injectable()
99
99
  export default class AuthGuard implements CanActivate {
100
- constructor(private reflector: Reflector, private userService: UserService) {}
100
+ constructor(
101
+ private reflector: Reflector,
102
+ private userService: UserService,
103
+ ) {}
101
104
 
102
105
  private async getApikeyIdentity(req): Promise<UserType> {
103
106
  const apiKey = req.headers['x-api-key'] ?? req.query.api_key;
@@ -56,8 +56,8 @@ export class StructuredAllExceptionsFilter implements ExceptionFilter {
56
56
  typeof payload === 'string'
57
57
  ? payload
58
58
  : statusCode === HttpStatus.INTERNAL_SERVER_ERROR
59
- ? 'Internal server error.'
60
- : controlled?.message ?? error,
59
+ ? 'Internal server error.'
60
+ : (controlled?.message ?? error),
61
61
  error,
62
62
  path,
63
63
  });
@@ -58,12 +58,10 @@ class PrismaDbSpanProcessor implements SpanProcessor {
58
58
  mutableSpan.attributes['db.name'] = dbInfo.name;
59
59
  mutableSpan.attributes['db.instance'] = dbInfo.name;
60
60
  mutableSpan.attributes['db.ip'] = dbInfo.host;
61
- mutableSpan.attributes[
62
- 'peer.service'
63
- ] = `${dbInfo.name}@${dbInfo.host}:${dbInfo.port}`;
64
- mutableSpan.attributes[
65
- 'peer.filled'
66
- ] = `${dbInfo.name}@${dbInfo.host}:${dbInfo.port}`;
61
+ mutableSpan.attributes['peer.service'] =
62
+ `${dbInfo.name}@${dbInfo.host}:${dbInfo.port}`;
63
+ mutableSpan.attributes['peer.filled'] =
64
+ `${dbInfo.name}@${dbInfo.host}:${dbInfo.port}`;
67
65
  }
68
66
  this.inner.onEnd(span);
69
67
  }
@@ -440,8 +440,8 @@ export class AgendaService
440
440
  ? toggle === 'active'
441
441
  ? stateFiltered.filter((j) => !j.disabled)
442
442
  : toggle === 'paused'
443
- ? stateFiltered.filter((j) => j.disabled)
444
- : stateFiltered
443
+ ? stateFiltered.filter((j) => j.disabled)
444
+ : stateFiltered
445
445
  : stateFiltered;
446
446
 
447
447
  const total = toggleFiltered.length;
@@ -130,7 +130,7 @@ export class AuditController {
130
130
  @Body() body: UpdateAuditDto,
131
131
  @ACAttrFilter() acAttrFilter,
132
132
  ) {
133
- /*
133
+ /*
134
134
  const origin = (await this.auditService.findUnique(id, {
135
135
  id: true,
136
136
  // 这里需要根据实际情况填写
@@ -61,12 +61,12 @@ export class CodeRuntimeController {
61
61
  node?.runtimeKey === 'code' && !input.configKey
62
62
  ? node.config
63
63
  : node?.runtimeKey === 'human_approval' &&
64
- input.configKey === 'creationResult'
65
- ? node.config.external?.creationResult
66
- : node?.runtimeKey === 'human_approval' &&
67
- input.configKey === 'approverLookupResult'
68
- ? dynamicSubject?.lookup?.result
69
- : undefined;
64
+ input.configKey === 'creationResult'
65
+ ? node.config.external?.creationResult
66
+ : node?.runtimeKey === 'human_approval' &&
67
+ input.configKey === 'approverLookupResult'
68
+ ? dynamicSubject?.lookup?.result
69
+ : undefined;
70
70
  if (
71
71
  !version ||
72
72
  version.workflowId !== instance.workflowId ||
@@ -128,7 +128,7 @@ export class GameController {
128
128
  @Body() body: UpdateGameDto,
129
129
  @ACAttrFilter() acAttrFilter,
130
130
  ) {
131
- /*
131
+ /*
132
132
  const origin = (await this.gameService.findUnique(id, {
133
133
  id: true,
134
134
  // 这里需要根据实际情况填写