@oj-module/cli 0.2.54 → 0.2.56

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 (289) hide show
  1. package/devkit/SKILL.md +3 -3
  2. package/devkit/manual.md +59 -52
  3. package/package.json +2 -2
  4. package/shell-dist/assets/{index-e_Mp2mb5.js → index-CImwskAz.js} +24 -11
  5. package/shell-dist/assets/runtime.js +2 -2
  6. package/shell-dist/index.html +3 -3
  7. package/shell-dist/versions.json +3 -3
  8. package/src/__tests__/layout.test.ts +30 -1
  9. package/src/__tests__/templates-schema-columns.test.ts +99 -0
  10. package/src/alias-paths.ts +11 -12
  11. package/src/builtin.ts +10 -3
  12. package/src/contract/__tests__/emit-client.test.ts +4 -4
  13. package/src/contract/__tests__/market-client.integration.test.ts +2 -2
  14. package/src/contract/__tests__/run-api.test.ts +2 -2
  15. package/src/contract/check.ts +6 -2
  16. package/src/contract/emit-client.ts +10 -3
  17. package/src/contract/run.ts +10 -2
  18. package/src/init.ts +19 -11
  19. package/src/layout.ts +72 -16
  20. package/src/lifecycle/__tests__/manifest-contract.test.ts +2 -2
  21. package/src/market/__tests__/bootstrap.test.ts +1 -1
  22. package/src/site.ts +1 -1
  23. package/templates/README.md +30 -20
  24. package/templates/init.include.yaml +19 -11
  25. package/templates/openapi.json +95 -86
  26. package/templates/src/{_platform/api → app/api/_platform}/_shared/service/domain/users.ts +27 -0
  27. package/templates/src/{_platform/api → app/api/_platform}/_shared/service/infra/oplog.ts +4 -2
  28. package/templates/src/app/api/_platform/migrations/0017__users_employee_no.mysql.sql +7 -0
  29. package/templates/src/app/api/_platform/migrations/0017__users_employee_no.pg.sql +4 -0
  30. package/templates/src/app/api/_platform/migrations/0017__users_employee_no.sql +8 -0
  31. package/templates/src/{_platform/api → app/api/_platform}/schema.yaml +5 -0
  32. package/templates/src/{auth/api → app/api/auth}/_shared/wecom/replay.ts +9 -3
  33. package/templates/src/{auth/api → app/api/auth}/_shared/wecom/tenant-admin.ts +18 -27
  34. package/templates/src/{system/api → app/api/system}/oplog/api.ts +5 -3
  35. package/templates/src/{_platform/web/__client/api.ts → app/web/_platform/__client/index.ts} +5 -2
  36. package/templates/src/{auth/web/__client/api.ts → app/web/auth/__client/index.ts} +5 -2
  37. package/templates/src/app/web/notification/pages/center/index.tsx +1 -1
  38. package/templates/src/app/web/notification/routes.ts +1 -1
  39. package/templates/src/app/web/personal-center/pages/my-profile/index.tsx +1 -1
  40. package/templates/src/app/web/personal-center/routes.ts +1 -1
  41. package/templates/src/app/web/system/__client/api.schemas.ts +1 -0
  42. package/templates/src/app/web/system/locales/en-US.json +2 -3
  43. package/templates/src/app/web/system/locales/zh-CN.json +2 -3
  44. package/templates/src/app/web/system/pages/departments/index.tsx +2 -2
  45. package/templates/src/app/web/system/pages/login-methods/index.tsx +1 -1
  46. package/templates/src/app/web/system/pages/oplog/index.tsx +44 -19
  47. package/templates/src/app/web/system/pages/roles/index.tsx +5 -3
  48. package/templates/src/app/web/system/pages/roles/visible-roles.ts +14 -0
  49. package/templates/src/app/web/system/pages/settings/index.tsx +2 -2
  50. package/templates/src/app/web/system/pages/users/can-manage.ts +21 -0
  51. package/templates/src/app/web/system/pages/users/index.tsx +25 -17
  52. package/templates/src/app/web/system/pages/users/roles.tsx +1 -1
  53. package/templates/src/app/web/system/routes.ts +1 -1
  54. package/templates/src/{web/web/__client/api.ts → app/web/web/__client/index.ts} +5 -2
  55. package/templates/src/oj-market/web/api/defaultClient.ts +1 -1
  56. package/templates/tests/auth-ldap.spec.ts +2 -2
  57. package/templates/tests/auth-session.spec.ts +3 -3
  58. package/templates/tests/auth-throttle.spec.ts +1 -1
  59. package/templates/tests/fixture.ts +6 -4
  60. package/templates/tests/guard.spec.ts +1 -1
  61. package/templates/tests/lifecycle/atomic-state.spec.ts +3 -3
  62. package/templates/tests/lifecycle/bootstrap.spec.ts +3 -3
  63. package/templates/tests/lifecycle/deploy-smoke.spec.ts +8 -8
  64. package/templates/tests/lifecycle/installer.spec.ts +10 -10
  65. package/templates/tests/lifecycle/market-api.spec.ts +14 -14
  66. package/templates/tests/lifecycle/migrate.spec.ts +6 -6
  67. package/templates/tests/lifecycle/preflight.spec.ts +3 -3
  68. package/templates/tests/lifecycle/register.spec.ts +1 -1
  69. package/templates/tests/lifecycle/semver.spec.ts +1 -1
  70. package/templates/tests/lifecycle/sha384.spec.ts +1 -1
  71. package/templates/tests/lifecycle/solutions-api.spec.ts +1 -1
  72. package/templates/tests/lifecycle/source-seq.spec.ts +1 -1
  73. package/templates/tests/lifecycle/steps-fs.spec.ts +9 -9
  74. package/templates/tests/lifecycle/text-edit.spec.ts +1 -1
  75. package/templates/tests/lifecycle/tgz-guard.spec.ts +2 -2
  76. package/templates/tests/lifecycle/trust.spec.ts +5 -5
  77. package/templates/tests/lifecycle/uninstall.spec.ts +7 -7
  78. package/templates/tests/lifecycle/verify-checks.spec.ts +5 -5
  79. package/templates/tests/lifecycle/verify-report.spec.ts +4 -4
  80. package/templates/tests/org-departments.spec.ts +10 -6
  81. package/templates/tests/org-read.spec.ts +7 -7
  82. package/templates/tests/query-utils.spec.ts +1 -1
  83. package/templates/tests/rbac-audit.spec.ts +1 -1
  84. package/templates/tests/rbac-contacts.spec.ts +2 -2
  85. package/templates/tests/rbac-guard.spec.ts +1 -1
  86. package/templates/tests/rbac-roles.spec.ts +10 -2
  87. package/templates/tests/rbac-seed.spec.ts +1 -1
  88. package/templates/tests/rbac-settings.spec.ts +77 -7
  89. package/templates/tests/rbac-solution-perms.spec.ts +1 -1
  90. package/templates/tests/rbac-tables.spec.ts +29 -0
  91. package/templates/tests/rbac-users.spec.ts +55 -3
  92. package/templates/tests/roles-page.spec.ts +40 -0
  93. package/templates/tests/seed-role-accounts.spec.ts +1 -1
  94. package/templates/tests/tenant-access-cache.spec.ts +1 -1
  95. package/templates/tests/tenant-forgery.spec.ts +5 -5
  96. package/templates/tests/tenant-isolation.spec.ts +5 -4
  97. package/templates/tests/username-namespace.spec.ts +3 -3
  98. package/templates/tests/users-page.spec.ts +39 -0
  99. package/templates/tests/wecom-admin.spec.ts +6 -6
  100. package/templates/tests/wecom-client-timeout.spec.ts +1 -1
  101. package/templates/tests/wecom-connector.spec.ts +9 -9
  102. package/templates/tests/wecom-corp.spec.ts +9 -9
  103. package/templates/tests/wecom-crypt.spec.ts +1 -1
  104. package/templates/tests/wecom-endpoints.spec.ts +2 -2
  105. package/templates/tests/wecom-landing.spec.ts +1 -1
  106. package/templates/tests/wecom-org-sync.spec.ts +7 -7
  107. package/templates/tests/wecom-sync.spec.ts +3 -3
  108. package/templates/tsconfig.paths.json +11 -11
  109. package/templates/vitest.config.ts +2 -2
  110. package/templates/web.config.ts +5 -2
  111. package/vendor/host-versions.json +3 -3
  112. package/templates/src/{_platform/api → app/api/_platform}/README.md +0 -0
  113. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/atomic.ts +0 -0
  114. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/history.ts +0 -0
  115. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/installer.ts +0 -0
  116. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/limits.ts +0 -0
  117. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/lock.ts +0 -0
  118. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/semver.ts +0 -0
  119. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/sha384.ts +0 -0
  120. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/source-seq.ts +0 -0
  121. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/state.ts +0 -0
  122. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/steps/deploy-web.ts +0 -0
  123. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/steps/download.ts +0 -0
  124. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/steps/extract.ts +0 -0
  125. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/steps/migrate.ts +0 -0
  126. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/steps/preflight.ts +0 -0
  127. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/steps/register.ts +0 -0
  128. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/steps/reload.ts +0 -0
  129. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/steps/smoke.ts +0 -0
  130. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/steps/verify.ts +0 -0
  131. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/tasks.ts +0 -0
  132. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/text-edit.ts +0 -0
  133. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/tgz-guard.ts +0 -0
  134. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/trust.ts +0 -0
  135. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/types.ts +0 -0
  136. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/uninstall.ts +0 -0
  137. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/verify-checks.ts +0 -0
  138. package/templates/src/{_platform/api → app/api/_platform}/_lifecycle/verify-report.ts +0 -0
  139. package/templates/src/{_platform/api → app/api/_platform}/_shared/respond.ts +0 -0
  140. package/templates/src/{_platform/api → app/api/_platform}/_shared/service/domain/contacts.ts +0 -0
  141. package/templates/src/{_platform/api → app/api/_platform}/_shared/service/domain/org-read.ts +0 -0
  142. package/templates/src/{_platform/api → app/api/_platform}/_shared/service/domain/org.ts +0 -0
  143. package/templates/src/{_platform/api → app/api/_platform}/_shared/service/domain/roles.ts +0 -0
  144. package/templates/src/{_platform/api → app/api/_platform}/_shared/service/domain/settings.ts +0 -0
  145. package/templates/src/{_platform/api → app/api/_platform}/_shared/service/domain/solution-perms.ts +0 -0
  146. package/templates/src/{_platform/api → app/api/_platform}/_shared/service/infra/access.ts +0 -0
  147. package/templates/src/{_platform/api → app/api/_platform}/_shared/service/infra/audit.ts +0 -0
  148. package/templates/src/{_platform/api → app/api/_platform}/_shared/service/infra/guard.ts +0 -0
  149. package/templates/src/{_platform/api → app/api/_platform}/_shared/service/infra/query.ts +0 -0
  150. package/templates/src/{_platform/api → app/api/_platform}/_shared/service/infra/rate.ts +0 -0
  151. package/templates/src/{_platform/api → app/api/_platform}/_shared/site-facade.ts +0 -0
  152. package/templates/src/{_platform/api → app/api/_platform}/contacts/api.ts +0 -0
  153. package/templates/src/{_platform/api → app/api/_platform}/contacts/detail/api.ts +0 -0
  154. package/templates/src/{_platform/api → app/api/_platform}/fixtures/l1-test-user.sql +0 -0
  155. package/templates/src/{_platform/api → app/api/_platform}/manifest.yaml +0 -0
  156. package/templates/src/{_platform/api → app/api/_platform}/market/api.ts +0 -0
  157. package/templates/src/{_platform/api → app/api/_platform}/market/bootstrap.ts +0 -0
  158. package/templates/src/{_platform/api → app/api/_platform}/market/index-source.ts +0 -0
  159. package/templates/src/{_platform/api → app/api/_platform}/migrations/0001__create_users.mysql.sql +0 -0
  160. package/templates/src/{_platform/api → app/api/_platform}/migrations/0001__create_users.pg.sql +0 -0
  161. package/templates/src/{_platform/api → app/api/_platform}/migrations/0001__create_users.sql +0 -0
  162. package/templates/src/{_platform/api → app/api/_platform}/migrations/0002__add_users_avatar_base64.mysql.sql +0 -0
  163. package/templates/src/{_platform/api → app/api/_platform}/migrations/0002__add_users_avatar_base64.sql +0 -0
  164. package/templates/src/{_platform/api → app/api/_platform}/migrations/0003__users_source_display_name.mysql.sql +0 -0
  165. package/templates/src/{_platform/api → app/api/_platform}/migrations/0003__users_source_display_name.sql +0 -0
  166. package/templates/src/{_platform/api → app/api/_platform}/migrations/0004__sys_rbac.mysql.sql +0 -0
  167. package/templates/src/{_platform/api → app/api/_platform}/migrations/0004__sys_rbac.pg.sql +0 -0
  168. package/templates/src/{_platform/api → app/api/_platform}/migrations/0004__sys_rbac.sql +0 -0
  169. package/templates/src/{_platform/api → app/api/_platform}/migrations/0005__users_must_change.mysql.sql +0 -0
  170. package/templates/src/{_platform/api → app/api/_platform}/migrations/0005__users_must_change.sql +0 -0
  171. package/templates/src/{_platform/api → app/api/_platform}/migrations/0006__users_is_forbidden.mysql.sql +0 -0
  172. package/templates/src/{_platform/api → app/api/_platform}/migrations/0006__users_is_forbidden.sql +0 -0
  173. package/templates/src/{_platform/api → app/api/_platform}/migrations/0007__users_email.sql +0 -0
  174. package/templates/src/{_platform/api → app/api/_platform}/migrations/0008__sys_refresh_token.mysql.sql +0 -0
  175. package/templates/src/{_platform/api → app/api/_platform}/migrations/0008__sys_refresh_token.pg.sql +0 -0
  176. package/templates/src/{_platform/api → app/api/_platform}/migrations/0008__sys_refresh_token.sql +0 -0
  177. package/templates/src/{_platform/api → app/api/_platform}/migrations/0009__sys_throttle.mysql.sql +0 -0
  178. package/templates/src/{_platform/api → app/api/_platform}/migrations/0009__sys_throttle.pg.sql +0 -0
  179. package/templates/src/{_platform/api → app/api/_platform}/migrations/0009__sys_throttle.sql +0 -0
  180. package/templates/src/{_platform/api → app/api/_platform}/migrations/0010__sys_solution_route.mysql.sql +0 -0
  181. package/templates/src/{_platform/api → app/api/_platform}/migrations/0010__sys_solution_route.pg.sql +0 -0
  182. package/templates/src/{_platform/api → app/api/_platform}/migrations/0010__sys_solution_route.sql +0 -0
  183. package/templates/src/{_platform/api → app/api/_platform}/migrations/0011__sys_setting_group_label.mysql.sql +0 -0
  184. package/templates/src/{_platform/api → app/api/_platform}/migrations/0011__sys_setting_group_label.sql +0 -0
  185. package/templates/src/{_platform/api → app/api/_platform}/migrations/0012__market_history.mysql.sql +0 -0
  186. package/templates/src/{_platform/api → app/api/_platform}/migrations/0012__market_history.pg.sql +0 -0
  187. package/templates/src/{_platform/api → app/api/_platform}/migrations/0012__market_history.sql +0 -0
  188. package/templates/src/{_platform/api → app/api/_platform}/migrations/0013__users_profile.sql +0 -0
  189. package/templates/src/{_platform/api → app/api/_platform}/migrations/0014__reg_source_seq.mysql.sql +0 -0
  190. package/templates/src/{_platform/api → app/api/_platform}/migrations/0014__reg_source_seq.pg.sql +0 -0
  191. package/templates/src/{_platform/api → app/api/_platform}/migrations/0014__reg_source_seq.sql +0 -0
  192. package/templates/src/{_platform/api → app/api/_platform}/migrations/0015__tenant.mysql.sql +0 -0
  193. package/templates/src/{_platform/api → app/api/_platform}/migrations/0015__tenant.pg.sql +0 -0
  194. package/templates/src/{_platform/api → app/api/_platform}/migrations/0015__tenant.sql +0 -0
  195. package/templates/src/{_platform/api → app/api/_platform}/migrations/0016__org.mysql.sql +0 -0
  196. package/templates/src/{_platform/api → app/api/_platform}/migrations/0016__org.pg.sql +0 -0
  197. package/templates/src/{_platform/api → app/api/_platform}/migrations/0016__org.sql +0 -0
  198. package/templates/src/{_platform/api → app/api/_platform}/org/departments/api.ts +0 -0
  199. package/templates/src/{_platform/api → app/api/_platform}/org/is-member/api.ts +0 -0
  200. package/templates/src/{_platform/api → app/api/_platform}/org/members/api.ts +0 -0
  201. package/templates/src/{_platform/api → app/api/_platform}/org/picker/api.ts +0 -0
  202. package/templates/src/{_platform/api → app/api/_platform}/org/resolve/api.ts +0 -0
  203. package/templates/src/{_platform/api → app/api/_platform}/org/tree/api.ts +0 -0
  204. package/templates/src/{_platform/api → app/api/_platform}/org/user/api.ts +0 -0
  205. package/templates/src/{_platform/api → app/api/_platform}/seed.mysql.sql +0 -0
  206. package/templates/src/{_platform/api → app/api/_platform}/seed.pg.sql +0 -0
  207. package/templates/src/{_platform/api → app/api/_platform}/seed.sql +0 -0
  208. package/templates/src/{_platform/api → app/api/_platform}/solutions/api.ts +0 -0
  209. package/templates/src/{auth/api → app/api/auth}/_shared/ldap-login.ts +0 -0
  210. package/templates/src/{auth/api → app/api/auth}/_shared/ldap.ts +0 -0
  211. package/templates/src/{auth/api → app/api/auth}/_shared/login-throttle.ts +0 -0
  212. package/templates/src/{auth/api → app/api/auth}/_shared/session.ts +0 -0
  213. package/templates/src/{auth/api → app/api/auth}/_shared/wecom/admin.ts +1 -1
  214. package/templates/src/{auth/api → app/api/auth}/_shared/wecom/client.ts +0 -0
  215. package/templates/src/{auth/api → app/api/auth}/_shared/wecom/config.ts +0 -0
  216. package/templates/src/{auth/api → app/api/auth}/_shared/wecom/contacts.ts +0 -0
  217. package/templates/src/{auth/api → app/api/auth}/_shared/wecom/crypt.ts +0 -0
  218. package/templates/src/{auth/api → app/api/auth}/_shared/wecom/events.ts +1 -1
  219. package/templates/src/{auth/api → app/api/auth}/_shared/wecom/login.ts +0 -0
  220. package/templates/src/{auth/api → app/api/auth}/_shared/wecom/payload.ts +0 -0
  221. package/templates/src/{auth/api → app/api/auth}/_shared/wecom/store.ts +0 -0
  222. package/templates/src/{auth/api → app/api/auth}/_shared/wecom/sync.ts +0 -0
  223. package/templates/src/{auth/api → app/api/auth}/api.ts +0 -0
  224. package/templates/src/{auth/api → app/api/auth}/ldap-login/api.ts +0 -0
  225. package/templates/src/{auth/api → app/api/auth}/manifest.yaml +0 -0
  226. package/templates/src/{auth/api → app/api/auth}/migrations/0001__wecom.mysql.sql +0 -0
  227. package/templates/src/{auth/api → app/api/auth}/migrations/0001__wecom.pg.sql +0 -0
  228. package/templates/src/{auth/api → app/api/auth}/migrations/0001__wecom.sql +0 -0
  229. package/templates/src/{auth/api → app/api/auth}/migrations/0002__org_sync.mysql.sql +0 -0
  230. package/templates/src/{auth/api → app/api/auth}/migrations/0002__org_sync.pg.sql +0 -0
  231. package/templates/src/{auth/api → app/api/auth}/migrations/0002__org_sync.sql +0 -0
  232. package/templates/src/{auth/api → app/api/auth}/migrations/0003__credential_kind.mysql.sql +0 -0
  233. package/templates/src/{auth/api → app/api/auth}/migrations/0003__credential_kind.pg.sql +0 -0
  234. package/templates/src/{auth/api → app/api/auth}/migrations/0003__credential_kind.sql +0 -0
  235. package/templates/src/{auth/api → app/api/auth}/schema.yaml +0 -0
  236. package/templates/src/{auth/api → app/api/auth}/wecom/admin/api.ts +0 -0
  237. package/templates/src/{auth/api → app/api/auth}/wecom/admin/tenant-admin/api.ts +1 -1
  238. package/templates/src/{auth/api → app/api/auth}/wecom/admin/tenant-admin/password/api.ts +1 -1
  239. /package/templates/src/{auth/api → app/api/auth}/wecom/api.ts +0 -0
  240. /package/templates/src/{auth/api → app/api/auth}/wecom/sync/api.ts +0 -0
  241. /package/templates/src/{home/api → app/api/home}/line/api.ts +0 -0
  242. /package/templates/src/{home/api → app/api/home}/manifest.yaml +0 -0
  243. /package/templates/src/{home/api → app/api/home}/migrations/0001__create_home_tables.sql +0 -0
  244. /package/templates/src/{home/api → app/api/home}/migrations/0002__tenant.mysql.sql +0 -0
  245. /package/templates/src/{home/api → app/api/home}/migrations/0002__tenant.sql +0 -0
  246. /package/templates/src/{home/api → app/api/home}/pie/api.ts +0 -0
  247. /package/templates/src/{home/api → app/api/home}/schema.yaml +0 -0
  248. /package/templates/src/{home/api → app/api/home}/seed.sql +0 -0
  249. /package/templates/src/{notification/api → app/api/notification}/_shared/notify.ts +0 -0
  250. /package/templates/src/{notification/api → app/api/notification}/api.ts +0 -0
  251. /package/templates/src/{notification/api → app/api/notification}/del/api.ts +0 -0
  252. /package/templates/src/{notification/api → app/api/notification}/manifest.yaml +0 -0
  253. /package/templates/src/{notification/api → app/api/notification}/migrations/0001__create_notifications.sql +0 -0
  254. /package/templates/src/{notification/api → app/api/notification}/migrations/0002__notifications_user.sql +0 -0
  255. /package/templates/src/{notification/api → app/api/notification}/migrations/0003__notifications_broadcast.sql +0 -0
  256. /package/templates/src/{notification/api → app/api/notification}/migrations/0004__notifications_broadcast_hidden.sql +0 -0
  257. /package/templates/src/{notification/api → app/api/notification}/migrations/0005__tenant.mysql.sql +0 -0
  258. /package/templates/src/{notification/api → app/api/notification}/migrations/0005__tenant.sql +0 -0
  259. /package/templates/src/{notification/api → app/api/notification}/schema.yaml +0 -0
  260. /package/templates/src/{notification/api → app/api/notification}/seed.sql +0 -0
  261. /package/templates/src/{personal-center/api → app/api/personal-center}/manifest.yaml +0 -0
  262. /package/templates/src/{personal-center/api → app/api/personal-center}/profile/api.ts +0 -0
  263. /package/templates/src/{personal-center/api → app/api/personal-center}/upload/api.ts +0 -0
  264. /package/templates/src/{system/api → app/api/system}/departments/api.ts +0 -0
  265. /package/templates/src/{system/api → app/api/system}/departments/detach/api.ts +0 -0
  266. /package/templates/src/{system/api → app/api/system}/departments/members/api.ts +0 -0
  267. /package/templates/src/{system/api → app/api/system}/departments/move/api.ts +0 -0
  268. /package/templates/src/{system/api → app/api/system}/login-methods/api.ts +0 -0
  269. /package/templates/src/{system/api → app/api/system}/manifest.yaml +0 -0
  270. /package/templates/src/{system/api → app/api/system}/permissions/api.ts +0 -0
  271. /package/templates/src/{system/api → app/api/system}/roles/api.ts +0 -0
  272. /package/templates/src/{system/api → app/api/system}/roles/bindings/api.ts +0 -0
  273. /package/templates/src/{system/api → app/api/system}/settings/api.ts +0 -0
  274. /package/templates/src/{system/api → app/api/system}/users/api.ts +0 -0
  275. /package/templates/src/{system/api → app/api/system}/users/forbidden/api.ts +0 -0
  276. /package/templates/src/{system/api → app/api/system}/users/password/api.ts +0 -0
  277. /package/templates/src/{system/api → app/api/system}/users/profile/api.ts +0 -0
  278. /package/templates/src/{system/api → app/api/system}/users/roles/api.ts +0 -0
  279. /package/templates/src/{web/api → app/api/web}/get-async-routes/api.ts +0 -0
  280. /package/templates/src/{web/api → app/api/web}/hello/api.ts +0 -0
  281. /package/templates/src/{web/api → app/api/web}/manifest.yaml +0 -0
  282. /package/templates/src/{web/api → app/api/web}/user-info/api.ts +0 -0
  283. /package/templates/src/{_platform/web → app/web/_platform}/__client/api.schemas.ts +0 -0
  284. /package/templates/src/{auth/web → app/web/auth}/__client/api.schemas.ts +0 -0
  285. /package/templates/src/app/web/home/__client/{api.ts → index.ts} +0 -0
  286. /package/templates/src/app/web/notification/__client/{api.ts → index.ts} +0 -0
  287. /package/templates/src/app/web/personal-center/__client/{api.ts → index.ts} +0 -0
  288. /package/templates/src/app/web/system/__client/{api.ts → index.ts} +0 -0
  289. /package/templates/src/{web → app/web}/web/__client/api.schemas.ts +0 -0
