@geode/opengeodeweb-front 10.34.0-rc.2 → 10.34.0-rc.21

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 (499) hide show
  1. package/.build/opengeodeweb_front_schemas.js +175 -0
  2. package/.build/server/utils/app_config.js +57 -0
  3. package/.build/server/utils/cleanup.js +135 -0
  4. package/.build/server/utils/cloud.js +156 -0
  5. package/.build/server/utils/microservices.js +153 -0
  6. package/.build/server/utils/path.js +108 -0
  7. package/.build/server/utils/scripts.js +134 -0
  8. package/.build/server/utils/server.js +44 -0
  9. package/.build/server/utils/server_config.js +51 -0
  10. package/.build/server/utils/stream.js +6 -0
  11. package/.build/server/utils/ws_client.js +100 -0
  12. package/.build/shared/app_mode.js +8 -0
  13. package/.build/shared/scripts.js +49 -0
  14. package/.build/shared/utils/call_raw.js +31 -0
  15. package/.build/shared/utils/call_schema.js +28 -0
  16. package/.build/shared/utils/fetch_raw.js +52 -0
  17. package/.build/shared/utils/fetch_schema.js +32 -0
  18. package/.build/shared/utils/file.js +14 -0
  19. package/.build/shared/utils/parse_boolean.js +23 -0
  20. package/.build/shared/utils/response_handlers/load.js +50 -0
  21. package/.build/shared/utils/types.js +1 -0
  22. package/.build/shared/utils/validate_schema.js +17 -0
  23. package/README.md +8 -0
  24. package/app/assets/{geode_objects.js → geode_objects.ts} +8 -1
  25. package/app/components/ActionButton.vue +28 -12
  26. package/app/components/Basic/Slider.vue +2 -2
  27. package/app/components/Basic/Switch.vue +2 -2
  28. package/app/components/CameraManager/List.vue +11 -11
  29. package/app/components/CameraManager/Saver.vue +8 -4
  30. package/app/components/CameraManager.vue +24 -12
  31. package/app/components/CameraOrientation.vue +31 -17
  32. package/app/components/ClippingPlaneCard.vue +13 -12
  33. package/app/components/ClippingPlanes.vue +31 -21
  34. package/app/components/CrsSelector.vue +26 -18
  35. package/app/components/DeleteDialog.vue +18 -16
  36. package/app/components/DragAndDrop.vue +55 -37
  37. package/app/components/DragAndDropInternal/DragAndDropInline.vue +31 -16
  38. package/app/components/DragAndDropInternal/DragAndDropOverlay.vue +32 -19
  39. package/app/components/ExtensionSelector.vue +34 -18
  40. package/app/components/FeedBack/ErrorBanner.vue +4 -3
  41. package/app/components/FeedBack/Snackers.vue +6 -5
  42. package/app/components/FetchingData.vue +8 -12
  43. package/app/components/FileSelector.vue +27 -17
  44. package/app/components/FileUploader.vue +51 -30
  45. package/app/components/GlassCard.vue +17 -13
  46. package/app/components/HybridRenderingView.vue +25 -12
  47. package/app/components/HybridViewerTooltip.vue +28 -26
  48. package/app/components/InfraConnected.vue +1 -1
  49. package/app/components/Launcher.vue +12 -10
  50. package/app/components/Loading/EcoMessages.vue +24 -13
  51. package/app/components/Loading/Header.vue +6 -7
  52. package/app/components/Loading/Progress.vue +6 -7
  53. package/app/components/Loading.vue +10 -14
  54. package/app/components/MissingFilesSelector.vue +35 -19
  55. package/app/components/ObjectSelector.vue +37 -21
  56. package/app/components/PackagesVersions.vue +16 -8
  57. package/app/components/Recaptcha.vue +17 -23
  58. package/app/components/RemoteRenderingView.vue +21 -15
  59. package/app/components/Ruler.vue +11 -9
  60. package/app/components/Screenshot.vue +25 -19
  61. package/app/components/SearchBar.vue +12 -6
  62. package/app/components/ShrinkFilter.vue +19 -14
  63. package/app/components/Step.vue +32 -12
  64. package/app/components/Stepper.vue +19 -7
  65. package/app/components/ToolPanel.vue +29 -13
  66. package/app/components/ViewToolbar.vue +53 -44
  67. package/app/components/Viewer/ContextMenu/CenterButton.vue +16 -9
  68. package/app/components/Viewer/ContextMenu/CircularItems.vue +13 -10
  69. package/app/components/Viewer/ContextMenu/ContextMenu.vue +40 -32
  70. package/app/components/Viewer/ContextMenu/ContextMenuItem.vue +31 -17
  71. package/app/components/Viewer/ContextMenu/InfoCard.vue +38 -22
  72. package/app/components/Viewer/EdgedCurve/PointsOptions.vue +8 -5
  73. package/app/components/Viewer/EdgedCurve/SpecificEdgesOptions.vue +67 -48
  74. package/app/components/Viewer/Generic/Mesh/CellsOptions.vue +74 -50
  75. package/app/components/Viewer/Generic/Mesh/EdgesOptions.vue +69 -50
  76. package/app/components/Viewer/Generic/Mesh/PointsOptions.vue +47 -35
  77. package/app/components/Viewer/Generic/Mesh/PolygonsOptions.vue +91 -51
  78. package/app/components/Viewer/Generic/Mesh/PolyhedraOptions.vue +74 -49
  79. package/app/components/Viewer/Generic/Model/BlocksOptions.vue +115 -53
  80. package/app/components/Viewer/Generic/Model/CornersOptions.vue +75 -37
  81. package/app/components/Viewer/Generic/Model/EdgesOptions.vue +13 -9
  82. package/app/components/Viewer/Generic/Model/LinesOptions.vue +110 -61
  83. package/app/components/Viewer/Generic/Model/ModelStyleCard.vue +32 -21
  84. package/app/components/Viewer/Generic/Model/ModelStyleOptions.vue +9 -5
  85. package/app/components/Viewer/Generic/Model/PointsOptions.vue +19 -13
  86. package/app/components/Viewer/Generic/Model/SurfacesOptions.vue +119 -49
  87. package/app/components/Viewer/Grid/2D/CellsOptions.vue +8 -5
  88. package/app/components/Viewer/Grid/2D/EdgesOptions.vue +8 -5
  89. package/app/components/Viewer/Grid/2D/PointsOptions.vue +8 -5
  90. package/app/components/Viewer/Grid/3D/CellsOptions.vue +8 -5
  91. package/app/components/Viewer/Grid/3D/EdgesOptions.vue +8 -5
  92. package/app/components/Viewer/Grid/3D/FacetsOptions.vue +8 -5
  93. package/app/components/Viewer/Grid/3D/PointsOptions.vue +8 -5
  94. package/app/components/Viewer/ObjectTree/Base/CommonTreeView.vue +120 -76
  95. package/app/components/Viewer/ObjectTree/Base/Controls.vue +25 -10
  96. package/app/components/Viewer/ObjectTree/Base/ItemLabel.vue +42 -17
  97. package/app/components/Viewer/ObjectTree/Base/StickyHeader.vue +22 -9
  98. package/app/components/Viewer/ObjectTree/Base/TreeRow.vue +29 -14
  99. package/app/components/Viewer/ObjectTree/Box.vue +32 -15
  100. package/app/components/Viewer/ObjectTree/Layout.vue +55 -35
  101. package/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue +63 -34
  102. package/app/components/Viewer/ObjectTree/Views/{ModelCollections.vue → ModelTree.vue} +101 -39
  103. package/app/components/Viewer/Options/AttributeColorBar.vue +14 -6
  104. package/app/components/Viewer/Options/AttributeRangeSelector.vue +8 -4
  105. package/app/components/Viewer/Options/AttributeSelector.vue +64 -33
  106. package/app/components/Viewer/Options/ColorMapList.vue +52 -24
  107. package/app/components/Viewer/Options/ColorMapPicker.vue +15 -11
  108. package/app/components/Viewer/Options/ColorPicker.vue +239 -50
  109. package/app/components/Viewer/Options/ColoringTypeSelector.vue +87 -67
  110. package/app/components/Viewer/Options/ColormapQuickPicker.vue +16 -12
  111. package/app/components/Viewer/Options/OptionsSection.vue +7 -5
  112. package/app/components/Viewer/Options/Sliders/Size.vue +3 -3
  113. package/app/components/Viewer/Options/Sliders/Slider.vue +9 -6
  114. package/app/components/Viewer/Options/Sliders/Width.vue +3 -3
  115. package/app/components/Viewer/Options/TextureItem.vue +29 -22
  116. package/app/components/Viewer/Options/TexturesSelector.vue +23 -12
  117. package/app/components/Viewer/Options/VisibilitySwitch.vue +3 -3
  118. package/app/components/Viewer/OverlappingObjectsPicker.vue +27 -12
  119. package/app/components/Viewer/PointSet/SpecificPointsOptions.vue +38 -26
  120. package/app/components/Viewer/Solid/EdgesOptions.vue +8 -5
  121. package/app/components/Viewer/Solid/PointsOptions.vue +8 -5
  122. package/app/components/Viewer/Solid/PolygonsOptions.vue +8 -5
  123. package/app/components/Viewer/Solid/SpecificPolyhedraOptions.vue +73 -48
  124. package/app/components/Viewer/Surface/EdgesOptions.vue +8 -5
  125. package/app/components/Viewer/Surface/PointsOptions.vue +8 -5
  126. package/app/components/Viewer/Surface/PolygonsOptions.vue +79 -49
  127. package/app/components/Viewer/Surface/Triangulated/TrianglesOptions.vue +8 -5
  128. package/app/components/Viewer/TetrahedralSolid/TetrahedraOptions.vue +8 -5
  129. package/app/components/Viewer/TetrahedralSolid/TrianglesOptions.vue +8 -5
  130. package/app/components/Viewer/Ui.vue +19 -14
  131. package/app/components/Wrapper.vue +16 -10
  132. package/app/components/ZScaling.vue +18 -10
  133. package/app/components/csv-preview/CsvPreviewer.vue +72 -50
  134. package/app/components/csv-preview/CsvSettings.vue +30 -50
  135. package/app/components/csv-preview/CsvTable.vue +34 -14
  136. package/app/composables/{batch_style.js → batch_style.ts} +9 -7
  137. package/app/composables/clipping_planes_widget.ts +204 -0
  138. package/app/composables/clipping_planes_widget_entries.ts +189 -0
  139. package/app/composables/copy_to_clipboard.ts +7 -0
  140. package/app/composables/global_attribute_style.ts +303 -0
  141. package/app/composables/hover_highlight.ts +127 -0
  142. package/app/composables/{model_collections.js → model_collections.ts} +28 -9
  143. package/app/composables/{model_components.js → model_components.ts} +28 -9
  144. package/app/composables/{project_manager.js → project_manager.ts} +77 -20
  145. package/app/composables/responsive_middle_truncate.ts +48 -0
  146. package/app/composables/{run_function_when_microservices_connected.js → run_function_when_microservices_connected.ts} +1 -1
  147. package/app/composables/stepper_tree.ts +79 -0
  148. package/app/composables/tree_filter.ts +194 -0
  149. package/app/composables/{tree_keyboard_nav.js → tree_keyboard_nav.ts} +62 -20
  150. package/app/composables/{tree_scroll.js → tree_scroll.ts} +61 -12
  151. package/app/composables/use_adaptive_styles.ts +186 -0
  152. package/app/composables/use_overlapping_picker.ts +263 -0
  153. package/app/composables/use_quick_colormap.ts +55 -0
  154. package/app/composables/virtual_tree.ts +271 -0
  155. package/app/composables/vtk_implicit_plane_widget.d.ts +2 -0
  156. package/app/plugins/{auto_store_register.js → auto_store_register.ts} +3 -5
  157. package/app/plugins/click_outside_ignore_snackbars.client.ts +36 -0
  158. package/app/stores/app.ts +252 -0
  159. package/app/stores/app_helpers/extension.ts +179 -0
  160. package/app/stores/{back.js → back.ts} +54 -28
  161. package/app/stores/camera_manager.ts +80 -0
  162. package/app/stores/{cloud.js → cloud.ts} +18 -13
  163. package/app/stores/data.ts +392 -0
  164. package/app/stores/data_helpers/collections.ts +138 -0
  165. package/app/stores/data_helpers/mesh.ts +169 -0
  166. package/app/stores/data_style.ts +167 -0
  167. package/app/stores/{feedback.js → feedback.ts} +19 -8
  168. package/app/stores/{hybrid_viewer.js → hybrid_viewer.ts} +49 -45
  169. package/app/stores/infra.ts +106 -0
  170. package/app/stores/{menu.js → menu.ts} +67 -36
  171. package/app/stores/treeview.ts +383 -0
  172. package/app/stores/{viewer.js → viewer.ts} +75 -42
  173. package/app/utils/attributes.ts +40 -0
  174. package/app/utils/clipping_planes.ts +222 -0
  175. package/app/utils/color_picker.js +54 -0
  176. package/app/utils/colormap.ts +102 -0
  177. package/app/utils/default_styles/{constants.js → constants.ts} +25 -12
  178. package/app/utils/default_styles/{index.js → index.ts} +4 -3
  179. package/app/utils/default_styles/meshes.ts +264 -0
  180. package/app/utils/default_styles/{models.js → models.ts} +106 -52
  181. package/app/utils/{extension.js → extension.ts} +63 -19
  182. package/app/utils/{import_workflow.js → import_workflow.ts} +39 -22
  183. package/app/utils/{log.js → log.ts} +12 -2
  184. package/app/utils/{name_cleaner.js → name_cleaner.ts} +6 -6
  185. package/app/utils/status.ts +19 -0
  186. package/app/utils/{stores.js → stores.ts} +5 -5
  187. package/app/utils/{string.js → string.ts} +6 -6
  188. package/app/utils/{treeview.js → treeview.ts} +4 -1
  189. package/internal/database/{base_database.js → base_database.ts} +7 -3
  190. package/internal/database/database.ts +102 -0
  191. package/internal/database/{extended_database.js → extended_database.ts} +5 -1
  192. package/internal/database/tables/camera_positions.ts +6 -0
  193. package/internal/database/tables/{data.js → data.ts} +3 -1
  194. package/internal/database/tables/data_style.ts +6 -0
  195. package/internal/database/tables/model_component_datastyle.ts +6 -0
  196. package/internal/database/tables/model_component_type_datastyle.ts +6 -0
  197. package/internal/database/tables/model_components.ts +6 -0
  198. package/internal/database/tables/model_components_relation.ts +6 -0
  199. package/internal/database/tables/table_definition.ts +5 -0
  200. package/internal/stores/data_style/mesh/cells/cell.ts +279 -0
  201. package/internal/stores/data_style/mesh/cells/{color.js → color.ts} +13 -7
  202. package/internal/stores/data_style/mesh/cells/common.ts +50 -0
  203. package/internal/stores/data_style/mesh/cells/index.ts +161 -0
  204. package/internal/stores/data_style/mesh/cells/{textures.js → textures.ts} +14 -8
  205. package/internal/stores/data_style/mesh/cells/vertex.ts +285 -0
  206. package/internal/stores/data_style/mesh/cells/visibility.ts +46 -0
  207. package/internal/stores/data_style/mesh/edges/{color.js → color.ts} +13 -7
  208. package/internal/stores/data_style/mesh/edges/common.ts +41 -0
  209. package/internal/stores/data_style/mesh/edges/edge.ts +279 -0
  210. package/internal/stores/data_style/mesh/edges/index.ts +155 -0
  211. package/internal/stores/data_style/mesh/edges/vertex.ts +285 -0
  212. package/internal/stores/data_style/mesh/edges/visibility.ts +45 -0
  213. package/internal/stores/data_style/mesh/edges/width.ts +42 -0
  214. package/internal/stores/data_style/mesh/{index.js → index.ts} +34 -14
  215. package/internal/stores/data_style/mesh/points/{color.js → color.ts} +13 -7
  216. package/internal/stores/data_style/mesh/points/common.ts +51 -0
  217. package/internal/stores/data_style/mesh/points/index.ts +133 -0
  218. package/internal/stores/data_style/mesh/points/size.ts +43 -0
  219. package/internal/stores/data_style/mesh/points/vertex.ts +285 -0
  220. package/internal/stores/data_style/mesh/points/visibility.ts +49 -0
  221. package/internal/stores/data_style/mesh/polygons/{color.js → color.ts} +13 -7
  222. package/internal/stores/data_style/mesh/polygons/common.ts +50 -0
  223. package/internal/stores/data_style/mesh/polygons/index.ts +167 -0
  224. package/internal/stores/data_style/mesh/polygons/polygon.ts +282 -0
  225. package/internal/stores/data_style/mesh/polygons/{textures.js → textures.ts} +14 -8
  226. package/internal/stores/data_style/mesh/polygons/vertex.ts +288 -0
  227. package/internal/stores/data_style/mesh/polygons/visibility.ts +48 -0
  228. package/internal/stores/data_style/mesh/polyhedra/{color.js → color.ts} +13 -7
  229. package/internal/stores/data_style/mesh/polyhedra/common.ts +41 -0
  230. package/internal/stores/data_style/mesh/polyhedra/index.ts +157 -0
  231. package/internal/stores/data_style/mesh/polyhedra/polyhedron.ts +294 -0
  232. package/internal/stores/data_style/mesh/polyhedra/vertex.ts +288 -0
  233. package/internal/stores/data_style/mesh/polyhedra/visibility.ts +48 -0
  234. package/internal/stores/data_style/model/blocks/{color.js → color.ts} +50 -13
  235. package/internal/stores/data_style/model/blocks/common.ts +67 -0
  236. package/internal/stores/data_style/model/blocks/{index.js → index.ts} +111 -66
  237. package/internal/stores/data_style/model/blocks/polyhedron.ts +363 -0
  238. package/internal/stores/data_style/model/blocks/vertex.ts +349 -0
  239. package/internal/stores/data_style/model/blocks/visibility.ts +37 -0
  240. package/internal/stores/data_style/model/color.ts +348 -0
  241. package/internal/stores/data_style/model/common.ts +262 -0
  242. package/internal/stores/data_style/model/corners/{color.js → color.ts} +49 -10
  243. package/internal/stores/data_style/model/corners/common.ts +71 -0
  244. package/internal/stores/data_style/model/corners/{index.js → index.ts} +86 -47
  245. package/internal/stores/data_style/model/corners/vertex.ts +315 -0
  246. package/internal/stores/data_style/model/corners/visibility.ts +39 -0
  247. package/internal/stores/data_style/model/edges/common.ts +29 -0
  248. package/internal/stores/data_style/model/edges/{index.js → index.ts} +2 -7
  249. package/internal/stores/data_style/model/edges/visibility.ts +55 -0
  250. package/internal/stores/data_style/model/{index.js → index.ts} +24 -11
  251. package/internal/stores/data_style/model/lines/{color.js → color.ts} +47 -10
  252. package/internal/stores/data_style/model/lines/common.ts +63 -0
  253. package/internal/stores/data_style/model/lines/edge.ts +343 -0
  254. package/internal/stores/data_style/model/lines/{index.js → index.ts} +108 -66
  255. package/internal/stores/data_style/model/lines/vertex.ts +344 -0
  256. package/internal/stores/data_style/model/lines/visibility.ts +37 -0
  257. package/internal/stores/data_style/model/points/common.ts +25 -0
  258. package/internal/stores/data_style/model/points/index.ts +35 -0
  259. package/internal/stores/data_style/model/points/size.ts +44 -0
  260. package/internal/stores/data_style/model/points/visibility.ts +46 -0
  261. package/internal/stores/data_style/model/selection.ts +138 -0
  262. package/internal/stores/data_style/model/surfaces/{color.js → color.ts} +47 -10
  263. package/internal/stores/data_style/model/surfaces/common.ts +69 -0
  264. package/internal/stores/data_style/model/surfaces/{index.js → index.ts} +113 -66
  265. package/internal/stores/data_style/model/surfaces/polygon.ts +347 -0
  266. package/internal/stores/data_style/model/surfaces/vertex.ts +351 -0
  267. package/internal/stores/data_style/model/surfaces/visibility.ts +37 -0
  268. package/internal/stores/data_style/model/{visibility.js → visibility.ts} +112 -32
  269. package/internal/stores/data_style/state.ts +281 -0
  270. package/internal/stores/data_style/types.ts +30 -0
  271. package/internal/stores/hybrid_viewer/brightness.ts +124 -0
  272. package/internal/stores/hybrid_viewer/camera.ts +326 -0
  273. package/internal/stores/hybrid_viewer/{camera_animation.js → camera_animation.ts} +30 -12
  274. package/internal/stores/hybrid_viewer/{constants.js → constants.ts} +2 -2
  275. package/internal/stores/hybrid_viewer/core.ts +64 -0
  276. package/internal/stores/hybrid_viewer/{filters.js → filters.ts} +10 -13
  277. package/internal/stores/hybrid_viewer/highlight.ts +183 -0
  278. package/internal/stores/hybrid_viewer/{ruler.js → ruler.ts} +50 -22
  279. package/internal/stores/hybrid_viewer/scene.ts +125 -0
  280. package/internal/stores/hybrid_viewer/viewport.ts +177 -0
  281. package/internal/stores/hybrid_viewer/vtk_types.ts +58 -0
  282. package/internal/utils/api_fetch.ts +133 -0
  283. package/internal/utils/upload_file.ts +115 -0
  284. package/internal/utils/viewer_call.ts +99 -0
  285. package/internal/utils/ws_client.ts +54 -0
  286. package/nuxt.config.ts +168 -0
  287. package/opengeodeweb_front_schemas.json +2 -2
  288. package/package.json +49 -13
  289. package/server/api/cloud/extensions/{run.post.js → run.post.ts} +16 -12
  290. package/server/api/local/app/project_folder_path.post.ts +33 -0
  291. package/server/api/local/app/run_back.post.ts +39 -0
  292. package/server/api/local/app/run_viewer.post.ts +39 -0
  293. package/server/api/local/extensions/{kill.post.js → kill.post.ts} +15 -8
  294. package/server/api/local/extensions/{run.post.js → run.post.ts} +17 -12
  295. package/server/api/local/extensions/upload.put.ts +71 -0
  296. package/server/api/microservice/app/{get_is_app_ready.get.js → get_is_app_ready.get.ts} +5 -5
  297. package/server/api/microservice/app/schemas/get_is_app_ready.json +1 -1
  298. package/server/api/microservice/app/set_app_base_url.post.ts +29 -0
  299. package/server/api/microservice/app/set_back_base_url.post.ts +26 -0
  300. package/server/api/microservice/app/set_is_app_ready.post.ts +29 -0
  301. package/server/api/microservice/app/set_viewer_base_url.post.ts +26 -0
  302. package/server/api/microservice/extensions/{download.post.js → download.post.ts} +13 -6
  303. package/server/api/serverless/run_cloud.post.ts +92 -0
  304. package/server/utils/{app_config.js → app_config.ts} +40 -18
  305. package/server/utils/{cleanup.js → cleanup.ts} +76 -29
  306. package/server/utils/{cloud.js → cloud.ts} +33 -17
  307. package/server/utils/{extension.js → extension.ts} +31 -4
  308. package/server/utils/{microservices.js → microservices.ts} +68 -27
  309. package/server/utils/{path.js → path.ts} +36 -17
  310. package/server/utils/{scripts.js → scripts.ts} +49 -33
  311. package/server/utils/{server.js → server.ts} +13 -6
  312. package/server/utils/server_config.ts +74 -0
  313. package/server/utils/stream.ts +6 -0
  314. package/server/utils/ws_client.ts +165 -0
  315. package/shared/{scripts.js → scripts.ts} +15 -10
  316. package/shared/utils/call_raw.ts +73 -0
  317. package/shared/utils/{call_schema.js → call_schema.ts} +15 -6
  318. package/shared/utils/fetch_raw.ts +125 -0
  319. package/shared/utils/{fetch_schema.js → fetch_schema.ts} +16 -7
  320. package/shared/utils/file.ts +22 -0
  321. package/shared/utils/{parse_boolean.js → parse_boolean.ts} +1 -1
  322. package/shared/utils/response_handlers/load.ts +109 -0
  323. package/shared/utils/types.ts +27 -0
  324. package/shared/utils/{validate_schema.js → validate_schema.ts} +3 -1
  325. package/.github/workflows/config.json +0 -5
  326. package/.github/workflows/deploy.yml +0 -15
  327. package/.github/workflows/manual_release.yml +0 -11
  328. package/.github/workflows/merge_request.yml +0 -9
  329. package/.github/workflows/pr_update.yml +0 -11
  330. package/.github/workflows/prepare_deploy.yml +0 -9
  331. package/.github/workflows/schedule.yml +0 -18
  332. package/.github/workflows/test.yml +0 -14
  333. package/.github/workflows/test_pr.yml +0 -12
  334. package/.oxlintrc.json +0 -150
  335. package/.releaserc +0 -11
  336. package/app/components/Viewer/ObjectTree/Views/ModelComponents.vue +0 -224
  337. package/app/composables/clipping_planes_widget.js +0 -249
  338. package/app/composables/global_attribute_style.js +0 -181
  339. package/app/composables/hover_highlight.js +0 -91
  340. package/app/composables/responsive_middle_truncate.js +0 -34
  341. package/app/composables/stepper_tree.js +0 -56
  342. package/app/composables/tree_filter.js +0 -138
  343. package/app/composables/use_adaptive_styles.js +0 -120
  344. package/app/composables/use_overlapping_picker.js +0 -169
  345. package/app/composables/use_quick_colormap.js +0 -32
  346. package/app/composables/virtual_tree.js +0 -191
  347. package/app/stores/app.js +0 -326
  348. package/app/stores/camera_manager.js +0 -57
  349. package/app/stores/data.js +0 -278
  350. package/app/stores/data_helpers/collections.js +0 -96
  351. package/app/stores/data_helpers/mesh.js +0 -122
  352. package/app/stores/data_style.js +0 -116
  353. package/app/stores/infra.js +0 -95
  354. package/app/stores/treeview.js +0 -290
  355. package/app/utils/attributes.js +0 -23
  356. package/app/utils/clipping_planes.js +0 -110
  357. package/app/utils/colormap.js +0 -64
  358. package/app/utils/default_styles/meshes.js +0 -191
  359. package/app/utils/status.js +0 -10
  360. package/commitlint.config.js +0 -20
  361. package/internal/database/database.js +0 -80
  362. package/internal/database/tables/camera_positions.js +0 -4
  363. package/internal/database/tables/data_style.js +0 -4
  364. package/internal/database/tables/model_component_datastyle.js +0 -4
  365. package/internal/database/tables/model_component_type_datastyle.js +0 -4
  366. package/internal/database/tables/model_components.js +0 -4
  367. package/internal/database/tables/model_components_relation.js +0 -4
  368. package/internal/stores/data_style/mesh/cells/cell.js +0 -196
  369. package/internal/stores/data_style/mesh/cells/common.js +0 -39
  370. package/internal/stores/data_style/mesh/cells/index.js +0 -81
  371. package/internal/stores/data_style/mesh/cells/vertex.js +0 -193
  372. package/internal/stores/data_style/mesh/cells/visibility.js +0 -35
  373. package/internal/stores/data_style/mesh/edges/common.js +0 -32
  374. package/internal/stores/data_style/mesh/edges/edge.js +0 -195
  375. package/internal/stores/data_style/mesh/edges/index.js +0 -81
  376. package/internal/stores/data_style/mesh/edges/vertex.js +0 -196
  377. package/internal/stores/data_style/mesh/edges/visibility.js +0 -34
  378. package/internal/stores/data_style/mesh/edges/width.js +0 -34
  379. package/internal/stores/data_style/mesh/points/common.js +0 -37
  380. package/internal/stores/data_style/mesh/points/index.js +0 -82
  381. package/internal/stores/data_style/mesh/points/size.js +0 -35
  382. package/internal/stores/data_style/mesh/points/vertex.js +0 -193
  383. package/internal/stores/data_style/mesh/points/visibility.js +0 -37
  384. package/internal/stores/data_style/mesh/polygons/common.js +0 -32
  385. package/internal/stores/data_style/mesh/polygons/index.js +0 -107
  386. package/internal/stores/data_style/mesh/polygons/polygon.js +0 -196
  387. package/internal/stores/data_style/mesh/polygons/vertex.js +0 -196
  388. package/internal/stores/data_style/mesh/polygons/visibility.js +0 -38
  389. package/internal/stores/data_style/mesh/polyhedra/common.js +0 -32
  390. package/internal/stores/data_style/mesh/polyhedra/index.js +0 -98
  391. package/internal/stores/data_style/mesh/polyhedra/polyhedron.js +0 -196
  392. package/internal/stores/data_style/mesh/polyhedra/vertex.js +0 -196
  393. package/internal/stores/data_style/mesh/polyhedra/visibility.js +0 -38
  394. package/internal/stores/data_style/model/blocks/common.js +0 -51
  395. package/internal/stores/data_style/model/blocks/polyhedron.js +0 -215
  396. package/internal/stores/data_style/model/blocks/vertex.js +0 -204
  397. package/internal/stores/data_style/model/blocks/visibility.js +0 -20
  398. package/internal/stores/data_style/model/color.js +0 -218
  399. package/internal/stores/data_style/model/common.js +0 -141
  400. package/internal/stores/data_style/model/corners/common.js +0 -51
  401. package/internal/stores/data_style/model/corners/vertex.js +0 -204
  402. package/internal/stores/data_style/model/corners/visibility.js +0 -20
  403. package/internal/stores/data_style/model/edges/common.js +0 -20
  404. package/internal/stores/data_style/model/edges/visibility.js +0 -38
  405. package/internal/stores/data_style/model/lines/common.js +0 -51
  406. package/internal/stores/data_style/model/lines/edge.js +0 -203
  407. package/internal/stores/data_style/model/lines/vertex.js +0 -204
  408. package/internal/stores/data_style/model/lines/visibility.js +0 -20
  409. package/internal/stores/data_style/model/points/common.js +0 -20
  410. package/internal/stores/data_style/model/points/index.js +0 -25
  411. package/internal/stores/data_style/model/points/size.js +0 -36
  412. package/internal/stores/data_style/model/points/visibility.js +0 -36
  413. package/internal/stores/data_style/model/selection.js +0 -89
  414. package/internal/stores/data_style/model/surfaces/common.js +0 -51
  415. package/internal/stores/data_style/model/surfaces/polygon.js +0 -215
  416. package/internal/stores/data_style/model/surfaces/vertex.js +0 -215
  417. package/internal/stores/data_style/model/surfaces/visibility.js +0 -20
  418. package/internal/stores/data_style/state.js +0 -197
  419. package/internal/stores/hybrid_viewer/brightness.js +0 -82
  420. package/internal/stores/hybrid_viewer/camera.js +0 -274
  421. package/internal/stores/hybrid_viewer/highlight.js +0 -170
  422. package/internal/stores/hybrid_viewer/scene.js +0 -136
  423. package/internal/stores/hybrid_viewer/viewport.js +0 -140
  424. package/internal/utils/api_fetch.js +0 -52
  425. package/internal/utils/upload_file.js +0 -57
  426. package/internal/utils/viewer_call.js +0 -49
  427. package/internal/utils/ws_client.js +0 -29
  428. package/nuxt.config.js +0 -106
  429. package/scripts/generate_geode_objects.js +0 -24
  430. package/server/api/local/app/project_folder_path.post.js +0 -29
  431. package/server/api/local/app/run_back.post.js +0 -33
  432. package/server/api/local/app/run_viewer.post.js +0 -33
  433. package/server/api/local/extensions/upload.put.js +0 -72
  434. package/server/api/microservice/app/set_app_base_url.post.js +0 -25
  435. package/server/api/microservice/app/set_back_base_url.post.js +0 -22
  436. package/server/api/microservice/app/set_is_app_ready.post.js +0 -25
  437. package/server/api/microservice/app/set_viewer_base_url.post.js +0 -22
  438. package/server/api/serverless/run_cloud.post.js +0 -44
  439. package/server/utils/server_config.js +0 -58
  440. package/server/utils/ws_client.js +0 -112
  441. package/shared/utils/call_raw.js +0 -46
  442. package/shared/utils/fetch_raw.js +0 -61
  443. package/shared/utils/file.js +0 -16
  444. package/shared/utils/response_handlers/load.js +0 -74
  445. package/tests/integration/data/uploads/test.og_brep +0 -0
  446. package/tests/integration/data/uploads/test.og_edc2d +0 -0
  447. package/tests/integration/data/uploads/test.og_edc3d +0 -0
  448. package/tests/integration/data/uploads/test.og_psf3d +0 -0
  449. package/tests/integration/data/uploads/test.og_rgd2d +0 -0
  450. package/tests/integration/data/uploads/test.og_rgd3d +0 -0
  451. package/tests/integration/data/uploads/test.vtu +0 -22
  452. package/tests/integration/setup.js +0 -92
  453. package/tests/integration/stores/data_style/mesh/cells.nuxt.test.js +0 -343
  454. package/tests/integration/stores/data_style/mesh/edges.nuxt.test.js +0 -254
  455. package/tests/integration/stores/data_style/mesh/index.nuxt.test.js +0 -62
  456. package/tests/integration/stores/data_style/mesh/points.nuxt.test.js +0 -201
  457. package/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js +0 -260
  458. package/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js +0 -267
  459. package/tests/integration/stores/data_style/model/blocks.nuxt.test.js +0 -397
  460. package/tests/integration/stores/data_style/model/corners.nuxt.test.js +0 -264
  461. package/tests/integration/stores/data_style/model/edges.nuxt.test.js +0 -71
  462. package/tests/integration/stores/data_style/model/index.nuxt.test.js +0 -92
  463. package/tests/integration/stores/data_style/model/lines.nuxt.test.js +0 -379
  464. package/tests/integration/stores/data_style/model/points.nuxt.test.js +0 -95
  465. package/tests/integration/stores/data_style/model/surfaces.nuxt.test.js +0 -574
  466. package/tests/integration/stores/viewer.nuxt.test.js +0 -69
  467. package/tests/setup_indexeddb.js +0 -4
  468. package/tests/unit/components/CrsSelector.nuxt.test.js +0 -55
  469. package/tests/unit/components/DragAndDrop.nuxt.test.js +0 -89
  470. package/tests/unit/components/ExtensionSelector.nuxt.test.js +0 -65
  471. package/tests/unit/components/FeedBack/ErrorsBanner.nuxt.test.js +0 -41
  472. package/tests/unit/components/FeedBack/Snackers.nuxt.test.js +0 -49
  473. package/tests/unit/components/FileSelector.nuxt.test.js +0 -124
  474. package/tests/unit/components/FileUploader.nuxt.test.js +0 -69
  475. package/tests/unit/components/MissingFilesSelector.nuxt.test.js +0 -77
  476. package/tests/unit/components/ObjectSelector.nuxt.test.js +0 -118
  477. package/tests/unit/components/PackagesVersions.nuxt.test.js +0 -42
  478. package/tests/unit/components/Step.nuxt.test.js +0 -51
  479. package/tests/unit/components/Stepper.nuxt.test.js +0 -41
  480. package/tests/unit/components/ToolPanel.nuxt.test.js +0 -66
  481. package/tests/unit/composables/api_fetch.nuxt.test.js +0 -75
  482. package/tests/unit/composables/project_manager.nuxt.test.js +0 -299
  483. package/tests/unit/composables/run_function_when_microservices_connected.nuxt.test.js +0 -57
  484. package/tests/unit/composables/upload_file.nuxt.test.js +0 -45
  485. package/tests/unit/composables/virtual_tree.nuxt.test.js +0 -63
  486. package/tests/unit/plugins/project_load.nuxt.test.js +0 -98
  487. package/tests/unit/stores/app.nuxt.test.js +0 -189
  488. package/tests/unit/stores/back.nuxt.test.js +0 -147
  489. package/tests/unit/stores/cloud.nuxt.test.js +0 -90
  490. package/tests/unit/stores/data.nuxt.test.js +0 -162
  491. package/tests/unit/stores/feedback.nuxt.test.js +0 -90
  492. package/tests/unit/stores/infra.nuxt.test.js +0 -313
  493. package/tests/unit/stores/treeview.nuxt.test.js +0 -63
  494. package/tests/unit/stores/viewer.nuxt.test.js +0 -161
  495. package/tests/unit/utils/validate_schema.nuxt.test.js +0 -38
  496. package/tests/utils.js +0 -20
  497. package/tests/vitest.config.js +0 -67
  498. /package/server/api/local/app/{kill.post.js → kill.post.ts} +0 -0
  499. /package/shared/{app_mode.js → app_mode.ts} +0 -0
