@gadmin2n/schematics 0.0.69 → 0.0.70

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 (223) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/canvas.prisma +45 -0
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/example.prisma +24 -23
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +93 -90
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Audit.ts +70 -0
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +3 -3
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Page.ts +70 -0
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/PageResource.ts +70 -0
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Resource.ts +70 -0
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/RolePages.ts +70 -0
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/RoleResource.ts +70 -0
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/SavedQuery.ts +70 -0
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/User.ts +70 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/readme.md +95 -2
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.eslintrc.js +4 -2
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.prettierignore +7 -1
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/config/index.ts +1 -3
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/gadmin-cli.json +1 -1
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +6 -5
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/lib/page-helpers.ts +157 -0
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/page-manage.ts +290 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/permission-manage.ts +184 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/prismaModels.ts +143 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/sync-resources.ts +100 -0
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/syncDataMngtPages.ts +119 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +1 -3
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +109 -143
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +5 -2
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.spec.ts +20 -0
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.ts +81 -0
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.dto.ts +49 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.module.ts +11 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.service.spec.ts +334 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.service.ts +249 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +2 -1
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.ts +2 -2
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.ts +17 -4
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/yarn.lock +7737 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.env +1 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.eslintrc.json +38 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.prettierignore +2 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/web/dev-shell-entry.html +49 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +13 -2
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +137 -111
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/auditLogProvider.ts +46 -44
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/authProvider.ts +32 -12
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +74 -23
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/ListPageHeader.tsx +9 -9
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/RowActions.tsx +57 -31
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SearchBar.tsx +53 -24
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SqlModal.tsx +148 -72
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/AgentContext.tsx +190 -16
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/ElementInspector.tsx +914 -63
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/agentAttributes.ts +17 -8
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/index.ts +0 -10
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/inspectorActions.ts +969 -46
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/pagePathUtils.ts +66 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/promptGenerator.ts +85 -25
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/propPatcher.ts +84 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/eventList/index.tsx +16 -20
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/index.ts +4 -4
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logButton/index.tsx +13 -13
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logList/index.tsx +15 -16
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/modalDiffViewer/index.tsx +15 -15
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/index.tsx +2 -2
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/BarChart/index.tsx +896 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartSwitcher/index.tsx +219 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartViewer/index.tsx +159 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Filter/index.tsx +192 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/LineChart/index.tsx +1034 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/NumCard.module.css +8 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/index.tsx +509 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumLineCard/index.tsx +66 -0
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/PieChart/index.tsx +552 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/RadarChart/index.tsx +263 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Section/index.tsx +35 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Table/index.tsx +207 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/TreemapChart/index.tsx +382 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/WorldMap/index.tsx +135 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/chart-constants.ts +53 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/InfoIcon.tsx +8 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/index.ts +1 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/config.ts +31 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/nameMap.json +9 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/world.geo.json +39349 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/metric-info-tooltip/index.tsx +19 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/business/index.tsx +12 -12
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +22 -26
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/custom-avatar.tsx +13 -9
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +4 -4
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +22 -37
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/index.ts +4 -4
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +10 -10
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/logo.tsx +1 -1
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +113 -65
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +14 -14
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/offLayoutArea/index.tsx +1 -1
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/pagination-total.tsx +2 -2
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/index.ts +1 -1
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/role-tag.tsx +21 -21
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/text.tsx +17 -13
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/http.ts +26 -5
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +221 -51
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +3 -3
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +199 -0
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +335 -0
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DeleteDataConfirm.tsx +56 -0
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +401 -0
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/EditDataModal.tsx +129 -0
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/SkillMenu.tsx +202 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/UndoConfirm.tsx +36 -0
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/index.tsx +8 -0
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +835 -0
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/audit-log.enum.ts +8 -8
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/index.ts +1 -1
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +120 -70
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/get-name-initials.ts +3 -3
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/get-random-color.ts +11 -11
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/http.ts +16 -19
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/index.tsx +1 -1
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +99 -73
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +22 -27
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/page-tree.ts +74 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +95 -51
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/utils.tsx +7 -3
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/types.ts +15 -15
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchDelete.ts +10 -10
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchOperations.ts +8 -7
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchOperationsCore.ts +10 -10
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useBatchUpdate.ts +10 -10
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +36 -27
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useECharts.tsx +144 -0
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useFetchData.ts +4 -4
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useListPageState.ts +34 -34
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRoles.ts +8 -4
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRowSelection.ts +1 -1
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useUserPageAccess.ts +55 -41
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +8 -8
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/index.tsx +9 -2
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +193 -0
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +194 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +81 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.tsx +37 -37
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/create.tsx +23 -31
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +34 -35
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +1 -1
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.tsx +4 -6
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/list.tsx +41 -34
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +33 -20
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +87 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasEditPage.tsx +192 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +409 -0
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +1372 -0
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +384 -0
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +476 -0
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/ComponentThumbnail.tsx +135 -0
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/IsolatedLivePreview.tsx +101 -0
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/LivePreview.tsx +236 -0
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/PublishModal.tsx +200 -0
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasApi.ts +92 -0
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasConfigRegistry.tsx +25 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +875 -0
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +126 -0
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasI18n.ts +11 -0
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +115 -0
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ChartViewerConfigModal.tsx +217 -0
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +153 -0
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +211 -0
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +90 -0
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +87 -0
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +204 -0
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/demos.ts +1153 -0
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/index.tsx +2 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.ts +45 -0
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/types.ts +45 -0
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas-page/index.tsx +108 -0
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/create.tsx +105 -0
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/edit.tsx +121 -0
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/index.tsx +4 -0
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +237 -0
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/show.tsx +74 -0
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +29 -20
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/CreatePageModal.tsx +3 -3
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/EditPageModal.tsx +7 -3
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageDetailDrawer.tsx +58 -23
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageFormModal.tsx +206 -122
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/hooks/usePageManagement.ts +8 -4
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.ts +1 -1
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +345 -190
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/types.ts +1 -1
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +341 -340
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/CreateModal.tsx +2 -2
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/EditModal.tsx +2 -2
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/ResourceDetailDrawer.tsx +41 -24
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +64 -36
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.ts +2 -2
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +78 -40
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/CreateModal.tsx +3 -3
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/EditModal.tsx +4 -4
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/RoleDetailDrawer.tsx +19 -9
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +45 -47
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/hooks/useRolePage.ts +4 -4
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.ts +1 -1
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +121 -147
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/types.ts +1 -1
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/create-modal.tsx +2 -2
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/edit-modal.tsx +2 -2
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/form-modal.tsx +25 -19
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/index.ts +5 -5
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/role-tag.tsx +10 -10
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +31 -26
  211. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.ts +1 -1
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +76 -71
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/setupTests.ts +1 -1
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/audit-log.ts +1 -1
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/index.ts +3 -3
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/role.ts +1 -1
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/user.ts +1 -1
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +42 -25
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/yarn.lock +1193 -32
  220. package/package.json +1 -1
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/seedDataMngtPages.ts +0 -258
  222. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/AgentPanel.tsx +0 -497
  223. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/skills.ts +0 -464
