@antelopejs/interface-dms 0.9.0 → 0.10.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 (516) hide show
  1. package/CHANGELOG.md +123 -0
  2. package/dist/attachments.js +3 -1
  3. package/dist/attachments.js.map +1 -1
  4. package/dist/auth/db/models/sessions.model.js +1 -5
  5. package/dist/auth/db/models/sessions.model.js.map +1 -1
  6. package/dist/auth/db/tables/users.table.js.map +1 -1
  7. package/dist/auth/index.js +4 -1
  8. package/dist/auth/index.js.map +1 -1
  9. package/dist/auth/internal/jwt-auth-decorator.js +7 -5
  10. package/dist/auth/internal/jwt-auth-decorator.js.map +1 -1
  11. package/dist/auth/internal/request-authenticators.js +4 -1
  12. package/dist/auth/internal/request-authenticators.js.map +1 -1
  13. package/dist/auth/internal/request-principal.js +1 -0
  14. package/dist/auth/internal/request-principal.js.map +1 -1
  15. package/dist/base/activity-feed.d.ts +26 -26
  16. package/dist/base/banner.d.ts +14 -14
  17. package/dist/base/banner.js +1 -0
  18. package/dist/base/banner.js.map +1 -1
  19. package/dist/base/block-registry/helpers.js +1 -0
  20. package/dist/base/block-registry/helpers.js.map +1 -1
  21. package/dist/base/block-registry/internal/describe.js +107 -85
  22. package/dist/base/block-registry/internal/describe.js.map +1 -1
  23. package/dist/base/block-registry/presentation.js +0 -5
  24. package/dist/base/block-registry/presentation.js.map +1 -1
  25. package/dist/base/block-registry/registry.js +4 -1
  26. package/dist/base/block-registry/registry.js.map +1 -1
  27. package/dist/base/block-types.js +0 -2
  28. package/dist/base/block-types.js.map +1 -1
  29. package/dist/base/card.d.ts +8 -8
  30. package/dist/base/chart-card.d.ts +2 -2
  31. package/dist/base/chart-card.js +2 -2
  32. package/dist/base/chart-card.js.map +1 -1
  33. package/dist/base/chart-schemas.d.ts +66 -66
  34. package/dist/base/chart-schemas.js +19 -21
  35. package/dist/base/chart-schemas.js.map +1 -1
  36. package/dist/base/chart.js +1 -0
  37. package/dist/base/chart.js.map +1 -1
  38. package/dist/base/code-block.js +1 -0
  39. package/dist/base/code-block.js.map +1 -1
  40. package/dist/base/confirm-dialog.d.ts +2 -6
  41. package/dist/base/confirm-dialog.js +36 -15
  42. package/dist/base/confirm-dialog.js.map +1 -1
  43. package/dist/base/data-sources.js +6 -2
  44. package/dist/base/data-sources.js.map +1 -1
  45. package/dist/base/data-types/compare-types.js +82 -68
  46. package/dist/base/data-types/compare-types.js.map +1 -1
  47. package/dist/base/data-types/core.d.ts +8 -101
  48. package/dist/base/data-types/core.js +40 -143
  49. package/dist/base/data-types/core.js.map +1 -1
  50. package/dist/base/data-types/default/address.d.ts +126 -0
  51. package/dist/base/data-types/default/address.js +57 -0
  52. package/dist/base/data-types/default/address.js.map +1 -0
  53. package/dist/base/data-types/default/choices.d.ts +54 -0
  54. package/dist/base/data-types/default/choices.js +135 -0
  55. package/dist/base/data-types/default/choices.js.map +1 -0
  56. package/dist/base/data-types/default/files.d.ts +86 -0
  57. package/dist/base/data-types/default/files.js +214 -0
  58. package/dist/base/data-types/default/files.js.map +1 -0
  59. package/dist/base/data-types/default/inputs.d.ts +11 -0
  60. package/dist/base/data-types/default/inputs.js +26 -0
  61. package/dist/base/data-types/default/inputs.js.map +1 -0
  62. package/dist/base/data-types/default/numbers.d.ts +62 -0
  63. package/dist/base/data-types/default/numbers.js +287 -0
  64. package/dist/base/data-types/default/numbers.js.map +1 -0
  65. package/dist/base/data-types/default/options.d.ts +133 -0
  66. package/dist/base/data-types/default/options.js +3 -0
  67. package/dist/base/data-types/default/options.js.map +1 -0
  68. package/dist/base/data-types/default/relations.d.ts +267 -0
  69. package/dist/base/data-types/default/relations.js +149 -0
  70. package/dist/base/data-types/default/relations.js.map +1 -0
  71. package/dist/base/data-types/default/strings.d.ts +35 -0
  72. package/dist/base/data-types/default/strings.js +154 -0
  73. package/dist/base/data-types/default/strings.js.map +1 -0
  74. package/dist/base/data-types/default-types.d.ts +73 -753
  75. package/dist/base/data-types/default-types.js +39 -991
  76. package/dist/base/data-types/default-types.js.map +1 -1
  77. package/dist/base/data-types/field-types.js +2 -6
  78. package/dist/base/data-types/field-types.js.map +1 -1
  79. package/dist/base/data-types/index.js +1 -20
  80. package/dist/base/data-types/index.js.map +1 -1
  81. package/dist/base/data-types/internal/compare-types.js +0 -2
  82. package/dist/base/data-types/internal/compare-types.js.map +1 -1
  83. package/dist/base/data-types/internal/relation-add-form.d.ts +7 -0
  84. package/dist/base/data-types/internal/relation-add-form.js +21 -0
  85. package/dist/base/data-types/internal/relation-add-form.js.map +1 -0
  86. package/dist/base/data-types/internal/relation-endpoints.d.ts +8 -0
  87. package/dist/base/data-types/internal/relation-endpoints.js +36 -0
  88. package/dist/base/data-types/internal/relation-endpoints.js.map +1 -0
  89. package/dist/base/data-types/status-type.js +0 -6
  90. package/dist/base/data-types/status-type.js.map +1 -1
  91. package/dist/base/display.d.ts +6 -6
  92. package/dist/base/display.js +15 -10
  93. package/dist/base/display.js.map +1 -1
  94. package/dist/base/empty-state.d.ts +8 -8
  95. package/dist/base/export-jobs.js.map +1 -1
  96. package/dist/base/form-block-schema.d.ts +36 -36
  97. package/dist/base/form-block-schema.js +0 -5
  98. package/dist/base/form-block-schema.js.map +1 -1
  99. package/dist/base/form-schema.d.ts +5 -1
  100. package/dist/base/form-schema.js +44 -206
  101. package/dist/base/form-schema.js.map +1 -1
  102. package/dist/base/form-types.d.ts +4 -84
  103. package/dist/base/form-types.js.map +1 -1
  104. package/dist/base/form.js +0 -7
  105. package/dist/base/form.js.map +1 -1
  106. package/dist/base/guard.d.ts +14 -14
  107. package/dist/base/helpers/archive-mode-helpers.js +11 -11
  108. package/dist/base/helpers/archive-mode-helpers.js.map +1 -1
  109. package/dist/base/helpers/file-refs.js +20 -7
  110. package/dist/base/helpers/file-refs.js.map +1 -1
  111. package/dist/base/index.js +0 -5
  112. package/dist/base/index.js.map +1 -1
  113. package/dist/base/internal/button-availability.d.ts +3 -17
  114. package/dist/base/internal/button-availability.js +36 -31
  115. package/dist/base/internal/button-availability.js.map +1 -1
  116. package/dist/base/internal/chart-schemas.js +0 -2
  117. package/dist/base/internal/chart-schemas.js.map +1 -1
  118. package/dist/base/internal/composed-text.js +0 -2
  119. package/dist/base/internal/composed-text.js.map +1 -1
  120. package/dist/base/internal/confirm-dialog.d.ts +3 -13
  121. package/dist/base/internal/confirm-dialog.js +37 -21
  122. package/dist/base/internal/confirm-dialog.js.map +1 -1
  123. package/dist/base/internal/display.js +3 -1
  124. package/dist/base/internal/display.js.map +1 -1
  125. package/dist/base/internal/form-schema-components.d.ts +12 -0
  126. package/dist/base/internal/form-schema-components.js +61 -0
  127. package/dist/base/internal/form-schema-components.js.map +1 -0
  128. package/dist/base/internal/form-schema-validation.d.ts +16 -0
  129. package/dist/base/internal/form-schema-validation.js +68 -0
  130. package/dist/base/internal/form-schema-validation.js.map +1 -0
  131. package/dist/base/internal/form-schema.d.ts +2 -7
  132. package/dist/base/internal/form-schema.js +36 -28
  133. package/dist/base/internal/form-schema.js.map +1 -1
  134. package/dist/base/internal/layouts.d.ts +1 -59
  135. package/dist/base/internal/searchable.js +3 -1
  136. package/dist/base/internal/searchable.js.map +1 -1
  137. package/dist/base/key-value-list.d.ts +12 -12
  138. package/dist/base/kpi-card.d.ts +2 -2
  139. package/dist/base/kpi-card.js +2 -0
  140. package/dist/base/kpi-card.js.map +1 -1
  141. package/dist/base/layouts.d.ts +6 -80
  142. package/dist/base/layouts.js +38 -54
  143. package/dist/base/layouts.js.map +1 -1
  144. package/dist/base/live-toggle.d.ts +2 -2
  145. package/dist/base/meter.d.ts +25 -25
  146. package/dist/base/meter.js +0 -1
  147. package/dist/base/meter.js.map +1 -1
  148. package/dist/base/nav-card-grid.d.ts +13 -13
  149. package/dist/base/page-toolbar.d.ts +2 -2
  150. package/dist/base/page-toolbar.js +0 -6
  151. package/dist/base/page-toolbar.js.map +1 -1
  152. package/dist/base/period-selector.d.ts +2 -2
  153. package/dist/base/period-selector.js +0 -4
  154. package/dist/base/period-selector.js.map +1 -1
  155. package/dist/base/query-response.js +3 -5
  156. package/dist/base/query-response.js.map +1 -1
  157. package/dist/base/resource-form-schema.js +0 -4
  158. package/dist/base/resource-form-schema.js.map +1 -1
  159. package/dist/base/searchable.d.ts +5 -0
  160. package/dist/base/searchable.js +11 -2
  161. package/dist/base/searchable.js.map +1 -1
  162. package/dist/base/stat-group.d.ts +15 -15
  163. package/dist/base/tab.d.ts +8 -8
  164. package/dist/base/tab.js +1 -0
  165. package/dist/base/tab.js.map +1 -1
  166. package/dist/base/table-view/column-display.js +0 -1
  167. package/dist/base/table-view/column-display.js.map +1 -1
  168. package/dist/base/table-view/data-functions.d.ts +10 -10
  169. package/dist/base/table-view/data-functions.js.map +1 -1
  170. package/dist/base/table-view/factory.js +32 -204
  171. package/dist/base/table-view/factory.js.map +1 -1
  172. package/dist/base/table-view/internal/auth.js +5 -19
  173. package/dist/base/table-view/internal/auth.js.map +1 -1
  174. package/dist/base/table-view/internal/column-conditions.js +0 -5
  175. package/dist/base/table-view/internal/column-conditions.js.map +1 -1
  176. package/dist/base/table-view/internal/column-display.js +5 -3
  177. package/dist/base/table-view/internal/column-display.js.map +1 -1
  178. package/dist/base/table-view/internal/factory-helpers.js +24 -158
  179. package/dist/base/table-view/internal/factory-helpers.js.map +1 -1
  180. package/dist/base/table-view/internal/factory-lifecycle-created.d.ts +21 -0
  181. package/dist/base/table-view/internal/factory-lifecycle-created.js +96 -0
  182. package/dist/base/table-view/internal/factory-lifecycle-created.js.map +1 -0
  183. package/dist/base/table-view/internal/factory-lifecycle-filter.d.ts +15 -0
  184. package/dist/base/table-view/internal/factory-lifecycle-filter.js +37 -0
  185. package/dist/base/table-view/internal/factory-lifecycle-filter.js.map +1 -0
  186. package/dist/base/table-view/internal/factory-lifecycle-options.d.ts +41 -0
  187. package/dist/base/table-view/internal/factory-lifecycle-options.js +99 -0
  188. package/dist/base/table-view/internal/factory-lifecycle-options.js.map +1 -0
  189. package/dist/base/table-view/internal/factory-private-actions.d.ts +32 -0
  190. package/dist/base/table-view/internal/factory-private-actions.js +77 -0
  191. package/dist/base/table-view/internal/factory-private-actions.js.map +1 -0
  192. package/dist/base/table-view/internal/factory-private-displays.d.ts +5 -0
  193. package/dist/base/table-view/internal/factory-private-displays.js +21 -0
  194. package/dist/base/table-view/internal/factory-private-displays.js.map +1 -0
  195. package/dist/base/table-view/internal/factory-private-urls.d.ts +15 -0
  196. package/dist/base/table-view/internal/factory-private-urls.js +43 -0
  197. package/dist/base/table-view/internal/factory-private-urls.js.map +1 -0
  198. package/dist/base/table-view/internal/files.js +3 -4
  199. package/dist/base/table-view/internal/files.js.map +1 -1
  200. package/dist/base/table-view/internal/footer.js +5 -3
  201. package/dist/base/table-view/internal/footer.js.map +1 -1
  202. package/dist/base/table-view/internal/guards.js +7 -10
  203. package/dist/base/table-view/internal/guards.js.map +1 -1
  204. package/dist/base/table-view/internal/meta-helpers.d.ts +27 -0
  205. package/dist/base/table-view/internal/meta-helpers.js +75 -0
  206. package/dist/base/table-view/internal/meta-helpers.js.map +1 -0
  207. package/dist/base/table-view/internal/meta.js +8 -2
  208. package/dist/base/table-view/internal/meta.js.map +1 -1
  209. package/dist/base/table-view/internal/nav-badges.js +5 -3
  210. package/dist/base/table-view/internal/nav-badges.js.map +1 -1
  211. package/dist/base/table-view/internal/option-contract.d.ts +403 -0
  212. package/dist/base/table-view/internal/option-contract.js +3 -0
  213. package/dist/base/table-view/internal/option-contract.js.map +1 -0
  214. package/dist/base/table-view/internal/option-displays.d.ts +125 -0
  215. package/dist/base/table-view/internal/option-displays.js +3 -0
  216. package/dist/base/table-view/internal/option-displays.js.map +1 -0
  217. package/dist/base/table-view/internal/option-empty-states.d.ts +43 -0
  218. package/dist/base/table-view/internal/option-empty-states.js +3 -0
  219. package/dist/base/table-view/internal/option-empty-states.js.map +1 -0
  220. package/dist/base/table-view/internal/option-expandable.d.ts +66 -0
  221. package/dist/base/table-view/internal/option-expandable.js +3 -0
  222. package/dist/base/table-view/internal/option-expandable.js.map +1 -0
  223. package/dist/base/table-view/internal/option-filtering.d.ts +85 -0
  224. package/dist/base/table-view/internal/option-filtering.js +4 -0
  225. package/dist/base/table-view/internal/option-filtering.js.map +1 -0
  226. package/dist/base/table-view/internal/option-footer.d.ts +64 -0
  227. package/dist/base/table-view/internal/option-footer.js +3 -0
  228. package/dist/base/table-view/internal/option-footer.js.map +1 -0
  229. package/dist/base/table-view/internal/option-forms.d.ts +62 -0
  230. package/dist/base/table-view/internal/option-forms.js +3 -0
  231. package/dist/base/table-view/internal/option-forms.js.map +1 -0
  232. package/dist/base/table-view/internal/option-row-actions.d.ts +76 -0
  233. package/dist/base/table-view/internal/option-row-actions.js +3 -0
  234. package/dist/base/table-view/internal/option-row-actions.js.map +1 -0
  235. package/dist/base/table-view/internal/option-views.d.ts +199 -0
  236. package/dist/base/table-view/internal/option-views.js +3 -0
  237. package/dist/base/table-view/internal/option-views.js.map +1 -0
  238. package/dist/base/table-view/internal/options.d.ts +2 -6
  239. package/dist/base/table-view/internal/options.js +35 -6
  240. package/dist/base/table-view/internal/options.js.map +1 -1
  241. package/dist/base/table-view/internal/realtime.js +15 -5
  242. package/dist/base/table-view/internal/realtime.js.map +1 -1
  243. package/dist/base/table-view/internal/request-filter.js +12 -12
  244. package/dist/base/table-view/internal/request-filter.js.map +1 -1
  245. package/dist/base/table-view/internal/resource-form.js +1 -10
  246. package/dist/base/table-view/internal/resource-form.js.map +1 -1
  247. package/dist/base/table-view/internal/row-actions-schema.js +0 -6
  248. package/dist/base/table-view/internal/row-actions-schema.js.map +1 -1
  249. package/dist/base/table-view/internal/row-rule-shape.d.ts +10 -0
  250. package/dist/base/table-view/internal/row-rule-shape.js +43 -0
  251. package/dist/base/table-view/internal/row-rule-shape.js.map +1 -0
  252. package/dist/base/table-view/internal/row-rules.js +1 -4
  253. package/dist/base/table-view/internal/row-rules.js.map +1 -1
  254. package/dist/base/table-view/internal/tabs.js +3 -6
  255. package/dist/base/table-view/internal/tabs.js.map +1 -1
  256. package/dist/base/table-view/internal/validation.js +2 -16
  257. package/dist/base/table-view/internal/validation.js.map +1 -1
  258. package/dist/base/table-view/internal/writer.js +1 -0
  259. package/dist/base/table-view/internal/writer.js.map +1 -1
  260. package/dist/base/table-view/meta.js +11 -93
  261. package/dist/base/table-view/meta.js.map +1 -1
  262. package/dist/base/table-view/options.d.ts +61 -1099
  263. package/dist/base/table-view/options.js.map +1 -1
  264. package/dist/base/table-view/resource-form.js +0 -2
  265. package/dist/base/table-view/resource-form.js.map +1 -1
  266. package/dist/base/table-view/routes.js +10 -9
  267. package/dist/base/table-view/routes.js.map +1 -1
  268. package/dist/base/table-view/schema.d.ts +93 -93
  269. package/dist/base/table-view/schema.js +4 -22
  270. package/dist/base/table-view/schema.js.map +1 -1
  271. package/dist/base/table-view/source.js +0 -5
  272. package/dist/base/table-view/source.js.map +1 -1
  273. package/dist/base/table-view/views.js +0 -3
  274. package/dist/base/table-view/views.js.map +1 -1
  275. package/dist/base/table-view/writer.js +0 -5
  276. package/dist/base/table-view/writer.js.map +1 -1
  277. package/dist/base/top-list-card.d.ts +13 -13
  278. package/dist/base/top-list-card.js +2 -0
  279. package/dist/base/top-list-card.js.map +1 -1
  280. package/dist/base/types/action-target.d.ts +1 -302
  281. package/dist/base/types/button.d.ts +2 -7
  282. package/dist/base/types/button.js +35 -8
  283. package/dist/base/types/button.js.map +1 -1
  284. package/dist/base/types/confirm-dialog.d.ts +1 -127
  285. package/dist/base/types/custom-button.d.ts +1 -87
  286. package/dist/base/types/error.js +2 -1
  287. package/dist/base/types/error.js.map +1 -1
  288. package/dist/base/types/export-status.d.ts +2 -8
  289. package/dist/base/types/export-status.js +35 -9
  290. package/dist/base/types/export-status.js.map +1 -1
  291. package/dist/base/types/form-values.d.ts +1 -4
  292. package/dist/base/types/internal/action-target.d.ts +2 -8
  293. package/dist/base/types/internal/action-target.js +36 -15
  294. package/dist/base/types/internal/action-target.js.map +1 -1
  295. package/dist/base/types/row-action-operators.d.ts +3 -29
  296. package/dist/base/types/row-action-operators.js +35 -18
  297. package/dist/base/types/row-action-operators.js.map +1 -1
  298. package/dist/base/types/row-action.d.ts +3 -36
  299. package/dist/base/types/size.d.ts +1 -3
  300. package/dist/base/types/size.js +0 -3
  301. package/dist/base/types/size.js.map +1 -1
  302. package/dist/base/types/tone.d.ts +3 -8
  303. package/dist/base/types/tone.js +35 -15
  304. package/dist/base/types/tone.js.map +1 -1
  305. package/dist/base/types/watch.d.ts +5 -19
  306. package/dist/base/types/watch.js +35 -3
  307. package/dist/base/types/watch.js.map +1 -1
  308. package/dist/component-options/action-target.d.ts +304 -0
  309. package/dist/component-options/action-target.js +3 -0
  310. package/dist/component-options/action-target.js.map +1 -0
  311. package/dist/component-options/button.d.ts +93 -0
  312. package/dist/component-options/button.js +12 -0
  313. package/dist/component-options/button.js.map +1 -0
  314. package/dist/component-options/confirm-dialog.d.ts +132 -0
  315. package/dist/component-options/confirm-dialog.js +18 -0
  316. package/dist/component-options/confirm-dialog.js.map +1 -0
  317. package/dist/component-options/data-type.d.ts +101 -0
  318. package/dist/component-options/data-type.js +146 -0
  319. package/dist/component-options/data-type.js.map +1 -0
  320. package/dist/component-options/form-field.d.ts +88 -0
  321. package/dist/component-options/form-field.js +3 -0
  322. package/dist/component-options/form-field.js.map +1 -0
  323. package/dist/component-options/internal/action-target.d.ts +8 -0
  324. package/dist/component-options/internal/action-target.js +18 -0
  325. package/dist/component-options/internal/action-target.js.map +1 -0
  326. package/dist/component-options/internal/button-availability.d.ts +17 -0
  327. package/dist/component-options/internal/button-availability.js +34 -0
  328. package/dist/component-options/internal/button-availability.js.map +1 -0
  329. package/dist/component-options/internal/confirm-dialog.d.ts +13 -0
  330. package/dist/component-options/internal/confirm-dialog.js +24 -0
  331. package/dist/component-options/internal/confirm-dialog.js.map +1 -0
  332. package/dist/component-options/internal/form-field.d.ts +7 -0
  333. package/dist/component-options/internal/form-field.js +31 -0
  334. package/dist/component-options/internal/form-field.js.map +1 -0
  335. package/dist/component-options/internal/page-layout.d.ts +71 -0
  336. package/dist/component-options/internal/page-layout.js +10 -0
  337. package/dist/component-options/internal/page-layout.js.map +1 -0
  338. package/dist/component-options/page-layout.d.ts +80 -0
  339. package/dist/component-options/page-layout.js +57 -0
  340. package/dist/component-options/page-layout.js.map +1 -0
  341. package/dist/component-options/row-action.d.ts +66 -0
  342. package/dist/component-options/row-action.js +22 -0
  343. package/dist/component-options/row-action.js.map +1 -0
  344. package/dist/component-slots.js.map +1 -1
  345. package/dist/component.d.ts +2 -2
  346. package/dist/component.js +38 -193
  347. package/dist/component.js.map +1 -1
  348. package/dist/data-controllers/members.js +2 -8
  349. package/dist/data-controllers/members.js.map +1 -1
  350. package/dist/data-controllers/roles.js +0 -5
  351. package/dist/data-controllers/roles.js.map +1 -1
  352. package/dist/db/internal/exportJobs.model.js +10 -6
  353. package/dist/db/internal/exportJobs.model.js.map +1 -1
  354. package/dist/db/internal/tenantLifecycle.model.js +0 -2
  355. package/dist/db/internal/tenantLifecycle.model.js.map +1 -1
  356. package/dist/db/tables/exportJobs.table.d.ts +1 -1
  357. package/dist/db/tables/roles.table.js.map +1 -1
  358. package/dist/db/tables/user_invites.table.d.ts +1 -1
  359. package/dist/db/tables/user_invites.table.js.map +1 -1
  360. package/dist/export-status.d.ts +8 -0
  361. package/dist/export-status.js +13 -0
  362. package/dist/export-status.js.map +1 -0
  363. package/dist/hooks.d.ts +1 -1
  364. package/dist/hooks.js +2 -4
  365. package/dist/hooks.js.map +1 -1
  366. package/dist/index.js +0 -9
  367. package/dist/index.js.map +1 -1
  368. package/dist/internal/component-builder.d.ts +17 -0
  369. package/dist/internal/component-builder.js +58 -0
  370. package/dist/internal/component-builder.js.map +1 -0
  371. package/dist/internal/component-permissions.d.ts +13 -0
  372. package/dist/internal/component-permissions.js +45 -0
  373. package/dist/internal/component-permissions.js.map +1 -0
  374. package/dist/internal/component-serialization.d.ts +10 -0
  375. package/dist/internal/component-serialization.js +42 -0
  376. package/dist/internal/component-serialization.js.map +1 -0
  377. package/dist/internal/component-slots.js +7 -4
  378. package/dist/internal/component-slots.js.map +1 -1
  379. package/dist/internal/component-watches.d.ts +17 -0
  380. package/dist/internal/component-watches.js +110 -0
  381. package/dist/internal/component-watches.js.map +1 -0
  382. package/dist/internal/invite-membership.js +0 -1
  383. package/dist/internal/invite-membership.js.map +1 -1
  384. package/dist/invite-extension-payloads.d.ts +2 -0
  385. package/dist/invite-extension-payloads.js +3 -0
  386. package/dist/invite-extension-payloads.js.map +1 -0
  387. package/dist/invite-extensions/internal/delivery.js +4 -1
  388. package/dist/invite-extensions/internal/delivery.js.map +1 -1
  389. package/dist/invite-extensions/internal/edit.js +5 -4
  390. package/dist/invite-extensions/internal/edit.js.map +1 -1
  391. package/dist/invite-extensions/internal/form-slot.js +5 -35
  392. package/dist/invite-extensions/internal/form-slot.js.map +1 -1
  393. package/dist/invite-extensions/internal/payload-slices.js +10 -3
  394. package/dist/invite-extensions/internal/payload-slices.js.map +1 -1
  395. package/dist/invite-extensions/internal/registry.js +3 -5
  396. package/dist/invite-extensions/internal/registry.js.map +1 -1
  397. package/dist/invite-extensions/registry.js +3 -8
  398. package/dist/invite-extensions/registry.js.map +1 -1
  399. package/dist/invite-extensions/types.d.ts +1 -2
  400. package/dist/invite-resolution.js +2 -1
  401. package/dist/invite-resolution.js.map +1 -1
  402. package/dist/layout-banners.js.map +1 -1
  403. package/dist/notifications/builder.js +25 -5
  404. package/dist/notifications/builder.js.map +1 -1
  405. package/dist/notifications/internal.js +0 -3
  406. package/dist/notifications/internal.js.map +1 -1
  407. package/dist/notifications/sendable.js.map +1 -1
  408. package/dist/page/categories.js +1 -4
  409. package/dist/page/categories.js.map +1 -1
  410. package/dist/page/controllers.js +9 -55
  411. package/dist/page/controllers.js.map +1 -1
  412. package/dist/page/form-page-routes.js +0 -7
  413. package/dist/page/form-page-routes.js.map +1 -1
  414. package/dist/page/internal/categories.d.ts +1 -1
  415. package/dist/page/internal/categories.js +12 -36
  416. package/dist/page/internal/categories.js.map +1 -1
  417. package/dist/page/internal/category-permission.d.ts +10 -0
  418. package/dist/page/internal/category-permission.js +20 -0
  419. package/dist/page/internal/category-permission.js.map +1 -0
  420. package/dist/page/internal/component-target.js +2 -2
  421. package/dist/page/internal/component-target.js.map +1 -1
  422. package/dist/page/internal/component-tree.js +0 -2
  423. package/dist/page/internal/component-tree.js.map +1 -1
  424. package/dist/page/internal/controller-options.d.ts +6 -0
  425. package/dist/page/internal/controller-options.js +40 -0
  426. package/dist/page/internal/controller-options.js.map +1 -0
  427. package/dist/page/internal/extension-assembly.js +2 -7
  428. package/dist/page/internal/extension-assembly.js.map +1 -1
  429. package/dist/page/internal/layout-filter.js +7 -3
  430. package/dist/page/internal/layout-filter.js.map +1 -1
  431. package/dist/page/internal/metadata-components.d.ts +47 -0
  432. package/dist/page/internal/metadata-components.js +136 -0
  433. package/dist/page/internal/metadata-components.js.map +1 -0
  434. package/dist/page/internal/metadata-extension-contributions.d.ts +14 -0
  435. package/dist/page/internal/metadata-extension-contributions.js +56 -0
  436. package/dist/page/internal/metadata-extension-contributions.js.map +1 -0
  437. package/dist/page/internal/metadata-extensions.d.ts +8 -0
  438. package/dist/page/internal/metadata-extensions.js +21 -0
  439. package/dist/page/internal/metadata-extensions.js.map +1 -0
  440. package/dist/page/internal/metadata-helpers.js +0 -14
  441. package/dist/page/internal/metadata-helpers.js.map +1 -1
  442. package/dist/page/internal/metadata-info.d.ts +5 -0
  443. package/dist/page/internal/metadata-info.js +39 -0
  444. package/dist/page/internal/metadata-info.js.map +1 -0
  445. package/dist/page/internal/metadata-layout-response.d.ts +32 -0
  446. package/dist/page/internal/metadata-layout-response.js +76 -0
  447. package/dist/page/internal/metadata-layout-response.js.map +1 -0
  448. package/dist/page/internal/metadata-layout.d.ts +10 -0
  449. package/dist/page/internal/metadata-layout.js +44 -0
  450. package/dist/page/internal/metadata-layout.js.map +1 -0
  451. package/dist/page/internal/metadata-lifecycle.d.ts +52 -0
  452. package/dist/page/internal/metadata-lifecycle.js +241 -0
  453. package/dist/page/internal/metadata-lifecycle.js.map +1 -0
  454. package/dist/page/internal/metadata-owner.d.ts +53 -0
  455. package/dist/page/internal/metadata-owner.js +14 -0
  456. package/dist/page/internal/metadata-owner.js.map +1 -0
  457. package/dist/page/internal/metadata-publish.d.ts +20 -0
  458. package/dist/page/internal/metadata-publish.js +55 -0
  459. package/dist/page/internal/metadata-publish.js.map +1 -0
  460. package/dist/page/internal/metadata-registration.d.ts +8 -0
  461. package/dist/page/internal/metadata-registration.js +72 -0
  462. package/dist/page/internal/metadata-registration.js.map +1 -0
  463. package/dist/page/internal/metadata-upload-registration.d.ts +16 -0
  464. package/dist/page/internal/metadata-upload-registration.js +64 -0
  465. package/dist/page/internal/metadata-upload-registration.js.map +1 -0
  466. package/dist/page/internal/metadata-uploads.d.ts +18 -0
  467. package/dist/page/internal/metadata-uploads.js +46 -0
  468. package/dist/page/internal/metadata-uploads.js.map +1 -0
  469. package/dist/page/internal/nav-badges.d.ts +1 -1
  470. package/dist/page/internal/nav-badges.js +3 -1
  471. package/dist/page/internal/nav-badges.js.map +1 -1
  472. package/dist/page/internal/page-record.d.ts +2 -9
  473. package/dist/page/internal/page-record.js +8 -5
  474. package/dist/page/internal/page-record.js.map +1 -1
  475. package/dist/page/internal/page-registration.js +0 -4
  476. package/dist/page/internal/page-registration.js.map +1 -1
  477. package/dist/page/internal/registry.js +2 -1
  478. package/dist/page/internal/registry.js.map +1 -1
  479. package/dist/page/internal/table-view-ids.js +3 -2
  480. package/dist/page/internal/table-view-ids.js.map +1 -1
  481. package/dist/page/layout-filter.js +1 -0
  482. package/dist/page/layout-filter.js.map +1 -1
  483. package/dist/page/metadata.js +192 -558
  484. package/dist/page/metadata.js.map +1 -1
  485. package/dist/page/roots.js +3 -5
  486. package/dist/page/roots.js.map +1 -1
  487. package/dist/page/types.d.ts +15 -2
  488. package/dist/page/types.js.map +1 -1
  489. package/dist/permissions.js +0 -18
  490. package/dist/permissions.js.map +1 -1
  491. package/dist/realtime.js +0 -3
  492. package/dist/realtime.js.map +1 -1
  493. package/dist/request-tenant.js +4 -1
  494. package/dist/request-tenant.js.map +1 -1
  495. package/dist/tenant-lifecycle.js +2 -2
  496. package/dist/tenant-lifecycle.js.map +1 -1
  497. package/dist/tones.d.ts +8 -0
  498. package/dist/tones.js +19 -0
  499. package/dist/tones.js.map +1 -0
  500. package/dist/uploads.js +15 -4
  501. package/dist/uploads.js.map +1 -1
  502. package/dist/utils/internal/row-instance.js +2 -3
  503. package/dist/utils/internal/row-instance.js.map +1 -1
  504. package/dist/utils/internal/type-check.d.ts +10 -1
  505. package/dist/utils/internal/type-check.js +12 -3
  506. package/dist/utils/internal/type-check.js.map +1 -1
  507. package/dist/utils/internal/value-parser.js +7 -2
  508. package/dist/utils/internal/value-parser.js.map +1 -1
  509. package/dist/watch-actions.d.ts +19 -0
  510. package/dist/watch-actions.js +7 -0
  511. package/dist/watch-actions.js.map +1 -0
  512. package/docs/3.base/2.types.md +1 -1
  513. package/docs/3.base/8.data-types.md +2 -0
  514. package/docs/4.notifications/3.sending.md +1 -1
  515. package/docs/tsconfig.json +5 -1
  516. package/package.json +3 -9