@@ -10,12 +10,12 @@
10
10
  // deps 全注入:store 用 `enc:` 前后缀假加密(Node 侧 crypto 只读,设计 §9.1),
11
11
  // client 的 http/kv 用内存桩——真实网络与 AES 已由 wecom-crypt.spec / 运行时保证。
12
12
  /* eslint-disable test/prefer-lowercase-title -- D/AC 编号是验收锚点,保留大写 */
13
- import type { WecomCache, WecomHttp } from "../src/auth/api/_shared/wecom/client";
14
- import type { WecomConfig } from "../src/auth/api/_shared/wecom/config";
15
- import type { WecomStoreDeps } from "../src/auth/api/_shared/wecom/store";
13
+ import type { WecomCache, WecomHttp } from "../src/app/api/auth/_shared/wecom/client";
14
+ import type { WecomConfig } from "../src/app/api/auth/_shared/wecom/config";
15
+ import type { WecomStoreDeps } from "../src/app/api/auth/_shared/wecom/store";
16
16
 
17
17
  import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
18
- import { createWecomClient, runtimeCache } from "../src/auth/api/_shared/wecom/client";
18
+ import { createWecomClient, runtimeCache } from "../src/app/api/auth/_shared/wecom/client";
19
19
  import {
20
20
  assertEncKey,
21
21
  eventUrlOf,
@@ -23,8 +23,8 @@ import {
23
23
  readCallbackConfig,
24
24
  readSuiteConfig,
25
25
  siteRootOf,
26
- } from "../src/auth/api/_shared/wecom/config";
27
- import { envOfState, handleSuiteEvent } from "../src/auth/api/_shared/wecom/events";
26
+ } from "../src/app/api/auth/_shared/wecom/config";
27
+ import { envOfState, handleSuiteEvent } from "../src/app/api/auth/_shared/wecom/events";
28
28
  import {
29
29
  assertUserActive,
30
30
  buildAuthorizeUrl,
@@ -36,8 +36,8 @@ import {
36
36
  loginLandingUrl,
37
37
  putLoginState,
38
38
  takeLoginState,
39
- } from "../src/auth/api/_shared/wecom/login";
40
- import { callbackFields, field } from "../src/auth/api/_shared/wecom/payload";
39
+ } from "../src/app/api/auth/_shared/wecom/login";
40
+ import { callbackFields, field } from "../src/app/api/auth/_shared/wecom/payload";
41
41
  import {
42
42
  claimLoginTicket,
43
43
  ensureTenant,
@@ -48,7 +48,7 @@ import {
48
48
  saveProfile,
49
49
  setProfileStatus,
50
50
  tenantOfCorp,
51
- } from "../src/auth/api/_shared/wecom/store";
51
+ } from "../src/app/api/auth/_shared/wecom/store";
52
52
  import { installDb } from "./fixture";
