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,219 @@
1
+ # SSO、MFA 与 Step-up 认证 Adapter
2
+
3
+ P2-01 为企业项目提供供应商无关的认证编排边界。默认 core 保留现有账号密码登录、Token
4
+ 刷新、权限快照、退出撤销和路由失效生命周期;需要 OIDC、SAML 网关、企业统一身份、MFA
5
+ 或敏感操作 Step-up 时,先添加 `advancedAuthentication` 能力,再通过生成客户端 Adapter
6
+ 接入。
7
+
8
+ ```bash
9
+ pnpm scaffold:add --target <项目目录> --capability advancedAuthentication
10
+ ```
11
+
12
+ 它不内置某个身份供应商 SDK、登录按钮、回调地址或 MFA 页面。没有真实项目配置时,不把
13
+ 协议依赖、供应商品牌或业务权限码放进默认首屏。
14
+
15
+ ## 责任边界
16
+
17
+ | 层级 | 负责内容 |
18
+ | ----------------------- | ---------------------------------------------------------------- |
19
+ | 身份服务/后端 | 协议交换、state/nonce/PKCE 校验、MFA、租户和账号授权、会话与审计 |
20
+ | 生成客户端 Adapter | 将 OpenAPI DTO 映射为 redirect/challenge/complete 稳定结果 |
21
+ | `authentication` 控制器 | 竞态取消、状态编排、跳转白名单、完成结果即时消费和安全错误 |
22
+ | 应用认证会话 | Token 生命周期、用户权限快照、刷新、退出、缓存和路由失效 |
23
+ | 登录/回调/挑战 Feature | 展示、表单、焦点、错误反馈和站内安全导航 |
24
+
25
+ 前端隐藏按钮和路由守卫不是授权。后端必须对登录、回调、挑战验证、Step-up 目标操作和跨租户资源
26
+ 重新授权。推荐由服务端会话承载 Step-up 结果;必须返回短期证明时,它只能进入紧随其后的目标
27
+ 请求,不能进入 URL、Store、本地存储、日志、监控或错误文案。
28
+
29
+ ## 公共入口
30
+
31
+ 从 `@/authentication` 导入:
32
+
33
+ - `fnCreateAuthenticationController()`:统一编排登录、回调、MFA 和 Step-up。
34
+ - `fnResolveAuthenticationRedirect()`:校验 HTTP(S)、凭据、Fragment 和 Origin 白名单。
35
+ - `IAuthenticationAdapter`:由 Feature 使用生成客户端实现的协议边界。
36
+ - `TAuthenticationAdapterResult`:`redirect`、`challenge`、`complete` 互斥结果。
37
+ - `TAuthenticationCompletion`:登录 Token 结果或 Step-up 短期授权。
38
+ - `AuthenticationError`:不包含协议参数、Token 或挑战响应的稳定错误。
39
+
40
+ `fnCreateAuthenticationController()` 的返回值已经保留完整类型推导,业务通常不需要显式导入
41
+ 控制器、快照和启动参数等叶子类型。
42
+
43
+ ## 生成客户端 Adapter
44
+
45
+ `swagger-typescript-api` 生成目录只保存后端契约,不能手工修改。Feature 在生成客户端之上
46
+ 做一次窄映射,页面和控制器不判断 OIDC、SAML 或供应商响应字段:
47
+
48
+ ```ts
49
+ const objAuthenticationAdapter: IAuthenticationAdapter = {
50
+ async fnStart(objInput, { objSignal }) {
51
+ const objResponse = await objGeneratedAuthApi.authentication.start(
52
+ {
53
+ actionKey:
54
+ objInput.strPurpose === 'stepUp'
55
+ ? objInput.strActionKey
56
+ : undefined,
57
+ providerKey: objInput.strProviderKey,
58
+ purpose: objInput.strPurpose,
59
+ returnPath:
60
+ objInput.strPurpose === 'signIn'
61
+ ? objInput.strReturnPath
62
+ : undefined,
63
+ },
64
+ { signal: objSignal }
65
+ )
66
+ return fnMapAuthenticationResult(objResponse.data)
67
+ },
68
+ async fnCompleteRedirect(objInput, { objSignal }) {
69
+ const objResponse = await objGeneratedAuthApi.authentication.callback(
70
+ {
71
+ parameters: objInput.objParameters,
72
+ purpose: objInput.strPurpose,
73
+ },
74
+ { signal: objSignal }
75
+ )
76
+ return fnMapAuthenticationResult(objResponse.data)
77
+ },
78
+ async fnVerifyChallenge(objInput, { objSignal }) {
79
+ const objResponse = await objGeneratedAuthApi.authentication.verify(
80
+ {
81
+ challengeId: objInput.strChallengeId,
82
+ method: objInput.strMethod,
83
+ response: objInput.objResponse,
84
+ },
85
+ { signal: objSignal }
86
+ )
87
+ return fnMapAuthenticationResult(objResponse.data)
88
+ },
89
+ }
90
+ ```
91
+
92
+ 示例方法名以项目 OpenAPI 为准。`fnMapAuthenticationResult()` 是 Adapter 私有的运行时校验
93
+ 边界:拒绝未知状态、空事务标识、无效过期时间和缺失 Token。控制器会继续执行第二层稳定
94
+ 合同校验,但不能代替网络响应 Schema 校验。
95
+
96
+ ## 创建控制器
97
+
98
+ 外部身份提供方 Origin 必须来自已校验的项目运行时公开配置。当前应用 Origin 自动允许;
99
+ 外部 HTTP、未知 Origin、URL 凭据、Fragment Token 和非 HTTP(S) 协议会被拒绝:
100
+
101
+ ```ts
102
+ const objAuthenticationController = fnCreateAuthenticationController({
103
+ objAdapter: objAuthenticationAdapter,
104
+ objRedirectPolicy: {
105
+ strApplicationOrigin: globalThis.location.origin,
106
+ arrAllowedOrigins: ['https://identity.example.com'],
107
+ },
108
+ fnNavigateRedirect: (strRedirectUrl) => {
109
+ globalThis.location.assign(strRedirectUrl)
110
+ },
111
+ async fnOnComplete(objCompletion, { objSignal }) {
112
+ if (objSignal.aborted) return
113
+ if (objCompletion.strPurpose === 'signIn') {
114
+ await fnEstablishAuthSessionFromToken(
115
+ objCompletion.objTokenResult,
116
+ ''
117
+ )
118
+ await fnNavigate({
119
+ href: fnGetPostSignInPath(objCompletion.strReturnPath),
120
+ replace: true,
121
+ })
122
+ return
123
+ }
124
+
125
+ await fnResumePendingSensitiveOperation(
126
+ objCompletion.objGrant,
127
+ objSignal
128
+ )
129
+ },
130
+ })
131
+ ```
132
+
133
+ 完成结果会在 `fnOnComplete` 中立即消费,不进入可订阅快照。SSO、MFA 和账号密码最终都调用
134
+ `fnEstablishAuthSessionFromToken()`,因此不会产生第二套 Token Store、刷新锁或权限来源。
135
+ Step-up 完成后只恢复当前挂起操作;恢复请求必须使用完成回调提供的 `AbortSignal`。如果操作
136
+ 已经取消、资源已变化或授权过期,应丢弃结果并要求重新确认。
137
+
138
+ ## 登录与回调流程
139
+
140
+ 登录按钮只提供后端配置的 `strProviderKey`,不自行拼授权地址:
141
+
142
+ ```ts
143
+ await objAuthenticationController.fnStart({
144
+ strProviderKey: 'corporate-sso',
145
+ strPurpose: 'signIn',
146
+ strReturnPath: '/orders',
147
+ })
148
+ ```
149
+
150
+ 控制器会先校验 `strReturnPath` 是站内绝对路径,再交给 Adapter。后端必须把回跳路径与一次性
151
+ state 事务绑定,不能直接相信回调查询参数。
152
+
153
+ 完整页面跳转后,新的回调页面创建同样的控制器,并只把路由白名单允许的字符串参数交给
154
+ Adapter:
155
+
156
+ ```ts
157
+ await objAuthenticationController.fnCompleteRedirect({
158
+ strPurpose: 'signIn',
159
+ objParameters: {
160
+ code: objSearch.code,
161
+ state: objSearch.state,
162
+ },
163
+ })
164
+ ```
165
+
166
+ 回调路由必须分别确定 `signIn` 或 `stepUp` purpose,不允许查询参数自行声明。回调错误描述
167
+ 只交给 Adapter 和后端分类,不能原样写入监控或全局错误提示。
168
+
169
+ ## MFA 与 Step-up
170
+
171
+ Adapter 返回 `challenge` 后,快照进入 `awaitingChallenge` 并只保存挑战标识、方式、过期时间、
172
+ 剩余次数和后端脱敏目标。OTP、恢复码和 WebAuthn 响应只存在于表单草稿及本次 Adapter 请求:
173
+
174
+ ```ts
175
+ await objAuthenticationController.fnVerifyChallenge({
176
+ strChallengeId: objSnapshot.objChallenge.strChallengeId,
177
+ strMethod: objSnapshot.objChallenge.strMethod,
178
+ objResponse: { code: strOtpCode },
179
+ })
180
+ ```
181
+
182
+ 敏感数据显示、批量高风险操作或账户安全设置可以启动 Step-up:
183
+
184
+ ```ts
185
+ await objAuthenticationController.fnStart({
186
+ strActionKey: 'customer:identity:reveal',
187
+ strProviderKey: 'corporate-mfa',
188
+ strPurpose: 'stepUp',
189
+ strResourceKey: 'customer',
190
+ })
191
+ ```
192
+
193
+ `strActionKey` 是后端稳定操作码,`strResourceKey` 只能表达资源类型或范围,不能把手机号、
194
+ 证件号、订单内容等个人数据放入认证事务、URL 或日志。真正目标资源 ID 和 Step-up 授权由
195
+ 后续敏感请求在后端共同校验。
196
+
197
+ ## 生命周期和失败策略
198
+
199
+ - 新的 start、callback 或 challenge 请求会取消旧请求,晚到结果不能覆盖当前状态。
200
+ - `fnCancel()` 先清除本地挑战和请求,再尽力取消后端事务;远端失败不会恢复本地状态。
201
+ - `fnReset()` 只清除控制器展示状态,不撤销登录会话或服务端授权。
202
+ - 控制器快照不保存 Token、Step-up Proof、OTP、回调参数或完整跳转 URL。
203
+ - 登录完成回调失败时不能建立半个会话;现有会话函数负责身份结果校验和缺失身份时的 Token
204
+ 撤销。具体应用准入由后端和权限码决定,前端不硬编码角色字符串。
205
+ - 浏览器离开挑战页面时应调用 `fnCancel()`;登录回调和 Step-up 恢复动作应具备幂等性。
206
+
207
+ 如果项目使用自动携带 Cookie 的 BFF,会话 Cookie 的 `HttpOnly`、`Secure`、`SameSite` 和
208
+ CSRF 防护全部由服务端负责。前端不能通过读取 Cookie 来推断或模拟这些属性。
209
+
210
+ ## 验收清单
211
+
212
+ - 页面不拼接 OIDC/SAML 地址,也不解析供应商 DTO;协议逻辑只存在于 Adapter 和后端。
213
+ - 外部跳转只允许显式 HTTPS Origin;未知 Origin、凭据、Fragment 和危险协议被拒绝。
214
+ - 登录回跳路径必须是站内绝对路径,并与服务端一次性 state 事务绑定。
215
+ - 账号密码、SSO 和 MFA 完成后使用同一会话、刷新锁、权限快照和退出流程。
216
+ - MFA/Step-up 挑战、取消、过期、重复提交、晚到响应和远端取消失败都有稳定状态。
217
+ - Step-up 不创建第二套登录会话,短期证明不进入 Store、URL、存储、日志或监控。
218
+ - Adapter 使用生成客户端并传递 AbortSignal;生成目录没有手工业务修改。
219
+ - 不安装未选定的身份供应商 SDK,不把可选认证能力打进默认首屏。
@@ -0,0 +1,58 @@
1
+ # 浏览器安全基线
2
+
3
+ 脚手架把浏览器安全拆成三条可验证边界:构建依赖必须通过漏洞审计,静态站点必须返回固定
4
+ 安全响应头,业务接入不得绕过浏览器与服务端各自的授权责任。前端权限只控制展示,最终
5
+ 认证、租户隔离和资源授权仍由后端执行。
6
+
7
+ ## 默认响应头
8
+
9
+ `deploy/nginx.conf` 为所有响应设置以下策略:
10
+
11
+ - CSP 默认只允许同源资源,禁止插件对象、内联脚本、事件属性脚本和第三方页面嵌入;
12
+ - 图片与受沙箱约束的文件预览允许 `blob:`,图片额外允许公开 HTTPS 和 Data URL;
13
+ - `X-Frame-Options: DENY` 为旧浏览器补充点击劫持防护;
14
+ - HSTS、`nosniff` 和严格来源策略减少降级、类型混淆和跨站来源泄露;
15
+ - COOP/CORP 默认保持同源隔离;Permissions Policy 关闭摄像头、定位、麦克风、支付和 USB。
16
+
17
+ `style-src 'unsafe-inline'` 是当前 React 组件内联样式和第三方 UI 兼容边界,不适用于脚本。
18
+ 如要移除它,应先验证全部组件状态和动态定位能力,不能直接修改生产头部碰运气。
19
+
20
+ 生产 API 推荐由宿主机 `/api/` 反向代理保持同源。若项目确实需要跨域 API、字体、图片或
21
+ Office 预览服务,应同时完成以下工作:
22
+
23
+ 1. 将明确的 Origin 加入 CSP 对应指令,不使用 `*`;
24
+ 2. 在文件预览 Adapter 的 `arrAllowedOrigins` 中加入相同 Origin;
25
+ 3. 配置后端 CORS、认证凭据和请求 ID 暴露头;
26
+ 4. 更新 `deployConfig.test.mjs` 中的 CSP 期望值并说明新增数据边界;
27
+ 5. 先通过 Report-Only 在目标环境观察,再切换为强制策略。
28
+
29
+ ## 依赖审计
30
+
31
+ 执行:
32
+
33
+ ```bash
34
+ pnpm security:audit
35
+ ```
36
+
37
+ main 分支封装发布制品前,GitLab CI 会审计生产及开发依赖,发现 High 或 Critical 已知漏洞
38
+ 即失败。构建工具同样纳入审计,因为受污染的开发依赖可以改变最终静态产物。
39
+
40
+ 处理告警时优先升级直接依赖,其次使用带有明确影响分析的 `pnpm.overrides`。不得通过
41
+ `--ignore-registry-errors` 放过 Registry 故障;确需接受风险时,应在项目安全记录中写明
42
+ GHSA、不可利用的证据、负责人和到期日,而不是永久降低全局阈值。
43
+
44
+ ## CSP 变更门禁
45
+
46
+ `tests/unit/config/deployConfig.test.mjs` 会完整比较 CSP,并禁止脚本使用 `unsafe-inline` 或
47
+ `unsafe-eval`。任何修改都必须同时评审允许的数据来源、浏览器能力、用户信息暴露面和回滚
48
+ 方案。供应商 SDK 不能因为“监控需要”直接获得任意 `connect-src`、脚本或用户数据权限。
49
+
50
+ 部署后至少检查:
51
+
52
+ ```bash
53
+ curl -sSI https://admin.example.com/sign-in
54
+ curl -sSI https://admin.example.com/runtime-config.json
55
+ ```
56
+
57
+ 确认安全头存在,`runtime-config.json` 为 `no-store`,并在浏览器 DevTools 中检查没有意外
58
+ CSP 违规。CSP 是纵深防御,不替代安全 DOM API、输入输出校验和服务端授权。
@@ -0,0 +1,65 @@
1
+ # 构建体积预算
2
+
3
+ 构建体积预算用于阻止默认入口和关键用户旅程在没有明确决策的情况下持续膨胀。它是稳定的
4
+ 实验室门禁,不替代真实用户的 Web Vitals、网络瀑布、缓存命中率或低端设备性能数据。
5
+
6
+ ## 当前预算
7
+
8
+ `tools/bundle/budgets.json` 是唯一预算来源。当前基线使用 Node `zlib` level 9 对生产文件
9
+ 执行 gzip,并按 Vite Manifest 的静态 `imports` 递归去重:
10
+
11
+ | 预算 ID | 用户旅程/资源 | 当前基线 | 上限 | Owner |
12
+ | --------------- | -------------------------- | ---------- | ------- | ------------------------ |
13
+ | `bootstrap-js` | 加载应用入口和运行时配置 | 79.75 KiB | 84 KiB | 应用入口与运行时配置 |
14
+ | `sign-in-js` | 启动应用并进入登录 Feature | 191.75 KiB | 205 KiB | 认证 Feature 与访客路由 |
15
+ | `dashboard-js` | 启动应用并进入中性首页 | 222.36 KiB | 238 KiB | 认证后壳层与首页 Feature |
16
+ | `bootstrap-css` | 入口声明的全局样式 | 15.33 KiB | 18 KiB | 全局样式与主题 |
17
+
18
+ 基线记录的是本次建立门禁时的受控生产构建,不承诺所有 Node/zlib 版本逐字节一致;预算已保留
19
+ 约 5% 到 17% 的工具链和正常小改动余量。字体、图片和其他静态资源不计入 JavaScript/CSS
20
+ 预算,也不能因此忽略:若它们影响真实页面,应建立对应资源或请求预算。
21
+
22
+ ## 执行方式
23
+
24
+ ```bash
25
+ pnpm build
26
+ ```
27
+
28
+ `vite build` 会生成内部 `.vite/manifest.json`,随后 `pnpm bundle:check` 校验四项预算。
29
+ Manifest 仅用于构建分析,`pnpm release:prepare` 会把它和环境专属
30
+ `runtime-config.json` 一起排除在不可变发布站点之外。
31
+
32
+ 已有同一 Commit 的完整 `dist` 时,也可以单独复查:
33
+
34
+ ```bash
35
+ pnpm bundle:check
36
+ ```
37
+
38
+ 不得用旧 `dist` 代表当前源码。预算检查找不到 Manifest、入口、静态依赖或普通产物文件时
39
+ 会直接失败,不会以 `0 KiB` 误报通过。
40
+
41
+ ## 预算语义
42
+
43
+ - `arrEntries` 表示完成该旅程必须获取的入口集合;每个入口的静态依赖递归计入并按产物
44
+ 路径去重。
45
+ - 动态依赖只有在成为该旅程的显式入口时才计入。例如登录页计入 Auth Feature,中性首页
46
+ 计入 AppLayout 与 Home Feature,但 Web Vitals 和未访问错误页不会被误算到同一路径。
47
+ - CSS 预算读取入口静态图中的 `css` 文件;不会把 JavaScript、字体和图片混在一起。
48
+ - 超限诊断按 gzip 体积列出最大的五个 Chunk、Manifest Owner 和文件路径,Owner 是责任
49
+ 边界,不表示某个开发者个人。
50
+
51
+ ## 调整规则
52
+
53
+ 预算超限时优先检查诊断中最大的 Chunk 及最近新增静态依赖,将仅特定路由或可选交互使用的
54
+ 能力保持在动态边界。不要为了过门禁立即提高阈值,也不要为了减少单个 Chunk 数字制造大量
55
+ 无意义请求。
56
+
57
+ 确实需要提高预算时,同一个变更必须记录:
58
+
59
+ 1. 哪个真实用户旅程获得了什么能力。
60
+ 2. 调整前后 gzip 体积和主要 Chunk 归属。
61
+ 3. 为什么不能放入既有路由或可选能力的动态边界。
62
+ 4. 低端设备、弱网或生产 Web Vitals 的补充证据与回滚方式。
63
+
64
+ 新的关键路由应新增独立旅程预算,而不是扩大 `dashboard-js` 代替。大型编辑器、地图、报表
65
+ 和高级表格等可选能力按自己的用户路径评估,不能因为它们合法按需加载就进入默认入口。
@@ -0,0 +1,99 @@
1
+ # 内建组件源码治理
2
+
3
+ ## 单一事实源
4
+
5
+ `AppPageForm` 与 `AppTable` 来自团队内部仓库的固定源码快照,不再作为私有 Node 包安装。
6
+ 来源 repository、完整 revision、包版本、导入日期、选择性同步范围、本地改造、回归证据和
7
+ 第三方许可证期望只记录在
8
+ [`tools/component-governance/manifest.json`](../tools/component-governance/manifest.json)。
9
+ 各组件的 `SOURCE.md` 只解释目录改造和接入边界,不再重复保存 revision。
10
+
11
+ 两个内部来源在已记录 revision 都没有 `LICENSE` 或 `NOTICE`。因此清单强制
12
+ `internal-only`:在取得书面代码权属与再分发授权前,不得公开发布、出售或复制到外部
13
+ 仓库。工程门禁不能代替法务审核。
14
+
15
+ ## 持续检查
16
+
17
+ ```bash
18
+ pnpm components:check
19
+ ```
20
+
21
+ 该命令已经进入 `pnpm verify` 和 GitLab verify Job,会同时验证:
22
+
23
+ 1. 清单结构、完整 40 位 revision、内部源码分发状态和不重复的组件记录。
24
+ 2. 本地源码目录、公共入口、`SOURCE.md`、回归测试文件和必跑命令仍然存在。
25
+ 3. `SOURCE.md` 指向唯一清单且没有复制 revision;业务仍通过 `AppPageForm`、`AppTable`
26
+ 公共入口消费。
27
+ 4. `package.json`/锁文件没有重新引入内部 Git 包。
28
+ 5. Handsontable、ExcelJS 的安装版本、`package.json#license` 和实际许可证文件与清单一致。
29
+ 6. Handsontable 商业 Key、首屏按需加载等策略标记仍有构建实现和测试证据。
30
+
31
+ 依赖升级导致版本或许可证文本变化时,检查会失败并要求人工复核,不会自动接受新条款。
32
+ ESLint 的 `project-naming/component-boundaries` 同时禁止 `src` 中的外部消费者深层导入两个
33
+ 内建组件;组件内部可以继续按领域目录组织,组件外只能使用根 `index.ts` 公共入口。
34
+
35
+ ## 查看升级候选
36
+
37
+ 来源仓库必须是正确 origin、干净工作区,并且候选 HEAD 必须是已记录 revision 的后继。
38
+ 工具只读取 Git 历史,不访问网络,也不修改来源仓库、本项目源码或清单。
39
+
40
+ ```bash
41
+ pnpm components:diff -- \
42
+ --component AppPageForm \
43
+ --source-root /absolute/path/to/page-form
44
+
45
+ pnpm components:diff -- \
46
+ --component AppTable \
47
+ --source-root /absolute/path/to/table-component
48
+ ```
49
+
50
+ 输出仅包含清单 `includedPaths` 范围内的 `A/M/D/R` 文件列表、基准/候选 revision、许可证
51
+ 文件集合变化和必跑回归证据。它不会声称候选已经兼容本项目。
52
+
53
+ 常见失败诊断:
54
+
55
+ | 错误码 | 含义 | 处理方式 |
56
+ | -------------------------------------- | ---------------------------- | -------------------------------------------- |
57
+ | `COMPONENT_SOURCE_DIRTY` | 来源仓库存在未提交修改 | 提交、切走或恢复后重新执行 |
58
+ | `COMPONENT_SOURCE_REPOSITORY_MISMATCH` | origin 不是清单登记仓库 | 切换到正确内部来源仓库 |
59
+ | `COMPONENT_SOURCE_REVISION_NOT_FOUND` | 基准 revision 不在本地历史 | `git fetch --all --prune` 后核对清单 |
60
+ | `COMPONENT_SOURCE_HISTORY_DIVERGED` | 候选不是基准的前向升级 | 切换到正式升级分支,不得整目录覆盖 |
61
+ | `COMPONENT_SOURCE_LICENSE_CHANGED` | LICENSE/NOTICE 文件集合变化 | 暂停同步并完成权属、许可证和再分发评审 |
62
+ | `COMPONENT_DEPENDENCY_LICENSE_DRIFT` | 第三方包声明的许可证发生变化 | 暂停发布,检查新版本许可证文本与 NOTICE 义务 |
63
+ | `COMPONENT_GOVERNANCE_GATE_MISSING` | 检查未进入 `verify` | 恢复 package scripts,不允许仅靠人工记忆执行 |
64
+
65
+ ## 选择性同步流程
66
+
67
+ 1. 在来源仓库执行 `git fetch`,切换到干净且已提交的候选 revision。
68
+ 2. 执行 `components:diff`,评审 engine/core、React 渲染、公共类型和许可证变化。
69
+ 3. 只移植当前应用需要的行为;继续排除 Vue、示例、发布配置、仓库工具和重复 UI primitives。
70
+ 4. 保留本项目的公共入口、目录边界、Locale、权限、未保存保护和全局 UI 组件;禁止无审计的
71
+ 整目录覆盖。
72
+ 5. 公共属性、类型、焦点行为、CSS Token 或校验语义发生变化时,按破坏性变更处理,并在
73
+ 同一评审中提供迁移说明和消费者回归测试。
74
+ 6. 完成源码移植和行为测试后,才更新清单的 revision、包版本与导入日期;不要提前移动
75
+ 基准,否则差异工具会丢失未同步变化。
76
+ 7. 执行清单列出的定向测试、`pnpm components:check` 和 `pnpm verify`,由评审者核对最终
77
+ Diff 与升级候选一致。
78
+ 8. 同步失败时回退本次选择性移植和清单修改;原 revision 始终是可恢复基线。
79
+
80
+ ## 第三方边界
81
+
82
+ - `AppTable` 依赖 Handsontable。评估许可证只能用于评估;只有最终产物包含 `AppTable`
83
+ 时,生产部署才必须注入项目获得的商业 Key。构建拒绝缺失/评估 Key 和首屏静态引入,
84
+ 但 Key 的项目范围、有效期和版本权利仍需采购与交付记录确认。
85
+ - Excel 导出依赖 ExcelJS。发布产物和归档材料必须按其许可证要求保留许可证文本;升级时
86
+ 以实际安装包而不是记忆中的许可证类型为准。
87
+ - `components/ui` 是唯一全局 UI primitives,来源同步不得复制上游 shadcn 文件或 `cn`
88
+ helper。
89
+ - 外部分发前必须同时确认本仓库许可证、两个内部源码的书面授权及全部运行时依赖义务。
90
+
91
+ ## AppTable 构建约束
92
+
93
+ - 普通列表使用 `AppDataTable`,不为基础场景引入 Handsontable。
94
+ - `AppTable` 只能从 `@/components/AppTable` 公共入口导入,并由按需加载的 Feature 使用。
95
+ - Vite 根据最终 Rollup 模块图判断高级表格是否进入产物;未使用时不要求商业 Key,也不
96
+ 生成 Handsontable Chunk。
97
+ - Handsontable 固定在 `advanced-table-vendor` 异步 Chunk。缺少许可证时报
98
+ `APP_TABLE_LICENSE_REQUIRED`,进入入口静态依赖闭包时报 `APP_TABLE_EAGER_LOAD`;错误
99
+ 信息不会回显 Key。
@@ -0,0 +1,169 @@
1
+ # 数据脱敏展示
2
+
3
+ 数据脱敏能力用于客户列表、员工档案、订单联系人、财务账户和审计详情等场景。脚手架提供
4
+ 统一脱敏策略、安全展示组件及 AppTable 敏感列工厂,不内置任何业务字段、权限码或查看
5
+ 接口。
6
+
7
+ ## 安全边界
8
+
9
+ 前端脱敏只是展示保护,不能替代后端数据权限。接口应按最小化原则返回数据:没有原始值
10
+ 权限时,列表和详情 DTO 只返回后端生成的 `strMaskedValue`,不应把原始值传给浏览器再用
11
+ CSS、星号或隐藏按钮遮住。临时查看接口必须再次校验用户、租户、记录范围、字段权限及
12
+ 必要的 Step-up 状态,并在服务端完成审计。
13
+
14
+ 查看和复制是两个独立操作:拥有查看权限不自动获得复制原始值权限。组件默认不展示查看
15
+ 入口,也默认不允许复制;业务必须显式配置对应策略。原始值不会进入 DOM 属性、错误文案、
16
+ 本地存储或可观测性事件,离开页面、切换后台、权限撤销、组件卸载和超时都会自动回掩。
17
+
18
+ `src/observability/redaction.ts` 负责日志和遥测边界的兜底清洗,与本模块的界面展示策略职责
19
+ 不同。两者不能互相替代。
20
+
21
+ ## 公共入口
22
+
23
+ 从 `@/dataMasking` 导入:
24
+
25
+ - `fnMaskSensitiveText()`:按常见预设或字段级覆盖生成脱敏文本。
26
+ - `fnResolveSensitiveDataMaskedText()`:优先使用后端脱敏值,仅在原始值存在时前端计算。
27
+ - `objDataMaskingPresets`:手机号、证件号、银行卡、姓名、邮箱和通用分段默认策略。
28
+ - `TSensitiveDataValue`:区分浏览器只有脱敏值和已经持有原始值的互斥 DTO 形态。
29
+ - `TSensitiveDataRevealPolicy` / `TSensitiveDataCopyPolicy`:查看与复制的组合策略类型。
30
+ - `SensitiveDataError`:不携带原始值的稳定查看/复制错误。
31
+
32
+ 从 `@/components/SensitiveData` 导入 `SensitiveData`。从
33
+ `@/components/AppTable` 导入 `fnCreateSensitiveDataTableColumn()`,用于固定关闭表格原生复制
34
+ 和编辑旁路。
35
+
36
+ ## 基础展示
37
+
38
+ 后端已按当前用户权限返回脱敏文本时,优先使用 `masked` 形态:
39
+
40
+ ```tsx
41
+ <SensitiveData
42
+ objMaskingPolicy={{ strPreset: 'phone' }}
43
+ objValue={{
44
+ strMaskedValue: objCustomer.strMaskedPhone,
45
+ strState: 'masked',
46
+ }}
47
+ strLabel='手机号'
48
+ />
49
+ ```
50
+
51
+ 如果详情接口已经授权并返回原始值,可以使用 `available` 形态;组件仍默认脱敏展示:
52
+
53
+ ```tsx
54
+ <SensitiveData
55
+ objMaskingPolicy={{ strPreset: 'identity' }}
56
+ objValue={{
57
+ strState: 'available',
58
+ strValue: objEmployee.strIdentityNumber,
59
+ }}
60
+ strLabel='证件号'
61
+ />
62
+ ```
63
+
64
+ 内建预设是脚手架默认值,不代表所有国家、证件或账户格式。项目可通过
65
+ `nVisibleStart`、`nVisibleEnd`、`nMaskLength` 和 `strMaskCharacter` 做字段级调整。固定
66
+ `nMaskLength` 可以避免通过星号数量泄露原始长度。
67
+
68
+ ## 通过生成客户端按需查看
69
+
70
+ `swagger-typescript-api` 生成目录仍然只保存后端契约,不手工修改。拥有业务语义的 Feature
71
+ 创建轻量 Adapter,把生成方法的 DTO 映射为组件需要的原始字符串,并传递取消信号:
72
+
73
+ ```tsx
74
+ const fnRequestPhoneReveal: TSensitiveDataRevealAdapter = async ({
75
+ objSignal,
76
+ }) => {
77
+ const objResponse = await objGeneratedApi.customer.revealPhone(
78
+ objCustomer.strId,
79
+ { signal: objSignal }
80
+ )
81
+ return objResponse.data.strPhone
82
+ }
83
+
84
+ <SensitiveData
85
+ fnRequestReveal={fnRequestPhoneReveal}
86
+ objMaskingPolicy={{ strPreset: 'phone' }}
87
+ objRevealPolicy={{
88
+ nDurationMs: 30_000,
89
+ objRequirement: 'customer:phone:view',
90
+ strMode: 'authorized',
91
+ }}
92
+ objValue={{
93
+ strMaskedValue: objCustomer.strMaskedPhone,
94
+ strState: 'masked',
95
+ }}
96
+ strLabel='手机号'
97
+ />
98
+ ```
99
+
100
+ 示例中的生成方法名和参数以项目 OpenAPI 为准。Adapter 应位于 Feature 的 repository 或
101
+ adapter 边界,不应在基础组件中导入某个业务服务的生成 `Api.ts`。取消、超时或权限变化后
102
+ 晚到的响应不会重新展示。
103
+
104
+ ## 复制策略
105
+
106
+ 只复制脱敏值时可以配置 `masked`;复制原始值必须配置 `revealed` 并提供不可省略的独立权限
107
+ 要求,而且复制按钮只会在原始值当前可见时出现:
108
+
109
+ ```tsx
110
+ <SensitiveData
111
+ objCopyPolicy={{
112
+ objRequirement: 'customer:phone:copy',
113
+ strMode: 'revealed',
114
+ }}
115
+ objMaskingPolicy={{ strPreset: 'phone' }}
116
+ objRevealPolicy={{
117
+ objRequirement: 'customer:phone:view',
118
+ strMode: 'authorized',
119
+ }}
120
+ objValue={objSensitivePhone}
121
+ strLabel='手机号'
122
+ />
123
+ ```
124
+
125
+ 默认实现只使用安全上下文中的 Clipboard API,不使用遗留 `execCommand`。页面可以通过
126
+ `fnWriteClipboard` 接入自己的浏览器兼容 Adapter,通过 `fnOnError` 显示统一反馈;任何反馈
127
+ 和日志都只能记录 `SensitiveDataError.strCode`,不能记录待复制文本。
128
+
129
+ ## AppTable 接入
130
+
131
+ 不能只把自定义 cellComponent 渲染成星号,因为 Handsontable 仍可能从底层数据复制原始值。
132
+ 敏感列必须使用安全列工厂:
133
+
134
+ ```tsx
135
+ const objPhoneColumn = fnCreateSensitiveDataTableColumn<
136
+ ICustomerRow,
137
+ string
138
+ >({
139
+ objColumn: {
140
+ key: 'strMaskedPhone',
141
+ label: '手机号',
142
+ },
143
+ fnResolveSensitiveDataProps: ({ row: objRow, value: strMaskedPhone }) => ({
144
+ fnRequestReveal: ({ objSignal }) =>
145
+ fnRevealCustomerPhone(objRow.strId, objSignal),
146
+ objMaskingPolicy: { strPreset: 'phone' },
147
+ objRevealPolicy: {
148
+ objRequirement: 'customer:phone:view',
149
+ strMode: 'authorized',
150
+ },
151
+ objValue: { strMaskedValue: strMaskedPhone, strState: 'masked' },
152
+ }),
153
+ })
154
+ ```
155
+
156
+ 工厂强制 `readOnly: true`、`copyable: false` 和 `exportable: false`,因此客户端导出和
157
+ 远程导出元数据也不会包含该列。需要敏感字段导出时必须提供后端独立授权的专用导出接口,
158
+ 不能把列开关改回 true。最佳方案仍是让列表行只包含脱敏字段;如果原始值已经在行 DTO 中,
159
+ 关闭表格复制无法防止浏览器扩展、开发者工具或其他脚本读取。
160
+
161
+ ## 验收清单
162
+
163
+ - 无查看权限时浏览器 DTO 不包含原始值,页面也不渲染查看入口。
164
+ - 默认只展示后端脱敏值或前端预设结果,短值不会因为配置错误完整暴露。
165
+ - 查看、复制脱敏值和复制原始值分别配置权限,复制原始值不能隐式触发查看。
166
+ - 按需查看使用生成客户端 Adapter,支持取消,失败反馈和日志不包含原始值。
167
+ - 超时、权限撤销、页面隐藏、离页和卸载后立即回掩并清除组件内临时值。
168
+ - AppTable 敏感列固定只读并禁止原生复制和通用导出,敏感导出由后端单独授权。
169
+ - 共享中英文文案和键盘可访问按钮均可工作。