create-react-admin-template 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (736) hide show
  1. package/README.md +46 -2
  2. package/bin/create.mjs +5 -0
  3. package/package.json +22 -4
  4. package/template/.dockerignore +12 -0
  5. package/template/.editorconfig +12 -0
  6. package/template/.env +14 -0
  7. package/template/.env.development +5 -0
  8. package/template/.env.production +2 -0
  9. package/template/.env.test +5 -0
  10. package/template/.github/workflows/ci.yml +40 -0
  11. package/template/.gitlab-ci.yml +208 -0
  12. package/template/.husky/commit-msg +1 -0
  13. package/template/.husky/pre-commit +1 -0
  14. package/template/.nvmrc +1 -0
  15. package/template/.prettierignore +11 -0
  16. package/template/.prettierrc +47 -0
  17. package/template/Dockerfile +16 -0
  18. package/template/README.md +372 -0
  19. package/template/build/advancedTable.ts +103 -0
  20. package/template/build/environment.ts +150 -0
  21. package/template/commitlint.config.js +32 -0
  22. package/template/components.json +21 -0
  23. package/template/deploy/README.md +132 -0
  24. package/template/deploy/host-nginx/react-admin-api.conf +14 -0
  25. package/template/deploy/host-nginx/react-admin-web.conf +8 -0
  26. package/template/deploy/nginx.conf +38 -0
  27. package/template/docs/activity-status.md +217 -0
  28. package/template/docs/audit-logs.md +158 -0
  29. package/template/docs/authentication-adapters.md +219 -0
  30. package/template/docs/browser-security.md +58 -0
  31. package/template/docs/bundle-budgets.md +65 -0
  32. package/template/docs/component-source-governance.md +99 -0
  33. package/template/docs/data-masking.md +169 -0
  34. package/template/docs/enterprise-scaffold.md +208 -0
  35. package/template/docs/feature-data-template.md +227 -0
  36. package/template/docs/feature-flags.md +169 -0
  37. package/template/docs/file-capabilities.md +196 -0
  38. package/template/docs/locale-and-i18n.md +132 -0
  39. package/template/docs/mutation-idempotency.md +24 -0
  40. package/template/docs/optional-editors.md +203 -0
  41. package/template/docs/page-feedback.md +83 -0
  42. package/template/docs/query-data-conventions.md +178 -0
  43. package/template/docs/realtime-collaboration.md +140 -0
  44. package/template/docs/reporting-printing-templates.md +156 -0
  45. package/template/docs/scaffold-capability-roadmap.md +226 -0
  46. package/template/docs/scaffold-guide.md +443 -0
  47. package/template/docs/template-changelog.md +30 -0
  48. package/template/docs/template-versioning.md +26 -0
  49. package/template/docs/tenant-workspace-context.md +147 -0
  50. package/template/docs/unsaved-changes.md +58 -0
  51. package/template/docs/white-label.md +102 -0
  52. package/template/eslint.config.js +697 -0
  53. package/template/gitignore +39 -0
  54. package/template/index.html +26 -0
  55. package/template/knip.config.ts +42 -0
  56. package/template/lint-staged.config.js +8 -0
  57. package/template/package.json +133 -0
  58. package/template/pnpm-lock.yaml +8694 -0
  59. package/template/public/favicon.ico +0 -0
  60. package/template/public/logo.svg +1 -0
  61. package/template/public/runtime-config.json +49 -0
  62. package/template/scaffold.template.json +5 -0
  63. package/template/src/Application.tsx +114 -0
  64. package/template/src/api/ApiError.ts +33 -0
  65. package/template/src/api/activity/ActivityProvider.tsx +167 -0
  66. package/template/src/api/activity/access.ts +13 -0
  67. package/template/src/api/activity/errors.ts +17 -0
  68. package/template/src/api/activity/index.ts +67 -0
  69. package/template/src/api/activity/model.ts +227 -0
  70. package/template/src/api/activity/query.ts +163 -0
  71. package/template/src/api/activity/source.ts +16 -0
  72. package/template/src/api/activity/subscription.ts +292 -0
  73. package/template/src/api/activity/transports.ts +271 -0
  74. package/template/src/api/activity/types.ts +402 -0
  75. package/template/src/api/authClient.ts +134 -0
  76. package/template/src/api/authSession.ts +307 -0
  77. package/template/src/api/clients/configureApiClient.ts +62 -0
  78. package/template/src/api/clients/httpStatus.ts +4 -0
  79. package/template/src/api/config/services.json +7 -0
  80. package/template/src/api/demoAuthClient.ts +46 -0
  81. package/template/src/api/enums/EnumCatalogProvider.tsx +169 -0
  82. package/template/src/api/enums/EnumDictionary.ts +55 -0
  83. package/template/src/api/enums/access.ts +130 -0
  84. package/template/src/api/enums/catalog.ts +216 -0
  85. package/template/src/api/enums/errors.ts +21 -0
  86. package/template/src/api/enums/index.ts +48 -0
  87. package/template/src/api/enums/query.ts +82 -0
  88. package/template/src/api/enums/scope.ts +58 -0
  89. package/template/src/api/enums/types.ts +251 -0
  90. package/template/src/api/hooks/error.ts +198 -0
  91. package/template/src/api/hooks/index.ts +4 -0
  92. package/template/src/api/hooks/request.ts +99 -0
  93. package/template/src/api/hooks/requestId.ts +65 -0
  94. package/template/src/api/hooks/response.ts +22 -0
  95. package/template/src/api/hooks/types.ts +20 -0
  96. package/template/src/api/idempotency/index.ts +1 -0
  97. package/template/src/api/idempotency/key.ts +23 -0
  98. package/template/src/api/index.ts +14 -0
  99. package/template/src/api/metadata/MetadataProvider.tsx +37 -0
  100. package/template/src/api/metadata/index.ts +2 -0
  101. package/template/src/api/metadata/types.ts +30 -0
  102. package/template/src/api/parameters/GlobalParameterProvider.tsx +210 -0
  103. package/template/src/api/parameters/access.ts +117 -0
  104. package/template/src/api/parameters/catalog.ts +170 -0
  105. package/template/src/api/parameters/errors.ts +21 -0
  106. package/template/src/api/parameters/index.ts +53 -0
  107. package/template/src/api/parameters/query.ts +84 -0
  108. package/template/src/api/parameters/scope.ts +58 -0
  109. package/template/src/api/parameters/types.ts +214 -0
  110. package/template/src/api/query/index.ts +13 -0
  111. package/template/src/api/query/keys.ts +155 -0
  112. package/template/src/api/query/mutation.ts +48 -0
  113. package/template/src/api/query/react.ts +36 -0
  114. package/template/src/api/query/scope.ts +38 -0
  115. package/template/src/api/query/types.ts +147 -0
  116. package/template/src/api/types.ts +144 -0
  117. package/template/src/application/types.ts +52 -0
  118. package/template/src/auditLogs/errors.ts +17 -0
  119. package/template/src/auditLogs/export.ts +85 -0
  120. package/template/src/auditLogs/index.ts +54 -0
  121. package/template/src/auditLogs/model.ts +526 -0
  122. package/template/src/auditLogs/query.ts +113 -0
  123. package/template/src/auditLogs/react.ts +36 -0
  124. package/template/src/auditLogs/source.ts +51 -0
  125. package/template/src/auditLogs/types.ts +357 -0
  126. package/template/src/authentication/controller.ts +351 -0
  127. package/template/src/authentication/index.ts +8 -0
  128. package/template/src/authentication/redirect.ts +72 -0
  129. package/template/src/authentication/types.ts +300 -0
  130. package/template/src/bootstrap.tsx +96 -0
  131. package/template/src/components/AppDataTable/AppDataTable.tsx +74 -0
  132. package/template/src/components/AppDataTable/index.ts +2 -0
  133. package/template/src/components/AppDataTable/types.ts +27 -0
  134. package/template/src/components/AppDialog/AppConfirmDialog.tsx +44 -0
  135. package/template/src/components/AppDialog/AppDialog.tsx +113 -0
  136. package/template/src/components/AppDialog/index.ts +3 -0
  137. package/template/src/components/AppDialog/messages.tsx +22 -0
  138. package/template/src/components/AppDialog/types.ts +53 -0
  139. package/template/src/components/AppPageForm/AppPageForm.tsx +21 -0
  140. package/template/src/components/AppPageForm/PageForm.tsx +765 -0
  141. package/template/src/components/AppPageForm/SOURCE.md +26 -0
  142. package/template/src/components/AppPageForm/config.ts +253 -0
  143. package/template/src/components/AppPageForm/controller.ts +580 -0
  144. package/template/src/components/AppPageForm/index.ts +2 -0
  145. package/template/src/components/AppPageForm/messages.ts +90 -0
  146. package/template/src/components/AppPageForm/optionUtils.ts +91 -0
  147. package/template/src/components/AppPageForm/options.ts +397 -0
  148. package/template/src/components/AppPageForm/query.ts +44 -0
  149. package/template/src/components/AppPageForm/style.css +119 -0
  150. package/template/src/components/AppPageForm/types.ts +632 -0
  151. package/template/src/components/AppPageForm/validation.ts +233 -0
  152. package/template/src/components/AppTable/AppTable.tsx +26 -0
  153. package/template/src/components/AppTable/SOURCE.md +72 -0
  154. package/template/src/components/AppTable/cell/customCell/TableCellLayer.tsx +73 -0
  155. package/template/src/components/AppTable/cell/customCell/actions/ActionDropdownCell.tsx +104 -0
  156. package/template/src/components/AppTable/cell/customCell/cellLayer.ts +358 -0
  157. package/template/src/components/AppTable/cell/customCell/componentProps.ts +30 -0
  158. package/template/src/components/AppTable/cell/customCell/date/TemporalPickerEditor.tsx +54 -0
  159. package/template/src/components/AppTable/cell/customCell/index.ts +2 -0
  160. package/template/src/components/AppTable/cell/customCell/select/SelectCellEditor.tsx +225 -0
  161. package/template/src/components/AppTable/cell/customCell/tableCellLayer.css +20 -0
  162. package/template/src/components/AppTable/cell/customCell/tooltip/TooltipCell.tsx +45 -0
  163. package/template/src/components/AppTable/cell/customCell/types.ts +63 -0
  164. package/template/src/components/AppTable/cell/customCell/useCellLayerLifecycle.ts +111 -0
  165. package/template/src/components/AppTable/cell/frameworkCell/TableCellComponentLayer.tsx +40 -0
  166. package/template/src/components/AppTable/cell/frameworkCell/cellComponentSession.ts +203 -0
  167. package/template/src/components/AppTable/cell/frameworkCell/index.ts +3 -0
  168. package/template/src/components/AppTable/cell/index.ts +2 -0
  169. package/template/src/components/AppTable/columns/TableColumnEditor.tsx +257 -0
  170. package/template/src/components/AppTable/columns/index.ts +1 -0
  171. package/template/src/components/AppTable/columns/useTableColumnPreferenceActions.ts +85 -0
  172. package/template/src/components/AppTable/config/defaults.ts +46 -0
  173. package/template/src/components/AppTable/config/index.ts +2 -0
  174. package/template/src/components/AppTable/config/license.ts +39 -0
  175. package/template/src/components/AppTable/config/resolver.ts +25 -0
  176. package/template/src/components/AppTable/config/types.ts +377 -0
  177. package/template/src/components/AppTable/engine/bottom/index.ts +1 -0
  178. package/template/src/components/AppTable/engine/bottom/types.ts +14 -0
  179. package/template/src/components/AppTable/engine/cell/constants.ts +32 -0
  180. package/template/src/components/AppTable/engine/cell/customCell/actions/index.ts +1 -0
  181. package/template/src/components/AppTable/engine/cell/customCell/actions/renderer.ts +162 -0
  182. package/template/src/components/AppTable/engine/cell/customCell/date/index.ts +1 -0
  183. package/template/src/components/AppTable/engine/cell/customCell/date/renderer.ts +116 -0
  184. package/template/src/components/AppTable/engine/cell/customCell/editors/editorBounds.ts +57 -0
  185. package/template/src/components/AppTable/engine/cell/customCell/editors/editorTrigger.ts +46 -0
  186. package/template/src/components/AppTable/engine/cell/customCell/editors/index.ts +3 -0
  187. package/template/src/components/AppTable/engine/cell/customCell/editors/layerEditor.ts +244 -0
  188. package/template/src/components/AppTable/engine/cell/customCell/index.ts +7 -0
  189. package/template/src/components/AppTable/engine/cell/customCell/renderers/columnRenderer.ts +245 -0
  190. package/template/src/components/AppTable/engine/cell/customCell/renderers/confirmInput.ts +57 -0
  191. package/template/src/components/AppTable/engine/cell/customCell/renderers/display.ts +78 -0
  192. package/template/src/components/AppTable/engine/cell/customCell/renderers/index.ts +3 -0
  193. package/template/src/components/AppTable/engine/cell/customCell/renderers/itemList.ts +60 -0
  194. package/template/src/components/AppTable/engine/cell/customCell/renderers/links.ts +131 -0
  195. package/template/src/components/AppTable/engine/cell/customCell/renderers/selection.ts +41 -0
  196. package/template/src/components/AppTable/engine/cell/customCell/renderers/shared.ts +71 -0
  197. package/template/src/components/AppTable/engine/cell/customCell/renderers/step.ts +37 -0
  198. package/template/src/components/AppTable/engine/cell/customCell/renderers/switch.ts +45 -0
  199. package/template/src/components/AppTable/engine/cell/customCell/select/index.ts +1 -0
  200. package/template/src/components/AppTable/engine/cell/customCell/select/renderer.ts +33 -0
  201. package/template/src/components/AppTable/engine/cell/customCell/tooltip/index.ts +1 -0
  202. package/template/src/components/AppTable/engine/cell/customCell/tooltip/tooltip.ts +94 -0
  203. package/template/src/components/AppTable/engine/cell/customCell/types.ts +82 -0
  204. package/template/src/components/AppTable/engine/cell/formatting.ts +355 -0
  205. package/template/src/components/AppTable/engine/cell/formula.ts +145 -0
  206. package/template/src/components/AppTable/engine/cell/index.ts +7 -0
  207. package/template/src/components/AppTable/engine/cell/multiSelect.ts +96 -0
  208. package/template/src/components/AppTable/engine/cell/options.ts +339 -0
  209. package/template/src/components/AppTable/engine/cell/types.ts +53 -0
  210. package/template/src/components/AppTable/engine/columns/column.ts +430 -0
  211. package/template/src/components/AppTable/engine/columns/config/columns.ts +33 -0
  212. package/template/src/components/AppTable/engine/columns/config/index.ts +4 -0
  213. package/template/src/components/AppTable/engine/columns/config/mutation.ts +138 -0
  214. package/template/src/components/AppTable/engine/columns/config/temporal.ts +11 -0
  215. package/template/src/components/AppTable/engine/columns/config/validation.ts +106 -0
  216. package/template/src/components/AppTable/engine/columns/constants.ts +6 -0
  217. package/template/src/components/AppTable/engine/columns/gridColumns.ts +332 -0
  218. package/template/src/components/AppTable/engine/columns/index.ts +4 -0
  219. package/template/src/components/AppTable/engine/columns/rendererPolicies.ts +129 -0
  220. package/template/src/components/AppTable/engine/component/resolver.ts +272 -0
  221. package/template/src/components/AppTable/engine/component/types.ts +384 -0
  222. package/template/src/components/AppTable/engine/config/constants.ts +33 -0
  223. package/template/src/components/AppTable/engine/config/grid/compiler.ts +65 -0
  224. package/template/src/components/AppTable/engine/config/grid/defaults.ts +82 -0
  225. package/template/src/components/AppTable/engine/config/grid/ownership.ts +35 -0
  226. package/template/src/components/AppTable/engine/config/grid/runtimeDelta.ts +34 -0
  227. package/template/src/components/AppTable/engine/config/grid/types.ts +30 -0
  228. package/template/src/components/AppTable/engine/pagination/config.ts +75 -0
  229. package/template/src/components/AppTable/engine/pagination/constants.ts +5 -0
  230. package/template/src/components/AppTable/engine/pagination/index.ts +3 -0
  231. package/template/src/components/AppTable/engine/pagination/types.ts +70 -0
  232. package/template/src/components/AppTable/engine/preference/index.ts +2 -0
  233. package/template/src/components/AppTable/engine/preference/preference.ts +535 -0
  234. package/template/src/components/AppTable/engine/preference/types.ts +28 -0
  235. package/template/src/components/AppTable/engine/right/index.ts +1 -0
  236. package/template/src/components/AppTable/engine/right/types.ts +18 -0
  237. package/template/src/components/AppTable/engine/search/config.ts +64 -0
  238. package/template/src/components/AppTable/engine/search/constants.ts +8 -0
  239. package/template/src/components/AppTable/engine/search/index.ts +7 -0
  240. package/template/src/components/AppTable/engine/search/localQuery.ts +145 -0
  241. package/template/src/components/AppTable/engine/search/query.ts +203 -0
  242. package/template/src/components/AppTable/engine/search/remoteQuery.ts +99 -0
  243. package/template/src/components/AppTable/engine/search/searchInteraction.ts +46 -0
  244. package/template/src/components/AppTable/engine/search/types.ts +155 -0
  245. package/template/src/components/AppTable/engine/selection/config.ts +13 -0
  246. package/template/src/components/AppTable/engine/selection/index.ts +4 -0
  247. package/template/src/components/AppTable/engine/selection/selection.ts +357 -0
  248. package/template/src/components/AppTable/engine/selection/selectionHeader.ts +88 -0
  249. package/template/src/components/AppTable/engine/selection/types.ts +66 -0
  250. package/template/src/components/AppTable/engine/shared/action.ts +11 -0
  251. package/template/src/components/AppTable/engine/shared/constants.ts +2 -0
  252. package/template/src/components/AppTable/engine/shared/decimal.ts +114 -0
  253. package/template/src/components/AppTable/engine/shared/feedback.ts +62 -0
  254. package/template/src/components/AppTable/engine/shared/index.ts +13 -0
  255. package/template/src/components/AppTable/engine/shared/interaction.ts +55 -0
  256. package/template/src/components/AppTable/engine/shared/messages.ts +161 -0
  257. package/template/src/components/AppTable/engine/shared/row.ts +32 -0
  258. package/template/src/components/AppTable/engine/shared/scheduler.ts +17 -0
  259. package/template/src/components/AppTable/engine/shared/tableKey.ts +31 -0
  260. package/template/src/components/AppTable/engine/shared/theme.ts +196 -0
  261. package/template/src/components/AppTable/engine/shared/treeRows.ts +155 -0
  262. package/template/src/components/AppTable/engine/shared/types.ts +58 -0
  263. package/template/src/components/AppTable/engine/shared/valueSnapshot.ts +46 -0
  264. package/template/src/components/AppTable/engine/summary/config/export.ts +117 -0
  265. package/template/src/components/AppTable/engine/summary/config/index.ts +3 -0
  266. package/template/src/components/AppTable/engine/summary/config/summary.ts +62 -0
  267. package/template/src/components/AppTable/engine/summary/config/types.ts +93 -0
  268. package/template/src/components/AppTable/engine/summary/constants.ts +13 -0
  269. package/template/src/components/AppTable/engine/summary/excelJs.ts +133 -0
  270. package/template/src/components/AppTable/engine/summary/export.ts +311 -0
  271. package/template/src/components/AppTable/engine/summary/index.ts +6 -0
  272. package/template/src/components/AppTable/engine/summary/selectionSum.ts +92 -0
  273. package/template/src/components/AppTable/engine/summary/summary.ts +457 -0
  274. package/template/src/components/AppTable/engine/table/clipboard/index.ts +1 -0
  275. package/template/src/components/AppTable/engine/table/clipboard/transfer.ts +9 -0
  276. package/template/src/components/AppTable/engine/table/controller/TableController.ts +802 -0
  277. package/template/src/components/AppTable/engine/table/controller/errors.ts +106 -0
  278. package/template/src/components/AppTable/engine/table/controller/index.ts +4 -0
  279. package/template/src/components/AppTable/engine/table/controller/latestAbortableTask.ts +33 -0
  280. package/template/src/components/AppTable/engine/table/controller/tableDataReplacement.ts +60 -0
  281. package/template/src/components/AppTable/engine/table/controller/tableDomainConfiguration.ts +94 -0
  282. package/template/src/components/AppTable/engine/table/controller/tableEditingCommands.ts +163 -0
  283. package/template/src/components/AppTable/engine/table/controller/tableGridHost.ts +324 -0
  284. package/template/src/components/AppTable/engine/table/controller/tableIdentity.ts +68 -0
  285. package/template/src/components/AppTable/engine/table/controller/tableMutationPipeline.ts +79 -0
  286. package/template/src/components/AppTable/engine/table/controller/tableQueryCoordinator.ts +187 -0
  287. package/template/src/components/AppTable/engine/table/controller/tableReportingCoordinator.ts +143 -0
  288. package/template/src/components/AppTable/engine/table/controller/tableSaveCoordinator.ts +227 -0
  289. package/template/src/components/AppTable/engine/table/controller/tableSaveValidation.ts +29 -0
  290. package/template/src/components/AppTable/engine/table/controller/tableSnapshot.ts +58 -0
  291. package/template/src/components/AppTable/engine/table/controller/types.ts +202 -0
  292. package/template/src/components/AppTable/engine/table/editing/baselineStore.ts +134 -0
  293. package/template/src/components/AppTable/engine/table/editing/changeSet.ts +492 -0
  294. package/template/src/components/AppTable/engine/table/editing/changeSetSettlement.ts +633 -0
  295. package/template/src/components/AppTable/engine/table/editing/commitResultIndex.ts +75 -0
  296. package/template/src/components/AppTable/engine/table/editing/constants.ts +15 -0
  297. package/template/src/components/AppTable/engine/table/editing/dirtyCellIndex.ts +96 -0
  298. package/template/src/components/AppTable/engine/table/editing/index.ts +6 -0
  299. package/template/src/components/AppTable/engine/table/editing/mutation.ts +173 -0
  300. package/template/src/components/AppTable/engine/table/editing/rowKey.ts +10 -0
  301. package/template/src/components/AppTable/engine/table/editing/types.ts +404 -0
  302. package/template/src/components/AppTable/engine/table/editing/validation.ts +452 -0
  303. package/template/src/components/AppTable/engine/table/grid/cellMeta.ts +90 -0
  304. package/template/src/components/AppTable/engine/table/grid/handsontable.ts +25 -0
  305. package/template/src/components/AppTable/engine/table/grid/handsontableExtensions.d.ts +26 -0
  306. package/template/src/components/AppTable/engine/table/grid/index.ts +5 -0
  307. package/template/src/components/AppTable/engine/table/grid/moduleRegistry.ts +39 -0
  308. package/template/src/components/AppTable/engine/table/grid/runtime.ts +31 -0
  309. package/template/src/components/AppTable/engine/table/grid/types.ts +25 -0
  310. package/template/src/components/AppTable/engine/table/hooks/fixedEndHooks.ts +44 -0
  311. package/template/src/components/AppTable/engine/table/hooks/gridHooks.ts +108 -0
  312. package/template/src/components/AppTable/engine/table/hooks/headerHooks.ts +103 -0
  313. package/template/src/components/AppTable/engine/table/hooks/index.ts +3 -0
  314. package/template/src/components/AppTable/engine/table/index.ts +6 -0
  315. package/template/src/components/AppTable/engine/table/layout/constants.ts +2 -0
  316. package/template/src/components/AppTable/engine/table/layout/dropdownMenu.ts +89 -0
  317. package/template/src/components/AppTable/engine/table/layout/fixedColumns.ts +44 -0
  318. package/template/src/components/AppTable/engine/table/layout/fixedEndOverlay.ts +90 -0
  319. package/template/src/components/AppTable/engine/table/layout/fixedEndOverlayAccessibility.ts +104 -0
  320. package/template/src/components/AppTable/engine/table/layout/fixedEndOverlayRenderer.ts +690 -0
  321. package/template/src/components/AppTable/engine/table/layout/fixedEndOverlaySignature.ts +58 -0
  322. package/template/src/components/AppTable/engine/table/layout/fixedEndRuntime.ts +137 -0
  323. package/template/src/components/AppTable/engine/table/layout/handsontableDomAdapter.ts +40 -0
  324. package/template/src/components/AppTable/engine/table/layout/height.ts +72 -0
  325. package/template/src/components/AppTable/engine/table/layout/index.ts +14 -0
  326. package/template/src/components/AppTable/engine/table/layout/layoutScheduler.ts +60 -0
  327. package/template/src/components/AppTable/engine/table/layout/mergeCells.ts +146 -0
  328. package/template/src/components/AppTable/engine/table/layout/nestedHeaders.ts +271 -0
  329. package/template/src/components/AppTable/engine/table/layout/types.ts +10 -0
  330. package/template/src/components/AppTable/engine/toolbar/index.ts +1 -0
  331. package/template/src/components/AppTable/engine/toolbar/types.ts +56 -0
  332. package/template/src/components/AppTable/index.ts +11 -0
  333. package/template/src/components/AppTable/messages.ts +256 -0
  334. package/template/src/components/AppTable/pagination/TablePaginationBar.tsx +193 -0
  335. package/template/src/components/AppTable/pagination/index.ts +1 -0
  336. package/template/src/components/AppTable/pagination/paginationItems.ts +56 -0
  337. package/template/src/components/AppTable/preference/index.ts +1 -0
  338. package/template/src/components/AppTable/preference/useTablePreference.ts +208 -0
  339. package/template/src/components/AppTable/reporting/index.ts +1 -0
  340. package/template/src/components/AppTable/reporting/useTableReporting.ts +342 -0
  341. package/template/src/components/AppTable/search/TableSearchBar.tsx +301 -0
  342. package/template/src/components/AppTable/search/TableSearchConditionEditor.tsx +254 -0
  343. package/template/src/components/AppTable/search/TableSearchField.tsx +338 -0
  344. package/template/src/components/AppTable/search/TableSearchFields.tsx +65 -0
  345. package/template/src/components/AppTable/search/constants.ts +9 -0
  346. package/template/src/components/AppTable/search/index.ts +3 -0
  347. package/template/src/components/AppTable/search/tableSearchBar.css +164 -0
  348. package/template/src/components/AppTable/search/types.ts +7 -0
  349. package/template/src/components/AppTable/search/useTableQuery.ts +373 -0
  350. package/template/src/components/AppTable/selection/index.ts +1 -0
  351. package/template/src/components/AppTable/selection/useTableSelection.ts +188 -0
  352. package/template/src/components/AppTable/sensitiveData.tsx +41 -0
  353. package/template/src/components/AppTable/shared/styles.ts +2 -0
  354. package/template/src/components/AppTable/styles/index.css +6 -0
  355. package/template/src/components/AppTable/styles/tableComponent.css +297 -0
  356. package/template/src/components/AppTable/styles/theme.css +133 -0
  357. package/template/src/components/AppTable/table/components/TableComponent.tsx +567 -0
  358. package/template/src/components/AppTable/table/components/TableErrorFeedback.tsx +36 -0
  359. package/template/src/components/AppTable/table/components/TableGridViewport.tsx +85 -0
  360. package/template/src/components/AppTable/table/components/index.ts +2 -0
  361. package/template/src/components/AppTable/table/components/types.ts +90 -0
  362. package/template/src/components/AppTable/table/controller/configuration.ts +89 -0
  363. package/template/src/components/AppTable/table/controller/index.ts +2 -0
  364. package/template/src/components/AppTable/table/controller/useTableController.ts +155 -0
  365. package/template/src/components/AppTable/table/controller/useTableLifecycle.ts +97 -0
  366. package/template/src/components/AppTable/table/grid/index.ts +1 -0
  367. package/template/src/components/AppTable/table/grid/useTableGrid.ts +857 -0
  368. package/template/src/components/AppTable/table/grid/useTableGridRuntimeSettings.ts +49 -0
  369. package/template/src/components/AppTable/table/index.ts +4 -0
  370. package/template/src/components/AppTable/table/layout/TablePanels.tsx +389 -0
  371. package/template/src/components/AppTable/table/layout/index.ts +7 -0
  372. package/template/src/components/AppTable/table/layout/types.ts +3 -0
  373. package/template/src/components/AppTable/table/layout/useResizablePanel.ts +213 -0
  374. package/template/src/components/AppTable/table/layout/useTableAdaptiveHeight.ts +238 -0
  375. package/template/src/components/AppTable/table/layout/useTablePanels.ts +329 -0
  376. package/template/src/components/AppTable/table/layout/useTableTheme.ts +123 -0
  377. package/template/src/components/AppTable/toolbar/TableToolbar.tsx +336 -0
  378. package/template/src/components/AppTable/toolbar/index.ts +1 -0
  379. package/template/src/components/BrandLogo/BrandLogo.tsx +41 -0
  380. package/template/src/components/BrandLogo/index.ts +1 -0
  381. package/template/src/components/Can/Can.tsx +19 -0
  382. package/template/src/components/Can/index.ts +7 -0
  383. package/template/src/components/Can/types.ts +41 -0
  384. package/template/src/components/EnumBadge/EnumBadge.tsx +44 -0
  385. package/template/src/components/EnumBadge/index.ts +2 -0
  386. package/template/src/components/EnumBadge/types.ts +16 -0
  387. package/template/src/components/EnumText/EnumText.tsx +33 -0
  388. package/template/src/components/EnumText/index.ts +2 -0
  389. package/template/src/components/EnumText/types.ts +13 -0
  390. package/template/src/components/FilePreview/FilePreview.tsx +120 -0
  391. package/template/src/components/FilePreview/index.ts +11 -0
  392. package/template/src/components/FilePreview/preview.ts +88 -0
  393. package/template/src/components/FilePreview/types.ts +91 -0
  394. package/template/src/components/FileUpload/FileUpload.tsx +172 -0
  395. package/template/src/components/FileUpload/index.ts +2 -0
  396. package/template/src/components/FileUpload/types.ts +32 -0
  397. package/template/src/components/JsonEditor/JsonEditor.tsx +103 -0
  398. package/template/src/components/JsonEditor/index.ts +1 -0
  399. package/template/src/components/JsonEditor/types.ts +14 -0
  400. package/template/src/components/PageFeedback/PageFeedback.tsx +194 -0
  401. package/template/src/components/PageFeedback/index.ts +10 -0
  402. package/template/src/components/PageFeedback/types.ts +31 -0
  403. package/template/src/components/PasswordInput/PasswordInput.tsx +50 -0
  404. package/template/src/components/PasswordInput/index.ts +1 -0
  405. package/template/src/components/RouteDialog/RouteDialog.tsx +20 -0
  406. package/template/src/components/RouteDialog/index.ts +2 -0
  407. package/template/src/components/RouteDialog/types.ts +8 -0
  408. package/template/src/components/RouteDialog/useRouteDialogNavigation.ts +30 -0
  409. package/template/src/components/SensitiveData/SensitiveData.tsx +337 -0
  410. package/template/src/components/SensitiveData/index.ts +2 -0
  411. package/template/src/components/SensitiveData/types.ts +31 -0
  412. package/template/src/components/StatusBadge/StatusBadge.tsx +28 -0
  413. package/template/src/components/StatusBadge/index.ts +2 -0
  414. package/template/src/components/StatusBadge/statusBadgeStyles.ts +30 -0
  415. package/template/src/components/StatusBadge/types.ts +7 -0
  416. package/template/src/components/layout/AppHeader/AppHeader.tsx +57 -0
  417. package/template/src/components/layout/AppHeader/HeaderSearch.tsx +160 -0
  418. package/template/src/components/layout/AppHeader/HeaderUserMenu.tsx +59 -0
  419. package/template/src/components/layout/AppHeader/ThemeControls.tsx +44 -0
  420. package/template/src/components/layout/AppHeader/index.ts +1 -0
  421. package/template/src/components/layout/AppHeader/themeOptions.ts +13 -0
  422. package/template/src/components/layout/AppSidebar.tsx +268 -0
  423. package/template/src/components/layout/PageContainer.tsx +16 -0
  424. package/template/src/components/ui/avatar.tsx +108 -0
  425. package/template/src/components/ui/badge.tsx +47 -0
  426. package/template/src/components/ui/button.tsx +63 -0
  427. package/template/src/components/ui/card.tsx +60 -0
  428. package/template/src/components/ui/checkbox.tsx +31 -0
  429. package/template/src/components/ui/collapsible.tsx +33 -0
  430. package/template/src/components/ui/command.tsx +181 -0
  431. package/template/src/components/ui/dialog.tsx +157 -0
  432. package/template/src/components/ui/dropdown-menu.tsx +254 -0
  433. package/template/src/components/ui/form.tsx +141 -0
  434. package/template/src/components/ui/input.tsx +20 -0
  435. package/template/src/components/ui/label.tsx +23 -0
  436. package/template/src/components/ui/pagination.tsx +127 -0
  437. package/template/src/components/ui/popover.tsx +41 -0
  438. package/template/src/components/ui/select.tsx +187 -0
  439. package/template/src/components/ui/separator.tsx +25 -0
  440. package/template/src/components/ui/sheet.tsx +142 -0
  441. package/template/src/components/ui/sidebar.tsx +878 -0
  442. package/template/src/components/ui/skeleton.tsx +13 -0
  443. package/template/src/components/ui/sonner.tsx +33 -0
  444. package/template/src/components/ui/tooltip.tsx +54 -0
  445. package/template/src/config/RuntimeConfigErrorPage.tsx +48 -0
  446. package/template/src/config/appConfig.ts +126 -0
  447. package/template/src/config/buildInfo.ts +8 -0
  448. package/template/src/config/observabilityAdapter.ts +8 -0
  449. package/template/src/config/runtimeConfig.ts +360 -0
  450. package/template/src/config/types.ts +195 -0
  451. package/template/src/context/ThemeProvider.tsx +84 -0
  452. package/template/src/context/UnsavedChangesProvider.tsx +123 -0
  453. package/template/src/context/applicationScope.ts +39 -0
  454. package/template/src/context/types.ts +41 -0
  455. package/template/src/dataMasking/index.ts +14 -0
  456. package/template/src/dataMasking/masking.ts +139 -0
  457. package/template/src/dataMasking/types.ts +144 -0
  458. package/template/src/featureFlags/FeatureFlagProvider.tsx +143 -0
  459. package/template/src/featureFlags/FeatureGate.tsx +12 -0
  460. package/template/src/featureFlags/catalog.ts +140 -0
  461. package/template/src/featureFlags/errors.ts +17 -0
  462. package/template/src/featureFlags/index.ts +43 -0
  463. package/template/src/featureFlags/query.ts +103 -0
  464. package/template/src/featureFlags/registry.ts +149 -0
  465. package/template/src/featureFlags/scope.ts +27 -0
  466. package/template/src/featureFlags/types.ts +241 -0
  467. package/template/src/features/auth/AuthLayout.tsx +17 -0
  468. package/template/src/features/auth/index.ts +2 -0
  469. package/template/src/features/auth/signIn/components/UserAuthForm.tsx +121 -0
  470. package/template/src/features/auth/signIn/index.tsx +71 -0
  471. package/template/src/features/auth/signIn/messages.ts +37 -0
  472. package/template/src/features/auth/signIn/types.ts +4 -0
  473. package/template/src/features/errors/ForbiddenError.tsx +34 -0
  474. package/template/src/features/errors/GeneralError.tsx +46 -0
  475. package/template/src/features/errors/MaintenanceError.tsx +31 -0
  476. package/template/src/features/errors/NotFoundError.tsx +34 -0
  477. package/template/src/features/errors/RouteError.tsx +72 -0
  478. package/template/src/features/errors/UnauthorizedError.tsx +34 -0
  479. package/template/src/features/errors/index.ts +6 -0
  480. package/template/src/features/errors/messages.ts +56 -0
  481. package/template/src/features/home/index.tsx +107 -0
  482. package/template/src/features/home/messages.ts +59 -0
  483. package/template/src/features/showcase/AccessShowcasePage.tsx +284 -0
  484. package/template/src/features/showcase/AdvancedTableDemo.tsx +120 -0
  485. package/template/src/features/showcase/FeedbackShowcasePage.tsx +142 -0
  486. package/template/src/features/showcase/FileShowcasePage.tsx +110 -0
  487. package/template/src/features/showcase/FormShowcasePage.tsx +156 -0
  488. package/template/src/features/showcase/MetadataShowcasePage.tsx +241 -0
  489. package/template/src/features/showcase/ShowcasePageHeader.tsx +24 -0
  490. package/template/src/features/showcase/TableShowcasePage.tsx +436 -0
  491. package/template/src/features/showcase/accessMessages.ts +67 -0
  492. package/template/src/features/showcase/index.ts +6 -0
  493. package/template/src/features/showcase/messages.ts +192 -0
  494. package/template/src/files/download.ts +82 -0
  495. package/template/src/files/errors.ts +15 -0
  496. package/template/src/files/filename.ts +61 -0
  497. package/template/src/files/index.ts +38 -0
  498. package/template/src/files/types.ts +299 -0
  499. package/template/src/files/useFileTask.ts +153 -0
  500. package/template/src/files/useFileUpload.ts +117 -0
  501. package/template/src/files/validation.ts +109 -0
  502. package/template/src/layouts/AppLayout.tsx +37 -0
  503. package/template/src/lib/accessControl.ts +42 -0
  504. package/template/src/lib/navigationRedirect.ts +26 -0
  505. package/template/src/lib/utils.ts +6 -0
  506. package/template/src/locale/LocaleProvider.tsx +37 -0
  507. package/template/src/locale/context.ts +15 -0
  508. package/template/src/locale/formatters.ts +123 -0
  509. package/template/src/locale/hooks.ts +35 -0
  510. package/template/src/locale/index.ts +17 -0
  511. package/template/src/locale/messages.ts +151 -0
  512. package/template/src/locale/types.ts +167 -0
  513. package/template/src/main.tsx +5 -0
  514. package/template/src/observability/browser.ts +37 -0
  515. package/template/src/observability/consoleAdapter.ts +18 -0
  516. package/template/src/observability/index.ts +26 -0
  517. package/template/src/observability/observer.ts +118 -0
  518. package/template/src/observability/redaction.ts +85 -0
  519. package/template/src/observability/types.ts +119 -0
  520. package/template/src/optionalEditors/controller.ts +327 -0
  521. package/template/src/optionalEditors/errors.ts +21 -0
  522. package/template/src/optionalEditors/index.ts +35 -0
  523. package/template/src/optionalEditors/model.ts +253 -0
  524. package/template/src/optionalEditors/react.ts +89 -0
  525. package/template/src/optionalEditors/types.ts +254 -0
  526. package/template/src/permissions/index.ts +3 -0
  527. package/template/src/permissions/types.ts +5 -0
  528. package/template/src/permissions/usePermission.ts +16 -0
  529. package/template/src/realtimeCollaboration/controller.ts +355 -0
  530. package/template/src/realtimeCollaboration/errors.ts +20 -0
  531. package/template/src/realtimeCollaboration/index.ts +39 -0
  532. package/template/src/realtimeCollaboration/model.ts +212 -0
  533. package/template/src/realtimeCollaboration/react.ts +72 -0
  534. package/template/src/realtimeCollaboration/types.ts +251 -0
  535. package/template/src/reporting/errors.ts +21 -0
  536. package/template/src/reporting/generation.ts +87 -0
  537. package/template/src/reporting/index.ts +42 -0
  538. package/template/src/reporting/model.ts +373 -0
  539. package/template/src/reporting/print.ts +16 -0
  540. package/template/src/reporting/query.ts +50 -0
  541. package/template/src/reporting/react.ts +17 -0
  542. package/template/src/reporting/source.ts +13 -0
  543. package/template/src/reporting/types.ts +219 -0
  544. package/template/src/router/RootRouteLayout.tsx +11 -0
  545. package/template/src/router/authLifecycle.ts +39 -0
  546. package/template/src/router/config.ts +293 -0
  547. package/template/src/router/interceptors.ts +48 -0
  548. package/template/src/router/lazyRouteComponents.ts +78 -0
  549. package/template/src/router/messages.ts +48 -0
  550. package/template/src/router/navigation.ts +167 -0
  551. package/template/src/router/router.ts +66 -0
  552. package/template/src/router/searchSchemas.ts +9 -0
  553. package/template/src/router/types.ts +76 -0
  554. package/template/src/stores/authSessionStorage.ts +27 -0
  555. package/template/src/stores/authStore.ts +165 -0
  556. package/template/src/stores/types.ts +36 -0
  557. package/template/src/stores/uiPreferenceStore.ts +34 -0
  558. package/template/src/styles/index.css +141 -0
  559. package/template/src/styles/theme.css +213 -0
  560. package/template/src/tenantWorkspace/TenantWorkspaceProvider.tsx +102 -0
  561. package/template/src/tenantWorkspace/index.ts +33 -0
  562. package/template/src/tenantWorkspace/store.ts +184 -0
  563. package/template/src/tenantWorkspace/switch.ts +206 -0
  564. package/template/src/tenantWorkspace/types.ts +155 -0
  565. package/template/src/vite-env.d.ts +20 -0
  566. package/template/stylelint.config.js +28 -0
  567. package/template/tests/integration/Application.test.tsx +269 -0
  568. package/template/tests/integration/layout/AppHeader.test.tsx +182 -0
  569. package/template/tests/integration/layout/AppSidebar.test.tsx +121 -0
  570. package/template/tests/integration/layout/__screenshots__/AppHeader.test.tsx/AppHeader-command-search-hides-the-duplicate-header-trigger-when-the-desktop-sidebar-collapses-1.png +0 -0
  571. package/template/tests/integration/router/__screenshots__/config.test.ts/route-tree-authentication-boundaries-exposes-only-scaffold-navigation-metadata-1.png +0 -0
  572. package/template/tests/integration/router/config.test.ts +123 -0
  573. package/template/tests/integration/router/interceptors.test.ts +100 -0
  574. package/template/tests/setup/accessibility.ts +25 -0
  575. package/template/tests/setup/runtimeConfig.ts +3 -0
  576. package/template/tests/unit/api/ApiError.test.ts +25 -0
  577. package/template/tests/unit/api/__screenshots__/authSession.test.ts/administrator-authentication-clears-the-session-if-a-refresh-identity-loses-administrator-access-1.png +0 -0
  578. package/template/tests/unit/api/__screenshots__/authSession.test.ts/administrator-authentication-creates-a-session-from-the-generated-login-response-for-an-admin-1.png +0 -0
  579. package/template/tests/unit/api/__screenshots__/authSession.test.ts/administrator-authentication-rejects-and-revokes-the-generated-login-result-for-an-ordinary-user-1.png +0 -0
  580. package/template/tests/unit/api/activity/ActivityProvider.test.tsx +131 -0
  581. package/template/tests/unit/api/activity/__screenshots__/transports.test.ts/activity-transport-adapters-polls-sequentially-and-advances-the-last-event-ID-1.png +0 -0
  582. package/template/tests/unit/api/activity/modelAndQuery.test.ts +144 -0
  583. package/template/tests/unit/api/activity/subscription.test.ts +103 -0
  584. package/template/tests/unit/api/activity/transports.test.ts +145 -0
  585. package/template/tests/unit/api/authClient.test.ts +110 -0
  586. package/template/tests/unit/api/authSession.test.ts +289 -0
  587. package/template/tests/unit/api/clients/configureApiClient.test.ts +198 -0
  588. package/template/tests/unit/api/demoAuthClient.test.ts +47 -0
  589. package/template/tests/unit/api/enums/access.test.ts +107 -0
  590. package/template/tests/unit/api/enums/catalog.test.ts +200 -0
  591. package/template/tests/unit/api/enums/query.test.ts +110 -0
  592. package/template/tests/unit/api/enums/useEnum.test.tsx +98 -0
  593. package/template/tests/unit/api/enums/useEnumCatalog.test.tsx +68 -0
  594. package/template/tests/unit/api/hooks/error.test.ts +168 -0
  595. package/template/tests/unit/api/hooks/request.test.ts +170 -0
  596. package/template/tests/unit/api/hooks/response.test.ts +46 -0
  597. package/template/tests/unit/api/metadata/MetadataProvider.test.tsx +102 -0
  598. package/template/tests/unit/api/parameters/catalog.test.ts +147 -0
  599. package/template/tests/unit/api/parameters/query.test.ts +78 -0
  600. package/template/tests/unit/api/parameters/useGlobalParameter.test.tsx +89 -0
  601. package/template/tests/unit/api/query/queryPolicy.test.ts +245 -0
  602. package/template/tests/unit/api/query/useAppQueryScope.test.tsx +74 -0
  603. package/template/tests/unit/auditLogs/auditLogHooks.test.tsx +194 -0
  604. package/template/tests/unit/auditLogs/auditLogs.test.ts +199 -0
  605. package/template/tests/unit/authentication/__screenshots__/authentication.test.ts/authentication-controller-completes-Step-up-callbacks-without-creating-a-second-login-result-1.png +0 -0
  606. package/template/tests/unit/authentication/__screenshots__/authentication.test.ts/authentication-controller-moves-from-challenge-to-completion-without-retaining-tokens-in-snapshot-1.png +0 -0
  607. package/template/tests/unit/authentication/authentication.test.ts +376 -0
  608. package/template/tests/unit/components/AppDialog.test.tsx +225 -0
  609. package/template/tests/unit/components/AppTable.test.tsx +129 -0
  610. package/template/tests/unit/components/AppTableLayoutTransition.test.ts +118 -0
  611. package/template/tests/unit/components/AppTableLocalization.test.ts +58 -0
  612. package/template/tests/unit/components/AppTableSensitiveData.test.ts +35 -0
  613. package/template/tests/unit/components/AppTableUpgrade.test.tsx +179 -0
  614. package/template/tests/unit/components/AppTableUpgradeCore.test.ts +258 -0
  615. package/template/tests/unit/components/BrandLogo.test.tsx +24 -0
  616. package/template/tests/unit/components/Can.test.tsx +80 -0
  617. package/template/tests/unit/components/Dialog.test.tsx +56 -0
  618. package/template/tests/unit/components/EnumPresentation.test.tsx +64 -0
  619. package/template/tests/unit/components/FilePreviewEngine.test.ts +51 -0
  620. package/template/tests/unit/components/JsonEditor.test.tsx +47 -0
  621. package/template/tests/unit/components/LocalizedSharedComponents.test.tsx +36 -0
  622. package/template/tests/unit/components/OverlayLayer.test.tsx +151 -0
  623. package/template/tests/unit/components/PageFeedback.test.tsx +143 -0
  624. package/template/tests/unit/components/PageForm.test.tsx +272 -0
  625. package/template/tests/unit/components/PageFormCore.test.ts +74 -0
  626. package/template/tests/unit/components/PasswordInput.test.tsx +105 -0
  627. package/template/tests/unit/components/ScaffoldComponents.test.tsx +64 -0
  628. package/template/tests/unit/components/SensitiveData.test.tsx +151 -0
  629. package/template/tests/unit/components/StatusBadge.test.tsx +36 -0
  630. package/template/tests/unit/components/TableComponent.test.tsx +644 -0
  631. package/template/tests/unit/components/TableCore.test.ts +145 -0
  632. package/template/tests/unit/components/ThemeAccessibility.test.tsx +27 -0
  633. package/template/tests/unit/components/__screenshots__/BatchOperationDialog.test.tsx/confirms-a-batch-action-and-presents-partial-failure-details-1.png +0 -0
  634. package/template/tests/unit/components/__screenshots__/PageForm.test.tsx/PageForm-writes-uploaded-values-through-the-public-file-field-and-resets-dirty-state-1.png +0 -0
  635. package/template/tests/unit/components/__screenshots__/PasswordInput.test.tsx/PasswordInput-toggles-the-password-visibility-when-the-show-password-button-is-clicked-1.png +0 -0
  636. package/template/tests/unit/components/__screenshots__/TableComponent.test.tsx/TableComponent-pins-trailing-action-columns-and-removes-their-header-menu-by-default-1.png +0 -0
  637. package/template/tests/unit/components/__screenshots__/TableComponent.test.tsx/TableComponent-renders-shadcn-components-through-cellComponent-1.png +0 -0
  638. package/template/tests/unit/components/__screenshots__/TableComponent.test.tsx/TableComponent-renders-the-toolbar-without-a-bottom-divider-1.png +0 -0
  639. package/template/tests/unit/components/__screenshots__/TableComponent.test.tsx/TableComponent-resyncs-adaptive-height-after-a-column-resize-changes-wrapped-row-height-1.png +0 -0
  640. package/template/tests/unit/config/RuntimeConfigErrorPage.test.tsx +23 -0
  641. package/template/tests/unit/config/appConfig.test.ts +98 -0
  642. package/template/tests/unit/config/appTableContracts.test.mjs +120 -0
  643. package/template/tests/unit/config/bundleBudget.test.mjs +190 -0
  644. package/template/tests/unit/config/componentGovernance.test.mjs +156 -0
  645. package/template/tests/unit/config/deployConfig.test.mjs +211 -0
  646. package/template/tests/unit/config/eslintConfig.test.mjs +101 -0
  647. package/template/tests/unit/config/featureBoundaries.test.mjs +126 -0
  648. package/template/tests/unit/config/npmPackage.test.mjs +37 -0
  649. package/template/tests/unit/config/releaseArtifact.test.mjs +105 -0
  650. package/template/tests/unit/config/runtimeConfig.test.ts +225 -0
  651. package/template/tests/unit/config/scaffoldCheck.test.mjs +53 -0
  652. package/template/tests/unit/config/scaffoldFeature.test.mjs +177 -0
  653. package/template/tests/unit/config/scaffoldInit.test.mjs +218 -0
  654. package/template/tests/unit/config/scaffoldProject.test.mjs +378 -0
  655. package/template/tests/unit/config/scaffoldTransaction.test.mjs +77 -0
  656. package/template/tests/unit/config/viteConfig.test.mjs +371 -0
  657. package/template/tests/unit/context/ThemeProvider.test.tsx +108 -0
  658. package/template/tests/unit/context/UnsavedChangesProvider.test.tsx +94 -0
  659. package/template/tests/unit/context/__screenshots__/ThemeProvider.test.tsx/ThemeProvider-uses-the-neutral-black-palette-for-the-app-and-scoped-table-theme-1.png +0 -0
  660. package/template/tests/unit/context/applicationScope.test.ts +62 -0
  661. package/template/tests/unit/dataMasking/dataMasking.test.ts +95 -0
  662. package/template/tests/unit/featureFlags/featureFlags.test.ts +169 -0
  663. package/template/tests/unit/featureFlags/useFeatureFlag.test.tsx +108 -0
  664. package/template/tests/unit/features/FeatureLocalization.test.tsx +54 -0
  665. package/template/tests/unit/features/RouteError.test.tsx +40 -0
  666. package/template/tests/unit/features/auth/signIn/UserAuthForm.test.tsx +79 -0
  667. package/template/tests/unit/features/auth/signIn/__screenshots__/UserAuthForm.test.tsx/UserAuthForm-passes-validated-values-to-onSubmit-1.png +0 -0
  668. package/template/tests/unit/features/auth/signIn/__screenshots__/UserAuthForm.test.tsx/UserAuthForm-shows-validation-messages-when-submitting-an-empty-form-1.png +0 -0
  669. package/template/tests/unit/files/fileHooks.test.tsx +130 -0
  670. package/template/tests/unit/files/files.test.ts +112 -0
  671. package/template/tests/unit/lib/accessControl.test.ts +69 -0
  672. package/template/tests/unit/locale/locale.test.tsx +90 -0
  673. package/template/tests/unit/observability/browser.test.ts +48 -0
  674. package/template/tests/unit/observability/observer.test.ts +115 -0
  675. package/template/tests/unit/optionalEditors/__screenshots__/useOptionalEditor.test.tsx/useOptionalEditor-fails-permission-precheck-before-loading-the-project-SDK-1.png +0 -0
  676. package/template/tests/unit/optionalEditors/__screenshots__/useOptionalEditor.test.tsx/useOptionalEditor-mounts-a-route-scoped-SDK-into-the-dedicated-host-with-permission-1.png +0 -0
  677. package/template/tests/unit/optionalEditors/optionalEditors.test.ts +313 -0
  678. package/template/tests/unit/optionalEditors/useOptionalEditor.test.tsx +141 -0
  679. package/template/tests/unit/realtimeCollaboration/collaboration.test.ts +240 -0
  680. package/template/tests/unit/realtimeCollaboration/useRealtimeCollaboration.test.tsx +115 -0
  681. package/template/tests/unit/reporting/reporting.test.ts +195 -0
  682. package/template/tests/unit/reporting/reportingHooks.test.tsx +203 -0
  683. package/template/tests/unit/router/authLifecycle.test.ts +55 -0
  684. package/template/tests/unit/router/navigation.test.ts +55 -0
  685. package/template/tests/unit/router/redirects.test.ts +22 -0
  686. package/template/tests/unit/scaffoldFeatureTemplate/featureTemplate.test.ts +42 -0
  687. package/template/tests/unit/scaffoldFeatureTemplate/publicContract.test.ts +28 -0
  688. package/template/tests/unit/scaffoldFeatureTemplate/queries.test.tsx +289 -0
  689. package/template/tests/unit/stores/authStore.test.ts +128 -0
  690. package/template/tests/unit/stores/uiPreferenceStore.test.ts +56 -0
  691. package/template/tests/unit/tenantWorkspace/tenantWorkspace.test.tsx +261 -0
  692. package/template/tools/bundle/budgets.json +48 -0
  693. package/template/tools/bundle/check.mjs +307 -0
  694. package/template/tools/component-governance/check.mjs +703 -0
  695. package/template/tools/component-governance/manifest.json +112 -0
  696. package/template/tools/deployment/browser-smoke.mjs +76 -0
  697. package/template/tools/deployment/browser-smoke.sh +141 -0
  698. package/template/tools/openapi/generate.mjs +268 -0
  699. package/template/tools/openapi/templates/README.md +14 -0
  700. package/template/tools/openapi/templates/base/README.md +7 -0
  701. package/template/tools/openapi/templates/base/data-contracts.eta +44 -0
  702. package/template/tools/openapi/templates/base/http-client.eta +3 -0
  703. package/template/tools/openapi/templates/base/http-clients/axios-http-client.eta +132 -0
  704. package/template/tools/openapi/templates/base/http-clients/fetch-http-client.eta +220 -0
  705. package/template/tools/openapi/templates/base/route-docs.eta +31 -0
  706. package/template/tools/openapi/templates/base/route-name.eta +43 -0
  707. package/template/tools/openapi/templates/base/route-type.eta +22 -0
  708. package/template/tools/openapi/templates/default/README.md +7 -0
  709. package/template/tools/openapi/templates/default/api.eta +67 -0
  710. package/template/tools/openapi/templates/default/http-client.eta +137 -0
  711. package/template/tools/openapi/templates/default/procedure-call.eta +99 -0
  712. package/template/tools/openapi/templates/default/route-docs.eta +40 -0
  713. package/template/tools/openapi/templates/default/route-types.eta +28 -0
  714. package/template/tools/openapi/templates/modular/README.md +7 -0
  715. package/template/tools/openapi/templates/modular/api.eta +28 -0
  716. package/template/tools/openapi/templates/modular/procedure-call.eta +99 -0
  717. package/template/tools/openapi/templates/modular/route-types.eta +18 -0
  718. package/template/tools/release/artifact.mjs +258 -0
  719. package/template/tools/scaffold/add-capability.mjs +409 -0
  720. package/template/tools/scaffold/capability-catalog.json +163 -0
  721. package/template/tools/scaffold/check.mjs +326 -0
  722. package/template/tools/scaffold/create-feature.mjs +444 -0
  723. package/template/tools/scaffold/create-project.mjs +482 -0
  724. package/template/tools/scaffold/init.example.json +64 -0
  725. package/template/tools/scaffold/init.mjs +419 -0
  726. package/template/tools/scaffold/lockfile.mjs +193 -0
  727. package/template/tools/scaffold/templates/feature/index.ts +19 -0
  728. package/template/tools/scaffold/templates/feature/model.ts +142 -0
  729. package/template/tools/scaffold/templates/feature/queries.ts +154 -0
  730. package/template/tools/scaffold/templates/feature/repository.ts +206 -0
  731. package/template/tools/scaffold/templates/feature/types.ts +168 -0
  732. package/template/tools/scaffold/workspace-transaction.mjs +111 -0
  733. package/template/tsconfig.app.json +31 -0
  734. package/template/tsconfig.json +12 -0
  735. package/template/tsconfig.node.json +24 -0
  736. package/template/vite.config.ts +121 -0