53
53
 
54
54
  let dbo: ReturnType<typeof installDb>;
@@ -15,16 +15,16 @@
15
15
  //
16
16
  // 夹具即真实库(真迁移 + 真 sqlite):0003__credential_kind 的默认值也一起被这层覆盖到。
17
17
  /* eslint-disable test/prefer-lowercase-title -- AC 编号是验收锚点,保留大写 */
18
- import type { WecomStoreDeps } from "../src/auth/api/_shared/wecom/store";
18
+ import type { WecomStoreDeps } from "../src/app/api/auth/_shared/wecom/store";
19
19
  import { Buffer } from "node:buffer";
20
20
  import { createCipheriv, webcrypto } from "node:crypto";
21
21
  import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
22
- import { connectCorp } from "../src/auth/api/_shared/wecom/admin";
23
- import { createWecomClient, runtimeCache, runtimeHttp } from "../src/auth/api/_shared/wecom/client";
24
- import { callbackCreds, configuredKinds, corpIdentity, readBase, readCorpConfig, readSuiteConfig, wecomKinds } from "../src/auth/api/_shared/wecom/config";
25
- import { bytesToB64, utf8Bytes, wecomSignature } from "../src/auth/api/_shared/wecom/crypt";
26
- import { handleSuiteEvent } from "../src/auth/api/_shared/wecom/events";
27
- import { findCorpAuth, findProfile, probeProfile, saveProfile } from "../src/auth/api/_shared/wecom/store";
22
+ import { connectCorp } from "../src/app/api/auth/_shared/wecom/admin";
23
+ import { createWecomClient, runtimeCache, runtimeHttp } from "../src/app/api/auth/_shared/wecom/client";
24
+ import { callbackCreds, configuredKinds, corpIdentity, readBase, readCorpConfig, readSuiteConfig, wecomKinds } from "../src/app/api/auth/_shared/wecom/config";
25
+ import { bytesToB64, utf8Bytes, wecomSignature } from "../src/app/api/auth/_shared/wecom/crypt";
26
+ import { handleSuiteEvent } from "../src/app/api/auth/_shared/wecom/events";
27
+ import { findCorpAuth, findProfile, probeProfile, saveProfile } from "../src/app/api/auth/_shared/wecom/store";
28
28
  import { installDb } from "./fixture";
