@antelopejs/dms 0.9.8 → 0.11.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 (451) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/README.md +1 -1
  3. package/data/module-store/catalog.json +2 -2
  4. package/dist/attachments/table-view.js +2 -2
  5. package/dist/attachments/table-view.js.map +1 -1
  6. package/dist/automation/actions.d.ts +2 -0
  7. package/dist/automation/actions.js +116 -71
  8. package/dist/automation/actions.js.map +1 -1
  9. package/dist/automation/i18n.d.ts +4 -0
  10. package/dist/automation/i18n.js +19 -0
  11. package/dist/automation/i18n.js.map +1 -0
  12. package/dist/automation/send-notification.d.ts +21 -0
  13. package/dist/automation/send-notification.js +163 -0
  14. package/dist/automation/send-notification.js.map +1 -0
  15. package/dist/automation/triggers.js +19 -25
  16. package/dist/automation/triggers.js.map +1 -1
  17. package/dist/client-origin-cors.d.ts +1 -0
  18. package/dist/client-origin-cors.js +19 -0
  19. package/dist/client-origin-cors.js.map +1 -0
  20. package/dist/config.d.ts +3 -2
  21. package/dist/config.js +5 -7
  22. package/dist/config.js.map +1 -1
  23. package/dist/frontend-module.d.ts +4 -0
  24. package/dist/frontend-module.js +37 -0
  25. package/dist/frontend-module.js.map +1 -0
  26. package/dist/implementations/dms/client-ip.js +1 -1
  27. package/dist/implementations/dms/client-ip.js.map +1 -1
  28. package/dist/implementations/dms/dev-reload.d.ts +5 -0
  29. package/dist/implementations/dms/dev-reload.js +23 -3
  30. package/dist/implementations/dms/dev-reload.js.map +1 -1
  31. package/dist/implementations/dms/frontend-modules.d.ts +2 -4
  32. package/dist/implementations/dms/frontend-modules.js +38 -94
  33. package/dist/implementations/dms/frontend-modules.js.map +1 -1
  34. package/dist/implementations/dms/frontend-ready.d.ts +12 -2
  35. package/dist/implementations/dms/frontend-ready.js +34 -4
  36. package/dist/implementations/dms/frontend-ready.js.map +1 -1
  37. package/dist/implementations/dms/layout-banners.d.ts +2 -1
  38. package/dist/implementations/dms/layout-banners.js +9 -0
  39. package/dist/implementations/dms/layout-banners.js.map +1 -1
  40. package/dist/implementations/dms/manifest.d.ts +7 -2
  41. package/dist/implementations/dms/manifest.js +12 -7
  42. package/dist/implementations/dms/manifest.js.map +1 -1
  43. package/dist/implementations/dms/page.d.ts +4 -3
  44. package/dist/implementations/dms/page.js +49 -18
  45. package/dist/implementations/dms/page.js.map +1 -1
  46. package/dist/implementations/dms/permissions-resolver.d.ts +2 -2
  47. package/dist/implementations/dms/permissions-resolver.js +2 -2
  48. package/dist/implementations/dms/permissions-resolver.js.map +1 -1
  49. package/dist/implementations/dms/realtime.js +1 -0
  50. package/dist/implementations/dms/realtime.js.map +1 -1
  51. package/dist/implementations/dms-base/bulk-selection.d.ts +1 -1
  52. package/dist/implementations/dms-base/bulk-selection.js +23 -1
  53. package/dist/implementations/dms-base/bulk-selection.js.map +1 -1
  54. package/dist/implementations/dms-base/filter-tokens.js +5 -3
  55. package/dist/implementations/dms-base/filter-tokens.js.map +1 -1
  56. package/dist/implementations/dms-base/search-route.d.ts +1 -0
  57. package/dist/implementations/dms-base/search-route.js +35 -13
  58. package/dist/implementations/dms-base/search-route.js.map +1 -1
  59. package/dist/implementations/dms-base/table-view.js +11 -6
  60. package/dist/implementations/dms-base/table-view.js.map +1 -1
  61. package/dist/implementations/dms-notifications/index.d.ts +2 -2
  62. package/dist/implementations/dms-notifications/index.js +5 -5
  63. package/dist/implementations/dms-notifications/index.js.map +1 -1
  64. package/dist/index.js +32 -55
  65. package/dist/index.js.map +1 -1
  66. package/dist/pages/modules/index.d.ts +1 -0
  67. package/dist/pages/modules/index.js +1 -0
  68. package/dist/pages/modules/index.js.map +1 -1
  69. package/dist/pages/modules/modules-store.d.ts +9 -0
  70. package/dist/pages/modules/modules-store.js +30 -0
  71. package/dist/pages/modules/modules-store.js.map +1 -0
  72. package/dist/pages/settings/users/account-credentials.js +2 -2
  73. package/dist/pages/settings/users/account-credentials.js.map +1 -1
  74. package/dist/pages/settings/users/account-data-store.js +25 -8
  75. package/dist/pages/settings/users/account-data-store.js.map +1 -1
  76. package/dist/pages/settings/users/invite-extension-routes.js +9 -3
  77. package/dist/pages/settings/users/invite-extension-routes.js.map +1 -1
  78. package/dist/pages/settings/users/member-management.js +13 -14
  79. package/dist/pages/settings/users/member-management.js.map +1 -1
  80. package/dist/pages/settings/users/profile.d.ts +1 -4
  81. package/dist/pages/settings/users/profile.js +0 -35
  82. package/dist/pages/settings/users/profile.js.map +1 -1
  83. package/dist/pages/settings/users/role-editor-store.js +26 -18
  84. package/dist/pages/settings/users/role-editor-store.js.map +1 -1
  85. package/dist/pages/settings/users/role-editor.d.ts +0 -1
  86. package/dist/pages/settings/users/role-editor.js +1 -2
  87. package/dist/pages/settings/users/role-editor.js.map +1 -1
  88. package/dist/pages/settings/users/role-preview.js +1 -2
  89. package/dist/pages/settings/users/role-preview.js.map +1 -1
  90. package/dist/pages/settings/users/roles.js +2 -2
  91. package/dist/pages/settings/users/roles.js.map +1 -1
  92. package/dist/pages/settings/users/two-factor-operations.js.map +1 -1
  93. package/dist/realtime/broker.d.ts +6 -0
  94. package/dist/realtime/broker.js +8 -1
  95. package/dist/realtime/broker.js.map +1 -1
  96. package/dist/realtime/presence.d.ts +8 -3
  97. package/dist/realtime/presence.js +8 -4
  98. package/dist/realtime/presence.js.map +1 -1
  99. package/dist/realtime/sessions.d.ts +11 -1
  100. package/dist/realtime/sessions.js +21 -3
  101. package/dist/realtime/sessions.js.map +1 -1
  102. package/dist/realtime/table-view.d.ts +2 -2
  103. package/dist/realtime/table-view.js +4 -3
  104. package/dist/realtime/table-view.js.map +1 -1
  105. package/dist/routes/auth/client-ip.d.ts +1 -0
  106. package/dist/routes/auth/client-ip.js +18 -0
  107. package/dist/routes/auth/client-ip.js.map +1 -1
  108. package/dist/routes/auth/oauth/config.d.ts +2 -1
  109. package/dist/routes/auth/oauth/config.js +5 -1
  110. package/dist/routes/auth/oauth/config.js.map +1 -1
  111. package/dist/routes/auth/session-handoff.d.ts +0 -1
  112. package/dist/routes/auth/session-handoff.js +0 -2
  113. package/dist/routes/auth/session-handoff.js.map +1 -1
  114. package/dist/routes/auth.js +3 -2
  115. package/dist/routes/auth.js.map +1 -1
  116. package/dist/routes/index.d.ts +0 -1
  117. package/dist/routes/index.js +0 -1
  118. package/dist/routes/index.js.map +1 -1
  119. package/dist/routes/realtime.d.ts +13 -1
  120. package/dist/routes/realtime.js +114 -29
  121. package/dist/routes/realtime.js.map +1 -1
  122. package/dist/startup-config.d.ts +2 -0
  123. package/dist/startup-config.js +62 -0
  124. package/dist/startup-config.js.map +1 -0
  125. package/dist/store/interfaces.d.ts +3 -2
  126. package/dist/store/interfaces.js +16 -6
  127. package/dist/store/interfaces.js.map +1 -1
  128. package/dist/store/listing.js +25 -15
  129. package/dist/store/listing.js.map +1 -1
  130. package/dist/store/operations.js +5 -2
  131. package/dist/store/operations.js.map +1 -1
  132. package/dist/store/requirements.js +3 -2
  133. package/dist/store/requirements.js.map +1 -1
  134. package/dist/store/runtime.d.ts +10 -1
  135. package/dist/store/runtime.js +33 -6
  136. package/dist/store/runtime.js.map +1 -1
  137. package/dist/store/types.d.ts +10 -0
  138. package/dist/utils/ensure-default-tenant.d.ts +2 -1
  139. package/dist/utils/ensure-default-tenant.js +13 -1
  140. package/dist/utils/ensure-default-tenant.js.map +1 -1
  141. package/dist/utils/export-jobs.js +2 -1
  142. package/dist/utils/export-jobs.js.map +1 -1
  143. package/dist/validation/auth.schema.d.ts +2 -2
  144. package/dist/validation/member-invite.schema.d.ts +2 -10
  145. package/dist/validation/member-invite.schema.js +2 -15
  146. package/dist/validation/member-invite.schema.js.map +1 -1
  147. package/frontend-vue/dms.frontend.ts +24 -5
  148. package/frontend-vue/dms.server.ts +17 -0
  149. package/frontend-vue/layers/dms-auth/server/accounts.ts +3 -4
  150. package/frontend-vue/layers/dms-core/app/build/composables/renderNow.ts +33 -0
  151. package/frontend-vue/layers/dms-core/app/build/composables/user/tablePreferences.ts +5 -1
  152. package/frontend-vue/layers/dms-core/app/build/utils/crossTab.ts +199 -0
  153. package/frontend-vue/layers/dms-core/app/build/utils/sharedRealtimeConnection.ts +410 -0
  154. package/frontend-vue/layers/dms-core/app/composables/auth/useApiData.ts +77 -12
  155. package/frontend-vue/layers/dms-core/app/composables/data-types/useDataType.ts +26 -0
  156. package/frontend-vue/layers/dms-core/app/composables/live/livePauseSource.ts +29 -0
  157. package/frontend-vue/layers/dms-core/app/composables/period/compareResolvers.ts +150 -9
  158. package/frontend-vue/layers/dms-core/app/composables/period/usePeriod.ts +6 -4
  159. package/frontend-vue/layers/dms-core/app/composables/period/usePeriodScope.ts +27 -1
  160. package/frontend-vue/layers/dms-core/app/composables/realtime/useUserRealtime.ts +256 -119
  161. package/frontend-vue/layers/dms-core/app/composables/translation/useComposedText.ts +21 -8
  162. package/frontend-vue/layers/dms-core/app/composables/translation/useTranslation.ts +25 -5
  163. package/frontend-vue/layers/dms-core/app/composables/useApiError.ts +3 -5
  164. package/frontend-vue/layers/dms-core/app/composables/useFieldErrors.ts +61 -26
  165. package/frontend-vue/layers/dms-core/app/plugins/dev-error-log.ts +16 -0
  166. package/frontend-vue/layers/dms-core/app/types/user.ts +6 -0
  167. package/frontend-vue/layers/dms-core/app/utils/composedText.ts +7 -2
  168. package/frontend-vue/layers/dms-core/app/utils/formatter.ts +134 -35
  169. package/frontend-vue/layers/dms-core/app/utils/url-interpolation.ts +18 -1
  170. package/frontend-vue/layers/dms-core/i18n/locales/core-en-GB.json +136 -2
  171. package/frontend-vue/layers/dms-core/i18n/locales/core-fr-FR.json +136 -2
  172. package/frontend-vue/layers/dms-core/shared/types/app-config.ts +0 -2
  173. package/frontend-vue/layers/dms-layout/app/app.config.ts +0 -1
  174. package/frontend-vue/layers/dms-layout/app/assets/css/main.css +11 -1
  175. package/frontend-vue/layers/dms-layout/app/assets/fonts/Geist-Italic-Variable.woff2 +0 -0
  176. package/frontend-vue/layers/dms-layout/app/assets/fonts/Geist-Variable.woff2 +0 -0
  177. package/frontend-vue/layers/dms-layout/app/assets/fonts/GeistMono-Italic-Variable.woff2 +0 -0
  178. package/frontend-vue/layers/dms-layout/app/assets/fonts/GeistMono-Variable.woff2 +0 -0
  179. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardBanners.vue +3 -2
  180. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardHeader.vue +41 -21
  181. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardPageBody.vue +6 -2
  182. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardSidebar.vue +4 -19
  183. package/frontend-vue/layers/dms-layout/app/build/components/layout/Footer.vue +11 -107
  184. package/frontend-vue/layers/dms-layout/app/build/components/layout/GithubStarPrompt.vue +18 -7
  185. package/frontend-vue/layers/dms-layout/app/build/components/layout/PageHeaderActionsOutlet.vue +4 -0
  186. package/frontend-vue/layers/dms-layout/app/build/components/layout/RowSidePanel.vue +43 -82
  187. package/frontend-vue/layers/dms-layout/app/build/components/layout/SidebarUserMenu.vue +44 -3
  188. package/frontend-vue/layers/dms-layout/app/build/components/layout/UserIdentity.vue +11 -3
  189. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleCatalogTile.vue +132 -35
  190. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleManageMenu.vue +59 -0
  191. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleSourceLabel.vue +25 -0
  192. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleStoreBanners.vue +73 -0
  193. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleStoreOperation.vue +116 -0
  194. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleStoreRequirements.vue +8 -3
  195. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleStoreTile.vue +85 -207
  196. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleTile.vue +10 -3
  197. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleTileSkeleton.vue +68 -0
  198. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationInboxDisplay.vue +24 -8
  199. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationInboxItem.vue +8 -5
  200. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/region/RegionTimeZoneInput.vue +1 -0
  201. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/role-permissions.ts +19 -0
  202. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/useRoleEditor.ts +2 -1
  203. package/frontend-vue/layers/dms-layout/app/build/composables/layout/useSidePanelWidth.ts +31 -70
  204. package/frontend-vue/layers/dms-layout/app/build/composables/notification/useNotificationGroupsOpen.ts +11 -1
  205. package/frontend-vue/layers/dms-layout/app/build/utils/dev-reload-stream.ts +81 -0
  206. package/frontend-vue/layers/dms-layout/app/build/utils/github-repository.ts +2 -2
  207. package/frontend-vue/layers/dms-layout/app/build/utils/module-store-catalog.ts +232 -36
  208. package/frontend-vue/layers/dms-layout/app/build/utils/modules-catalog.ts +122 -14
  209. package/frontend-vue/layers/dms-layout/app/composables/layout/useLayoutBanners.ts +32 -3
  210. package/frontend-vue/layers/dms-layout/app/composables/layout/useServedHeaderActions.ts +49 -11
  211. package/frontend-vue/layers/dms-layout/app/composables/page/useModuleHistory.ts +3 -2
  212. package/frontend-vue/layers/dms-layout/app/composables/page/useModuleStore.ts +59 -4
  213. package/frontend-vue/layers/dms-layout/app/composables/page/useModuleStoreActions.ts +194 -0
  214. package/frontend-vue/layers/dms-layout/app/composables/page/usePageComponentPreload.ts +23 -3
  215. package/frontend-vue/layers/dms-layout/app/composables/page/usePageLayout.ts +4 -2
  216. package/frontend-vue/layers/dms-layout/app/composables/page/usePageRecordDeletion.ts +162 -0
  217. package/frontend-vue/layers/dms-layout/app/composables/page/useSiteLayout.ts +6 -1
  218. package/frontend-vue/layers/dms-layout/app/custom-layouts/DefaultLayout.vue +6 -2
  219. package/frontend-vue/layers/dms-layout/app/custom-layouts/SettingsLayout.vue +6 -2
  220. package/frontend-vue/layers/dms-layout/app/custom-pages/modules-store.vue +291 -0
  221. package/frontend-vue/layers/dms-layout/app/custom-pages/modules.vue +87 -474
  222. package/frontend-vue/layers/dms-layout/app/middleware/module-routing.global.ts +3 -0
  223. package/frontend-vue/layers/dms-layout/app/pages/[...slug].vue +13 -22
  224. package/frontend-vue/layers/dms-layout/app/plugins/command-palette-navigation.client.ts +11 -10
  225. package/frontend-vue/layers/dms-layout/app/plugins/command-palette-personal-pages.client.ts +22 -52
  226. package/frontend-vue/layers/dms-layout/app/plugins/command-palette-quick-actions.client.ts +7 -7
  227. package/frontend-vue/layers/dms-layout/app/plugins/command-palette-session.client.ts +11 -10
  228. package/frontend-vue/layers/dms-layout/app/plugins/dms-dev-reload.client.ts +14 -9
  229. package/frontend-vue/layers/dms-layout/app/theme/actions.ts +5 -4
  230. package/frontend-vue/layers/dms-layout/app/theme/form-controls.ts +9 -4
  231. package/frontend-vue/layers/dms-layout/app/theme/surfaces.ts +22 -6
  232. package/frontend-vue/layers/dms-layout/app/types/module-store.ts +9 -0
  233. package/frontend-vue/layers/dms-layout/app/types/page.ts +15 -1
  234. package/frontend-vue/layers/dms-layout/app/utils/account-menu.ts +11 -0
  235. package/frontend-vue/layers/dms-layout/app/utils/breadcrumb.ts +57 -0
  236. package/frontend-vue/layers/dms-layout/app/utils/pageQuery.ts +26 -0
  237. package/frontend-vue/layers/dms-layout/i18n/locales/layout-en-GB.json +45 -18
  238. package/frontend-vue/layers/dms-layout/i18n/locales/layout-fr-FR.json +44 -17
  239. package/frontend-vue/layers/dms-ui/app/build/components/containers/TargetComponentTree.vue +31 -0
  240. package/frontend-vue/layers/dms-ui/app/build/components/containers/constants.ts +25 -0
  241. package/frontend-vue/layers/dms-ui/app/build/components/containers/drawer/DynamicDrawer.vue +244 -15
  242. package/frontend-vue/layers/dms-ui/app/build/components/containers/modal/DynamicModal.vue +42 -25
  243. package/frontend-vue/layers/dms-ui/app/build/components/containers/row/RowHeader.vue +153 -0
  244. package/frontend-vue/layers/dms-ui/app/build/components/containers/row/RowNotFound.vue +44 -0
  245. package/frontend-vue/layers/dms-ui/app/build/components/containers/row/drawerRowHeader.ts +35 -0
  246. package/frontend-vue/layers/dms-ui/app/build/components/form/FormEntries.vue +44 -9
  247. package/frontend-vue/layers/dms-ui/app/build/components/form/FormErrorSummary.vue +11 -4
  248. package/frontend-vue/layers/dms-ui/app/build/components/form/FormFieldControl.vue +38 -5
  249. package/frontend-vue/layers/dms-ui/app/build/components/form/FormFieldNotes.vue +29 -5
  250. package/frontend-vue/layers/dms-ui/app/build/components/form/FormLoadError.vue +5 -1
  251. package/frontend-vue/layers/dms-ui/app/build/components/form/FormSectionNav.vue +3 -1
  252. package/frontend-vue/layers/dms-ui/app/build/components/form/FormSections.vue +106 -27
  253. package/frontend-vue/layers/dms-ui/app/build/components/table/Actions.vue +12 -4
  254. package/frontend-vue/layers/dms-ui/app/build/components/table/Empty.vue +4 -2
  255. package/frontend-vue/layers/dms-ui/app/build/components/table/FiltersRow.vue +48 -1
  256. package/frontend-vue/layers/dms-ui/app/build/components/table/Pagination.vue +55 -54
  257. package/frontend-vue/layers/dms-ui/app/build/components/table/RowSelection.vue +2 -1
  258. package/frontend-vue/layers/dms-ui/app/build/components/table/Table.vue +396 -288
  259. package/frontend-vue/layers/dms-ui/app/build/components/table/Tabs.vue +2 -1
  260. package/frontend-vue/layers/dms-ui/app/build/components/table/Views.vue +2 -1
  261. package/frontend-vue/layers/dms-ui/app/build/components/table-view/CardAvatar.vue +59 -0
  262. package/frontend-vue/layers/dms-ui/app/build/components/table-view/CardGridSkeleton.vue +19 -2
  263. package/frontend-vue/layers/dms-ui/app/build/components/table-view/CardRowActions.vue +38 -0
  264. package/frontend-vue/layers/dms-ui/app/build/components/table-view/CardsDisplay.vue +148 -104
  265. package/frontend-vue/layers/dms-ui/app/build/components/table-view/LiveHoldBanner.vue +17 -2
  266. package/frontend-vue/layers/dms-ui/app/build/composables/actions/bulkSelection.ts +43 -9
  267. package/frontend-vue/layers/dms-ui/app/build/composables/actions/rowComponentOptions.ts +76 -0
  268. package/frontend-vue/layers/dms-ui/app/build/composables/actions/rowNavigation.ts +172 -27
  269. package/frontend-vue/layers/dms-ui/app/build/composables/actions/useActionTargets.ts +270 -46
  270. package/frontend-vue/layers/dms-ui/app/build/composables/confirm/actionError.ts +6 -1
  271. package/frontend-vue/layers/dms-ui/app/build/composables/confirm/confirmDialogTexts.ts +2 -0
  272. package/frontend-vue/layers/dms-ui/app/build/composables/containers/closingLayers.ts +186 -0
  273. package/frontend-vue/layers/dms-ui/app/build/composables/containers/context.ts +14 -0
  274. package/frontend-vue/layers/dms-ui/app/build/composables/containers/drawerSize.ts +229 -0
  275. package/frontend-vue/layers/dms-ui/app/build/composables/containers/useResizableSize.ts +175 -0
  276. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/metricCells.ts +18 -35
  277. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/numberSuffix.ts +44 -0
  278. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/registerDefaults.ts +123 -27
  279. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/registerFieldTypes.ts +2 -1
  280. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/relationFilter.ts +75 -0
  281. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/relationRows.ts +92 -0
  282. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/relationValue.ts +39 -0
  283. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/twoLineCell.ts +3 -3
  284. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/useColumnValueRenderer.ts +6 -2
  285. package/frontend-vue/layers/dms-ui/app/build/composables/form/createFormFields.ts +15 -0
  286. package/frontend-vue/layers/dms-ui/app/build/composables/form/fieldSaved.ts +40 -0
  287. package/frontend-vue/layers/dms-ui/app/build/composables/form/fieldValueRule.ts +62 -0
  288. package/frontend-vue/layers/dms-ui/app/build/composables/form/formEntryContext.ts +5 -0
  289. package/frontend-vue/layers/dms-ui/app/build/composables/form/formFooter.ts +42 -7
  290. package/frontend-vue/layers/dms-ui/app/build/composables/form/formLayout.ts +106 -4
  291. package/frontend-vue/layers/dms-ui/app/build/composables/form/formRecordLoad.ts +11 -5
  292. package/frontend-vue/layers/dms-ui/app/build/composables/form/formSections.ts +32 -0
  293. package/frontend-vue/layers/dms-ui/app/build/composables/form/formValidation.ts +36 -4
  294. package/frontend-vue/layers/dms-ui/app/build/composables/form/readonlyValue.ts +19 -0
  295. package/frontend-vue/layers/dms-ui/app/build/composables/form/registerFormFunctions.ts +27 -0
  296. package/frontend-vue/layers/dms-ui/app/build/composables/form/repeaterTable.ts +78 -0
  297. package/frontend-vue/layers/dms-ui/app/build/composables/form/serverFieldErrors.ts +49 -0
  298. package/frontend-vue/layers/dms-ui/app/build/composables/form/toasterClearance.ts +118 -0
  299. package/frontend-vue/layers/dms-ui/app/build/composables/form/useInstantForm.ts +12 -1
  300. package/frontend-vue/layers/dms-ui/app/build/composables/live/currentPageLive.ts +41 -3
  301. package/frontend-vue/layers/dms-ui/app/build/composables/live/livePoller.ts +10 -2
  302. package/frontend-vue/layers/dms-ui/app/build/composables/live/pageReadClock.ts +28 -0
  303. package/frontend-vue/layers/dms-ui/app/build/composables/live/shortcuts.ts +1 -1
  304. package/frontend-vue/layers/dms-ui/app/build/composables/live/usePageLiveHost.ts +17 -3
  305. package/frontend-vue/layers/dms-ui/app/build/composables/live/useUpdatedLabel.ts +38 -0
  306. package/frontend-vue/layers/dms-ui/app/build/composables/page-toolbar/pageToolbarContext.ts +75 -0
  307. package/frontend-vue/layers/dms-ui/app/build/composables/page-toolbar/toolbarControlHeight.ts +29 -0
  308. package/frontend-vue/layers/dms-ui/app/build/composables/period/periodComparison.ts +52 -0
  309. package/frontend-vue/layers/dms-ui/app/build/composables/period/periodDisplay.ts +21 -0
  310. package/frontend-vue/layers/dms-ui/app/build/composables/period/periodShortLabels.ts +28 -0
  311. package/frontend-vue/layers/dms-ui/app/build/composables/period/usePeriodDraft.ts +1 -0
  312. package/frontend-vue/layers/dms-ui/app/build/composables/table/useRelationFilterLabels.ts +97 -0
  313. package/frontend-vue/layers/dms-ui/app/build/composables/table/useRowScrollAnchor.ts +106 -0
  314. package/frontend-vue/layers/dms-ui/app/build/composables/table/useTable.ts +9 -0
  315. package/frontend-vue/layers/dms-ui/app/build/composables/table/useTableColumns.ts +1 -2
  316. package/frontend-vue/layers/dms-ui/app/build/composables/table/utils/archivedCount.ts +31 -0
  317. package/frontend-vue/layers/dms-ui/app/build/composables/table/utils/filterEditorValue.ts +38 -0
  318. package/frontend-vue/layers/dms-ui/app/build/composables/table/utils/formatFilterValue.ts +33 -2
  319. package/frontend-vue/layers/dms-ui/app/build/composables/table/utils/scrollEdges.ts +31 -0
  320. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useCardFields.ts +33 -0
  321. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useMobileDisplay.ts +48 -0
  322. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useScrolledPastTop.ts +41 -18
  323. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableFooter.ts +3 -2
  324. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableLinkedVisit.ts +78 -0
  325. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableLiveHold.ts +135 -22
  326. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableRows.ts +56 -25
  327. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViewRowActions.ts +90 -35
  328. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViews.ts +86 -10
  329. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/bulkActions.ts +14 -4
  330. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/card.ts +127 -2
  331. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/compareValues.ts +13 -0
  332. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/expandedRows.ts +28 -0
  333. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/groupedRows.ts +114 -1
  334. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/linkedArrival.ts +308 -0
  335. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/locateRow.ts +106 -0
  336. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/pageArrival.ts +34 -0
  337. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/pinnedRows.ts +17 -0
  338. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/quickFilters.ts +41 -33
  339. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/recordLink.ts +24 -8
  340. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/tableCounts.ts +113 -0
  341. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/tableQuery.ts +27 -4
  342. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/views.ts +22 -6
  343. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/writeError.ts +21 -0
  344. package/frontend-vue/layers/dms-ui/app/build/utils/addressSuggestions.ts +49 -0
  345. package/frontend-vue/layers/dms-ui/app/build/utils/codeHighlight.ts +67 -29
  346. package/frontend-vue/layers/dms-ui/app/build/utils/eyebrow.ts +12 -0
  347. package/frontend-vue/layers/dms-ui/app/build/utils/fieldOptionsI18n.ts +51 -11
  348. package/frontend-vue/layers/dms-ui/app/build/utils/htmlGrammar.ts +79 -0
  349. package/frontend-vue/layers/dms-ui/app/build/utils/inputWidth.ts +53 -0
  350. package/frontend-vue/layers/dms-ui/app/build/utils/numberAdjustment.ts +6 -3
  351. package/frontend-vue/layers/dms-ui/app/build/utils/relativeDate.ts +19 -5
  352. package/frontend-vue/layers/dms-ui/app/build/utils/scrollWithin.ts +99 -0
  353. package/frontend-vue/layers/dms-ui/app/build/utils/shellParser.ts +1 -1
  354. package/frontend-vue/layers/dms-ui/app/build/utils/streamHighlight.ts +90 -0
  355. package/frontend-vue/layers/dms-ui/app/build/utils/urlVariables.ts +36 -14
  356. package/frontend-vue/layers/dms-ui/app/components/PasswordStrength.vue +1 -1
  357. package/frontend-vue/layers/dms-ui/app/components/RecursiveComponent.vue +9 -1
  358. package/frontend-vue/layers/dms-ui/app/components/blocks/LiveToggleBlock.vue +80 -32
  359. package/frontend-vue/layers/dms-ui/app/components/blocks/PageToolbarBlock.vue +137 -0
  360. package/frontend-vue/layers/dms-ui/app/components/blocks/StatGroupBlock.vue +5 -0
  361. package/frontend-vue/layers/dms-ui/app/components/chart/ApexChartHost.vue +16 -2
  362. package/frontend-vue/layers/dms-ui/app/components/chart/Chart.vue +24 -5
  363. package/frontend-vue/layers/dms-ui/app/components/chart/ChartCard.vue +41 -23
  364. package/frontend-vue/layers/dms-ui/app/components/code-snippet/CodeSnippet.vue +23 -12
  365. package/frontend-vue/layers/dms-ui/app/components/confirm/ConfirmModal.vue +1 -1
  366. package/frontend-vue/layers/dms-ui/app/components/container-footer/ContainerFooter.vue +34 -0
  367. package/frontend-vue/layers/dms-ui/app/components/field-row/FieldRow.vue +25 -2
  368. package/frontend-vue/layers/dms-ui/app/components/flow-canvas/FlowCanvas.vue +2 -2
  369. package/frontend-vue/layers/dms-ui/app/components/form/Form.vue +119 -36
  370. package/frontend-vue/layers/dms-ui/app/components/form/components/Cascader.vue +53 -22
  371. package/frontend-vue/layers/dms-ui/app/components/form/components/DatePicker.vue +20 -1
  372. package/frontend-vue/layers/dms-ui/app/components/form/components/Display.vue +13 -1
  373. package/frontend-vue/layers/dms-ui/app/components/form/components/Image.vue +8 -3
  374. package/frontend-vue/layers/dms-ui/app/components/form/components/InputAddress.vue +53 -5
  375. package/frontend-vue/layers/dms-ui/app/components/form/components/InputCode.vue +29 -5
  376. package/frontend-vue/layers/dms-ui/app/components/form/components/InputNumber.vue +45 -8
  377. package/frontend-vue/layers/dms-ui/app/components/form/components/InputPercentage.vue +28 -5
  378. package/frontend-vue/layers/dms-ui/app/components/form/components/InputSecret.vue +5 -0
  379. package/frontend-vue/layers/dms-ui/app/components/form/components/InputText.vue +19 -2
  380. package/frontend-vue/layers/dms-ui/app/components/form/components/InputTime.vue +2 -1
  381. package/frontend-vue/layers/dms-ui/app/components/form/components/Relation.vue +226 -65
  382. package/frontend-vue/layers/dms-ui/app/components/form/components/Repeater.vue +80 -30
  383. package/frontend-vue/layers/dms-ui/app/components/form/components/RepeaterTable.vue +210 -0
  384. package/frontend-vue/layers/dms-ui/app/components/form/components/Select.vue +4 -2
  385. package/frontend-vue/layers/dms-ui/app/components/grid/GridRow.vue +11 -2
  386. package/frontend-vue/layers/dms-ui/app/components/key-value-list/KeyValueList.vue +79 -70
  387. package/frontend-vue/layers/dms-ui/app/components/kpi/KpiCard.vue +117 -21
  388. package/frontend-vue/layers/dms-ui/app/components/meter/Meter.vue +2 -1
  389. package/frontend-vue/layers/dms-ui/app/components/period/PeriodSelector.vue +113 -34
  390. package/frontend-vue/layers/dms-ui/app/components/save-bar/SaveBar.vue +14 -2
  391. package/frontend-vue/layers/dms-ui/app/components/section-header/Eyebrow.vue +6 -1
  392. package/frontend-vue/layers/dms-ui/app/components/segmented/Segmented.vue +13 -0
  393. package/frontend-vue/layers/dms-ui/app/components/stat-group/StatGroup.vue +52 -3
  394. package/frontend-vue/layers/dms-ui/app/components/tab/Tab.vue +2 -1
  395. package/frontend-vue/layers/dms-ui/app/components/table-view/CascaderPath.vue +74 -25
  396. package/frontend-vue/layers/dms-ui/app/components/table-view/KanbanBoard.vue +48 -44
  397. package/frontend-vue/layers/dms-ui/app/components/table-view/KanbanDisplay.vue +4 -1
  398. package/frontend-vue/layers/dms-ui/app/components/table-view/TableView.vue +426 -97
  399. package/frontend-vue/layers/dms-ui/app/components/top-list/TopListCard.vue +33 -5
  400. package/frontend-vue/layers/dms-ui/app/composables/chart/apexCategoryLabels.ts +68 -0
  401. package/frontend-vue/layers/dms-ui/app/composables/chart/apexDatetimeBuckets.ts +306 -0
  402. package/frontend-vue/layers/dms-ui/app/composables/chart/formatValue.ts +4 -3
  403. package/frontend-vue/layers/dms-ui/app/composables/chart/heatmapColors.ts +93 -0
  404. package/frontend-vue/layers/dms-ui/app/composables/chart/localizeSeries.ts +62 -0
  405. package/frontend-vue/layers/dms-ui/app/composables/chart/useApexChart.ts +116 -8
  406. package/frontend-vue/layers/dms-ui/app/composables/chart/useApexChart.types.ts +7 -0
  407. package/frontend-vue/layers/dms-ui/app/composables/containers/types.ts +84 -1
  408. package/frontend-vue/layers/dms-ui/app/composables/containers/useDrawer.ts +69 -8
  409. package/frontend-vue/layers/dms-ui/app/composables/form/types/field-saved.ts +11 -0
  410. package/frontend-vue/layers/dms-ui/app/composables/form/types/field.ts +16 -0
  411. package/frontend-vue/layers/dms-ui/app/composables/form/types/functions.ts +1 -0
  412. package/frontend-vue/layers/dms-ui/app/composables/form/useForm.ts +189 -28
  413. package/frontend-vue/layers/dms-ui/app/composables/live/usePageLive.ts +29 -12
  414. package/frontend-vue/layers/dms-ui/app/composables/page-toolbar/usePageToolbarSize.ts +30 -0
  415. package/frontend-vue/layers/dms-ui/app/composables/table-view/kanban.ts +4 -2
  416. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/action-target.ts +22 -3
  417. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/config.ts +4 -0
  418. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/display.ts +24 -1
  419. package/frontend-vue/layers/dms-ui/app/plugins/closing-layers.client.ts +10 -0
  420. package/frontend-vue/layers/dms-ui/app/plugins/live-pause-source.ts +15 -0
  421. package/frontend-vue/layers/dms-ui/app/plugins/register.ts +2 -0
  422. package/frontend-vue/layers/dms-ui/app/types/input-number.ts +3 -2
  423. package/frontend-vue/layers/dms-ui/app/types/page-toolbar.ts +7 -0
  424. package/frontend-vue/layers/dms-ui/app/types/row-action.ts +0 -2
  425. package/frontend-vue/layers/dms-ui/app/types/row-navigation.ts +17 -0
  426. package/frontend-vue/layers/dms-ui/app/types/table/query.ts +2 -1
  427. package/frontend-vue/layers/dms-ui/app/utils/blockRefresh.ts +3 -1
  428. package/frontend-vue/layers/dms-ui/app/utils/cascader.ts +94 -3
  429. package/frontend-vue/layers/dms-ui/app/utils/componentTree.ts +24 -0
  430. package/frontend-vue/layers/dms-ui/i18n/locales/ui-en-GB.json +20 -5
  431. package/frontend-vue/layers/dms-ui/i18n/locales/ui-fr-FR.json +20 -5
  432. package/frontend-vue/package.json +6 -2
  433. package/package.json +11 -10
  434. package/skills/dms/SKILL.md +1 -1
  435. package/skills/dms-auth/SKILL.md +5 -3
  436. package/skills/dms-best-practices/REFERENCE.md +2 -0
  437. package/skills/dms-best-practices/SKILL.md +4 -0
  438. package/skills/dms-module/SKILL.md +3 -2
  439. package/skills/dms-pages/REFERENCE.md +129 -16
  440. package/skills/dms-pages/SKILL.md +1 -1
  441. package/skills/dms-project/DEV-SERVERS.md +23 -1
  442. package/skills/dms-project/REFERENCE.md +1 -1
  443. package/skills/dms-project/SKILL.md +4 -1
  444. package/skills/dms-project/scripts/dms-dev.sh +205 -17
  445. package/dist/hooks/tenant-instances.d.ts +0 -1
  446. package/dist/hooks/tenant-instances.js +0 -13
  447. package/dist/hooks/tenant-instances.js.map +0 -1
  448. package/dist/routes/startup-gate.d.ts +0 -7
  449. package/dist/routes/startup-gate.js +0 -39
  450. package/dist/routes/startup-gate.js.map +0 -1
  451. package/frontend-vue/layers/dms-core/app/composables/period/periodRenderNow.ts +0 -42