@@ -0,0 +1,290 @@
1
+ /**
2
+ * page-manage.ts — 页面与资源绑定管理
3
+ *
4
+ * Usage:
5
+ *
6
+ * ── 创建页面 ──────────────────────────────────────────────────────────────────
7
+ * ts-node scripts/page-manage.ts create \
8
+ * --pageCode myModule (required)
9
+ * --pageName myModule (optional, defaults to pageCode)
10
+ * --zhName "我的模块" (optional)
11
+ * --enName "My Module" (optional)
12
+ * --parentPageCode admin (optional)
13
+ * --sortOrder 1080 (optional, defaults to 9999)
14
+ * --resources myModule,other (optional, comma-separated — binds resources)
15
+ *
16
+ * ── 更新页面 ──────────────────────────────────────────────────────────────────
17
+ * ts-node scripts/page-manage.ts update \
18
+ * --pageCode myModule (required)
19
+ * --pageName newName (optional)
20
+ * --zhName "新名称" (optional)
21
+ * --enName "New Name" (optional)
22
+ * --sortOrder 1090 (optional)
23
+ * --parentPageCode game (optional)
24
+ *
25
+ * ── 删除页面 ──────────────────────────────────────────────────────────────────
26
+ * ts-node scripts/page-manage.ts delete \
27
+ * --pageCode myModule (required)
28
+ *
29
+ * ── 绑定资源 ──────────────────────────────────────────────────────────────────
30
+ * ts-node scripts/page-manage.ts bind \
31
+ * --pageCode myModule (required)
32
+ * --resources res1,res2 (required)
33
+ *
34
+ * ── 解绑资源 ──────────────────────────────────────────────────────────────────
35
+ * ts-node scripts/page-manage.ts unbind \
36
+ * --pageCode myModule (required)
37
+ * --resources res1,res2 (required)
38
+ */
39
+
40
+ import { PrismaClient } from '@prisma/client';
41
+ import { bindResourceToPage, upsertPage } from './lib/page-helpers';
42
+
43
+ const prisma = new PrismaClient();
44
+
45
+ // ─── Arg parser ───────────────────────────────────────────────────────────────
46
+
47
+ function parseArgs(): { action: string; flags: Record<string, string> } {
48
+ const argv = process.argv.slice(2);
49
+ const action = argv[0] && !argv[0].startsWith('--') ? argv[0] : '';
50
+ const flags: Record<string, string> = {};
51
+ for (let i = action ? 1 : 0; i < argv.length; i++) {
52
+ if (argv[i].startsWith('--')) {
53
+ const key = argv[i].slice(2);
54
+ const next = argv[i + 1];
55
+ flags[key] = next && !next.startsWith('--') ? argv[++i] : 'true';
56
+ }
57
+ }
58
+ return { action, flags };
59
+ }
60
+
61
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
62
+
63
+ async function resolveParent(parentPageCode: string): Promise<number> {
64
+ const parent = await prisma.page.findUnique({
65
+ where: { code: parentPageCode },
66
+ });
67
+ if (!parent) {
68
+ console.error(
69
+ `[page-manage] Parent page "${parentPageCode}" not found in DB.`,
70
+ );
71
+ process.exit(1);
72
+ }
73
+ return parent.id;
74
+ }
75
+
76
+ async function requirePage(pageCode: string) {
77
+ const page = await prisma.page.findUnique({ where: { code: pageCode } });
78
+ if (!page) {
79
+ console.error(`[page-manage] Page "${pageCode}" not found in DB.`);
80
+ process.exit(1);
81
+ }
82
+ return page;
83
+ }
84
+
85
+ // ─── Actions ──────────────────────────────────────────────────────────────────
86
+
87
+ async function actionCreate(flags: Record<string, string>) {
88
+ const {
89
+ pageCode,
90
+ pageName,
91
+ zhName,
92
+ enName,
93
+ parentPageCode,
94
+ resources,
95
+ sortOrder,
96
+ } = flags;
97
+ if (!pageCode) {
98
+ console.error('[page-manage] --pageCode is required.');
99
+ process.exit(1);
100
+ }
101
+
102
+ const parentId = parentPageCode
103
+ ? await resolveParent(parentPageCode)
104
+ : undefined;
105
+
106
+ const page = await upsertPage(prisma, {
107
+ code: pageCode,
108
+ name: pageName || pageCode,
109
+ zhName: zhName || pageCode,
110
+ enName: enName || pageCode,
111
+ sortOrder: sortOrder ? parseInt(sortOrder, 10) : 9999,
112
+ parentId,
113
+ });
114
+
115
+ const wasCreated =
116
+ Math.abs(page.createdAt.getTime() - page.updatedAt.getTime()) < 1000;
117
+ if (wasCreated) {
118
+ console.log(`[page-manage] ✚ Created page: ${pageCode} (id=${page.id})`);
119
+ } else {
120
+ console.log(
121
+ `[page-manage] · Page already exists: ${pageCode} (id=${page.id}) — skipped`,
122
+ );
123
+ }
124
+
125
+ if (resources) {
126
+ const codes = resources
127
+ .split(',')
128
+ .map((s) => s.trim())
129
+ .filter(Boolean);
130
+ for (const code of codes) {
131
+ await bindResourceToPage(
132
+ prisma,
133
+ page.id,
134
+ code,
135
+ `${code} resource (bound to page ${pageCode})`,
136
+ );
137
+ console.log(
138
+ `[page-manage] PageResource: page(${pageCode}) ↔ resource(${code})`,
139
+ );
140
+ }
141
+ }
142
+ }
143
+
144
+ async function actionUpdate(flags: Record<string, string>) {
145
+ const { pageCode, pageName, zhName, enName, parentPageCode, sortOrder } =
146
+ flags;
147
+ if (!pageCode) {
148
+ console.error('[page-manage] --pageCode is required.');
149
+ process.exit(1);
150
+ }
151
+
152
+ const page = await requirePage(pageCode);
153
+
154
+ const data: Record<string, unknown> = {};
155
+ if (pageName !== undefined) data.name = pageName;
156
+ if (zhName !== undefined) data.zhName = zhName;
157
+ if (enName !== undefined) data.enName = enName;
158
+ if (sortOrder !== undefined) data.sortOrder = parseInt(sortOrder, 10);
159
+ if (parentPageCode !== undefined)
160
+ data.parentId = await resolveParent(parentPageCode);
161
+
162
+ if (Object.keys(data).length === 0) {
163
+ console.log(
164
+ '[page-manage] No fields to update. Pass at least one of: --pageName --zhName --enName --sortOrder --parentPageCode',
165
+ );
166
+ process.exit(0);
167
+ }
168
+
169
+ await prisma.page.update({ where: { id: page.id }, data });
170
+ console.log(
171
+ `[page-manage] ✎ Updated page: ${pageCode} (id=${page.id})`,
172
+ data,
173
+ );
174
+ }
175
+
176
+ async function actionDelete(flags: Record<string, string>) {
177
+ const { pageCode } = flags;
178
+ if (!pageCode) {
179
+ console.error('[page-manage] --pageCode is required.');
180
+ process.exit(1);
181
+ }
182
+
183
+ const page = await requirePage(pageCode);
184
+
185
+ await prisma.pageResource.deleteMany({ where: { pageId: page.id } });
186
+ await prisma.rolePages.deleteMany({ where: { pageId: page.id } });
187
+ await prisma.page.delete({ where: { id: page.id } });
188
+
189
+ console.log(
190
+ `[page-manage] ✖ Deleted page: ${pageCode} (id=${page.id}) + its PageResource + RolePages rows`,
191
+ );
192
+ }
193
+
194
+ async function actionBind(flags: Record<string, string>) {
195
+ const { pageCode, resources } = flags;
196
+ if (!pageCode) {
197
+ console.error('[page-manage] --pageCode is required.');
198
+ process.exit(1);
199
+ }
200
+ if (!resources) {
201
+ console.error('[page-manage] --resources is required.');
202
+ process.exit(1);
203
+ }
204
+
205
+ const page = await requirePage(pageCode);
206
+ const codes = resources
207
+ .split(',')
208
+ .map((s) => s.trim())
209
+ .filter(Boolean);
210
+
211
+ for (const code of codes) {
212
+ await bindResourceToPage(
213
+ prisma,
214
+ page.id,
215
+ code,
216
+ `${code} resource (bound to page ${pageCode})`,
217
+ );
218
+ console.log(
219
+ `[page-manage] PageResource: page(${pageCode}) ↔ resource(${code})`,
220
+ );
221
+ }
222
+ console.log(
223
+ `[page-manage] ✅ Bound ${codes.length} resource(s) to page: ${pageCode}`,
224
+ );
225
+ }
226
+
227
+ async function actionUnbind(flags: Record<string, string>) {
228
+ const { pageCode, resources } = flags;
229
+ if (!pageCode) {
230
+ console.error('[page-manage] --pageCode is required.');
231
+ process.exit(1);
232
+ }
233
+ if (!resources) {
234
+ console.error('[page-manage] --resources is required.');
235
+ process.exit(1);
236
+ }
237
+
238
+ const page = await requirePage(pageCode);
239
+ const codes = resources
240
+ .split(',')
241
+ .map((s) => s.trim())
242
+ .filter(Boolean);
243
+
244
+ for (const code of codes) {
245
+ const resource = await prisma.resource.findUnique({ where: { code } });
246
+ if (!resource) {
247
+ console.warn(`[page-manage] ⚠ Resource "${code}" not found — skipped`);
248
+ continue;
249
+ }
250
+ await prisma.pageResource.deleteMany({
251
+ where: { pageId: page.id, resourceId: resource.id },
252
+ });
253
+ console.log(
254
+ `[page-manage] Unbound: page(${pageCode}) ↔ resource(${code})`,
255
+ );
256
+ }
257
+ console.log(`[page-manage] ✅ Done.`);
258
+ }
259
+
260
+ // ─── Entry point ──────────────────────────────────────────────────────────────
261
+
262
+ const ACTIONS: Record<string, (f: Record<string, string>) => Promise<void>> = {
263
+ create: actionCreate,
264
+ update: actionUpdate,
265
+ delete: actionDelete,
266
+ bind: actionBind,
267
+ unbind: actionUnbind,
268
+ };
269
+
270
+ async function main() {
271
+ const { action, flags } = parseArgs();
272
+ const handler = ACTIONS[action];
273
+ if (!handler) {
274
+ console.error(
275
+ `[page-manage] Unknown action: "${action}". Valid actions: ${Object.keys(
276
+ ACTIONS,
277
+ ).join(', ')}`,
278
+ );
279
+ process.exit(1);
280
+ }
281
+ await handler(flags);
282
+ console.log('[page-manage] ✅ Done.');
283
+ }
284
+
285
+ main()
286
+ .catch((e) => {
287
+ console.error('[page-manage] Fatal error:', e);
288
+ process.exit(1);
289
+ })
290
+ .finally(() => prisma.$disconnect());
@@ -0,0 +1,184 @@
1
+ /**
2
+ * permission-manage.ts — 角色页面权限管理
3
+ *
4
+ * Usage:
5
+ *
6
+ * ── 授予角色访问页面的权限 ───────────────────────────────────────────────────
7
+ * ts-node scripts/permission-manage.ts grant \
8
+ * --pageCode myModule (required)
9
+ * --roles SYSTEM_ADMIN,MY_ROLE (optional, defaults to SYSTEM_ADMIN)
10
+ *
11
+ * ── 撤销角色访问页面的权限 ───────────────────────────────────────────────────
12
+ * ts-node scripts/permission-manage.ts revoke \
13
+ * --pageCode myModule (required)
14
+ * --roles MY_ROLE (required)
15
+ *
16
+ * grant 行为:
17
+ * 1. Upsert Role
18
+ * 2. Upsert RolePages(role ↔ page)
19
+ * 3. Upsert RoleResource(role ↔ 该页面的每个关联资源)
20
+ *
21
+ * revoke 行为:
22
+ * 1. 删除 RolePages(role ↔ page)
23
+ * 2. 删除 RoleResource(role ↔ 该页面的每个关联资源)
24
+ *
25
+ * Prerequisites: run page-manage.ts first to ensure the page + resources exist.
26
+ */
27
+
28
+ import { PrismaClient } from '@prisma/client';
29
+ import {
30
+ getPageResources,
31
+ grantRoleAccess,
32
+ revokeRoleAccess,
33
+ } from './lib/page-helpers';
34
+
35
+ const prisma = new PrismaClient();
36
+
37
+ // ─── Arg parser ───────────────────────────────────────────────────────────────
38
+
39
+ function parseArgs(): { action: string; flags: Record<string, string> } {
40
+ const argv = process.argv.slice(2);
41
+ const action = argv[0] && !argv[0].startsWith('--') ? argv[0] : '';
42
+ const flags: Record<string, string> = {};
43
+ for (let i = action ? 1 : 0; i < argv.length; i++) {
44
+ if (argv[i].startsWith('--')) {
45
+ const key = argv[i].slice(2);
46
+ const next = argv[i + 1];
47
+ flags[key] = next && !next.startsWith('--') ? argv[++i] : 'true';
48
+ }
49
+ }
50
+ return { action, flags };
51
+ }
52
+
53
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
54
+
55
+ async function requirePage(pageCode: string) {
56
+ const page = await prisma.page.findUnique({ where: { code: pageCode } });
57
+ if (!page) {
58
+ console.error(
59
+ `[permission-manage] Page "${pageCode}" not found in DB. Run page-manage.ts create first.`,
60
+ );
61
+ process.exit(1);
62
+ }
63
+ return page;
64
+ }
65
+
66
+ // ─── Actions ──────────────────────────────────────────────────────────────────
67
+
68
+ async function actionGrant(flags: Record<string, string>) {
69
+ const { pageCode, roles } = flags;
70
+ if (!pageCode) {
71
+ console.error('[permission-manage] --pageCode is required.');
72
+ process.exit(1);
73
+ }
74
+
75
+ const roleNames = roles
76
+ ? roles
77
+ .split(',')
78
+ .map((s) => s.trim())
79
+ .filter(Boolean)
80
+ : ['SYSTEM_ADMIN'];
81
+
82
+ const page = await requirePage(pageCode);
83
+ const pageResources = await getPageResources(prisma, page.id);
84
+
85
+ if (pageResources.length === 0) {
86
+ console.warn(
87
+ `[permission-manage] ⚠ No resources linked to page "${pageCode}". Bind resources first via page-manage.ts bind.`,
88
+ );
89
+ } else {
90
+ console.log(
91
+ `[permission-manage] Resources: [${pageResources
92
+ .map((pr) => pr.resource.code)
93
+ .join(', ')}]`,
94
+ );
95
+ }
96
+
97
+ const resourceIds = pageResources.map((pr) => pr.resource.id);
98
+
99
+ for (const roleName of roleNames) {
100
+ const role = await prisma.role.upsert({
101
+ where: { name: roleName },
102
+ update: {},
103
+ create: { name: roleName, description: `${roleName} role` },
104
+ });
105
+ console.log(`[permission-manage] Role: ${roleName} (id=${role.id})`);
106
+
107
+ await grantRoleAccess(prisma, role.id, page.id, resourceIds);
108
+ console.log(`[permission-manage] RolePages: ${roleName} → ${pageCode}`);
109
+ for (const pr of pageResources) {
110
+ console.log(
111
+ `[permission-manage] RoleResource: ${roleName} → ${pr.resource.code}`,
112
+ );
113
+ }
114
+ }
115
+ }
116
+
117
+ async function actionRevoke(flags: Record<string, string>) {
118
+ const { pageCode, roles } = flags;
119
+ if (!pageCode) {
120
+ console.error('[permission-manage] --pageCode is required.');
121
+ process.exit(1);
122
+ }
123
+ if (!roles) {
124
+ console.error('[permission-manage] --roles is required.');
125
+ process.exit(1);
126
+ }
127
+
128
+ const roleNames = roles
129
+ .split(',')
130
+ .map((s) => s.trim())
131
+ .filter(Boolean);
132
+ const page = await requirePage(pageCode);
133
+ const pageResources = await getPageResources(prisma, page.id);
134
+ const resourceIds = pageResources.map((pr) => pr.resource.id);
135
+
136
+ for (const roleName of roleNames) {
137
+ const role = await prisma.role.findUnique({ where: { name: roleName } });
138
+ if (!role) {
139
+ console.warn(
140
+ `[permission-manage] Role "${roleName}" not found — skipped`,
141
+ );
142
+ continue;
143
+ }
144
+
145
+ await revokeRoleAccess(prisma, role.id, page.id, resourceIds);
146
+ console.log(
147
+ `[permission-manage] Revoked RolePages: ${roleName} → ${pageCode}`,
148
+ );
149
+ for (const pr of pageResources) {
150
+ console.log(
151
+ `[permission-manage] Revoked RoleResource: ${roleName} → ${pr.resource.code}`,
152
+ );
153
+ }
154
+ }
155
+ }
156
+
157
+ // ─── Entry point ──────────────────────────────────────────────────────────────
158
+
159
+ const ACTIONS: Record<string, (f: Record<string, string>) => Promise<void>> = {
160
+ grant: actionGrant,
161
+ revoke: actionRevoke,
162
+ };
163
+
164
+ async function main() {
165
+ const { action, flags } = parseArgs();
166
+ const handler = ACTIONS[action];
167
+ if (!handler) {
168
+ console.error(
169
+ `[permission-manage] Unknown action: "${action}". Valid actions: ${Object.keys(
170
+ ACTIONS,
171
+ ).join(', ')}`,
172
+ );
173
+ process.exit(1);
174
+ }
175
+ await handler(flags);
176
+ console.log('[permission-manage] ✅ Done.');
177
+ }
178
+
179
+ main()
180
+ .catch((e) => {
181
+ console.error('[permission-manage] Fatal error:', e);
182
+ process.exit(1);
183
+ })
184
+ .finally(() => prisma.$disconnect());
@@ -0,0 +1,143 @@
1
+ /**
2
+ * prismaModels.ts
3
+ *
4
+ * Shared utility for enumerating non-system Prisma business models by
5
+ * scanning the config/prisma/ directory.
6
+ *
7
+ * Exported:
8
+ * - ModelInfo — shape of each model entry
9
+ * - toCamelCase() — PascalCase → camelCase
10
+ * - toKebabCase() — PascalCase → kebab-case
11
+ * - readPrismaModels() — scan config/prisma/, return all business ModelInfo[]
12
+ */
13
+
14
+ import * as fs from 'fs';
15
+ import * as path from 'path';
16
+
17
+ /**
18
+ * Path to config/prisma/ — two levels up from server/scripts/
19
+ * (project-root/config/prisma/)
20
+ */
21
+ const PRISMA_CONFIG_DIR = path.resolve(
22
+ __dirname,
23
+ '..',
24
+ '..',
25
+ 'config',
26
+ 'prisma',
27
+ );
28
+
29
+ /**
30
+ * Prisma files that define system/permission models and must NOT be scanned.
31
+ * These are already handled by seedPermissions().
32
+ */
33
+ const EXCLUDED_FILES = new Set(['system.prisma']);
34
+
35
+ // ─── Types ────────────────────────────────────────────────────────────────────
36
+
37
+ export interface ModelInfo {
38
+ /** PascalCase — original model name, e.g. "Event" */
39
+ name: string;
40
+ /** camelCase — used as page.code / resource.code, e.g. "event" */
41
+ code: string;
42
+ /** kebab-case — used in URL path segment, e.g. "event" */
43
+ slug: string;
44
+ }
45
+
46
+ // ─── Name Converters ──────────────────────────────────────────────────────────
47
+
48
+ /** PascalCase → camelCase (e.g. "Event" → "event", "ITActivityDay" → "iTActivityDay") */
49
+ export function toCamelCase(str: string): string {
50
+ return str.charAt(0).toLowerCase() + str.slice(1);
51
+ }
52
+
53
+ /**
54
+ * PascalCase → kebab-case
55
+ * "Event" → "event"
56
+ * "ITActivityDay" → "it-activity-day"
57
+ * "GameList" → "game-list"
58
+ */
59
+ export function toKebabCase(str: string): string {
60
+ return (
61
+ str
62
+ // Insert hyphen between a lowercase/digit and an uppercase letter
63
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
64
+ // Insert hyphen between a run of uppercase letters and an uppercase+lowercase pair
65
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')
66
+ .toLowerCase()
67
+ );
68
+ }
69
+
70
+ // ─── Prisma File Parser ───────────────────────────────────────────────────────
71
+
72
+ /**
73
+ * Extract model names from a single .prisma file content.
74
+ * Skips models annotated with `/// @IgnoreReactCode`.
75
+ */
76
+ function extractModels(content: string): ModelInfo[] {
77
+ const models: ModelInfo[] = [];
78
+ const lines = content.split('\n');
79
+
80
+ for (let i = 0; i < lines.length; i++) {
81
+ const modelMatch = lines[i].match(/^model\s+(\w+)\s*\{/);
82
+ if (!modelMatch) continue;
83
+
84
+ const modelName = modelMatch[1];
85
+
86
+ // Collect consecutive `///` comment lines immediately above this model declaration
87
+ const annotations: string[] = [];
88
+ let j = i - 1;
89
+ while (j >= 0 && lines[j].trim().startsWith('///')) {
90
+ annotations.push(lines[j]);
91
+ j--;
92
+ }
93
+
94
+ // Skip models that explicitly opt out of frontend code generation
95
+ if (annotations.some((a) => a.includes('@IgnoreReactCode'))) {
96
+ console.log(`[prismaModels] Skipping ${modelName} (@IgnoreReactCode)`);
97
+ continue;
98
+ }
99
+
100
+ models.push({
101
+ name: modelName,
102
+ code: toCamelCase(modelName),
103
+ slug: toKebabCase(modelName),
104
+ });
105
+ }
106
+
107
+ return models;
108
+ }
109
+
110
+ /**
111
+ * Scan all non-excluded .prisma files under config/prisma/ and collect
112
+ * model definitions.
113
+ */
114
+ export function readPrismaModels(): ModelInfo[] {
115
+ if (!fs.existsSync(PRISMA_CONFIG_DIR)) {
116
+ console.warn(
117
+ `[prismaModels] Prisma config directory not found: ${PRISMA_CONFIG_DIR}`,
118
+ );
119
+ return [];
120
+ }
121
+
122
+ const files = fs
123
+ .readdirSync(PRISMA_CONFIG_DIR)
124
+ .filter((f) => f.endsWith('.prisma') && !EXCLUDED_FILES.has(f))
125
+ .sort(); // deterministic order across runs
126
+
127
+ const allModels: ModelInfo[] = [];
128
+ for (const file of files) {
129
+ const content = fs.readFileSync(
130
+ path.join(PRISMA_CONFIG_DIR, file),
131
+ 'utf-8',
132
+ );
133
+ const models = extractModels(content);
134
+ allModels.push(...models);
135
+ console.log(
136
+ `[prismaModels] Scanned ${file}: models=[${
137
+ models.map((m) => m.name).join(', ') || '(none)'
138
+ }]`,
139
+ );
140
+ }
141
+
142
+ return allModels;
143
+ }