@geode/opengeodeweb-front 10.33.4-rc.2 → 10.34.0-rc.10

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 (495) 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 +159 -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 +12 -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/css/main.css +24 -0
  25. package/app/assets/{geode_objects.js → geode_objects.ts} +8 -1
  26. package/app/components/ActionButton.vue +28 -12
  27. package/app/components/Basic/Slider.vue +2 -2
  28. package/app/components/Basic/Switch.vue +2 -2
  29. package/app/components/CameraManager/List.vue +11 -11
  30. package/app/components/CameraManager/Saver.vue +8 -4
  31. package/app/components/CameraManager.vue +24 -12
  32. package/app/components/CameraOrientation.vue +31 -17
  33. package/app/components/ClippingPlaneCard.vue +13 -12
  34. package/app/components/ClippingPlanes.vue +31 -21
  35. package/app/components/CrsSelector.vue +26 -18
  36. package/app/components/DeleteDialog.vue +18 -16
  37. package/app/components/DragAndDrop.vue +55 -37
  38. package/app/components/DragAndDropInternal/DragAndDropInline.vue +31 -16
  39. package/app/components/DragAndDropInternal/DragAndDropOverlay.vue +32 -19
  40. package/app/components/ExtensionSelector.vue +34 -18
  41. package/app/components/FeedBack/ErrorBanner.vue +4 -3
  42. package/app/components/FeedBack/Snackers.vue +4 -4
  43. package/app/components/FetchingData.vue +8 -12
  44. package/app/components/FileSelector.vue +27 -17
  45. package/app/components/FileUploader.vue +51 -30
  46. package/app/components/GlassCard.vue +17 -13
  47. package/app/components/HybridRenderingView.vue +25 -12
  48. package/app/components/HybridViewerTooltip.vue +28 -26
  49. package/app/components/InfraConnected.vue +1 -1
  50. package/app/components/Launcher.vue +12 -10
  51. package/app/components/Loading/EcoMessages.vue +24 -13
  52. package/app/components/Loading/Header.vue +6 -7
  53. package/app/components/Loading/Progress.vue +6 -7
  54. package/app/components/Loading.vue +10 -14
  55. package/app/components/MissingFilesSelector.vue +35 -19
  56. package/app/components/ObjectSelector.vue +37 -21
  57. package/app/components/PackagesVersions.vue +16 -8
  58. package/app/components/Recaptcha.vue +17 -23
  59. package/app/components/RemoteRenderingView.vue +21 -15
  60. package/app/components/Ruler.vue +11 -9
  61. package/app/components/Screenshot.vue +25 -19
  62. package/app/components/SearchBar.vue +12 -6
  63. package/app/components/ShrinkFilter.vue +19 -14
  64. package/app/components/Step.vue +32 -12
  65. package/app/components/Stepper.vue +19 -7
  66. package/app/components/ToolPanel.vue +29 -13
  67. package/app/components/ViewToolbar.vue +53 -44
  68. package/app/components/Viewer/ContextMenu/CenterButton.vue +16 -9
  69. package/app/components/Viewer/ContextMenu/CircularItems.vue +13 -10
  70. package/app/components/Viewer/ContextMenu/ContextMenu.vue +40 -32
  71. package/app/components/Viewer/ContextMenu/ContextMenuItem.vue +31 -17
  72. package/app/components/Viewer/ContextMenu/InfoCard.vue +36 -19
  73. package/app/components/Viewer/EdgedCurve/PointsOptions.vue +8 -5
  74. package/app/components/Viewer/EdgedCurve/SpecificEdgesOptions.vue +81 -42
  75. package/app/components/Viewer/Generic/Mesh/CellsOptions.vue +88 -44
  76. package/app/components/Viewer/Generic/Mesh/EdgesOptions.vue +83 -44
  77. package/app/components/Viewer/Generic/Mesh/PointsOptions.vue +54 -32
  78. package/app/components/Viewer/Generic/Mesh/PolygonsOptions.vue +105 -45
  79. package/app/components/Viewer/Generic/Mesh/PolyhedraOptions.vue +88 -43
  80. package/app/components/Viewer/Generic/Model/BlocksOptions.vue +151 -45
  81. package/app/components/Viewer/Generic/Model/CornersOptions.vue +93 -33
  82. package/app/components/Viewer/Generic/Model/EdgesOptions.vue +13 -9
  83. package/app/components/Viewer/Generic/Model/LinesOptions.vue +138 -53
  84. package/app/components/Viewer/Generic/Model/ModelStyleCard.vue +39 -28
  85. package/app/components/Viewer/Generic/Model/ModelStyleOptions.vue +9 -5
  86. package/app/components/Viewer/Generic/Model/PointsOptions.vue +19 -13
  87. package/app/components/Viewer/Generic/Model/SurfacesOptions.vue +159 -41
  88. package/app/components/Viewer/Grid/2D/CellsOptions.vue +8 -5
  89. package/app/components/Viewer/Grid/2D/EdgesOptions.vue +8 -5
  90. package/app/components/Viewer/Grid/2D/PointsOptions.vue +8 -5
  91. package/app/components/Viewer/Grid/3D/CellsOptions.vue +8 -5
  92. package/app/components/Viewer/Grid/3D/EdgesOptions.vue +8 -5
  93. package/app/components/Viewer/Grid/3D/FacetsOptions.vue +8 -5
  94. package/app/components/Viewer/Grid/3D/PointsOptions.vue +8 -5
  95. package/app/components/Viewer/ObjectTree/Base/CommonTreeView.vue +122 -76
  96. package/app/components/Viewer/ObjectTree/Base/Controls.vue +25 -10
  97. package/app/components/Viewer/ObjectTree/Base/ItemLabel.vue +38 -17
  98. package/app/components/Viewer/ObjectTree/Base/StickyHeader.vue +22 -9
  99. package/app/components/Viewer/ObjectTree/Base/TreeRow.vue +29 -14
  100. package/app/components/Viewer/ObjectTree/Box.vue +34 -15
  101. package/app/components/Viewer/ObjectTree/Layout.vue +56 -33
  102. package/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue +63 -34
  103. package/app/components/Viewer/ObjectTree/Views/ModelCollections.vue +81 -35
  104. package/app/components/Viewer/ObjectTree/Views/ModelComponents.vue +92 -39
  105. package/app/components/Viewer/Options/AttributeColorBar.vue +14 -6
  106. package/app/components/Viewer/Options/AttributeRangeSelector.vue +8 -4
  107. package/app/components/Viewer/Options/AttributeSelector.vue +115 -31
  108. package/app/components/Viewer/Options/ColorMapList.vue +52 -24
  109. package/app/components/Viewer/Options/ColorMapPicker.vue +15 -11
  110. package/app/components/Viewer/Options/ColorPicker.vue +23 -8
  111. package/app/components/Viewer/Options/ColoringTypeSelector.vue +92 -56
  112. package/app/components/Viewer/Options/ColormapQuickPicker.vue +16 -12
  113. package/app/components/Viewer/Options/OptionsSection.vue +7 -5
  114. package/app/components/Viewer/Options/Sliders/Size.vue +3 -3
  115. package/app/components/Viewer/Options/Sliders/Slider.vue +9 -6
  116. package/app/components/Viewer/Options/Sliders/Width.vue +3 -3
  117. package/app/components/Viewer/Options/TextureItem.vue +29 -22
  118. package/app/components/Viewer/Options/TexturesSelector.vue +23 -12
  119. package/app/components/Viewer/Options/VisibilitySwitch.vue +3 -3
  120. package/app/components/Viewer/OverlappingObjectsPicker.vue +27 -12
  121. package/app/components/Viewer/PointSet/SpecificPointsOptions.vue +45 -23
  122. package/app/components/Viewer/Solid/EdgesOptions.vue +8 -5
  123. package/app/components/Viewer/Solid/PointsOptions.vue +8 -5
  124. package/app/components/Viewer/Solid/PolygonsOptions.vue +8 -5
  125. package/app/components/Viewer/Solid/SpecificPolyhedraOptions.vue +87 -42
  126. package/app/components/Viewer/Surface/EdgesOptions.vue +8 -5
  127. package/app/components/Viewer/Surface/PointsOptions.vue +8 -5
  128. package/app/components/Viewer/Surface/PolygonsOptions.vue +93 -43
  129. package/app/components/Viewer/Surface/Triangulated/TrianglesOptions.vue +8 -5
  130. package/app/components/Viewer/TetrahedralSolid/TetrahedraOptions.vue +8 -5
  131. package/app/components/Viewer/TetrahedralSolid/TrianglesOptions.vue +8 -5
  132. package/app/components/Viewer/Ui.vue +19 -14
  133. package/app/components/Wrapper.vue +16 -10
  134. package/app/components/ZScaling.vue +18 -10
  135. package/app/components/csv-preview/CsvPreviewer.vue +53 -30
  136. package/app/components/csv-preview/CsvSettings.vue +30 -50
  137. package/app/components/csv-preview/CsvTable.vue +34 -14
  138. package/app/composables/{batch_style.js → batch_style.ts} +9 -7
  139. package/app/composables/clipping_planes_widget.ts +204 -0
  140. package/app/composables/clipping_planes_widget_entries.ts +191 -0
  141. package/app/composables/global_attribute_style.ts +303 -0
  142. package/app/composables/hover_highlight.ts +127 -0
  143. package/app/composables/{model_collections.js → model_collections.ts} +28 -9
  144. package/app/composables/{model_components.js → model_components.ts} +28 -9
  145. package/app/composables/{project_manager.js → project_manager.ts} +77 -20
  146. package/app/composables/responsive_middle_truncate.ts +48 -0
  147. package/app/composables/{run_function_when_microservices_connected.js → run_function_when_microservices_connected.ts} +1 -1
  148. package/app/composables/stepper_tree.ts +79 -0
  149. package/app/composables/tree_filter.ts +198 -0
  150. package/app/composables/{tree_keyboard_nav.js → tree_keyboard_nav.ts} +62 -19
  151. package/app/composables/{tree_scroll.js → tree_scroll.ts} +61 -12
  152. package/app/composables/use_adaptive_styles.ts +186 -0
  153. package/app/composables/use_overlapping_picker.ts +266 -0
  154. package/app/composables/use_quick_colormap.ts +55 -0
  155. package/app/composables/virtual_tree.ts +279 -0
  156. package/app/composables/vtk_implicit_plane_widget.d.ts +2 -0
  157. package/app/plugins/{auto_store_register.js → auto_store_register.ts} +3 -5
  158. package/app/stores/app.ts +257 -0
  159. package/app/stores/app_helpers/extension.ts +179 -0
  160. package/app/stores/{back.js → back.ts} +57 -28
  161. package/app/stores/camera_manager.ts +83 -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 +146 -0
  165. package/app/stores/data_helpers/mesh.ts +171 -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 +112 -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} +62 -36
  173. package/app/utils/attributes.ts +40 -0
  174. package/app/utils/clipping_planes.ts +227 -0
  175. package/app/utils/colormap.ts +102 -0
  176. package/app/utils/default_styles/{constants.js → constants.ts} +27 -11
  177. package/app/utils/default_styles/{index.js → index.ts} +5 -3
  178. package/app/utils/default_styles/meshes.ts +264 -0
  179. package/app/utils/default_styles/{models.js → models.ts} +106 -52
  180. package/app/utils/{extension.js → extension.ts} +86 -31
  181. package/app/utils/{import_workflow.js → import_workflow.ts} +43 -25
  182. package/app/utils/{log.js → log.ts} +12 -2
  183. package/app/utils/{name_cleaner.js → name_cleaner.ts} +6 -6
  184. package/app/utils/status.ts +19 -0
  185. package/app/utils/{stores.js → stores.ts} +5 -5
  186. package/app/utils/{string.js → string.ts} +6 -6
  187. package/app/utils/{treeview.js → treeview.ts} +4 -1
  188. package/internal/database/{base_database.js → base_database.ts} +7 -3
  189. package/internal/database/database.ts +102 -0
  190. package/internal/database/{extended_database.js → extended_database.ts} +5 -1
  191. package/internal/database/tables/camera_positions.ts +6 -0
  192. package/internal/database/tables/{data.js → data.ts} +3 -1
  193. package/internal/database/tables/data_style.ts +6 -0
  194. package/internal/database/tables/model_component_datastyle.ts +6 -0
  195. package/internal/database/tables/model_component_type_datastyle.ts +6 -0
  196. package/internal/database/tables/model_components.ts +6 -0
  197. package/internal/database/tables/model_components_relation.ts +6 -0
  198. package/internal/database/tables/table_definition.ts +5 -0
  199. package/internal/stores/data_style/mesh/cells/cell.ts +279 -0
  200. package/internal/stores/data_style/mesh/cells/{color.js → color.ts} +13 -7
  201. package/internal/stores/data_style/mesh/cells/common.ts +50 -0
  202. package/internal/stores/data_style/mesh/cells/index.ts +161 -0
  203. package/internal/stores/data_style/mesh/cells/{textures.js → textures.ts} +14 -8
  204. package/internal/stores/data_style/mesh/cells/vertex.ts +285 -0
  205. package/internal/stores/data_style/mesh/cells/visibility.ts +46 -0
  206. package/internal/stores/data_style/mesh/edges/{color.js → color.ts} +13 -7
  207. package/internal/stores/data_style/mesh/edges/common.ts +41 -0
  208. package/internal/stores/data_style/mesh/edges/edge.ts +279 -0
  209. package/internal/stores/data_style/mesh/edges/index.ts +155 -0
  210. package/internal/stores/data_style/mesh/edges/vertex.ts +285 -0
  211. package/internal/stores/data_style/mesh/edges/visibility.ts +45 -0
  212. package/internal/stores/data_style/mesh/edges/width.ts +42 -0
  213. package/internal/stores/data_style/mesh/{index.js → index.ts} +34 -14
  214. package/internal/stores/data_style/mesh/points/{color.js → color.ts} +13 -7
  215. package/internal/stores/data_style/mesh/points/common.ts +52 -0
  216. package/internal/stores/data_style/mesh/points/index.ts +133 -0
  217. package/internal/stores/data_style/mesh/points/size.ts +43 -0
  218. package/internal/stores/data_style/mesh/points/vertex.ts +285 -0
  219. package/internal/stores/data_style/mesh/points/visibility.ts +49 -0
  220. package/internal/stores/data_style/mesh/polygons/{color.js → color.ts} +13 -7
  221. package/internal/stores/data_style/mesh/polygons/common.ts +50 -0
  222. package/internal/stores/data_style/mesh/polygons/index.ts +167 -0
  223. package/internal/stores/data_style/mesh/polygons/polygon.ts +282 -0
  224. package/internal/stores/data_style/mesh/polygons/{textures.js → textures.ts} +14 -8
  225. package/internal/stores/data_style/mesh/polygons/vertex.ts +288 -0
  226. package/internal/stores/data_style/mesh/polygons/visibility.ts +48 -0
  227. package/internal/stores/data_style/mesh/polyhedra/{color.js → color.ts} +13 -7
  228. package/internal/stores/data_style/mesh/polyhedra/common.ts +41 -0
  229. package/internal/stores/data_style/mesh/polyhedra/index.ts +159 -0
  230. package/internal/stores/data_style/mesh/polyhedra/polyhedron.ts +294 -0
  231. package/internal/stores/data_style/mesh/polyhedra/vertex.ts +288 -0
  232. package/internal/stores/data_style/mesh/polyhedra/visibility.ts +48 -0
  233. package/internal/stores/data_style/model/blocks/{color.js → color.ts} +46 -12
  234. package/internal/stores/data_style/model/blocks/common.ts +67 -0
  235. package/internal/stores/data_style/model/blocks/{index.js → index.ts} +111 -66
  236. package/internal/stores/data_style/model/blocks/polyhedron.ts +362 -0
  237. package/internal/stores/data_style/model/blocks/vertex.ts +348 -0
  238. package/internal/stores/data_style/model/blocks/visibility.ts +37 -0
  239. package/internal/stores/data_style/model/color.ts +348 -0
  240. package/internal/stores/data_style/model/common.ts +262 -0
  241. package/internal/stores/data_style/model/corners/{color.js → color.ts} +45 -9
  242. package/internal/stores/data_style/model/corners/common.ts +71 -0
  243. package/internal/stores/data_style/model/corners/{index.js → index.ts} +86 -47
  244. package/internal/stores/data_style/model/corners/vertex.ts +314 -0
  245. package/internal/stores/data_style/model/corners/visibility.ts +39 -0
  246. package/internal/stores/data_style/model/edges/common.ts +29 -0
  247. package/internal/stores/data_style/model/edges/{index.js → index.ts} +2 -7
  248. package/internal/stores/data_style/model/edges/visibility.ts +55 -0
  249. package/internal/stores/data_style/model/{index.js → index.ts} +24 -11
  250. package/internal/stores/data_style/model/lines/{color.js → color.ts} +43 -9
  251. package/internal/stores/data_style/model/lines/common.ts +63 -0
  252. package/internal/stores/data_style/model/lines/edge.ts +342 -0
  253. package/internal/stores/data_style/model/lines/{index.js → index.ts} +108 -66
  254. package/internal/stores/data_style/model/lines/vertex.ts +343 -0
  255. package/internal/stores/data_style/model/lines/visibility.ts +37 -0
  256. package/internal/stores/data_style/model/points/common.ts +25 -0
  257. package/internal/stores/data_style/model/points/index.ts +35 -0
  258. package/internal/stores/data_style/model/points/size.ts +44 -0
  259. package/internal/stores/data_style/model/points/visibility.ts +46 -0
  260. package/internal/stores/data_style/model/selection.ts +138 -0
  261. package/internal/stores/data_style/model/surfaces/{color.js → color.ts} +43 -9
  262. package/internal/stores/data_style/model/surfaces/common.ts +69 -0
  263. package/internal/stores/data_style/model/surfaces/{index.js → index.ts} +113 -66
  264. package/internal/stores/data_style/model/surfaces/polygon.ts +346 -0
  265. package/internal/stores/data_style/model/surfaces/vertex.ts +350 -0
  266. package/internal/stores/data_style/model/surfaces/visibility.ts +37 -0
  267. package/internal/stores/data_style/model/{visibility.js → visibility.ts} +112 -32
  268. package/internal/stores/data_style/state.ts +284 -0
  269. package/internal/stores/data_style/types.ts +30 -0
  270. package/internal/stores/hybrid_viewer/brightness.ts +131 -0
  271. package/internal/stores/hybrid_viewer/camera.ts +318 -0
  272. package/internal/stores/hybrid_viewer/{camera_animation.js → camera_animation.ts} +30 -12
  273. package/internal/stores/hybrid_viewer/{constants.js → constants.ts} +2 -2
  274. package/internal/stores/hybrid_viewer/core.ts +64 -0
  275. package/internal/stores/hybrid_viewer/{filters.js → filters.ts} +11 -8
  276. package/internal/stores/hybrid_viewer/highlight.ts +183 -0
  277. package/internal/stores/hybrid_viewer/{ruler.js → ruler.ts} +50 -22
  278. package/internal/stores/hybrid_viewer/scene.ts +125 -0
  279. package/internal/stores/hybrid_viewer/viewport.ts +183 -0
  280. package/internal/stores/hybrid_viewer/vtk_types.ts +58 -0
  281. package/internal/utils/api_fetch.ts +127 -0
  282. package/internal/utils/upload_file.ts +101 -0
  283. package/internal/utils/viewer_call.ts +98 -0
  284. package/internal/utils/ws_client.ts +54 -0
  285. package/nuxt.config.ts +168 -0
  286. package/opengeodeweb_front_schemas.json +2 -2
  287. package/package.json +51 -15
  288. package/server/api/cloud/extensions/{run.post.js → run.post.ts} +16 -12
  289. package/server/api/local/app/project_folder_path.post.ts +33 -0
  290. package/server/api/local/app/run_back.post.ts +39 -0
  291. package/server/api/local/app/run_viewer.post.ts +39 -0
  292. package/server/api/local/extensions/{kill.post.js → kill.post.ts} +15 -8
  293. package/server/api/local/extensions/{run.post.js → run.post.ts} +17 -12
  294. package/server/api/local/extensions/{upload.put.js → upload.put.ts} +38 -12
  295. package/server/api/microservice/app/{get_is_app_ready.get.js → get_is_app_ready.get.ts} +5 -5
  296. package/server/api/microservice/app/schemas/get_is_app_ready.json +1 -1
  297. package/server/api/microservice/app/set_app_base_url.post.ts +29 -0
  298. package/server/api/microservice/app/set_back_base_url.post.ts +26 -0
  299. package/server/api/microservice/app/set_is_app_ready.post.ts +29 -0
  300. package/server/api/microservice/app/set_viewer_base_url.post.ts +26 -0
  301. package/server/api/microservice/extensions/{download.post.js → download.post.ts} +13 -6
  302. package/server/api/serverless/run_cloud.post.ts +92 -0
  303. package/server/utils/{app_config.js → app_config.ts} +43 -18
  304. package/server/utils/{cleanup.js → cleanup.ts} +80 -29
  305. package/server/utils/{cloud.js → cloud.ts} +34 -17
  306. package/server/utils/{extension.js → extension.ts} +31 -4
  307. package/server/utils/{microservices.js → microservices.ts} +75 -27
  308. package/server/utils/{path.js → path.ts} +44 -22
  309. package/server/utils/{scripts.js → scripts.ts} +49 -33
  310. package/server/utils/{server.js → server.ts} +13 -6
  311. package/server/utils/server_config.ts +74 -0
  312. package/server/utils/stream.ts +6 -0
  313. package/server/utils/ws_client.ts +169 -0
  314. package/shared/{scripts.js → scripts.ts} +15 -10
  315. package/shared/utils/call_raw.ts +84 -0
  316. package/shared/utils/{call_schema.js → call_schema.ts} +15 -6
  317. package/shared/utils/fetch_raw.ts +125 -0
  318. package/shared/utils/{fetch_schema.js → fetch_schema.ts} +23 -7
  319. package/shared/utils/{file.js → file.ts} +2 -2
  320. package/shared/utils/{parse_boolean.js → parse_boolean.ts} +1 -1
  321. package/shared/utils/response_handlers/load.ts +109 -0
  322. package/shared/utils/types.ts +27 -0
  323. package/shared/utils/{validate_schema.js → validate_schema.ts} +6 -1
  324. package/.github/workflows/config.json +0 -5
  325. package/.github/workflows/deploy.yml +0 -15
  326. package/.github/workflows/manual_release.yml +0 -11
  327. package/.github/workflows/merge_request.yml +0 -9
  328. package/.github/workflows/pr_update.yml +0 -11
  329. package/.github/workflows/prepare_deploy.yml +0 -9
  330. package/.github/workflows/schedule.yml +0 -18
  331. package/.github/workflows/test.yml +0 -14
  332. package/.github/workflows/test_pr.yml +0 -12
  333. package/.oxlintrc.json +0 -150
  334. package/.releaserc +0 -11
  335. package/app/composables/clipping_planes_widget.js +0 -253
  336. package/app/composables/global_attribute_style.js +0 -181
  337. package/app/composables/hover_highlight.js +0 -91
  338. package/app/composables/responsive_middle_truncate.js +0 -34
  339. package/app/composables/stepper_tree.js +0 -56
  340. package/app/composables/tree_filter.js +0 -138
  341. package/app/composables/use_adaptive_styles.js +0 -120
  342. package/app/composables/use_overlapping_picker.js +0 -169
  343. package/app/composables/use_quick_colormap.js +0 -32
  344. package/app/composables/virtual_tree.js +0 -191
  345. package/app/stores/app.js +0 -326
  346. package/app/stores/camera_manager.js +0 -57
  347. package/app/stores/data.js +0 -273
  348. package/app/stores/data_helpers/collections.js +0 -96
  349. package/app/stores/data_helpers/mesh.js +0 -122
  350. package/app/stores/data_style.js +0 -116
  351. package/app/stores/infra.js +0 -95
  352. package/app/stores/treeview.js +0 -290
  353. package/app/utils/attributes.js +0 -23
  354. package/app/utils/clipping_planes.js +0 -110
  355. package/app/utils/colormap.js +0 -64
  356. package/app/utils/default_styles/meshes.js +0 -191
  357. package/app/utils/status.js +0 -10
  358. package/commitlint.config.js +0 -20
  359. package/internal/database/database.js +0 -79
  360. package/internal/database/tables/camera_positions.js +0 -4
  361. package/internal/database/tables/data_style.js +0 -4
  362. package/internal/database/tables/model_component_datastyle.js +0 -4
  363. package/internal/database/tables/model_component_type_datastyle.js +0 -4
  364. package/internal/database/tables/model_components.js +0 -4
  365. package/internal/database/tables/model_components_relation.js +0 -4
  366. package/internal/stores/data_style/mesh/cells/cell.js +0 -166
  367. package/internal/stores/data_style/mesh/cells/common.js +0 -39
  368. package/internal/stores/data_style/mesh/cells/index.js +0 -81
  369. package/internal/stores/data_style/mesh/cells/vertex.js +0 -167
  370. package/internal/stores/data_style/mesh/cells/visibility.js +0 -35
  371. package/internal/stores/data_style/mesh/edges/common.js +0 -32
  372. package/internal/stores/data_style/mesh/edges/edge.js +0 -169
  373. package/internal/stores/data_style/mesh/edges/index.js +0 -81
  374. package/internal/stores/data_style/mesh/edges/vertex.js +0 -170
  375. package/internal/stores/data_style/mesh/edges/visibility.js +0 -34
  376. package/internal/stores/data_style/mesh/edges/width.js +0 -34
  377. package/internal/stores/data_style/mesh/points/common.js +0 -37
  378. package/internal/stores/data_style/mesh/points/index.js +0 -82
  379. package/internal/stores/data_style/mesh/points/size.js +0 -35
  380. package/internal/stores/data_style/mesh/points/vertex.js +0 -167
  381. package/internal/stores/data_style/mesh/points/visibility.js +0 -37
  382. package/internal/stores/data_style/mesh/polygons/common.js +0 -32
  383. package/internal/stores/data_style/mesh/polygons/index.js +0 -107
  384. package/internal/stores/data_style/mesh/polygons/polygon.js +0 -170
  385. package/internal/stores/data_style/mesh/polygons/vertex.js +0 -170
  386. package/internal/stores/data_style/mesh/polygons/visibility.js +0 -38
  387. package/internal/stores/data_style/mesh/polyhedra/common.js +0 -32
  388. package/internal/stores/data_style/mesh/polyhedra/index.js +0 -98
  389. package/internal/stores/data_style/mesh/polyhedra/polyhedron.js +0 -170
  390. package/internal/stores/data_style/mesh/polyhedra/vertex.js +0 -170
  391. package/internal/stores/data_style/mesh/polyhedra/visibility.js +0 -38
  392. package/internal/stores/data_style/model/blocks/common.js +0 -51
  393. package/internal/stores/data_style/model/blocks/polyhedron.js +0 -187
  394. package/internal/stores/data_style/model/blocks/vertex.js +0 -181
  395. package/internal/stores/data_style/model/blocks/visibility.js +0 -20
  396. package/internal/stores/data_style/model/color.js +0 -218
  397. package/internal/stores/data_style/model/common.js +0 -141
  398. package/internal/stores/data_style/model/corners/common.js +0 -51
  399. package/internal/stores/data_style/model/corners/vertex.js +0 -181
  400. package/internal/stores/data_style/model/corners/visibility.js +0 -20
  401. package/internal/stores/data_style/model/edges/common.js +0 -20
  402. package/internal/stores/data_style/model/edges/visibility.js +0 -38
  403. package/internal/stores/data_style/model/lines/common.js +0 -51
  404. package/internal/stores/data_style/model/lines/edge.js +0 -180
  405. package/internal/stores/data_style/model/lines/vertex.js +0 -181
  406. package/internal/stores/data_style/model/lines/visibility.js +0 -20
  407. package/internal/stores/data_style/model/points/common.js +0 -20
  408. package/internal/stores/data_style/model/points/index.js +0 -25
  409. package/internal/stores/data_style/model/points/size.js +0 -36
  410. package/internal/stores/data_style/model/points/visibility.js +0 -36
  411. package/internal/stores/data_style/model/selection.js +0 -89
  412. package/internal/stores/data_style/model/surfaces/common.js +0 -51
  413. package/internal/stores/data_style/model/surfaces/polygon.js +0 -187
  414. package/internal/stores/data_style/model/surfaces/vertex.js +0 -187
  415. package/internal/stores/data_style/model/surfaces/visibility.js +0 -20
  416. package/internal/stores/data_style/state.js +0 -197
  417. package/internal/stores/hybrid_viewer/brightness.js +0 -82
  418. package/internal/stores/hybrid_viewer/camera.js +0 -273
  419. package/internal/stores/hybrid_viewer/highlight.js +0 -165
  420. package/internal/stores/hybrid_viewer/scene.js +0 -136
  421. package/internal/stores/hybrid_viewer/viewport.js +0 -138
  422. package/internal/utils/api_fetch.js +0 -52
  423. package/internal/utils/upload_file.js +0 -57
  424. package/internal/utils/viewer_call.js +0 -49
  425. package/internal/utils/ws_client.js +0 -29
  426. package/nuxt.config.js +0 -98
  427. package/scripts/generate_geode_objects.js +0 -24
  428. package/server/api/local/app/project_folder_path.post.js +0 -29
  429. package/server/api/local/app/run_back.post.js +0 -33
  430. package/server/api/local/app/run_viewer.post.js +0 -33
  431. package/server/api/microservice/app/set_app_base_url.post.js +0 -25
  432. package/server/api/microservice/app/set_back_base_url.post.js +0 -22
  433. package/server/api/microservice/app/set_is_app_ready.post.js +0 -25
  434. package/server/api/microservice/app/set_viewer_base_url.post.js +0 -22
  435. package/server/api/serverless/run_cloud.post.js +0 -44
  436. package/server/utils/server_config.js +0 -58
  437. package/server/utils/ws_client.js +0 -112
  438. package/shared/utils/call_raw.js +0 -46
  439. package/shared/utils/fetch_raw.js +0 -61
  440. package/shared/utils/response_handlers/load.js +0 -74
  441. package/tests/integration/data/uploads/test.og_brep +0 -0
  442. package/tests/integration/data/uploads/test.og_edc2d +0 -0
  443. package/tests/integration/data/uploads/test.og_edc3d +0 -0
  444. package/tests/integration/data/uploads/test.og_psf3d +0 -0
  445. package/tests/integration/data/uploads/test.og_rgd2d +0 -0
  446. package/tests/integration/data/uploads/test.og_rgd3d +0 -0
  447. package/tests/integration/data/uploads/test.vtu +0 -22
  448. package/tests/integration/setup.js +0 -92
  449. package/tests/integration/stores/data_style/mesh/cells.nuxt.test.js +0 -341
  450. package/tests/integration/stores/data_style/mesh/edges.nuxt.test.js +0 -251
  451. package/tests/integration/stores/data_style/mesh/index.nuxt.test.js +0 -62
  452. package/tests/integration/stores/data_style/mesh/points.nuxt.test.js +0 -199
  453. package/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js +0 -257
  454. package/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js +0 -264
  455. package/tests/integration/stores/data_style/model/blocks.nuxt.test.js +0 -394
  456. package/tests/integration/stores/data_style/model/corners.nuxt.test.js +0 -262
  457. package/tests/integration/stores/data_style/model/edges.nuxt.test.js +0 -71
  458. package/tests/integration/stores/data_style/model/index.nuxt.test.js +0 -92
  459. package/tests/integration/stores/data_style/model/lines.nuxt.test.js +0 -376
  460. package/tests/integration/stores/data_style/model/points.nuxt.test.js +0 -95
  461. package/tests/integration/stores/data_style/model/surfaces.nuxt.test.js +0 -571
  462. package/tests/integration/stores/viewer.nuxt.test.js +0 -69
  463. package/tests/setup_indexeddb.js +0 -4
  464. package/tests/unit/components/CrsSelector.nuxt.test.js +0 -55
  465. package/tests/unit/components/DragAndDrop.nuxt.test.js +0 -89
  466. package/tests/unit/components/ExtensionSelector.nuxt.test.js +0 -65
  467. package/tests/unit/components/FeedBack/ErrorsBanner.nuxt.test.js +0 -41
  468. package/tests/unit/components/FeedBack/Snackers.nuxt.test.js +0 -49
  469. package/tests/unit/components/FileSelector.nuxt.test.js +0 -124
  470. package/tests/unit/components/FileUploader.nuxt.test.js +0 -69
  471. package/tests/unit/components/MissingFilesSelector.nuxt.test.js +0 -77
  472. package/tests/unit/components/ObjectSelector.nuxt.test.js +0 -118
  473. package/tests/unit/components/PackagesVersions.nuxt.test.js +0 -42
  474. package/tests/unit/components/Step.nuxt.test.js +0 -42
  475. package/tests/unit/components/Stepper.nuxt.test.js +0 -41
  476. package/tests/unit/components/ToolPanel.nuxt.test.js +0 -66
  477. package/tests/unit/composables/api_fetch.nuxt.test.js +0 -75
  478. package/tests/unit/composables/project_manager.nuxt.test.js +0 -299
  479. package/tests/unit/composables/run_function_when_microservices_connected.nuxt.test.js +0 -57
  480. package/tests/unit/composables/upload_file.nuxt.test.js +0 -45
  481. package/tests/unit/composables/virtual_tree.nuxt.test.js +0 -63
  482. package/tests/unit/plugins/project_load.nuxt.test.js +0 -98
  483. package/tests/unit/stores/app.nuxt.test.js +0 -189
  484. package/tests/unit/stores/back.nuxt.test.js +0 -147
  485. package/tests/unit/stores/cloud.nuxt.test.js +0 -90
  486. package/tests/unit/stores/data.nuxt.test.js +0 -162
  487. package/tests/unit/stores/feedback.nuxt.test.js +0 -90
  488. package/tests/unit/stores/infra.nuxt.test.js +0 -313
  489. package/tests/unit/stores/treeview.nuxt.test.js +0 -63
  490. package/tests/unit/stores/viewer.nuxt.test.js +0 -161
  491. package/tests/unit/utils/validate_schema.nuxt.test.js +0 -38
  492. package/tests/utils.js +0 -20
  493. package/tests/vitest.config.js +0 -67
  494. /package/server/api/local/app/{kill.post.js → kill.post.ts} +0 -0
  495. /package/shared/{app_mode.js → app_mode.ts} +0 -0