@@ -11,6 +11,11 @@
11
11
  # recorded in DMS_BACK_DIR/.antelope/dms-dev.pid; without that file it falls back to the dev
12
12
  # processes whose working directory or command line lies under DMS_BACK_DIR. Other projects'
13
13
  # dev servers on the same machine are never touched.
14
+ #
15
+ # Windows (Git Bash, MSYS2, Cygwin): their ps lists only their own processes and takes no -o,
16
+ # while the dev servers run as native node.exe processes. There the script reads the Windows
17
+ # process table (PowerShell's Get-CimInstance Win32_Process), works in Windows pids, and stops
18
+ # a server's whole tree with taskkill /T /F.
14
19
 
15
20
  set -uo pipefail
16
21
 
@@ -34,10 +39,33 @@ DEFAULT_FRONT_URL='http://localhost:3001'
34
39
  # Only picks candidates when no pid file exists, and is always combined with the
35
40
  # DMS_BACK_DIR scope check: on its own it would match every project on the machine.
36
41
  PROC_PATTERN='antelope-runner|ajs project (run|dev)|(^|[[:space:]/])(ajs dms|ajs-dms) dev|dms-frontend/dist/index\.js dev|pnpm( run)? (dev|frontend:dev)'
42
+ # The same, split per server, for the commands that restart only one of them.
43
+ BACK_PROC_PATTERN='antelope-runner|ajs project (run|dev)|pnpm( run)? dev'
44
+ FRONT_PROC_PATTERN='(^|[[:space:]/])(ajs dms|ajs-dms) dev|dms-frontend/dist/index\.js dev|pnpm( run)? frontend:dev'
45
+
46
+ case "$(uname -s 2>/dev/null)" in
47
+ MINGW* | MSYS* | CYGWIN*) IS_WINDOWS=1 ;;
48
+ *) IS_WINDOWS="" ;;
49
+ esac
50
+
51
+ # One line per process: "pid<TAB>ppid<TAB>created<TAB>command line". The creation time, a
52
+ # fixed-width UTC timestamp, tells a child from an older process holding a dead parent's pid.
53
+ # shellcheck disable=SC2016 # PowerShell code, not shell expansions
54
+ WIN_PROCESS_QUERY='[Console]::OutputEncoding = [Text.Encoding]::UTF8
55
+ $tab = [char]9
56
+ Get-CimInstance Win32_Process | ForEach-Object {
57
+ $created = "00000000000000000000"
58
+ if ($_.CreationDate) { $created = $_.CreationDate.ToUniversalTime().ToString("yyyyMMddHHmmssffffff") }
59
+ [string]$_.ProcessId + $tab + $_.ParentProcessId + $tab + $created + $tab + ($_.CommandLine -replace "\s+", " ")
60
+ }'
37
61
 