@@ -7,32 +7,42 @@ import path from "node:path";
7
7
  import back_schemas from "@geode/opengeodeweb-back/opengeodeweb_back_schemas.json" with { type: "json" };
8
8
 
9
9
  // Local imports
10
+ import { type Microservice, microservicesMetadatasPath, projectMicroservices } from "./cleanup.js";
11
+ import { type NamedChildProcess, getAvailablePort, waitForReady } from "./scripts.js";
10
12
  import { addNginxLocation, addSupervisorProgram } from "./cloud.js";
11
- import { getAvailablePort, waitForReady } from "./scripts.js";
12
- import { microservicesMetadatasPath, projectMicroservices } from "./cleanup.js";
13
13
  import { executablePath } from "./path.js";
14
14
 
15
+ interface RunArgs {
16
+ projectFolderPath: string;
17
+ uploadFolderPath?: string;
18
+ [key: string]: unknown;
19
+ }
20
+
15
21
  const MILLISECONDS_PER_SECOND = 1000;
16
22
  const DEFAULT_TIMEOUT_SECONDS = 45;
17
23
  const MAX_PORT_RETRIES = 1;
24
+ const DEFAULT_RUN_ARGS: RunArgs = { projectFolderPath: "" };
25
+
18
26
  async function runScript(
19
- execPath,
20
- execName,
21
- args,
22
- expectedResponse,
27
+ execPath: string,
28
+ execName: string,
29
+ args: readonly string[],
30
+ expectedResponse: string,
23
31
  timeoutSeconds = DEFAULT_TIMEOUT_SECONDS,
24
- ) {
32
+ ): Promise<NamedChildProcess> {
25
33
  const command = executablePath(execPath, execName);
26
34
  console.log("runScript", command, args);
27
35
  const child = child_process.spawn(command, args, {
28
36
  stdio: ["ignore", "pipe", "pipe"],
29
- });
37
+ }) as NamedChildProcess;
30
38
  child.name = command.replace(/^.*[\\/]/u, "");