@@ -1,82 +1,127 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.PageMetadata = void 0;
4
- const interface_api_1 = require("@antelopejs/interface-api");
5
- const interface_core_1 = require("@antelopejs/interface-core");
6
- const logging_1 = require("@antelopejs/interface-core/logging");
7
- const auth_1 = require("../auth");
8
- // Import from the defining leaf, not the dms-base barrel: the barrel pulls in
9
- // table-view, which imports the page interface back — entering through the
10
- // barrel would then call DefaultLayout() while the barrel is still
11
- // mid-evaluation.
12
- const layouts_1 = require("../base/layouts");
13
- const component_1 = require("../component");
14
- const component_slots_1 = require("../internal/component-slots");
15
- const db_1 = require("../db");
16
- const guards_1 = require("../guards");
17
- const permissions_1 = require("../permissions");
18
- const tenant_scoped_model_1 = require("../tenant-scoped-model");
19
- const tenant_access_1 = require("../tenant-access");
20
- const tenant_access_2 = require("../internal/tenant-access");
21
37
  const uploads_1 = require("../uploads");
22
- // Categories resolve controller classes through PageMetadata; neither module
23
- // dereferences the other during evaluation.
24
- // oxlint-disable import/no-cycle
25
- const categories_1 = require("./categories");
26
- const categories_2 = require("./internal/categories");
27
- const component_tree_1 = require("./internal/component-tree");
28
- const extension_assembly_1 = require("./internal/extension-assembly");
29
- const extension_validation_1 = require("./internal/extension-validation");
30
- const declaration_conflict_1 = require("./declaration-conflict");
31
- const page_routes_1 = require("./page-routes");
32
- const layout_filter_1 = require("./layout-filter");
33
- const layout_filter_2 = require("./internal/layout-filter");
34
- const page_record_1 = require("./internal/page-record");
35
- const member_access_1 = require("./internal/member-access");
36
- const table_view_ids_1 = require("./internal/table-view-ids");
37
- const registry_1 = require("./internal/registry");
38
- const page_registration_1 = require("./internal/page-registration");
39
- const metadata_helpers_1 = require("./internal/metadata-helpers");
40
- const NATIVE_UPLOAD_FIELD_TYPES = new Set(["file", "image"]);
41
- function isNativeUploadField(value) {
42
- if (!value || typeof value !== "object")
43
- return false;
44
- const node = value;
45
- return (typeof node.type === "string" &&
46
- NATIVE_UPLOAD_FIELD_TYPES.has(node.type) &&
47
- !!node.component &&
48
- typeof node.component === "object");
49
- }
50
- function readUploadConstraints(options) {
51
- const declared = options.constraints;
52
- if (!declared || typeof declared !== "object")
53
- return undefined;
54
- const constraints = {};
55
- if (typeof declared.maxSize === "number")
56
- constraints.maxSize = declared.maxSize;
57
- if (Array.isArray(declared.allowedMimetypes))
58
- constraints.allowedMimetypes = declared.allowedMimetypes.filter((mimetype) => typeof mimetype === "string");
59
- return constraints;
60
- }
61
- function resolveWritePermission(componentName, component, path) {
62
- if (componentName !== "dms-table-view")
63
- return component.getAction("submit")?.permissionId;
64
- const action = { new: "add", edit: "edit" };
65
- const mode = Object.keys(action).find((key) => path.includes(key));
66
- if (mode)
67
- return (component.getAction(action[mode])?.permissionId ??
68
- "__native_upload_disabled__");
69
- return "__native_upload_disabled__";
70
- }
71
- // Only a page that declared components has hidden them all: one declaring
72
- // none has nothing to explain.
73
- function hiddenComponentsFlag(declared, served) {
74
- const hidesAll = Object.keys(declared).length > 0 && Object.keys(served).length === 0;
75
- return hidesAll ? { allComponentsHidden: true } : {};
76
- }
38
+ // oxlint-disable-next-line import/no-cycle -- Category proxies are read after evaluation.
39
+ const metadata = __importStar(require("./internal/metadata-lifecycle"));
77
40
  class PageMetadata {
78
41
  target;
79
42
  static key = Symbol();
43
+ static {
44
+ metadata.installMetadataOwner((page) => ({
45
+ get registration() {
46
+ return page.registration;
47
+ },
48
+ get componentMap() {
49
+ return page.componentMap;
50
+ },
51
+ get componentTrees() {
52
+ return page.componentTrees;
53
+ },
54
+ get nativeUploadFields() {
55
+ return page.nativeUploadFields;
56
+ },
57
+ get notifiedComponents() {
58
+ return page.notifiedComponents;
59
+ },
60
+ get extensionEntries() {
61
+ return page.extensionEntries;
62
+ },
63
+ get layoutRef() {
64
+ return page.layoutRef;
65
+ },
66
+ get ownComponents() {
67
+ return page.ownComponents;
68
+ },
69
+ set ownComponents(value) {
70
+ page.ownComponents = value;
71
+ },
72
+ get detached() {
73
+ return page.detached;
74
+ },
75
+ set detached(value) {
76
+ page.detached = value;
77
+ },
78
+ get moduleScoped() {
79
+ return page.moduleScoped;
80
+ },
81
+ set moduleScoped(value) {
82
+ page.moduleScoped = value;
83
+ },
84
+ get skipComponentPermissions() {
85
+ return page.skipComponentPermissions;
86
+ },
87
+ set skipComponentPermissions(value) {
88
+ page.skipComponentPermissions = value;
89
+ },
90
+ get pagePermissionId() {
91
+ return page.pagePermissionId;
92
+ },
93
+ set pagePermissionId(value) {
94
+ page.pagePermissionId = value;
95
+ },
96
+ get registeredPagePermission() {
97
+ return page.registeredPagePermission;
98
+ },
99
+ set registeredPagePermission(value) {
100
+ page.registeredPagePermission = value;
101
+ },
102
+ registerPermission: (info) => page.registerPagePermission(info),
103
+ ownsPermissions: () => page.ownsPagePermissions(),
104
+ ownProperties: () => page.ownRouteProperties(),
105
+ auth: (info) => page.applyAuthDecorators(info),
106
+ route: (info) => page.registerLayoutRoute(info),
107
+ permissionId: (key) => page.componentPermissionId(key),
108
+ unregister: (component, key) => page.unregisterComponent(component, key),
109
+ register: (node) => page.registerComponentNode(node),
110
+ unregisterNode: (node) => page.unregisterComponentNode(node),
111
+ registersPermissions: () => page.registersComponentPermissions(),
112
+ actions: (component) => page.actionPermissions(component),
113
+ actionsForNode: (node) => page.actionPermissions(node.component),
114
+ notify: (node) => page.notifyPageCreated(node),
115
+ bind: (serialized, key) => page.bindNativeUploadFields(serialized, page.componentPermissionId(key)),
116
+ takenKeys: () => page.takenComponentKeys(),
117
+ path: (contribution) => page.extensionComponentPath(contribution),
118
+ prepareExtension: (contribution, path) => page.prepareComponent(contribution.component, path),
119
+ unregisterExtension: (contribution) => page.unregisterComponent(contribution.component, page.extensionComponentPath(contribution)),
120
+ drop: (info) => page.dropExtension(info),
121
+ rebuild: () => page.rebuildLayoutComponents(),
122
+ releaseGate: () => page.releaseOwnComponentsGate(),
123
+ }));
124
+ }
80
125
  pageInfo;
81
126
  layout;
82
127
  components = {};
@@ -92,13 +137,8 @@ class PageMetadata {
92
137
  nativeUploadFields = new Map();
93
138
  /** Exact live positions of a component, including mounts on multiple pages. */
94
139
  ComponentPermissionIds(component) {
95
- return [...this.componentMap.values()]
96
- .filter((node) => node.component === component && node.access === "own")
97
- .map((node) => node.permissionId);
140
+ return metadata.componentPermissionIds(this, component);
98
141
  }
99
- // What each declared component actually claimed, so the teardown gives back
100
- // exactly that — the tree is read from the component itself, which a hot
101
- // reload may have rebuilt by then.
102
142
  componentTrees = new Map();
103
143
  notifiedComponents = new Set();
104
144
  extensionEntries = new Map();
@@ -115,7 +155,7 @@ class PageMetadata {
115
155
  ownComponentsGate = Promise.resolve();
116
156
  releaseOwnComponentsGate = () => undefined;
117
157
  detached = false;
118
- registration = new page_registration_1.PageRegistration();
158
+ registration = new metadata.PageRegistration();
119
159
  pagePermissionId = "";
120
160
  registeredPagePermission = false;
121
161
  skipComponentPermissions = false;
@@ -124,60 +164,20 @@ class PageMetadata {
124
164
  this.target = target;
125
165
  }
126
166
  inherit(parent) {
127
- const merge = (src, dst) => {
128
- if (src) {
129
- if (dst) {
130
- return { ...dst, ...src };
131
- }
132
- else {
133
- return { ...src };
134
- }
135
- }
136
- else {
137
- return dst;
138
- }
139
- };
140
- this.pageInfo = merge(parent.pageInfo, this.pageInfo);
141
- this.layout = merge(parent.layout, this.layout);
142
- this.components = merge(parent.components, this.components) ?? {};
167
+ metadata.inherit(this, parent);
143
168
  }
144
169
  SetComponent(id, component) {
145
170
  this.components[id] = component;
146
171
  }
147
172
  SetInfo(id, fullSlug, menuOptions, pageLayout) {
148
- const { parent, ...menu } = menuOptions;
149
- const resolvedCategory = (0, categories_2.resolveCategoryInfo)(menu.category);
150
- const parentFullId = resolvedCategory?.fullId ?? "";
151
- const fullId = parentFullId ? `${parentFullId}.${id}` : id;
152
- const location = (0, page_routes_1.pageRoutePath)(fullSlug, "/pagelayout");
153
- const pageInfo = {
154
- ...menu,
155
- category: resolvedCategory,
156
- id,
157
- fullId,
158
- fullSlug,
159
- layoutUrl: location,
160
- parentSlug: parent ? (0, categories_2.resolveCategoryInfo)(parent)?.fullSlug : undefined,
161
- hidden: menu.hidden || resolvedCategory?.hidden,
162
- publicAccess: menu.publicAccess || resolvedCategory?.publicAccess,
163
- authOnly: menu.authOnly || resolvedCategory?.authOnly,
164
- memberAccess: menu.memberAccess ||
165
- (0, member_access_1.inheritedMemberAccess)(resolvedCategory?.memberAccess),
166
- bypassTenantAccessGate: menu.bypassTenantAccessGate || resolvedCategory?.bypassTenantAccessGate,
167
- };
168
- this.layout =
169
- pageLayout ??
170
- menu.layout ??
171
- (0, categories_2.resolveInheritedLayout)(resolvedCategory) ??
172
- (0, layouts_1.DefaultLayout)();
173
- this.pageInfo = pageInfo;
173
+ metadata.setPageInfo(this, id, fullSlug, menuOptions, pageLayout);
174
174
  }
175
175
  async Register() {
176
176
  const pageInfo = this.pageInfo;
177
177
  if (!pageInfo) {
178
178
  throw new Error("PageMetadata not properly initialized");
179
179
  }
180
- this.registration = new page_registration_1.PageRegistration();
180
+ this.registration = new metadata.PageRegistration();
181
181
  this.layoutRef = { layout: this.layout, components: {} };
182
182
  this.ownComponents = {};
183
183
  this.componentMap = new Map();
@@ -185,17 +185,9 @@ class PageMetadata {
185
185
  this.notifiedComponents = new Set();
186
186
  this.extensionEntries = new Map();
187
187
  this.detached = false;
188
- // Shut before the page is published: from that point an extension can find
189
- // it and try to graft onto it. Everything that follows runs inside the try,
190
- // so nothing failing on the way can leave the gate shut — a page whose gate
191
- // stays shut holds every sync on it, teardowns included.
192
188
  this.closeOwnComponentsGate();
193
189
  try {
194
190
  this.publish(pageInfo);
195
- // Every permission is registered before the first await, so
196
- // GetResponsibleModule() still sees the registering module's frame:
197
- // resolved from an async continuation it returns nothing, and the
198
- // core's own sweep then has no module to attribute them to.
199
191
  const prepared = Object.entries(this.components).map(([key, component]) => this.prepareComponent(component, key));
200
192
  for (const prepare of prepared) {
201
193
  const { key, serialized } = await prepare();
@@ -205,9 +197,6 @@ class PageMetadata {
205
197
  this.rebuildLayoutComponents();
206
198
  }
207
199
  catch (error) {
208
- // A half-registered page is worse than none: it sits in the registry,
209
- // routed, with no layout to serve. Detached with it, so a sync held back
210
- // by the gate does not graft extensions onto the wreck once released.
211
200
  this.detached = true;
212
201
  this.registration.dispose();
213
202
  throw error;
@@ -215,8 +204,8 @@ class PageMetadata {
215
204
  finally {
216
205
  this.releaseOwnComponentsGate();
217
206
  }
218
- if (registry_1.pageExtensions.has(pageInfo.fullId)) {
219
- await (0, registry_1.syncTargetExtensions)(pageInfo.fullId);
207
+ if (metadata.pageExtensions.has(pageInfo.fullId)) {
208
+ await metadata.syncTargetExtensions(pageInfo.fullId);
220
209
  }
221
210
  }
222
211
  /**
@@ -231,40 +220,7 @@ class PageMetadata {
231
220
  * later extensions would graft themselves onto.
232
221
  */
233
222
  publish(pageInfo) {
234
- const previous = registry_1.pageMetadataByFullId.get(pageInfo.fullId);
235
- registry_1.pageMetadataByFullId.set(pageInfo.fullId, this);
236
- this.registration.track(() => {
237
- if (registry_1.pageMetadataByFullId.get(pageInfo.fullId) === this) {
238
- registry_1.pageMetadataByFullId.delete(pageInfo.fullId);
239
- }
240
- });
241
- if (previous && previous !== this) {
242
- previous.Dispose();
243
- }
244
- (0, registry_1.stampPageRegistration)(pageInfo);
245
- categories_1.internal.RegisterPage.register(pageInfo);
246
- this.registration.track(() => {
247
- categories_1.internal.RegisterPage.unregister(pageInfo);
248
- });
249
- this.moduleScoped = (0, categories_1.isInsideModule)(pageInfo);
250
- this.skipComponentPermissions =
251
- pageInfo.noComponentPermissions === true || pageInfo.authOnly === true;
252
- this.pagePermissionId = this.registerPagePermission(pageInfo);
253
- registry_1.permissionMap.set(this.target, this.pagePermissionId);
254
- this.registration.track(() => {
255
- if (!this.ownsPagePermissions())
256
- return;
257
- registry_1.permissionMap.delete(this.target);
258
- if (this.registeredPagePermission && this.pagePermissionId) {
259
- (0, permissions_1.UnregisterPermission)(this.pagePermissionId);
260
- this.registeredPagePermission = false;
261
- }
262
- });
263
- this.ownRouteProperties();
264
- this.applyAuthDecorators(pageInfo);
265
- (0, metadata_helpers_1.RequestQueryProperty)()(this.target.prototype, "pageQuery");
266
- (0, metadata_helpers_1.RequestRouteParametersProperty)()(this.target.prototype, "pageParams");
267
- this.registerLayoutRoute(pageInfo);
223
+ metadata.publish(this, pageInfo);
268
224
  }
269
225
  /**
270
226
  * Take down everything this registration created. Idempotent, and safe to
@@ -274,20 +230,7 @@ class PageMetadata {
274
230
  * @internal
275
231
  */
276
232
  Dispose() {
277
- this.detached = true;
278
- this.releaseOwnComponentsGate();
279
- // Extensions belong to other modules: they survive this page and re-apply
280
- // if it registers again, but nothing of theirs may outlive it in the
281
- // permission tree. Synchronous, unlike registration, so a hot reload that
282
- // re-registers immediately cannot have this land on the replacement.
283
- // Snapshot: dropExtension deletes from the map being iterated.
284
- // oxlint-disable-next-line unicorn/no-useless-spread
285
- for (const info of [...this.extensionEntries.keys()]) {
286
- this.dropExtension(info);
287
- }
288
- this.rebuildLayoutComponents();
289
- this.ownComponents = {};
290
- this.registration.dispose();
233
+ metadata.dispose(this);
291
234
  }
292
235
  /**
293
236
  * Bring the page's injected components in line with the extensions currently
@@ -304,8 +247,6 @@ class PageMetadata {
304
247
  const run = this.extensionSyncQueue
305
248
  .then(() => this.awaitOwnComponents())
306
249
  .then(() => this.applyRegisteredExtensions());
307
- // The queue itself must never stay rejected, or a single failed sync would
308
- // silently freeze every later registration and teardown on this page.
309
250
  this.extensionSyncQueue = run.catch(() => undefined);
310
251
  return run;
311
252
  }
@@ -327,15 +268,12 @@ class PageMetadata {
327
268
  * @internal Read by the menu, which leaves such a page out.
328
269
  */
329
270
  async HidesEveryComponent(permissions) {
330
- if (this.pageInfo?.publicAccess === true || this.skipComponentPermissions) {
331
- return false;
332
- }
333
- const keys = Object.keys(this.layoutRef?.components ?? {});
334
- if (keys.length === 0)
271
+ const keys = metadata.permissionKeys(this);
272
+ if (!keys)
335
273
  return false;
336
274
  for (const key of keys) {
337
275
  const permissionId = this.componentPermissionId(key);
338
- if (await (0, permissions_1.HasPermission)(permissions, permissionId))
276
+ if (await metadata.HasPermission(permissions, permissionId))
339
277
  return false;
340
278
  }
341
279
  return true;
@@ -357,9 +295,6 @@ class PageMetadata {
357
295
  }
358
296
  closeOwnComponentsGate() {
359
297
  this.ownComponentsReady = false;
360
- // Release the gate being replaced before dropping the only handle on its
361
- // resolver: whoever waits on it would otherwise wait on a promise nobody
362
- // can settle any more. `awaitOwnComponents` catches them up with this one.
363
298
  this.releaseOwnComponentsGate();
364
299
  this.ownComponentsGate = new Promise((resolve) => {
365
300
  this.releaseOwnComponentsGate = resolve;
@@ -368,15 +303,8 @@ class PageMetadata {
368
303
  async applyRegisteredExtensions() {
369
304
  const infos = this.detached
370
305
  ? []
371
- : (registry_1.pageExtensions.get(this.pageInfo?.fullId ?? "") ?? []);
372
- const desired = new Set(infos);
373
- // Snapshot: dropExtension deletes from the map being iterated.
374
- // oxlint-disable-next-line unicorn/no-useless-spread
375
- for (const info of [...this.extensionEntries.keys()]) {
376
- if (!desired.has(info)) {
377
- this.dropExtension(info);
378
- }
379
- }
306
+ : (metadata.pageExtensions.get(this.pageInfo?.fullId ?? "") ?? []);
307
+ metadata.removeStaleExtensions(this, infos);
380
308
  for (const info of infos) {
381
309
  if (!this.extensionEntries.has(info)) {
382
310
  await this.addExtension(info);
@@ -385,141 +313,45 @@ class PageMetadata {
385
313
  this.rebuildLayoutComponents();
386
314
  }
387
315
  registerPagePermission(pageInfo) {
388
- const fromAction = pageInfo.permission instanceof component_1.Action
389
- ? pageInfo.permission.toPermission()
390
- : undefined;
391
- const pagePermission = fromAction ?? {
392
- id: pageInfo.fullId,
393
- title: pageInfo.displayName,
394
- icon: pageInfo.icon,
395
- defaultGranted: pageInfo.publicAccess || (0, member_access_1.opensToMembers)(pageInfo.memberAccess),
396
- ...pageInfo.permission,
397
- };
398
- this.registeredPagePermission = false;
399
- if (this.moduleScoped) {
400
- (0, permissions_1.MarkModuleScopedPermission)(pagePermission.id);
401
- }
402
- else if (!fromAction && pageInfo.authOnly !== true) {
403
- (0, permissions_1.RegisterPermission)(pagePermission.id, pagePermission);
404
- this.registeredPagePermission = true;
405
- }
406
- return pagePermission.id;
316
+ return metadata.registerPermission(this, pageInfo);
407
317
  }
408
318
  registerLayoutRoute(pageInfo) {
409
- const apimeta = (0, interface_core_1.GetMetadata)(this.target, interface_api_1.ControllerMeta);
410
- const resolvePageLayout = (request) => this.resolvePageLayout(request);
411
- // The by-slug entry carries no guard of its own, so it asks the resolver
412
- // to assert the gate; the route below is already guarded.
413
- const handler = (request) => this.resolvePageLayout(request, { enforceTenantAccessGate: true });
414
- registry_1.pageLayoutHandlers.set(pageInfo.fullSlug, handler);
415
- const routeId = (0, interface_api_1.RegisterRoute)({
416
- location: pageInfo.layoutUrl,
417
- callback: async function () {
418
- return resolvePageLayout({
419
- user: this.user,
420
- memberModel: this.memberModel,
421
- roleModel: this.roleModel,
422
- tenantId: this.tenantId,
423
- query: this.pageQuery,
424
- params: this.pageParams,
425
- });
426
- },
427
- method: "GET",
428
- mode: "handler",
429
- parameters: [],
430
- properties: apimeta.computed_props,
431
- proto: this.target.prototype,
432
- });
433
- this.registration.track(() => {
434
- if (registry_1.pageLayoutHandlers.get(pageInfo.fullSlug) === handler) {
435
- registry_1.pageLayoutHandlers.delete(pageInfo.fullSlug);
436
- }
437
- // …and the page's own HTTP route. The by-slug entry used to be the only
438
- // half taken down, so an unregistered page kept answering on its direct
439
- // route for as long as its module stayed loaded — the very thing the
440
- // by-slug cleanup was added to prevent.
441
- (0, interface_api_1.UnregisterRoute)(routeId);
319
+ metadata.registerLayoutRoute(() => this.target, pageInfo, () => this.registration, (request) => this.resolvePageLayout(request), (request, options) => this.resolvePageLayout(request, options));
320
+ }
321
+ async resolvePageLayout({ user, memberModel, roleModel, tenantId, query, params, resolverContext, }, { enforceTenantAccessGate = false } = {}) {
322
+ const layout = metadata.registeredLayout(this);
323
+ if (metadata.tenantGateRequired(this, enforceTenantAccessGate, user)) {
324
+ await metadata.AssertTenantAccess(user._id, tenantId);
325
+ }
326
+ const components = await metadata.ResolveComponentSlots(layout.components);
327
+ const { loadPermissions, context } = metadata.prepareLayoutContext({
328
+ user,
329
+ memberModel,
330
+ roleModel,
331
+ tenantId,
332
+ query,
333
+ params,
334
+ resolverContext,
442
335
  });
443
- }
444
- async resolvePageLayout({ user, memberModel, roleModel, tenantId, query, params, resolverContext, },
445
- // Only for the by-slug entry, which has no guard of its own.
446
- { enforceTenantAccessGate = false } = {}) {
447
- const layout = this.layoutRef;
448
- if (!layout) {
449
- throw new Error("PageMetadata not properly initialized");
450
- }
451
- // Only for the by-slug entry: the page's own route already asserts the
452
- // gate through its auth decorators, and asserting again would cost every
453
- // page load a second sweep of user-supplied gate callbacks. `/dms/pagelayout`
454
- // has no such guard — it asks for a session and nothing else — so without
455
- // this the page-level `bypassTenantAccessGate` flag would be advisory: a
456
- // member of a denied tenant could read the layout, upload tokens included,
457
- // of every page that did not opt out.
458
- //
459
- // Which surfaces survive a denial is `gateAllowsSurface`'s call, shared
460
- // with the menu and realtime page access so the three cannot drift.
461
- if (enforceTenantAccessGate &&
462
- user &&
463
- this.pageInfo &&
464
- !(0, tenant_access_2.gateAllowsSurface)(this.pageInfo, true)) {
465
- await (0, tenant_access_1.AssertTenantAccess)(user._id, tenantId);
466
- }
467
- // Slots are resolved per request rather than baked into the cached layout:
468
- // a component that opens one is answering contributors that may register at
469
- // any time, long after this page did. Resolved *before* the permission
470
- // filter, so contributed content goes through every filter the page's own
471
- // content does — a contributed watch guarded by `requirePermission`
472
- // included.
473
- const components = await (0, component_slots_1.ResolveComponentSlots)(layout.components);
474
- // Upload tokens are already baked into the cached layout: each form
475
- // stamped its own fields when it serialized, at registration
476
- // (`SignUploadToken` in interfaces/dms/uploads).
477
- const loadPermissions = async () => {
478
- if (!user)
479
- return new Set();
480
- const roleIds = (await memberModel.getByUser(user._id))?.roleIds ?? [];
481
- return (0, permissions_1.GetEffectiveUserPermissions)(user, tenantId, roleIds, roleModel, resolverContext);
482
- };
483
- // Header actions declaring a permission are filtered on every page, even
484
- // one skipping component permissions: they name their own requirement.
485
- // The page's record is read first, so every availability of the page
486
- // reads it with the URL.
487
- const context = { tenantId, user, query, params };
488
- const read = await (0, page_record_1.readPageRecord)(layout.layout, context);
336
+ const read = await metadata.readPageRecord(layout.layout, context);
489
337
  context.record = read?.record;
490
338
  if (this.pageInfo?.publicAccess === true || this.skipComponentPermissions) {
491
- return {
492
- ...layout,
493
- layout: (0, layout_filter_2.withComponentHeaderButtons)(await (0, layout_filter_2.filterLayoutHeaderActions)(layout.layout, loadPermissions, context, this.pagePermissionId, read?.status), components),
494
- components: (0, table_view_ids_1.withTableViewPlacements)(components),
495
- };
339
+ const respond = metadata.prepareLayoutResponse(layout, components);
340
+ return respond(await metadata.filterPageHeader(this, layout, loadPermissions, context, read));
496
341
  }
497
342
  const permissions = await loadPermissions();
498
- const servedComponents = await (0, layout_filter_1.filterComponents)(components, this.pagePermissionId, permissions, this.componentMap, context);
499
- return {
500
- ...layout,
501
- // A component's header buttons are added once it was filtered: the
502
- // ones the caller may not press are gone already.
503
- layout: (0, layout_filter_2.withComponentHeaderButtons)(await (0, layout_filter_2.filterLayoutHeaderActions)(layout.layout, async () => permissions, context, this.pagePermissionId, read?.status), servedComponents),
504
- components: (0, table_view_ids_1.withTableViewPlacements)(servedComponents),
505
- ...hiddenComponentsFlag(components, servedComponents),
506
- };
343
+ const served = await metadata.filterPageComponents(this, components, permissions, context);
344
+ const respond = metadata.prepareFilteredLayoutResponse(layout, components, served);
345
+ return respond(await metadata.filterPageHeader(this, layout, async () => permissions, context, read));
507
346
  }
508
- // Component and action ids descend from the page permission id, so a module
509
- // page's mark already covers them — they only need to stay out of the
510
- // grantable permission tree.
511
347
  registersComponentPermissions() {
512
348
  return !this.skipComponentPermissions && !this.moduleScoped;
513
349
  }
514
- componentPermissionId(componentKey) {
515
- return `${this.pagePermissionId}.${componentKey}`;
350
+ componentPermissionId(key) {
351
+ return `${this.pagePermissionId}.${key}`;
516
352
  }
517
353
  actionPermissions(component) {
518
- const grantsMembers = (0, member_access_1.opensToMembers)(this.pageInfo?.memberAccess);
519
- return Object.values(component.actions)
520
- .map((action) => action.toPermission())
521
- .filter((permission) => !!permission)
522
- .map((permission) => grantsMembers ? { ...permission, defaultGranted: true } : permission);
354
+ return metadata.actionPermissions(component, this.pageInfo);
523
355
  }
524
356
  /**
525
357
  * Claim a component's permissions now, and hand back the serialization to
@@ -535,113 +367,37 @@ class PageMetadata {
535
367
  * of its position: they take part in per-request filtering under that id, so
536
368
  * a child that never claimed it would have its `onFilter` skipped.
537
369
  */
538
- prepareComponent(component, componentKey) {
539
- const nodes = (0, component_tree_1.collectComponentTree)(component, this.componentPermissionId(componentKey));
540
- this.componentTrees.set(componentKey, nodes);
541
- // Tracked before anything is claimed: `onPageCreated` is consumer code and
542
- // can throw between the permission being registered and the end of this
543
- // method, and the rollback can only undo what it was told about.
544
- this.registration.track(() => {
545
- this.unregisterComponent(component, componentKey);
546
- });
547
- for (const node of nodes) {
548
- this.registerComponentNode(node);
549
- }
550
- return async () => {
551
- const serialized = await component.serialize();
552
- if (this.detached || this.componentTrees.get(componentKey) !== nodes)
553
- return { key: componentKey, serialized };
554
- await this.bindNativeUploadFields(serialized, this.componentPermissionId(componentKey));
555
- return { key: componentKey, serialized };
556
- };
370
+ prepareComponent(component, key) {
371
+ return metadata.prepareComponent(this, component, key);
557
372
  }
558
- async bindNativeUploadFields(serialized, componentId) {
559
- if (this.detached || this.componentMap.get(componentId)?.access !== "own")
373
+ async bindNativeUploadFields(serialized, id) {
374
+ if (!metadata.prepareUploadOptions(this, serialized, id))
560
375
  return;
561
- if (serialized.options)
562
- serialized.options = JSON.parse(JSON.stringify(serialized.options));
563
- await this.bindUploadOptions(serialized.options, serialized.componentName, componentId, []);
376
+ await this.bindUploadOptions(serialized.options, serialized.componentName, id, []);
564
377
  for (const child of serialized.children ?? []) {
565
- await this.bindNativeUploadFields(child.component, `${componentId}.${child.id}`);
378
+ await this.bindNativeUploadFields(child.component, `${id}.${child.id}`);
566
379
  }
567
380
  }
568
- async bindUploadOptions(value, componentName, componentId, path) {
381
+ async bindUploadOptions(value, name, id, path) {
382
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Serialized options may be primitives; recurse only through objects.
569
383
  if (!value || typeof value !== "object")
570
384
  return;
571
- if (isNativeUploadField(value)) {
572
- await this.registerNativeUploadField(value, componentName, componentId, path);
385
+ if (metadata.isNativeUploadField(value)) {
386
+ await this.registerNativeUploadField(value, name, id, path);
573
387
  }
574
388
  for (const [key, child] of Object.entries(value)) {
575
- await this.bindUploadOptions(child, componentName, componentId, [
576
- ...path,
577
- key,
578
- ]);
389
+ await this.bindUploadOptions(child, name, id, [...path, key]);
579
390
  }
580
391
  }
581
- async registerNativeUploadField(node, componentName, componentId, path) {
582
- const mount = this.componentMap.get(componentId);
583
- if (this.detached || mount?.access !== "own")
392
+ async registerNativeUploadField(node, name, id, path) {
393
+ const phase = metadata.prepareUploadRegistration(this, node, name, id, path);
394
+ if (!phase)
584
395
  return;
585
- const options = node.component.options ?? {};
586
- node.component.options = options;
587
- const registration = {
588
- pageId: this.pageInfo?.fullId ?? "",
589
- componentId,
590
- storage: typeof options.storage === "string" ? options.storage : undefined,
591
- path: typeof options.path === "string" ? options.path : undefined,
592
- field: typeof options.attachmentField === "string"
593
- ? options.attachmentField
594
- : path.join("/"),
595
- visibility: options.visibility === "public" ? "public" : "private",
596
- writePermission: node.disabled
597
- ? "__native_upload_disabled__"
598
- : resolveWritePermission(componentName, mount.component, path),
599
- readPermissions: this.registersComponentPermissions() && !this.pageInfo?.publicAccess
600
- ? componentId
601
- .slice(this.pagePermissionId.length + 1)
602
- .split(".")
603
- .map((_, index, parts) => `${this.pagePermissionId}.${parts.slice(0, index + 1).join(".")}`)
604
- : [],
605
- constraints: readUploadConstraints(options),
606
- };
607
- options.uploadToken = await (0, uploads_1.SignUploadToken)(registration);
608
- if (this.detached || this.componentMap.get(componentId) !== mount)
609
- return;
610
- uploads_1.internal.RegisterNativeUploadField.register(registration);
611
- const fields = this.nativeUploadFields.get(componentId) ?? [];
612
- fields.push(registration);
613
- this.nativeUploadFields.set(componentId, fields);
396
+ phase.options.uploadToken = await (0, uploads_1.SignUploadToken)(phase.registration);
397
+ metadata.finishUploadRegistration(this, phase);
614
398
  }
615
399
  registerComponentNode(node) {
616
- const { component, permissionId } = node;
617
- this.componentMap.set(permissionId, node);
618
- // A withheld position claims nothing: its id belongs to an action, and it
619
- // is in the map only so the filter can refuse it. Its hook stays unrun —
620
- // a component that is never served must not register side effects.
621
- if (node.access === "withheld")
622
- return;
623
- // First position wins, and the walk is parent-first: a component mounted
624
- // both by the page and inside another keeps the id it is declared under.
625
- // Overwriting would make `GetPermissionId` — and every guard built on it —
626
- // depend on walk order.
627
- if (node.access === "own" && !registry_1.permissionMap.has(component)) {
628
- registry_1.permissionMap.set(component, permissionId);
629
- }
630
- if (this.registersComponentPermissions() && node.access === "own") {
631
- (0, permissions_1.RegisterPermission)(permissionId, {
632
- id: permissionId,
633
- title: component.metadata.name,
634
- icon: component.metadata.icon,
635
- description: component.metadata.description,
636
- defaultGranted: (0, member_access_1.opensToMembers)(this.pageInfo?.memberAccess),
637
- });
638
- }
639
- this.notifyPageCreated(node);
640
- if (this.registersComponentPermissions()) {
641
- for (const actionPermission of this.actionPermissions(component)) {
642
- (0, permissions_1.RegisterPermission)(actionPermission.id, actionPermission);
643
- }
644
- }
400
+ metadata.registerComponentNode(this, node);
645
401
  }
646
402
  /**
647
403
  * Run a component's `onCreated` hook, once per registration whatever the
@@ -656,26 +412,7 @@ class PageMetadata {
656
412
  * a half-registered page is worse than none.
657
413
  */
658
414
  notifyPageCreated(node) {
659
- if (!node.component.onPageCreated)
660
- return;
661
- if (this.notifiedComponents.has(node.component))
662
- return;
663
- this.notifiedComponents.add(node.component);
664
- if (node.depth === 0) {
665
- node.component.onPageCreated(this);
666
- return;
667
- }
668
- try {
669
- node.component.onPageCreated(this);
670
- }
671
- catch (error) {
672
- // …except what two components both claim (a form route, the writing
673
- // TableView of a controller): the page cannot honour both declarations,
674
- // and carrying on would silently serve one of them in place of the other.
675
- if (error instanceof declaration_conflict_1.PageDeclarationConflictError)
676
- throw error;
677
- logging_1.Logging.Error(`[dms] component "${node.permissionId}" failed its onCreated hook on page "${this.pageInfo?.fullId}": ${String(error)}`);
678
- }
415
+ metadata.notifyPageCreated(this, node);
679
416
  }
680
417
  /**
681
418
  * A page's permission ids are derived from its `fullId`, so a metadata
@@ -684,77 +421,20 @@ class PageMetadata {
684
421
  * owner — or nobody, when the page is gone for good — may take them down.
685
422
  */
686
423
  ownsPagePermissions() {
687
- const owner = registry_1.pageMetadataByFullId.get(this.pageInfo?.fullId ?? "");
688
- return owner === undefined || owner === this;
689
- }
690
- // Nothing was prepared under this key — a teardown replayed after the
691
- // extension that owned it was already dropped, or a walk that threw before
692
- // claiming anything. Giving back what was never taken would unregister a
693
- // permission another position still holds.
694
- unregisterComponent(_component, componentKey) {
695
- const nodes = this.componentTrees.get(componentKey);
696
- if (!nodes)
697
- return;
698
- this.componentTrees.delete(componentKey);
699
- for (const node of nodes) {
700
- for (const field of this.nativeUploadFields.get(node.permissionId) ??
701
- []) {
702
- uploads_1.internal.RegisterNativeUploadField.unregister(field);
703
- }
704
- this.nativeUploadFields.delete(node.permissionId);
705
- this.componentMap.delete(node.permissionId);
706
- this.notifiedComponents.delete(node.component);
707
- }
708
- if (!this.ownsPagePermissions())
709
- return;
710
- for (const node of nodes) {
711
- this.unregisterComponentNode(node);
712
- }
424
+ return metadata.ownsPagePermissions(this);
425
+ }
426
+ unregisterComponent(_component, key) {
427
+ metadata.unregisterComponent(this, key);
713
428
  }
714
- // Action ids are resolved through `permissionMap`, so the node's own entry
715
- // only goes once its actions have been given back — and only when the entry
716
- // is this position's, since another one may have claimed the instance first.
717
429
  unregisterComponentNode(node) {
718
- if (node.access === "withheld")
719
- return;
720
- if (this.registersComponentPermissions()) {
721
- for (const actionPermission of this.actionPermissions(node.component)) {
722
- (0, permissions_1.UnregisterPermission)(actionPermission.id);
723
- }
724
- }
725
- if (node.access !== "own")
726
- return;
727
- if (this.registersComponentPermissions()) {
728
- (0, permissions_1.UnregisterPermission)(node.permissionId);
729
- }
730
- if (registry_1.permissionMap.get(node.component) === node.permissionId) {
731
- registry_1.permissionMap.delete(node.component);
732
- }
430
+ metadata.unregisterComponentNode(this, node);
733
431
  }
734
- // A component is tracked before it is processed, so a detach landing mid-way
735
- // still finds it. One that fails to register is taken back down and left out
736
- // of the layout, while the rest of its extension stands: the extension is
737
- // recorded either way, so a later sync never replays an `onPageCreated` side
738
- // effect that already ran.
739
432
  async addExtension(info) {
740
- const errors = (0, extension_validation_1.collectExtensionErrors)(info, {
741
- own: this.ownComponents,
742
- taken: this.takenComponentKeys(),
743
- });
744
- const entries = [];
745
- // Recorded even when it contributes nothing: an extension the page refused
746
- // must not be re-examined — and re-reported — on every later sync.
747
- this.extensionEntries.set(info, entries);
748
- if (errors.length > 0) {
749
- for (const error of errors) {
750
- logging_1.Logging.Error(`[dms] ${error}`);
751
- }
433
+ const entries = metadata.prepareExtensionEntries(this, info);
434
+ if (!entries)
752
435
  return;
753
- }
754
436
  for (const [declarationIndex, contribution] of info.components.entries()) {
755
- // Revoked mid-way: its module is going away, and running in that
756
- // module's context now would claim a generation that is being released.
757
- if (!(0, registry_1.isPageExtensionRegistered)(info))
437
+ if (!metadata.isPageExtensionRegistered(info))
758
438
  break;
759
439
  entries.push({
760
440
  ...contribution,
@@ -762,20 +442,12 @@ class PageMetadata {
762
442
  declarationIndex,
763
443
  });
764
444
  try {
765
- const componentPath = this.extensionComponentPath(contribution);
766
- // Both halves, as the extending module: the claim registers
767
- // permissions and runs `onCreated`, the serialization binds native
768
- // upload fields.
769
- const prepare = (0, registry_1.runAsPageExtensionOwner)(info, () => this.prepareComponent(contribution.component, componentPath));
770
- const { serialized } = await (0, registry_1.runAsPageExtensionOwner)(info, prepare);
445
+ const prepare = metadata.prepareExtensionComponent(this, info, contribution);
446
+ const { serialized } = await metadata.runAsPageExtensionOwner(info, prepare);
771
447
  entries[entries.length - 1].serialized = serialized;
772
448
  }
773
449
  catch (error) {
774
- entries.pop();
775
- this.unregisterComponent(contribution.component, this.extensionComponentPath(contribution));
776
- if (error instanceof declaration_conflict_1.PageDeclarationConflictError)
777
- throw error;
778
- logging_1.Logging.Error(`[dms] page extension "${info.extensionName}" could not register component "${contribution.key}" on page "${info.targetFullId}": ${String(error)}`);
450
+ metadata.reportExtensionFailure(this, entries, info, contribution, error);
779
451
  }
780
452
  }
781
453
  if (this.detached) {
@@ -788,31 +460,16 @@ class PageMetadata {
788
460
  * because a page's components share one permission subtree.
789
461
  */
790
462
  takenComponentKeys() {
791
- const owner = this.pageInfo?.fullId ?? "";
792
- const taken = new Map(Object.keys(this.ownComponents).map((key) => [key, owner]));
793
- for (const [info, entries] of this.extensionEntries) {
794
- for (const entry of entries) {
795
- taken.set(entry.key, info.extensionName);
796
- }
797
- }
798
- return taken;
463
+ return metadata.takenKeys(this);
799
464
  }
800
465
  dropExtension(info) {
801
- for (const entry of this.extensionEntries.get(info) ?? []) {
802
- this.unregisterComponent(entry.component, this.extensionComponentPath(entry));
803
- }
804
- this.extensionEntries.delete(info);
466
+ metadata.dropExtension(this, info);
805
467
  }
806
468
  extensionComponentPath(component) {
807
- const anchorPath = component.anchorPath ?? [];
808
- if (anchorPath.length <= 1)
809
- return component.key;
810
- return [...anchorPath.slice(0, -1), component.key].join(".");
469
+ return metadata.extensionComponentPath(component);
811
470
  }
812
471
  rebuildLayoutComponents() {
813
- if (!this.layoutRef)
814
- return;
815
- this.layoutRef.components = (0, extension_assembly_1.assembleLayoutComponents)(this.ownComponents, [...this.extensionEntries.values()].flat());
472
+ metadata.rebuildLayoutComponents(this);
816
473
  }
817
474
  /**
818
475
  * Give the page's controller its own copy of every route property it
@@ -826,33 +483,10 @@ class PageMetadata {
826
483
  * of its last form (`<table>.view`), and a form page for the one after it.
827
484
  */
828
485
  ownRouteProperties() {
829
- const properties = (0, interface_core_1.GetMetadata)(this.target, interface_api_1.ControllerMeta).computed_props;
830
- for (const [key, property] of Object.entries(properties)) {
831
- properties[key] = { ...property, modifiers: [...property.modifiers] };
832
- }
486
+ metadata.ownRouteProperties(this.target);
833
487
  }
834
488
  applyAuthDecorators(pageInfo) {
835
- if (pageInfo.publicAccess === true)
836
- return;
837
- const authOnly = pageInfo.authOnly === true;
838
- const isModulePage = (0, metadata_helpers_1.isPageInsideModule)(pageInfo);
839
- this.guardOptions = {
840
- bypassTenantAccessGate: pageInfo.bypassTenantAccessGate,
841
- };
842
- const authDecorator = authOnly
843
- ? (0, auth_1.AuthUser)()
844
- : isModulePage
845
- ? (0, auth_1.AuthOwnerOnly)()
846
- : (0, guards_1.AuthUserWithPermission)(this.target, this.guardOptions);
847
- authDecorator(this.target.prototype, "user");
848
- if (isModulePage && !authOnly) {
849
- (0, metadata_helpers_1.logModuleRouteGated)(pageInfo.fullSlug);
850
- }
851
- if (authOnly)
852
- return;
853
- (0, tenant_scoped_model_1.TenantScopedModel)(db_1.RoleModel)(this.target.prototype, "roleModel");
854
- (0, tenant_scoped_model_1.TenantScopedModel)(db_1.TenantMemberModel)(this.target.prototype, "memberModel");
855
- (0, metadata_helpers_1.RequestTenantIdProperty)()(this.target.prototype, "tenantId");
489
+ metadata.applyAuthDecorators(this, pageInfo);
856
490
  }
857
491
  }
858
492
  exports.PageMetadata = PageMetadata;