38
62
  PROJECT_ROOT=""
39
63
  PID_FILE=""
40
64
  LAUNCHED_PID=""
65
+ # Windows only: the process table (see refresh_process_table) and the project root as a
66
+ # lowercase Windows path with forward slashes, the form command lines are compared in.
67
+ WIN_TABLE=""
68
+ WIN_ROOT=""
41
69
 
42
70
  log() { printf '[dms-dev] %s\n' "$*"; }
43
71
 
@@ -57,10 +85,54 @@ require_dms_back_dir() {
57
85
  fi
58
86
  PROJECT_ROOT="$(cd "$DMS_BACK_DIR" && pwd -P)"
59
87
  PID_FILE="$PROJECT_ROOT/.antelope/dms-dev.pid"
88
+ [ -z "$IS_WINDOWS" ] || WIN_ROOT="$(cygpath -m "$PROJECT_ROOT" | tr '[:upper:]' '[:lower:]')"
60
89
  }
61
90
 
62
91
  is_alive() { [ -n "$1" ] && kill -0 "$1" 2>/dev/null; }
63
92
 
93
+ # Reads the Windows process table once for the lookups that follow; nothing elsewhere.
94
+ # Call it in the shell that runs them: a command substitution's copy is lost with it.
95
+ refresh_process_table() {
96
+ [ -n "$IS_WINDOWS" ] || return 0
97
+ WIN_TABLE="$(powershell.exe -NoProfile -NonInteractive -EncodedCommand \
98
+ "$(printf '%s' "$WIN_PROCESS_QUERY" | iconv -f UTF-8 -t UTF-16LE | base64 | tr -d '\n')" \
99
+ 2>/dev/null | tr -d '\r')"
100
+ }
101
+
102
+ # The Windows pid behind a Git Bash / MSYS2 / Cygwin pid.
103
+ win_pid() { cat "/proc/$1/winpid" 2>/dev/null; }
104
+
105
+ win_alive() {
106
+ [ -n "$1" ] && printf '%s\n' "$WIN_TABLE" | awk -F'\t' -v pid="$1" '$1 == pid { found = 1 } END { exit !found }'
107
+ }
108
+
109
+ win_args() { printf '%s\n' "$WIN_TABLE" | awk -F'\t' -v pid="$1" '$1 == pid { print $4; exit }'; }
110
+
111
+ # A native process exposes no working directory: only its command line can name the project.
112
+ win_in_project() {
113
+ local args
114
+ # shellcheck disable=SC1003 # tr's escaped backslash, not a quote
115
+ args="$(win_args "$1" | tr '\\' '/' | tr '[:upper:]' '[:lower:]')"
116
+ case "$args " in *"$WIN_ROOT"/* | *"$WIN_ROOT "* | *"$WIN_ROOT\""*) return 0 ;; esac
117
+ return 1
118
+ }
119
+
120
+ # The given Windows pids plus every process whose parent chain leads to one (Windows has no
121
+ # process groups), each child created after its parent.
122
+ win_expand_tree() {
123
+ printf '%s\n' "$WIN_TABLE" | awk -F'\t' -v roots="$*" '
124
+ BEGIN { n = split(roots, r, " "); for (i = 1; i <= n; i++) keep[r[i]] = 1 }
125
+ { parent[$1] = $2; created[$1] = $3 "" }
126
+ END {
127
+ do {
128
+ grew = 0
129
+ for (p in parent)
130
+ if (!(p in keep) && (parent[p] in keep) && created[p] >= created[parent[p]]) { keep[p] = 1; grew = 1 }
131
+ } while (grew)
132
+ for (p in keep) if (p in parent) print p
133
+ }'
134
+ }
135
+
64
136
  process_cwd() {
65
137
  if [ -e "/proc/$1/cwd" ]; then
66
138
  readlink "/proc/$1/cwd" 2>/dev/null
@@ -75,6 +147,10 @@ process_args() { ps -o args= -p "$1" 2>/dev/null; }
75
147
 
76
148
  is_in_project() {
77
149
  case "$(process_cwd "$1")/" in "$PROJECT_ROOT"/*) return 0 ;; esac
150
+ if [ -n "$IS_WINDOWS" ]; then
151
+ win_in_project "$(win_pid "$1")"
152
+ return
153
+ fi
78
154
  case "$(process_args "$1") " in *"$PROJECT_ROOT"/* | *"$PROJECT_ROOT "*) return 0 ;; esac
79
155
  return 1
80
156
  }
@@ -94,13 +170,16 @@ expand_tree() {
94
170
  }'
95
171
  }
96
172
 
173
+ # The live pids the pid file records, of every server or only of the one named; on Windows,
174
+ # as Windows pids.
97
175
  pid_file_roots() {
98
176
  [ -f "$PID_FILE" ] || return 0
99
- local name pid
177
+ local only="${1:-}" name pid
100
178
  while read -r name pid; do
101
179
  [ -n "${pid:-}" ] || continue
180
+ [ -z "$only" ] || [ "$name" = "$only" ] || continue
102
181
  if is_alive "$pid" && is_in_project "$pid"; then
103
- echo "$pid"
182
+ if [ -n "$IS_WINDOWS" ]; then win_pid "$pid"; else echo "$pid"; fi
104
183
  else
105
184
  log "ignoring stale $name pid $pid from $PID_FILE" >&2
106
185
  fi
@@ -108,24 +187,60 @@ pid_file_roots() {
108
187
  }
109
188
 
110
189
  scanned_roots() {
111
- local listing pid
190
+ local pattern="${1:-$PROC_PATTERN}" listing pid
191
+ if [ -n "$IS_WINDOWS" ]; then
192
+ # Matched with forward slashes, the way the patterns spell paths.
193
+ # shellcheck disable=SC1003 # tr's escaped backslash, not a quote
194
+ printf '%s\n' "$WIN_TABLE" | cut -f1,4 | tr '\\' '/' | grep -E "$pattern" | cut -f1 | while read -r pid; do
195
+ win_in_project "$pid" && echo "$pid"
196
+ done
197
+ return
198
+ fi
112
199
  # Captured first so the grep below never sees its own command line.
113
200
  listing="$(ps -A -o pid=,args=)"
114
- printf '%s\n' "$listing" | grep -E "$PROC_PATTERN" | awk '{print $1}' | while read -r pid; do
201
+ printf '%s\n' "$listing" | grep -E "$pattern" | awk '{print $1}' | while read -r pid; do
115
202
  is_in_project "$pid" && echo "$pid"
116
203
  done
117
204
  }
118
205
 
206
+ # The process pattern of the server named, or of both.
207
+ server_pattern() {
208
+ case "${1:-}" in
209
+ backend) echo "$BACK_PROC_PATTERN" ;;
210
+ frontend) echo "$FRONT_PROC_PATTERN" ;;
211
+ *) echo "$PROC_PATTERN" ;;
212
+ esac
213
+ }
214
+
215
+ # Every process of this project's servers, or of the one named (backend or frontend). On
216
+ # Windows they are Windows pids, read from the table refresh_process_table last read.
119
217
  project_pids() {
120
- local roots
121
- roots="$(pid_file_roots)"
122
- [ -n "$roots" ] || roots="$(scanned_roots)"
218
+ local name="${1:-}" roots
219
+ roots="$(pid_file_roots "$name")"
220
+ [ -n "$roots" ] || roots="$(scanned_roots "$(server_pattern "$name")")"
123
221
  [ -n "$roots" ] || return 0
222
+ if [ -n "$IS_WINDOWS" ]; then
223
+ # shellcheck disable=SC2086 # one pid per word
224
+ win_expand_tree $roots | grep -vx "$(win_pid $$)"
225
+ return
226
+ fi
124
227
  # shellcheck disable=SC2086 # one pid per word
125
228
  expand_tree $roots | grep -vx "$$"
126
229
  }
127
230
 
128
231
  self_ancestors() {
232
+ if [ -n "$IS_WINDOWS" ]; then
233
+ printf '%s\n' "$WIN_TABLE" | awk -F'\t' -v pid="$(win_pid $$)" '
234
+ { parent[$1] = $2; created[$1] = $3 "" }
235
+ END {
236
+ for (depth = 0; pid != "" && pid != "0" && depth < 256; depth++) {
237
+ print pid
238
+ if (!(pid in parent) || !(parent[pid] in parent) || created[parent[pid]] > created[pid]) break
239
+ pid = parent[pid]
240
+ }
241
+ }'
242
+ return
243
+ fi
129
244
  local pid="$$"
130
245
  while [ -n "$pid" ] && [ "$pid" -gt 1 ]; do
131
246
  echo "$pid"
@@ -169,21 +284,53 @@ signal_and_wait() {
169
284
  return 1
170
285
  }
171
286
 
287
+ # Windows has no SIGTERM a console node process would handle: each tree is ended at once.
288
+ win_kill_and_wait() {
289
+ local pid survivors
290
+ for pid in "$@"; do taskkill //T //F //PID "$pid" >/dev/null 2>&1; done
291
+ sleep 1
292
+ refresh_process_table
293
+ survivors="$(for pid in "$@"; do win_alive "$pid" && echo "$pid"; done)"
294
+ [ -z "$survivors" ] && return 0
295
+ log "error: could not stop: $(echo "$survivors" | tr '\n' ' ')"
296
+ return 1
297
+ }
298
+
299
+ # Drops the pid the pid file records for the server named, or the whole file.
300
+ forget_pids() {
301
+ if [ -z "${1:-}" ]; then
302
+ rm -f "$PID_FILE"
303
+ return
304
+ fi
305
+ [ -f "$PID_FILE" ] || return 0
306
+ local kept
307
+ kept="$(grep -v "^$1 " "$PID_FILE")"
308
+ if [ -n "$kept" ]; then printf '%s\n' "$kept" > "$PID_FILE"; else rm -f "$PID_FILE"; fi
309
+ }
310
+
311
+ # Stops this project's servers, or only the one named (backend or frontend).
172
312
  stop_servers() {
173
- require_dms_back_dir stop
174
- log "stopping dev servers of $PROJECT_ROOT…"
313
+ local name="${1:-}"
314
+ require_dms_back_dir "${cmd:-stop}"
315
+ log "stopping ${name:-dev servers} of $PROJECT_ROOT…"
175
316
  local targets
176
- targets="$(project_pids)"
317
+ refresh_process_table
318
+ targets="$(project_pids "$name")"
177
319
  if [ -z "$targets" ]; then
178
- rm -f "$PID_FILE"
320
+ forget_pids "$name"
179
321
  log "nothing running."
180
322
  return 0
181
323
  fi
182
324
  # shellcheck disable=SC2086 # one pid per word
183
325
  refuse_if_hosting_self $targets || exit 3
184
- # shellcheck disable=SC2086
185
- signal_and_wait $targets || return 1
186
- rm -f "$PID_FILE"
326
+ if [ -n "$IS_WINDOWS" ]; then
327
+ # shellcheck disable=SC2086
328
+ win_kill_and_wait $targets || return 1
329
+ else
330
+ # shellcheck disable=SC2086
331
+ signal_and_wait $targets || return 1
332
+ fi
333
+ forget_pids "$name"
187
334
  log "stopped."
188
335
  }
189
336
 
@@ -258,13 +405,25 @@ dev_json_url() {
258
405
  for file in "$PROJECT_ROOT/.antelope/dev.json" "$PROJECT_ROOT"/*/.antelope/dev.json; do
259
406
  [ -f "$file" ] || continue
260
407
  read -r pid url <<< "$(read_dev_json "$file")"
261
- if [ -n "${url:-}" ] && is_alive "$pid" && is_in_project "$pid"; then
408
+ if [ -n "${url:-}" ] && is_project_process "$pid"; then
262
409
  echo "$url"
263
410
  return
264
411
  fi
265
412
  done
266
413
  }