31
39
  child.on("spawn", () => {
32
40
  console.log(`[${child.name}] spawned, pid=${child.pid}`);
33
41
  });
34
42
  const controller = new AbortController();
35
- const timer = setTimeout(() => controller.abort(), timeoutSeconds * MILLISECONDS_PER_SECOND);
43
+ const timer = setTimeout(() => {
44
+ controller.abort();
45
+ }, timeoutSeconds * MILLISECONDS_PER_SECOND);
36
46
  if (typeof timer.unref === "function") {
37
47
  timer.unref();
38
48
  }
@@ -46,16 +56,20 @@ async function runScript(
46
56
  throw error;
47
57
  }
48
58
  }
49
- function isPortInUseError(errorMessage) {
50
- return /EADDRINUSE|address already in use|port already in use/iu.test(errorMessage);
59
+
60
+ function isPortInUseError(error: unknown): boolean {
61
+ return /EADDRINUSE|address already in use|port already in use/iu.test(String(error));
51
62
  }
52
63
 
53
- function backArgs(args, port) {
64
+ function backArgs(args: RunArgs, port: number): string[] {
54
65
  const { projectFolderPath } = args;
55
66
  if (!projectFolderPath) {
56
67
  throw new Error("projectFolderPath is required");
57
68
  }
58
- const uploadFolderPath = args.uploadFolderPath || path.join(projectFolderPath, "uploads");
69
+ const uploadFolderPath =
70
+ args.uploadFolderPath !== undefined && args.uploadFolderPath !== ""
71
+ ? args.uploadFolderPath
72
+ : path.join(projectFolderPath, "uploads");
59
73
  const executableArgs = [
60
74
  "--port",
61
75
  String(port),
@@ -68,14 +82,19 @@ function backArgs(args, port) {
68
82
  "--timeout",
69
83
  "0",
70
84
  ];
71
- if (process.env.NODE_ENV === "development" || !process.env.NODE_ENV) {
85
+ if (process.env.NODE_ENV === undefined || process.env.NODE_ENV === "development") {
72
86
  executableArgs.push("--debug");
73
87
  }
74
88
  return executableArgs;
75
89
  }
76
90
 
77
- async function runBack(execName, execPath, args = {}, attempts = 0) {
78
- let port = undefined;
91
+ async function runBack(
92
+ execName: string,
93
+ execPath: string,
94
+ args: RunArgs = DEFAULT_RUN_ARGS,
95
+ attempts = 0,
96
+ ): Promise<number> {
97
+ let port: number | undefined = undefined;
79
98
  try {
80
99
  port = await getAvailablePort();
81
100
  const executableArgs = backArgs(args, port);
@@ -93,14 +112,20 @@ async function runBack(execName, execPath, args = {}, attempts = 0) {
93
112
  return newPort;
94
113
  }
95
114
  }
115
+ throw new Error(`runBack failed to run ${execName}`);
96
116
  }
97
117
 
98
- async function runViewer(execName, execPath, args = {}, attempts = 0) {
118
+ async function runViewer(
119
+ execName: string,
120
+ execPath: string,
121
+ args: RunArgs = DEFAULT_RUN_ARGS,
122
+ attempts = 0,
123
+ ): Promise<number> {
99
124
  const { projectFolderPath } = args;
100
125
  if (!projectFolderPath) {
101
126
  throw new Error("projectFolderPath is required");
102
127
  }
103
- let port = undefined;
128
+ let port: number | undefined = undefined;
104
129
  try {
105
130
  port = await getAvailablePort();
106
131
  const viewerArgs = [
@@ -116,7 +141,7 @@ async function runViewer(execName, execPath, args = {}, attempts = 0) {
116
141
  return port;
117
142
  } catch (error) {
118
143
  if (!isPortInUseError(error)) {
119
- console.log("runBack error", error);
144
+ console.log("runViewer error", error);
120
145
  throw error;
121
146
  }
122
147
  if (attempts <= MAX_PORT_RETRIES) {
@@ -125,10 +150,17 @@ async function runViewer(execName, execPath, args = {}, attempts = 0) {
125
150
  return newPort;
126
151
  }
127
152
  }
153
+ throw new Error(`runViewer failed to run ${execName}`);
128
154
  }
129
155
 
130
- async function runExtension(extensionId, execName, execPath, args = {}, attempts = 0) {
131
- let port = undefined;
156
+ async function runExtension(
157
+ extensionId: string,
158
+ execName: string,
159
+ execPath: string,
160
+ args: RunArgs = DEFAULT_RUN_ARGS,
161
+ attempts = 0,
162
+ ): Promise<number> {
163
+ let port: number | undefined = undefined;
132
164
  try {
133
165
  port = await getAvailablePort();
134
166
  const executableArgs = backArgs(args, port);
@@ -139,7 +171,7 @@ async function runExtension(extensionId, execName, execPath, args = {}, attempts
139
171
  return port;
140
172
  } catch (error) {
141
173
  if (!isPortInUseError(error)) {
142
- console.log("runBack error", error);
174
+ console.log("runExtension error", error);
143
175
  throw error;
144
176
  }
145
177
  if (attempts <= MAX_PORT_RETRIES) {
@@ -148,18 +180,26 @@ async function runExtension(extensionId, execName, execPath, args = {}, attempts
148
180
  return newPort;
149
181
  }
150
182
  }
183
+ throw new Error(`runExtension failed to run ${extensionId}`);
151
184
  }
152
- function addMicroserviceMetadatas(projectFolderPath, serviceObj) {
185
+ function addMicroserviceMetadatas(projectFolderPath: string, serviceObj: Microservice): void {
153
186
  const microservices = projectMicroservices(projectFolderPath);
187
+ let enriched: Microservice = { ...serviceObj };
154
188
  if (serviceObj.type === "back") {
155
189
  const schema = back_schemas.opengeodeweb_back.kill;
156
- serviceObj.url = `http://localhost:${serviceObj.port}/${schema.$id}`;
157
190
  const [method] = schema.methods;
158
- serviceObj.method = method;
191
+ enriched = {
192
+ ...enriched,
193
+ url: `http://localhost:${serviceObj.port}/${schema.$id}`,
194
+ method,
195
+ };
159
196
  } else if (serviceObj.type === "viewer") {
160
- serviceObj.url = `ws://localhost:${serviceObj.port}/ws`;
197
+ enriched = {
198
+ ...enriched,
199
+ url: `ws://localhost:${serviceObj.port}/ws`,
200
+ };
161
201
  }
162
- microservices.push(serviceObj);
202
+ microservices.push(enriched);
163
203
  fs.writeFileSync(
164
204
  microservicesMetadatasPath(projectFolderPath),
165
205
  JSON.stringify(
@@ -171,4 +211,5 @@ function addMicroserviceMetadatas(projectFolderPath, serviceObj) {
171
211
  ),
172
212
  );
173
213
  }
214
+
174
215
  export { addMicroserviceMetadatas, runBack, runExtension, runViewer };
@@ -8,17 +8,21 @@ import { setTimeout } from "node:timers/promises";
8
8
  import { v4 as uuidv4 } from "uuid";
9
9
 
10
10
  // Local imports
11
- import { appMode } from "@geode/opengeodeweb-front/shared/app_mode.js";
12
- import { commandExistsSync } from "./scripts.js";
11
+ import { appMode } from "@geode/opengeodeweb-front/shared/app_mode.ts";
12
+ import { commandExistsSync } from "./scripts.ts";
13
13
 
14
- function executableName(execName) {
14
+ function executableName(execName: string): string {
15
15
  if (process.platform === "win32") {
16
16
  return `${execName}.exe`;
17
17
  }
18
18
  return execName;
19
19
  }
20
20
 
21
- function findExecutableInDir(baseDir, execName, osExecutableName) {
21
+ function findExecutableInDir(
22
+ baseDir: string,
23
+ execName: string,
24
+ osExecutableName: string,
25
+ ): string | undefined {
22
26
  const oneFilePath = path.join(baseDir, osExecutableName);
23
27
  if (fs.existsSync(oneFilePath) && fs.statSync(oneFilePath).isFile()) {
24
28
  console.log(`[executablePath] Found OneFile executable: ${oneFilePath}`);
@@ -35,7 +39,7 @@ function findExecutableInDir(baseDir, execName, osExecutableName) {
35
39
  return undefined;
36
40
  }
37
41
 
38
- function executablePath(execPath, execName) {
42
+ function executablePath(execPath: string, execName: string): string {
39
43
  const osExecutableName = executableName(execName);
40
44
  const resourcesPath = process.env.RESOURCES_PATH;
41
45
  const mode = process.env.MODE;
@@ -49,13 +53,15 @@ function executablePath(execPath, execName) {
49
53
  }
50
54
 
51
55
  const foundAtExecPath = findExecutableInDir(execPath, execName, osExecutableName);
52
- if (foundAtExecPath) {
56
+ if (foundAtExecPath !== undefined && foundAtExecPath !== "") {
53
57
  return foundAtExecPath;
54
58
  }
55
59
  if (mode === appMode.DESKTOP && nodeEnv === "production") {
56
- const foundInResources = findExecutableInDir(resourcesPath, execName, osExecutableName);
57
- if (foundInResources) {
58
- return foundInResources;
60
+ if (resourcesPath !== undefined && resourcesPath !== "") {
61
+ const foundInResources = findExecutableInDir(resourcesPath, execName, osExecutableName);
62
+ if (foundInResources !== undefined && foundInResources !== "") {
63
+ return foundInResources;
64
+ }
59
65
  }
60
66
  throw new Error(
61
67
  `Executable not found in execPath (${execPath}) or resourcesPath (${resourcesPath}): ${osExecutableName}`,
@@ -65,7 +71,7 @@ function executablePath(execPath, execName) {
65
71
  throw new Error(`Executable not found: ${osExecutableName}`);
66
72
  }
67
73
 
68
- function createPath(dirPath) {
74
+ function createPath(dirPath: string): string {
69
75
  if (!fs.existsSync(dirPath)) {
70
76
  fs.mkdirSync(dirPath, {
71
77
  recursive: true,
@@ -74,17 +80,21 @@ function createPath(dirPath) {
74
80
  }
75
81
  return dirPath;
76
82
  }
77
- function generateProjectFolderPath(projectName) {
83
+ function generateProjectFolderPath(projectName: string): string {
78
84
  return path.join(os.tmpdir(), projectName.replaceAll("/", "_"), uuidv4());
79
85
  }
80
- function extensionFolderPath(projectFolderPath, extensionId) {
86
+ function extensionFolderPath(projectFolderPath: string, extensionId: string): string {
81
87
  return path.join(projectFolderPath, "extensions", extensionId);
82
88
  }
83
- async function lookForLocalExtensionDistPath(rootPath, extentionRepoName, frontendFile) {
89
+ async function lookForLocalExtensionDistPath(
90
+ rootPath: string,
91
+ extentionRepoName: string,
92
+ frontendFile: string,
93
+ ): Promise<string | undefined> {
84
94
  const localExtensionPath = path.join(rootPath, "..", extentionRepoName);
85
95
  const localExtensionDistPath = path.join(localExtensionPath, "dist");
86
96
  if (!fs.existsSync(localExtensionDistPath)) {
87
- return;
97
+ return undefined;
88
98
  }
89
99
  console.log(
90
100
  `[extensionFrontendPath] Found existing folder: ${localExtensionDistPath}, deleting it...`,
@@ -107,8 +117,14 @@ async function lookForLocalExtensionDistPath(rootPath, extentionRepoName, fronte
107
117
  // oxlint-disable-next-line no-await-in-loop
108
118
  await setTimeout(MILLISECONDS_PER_RETRY);
109
119
  }
120
+ return undefined;
110
121
  }
111
- async function extensionFrontendPath(unzippedExtensionPath, frontendFile, rootPath, extensionId) {
122
+ async function extensionFrontendPath(
123
+ unzippedExtensionPath: string,
124
+ frontendFile: string,
125
+ rootPath: string,
126
+ extensionId: string,
127
+ ): Promise<string> {
112
128
  console.log("[extensionFrontendPath]", {
113
129
  unzippedExtensionPath,
114
130
  frontendFile,
@@ -124,7 +140,7 @@ async function extensionFrontendPath(unzippedExtensionPath, frontendFile, rootPa
124
140
  extentionRepoName,
125
141
  frontendFile,
126
142
  );
127
- if (localFilePath) {
143
+ if (localFilePath !== undefined && localFilePath !== "") {
128
144
  return localFilePath;
129
145
  }
130
146
  const unzippedfrontendFilePath = path.join(unzippedExtensionPath, frontendFile);
@@ -133,7 +149,10 @@ async function extensionFrontendPath(unzippedExtensionPath, frontendFile, rootPa
133
149
  }
134
150
  throw new Error(`Failed to find ${unzippedfrontendFilePath}`);
135
151
  }
136
- function extensionBackendPath(unzippedExtensionPath, backendExecutableName) {
152
+ function extensionBackendPath(
153
+ unzippedExtensionPath: string,
154
+ backendExecutableName: string,
155
+ ): string {
137
156
  const backendExecutablePath = path.join(
138
157
  unzippedExtensionPath,
139
158
  executableName(backendExecutableName),
@@ -1,4 +1,5 @@
1
1
  // Node imports
2
+ import type { Readable } from "node:stream";
2
3
  import child_process from "node:child_process";
3
4
  import fs from "node:fs";
4
5
  import { on } from "node:events";
@@ -9,32 +10,44 @@ import readline from "node:readline";
9
10
  import { getPort } from "get-port-please";
10
11
 
11
12
  // Local imports
12
- import { appMode } from "@geode/opengeodeweb-front/shared/app_mode.js";
13
- import { setAppBaseUrl } from "@geode/opengeodeweb-front/shared/scripts.js";
13
+ import { appMode } from "@geode/opengeodeweb-front/shared/app_mode.ts";
14
+ import { setAppBaseUrl } from "@geode/opengeodeweb-front/shared/scripts.ts";
14
15
 
15
16
  const BYTES_PER_KIBIBYTE = 1024;
16
17
  const MAX_ERROR_BUFFER_KIBIBYTES = 64;
17
18
  const MAX_ERROR_BUFFER_BYTES = MAX_ERROR_BUFFER_KIBIBYTES * BYTES_PER_KIBIBYTE;
18
- function getAvailablePort() {
19
- return getPort({
19
+
20
+ async function getAvailablePort(): Promise<number> {
21
+ const port = await getPort({
20
22
  host: "localhost",
21
23
  random: true,
22
24
  });
25
+ return port;
23
26
  }
24
- function commandExistsSync(execName) {
25
- const envPath = process.env.PATH || "";
27
+
28
+ function commandExistsSync(execName: string): boolean {
29
+ const envPath = process.env.PATH ?? "";
26
30
  return envPath.split(path.delimiter).some((directory) => {
27
31
  const filePath = path.join(directory, execName);
28
32
  return fs.existsSync(filePath) && fs.statSync(filePath).isFile();
29
33
  });
30
34
  }
35
+
31
36
  const encoder = new TextEncoder();
32
- function byteLength(str) {
37
+ function byteLength(str: string): number {
33
38
  return encoder.encode(str).byteLength;
34
39
  }
35
40
 
36
- // oxlint-disable-next-line max-lines-per-function
37
- function waitForReady(child, expectedResponse, signal) {
41
+ interface NamedChildProcess extends child_process.ChildProcessByStdio<null, Readable, Readable> {
42
+ name?: string;
43
+ }
44
+
45
+ // oxlint-disable-next-line max-lines-per-function typescript/prefer-readonly-parameter-types eslint/require-await
46
+ async function waitForReady(
47
+ child: NamedChildProcess,
48
+ expectedResponse: string,
49
+ signal?: AbortSignal,
50
+ ): Promise<NamedChildProcess> {
38
51
  // oxlint-disable-next-line promise/avoid-new
39
52
  return new Promise((resolve, reject) => {
40
53
  const readlineStdout = readline.createInterface({
@@ -44,7 +57,7 @@ function waitForReady(child, expectedResponse, signal) {
44
57
  input: child.stderr,
45
58
  });
46
59
  let recentOutput = "";
47
- function recordOutput(lineOutput) {
60
+ function recordOutput(lineOutput: string): void {
48
61
  const safeLine =
49
62
  byteLength(lineOutput) > MAX_ERROR_BUFFER_BYTES / 2
50
63
  ? `${lineOutput.slice(0, MAX_ERROR_BUFFER_BYTES / 2)}…[truncated]`
@@ -59,13 +72,13 @@ function waitForReady(child, expectedResponse, signal) {
59
72
  recentOutput = recentOutput.slice(newline + 1);
60
73
  }
61
74
  }
62
- let onLine = undefined;
63
- let onErrLine = undefined;
64
- let onError = undefined;
65
- let onClose = undefined;
66
- let onAbort = undefined;
75
+ let onLine: ((line: string) => void) | undefined = undefined;
76
+ let onErrLine: ((line: string) => void) | undefined = undefined;
77
+ let onError: ((err: Error) => void) | undefined = undefined;
78
+ let onClose: ((code: number | null) => void) | undefined = undefined;
79
+ let onAbort: (() => void) | undefined = undefined;
67
80
 
68
- function cleanup() {
81
+ function cleanup(): void {
69
82
  if (onLine) {
70
83
  readlineStdout.removeListener("line", onLine);
71
84
  }
@@ -83,7 +96,7 @@ function waitForReady(child, expectedResponse, signal) {
83
96
  }
84
97
  }
85
98
 
86
- function becomeReady() {
99
+ function becomeReady(): void {
87
100
  cleanup();
88
101
  readlineStdout.on("line", (line) => {
89
102
  console.log(`[${child.name}] ${line}`);
@@ -97,7 +110,7 @@ function waitForReady(child, expectedResponse, signal) {
97
110
  resolve(child);
98
111
  }
99
112
 
100
- onLine = (lineOutput) => {
113
+ onLine = (lineOutput): void => {
101
114
  console.log(`[${child.name}] ${lineOutput}`);
102
115
  recordOutput(lineOutput);
103
116
  if (lineOutput.includes(expectedResponse)) {
@@ -105,7 +118,7 @@ function waitForReady(child, expectedResponse, signal) {
105
118
  }
106
119
  };
107
120
 
108
- onErrLine = (line) => {
121
+ onErrLine = (line): void => {
109
122
  console.log(`[${child.name}] ${line}`);
110
123
  recordOutput(line);
111
124
  if (line.includes(expectedResponse)) {
@@ -113,12 +126,12 @@ function waitForReady(child, expectedResponse, signal) {
113
126
  }
114
127
  };
115
128
 
116
- onError = (err) => {
129
+ onError = (err): void => {
117
130
  cleanup();
118
131
  reject(err);
119
132
  };
120
133
 
121
- onClose = (code) => {
134
+ onClose = (code): void => {
122
135
  console.log(`[${child.name}] exited with code ${code}`);
123
136
  cleanup();
124
137
  reject(
@@ -128,7 +141,7 @@ function waitForReady(child, expectedResponse, signal) {
128
141
  );
129
142
  };
130
143
 
131
- onAbort = () => {
144
+ onAbort = (): void => {
132
145
  cleanup();
133
146
  reject(new Error(`[${child.name}] timed out waiting for "${expectedResponse}"`));
134
147
  };
@@ -143,36 +156,38 @@ function waitForReady(child, expectedResponse, signal) {
143
156
  }
144
157
  });
145
158
  }
146
- async function waitNuxt(nuxtProcess) {
147
- nuxtProcess.stderr.on("data", (data) => {
159
+ async function waitNuxt(
160
+ nuxtProcess: child_process.ChildProcessWithoutNullStreams,
161
+ ): Promise<string> {
162
+ nuxtProcess.stderr.on("data", (data: Buffer) => {
148
163
  console.log("Nuxt STDERR:", data.toString().trim());
149
164
  });
150
165
  nuxtProcess.on("close", (code) => {
151
166
  console.log(`Nuxt process closed with code ${code}`);
152
167
  });
153
168
  for await (const [data] of on(nuxtProcess.stdout, "data")) {
154
- const output = data.toString();
169
+ const output = String(data);
155
170
  console.log("Nuxt STDOUT:", output.trim());
156
- const portMatch = output.match(/Listening on http:\/\/\[::\]:(?<port>\d+)/u);
157
- if (portMatch) {
158
- console.log("Nuxt listening on port", portMatch.groups.port);
159
- nuxtProcess.stdout.on("data", (newData) => {
171
+ const portMatch = /Listening on http:\/\/\[::\]:(?<port>\d+)/u.exec(output);
172
+ const port = portMatch?.groups?.port;
173
+ if (port !== undefined) {
174
+ console.log("Nuxt listening on port", port);
175
+ nuxtProcess.stdout.on("data", (newData: Buffer) => {
160
176
  console.log("Nuxt STDOUT:", newData.toString().trim());
161
177
  });
162
- return portMatch.groups.port;
178
+ return port;
163
179
  }
164
180
  }
165
181
  throw new Error("Nuxt process closed");
166
182
  }
167
- async function runBrowser(scriptName) {
183
+ async function runBrowser(scriptName: string): Promise<number> {
168
184
  process.env.MODE = appMode.BROWSER;
169
185
  const port = await getAvailablePort();
170
186
  const nuxtProcess = child_process.spawn("npm", ["run", scriptName], {
171
187
  shell: true,
172
- FORCE_COLOR: true,
173
188
  env: {
174
189
  ...process.env,
175
- PORT: port,
190
+ PORT: String(port),
176
191
  },
177
192
  });
178
193
  await waitNuxt(nuxtProcess);
@@ -180,3 +195,4 @@ async function runBrowser(scriptName) {
180
195
  return port;
181
196
  }
182
197
  export { commandExistsSync, getAvailablePort, runBrowser, waitForReady };
198
+ export type { NamedChildProcess };
@@ -8,19 +8,23 @@ import { extract as extractTar } from "tar";
8
8
 
9
9
  const TAR_ARCHIVE_PATTERN = /\.(?<ext>tar\.gz|tgz|tar)$/u;
10
10
 
11
- async function extractZipArchive(zipFilePath, outputDir) {
11
+ async function extractZipArchive(zipFilePath: string, outputDir: string): Promise<void> {
12
12
  const data = await fs.promises.readFile(zipFilePath);
13
13
  const zip = await JSZip.loadAsync(data);
14
- const promises = [];
14
+ const promises: Promise<void>[] = [];
15
15
 
16
16
  for (const [relativePath, zipEntry] of Object.entries(zip.files)) {
17
17
  const outputPath = path.join(outputDir, relativePath);
18
18
 
19
19
  if (zipEntry.dir) {
20
- promises.push(fs.promises.mkdir(outputPath, { recursive: true }));
20
+ promises.push(
21
+ (async (): Promise<void> => {
22
+ await fs.promises.mkdir(outputPath, { recursive: true });
23
+ })(),
24
+ );
21
25
  } else {
22
26
  promises.push(
23
- (async () => {
27
+ (async (): Promise<void> => {
24
28
  const content = await zipEntry.async("nodebuffer");
25
29
  await fs.promises.mkdir(path.dirname(outputPath), {
26
30
  recursive: true,
@@ -34,11 +38,14 @@ async function extractZipArchive(zipFilePath, outputDir) {
34
38
  await Promise.all(promises);
35
39
  }
36
40
 
37
- async function extractTarArchive(archivePath, outputDir) {
41
+ async function extractTarArchive(archivePath: string, outputDir: string): Promise<void> {
38
42
  await extractTar({ file: archivePath, cwd: outputDir });
39
43
  }
40
44
 
41
- async function unzipFile(zipFilePath, outputDir = zipFilePath.replace(/\.[^/.]+$/u, "")) {
45
+ async function unzipFile(
46
+ zipFilePath: string,
47
+ outputDir: string = zipFilePath.replace(/\.[^/.]+$/u, ""),
48
+ ): Promise<string> {
42
49
  console.log("Unzipping file...", zipFilePath, outputDir);
43
50
  try {
44
51
  await fs.promises.mkdir(outputDir, { recursive: true });
@@ -0,0 +1,74 @@
1
+ import { type ServerWsRpcClient, createServerWsRpcClient } from "./ws_client.js";
2
+
3
+ const stringStorage = new Map<string, string>();
4
+ const booleanStorage = new Map<string, boolean>();
5
+ const clientStorage = new Map<string, ServerWsRpcClient>();
6
+
7
+ function getAppBaseUrl(): string {
8
+ const value = stringStorage.get("APP_BASE_URL");
9
+ if (value === undefined) {
10
+ throw new Error("APP_BASE_URL is not set");
11
+ }
12
+ return value;
13
+ }
14
+ function setAppBaseUrl(baseUrl: string): void {
15
+ stringStorage.set("APP_BASE_URL", baseUrl);
16
+ }
17
+ function getBackBaseUrl(): string {
18
+ const value = stringStorage.get("BACK_BASE_URL");
19
+ if (value === undefined) {
20
+ throw new Error("BACK_BASE_URL is not set");
21
+ }
22
+ return value;
23
+ }
24
+ function setBackBaseUrl(baseUrl: string): void {
25
+ stringStorage.set("BACK_BASE_URL", baseUrl);
26
+ }
27
+ function getViewerBaseUrl(): string {
28
+ const value = stringStorage.get("VIEWER_BASE_URL");
29
+ if (value === undefined) {
30
+ throw new Error("VIEWER_BASE_URL is not set");
31
+ }
32
+ return value;
33
+ }
34
+ function setViewerBaseUrl(baseUrl: string): void {
35
+ stringStorage.set("VIEWER_BASE_URL", baseUrl);
36
+ }
37
+ function getIsAppReady(): boolean {
38
+ return booleanStorage.get("IS_APP_READY") ?? false;
39
+ }
40
+ function setIsAppReady(isAppReady: boolean): void {
41
+ booleanStorage.set("IS_APP_READY", isAppReady);
42
+ }
43
+ async function setViewerWebSocketClient(baseUrl: string): Promise<ServerWsRpcClient> {
44
+ const client = createServerWsRpcClient(baseUrl);
45
+ client.onConnectionClose(() => {
46
+ if (clientStorage.get("VIEWER_CLIENT") === client) {
47
+ clientStorage.delete("VIEWER_CLIENT");
48
+ }
49
+ });
50
+ await client.ready;
51
+ clientStorage.set("VIEWER_CLIENT", client);
52
+ return client;
53
+ }
54
+ async function getViewerWebSocketClient(): Promise<ServerWsRpcClient> {
55
+ const viewerClient = clientStorage.get("VIEWER_CLIENT");
56
+ if (viewerClient !== undefined && viewerClient.isOpen()) {
57
+ return viewerClient;
58
+ }
59
+ const viewerBaseUrl = getViewerBaseUrl();
60
+ const client = await setViewerWebSocketClient(viewerBaseUrl);
61
+ return client;
62
+ }
63
+ export {
64
+ getAppBaseUrl,
65
+ getBackBaseUrl,
66
+ getIsAppReady,
67
+ getViewerBaseUrl,
68
+ getViewerWebSocketClient,
69
+ setAppBaseUrl,
70
+ setBackBaseUrl,
71
+ setIsAppReady,
72
+ setViewerBaseUrl,
73
+ setViewerWebSocketClient,
74
+ };
@@ -0,0 +1,6 @@
1
+ import type { ReadableStream as NodeReadableStream } from "node:stream/web";
2
+
3
+ export function toNodeWebStream(stream: ReadableStream): NodeReadableStream {
4
+ // oxlint-disable-next-line typescript/no-unsafe-type-assertion
5
+ return stream as NodeReadableStream;
6
+ }