29
29
 
30
30
  const g = globalThis as any;
@@ -209,8 +209,8 @@ function stubUpstream(opts: { depts?: Array<{ id: string, name?: string }>, memb
209
209
  return { calls };
210
210
  }
211
211
 
212
- const wecomApi = async () => (await import("../src/auth/api/wecom/api")).default;
213
- const adminApi = async () => (await import("../src/auth/api/wecom/admin/api")).default;
212
+ const wecomApi = async () => (await import("../src/app/api/auth/wecom/api")).default;
213
+ const adminApi = async () => (await import("../src/app/api/auth/wecom/admin/api")).default;
214
214
 
215
215
  /** 回调 timestamp 必须新鲜:重放守卫拒 ±5 分钟以外的报文,用固定值会让整段用例假红 */
216
216
  const nowSecs = () => String(Math.floor(Date.now() / 1000));
@@ -17,7 +17,7 @@ import {
17
17
  unwrapWecomMessage,
18
18
  utf8Bytes,
19
19
  wecomSignature,
20
- } from "../src/auth/api/_shared/wecom/crypt";
20
+ } from "../src/app/api/auth/_shared/wecom/crypt";
21
21
 
22
22
  const req = createRequire(import.meta.url);
23
23
  const nodeCrypto = req("node:crypto") as typeof import("node:crypto");