267
414
 
415
+ # Whether a pid a server wrote down itself (node's own, a Windows pid on Windows) is alive
416
+ # and one of this project's.
417
+ is_project_process() {
418
+ if [ -z "$IS_WINDOWS" ]; then
419
+ is_alive "$1" && is_in_project "$1"
420
+ return
421
+ fi
422
+ [ -n "$1" ] || return 1
423
+ refresh_process_table
424
+ project_pids backend | grep -qx "$1"
425
+ }
426
+
268
427
  backend_url() {
269
428
  local url deadline
270
429
  deadline=$(($(date +%s) + DEV_JSON_WAIT))
@@ -299,6 +458,17 @@ start_frontend() {
299
458
  log "frontend ready on $(frontend_url)."
300
459
  }
301
460
 
461
+ # Stops the server named (backend or frontend) if it runs, and starts it again: the other
462
+ # one keeps running.
463
+ restart_server() {
464
+ local name="$1"
465
+ stop_servers "$name" || true
466
+ if ! "start_$name"; then
467
+ log "aborting $cmd: $name failed to start."
468
+ exit 1
469
+ fi
470
+ }
471
+
302
472
  start_servers() {
303
473
  local verb="$1"
304
474
  rm -f "$PID_FILE"
@@ -316,11 +486,18 @@ status() {
316
486
  require_dms_back_dir status
317
487
  log "dev processes of $PROJECT_ROOT:"
318
488
  local targets
489
+ refresh_process_table
319
490
  targets="$(project_pids)"
320
491
  if [ -z "$targets" ]; then
321
492
  echo " (none)"
322
493
  return
323
494
  fi
495
+ if [ -n "$IS_WINDOWS" ]; then
496
+ printf '%s\n' "$WIN_TABLE" | awk -F'\t' -v pids="$targets" '
497
+ BEGIN { n = split(pids, p, "[[:space:]]+"); for (i = 1; i <= n; i++) wanted[p[i]] = 1 }
498
+ $1 in wanted { printf " %s %s\n", $1, $4 }'
499
+ return
500
+ fi
324
501
  # shellcheck disable=SC2086 # one pid per word
325
502
  ps -o pid=,args= -p "$(echo $targets | tr ' ' ',')" | sed 's/^/ /'
326
503
  }
@@ -333,8 +510,12 @@ Commands:
333
510
  restart Stop this project's servers, start backend, wait, start frontend, wait.
334
511
  Only when hot reload cannot apply a change, and never from an agent
335
512
  running inside the DMS: it would stop its own host.
513
+ restart-back Stop this project's backend if it runs, start it again, wait: the frontend
514
+ keeps running. Same rules as restart.
515
+ restart-front The same for the frontend alone, e.g. once it crashed while the backend ran.
336
516
  start Same as restart but does not stop first (errors if already running).
337
- stop Stop this project's servers: SIGTERM, then SIGKILL after the grace period.
517
+ stop Stop this project's servers: SIGTERM, then SIGKILL after the grace period
518
+ (on Windows: taskkill /T /F at once).
338
519
  status Show this project's dev processes.
339
520
  back-log [N] Tail the last N (default 60) lines of the backend log.
340
521
  front-log [N] Tail the last N (default 60) lines of the frontend log.
@@ -349,7 +530,7 @@ Environment:
349
530
  DMS_BACK_LOG (default: /tmp/dms-back.log)
350
531
  DMS_FRONT_LOG (default: /tmp/dms-front.log)
351
532
  DMS_DEV_TIMEOUT (default: 180 seconds per server)
352
- DMS_DEV_STOP_GRACE (default: 10 seconds between SIGTERM and SIGKILL)
533
+ DMS_DEV_STOP_GRACE (default: 10 seconds between SIGTERM and SIGKILL; unused on Windows)
353
534
  EOF
354
535
  }
355
536
 
@@ -359,8 +540,15 @@ case "$cmd" in
359
540
  stop_servers || true
360
541
  start_servers restart
361
542
  ;;
543
+ restart-back)
544
+ restart_server backend
545
+ ;;
546
+ restart-front)
547
+ restart_server frontend
548
+ ;;
362
549
  start)
