@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
@@ -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,156 @@
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: [{ containerPort: 80 }],
57
+ resources,
58
+ env: [{
59
+ name: "PARENT",
60
+ value: parent
61
+ }],
62
+ startupProbe: {
63
+ httpGet: {
64
+ port: 80,
65
+ path: "/viewer/healthcheck"
66
+ },
67
+ periodSeconds: 1,
68
+ failureThreshold: 30
69
+ }
70
+ }]
71
+ }
72
+ }
73
+ };
74
+ }
75
+ function addSupervisorProgram(name, command, executableArgs) {
76
+ const conf = `
77
+ [program:${name}]
78
+ command=${command} ${executableArgs.join(" ")}
79
+ autostart=true
80
+ autorestart=true
81
+ stdout_logfile=/dev/stdout
82
+ stdout_logfile_maxbytes=0
83
+ stderr_logfile=/dev/stderr
84
+ stderr_logfile_maxbytes=0
85
+ `;
86
+ const confPath = path.join("/etc/supervisor/conf.d", `${name}.conf`);
87
+ fs.writeFileSync(confPath, conf);
88
+ execFileSync("supervisorctl", ["reread"]);
89
+ execFileSync("supervisorctl", ["update"]);
90
+ const stdout = execFileSync("supervisorctl", ["start", name]);
91
+ console.log("addSupervisorProgram", stdout);
92
+ }
93
+ function buildLocationBlock(routePath, port) {
94
+ if (!routePath.startsWith("/") || !routePath.endsWith("/")) throw new Error(`routePath must start and end with '/', got: ${routePath}`);
95
+ const methods = "GET, POST, PUT, DELETE, PATCH, OPTIONS";
96
+ return `# ====================== ${routePath} location ======================
97
+ location ~ "^${routePath}" {
98
+ if ($request_method = 'OPTIONS') {
99
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
100
+ add_header 'Access-Control-Allow-Credentials' 'true' always;
101
+ add_header 'Access-Control-Allow-Methods' '${methods}' always;
102
+ 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;
103
+ add_header 'Access-Control-Max-Age' 1728000 always;
104
+ add_header 'Content-Type' 'text/plain; charset=utf-8';
105
+ add_header 'Content-Length' 0;
106
+ return 204;
107
+ }
108
+
109
+ limit_except ${methods.split(",").map((method) => method.trim()).filter((method) => method !== "OPTIONS").join(" ")} { deny all; }
110
+
111
+ add_header 'Access-Control-Allow-Origin' $allow_origin always;
112
+ add_header 'Access-Control-Allow-Credentials' 'true' always;
113
+ add_header 'Access-Control-Allow-Methods' '${methods}' always;
114
+ 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;
115
+ add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
116
+ add_header 'Vary' 'Origin' always;
117
+
118
+ rewrite "^${routePath}(.*)" /$1 break;
119
+ proxy_pass http://localhost:${port};
120
+ proxy_http_version 1.1;
121
+ proxy_set_header Host $host;
122
+ proxy_set_header X-Real-IP $remote_addr;
123
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
124
+ proxy_set_header X-Forwarded-Proto $scheme;
125
+ }
126
+ `;
127
+ }
128
+ function nginxConfigFile(name) {
129
+ return path.join(LOCATIONS_DIR, `${name}.conf`);
130
+ }
131
+ function nginxReload() {
132
+ execFileSync("nginx", ["-t"]);
133
+ execFileSync("nginx", ["-s", "reload"]);
134
+ }
135
+ function addNginxLocation(name, port) {
136
+ fs.mkdirSync(LOCATIONS_DIR, { recursive: true });
137
+ const filePath = nginxConfigFile(name);
138
+ if (fs.existsSync(filePath)) throw new Error(`Location '${name}' already exists at ${filePath}`);
139
+ fs.writeFileSync(filePath, buildLocationBlock(`/${name}/`, port));
140
+ try {
141
+ nginxReload();
142
+ } catch (error) {
143
+ fs.unlinkSync(filePath);
144
+ throw error;
145
+ }
146
+ return filePath;
147
+ }
148
+ function removeNginxLocation(name) {
149
+ const filePath = nginxConfigFile(name);
150
+ if (!fs.existsSync(filePath)) return false;
151
+ fs.unlinkSync(filePath);
152
+ nginxReload();
153
+ return true;
154
+ }
155
+ //#endregion
156
+ 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 };