@@ -11,7 +11,7 @@
11
11
  import { Buffer } from "node:buffer";
12
12
  import { createCipheriv, webcrypto } from "node:crypto";
13
13
  import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
14
- import { bytesToB64, sha1Hex, utf8Bytes, wecomSignature } from "../src/auth/api/_shared/wecom/crypt";
14
+ import { bytesToB64, sha1Hex, utf8Bytes, wecomSignature } from "../src/app/api/auth/_shared/wecom/crypt";
15
15
  import { installDb } from "./fixture";
16
16
 
17
17
  const g = globalThis as any;
@@ -147,7 +147,7 @@ function seedCorp(corpId = "ww_corp_a", agentId = "100001"): void {
147
147
  .run(SUITE, corpId, agentId, corpId, `gcm(perm_${corpId})`);
148
148
  }
149
149
 
150
- const api = async () => (await import("../src/auth/api/wecom/api")).default;
150
+ const api = async () => (await import("../src/app/api/auth/wecom/api")).default;
151
151
 
152
152
  beforeAll(() => {
153
153
  dbo = installDb();
@@ -5,7 +5,7 @@
5
5
  // · 参数要裁剪、要能容忍少了 tenant(此时沿用本地租户,不是登录失败);
6
6
  // · 授权入口即使没填企业代码也要跳(后端会回 400 说明缺什么,比前端静默不动好排查)。
7
7
  import { describe, expect, it } from "vitest";
8
- import { parseWecomLanding, wecomAuthorizePath } from "../src/login/web/wecom";
8
+ import { parseWecomLanding, wecomAuthorizePath } from "../src/app/web/login/wecom";
9
9
 
10
10
  describe("p2-A:回跳落地参数解析", () => {
11
11
  it("带齐 ticket 与 tenant → 解析出两者", () => {
@@ -9,15 +9,15 @@
9
9
  // · **登录自更新节流**:上万员工每天登录,不节流就是把 user/get 打成常驻流量;
10
10
  // 但 `user/get` 拿不到(无权限/不在可见范围)时**不能**写节流键,否则这一整天都补不上资料。
11
11
  // · **D10 不建占位部门**:登录路径若能顺手建部门,任何成员都能凭空造出组织节点。
12
- import type { WecomCache, WecomHttp } from "../src/auth/api/_shared/wecom/client";
13
- import type { WecomStoreDeps } from "../src/auth/api/_shared/wecom/store";
12
+ import type { WecomCache, WecomHttp } from "../src/app/api/auth/_shared/wecom/client";
13
+ import type { WecomStoreDeps } from "../src/app/api/auth/_shared/wecom/store";
14
14
 
15
15
  import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
16
- import { upsertDepartment } from "../src/_platform/api/_shared/service/domain/org";
17
- import { createWecomClient, WecomApiError } from "../src/auth/api/_shared/wecom/client";
18
- import { handleSuiteEvent } from "../src/auth/api/_shared/wecom/events";
19
- import { SELF_UPDATE_TTL_SECS, selfUpdate } from "../src/auth/api/_shared/wecom/login";
20
- import { findProfile, probeProfile, putSuiteTicket, saveProfile, setProfileStatus } from "../src/auth/api/_shared/wecom/store";
16
+ import { upsertDepartment } from "../src/app/api/_platform/_shared/service/domain/org";
17
+ import { createWecomClient, WecomApiError } from "../src/app/api/auth/_shared/wecom/client";
18
+ import { handleSuiteEvent } from "../src/app/api/auth/_shared/wecom/events";
19
+ import { SELF_UPDATE_TTL_SECS, selfUpdate } from "../src/app/api/auth/_shared/wecom/login";
20
+ import { findProfile, probeProfile, putSuiteTicket, saveProfile, setProfileStatus } from "../src/app/api/auth/_shared/wecom/store";
21
21
  import { installDb } from "./fixture";
22
22
 
23
23
  /* eslint-disable test/prefer-lowercase-title -- D/AC 编号是验收锚点,保留大写 */
@@ -5,11 +5,11 @@
5
5
  // · 权限类错码是「跳过并计数」——一旦有跳过就**不许回收**(否则一次上游抖会被读成「部门被删」);
6
6
  // · 限流/可恢复致命错要停在原部门(游标不前进),下一次重试同一部门;
7
7
  // · 本地建的部门/成员一根毛都不碰(D13 归属权)。
8
- import type { WecomClient, WecomMember } from "../src/auth/api/_shared/wecom/client";
8
+ import type { WecomClient, WecomMember } from "../src/app/api/auth/_shared/wecom/client";
9
9
 
10
10
  import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
11
- import { WecomApiError } from "../src/auth/api/_shared/wecom/client";
12
- import { attachProfile, cancelSync, emptyView, startSync, syncStatus } from "../src/auth/api/_shared/wecom/sync";
11
+ import { WecomApiError } from "../src/app/api/auth/_shared/wecom/client";
12
+ import { attachProfile, cancelSync, emptyView, startSync, syncStatus } from "../src/app/api/auth/_shared/wecom/sync";
13
13
  import { installDb } from "./fixture";
14
14
 
15
15
  /* eslint-disable test/prefer-lowercase-title -- D/AC 编号是验收锚点,保留大写 */
@@ -1,18 +1,18 @@
1
- // 由 ojm 生成:ojm init / ojm build / ojm dev 会按 src/*/api/manifest.yaml 重写本文件,请勿手改。
1
+ // 由 ojm 生成:ojm init / ojm build / ojm dev 会按模块清单重写本文件,请勿手改。
2
2
  //
3
- // oj 别名 `#/<模块名>/…` 锚在目标模块根(本布局下即 src/<模块名>/api)。tsconfig 的
4
- // paths 只能静态全局映射,且每条规则的替换值只允许一个 `*`(`./src/*/api/*` 会被 TS
5
- // 以 TS5062 拒掉),故按模块逐条枚举。
3
+ // oj 别名 `#/<模块名>/…` 锚在目标模块根(src/<模块名>/api 或 src/app/api/<模块名>)。
4
+ // tsconfig 的 paths 只能静态全局映射,且每条规则的替换值只允许一个 `*`(`./src/*/api/*`
5
+ // 会被 TS 以 TS5062 拒掉),故按模块逐条枚举。
6
6
  {
7
7
  "compilerOptions": {
8
8
  "paths": {
9
- "#/_platform/*": ["./src/_platform/api/*"],
10
- "#/auth/*": ["./src/auth/api/*"],
11
- "#/home/*": ["./src/home/api/*"],
12
- "#/notification/*": ["./src/notification/api/*"],
13
- "#/personal-center/*": ["./src/personal-center/api/*"],
14
- "#/system/*": ["./src/system/api/*"],
15
- "#/web/*": ["./src/web/api/*"]
9
+ "#/_platform/*": ["./src/app/api/_platform/*"],
10
+ "#/auth/*": ["./src/app/api/auth/*"],
11
+ "#/home/*": ["./src/app/api/home/*"],
12
+ "#/notification/*": ["./src/app/api/notification/*"],
13
+ "#/personal-center/*": ["./src/app/api/personal-center/*"],
14
+ "#/system/*": ["./src/app/api/system/*"],
15
+ "#/web/*": ["./src/app/api/web/*"]
16
16
  }
17
17
  }
18
18
  }
@@ -7,13 +7,13 @@ const srcDir = fileURLToPath(new URL("./src", import.meta.url));
7
7
 
8
8
  export default defineConfig({
9
9
  root: fileURLToPath(new URL(".", import.meta.url)),
10
- // `#/<模块名>/…` 是 oj 的模块别名(锚在目标模块根,本布局下即 `src/<模块名>/api`)。
10
+ // `#/<模块名>/…` 是 oj 的模块别名(锚在目标模块根,0.2.55 布局下即 `src/app/api/<模块名>`)。
11
11
  // oj build / ojm dev 在打包器里解析它,vitest 走 vite 的 resolve,必须在此显式映射,
12
12
  // 否则跨模块 import 的后端 spec 会以「Cannot find module」整文件跳过。
13
13
  // 形如 `#x`(锚本模块根)与导入方相对,静态 alias 表达不了——模板后端不用这种形态,
14
14
  // 一旦引入需先补 vitest 侧解析(或改写成 `#/<模块名>/…`)。
15
15
  resolve: {
16
- alias: [{ find: /^#\/([^/]+)\/(.*)$/, replacement: `${srcDir}/$1/api/$2` }],
16
+ alias: [{ find: /^#\/([^/]+)\/(.*)$/, replacement: `${srcDir}/app/api/$1/$2` }],
17
17
  },
18
18
  test: {
19
19
  include: ["tests/**/*.spec.ts"],
@@ -45,14 +45,17 @@ export default {
45
45
  /**
46
46
  * 生成 client 的归属模块:`api 前缀 → 承载其 __client 的 web 模块`。
47
47
  *
48
- * 多根聚合模块把多个业务域的页面/client 收进 `src/app/web`,故五个 api 前缀的
49
- * 生成物都落在 `src/app/web/<api 前缀>/__client`(与页面同级,页面相对导入不变)。
48
+ * 框架内置后端全部收在 `src/app/api/<前缀>`(模块名即 URL 前缀),前端页面收在
49
+ * `src/app/web`;生成物统一落 `src/app/web/<api 前缀>/__client`,页面相对导入不变。
50
50
  * 不配则回落同名模块(`src/<api 前缀>/web/__client`,历史行为)。
51
51
  */
52
52
  clientOwners: {
53
+ "_platform": "app",
54
+ "auth": "app",
53
55
  "home": "app",
54
56
  "personal-center": "app",
55
57
  "notification": "app",
56
58
  "system": "app",
59
+ "web": "app",
57
60
  },
58
61
  };
@@ -8,9 +8,9 @@
8
8
  "react-router": "7.18.2",
9
9
  "react-router/dom": "7.18.2",
10
10
  "@tanstack/react-query": "5.102.8",
11
- "@oj-module/runtime": "0.2.54",
12
- "@oj-module/runtime/contract": "0.2.54",
13
- "@oj-module/runtime/contract/errors": "0.2.54",
11
+ "@oj-module/runtime": "0.2.56",
12
+ "@oj-module/runtime/contract": "0.2.56",
13
+ "@oj-module/runtime/contract/errors": "0.2.56",
14
14
  "@plane/kit": "0.1.20",
15
15
  "@plane/editor": "0.1.20",
16
16
  "antd": "6.6.1",
@@ -13,8 +13,8 @@ import type { WecomConfig, WecomCorpConfig, WecomKind } from "./config";
13
13
  import type { WecomStoreDeps } from "./store";
14
14
  import { invalidateAllUsers } from "#/_platform/_shared/service/infra/access";
15
15
  import { assertProviderConfig, eventUrlOf } from "./config";
16
- import { provisionTenantAdmin } from "./tenant-admin";
17
16
  import { corpScope, revokeTenantSessions, saveProfile, tenantOfCorp } from "./store";
17
+ import { provisionTenantAdmin } from "./tenant-admin";
18
18
 
19
19
  export interface WecomAdminDeps {
20
20
  client: WecomClient
@@ -21,8 +21,8 @@ import { invalidateAllUsers } from "#/_platform/_shared/service/infra/access";
21
21
  import { recordOp } from "#/_platform/_shared/service/infra/audit";
22
22
  import { handleContactChange } from "./contacts";
23
23
  import { callbackFields, field, requireField } from "./payload";
24
- import { provisionTenantAdmin } from "./tenant-admin";
25
24
  import { corpScope, ensureTenant, findCorpAuth, getSuiteTicket, putSuiteTicket, revokeTenantSessions, saveProfile, setAuthMode, setProfileStatus, tenantOfCorp } from "./store";
25
+ import { provisionTenantAdmin } from "./tenant-admin";
26
26
 
27
27
  /** suite_ticket 官方有效期 30 分钟(10 分钟推一次);本地按 30 分钟作废,宁可拒一次也不拿过期票打企微 */
28
28
  const SUITE_TICKET_TTL_SECS = 30 * 60;
File without changes