@@ -0,0 +1,142 @@
1
+ import { z } from 'zod'
2
+ import { ApiError } from '@/api'
3
+ import type {
4
+ ITemplateRecord,
5
+ ITemplateRecordDto,
6
+ ITemplateRecordListInput,
7
+ ITemplateRecordPage,
8
+ ITemplateRecordPageDto,
9
+ ITemplateRecordUpdateInput,
10
+ } from './types'
11
+
12
+ const objTemplateRecordDtoSchema = z.object({
13
+ enabled: z.boolean(),
14
+ id: z.string().trim().min(1),
15
+ name: z.string().trim().min(1),
16
+ revision: z.number().int().nonnegative(),
17
+ })
18
+
19
+ const objTemplateRecordPageDtoSchema = z.object({
20
+ items: z.array(objTemplateRecordDtoSchema),
21
+ total: z.number().int().nonnegative(),
22
+ })
23
+
24
+ const objTemplateRecordSchema = z.object({
25
+ bIsEnabled: z.boolean(),
26
+ nRevision: z.number().int().nonnegative(),
27
+ strId: z.string().trim().min(1),
28
+ strName: z.string().trim().min(1),
29
+ })
30
+
31
+ const objTemplateRecordListInputSchema = z.object({
32
+ nPage: z.number().int().min(1),
33
+ nPageSize: z.number().int().min(1).max(100),
34
+ strKeyword: z.string().trim().min(1).optional(),
35
+ })
36
+
37
+ const objTemplateRecordUpdateInputSchema = z.object({
38
+ nExpectedRevision: z.number().int().nonnegative(),
39
+ objChanges: z
40
+ .object({
41
+ bIsEnabled: z.boolean().optional(),
42
+ strName: z.string().trim().min(1).optional(),
43
+ })
44
+ .refine(
45
+ (objChanges) =>
46
+ objChanges.bIsEnabled !== undefined || objChanges.strName !== undefined,
47
+ '至少需要修改一个字段。'
48
+ ),
49
+ strRecordId: z.string().trim().min(1),
50
+ })
51
+
52
+ function fnCreateInvalidTemplateResponseError(strResource: string) {
53
+ return new ApiError({
54
+ bRetriable: false,
55
+ strCode: 'TEMPLATE_INVALID_RESPONSE',
56
+ strKind: 'invalid_response',
57
+ strMessage: `${strResource}接口返回了不符合 Feature 契约的数据。`,
58
+ })
59
+ }
60
+
61
+ /** 规范化记录标识,确保 Query Key 与 Repository 请求使用同一个值。 */
62
+ export function fnNormalizeTemplateRecordId(strRecordId: string) {
63
+ const objResult = z.string().trim().min(1).safeParse(strRecordId)
64
+ if (!objResult.success) {
65
+ throw new TypeError('记录标识不能为空。')
66
+ }
67
+ return objResult.data
68
+ }
69
+
70
+ /** 校验并将生成客户端 DTO 映射为 Feature 领域记录。 */
71
+ export function fnMapTemplateRecordDto(
72
+ objDto: ITemplateRecordDto
73
+ ): ITemplateRecord {
74
+ const objResult = objTemplateRecordDtoSchema.safeParse(objDto)
75
+ if (!objResult.success) {
76
+ throw fnCreateInvalidTemplateResponseError('记录详情')
77
+ }
78
+
79
+ const objRecord: ITemplateRecord = {
80
+ bIsEnabled: objResult.data.enabled,
81
+ nRevision: objResult.data.revision,
82
+ strId: objResult.data.id,
83
+ strName: objResult.data.name,
84
+ }
85
+ return Object.freeze(objRecord)
86
+ }
87
+
88
+ /** 校验并将生成客户端分页 DTO 映射为 Feature 领域分页结果。 */
89
+ export function fnMapTemplateRecordPageDto(
90
+ objDto: ITemplateRecordPageDto
91
+ ): ITemplateRecordPage {
92
+ const objResult = objTemplateRecordPageDtoSchema.safeParse(objDto)
93
+ if (!objResult.success) {
94
+ throw fnCreateInvalidTemplateResponseError('记录列表')
95
+ }
96
+
97
+ const arrRecords = objResult.data.items.map(fnMapTemplateRecordDto)
98
+ return Object.freeze({
99
+ arrRecords: Object.freeze(arrRecords),
100
+ nTotal: objResult.data.total,
101
+ })
102
+ }
103
+
104
+ /** 校验并冻结 Demo Adapter 的领域记录。 */
105
+ export function fnNormalizeTemplateRecord(
106
+ objRecord: ITemplateRecord
107
+ ): ITemplateRecord {
108
+ const objResult = objTemplateRecordSchema.safeParse(objRecord)
109
+ if (!objResult.success) {
110
+ throw new TypeError('Demo 记录必须包含有效标识、名称、状态和版本。')
111
+ }
112
+ return Object.freeze(objResult.data)
113
+ }
114
+
115
+ /** 规范化列表分页与空白关键字。 */
116
+ export function fnNormalizeTemplateRecordListInput(
117
+ objInput: ITemplateRecordListInput
118
+ ): ITemplateRecordListInput {
119
+ const strKeyword = objInput.strKeyword?.trim() || undefined
120
+ const objResult = objTemplateRecordListInputSchema.safeParse({
121
+ ...objInput,
122
+ strKeyword,
123
+ })
124
+ if (!objResult.success) {
125
+ throw new TypeError('列表页码必须有效,且每页记录数必须在 1 到 100 之间。')
126
+ }
127
+ return Object.freeze(objResult.data)
128
+ }
129
+
130
+ /** 规范化更新命令并确保至少修改一个字段。 */
131
+ export function fnNormalizeTemplateRecordUpdateInput(
132
+ objInput: ITemplateRecordUpdateInput
133
+ ): ITemplateRecordUpdateInput {
134
+ const objResult = objTemplateRecordUpdateInputSchema.safeParse(objInput)
135
+ if (!objResult.success) {
136
+ throw new TypeError('更新命令必须包含有效记录、版本和至少一个修改字段。')
137
+ }
138
+ return Object.freeze({
139
+ ...objResult.data,
140
+ objChanges: Object.freeze(objResult.data.objChanges),
141
+ })
142
+ }
@@ -0,0 +1,154 @@
1
+ import { useMemo } from 'react'
2
+ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
3
+ import {
4
+ fnApplyOptimisticQueryUpdate,
5
+ fnCreateAppMutationScope,
6
+ fnCreateAppQueryKeys,
7
+ fnRollbackOptimisticQueryUpdate,
8
+ useAppQueryScope,
9
+ type IAppQueryRollbackSnapshot,
10
+ } from '@/api/query'
11
+ import {
12
+ fnNormalizeTemplateRecordId,
13
+ fnNormalizeTemplateRecordListInput,
14
+ fnNormalizeTemplateRecordUpdateInput,
15
+ } from './model'
16
+ import { fnResolveTemplateRecordFeature } from './repository'
17
+ import type {
18
+ ITemplateRecord,
19
+ ITemplateRecordUpdateCommand,
20
+ IUseTemplateRecordDetailOptions,
21
+ IUseTemplateRecordListOptions,
22
+ IUseUpdateTemplateRecordOptions,
23
+ } from './types'
24
+
25
+ const strFeatureKey = 'featureTemplate'
26
+ const strRecordResourceKey = 'records'
27
+
28
+ function useTemplateRecordKeys(strWorkspaceId: string | undefined) {
29
+ const objScope = useAppQueryScope({ strWorkspaceId })
30
+ return useMemo(
31
+ () => fnCreateAppQueryKeys(strFeatureKey, objScope),
32
+ [objScope]
33
+ )
34
+ }
35
+
36
+ /** 使用统一作用域读取中性记录列表,最终授权由后端负责。 */
37
+ export function useTemplateRecordList({
38
+ objInput,
39
+ objFeature,
40
+ strWorkspaceId,
41
+ }: IUseTemplateRecordListOptions) {
42
+ const { objRepository } = fnResolveTemplateRecordFeature(objFeature)
43
+ const objKeys = useTemplateRecordKeys(strWorkspaceId)
44
+ const { nPage, nPageSize, strKeyword } = objInput
45
+ const objNormalizedInput = useMemo(
46
+ () =>
47
+ fnNormalizeTemplateRecordListInput({
48
+ nPage,
49
+ nPageSize,
50
+ strKeyword,
51
+ }),
52
+ [nPage, nPageSize, strKeyword]
53
+ )
54
+
55
+ return useQuery({
56
+ queryKey: objKeys.fnList(strRecordResourceKey, {
57
+ nPage: objNormalizedInput.nPage,
58
+ nPageSize: objNormalizedInput.nPageSize,
59
+ ...(objNormalizedInput.strKeyword
60
+ ? { strKeyword: objNormalizedInput.strKeyword }
61
+ : {}),
62
+ }),
63
+ queryFn: ({ signal: objSignal }) =>
64
+ objRepository.fnList(objNormalizedInput, objSignal),
65
+ })
66
+ }
67
+
68
+ /** 使用统一作用域读取一条中性记录详情,最终授权由后端负责。 */
69
+ export function useTemplateRecordDetail({
70
+ objFeature,
71
+ strRecordId,
72
+ strWorkspaceId,
73
+ }: IUseTemplateRecordDetailOptions) {
74
+ const { objRepository } = fnResolveTemplateRecordFeature(objFeature)
75
+ const objKeys = useTemplateRecordKeys(strWorkspaceId)
76
+ const strNormalizedRecordId = fnNormalizeTemplateRecordId(strRecordId)
77
+
78
+ return useQuery({
79
+ queryKey: objKeys.fnDetail(strRecordResourceKey, strNormalizedRecordId),
80
+ queryFn: ({ signal: objSignal }) =>
81
+ objRepository.fnGet(strNormalizedRecordId, objSignal),
82
+ })
83
+ }
84
+
85
+ /** 更新一条记录,并演示详情乐观回滚、串行写入和列表失效。 */
86
+ export function useUpdateTemplateRecord({
87
+ objFeature,
88
+ strRecordId,
89
+ strWorkspaceId,
90
+ }: IUseUpdateTemplateRecordOptions) {
91
+ const { objRepository } = fnResolveTemplateRecordFeature(objFeature)
92
+ const objQueryClient = useQueryClient()
93
+ const objKeys = useTemplateRecordKeys(strWorkspaceId)
94
+ const strNormalizedRecordId = fnNormalizeTemplateRecordId(strRecordId)
95
+ const arrDetailKey = objKeys.fnDetail(
96
+ strRecordResourceKey,
97
+ strNormalizedRecordId
98
+ )
99
+
100
+ return useMutation<
101
+ ITemplateRecord,
102
+ Error,
103
+ ITemplateRecordUpdateCommand,
104
+ IAppQueryRollbackSnapshot<ITemplateRecord> | null
105
+ >({
106
+ mutationFn: (objCommand: ITemplateRecordUpdateCommand) =>
107
+ objRepository.fnUpdate(
108
+ fnNormalizeTemplateRecordUpdateInput({
109
+ ...objCommand,
110
+ strRecordId: strNormalizedRecordId,
111
+ })
112
+ ),
113
+ scope: fnCreateAppMutationScope(arrDetailKey),
114
+ onMutate: async (objCommand) => {
115
+ const objCurrentRecord =
116
+ objQueryClient.getQueryData<ITemplateRecord>(arrDetailKey)
117
+ if (!objCurrentRecord) return null
118
+
119
+ const objNormalizedInput = fnNormalizeTemplateRecordUpdateInput({
120
+ ...objCommand,
121
+ strRecordId: strNormalizedRecordId,
122
+ })
123
+ return fnApplyOptimisticQueryUpdate<ITemplateRecord>(
124
+ objQueryClient,
125
+ arrDetailKey,
126
+ (objRecord) =>
127
+ Object.freeze({
128
+ ...(objRecord ?? objCurrentRecord),
129
+ ...objNormalizedInput.objChanges,
130
+ nRevision: objNormalizedInput.nExpectedRevision + 1,
131
+ })
132
+ )
133
+ },
134
+ onError: (_objError, _objCommand, objSnapshot) => {
135
+ if (objSnapshot) {
136
+ fnRollbackOptimisticQueryUpdate(objQueryClient, objSnapshot)
137
+ }
138
+ },
139
+ onSuccess: (objRecord) => {
140
+ objQueryClient.setQueryData(arrDetailKey, objRecord)
141
+ },
142
+ onSettled: async () => {
143
+ await Promise.all([
144
+ objQueryClient.invalidateQueries({
145
+ exact: true,
146
+ queryKey: arrDetailKey,
147
+ }),
148
+ objQueryClient.invalidateQueries({
149
+ queryKey: objKeys.fnLists(strRecordResourceKey),
150
+ }),
151
+ ])
152
+ },
153
+ })
154
+ }
@@ -0,0 +1,206 @@
1
+ import { ApiError } from '@/api'
2
+ import {
3
+ fnMapTemplateRecordDto,
4
+ fnMapTemplateRecordPageDto,
5
+ fnNormalizeTemplateRecord,
6
+ fnNormalizeTemplateRecordId,
7
+ fnNormalizeTemplateRecordListInput,
8
+ fnNormalizeTemplateRecordUpdateInput,
9
+ } from './model'
10
+ import {
11
+ objTemplateRecordFeatureBrand,
12
+ type IConnectedTemplateRecordSource,
13
+ type ICreateTemplateRecordFeatureOptions,
14
+ type ICreateTemplateRecordRepositoryOptions,
15
+ type ITemplateRecord,
16
+ type ITemplateRecordFeature,
17
+ type ITemplateRecordRepository,
18
+ } from './types'
19
+
20
+ const arrDefaultDemoRecords: readonly ITemplateRecord[] = Object.freeze([
21
+ Object.freeze({
22
+ bIsEnabled: true,
23
+ nRevision: 0,
24
+ strId: 'record-1',
25
+ strName: '示例记录',
26
+ }),
27
+ ])
28
+
29
+ function fnCreateTemplateRecordNotFoundError(strRecordId: string) {
30
+ return new ApiError({
31
+ bRetriable: false,
32
+ nStatus: 404,
33
+ strCode: 'TEMPLATE_RECORD_NOT_FOUND',
34
+ strKind: 'http',
35
+ strMessage: `未找到记录 ${strRecordId}。`,
36
+ })
37
+ }
38
+
39
+ function fnCreateTemplateRecordConflictError(strRecordId: string) {
40
+ return new ApiError({
41
+ bRetriable: false,
42
+ nStatus: 409,
43
+ strCode: 'TEMPLATE_RECORD_CONFLICT',
44
+ strKind: 'http',
45
+ strMessage: `记录 ${strRecordId} 已被其他操作更新,请刷新后重试。`,
46
+ })
47
+ }
48
+
49
+ function fnCreateDemoTemplateRecordRepository(
50
+ arrInitialRecords: readonly ITemplateRecord[]
51
+ ): ITemplateRecordRepository {
52
+ let arrRecords = arrInitialRecords.map(fnNormalizeTemplateRecord)
53
+
54
+ const objRepository: ITemplateRecordRepository = {
55
+ fnGet: async (strRecordId, objSignal) => {
56
+ objSignal.throwIfAborted()
57
+ const strNormalizedRecordId = fnNormalizeTemplateRecordId(strRecordId)
58
+ const objRecord = arrRecords.find(
59
+ (objCandidate) => objCandidate.strId === strNormalizedRecordId
60
+ )
61
+ if (!objRecord) {
62
+ throw fnCreateTemplateRecordNotFoundError(strNormalizedRecordId)
63
+ }
64
+ return objRecord
65
+ },
66
+ fnList: async (objInput, objSignal) => {
67
+ objSignal.throwIfAborted()
68
+ const objNormalizedInput = fnNormalizeTemplateRecordListInput(objInput)
69
+ const strKeyword = objNormalizedInput.strKeyword?.toLocaleLowerCase()
70
+ const arrFilteredRecords = strKeyword
71
+ ? arrRecords.filter((objRecord) =>
72
+ objRecord.strName.toLocaleLowerCase().includes(strKeyword)
73
+ )
74
+ : arrRecords
75
+ const nStart =
76
+ (objNormalizedInput.nPage - 1) * objNormalizedInput.nPageSize
77
+ return Object.freeze({
78
+ arrRecords: Object.freeze(
79
+ arrFilteredRecords.slice(
80
+ nStart,
81
+ nStart + objNormalizedInput.nPageSize
82
+ )
83
+ ),
84
+ nTotal: arrFilteredRecords.length,
85
+ })
86
+ },
87
+ fnUpdate: async (objInput) => {
88
+ const objNormalizedInput = fnNormalizeTemplateRecordUpdateInput(objInput)
89
+ const nRecordIndex = arrRecords.findIndex(
90
+ (objRecord) => objRecord.strId === objNormalizedInput.strRecordId
91
+ )
92
+ const objCurrentRecord = arrRecords[nRecordIndex]
93
+ if (!objCurrentRecord) {
94
+ throw fnCreateTemplateRecordNotFoundError(
95
+ objNormalizedInput.strRecordId
96
+ )
97
+ }
98
+ if (objCurrentRecord.nRevision !== objNormalizedInput.nExpectedRevision) {
99
+ throw fnCreateTemplateRecordConflictError(
100
+ objNormalizedInput.strRecordId
101
+ )
102
+ }
103
+
104
+ const objUpdatedRecord = fnNormalizeTemplateRecord({
105
+ ...objCurrentRecord,
106
+ ...objNormalizedInput.objChanges,
107
+ nRevision: objCurrentRecord.nRevision + 1,
108
+ })
109
+ arrRecords = arrRecords.map((objRecord, nIndex) =>
110
+ nIndex === nRecordIndex ? objUpdatedRecord : objRecord
111
+ )
112
+ return objUpdatedRecord
113
+ },
114
+ }
115
+ return Object.freeze(objRepository)
116
+ }
117
+
118
+ function fnCreateConnectedTemplateRecordRepository(
119
+ objSource: IConnectedTemplateRecordSource
120
+ ): ITemplateRecordRepository {
121
+ const objRepository: ITemplateRecordRepository = {
122
+ fnGet: async (strRecordId, objSignal) =>
123
+ fnMapTemplateRecordDto(
124
+ await objSource.fnGet(
125
+ fnNormalizeTemplateRecordId(strRecordId),
126
+ objSignal
127
+ )
128
+ ),
129
+ fnList: async (objInput, objSignal) =>
130
+ fnMapTemplateRecordPageDto(
131
+ await objSource.fnList(
132
+ fnNormalizeTemplateRecordListInput(objInput),
133
+ objSignal
134
+ )
135
+ ),
136
+ fnUpdate: async (objInput) =>
137
+ fnMapTemplateRecordDto(
138
+ await objSource.fnUpdate(fnNormalizeTemplateRecordUpdateInput(objInput))
139
+ ),
140
+ }
141
+ return Object.freeze(objRepository)
142
+ }
143
+
144
+ /** 按运行时模式选择 Demo 或 Connected Adapter,不允许静默回退。 */
145
+ function fnCreateTemplateRecordRepository({
146
+ arrDemoRecords = arrDefaultDemoRecords,
147
+ objConnectedSource,
148
+ strMode,
149
+ }: ICreateTemplateRecordRepositoryOptions): ITemplateRecordRepository {
150
+ if (strMode === 'demo') {
151
+ return fnCreateDemoTemplateRecordRepository(arrDemoRecords)
152
+ }
153
+ if (!objConnectedSource) {
154
+ throw new TypeError('Connected 模式必须配置 Swagger 生成客户端数据源。')
155
+ }
156
+ return fnCreateConnectedTemplateRecordRepository(objConnectedSource)
157
+ }
158
+
159
+ class TemplateRecordFeature implements ITemplateRecordFeature {
160
+ readonly [objTemplateRecordFeatureBrand] = () => undefined
161
+
162
+ constructor(
163
+ readonly objRepository: ITemplateRecordRepository,
164
+ readonly strReadPermission: string,
165
+ readonly strWritePermission: string
166
+ ) {}
167
+ }
168
+
169
+ function fnNormalizePermission(strPermission: string, strFieldName: string) {
170
+ const strNormalizedPermission = strPermission.trim()
171
+ if (!strNormalizedPermission) {
172
+ throw new TypeError(`${strFieldName} 不能为空。`)
173
+ }
174
+ return strNormalizedPermission
175
+ }
176
+
177
+ /** 一次性组合数据 Adapter 与权限策略,页面不再重复了解这些细节。 */
178
+ export function fnCreateTemplateRecordFeature({
179
+ arrDemoRecords,
180
+ objConnectedSource,
181
+ strMode,
182
+ strReadPermission,
183
+ strWritePermission,
184
+ }: ICreateTemplateRecordFeatureOptions): ITemplateRecordFeature {
185
+ return Object.freeze(
186
+ new TemplateRecordFeature(
187
+ fnCreateTemplateRecordRepository({
188
+ arrDemoRecords,
189
+ objConnectedSource,
190
+ strMode,
191
+ }),
192
+ fnNormalizePermission(strReadPermission, 'strReadPermission'),
193
+ fnNormalizePermission(strWritePermission, 'strWritePermission')
194
+ )
195
+ )
196
+ }
197
+
198
+ /** 仅供 Feature 内部 Query implementation 读取已组合的运行依赖。 */
199
+ export function fnResolveTemplateRecordFeature(
200
+ objFeature: ITemplateRecordFeature
201
+ ) {
202
+ if (!(objFeature instanceof TemplateRecordFeature)) {
203
+ throw new TypeError('必须使用 fnCreateTemplateRecordFeature 创建 Feature。')
204
+ }
205
+ return objFeature
206
+ }
@@ -0,0 +1,168 @@
1
+ /** Swagger 客户端返回的中性记录 DTO;字段名保持后端数据契约。 */
2
+ export interface ITemplateRecordDto {
3
+ /** 后端生成的稳定实体标识。 */
4
+ id?: string
5
+ /** 面向用户展示的记录名称。 */
6
+ name?: string
7
+ /** 记录当前是否启用。 */
8
+ enabled?: boolean
9
+ /** 服务端并发控制版本。 */
10
+ revision?: number
11
+ }
12
+
13
+ /** Swagger 客户端返回的中性记录分页 DTO。 */
14
+ export interface ITemplateRecordPageDto {
15
+ /** 当前页的原始记录。 */
16
+ items?: readonly ITemplateRecordDto[]
17
+ /** 当前筛选条件下的记录总数。 */
18
+ total?: number
19
+ }
20
+
21
+ /** Feature 内部使用、与传输格式解耦的中性领域记录。 */
22
+ export interface ITemplateRecord {
23
+ /** 当前记录是否启用。 */
24
+ readonly bIsEnabled: boolean
25
+ /** 服务端并发控制版本。 */
26
+ readonly nRevision: number
27
+ /** 稳定实体标识。 */
28
+ readonly strId: string
29
+ /** 已去除首尾空白的展示名称。 */
30
+ readonly strName: string
31
+ }
32
+
33
+ /** Feature 列表使用的领域分页结果。 */
34
+ export interface ITemplateRecordPage {
35
+ /** 当前页经过校验和映射的记录。 */
36
+ readonly arrRecords: readonly ITemplateRecord[]
37
+ /** 当前筛选条件下的记录总数。 */
38
+ readonly nTotal: number
39
+ }
40
+
41
+ /** 中性记录列表查询输入。 */
42
+ export interface ITemplateRecordListInput {
43
+ /** 从 `1` 开始的页码。 */
44
+ readonly nPage: number
45
+ /** 每页记录数,允许 `1` 到 `100`。 */
46
+ readonly nPageSize: number
47
+ /** 可选名称关键字;空白文本按未提供处理。 */
48
+ readonly strKeyword?: string
49
+ }
50
+
51
+ /** 一次记录更新允许修改的字段。 */
52
+ export interface ITemplateRecordChanges {
53
+ /** 更新后的启用状态;未提供时保持原值。 */
54
+ readonly bIsEnabled?: boolean
55
+ /** 更新后的名称;未提供时保持原值。 */
56
+ readonly strName?: string
57
+ }
58
+
59
+ /** UI 触发更新 Mutation 时提交的命令。 */
60
+ export interface ITemplateRecordUpdateCommand {
61
+ /** 用户开始编辑时读取的服务端版本。 */
62
+ readonly nExpectedRevision: number
63
+ /** 本次明确修改的字段,至少包含一项。 */
64
+ readonly objChanges: ITemplateRecordChanges
65
+ }
66
+
67
+ /** Repository 接收的完整记录更新输入。 */
68
+ export interface ITemplateRecordUpdateInput extends ITemplateRecordUpdateCommand {
69
+ /** 需要更新的稳定记录标识。 */
70
+ readonly strRecordId: string
71
+ }
72
+
73
+ /** Feature 依赖的最小数据访问契约。 */
74
+ export interface ITemplateRecordRepository {
75
+ /** 按稳定标识读取详情,并响应 Query 的取消信号。 */
76
+ readonly fnGet: (
77
+ strRecordId: string,
78
+ objSignal: AbortSignal
79
+ ) => Promise<ITemplateRecord>
80
+ /** 按筛选和分页条件读取列表,并响应 Query 的取消信号。 */
81
+ readonly fnList: (
82
+ objInput: ITemplateRecordListInput,
83
+ objSignal: AbortSignal
84
+ ) => Promise<ITemplateRecordPage>
85
+ /** 更新一条记录;服务端负责最终版本检查和授权。 */
86
+ readonly fnUpdate: (
87
+ objInput: ITemplateRecordUpdateInput
88
+ ) => Promise<ITemplateRecord>
89
+ }
90
+
91
+ /** Connected Adapter 由 Swagger 生成客户端实现的数据源。 */
92
+ export interface IConnectedTemplateRecordSource {
93
+ /** 调用生成客户端的详情接口并原样返回 DTO。 */
94
+ readonly fnGet: (
95
+ strRecordId: string,
96
+ objSignal: AbortSignal
97
+ ) => Promise<ITemplateRecordDto>
98
+ /** 调用生成客户端的列表接口并原样返回分页 DTO。 */
99
+ readonly fnList: (
100
+ objInput: ITemplateRecordListInput,
101
+ objSignal: AbortSignal
102
+ ) => Promise<ITemplateRecordPageDto>
103
+ /** 调用生成客户端的更新接口并返回服务端最终 DTO。 */
104
+ readonly fnUpdate: (
105
+ objInput: ITemplateRecordUpdateInput
106
+ ) => Promise<ITemplateRecordDto>
107
+ }
108
+
109
+ /** 根据运行模式创建中性 Feature Repository 的配置。 */
110
+ export interface ICreateTemplateRecordRepositoryOptions {
111
+ /** Demo Adapter 的初始领域记录;省略时使用中性示例数据。 */
112
+ readonly arrDemoRecords?: readonly ITemplateRecord[]
113
+ /** Connected 模式必填的生成客户端数据源。 */
114
+ readonly objConnectedSource?: IConnectedTemplateRecordSource
115
+ /** 与应用运行时配置一致的数据模式。 */
116
+ readonly strMode: 'connected' | 'demo'
117
+ }
118
+
119
+ /** 由 Feature 组合点创建、页面只能透传的不可伪造运行实例标记。 */
120
+ export const objTemplateRecordFeatureBrand = Symbol('TemplateRecordFeature')
121
+
122
+ /**
123
+ * 已完成 Adapter、权限和缓存策略组合的 Feature 运行实例。
124
+ *
125
+ * 页面只持有并传递该实例,不读取 Repository 或权限配置。
126
+ */
127
+ export interface ITemplateRecordFeature {
128
+ /** 阻止页面用普通对象绕过 Feature 组合点。 */
129
+ readonly [objTemplateRecordFeatureBrand]: () => void
130
+ }
131
+
132
+ /** 创建 Feature 运行实例时一次性声明的项目接入配置。 */
133
+ export interface ICreateTemplateRecordFeatureOptions extends ICreateTemplateRecordRepositoryOptions {
134
+ /** 列表和详情读取使用的稳定权限码。 */
135
+ readonly strReadPermission: string
136
+ /** 更新记录使用的稳定权限码。 */
137
+ readonly strWritePermission: string
138
+ }
139
+
140
+ /** 中性记录列表 Query Hook 的配置。 */
141
+ export interface IUseTemplateRecordListOptions {
142
+ /** 当前分页和筛选条件。 */
143
+ readonly objInput: ITemplateRecordListInput
144
+ /** 应用组合点创建的 Feature 运行实例。 */
145
+ readonly objFeature: ITemplateRecordFeature
146
+ /** 可选的组织、项目或工作空间二级缓存作用域。 */
147
+ readonly strWorkspaceId?: string
148
+ }
149
+
150
+ /** 中性记录详情 Query Hook 的配置。 */
151
+ export interface IUseTemplateRecordDetailOptions {
152
+ /** 应用组合点创建的 Feature 运行实例。 */
153
+ readonly objFeature: ITemplateRecordFeature
154
+ /** 需要读取的稳定记录标识。 */
155
+ readonly strRecordId: string
156
+ /** 可选的组织、项目或工作空间二级缓存作用域。 */
157
+ readonly strWorkspaceId?: string
158
+ }
159
+
160
+ /** 中性记录更新 Mutation Hook 的配置。 */
161
+ export interface IUseUpdateTemplateRecordOptions {
162
+ /** 应用组合点创建的 Feature 运行实例。 */
163
+ readonly objFeature: ITemplateRecordFeature
164
+ /** 需要更新的稳定记录标识。 */
165
+ readonly strRecordId: string
166
+ /** 可选的组织、项目或工作空间二级缓存作用域。 */
167
+ readonly strWorkspaceId?: string
168
+ }