363
550
  require_dms_back_dir start
551
+ refresh_process_table
364
552
  if [ -n "$(project_pids)" ]; then
365
553
  log "error: servers already running. Use restart, or stop first."
366
554
  status
@@ -1 +0,0 @@
1
- export declare function registerTenantInstanceProvisioning(): void;
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.registerTenantInstanceProvisioning = registerTenantInstanceProvisioning;
4
- const hooks_1 = require("@antelopejs/interface-dms/hooks");
5
- const tenant_instances_1 = require("../utils/tenant-instances");
6
- async function onTenantBeingProvisioned(payload) {
7
- await (0, tenant_instances_1.registerTenantInstance)(payload.tenantId);
8
- return undefined;
9
- }
10
- function registerTenantInstanceProvisioning() {
11
- (0, hooks_1.RegisterHook)(hooks_1.Hook.TENANT_BEING_PROVISIONED, onTenantBeingProvisioned);
12
- }
13
- //# sourceMappingURL=tenant-instances.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tenant-instances.js","sourceRoot":"","sources":["../../src/hooks/tenant-instances.ts"],"names":[],"mappings":";;AAqBA,gFAEC;AAvBD,2DAIyC;AACzC,gEAAmE;AAEnE,KAAK,UAAU,wBAAwB,CACrC,OAAsC;IAEtC,MAAM,IAAA,yCAAsB,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,SAAS,CAAC;AACnB,CAAC;AASD,SAAgB,kCAAkC;IAChD,IAAA,oBAAY,EAAC,YAAI,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC;AACxE,CAAC"}
@@ -1,7 +0,0 @@
1
- import { HTTPResult } from "@antelopejs/interface-api";
2
- export declare function setSchemasRegistered(registered: boolean): void;
3
- declare const StartupGateController_base: import("@antelopejs/interface-api").ControllerClass<object>;
4
- export declare class StartupGateController extends StartupGateController_base {
5
- gate(): HTTPResult | undefined;
6
- }
7
- export {};
@@ -1,39 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.StartupGateController = void 0;
13
- exports.setSchemasRegistered = setSchemasRegistered;
14
- const interface_api_1 = require("@antelopejs/interface-api");
15
- const HTTP_SERVICE_UNAVAILABLE = 503;
16
- const RETRY_AFTER_SECONDS = "1";
17
- const ERROR_STARTING = "error.server_starting";
18
- let schemasRegistered = false;
19
- function setSchemasRegistered(registered) {
20
- schemasRegistered = registered;
21
- }
22
- class StartupGateController extends (0, interface_api_1.Controller)("") {
23
- gate() {
24
- if (schemasRegistered) {
25
- return undefined;
26
- }
27
- const result = new interface_api_1.HTTPResult(HTTP_SERVICE_UNAVAILABLE, ERROR_STARTING);
28
- result.addHeader("Retry-After", RETRY_AFTER_SECONDS);
29
- return result;
30
- }
31
- }
32
- exports.StartupGateController = StartupGateController;
33
- __decorate([
34
- (0, interface_api_1.Prefix)("any", "/", interface_api_1.HandlerPriority.HIGH),
35
- __metadata("design:type", Function),
36
- __metadata("design:paramtypes", []),
37
- __metadata("design:returntype", Object)
38
- ], StartupGateController.prototype, "gate", null);
39
- //# sourceMappingURL=startup-gate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"startup-gate.js","sourceRoot":"","sources":["../../src/routes/startup-gate.ts"],"names":[],"mappings":";;;;;;;;;;;;AAmBA,oDAEC;AArBD,6DAKmC;AAEnC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AACrC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAE/C,IAAI,iBAAiB,GAAG,KAAK,CAAC;AAQ9B,SAAgB,oBAAoB,CAAC,UAAmB;IACtD,iBAAiB,GAAG,UAAU,CAAC;AACjC,CAAC;AASD,MAAa,qBAAsB,SAAQ,IAAA,0BAAU,EAAC,EAAE,CAAC;IAEvD,IAAI;QACF,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,0BAAU,CAAC,wBAAwB,EAAE,cAAc,CAAC,CAAC;QACxE,MAAM,CAAC,SAAS,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAVD,sDAUC;AARC;IADC,IAAA,sBAAM,EAAC,KAAK,EAAE,GAAG,EAAE,+BAAe,CAAC,IAAI,CAAC;;;;iDAQxC"}
@@ -1,42 +0,0 @@
1
- import { getCurrentInstance } from "vue";
2
-
3
- /**
4
- * The instant a server render resolves its periods from, handed to the
5
- * browser with the page.
6
- */
7
- const RENDER_NOW_STATE_KEY = "dms-period-render-now";
8
-
9
- /**
10
- * Whether the component setting up is hydrating the server's HTML: Vue binds
11
- * a hydrating component's vnode to its server-rendered node before its setup
12
- * runs, where a fresh mount has no node yet.
13
- */
14
- function isHydratingSetup(): boolean {
15
- return !!getCurrentInstance()?.vnode.el;
16
- }
17
-
18
- /**
19
- * The instant a period set up now resolves from, or `null` for the clock's.
20
- *
21
- * A server render resolves every period of the request from one instant,
22
- * which it transfers; the browser hydrating that render resolves from the
23
- * same one, so a relative preset (`last-24h`) or a calendar one read across
24
- * midnight keeps the bounds, key and labels the server rendered, and nothing
25
- * reads again on hydration. Anywhere else (a client navigation, a call
26
- * outside a component) it is `null`: the period follows the clock.
27
- */
28
- export function periodRenderNow(): Date | null {
29
- if (!getCurrentInstance()) return null;
30
- if (typeof window === "undefined") {
31
- const now = useDmsState<number>(RENDER_NOW_STATE_KEY, () => Date.now(), {
32
- transfer: true,
33
- });
34
- return new Date(now.value);
35
- }
36
- if (!isHydratingSetup()) return null;
37
- const transferred = useDmsState<number | null>(
38
- RENDER_NOW_STATE_KEY,
39
- () => null,
40
- ).value;
41
- return typeof transferred === "number" ? new Date(transferred) : null;
42
- }