@@ -0,0 +1,175 @@
1
+ //#region opengeodeweb_front_schemas.json
2
+ var api = {
3
+ "cloud": { "extensions": { "run": {
4
+ "$id": "api/cloud/extensions/run",
5
+ "route": "/run",
6
+ "methods": ["POST"],
7
+ "type": "object",
8
+ "properties": {
9
+ "projectFolderPath": { "type": "string" },
10
+ "projectName": { "type": "string" }
11
+ },
12
+ "required": ["projectFolderPath", "projectName"],
13
+ "additionalProperties": false
14
+ } } },
15
+ "local": {
16
+ "app": {
17
+ "run_viewer": {
18
+ "$id": "api/local/app/run_viewer",
19
+ "route": "/run_viewer",
20
+ "methods": ["POST"],
21
+ "type": "object",
22
+ "properties": {
23
+ "COMMAND_VIEWER": { "type": "string" },
24
+ "NUXT_ROOT_PATH": { "type": "string" }
25
+ },
26
+ "required": ["COMMAND_VIEWER", "NUXT_ROOT_PATH"],
27
+ "additionalProperties": true
28
+ },
29
+ "run_back": {
30
+ "$id": "api/local/app/run_back",
31
+ "route": "/run_back",
32
+ "methods": ["POST"],
33
+ "type": "object",
34
+ "properties": {
35
+ "COMMAND_BACK": { "type": "string" },
36
+ "NUXT_ROOT_PATH": { "type": "string" }
37
+ },
38
+ "required": ["COMMAND_BACK", "NUXT_ROOT_PATH"],
39
+ "additionalProperties": true
40
+ },
41
+ "project_folder_path": {
42
+ "$id": "api/local/app/project_folder_path",
43
+ "route": "/project_folder_path",
44
+ "methods": ["POST"],
45
+ "type": "object",
46
+ "properties": { "PROJECT": { "type": "string" } },
47
+ "required": ["PROJECT"],
48
+ "additionalProperties": true
49
+ },
50
+ "kill": {
51
+ "$id": "api/local/app/kill",
52
+ "route": "/kill",
53
+ "methods": ["POST"],
54
+ "type": "object",
55
+ "properties": {},
56
+ "required": [],
57
+ "additionalProperties": false
58
+ }
59
+ },
60
+ "extensions": {
61
+ "upload": {
62
+ "$id": "api/local/extensions/upload",
63
+ "route": "/upload",
64
+ "methods": ["OPTIONS", "PUT"],
65
+ "type": "object",
66
+ "properties": { "filename": {
67
+ "type": "string",
68
+ "minLength": 1
69
+ } },
70
+ "additionalProperties": false
71
+ },
72
+ "run": {
73
+ "$id": "api/local/extensions/run",
74
+ "route": "/run",
75
+ "methods": ["POST"],
76
+ "type": "object",
77
+ "properties": {
78
+ "projectFolderPath": { "type": "string" },
79
+ "projectName": { "type": "string" }
80
+ },
81
+ "required": ["projectFolderPath", "projectName"],
82
+ "additionalProperties": false
83
+ },
84
+ "kill": {
85
+ "$id": "api/local/extensions/kill",
86
+ "route": "/kill",
87
+ "methods": ["POST"],
88
+ "type": "object",
89
+ "properties": {
90
+ "extensionId": { "type": "string" },
91
+ "projectFolderPath": { "type": "string" },
92
+ "projectName": { "type": "string" }
93
+ },
94
+ "required": [
95
+ "extensionId",
96
+ "projectFolderPath",
97
+ "projectName"
98
+ ],
99
+ "additionalProperties": false
100
+ }
101
+ }
102
+ },
103
+ "microservice": {
104
+ "app": {
105
+ "set_viewer_base_url": {
106
+ "$id": "api/microservice/app/set_viewer_base_url",
107
+ "route": "/set_viewer_base_url",
108
+ "methods": ["POST"],
109
+ "type": "object",
110
+ "properties": { "baseUrl": { "type": "string" } },
111
+ "required": ["baseUrl"],
112
+ "additionalProperties": false
113
+ },
114
+ "set_is_app_ready": {
115
+ "$id": "api/microservice/app/set_is_app_ready",
116
+ "route": "/set_is_app_ready",
117
+ "methods": ["POST"],
118
+ "type": "object",
119
+ "properties": { "isReady": { "type": "boolean" } },
120
+ "required": ["isReady"],
121
+ "additionalProperties": false
122
+ },
123
+ "set_back_base_url": {
124
+ "$id": "api/microservice/app/set_back_base_url",
125
+ "route": "/set_back_base_url",
126
+ "methods": ["POST"],
127
+ "type": "object",
128
+ "properties": { "baseUrl": { "type": "string" } },
129
+ "required": ["baseUrl"],
130
+ "additionalProperties": false
131
+ },
132
+ "set_app_base_url": {
133
+ "$id": "api/microservice/app/set_app_base_url",
134
+ "route": "/set_app_base_url",
135
+ "methods": ["POST"],
136
+ "type": "object",
137
+ "properties": { "baseUrl": { "type": "string" } },
138
+ "required": ["baseUrl"],
139
+ "additionalProperties": false
140
+ },
141
+ "get_is_app_ready": {
142
+ "$id": "api/microservice/app/get_is_app_ready",
143
+ "route": "/get_is_app_ready",
144
+ "methods": ["GET"],
145
+ "type": "object",
146
+ "properties": {},
147
+ "required": [],
148
+ "additionalProperties": false
149
+ }
150
+ },
151
+ "extensions": { "download": {
152
+ "$id": "api/microservice/extensions/download",
153
+ "route": "/download",
154
+ "methods": ["POST"],
155
+ "type": "object",
156
+ "properties": {
157
+ "extension": { "type": "string" },
158
+ "platform": { "type": "string" }
159
+ },
160
+ "required": ["extension", "platform"],
161
+ "additionalProperties": false
162
+ } }
163
+ },
164
+ "serverless": { "run_cloud": {
165
+ "$id": "api/serverless/run_cloud",
166
+ "route": "/run_cloud",
167
+ "methods": ["POST"],
168
+ "type": "object",
169
+ "properties": { "email": { "type": "string" } },
170
+ "required": ["email"],
171
+ "additionalProperties": false
172
+ } }
173
+ };
174
+ //#endregion
175
+ export { api };
@@ -0,0 +1,57 @@
1
+ import path from "node:path";
2
+ import { unlink } from "node:fs/promises";
3
+ import Conf from "conf";
4
+ import StreamZip from "node-stream-zip";
5
+ import sanitize from "sanitize-filename";
6
+ //#region server/utils/app_config.ts
7
+ function projectConf(projectName) {
8
+ const projectConfig = new Conf({ projectName });
9
+ console.log(projectConf.name, { projectConfig });
10
+ return projectConfig;
11
+ }
12
+ function confFolderPath(projectName) {
13
+ const projectConfig = projectConf(projectName);
14
+ return path.dirname(projectConfig.path);
15
+ }
16
+ function targetExtensionFilePath(projectName, filename) {
17
+ const safeFilename = sanitize(filename);
18
+ return path.join(confFolderPath(projectName), safeFilename);
19
+ }
20
+ function extensionsConf(projectName) {
21
+ const projectConfig = projectConf(projectName);
22
+ if (!projectConfig.has("extensions")) projectConfig.set("extensions", {});
23
+ return projectConfig.get("extensions");
24
+ }
25
+ function addExtensionToConf(projectName, { extensionId, extensionPath }) {
26
+ projectConf(projectName).set(`extensions.${extensionId}.path`, extensionPath);
27
+ }
28
+ function extensionPathFromConf(projectName, extensionId) {
29
+ return projectConf(projectName).get(`extensions.${extensionId}.path`);
30
+ }
31
+ async function removeExtensionFromConf(projectName, extensionId) {
32
+ const projectConfig = projectConf(projectName);
33
+ const extensionArchivePath = extensionPathFromConf(projectName, extensionId);
34
+ await unlink(extensionArchivePath);
35
+ console.log(`${extensionArchivePath} was deleted`);
36
+ projectConfig.delete(`extensions.${extensionId}`);
37
+ console.log(`${extensionId} was deleted from ${projectName} config`);
38
+ }
39
+ function isExtensionMetadata(value) {
40
+ return typeof value === "object" && value !== null && "id" in value && typeof value.id === "string";
41
+ }
42
+ async function registerExtensionFile(projectName, file) {
43
+ const StreamZipAsync = StreamZip.async;
44
+ const metadataJson = await new StreamZipAsync({
45
+ file,
46
+ storeEntries: true
47
+ }).entryData("metadata.json");
48
+ const parsedMetadata = JSON.parse(metadataJson.toString("utf8"));
49
+ if (!isExtensionMetadata(parsedMetadata)) throw new TypeError("metadata.json does not match the expected ExtensionMetadata shape");
50
+ const { id } = parsedMetadata;
51
+ addExtensionToConf(projectName, {
52
+ extensionId: id,
53
+ extensionPath: file
54
+ });
55
+ }
56
+ //#endregion
57
+ export { addExtensionToConf, confFolderPath, extensionPathFromConf, extensionsConf, projectConf, registerExtensionFile, removeExtensionFromConf, targetExtensionFilePath };
@@ -0,0 +1,135 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs";
3
+ import { setTimeout } from "node:timers/promises";
4
+ import { WebSocket } from "ws";
5
+ import pTimeout from "p-timeout";
6
+ import { rimraf } from "rimraf";
7
+ //#region server/utils/cleanup.ts
8
+ const MAX_DELETE_FOLDER_RETRIES = 5;
9
+ async function deleteFolderRecursive(folderPath) {
10
+ if (!fs.existsSync(folderPath)) {
11
+ console.log(`Folder ${folderPath} does not exist.`);
12
+ return;
13
+ }
14
+ for (let i = 0; i <= MAX_DELETE_FOLDER_RETRIES; i += 1) try {
15
+ console.log(`Deleting folder: ${folderPath}`);
16
+ await rimraf(folderPath);
17
+ console.log(`Deleted folder: ${folderPath}`);
18
+ return;
19
+ } catch (error) {
20
+ console.error(`Error deleting folder ${folderPath}:`, error);
21
+ const DELAY = 1e3 * (i + 1);
22
+ await setTimeout(DELAY);
23
+ console.log("Retrying delete folder");
24
+ }
25
+ throw new Error(`Failed to delete folder ${folderPath} after ${MAX_DELETE_FOLDER_RETRIES} retries`);
26
+ }
27
+ function isErrorWithMessage(error) {
28
+ return typeof error === "object" && error !== null && "message" in error && typeof error.message === "string";
29
+ }
30
+ async function killHttpMicroservice(microservice) {
31
+ console.log("killHttpMicroservice", { ...microservice });
32
+ const failMessage = `Failed to kill ${microservice.name}`;
33
+ async function do_kill() {
34
+ if (microservice.url === void 0) return;
35
+ try {
36
+ await fetch(microservice.url, { method: microservice.method });
37
+ } catch (error) {
38
+ const message = isErrorWithMessage(error) ? error.message : String(error);
39
+ console.log(`Expected error during kill of ${microservice.name}:`, message);
40
+ }
41
+ }
42
+ await pTimeout(do_kill(), {
43
+ milliseconds: 5e3,
44
+ message: failMessage
45
+ });
46
+ }
47
+ async function killWebsocketMicroservice(microservice) {
48
+ console.log("killWebsocketMicroservice", { ...microservice });
49
+ const failMessage = `Failed to kill ${microservice.name}`;
50
+ const successMessage = `Disconnected from ${microservice.name} WebSocket server`;
51
+ async function do_kill() {
52
+ if (microservice.url === void 0) return;
53
+ const socketUrl = microservice.url;
54
+ await new Promise((resolve) => {
55
+ const socket = new WebSocket(socketUrl);
56
+ socket.on("open", () => {
57
+ console.log("Connected to WebSocket server");
58
+ socket.send(JSON.stringify({
59
+ id: "system:hello",
60
+ method: "wslink.hello",
61
+ args: [{ secret: "wslink-secret" }]
62
+ }));
63
+ });
64
+ socket.on("message", (data) => {
65
+ const message = data.toString();
66
+ console.log("Received from server:", message);
67
+ if (message.includes("hello")) {
68
+ socket.send(JSON.stringify({
69
+ id: "application.exit",
70
+ method: "application.exit"
71
+ }));
72
+ console.log(successMessage);
73
+ socket.close();
74
+ resolve();
75
+ }
76
+ });
77
+ socket.on("close", () => {
78
+ console.log(successMessage);
79
+ resolve();
80
+ });
81
+ socket.on("error", (error) => {
82
+ console.error("WebSocket error:", error);
83
+ socket.close();
84
+ resolve();
85
+ });
86
+ });
87
+ }
88
+ await pTimeout(do_kill(), {
89
+ milliseconds: 5e3,
90
+ message: failMessage
91
+ });
92
+ }
93
+ async function killMicroservice(microservice) {
94
+ if (microservice.type === "back") await killHttpMicroservice(microservice);
95
+ else if (microservice.type === "viewer") await killWebsocketMicroservice(microservice);
96
+ else {
97
+ const exhaustiveCheck = microservice.type;
98
+ throw new Error(`Unknown microservice type: ${String(exhaustiveCheck)}`);
99
+ }
100
+ }
101
+ async function killMicroservices(microservices) {
102
+ console.log("killMicroservices", { microservices });
103
+ const results = await Promise.allSettled(microservices.map(async (microservice) => {
104
+ await killMicroservice(microservice);
105
+ }));
106
+ return microservices.filter((_, index) => results[index]?.status !== "fulfilled");
107
+ }
108
+ function microservicesMetadatasPath(projectFolderPath) {
109
+ return path.join(projectFolderPath, "microservices.json");
110
+ }
111
+ function isMicroservicesMetadatas(value) {
112
+ return typeof value === "object" && value !== null && Array.isArray(value.microservices);
113
+ }
114
+ function projectMicroservices(projectFolderPath) {
115
+ console.log("projectMicroservices", { projectFolderPath });
116
+ const filePath = microservicesMetadatasPath(projectFolderPath);
117
+ if (!fs.existsSync(filePath)) fs.writeFileSync(filePath, JSON.stringify({ microservices: [] }, void 0, 2), "utf8");
118
+ const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
119
+ if (!isMicroservicesMetadatas(parsed)) throw new Error(`Invalid microservices metadata file: ${filePath}`);
120
+ return parsed.microservices;
121
+ }
122
+ async function cleanupBackend(projectFolderPath) {
123
+ if (!fs.existsSync(projectFolderPath)) {
124
+ console.log(`Folder ${projectFolderPath} does not exist. Skipping cleanup.`);
125
+ return;
126
+ }
127
+ await killMicroservices(projectMicroservices(projectFolderPath));
128
+ await deleteFolderRecursive(projectFolderPath);
129
+ }
130
+ function getMicroserviceByName(microservices, name) {
131
+ const found = microservices.find((microservice) => microservice.name === name);
132
+ return found === void 0 ? void 0 : { ...found };
133
+ }
134
+ //#endregion
135
+ export { cleanupBackend, deleteFolderRecursive, getMicroserviceByName, killMicroservice, microservicesMetadatasPath, projectMicroservices };
@@ -0,0 +1,159 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs";
3
+ import { execFileSync } from "node:child_process";
4
+ import { google } from "googleapis";
5
+ //#region server/utils/cloud.ts
6
+ const LOCATIONS_DIR = "/etc/nginx/locations";
7
+ async function artifactImage(parent, authClient) {
8
+ const projectName = process.env.PROJECT;
9
+ const registry = google.artifactregistry({
10
+ version: "v1",
11
+ auth: authClient
12
+ });
13
+ const branch = process.env.NETLIFY_BRANCH;
14
+ const [, projectId] = parent.split("/");
15
+ const name = `${`${parent}/repositories/github/packages/`}${projectName}/tags/${branch}`;
16
+ console.log({ name });
17
+ const response = await registry.projects.locations.repositories.packages.tags.get({ name });
18
+ console.log({ response });
19
+ const digest = (response.data.version ?? "").split("/").pop();
20
+ const image = `${`europe-west9-docker.pkg.dev/${projectId}/github`}/${projectName}@${digest}`;
21
+ console.log("Found image for", projectName, image);
22
+ return image;
23
+ }
24
+ function sanitizeLabelValue(label) {
25
+ console.log("label", label);
26
+ return label.toLowerCase().replaceAll(/[^a-z0-9_-]/gu, "_").slice(0, 63);
27
+ }
28
+ function requestConfig(parent, image, email, projectName) {
29
+ const resources = {
30
+ limits: {
31
+ cpu: "2000m",
32
+ memory: "3Gi"
33
+ },
34
+ cpuIdle: false,
35
+ startupCpuBoost: true
36
+ };
37
+ const labels = {
38
+ user: sanitizeLabelValue(email),
39
+ project: sanitizeLabelValue(projectName)
40
+ };
41
+ return {
42
+ parent,
43
+ service: {
44
+ ingress: "INGRESS_TRAFFIC_ALL",
45
+ invokerIamDisabled: true,
46
+ labels,
47
+ scaling: {
48
+ scalingMode: "MANUAL",
49
+ manualInstanceCount: 1
50
+ },
51
+ template: {
52
+ labels,
53
+ timeout: { seconds: 3600 },
54
+ containers: [{
55
+ image,
56
+ ports: [{
57
+ name: "h2c",
58
+ containerPort: 80
59
+ }],
60
+ resources,
61
+ env: [{
62
+ name: "PARENT",
63
+ value: parent
64
+ }],
65
+ startupProbe: {
66
+ httpGet: {
67
+ port: 80,
68
+ path: "/viewer/healthcheck"
69
+ },
70
+ periodSeconds: 1,
71
+ failureThreshold: 30
72
+ }
73
+ }]
74
+ }
75
+ }
76
+ };
77
+ }
78
+ function addSupervisorProgram(name, command, executableArgs) {
79
+ const conf = `
80
+ [program:${name}]
81
+ command=${command} ${executableArgs.join(" ")}
82
+ autostart=true
83
+ autorestart=true
84
+ stdout_logfile=/dev/stdout
85
+ stdout_logfile_maxbytes=0
86
+ stderr_logfile=/dev/stderr
87
+ stderr_logfile_maxbytes=0
88
+ `;
89
+ const confPath = path.join("/etc/supervisor/conf.d", `${name}.conf`);
90
+ fs.writeFileSync(confPath, conf);
91
+ execFileSync("supervisorctl", ["reread"]);
92
+ execFileSync("supervisorctl", ["update"]);
93
+ const stdout = execFileSync("supervisorctl", ["start", name]);
94
+ console.log("addSupervisorProgram", stdout);
95
+ }
96
+ function buildLocationBlock(routePath, port) {
97
+ if (!routePath.startsWith("/") || !routePath.endsWith("/")) throw new Error(`routePath must start and end with '/', got: ${routePath}`);
98
+ const methods = "GET, POST, PUT, DELETE, PATCH, OPTIONS";
99
+ return `# ====================== ${routePath} location ======================
100
+ location ~ "^${routePath}" {
101
+ if ($request_method = 'OPTIONS') {
102
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
103
+ add_header 'Access-Control-Allow-Credentials' 'true' always;
104
+ add_header 'Access-Control-Allow-Methods' '${methods}' always;
105
+ add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,X-CSRF-Token' always;
106
+ add_header 'Access-Control-Max-Age' 1728000 always;
107
+ add_header 'Content-Type' 'text/plain; charset=utf-8';
108
+ add_header 'Content-Length' 0;
109
+ return 204;
110
+ }
111
+
112
+ limit_except ${methods.split(",").map((method) => method.trim()).filter((method) => method !== "OPTIONS").join(" ")} { deny all; }
113
+
114
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
115
+ add_header 'Access-Control-Allow-Credentials' 'true' always;
116
+ add_header 'Access-Control-Allow-Methods' '${methods}' always;
117
+ add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,X-CSRF-Token' always;
118
+ add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
119
+ add_header 'Vary' 'Origin' always;
120
+
121
+ rewrite "^${routePath}(.*)" /$1 break;
122
+ proxy_pass http://localhost:${port};
123
+ proxy_http_version 1.1;
124
+ proxy_set_header Host $host;
125
+ proxy_set_header X-Real-IP $remote_addr;
126
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
127
+ proxy_set_header X-Forwarded-Proto $scheme;
128
+ }
129
+ `;
130
+ }
131
+ function nginxConfigFile(name) {
132
+ return path.join(LOCATIONS_DIR, `${name}.conf`);
133
+ }
134
+ function nginxReload() {
135
+ execFileSync("nginx", ["-t"]);
136
+ execFileSync("nginx", ["-s", "reload"]);
137
+ }
138
+ function addNginxLocation(name, port) {
139
+ fs.mkdirSync(LOCATIONS_DIR, { recursive: true });
140
+ const filePath = nginxConfigFile(name);
141
+ if (fs.existsSync(filePath)) throw new Error(`Location '${name}' already exists at ${filePath}`);
142
+ fs.writeFileSync(filePath, buildLocationBlock(`/${name}/`, port));
143
+ try {
144
+ nginxReload();
145
+ } catch (error) {
146
+ fs.unlinkSync(filePath);
147
+ throw error;
148
+ }
149
+ return filePath;
150
+ }
151
+ function removeNginxLocation(name) {
152
+ const filePath = nginxConfigFile(name);
153
+ if (!fs.existsSync(filePath)) return false;
154
+ fs.unlinkSync(filePath);
155
+ nginxReload();
156
+ return true;
157
+ }
158
+ //#endregion
159
+ export { addNginxLocation, addSupervisorProgram, artifactImage, removeNginxLocation, requestConfig };
@@ -0,0 +1,153 @@
1
+ import { microservicesMetadatasPath, projectMicroservices } from "./cleanup.js";
2
+ import { addNginxLocation, addSupervisorProgram } from "./cloud.js";
3
+ import { getAvailablePort, waitForReady } from "./scripts.js";
4
+ import { executablePath } from "./path.js";
5
+ import path from "node:path";
6
+ import fs from "node:fs";
7
+ import child_process from "node:child_process";
8
+ import back_schemas from "@geode/opengeodeweb-back/opengeodeweb_back_schemas.json" with { type: "json" };
9
+ //#region server/utils/microservices.ts
10
+ const MILLISECONDS_PER_SECOND = 1e3;
11
+ const DEFAULT_TIMEOUT_SECONDS = 45;
12
+ const MAX_PORT_RETRIES = 1;
13
+ const DEFAULT_RUN_ARGS = { projectFolderPath: "" };
14
+ async function runScript(execPath, execName, args, expectedResponse, timeoutSeconds = DEFAULT_TIMEOUT_SECONDS) {
15
+ const command = executablePath(execPath, execName);
16
+ console.log("runScript", command, args);
17
+ const child = child_process.spawn(command, args, { stdio: [
18
+ "ignore",
19
+ "pipe",
20
+ "pipe"
21
+ ] });
22
+ child.name = command.replace(/^.*[\\/]/u, "");
23
+ child.on("spawn", () => {
24
+ console.log(`[${child.name}] spawned, pid=${child.pid}`);
25
+ });
26
+ const controller = new AbortController();
27
+ const timer = setTimeout(() => {
28
+ controller.abort();
29
+ }, timeoutSeconds * MILLISECONDS_PER_SECOND);
30
+ if (typeof timer.unref === "function") timer.unref();
31
+ try {
32
+ const result = await waitForReady(child, expectedResponse, controller.signal);
33
+ clearTimeout(timer);
34
+ return result;
35
+ } catch (error) {
36
+ clearTimeout(timer);
37
+ child.kill();
38
+ throw error;
39
+ }
40
+ }
41
+ function isPortInUseError(error) {
42
+ return /EADDRINUSE|address already in use|port already in use/iu.test(String(error));
43
+ }
44
+ function backArgs(args, port) {
45
+ const { projectFolderPath } = args;
46
+ if (!projectFolderPath) throw new Error("projectFolderPath is required");
47
+ const uploadFolderPath = args.uploadFolderPath !== void 0 && args.uploadFolderPath !== "" ? args.uploadFolderPath : path.join(projectFolderPath, "uploads");
48
+ const executableArgs = [
49
+ "--port",
50
+ String(port),
51
+ "--project_folder_path",
52
+ projectFolderPath,
53
+ "--upload_folder_path",
54
+ uploadFolderPath,
55
+ "--allowed_origins",
56
+ "http://localhost:*",
57
+ "--timeout",
58
+ "0"
59
+ ];
60
+ if (process.env.NODE_ENV === void 0 || process.env.NODE_ENV === "development") executableArgs.push("--debug");
61
+ return executableArgs;
62
+ }
63
+ async function runBack(execName, execPath, args = DEFAULT_RUN_ARGS, attempts = 0) {
64
+ let port = void 0;
65
+ try {
66
+ port = await getAvailablePort();
67
+ const executableArgs = backArgs(args, port);
68
+ console.log("runBack", execPath, execName, executableArgs);
69
+ await runScript(execPath, execName, executableArgs, "Serving Flask app");
70
+ return port;
71
+ } catch (error) {
72
+ if (!isPortInUseError(error)) {
73
+ console.log("runBack error", error);
74
+ throw error;
75
+ }
76
+ if (attempts <= MAX_PORT_RETRIES) {
77
+ console.log("Retrying runBack on conflicting port", port);
78
+ return await runBack(execName, execPath, args, attempts + 1);
79
+ }
80
+ }
81
+ throw new Error(`runBack failed to run ${execName}`);
82
+ }
83
+ async function runViewer(execName, execPath, args = DEFAULT_RUN_ARGS, attempts = 0) {
84
+ const { projectFolderPath } = args;
85
+ if (!projectFolderPath) throw new Error("projectFolderPath is required");
86
+ let port = void 0;
87
+ try {
88
+ port = await getAvailablePort();
89
+ const viewerArgs = [
90
+ "--port",
91
+ String(port),
92
+ "--project_folder_path",
93
+ projectFolderPath,
94
+ "--timeout",
95
+ "0"
96
+ ];
97
+ console.log("runViewer", execPath, execName, viewerArgs);
98
+ await runScript(execPath, execName, viewerArgs, "Starting factory");
99
+ return port;
100
+ } catch (error) {
101
+ if (!isPortInUseError(error)) {
102
+ console.log("runViewer error", error);
103
+ throw error;
104
+ }
105
+ if (attempts <= MAX_PORT_RETRIES) {
106
+ console.log("Retrying runViewer on conflicting port", port);
107
+ return await runViewer(execName, execPath, args, attempts + 1);
108
+ }
109
+ }
110
+ throw new Error(`runViewer failed to run ${execName}`);
111
+ }
112
+ async function runExtension(extensionId, execName, execPath, args = DEFAULT_RUN_ARGS, attempts = 0) {
113
+ let port = void 0;
114
+ try {
115
+ port = await getAvailablePort();
116
+ const executableArgs = backArgs(args, port);
117
+ const command = executablePath(execPath, execName);
118
+ console.log("runExtension", execPath, execName, executableArgs);
119
+ addSupervisorProgram(extensionId, command, executableArgs);
120
+ addNginxLocation(extensionId, port);
121
+ return port;
122
+ } catch (error) {
123
+ if (!isPortInUseError(error)) {
124
+ console.log("runExtension error", error);
125
+ throw error;
126
+ }
127
+ if (attempts <= MAX_PORT_RETRIES) {
128
+ console.log("Retrying runExtension on conflicting port", port);
129
+ return await runExtension(extensionId, execName, execPath, args, attempts + 1);
130
+ }
131
+ }
132
+ throw new Error(`runExtension failed to run ${extensionId}`);
133
+ }
134
+ function addMicroserviceMetadatas(projectFolderPath, serviceObj) {
135
+ const microservices = projectMicroservices(projectFolderPath);
136
+ let enriched = { ...serviceObj };
137
+ if (serviceObj.type === "back") {
138
+ const schema = back_schemas.opengeodeweb_back.kill;
139
+ const [method] = schema.methods;
140
+ enriched = {
141
+ ...enriched,
142
+ url: `http://localhost:${serviceObj.port}/${schema.$id}`,
143
+ method
144
+ };
145
+ } else if (serviceObj.type === "viewer") enriched = {
146
+ ...enriched,
147
+ url: `ws://localhost:${serviceObj.port}/ws`
148
+ };
149
+ microservices.push(enriched);
150
+ fs.writeFileSync(microservicesMetadatasPath(projectFolderPath), JSON.stringify({ microservices }, void 0, 2));
151
+ }
152
+ //#endregion
153
+ export { addMicroserviceMetadatas, runBack, runExtension, runViewer };