@geode/opengeodeweb-front 10.34.0-rc.1 → 10.34.0-rc.11

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 (494) 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 +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/{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 +4 -4
  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 +36 -19
  72. package/app/components/Viewer/EdgedCurve/PointsOptions.vue +8 -5
  73. package/app/components/Viewer/EdgedCurve/SpecificEdgesOptions.vue +81 -42
  74. package/app/components/Viewer/Generic/Mesh/CellsOptions.vue +88 -44
  75. package/app/components/Viewer/Generic/Mesh/EdgesOptions.vue +83 -44
  76. package/app/components/Viewer/Generic/Mesh/PointsOptions.vue +54 -32
  77. package/app/components/Viewer/Generic/Mesh/PolygonsOptions.vue +105 -45
  78. package/app/components/Viewer/Generic/Mesh/PolyhedraOptions.vue +88 -43
  79. package/app/components/Viewer/Generic/Model/BlocksOptions.vue +151 -45
  80. package/app/components/Viewer/Generic/Model/CornersOptions.vue +93 -33
  81. package/app/components/Viewer/Generic/Model/EdgesOptions.vue +13 -9
  82. package/app/components/Viewer/Generic/Model/LinesOptions.vue +138 -53
  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 +159 -41
  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 +38 -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 +56 -33
  101. package/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue +63 -34
  102. package/app/components/Viewer/ObjectTree/Views/ModelCollections.vue +81 -35
  103. package/app/components/Viewer/ObjectTree/Views/ModelComponents.vue +92 -39
  104. package/app/components/Viewer/Options/AttributeColorBar.vue +14 -6
  105. package/app/components/Viewer/Options/AttributeRangeSelector.vue +8 -4
  106. package/app/components/Viewer/Options/AttributeSelector.vue +115 -31
  107. package/app/components/Viewer/Options/ColorMapList.vue +52 -24
  108. package/app/components/Viewer/Options/ColorMapPicker.vue +15 -11
  109. package/app/components/Viewer/Options/ColorPicker.vue +23 -8
  110. package/app/components/Viewer/Options/ColoringTypeSelector.vue +92 -56
  111. package/app/components/Viewer/Options/ColormapQuickPicker.vue +16 -12
  112. package/app/components/Viewer/Options/OptionsSection.vue +7 -5
  113. package/app/components/Viewer/Options/Sliders/Size.vue +3 -3
  114. package/app/components/Viewer/Options/Sliders/Slider.vue +9 -6
  115. package/app/components/Viewer/Options/Sliders/Width.vue +3 -3
  116. package/app/components/Viewer/Options/TextureItem.vue +29 -22
  117. package/app/components/Viewer/Options/TexturesSelector.vue +23 -12
  118. package/app/components/Viewer/Options/VisibilitySwitch.vue +3 -3
  119. package/app/components/Viewer/OverlappingObjectsPicker.vue +27 -12
  120. package/app/components/Viewer/PointSet/SpecificPointsOptions.vue +45 -23
  121. package/app/components/Viewer/Solid/EdgesOptions.vue +8 -5
  122. package/app/components/Viewer/Solid/PointsOptions.vue +8 -5
  123. package/app/components/Viewer/Solid/PolygonsOptions.vue +8 -5
  124. package/app/components/Viewer/Solid/SpecificPolyhedraOptions.vue +87 -42
  125. package/app/components/Viewer/Surface/EdgesOptions.vue +8 -5
  126. package/app/components/Viewer/Surface/PointsOptions.vue +8 -5
  127. package/app/components/Viewer/Surface/PolygonsOptions.vue +93 -43
  128. package/app/components/Viewer/Surface/Triangulated/TrianglesOptions.vue +8 -5
  129. package/app/components/Viewer/TetrahedralSolid/TetrahedraOptions.vue +8 -5
  130. package/app/components/Viewer/TetrahedralSolid/TrianglesOptions.vue +8 -5
  131. package/app/components/Viewer/Ui.vue +19 -14
  132. package/app/components/Wrapper.vue +16 -10
  133. package/app/components/ZScaling.vue +18 -10
  134. package/app/components/csv-preview/CsvPreviewer.vue +53 -30
  135. package/app/components/csv-preview/CsvSettings.vue +30 -50
  136. package/app/components/csv-preview/CsvTable.vue +34 -14
  137. package/app/composables/{batch_style.js → batch_style.ts} +9 -7
  138. package/app/composables/clipping_planes_widget.ts +204 -0
  139. package/app/composables/clipping_planes_widget_entries.ts +191 -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 +198 -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 +266 -0
  153. package/app/composables/use_quick_colormap.ts +55 -0
  154. package/app/composables/virtual_tree.ts +279 -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/stores/app.ts +257 -0
  158. package/app/stores/app_helpers/extension.ts +179 -0
  159. package/app/stores/{back.js → back.ts} +57 -28
  160. package/app/stores/camera_manager.ts +83 -0
  161. package/app/stores/{cloud.js → cloud.ts} +18 -13
  162. package/app/stores/data.ts +392 -0
  163. package/app/stores/data_helpers/collections.ts +146 -0
  164. package/app/stores/data_helpers/mesh.ts +171 -0
  165. package/app/stores/data_style.ts +167 -0
  166. package/app/stores/{feedback.js → feedback.ts} +19 -8
  167. package/app/stores/{hybrid_viewer.js → hybrid_viewer.ts} +49 -45
  168. package/app/stores/infra.ts +112 -0
  169. package/app/stores/{menu.js → menu.ts} +67 -36
  170. package/app/stores/treeview.ts +383 -0
  171. package/app/stores/{viewer.js → viewer.ts} +62 -36
  172. package/app/utils/attributes.ts +40 -0
  173. package/app/utils/clipping_planes.ts +227 -0
  174. package/app/utils/colormap.ts +102 -0
  175. package/app/utils/default_styles/{constants.js → constants.ts} +27 -11
  176. package/app/utils/default_styles/{index.js → index.ts} +5 -3
  177. package/app/utils/default_styles/meshes.ts +264 -0
  178. package/app/utils/default_styles/{models.js → models.ts} +106 -52
  179. package/app/utils/{extension.js → extension.ts} +67 -19
  180. package/app/utils/{import_workflow.js → import_workflow.ts} +39 -22
  181. package/app/utils/{log.js → log.ts} +12 -2
  182. package/app/utils/{name_cleaner.js → name_cleaner.ts} +6 -6
  183. package/app/utils/status.ts +19 -0
  184. package/app/utils/{stores.js → stores.ts} +5 -5
  185. package/app/utils/{string.js → string.ts} +6 -6
  186. package/app/utils/{treeview.js → treeview.ts} +4 -1
  187. package/internal/database/{base_database.js → base_database.ts} +7 -3
  188. package/internal/database/database.ts +102 -0
  189. package/internal/database/{extended_database.js → extended_database.ts} +5 -1
  190. package/internal/database/tables/camera_positions.ts +6 -0
  191. package/internal/database/tables/{data.js → data.ts} +3 -1
  192. package/internal/database/tables/data_style.ts +6 -0
  193. package/internal/database/tables/model_component_datastyle.ts +6 -0
  194. package/internal/database/tables/model_component_type_datastyle.ts +6 -0
  195. package/internal/database/tables/model_components.ts +6 -0
  196. package/internal/database/tables/model_components_relation.ts +6 -0
  197. package/internal/database/tables/table_definition.ts +5 -0
  198. package/internal/stores/data_style/mesh/cells/cell.ts +279 -0
  199. package/internal/stores/data_style/mesh/cells/{color.js → color.ts} +13 -7
  200. package/internal/stores/data_style/mesh/cells/common.ts +50 -0
  201. package/internal/stores/data_style/mesh/cells/index.ts +161 -0
  202. package/internal/stores/data_style/mesh/cells/{textures.js → textures.ts} +14 -8
  203. package/internal/stores/data_style/mesh/cells/vertex.ts +285 -0
  204. package/internal/stores/data_style/mesh/cells/visibility.ts +46 -0
  205. package/internal/stores/data_style/mesh/edges/{color.js → color.ts} +13 -7
  206. package/internal/stores/data_style/mesh/edges/common.ts +41 -0
  207. package/internal/stores/data_style/mesh/edges/edge.ts +279 -0
  208. package/internal/stores/data_style/mesh/edges/index.ts +155 -0
  209. package/internal/stores/data_style/mesh/edges/vertex.ts +285 -0
  210. package/internal/stores/data_style/mesh/edges/visibility.ts +45 -0
  211. package/internal/stores/data_style/mesh/edges/width.ts +42 -0
  212. package/internal/stores/data_style/mesh/{index.js → index.ts} +34 -14
  213. package/internal/stores/data_style/mesh/points/{color.js → color.ts} +13 -7
  214. package/internal/stores/data_style/mesh/points/common.ts +52 -0
  215. package/internal/stores/data_style/mesh/points/index.ts +133 -0
  216. package/internal/stores/data_style/mesh/points/size.ts +43 -0
  217. package/internal/stores/data_style/mesh/points/vertex.ts +285 -0
  218. package/internal/stores/data_style/mesh/points/visibility.ts +49 -0
  219. package/internal/stores/data_style/mesh/polygons/{color.js → color.ts} +13 -7
  220. package/internal/stores/data_style/mesh/polygons/common.ts +50 -0
  221. package/internal/stores/data_style/mesh/polygons/index.ts +167 -0
  222. package/internal/stores/data_style/mesh/polygons/polygon.ts +282 -0
  223. package/internal/stores/data_style/mesh/polygons/{textures.js → textures.ts} +14 -8
  224. package/internal/stores/data_style/mesh/polygons/vertex.ts +288 -0
  225. package/internal/stores/data_style/mesh/polygons/visibility.ts +48 -0
  226. package/internal/stores/data_style/mesh/polyhedra/{color.js → color.ts} +13 -7
  227. package/internal/stores/data_style/mesh/polyhedra/common.ts +41 -0
  228. package/internal/stores/data_style/mesh/polyhedra/index.ts +159 -0
  229. package/internal/stores/data_style/mesh/polyhedra/polyhedron.ts +294 -0
  230. package/internal/stores/data_style/mesh/polyhedra/vertex.ts +288 -0
  231. package/internal/stores/data_style/mesh/polyhedra/visibility.ts +48 -0
  232. package/internal/stores/data_style/model/blocks/{color.js → color.ts} +46 -12
  233. package/internal/stores/data_style/model/blocks/common.ts +67 -0
  234. package/internal/stores/data_style/model/blocks/{index.js → index.ts} +111 -66
  235. package/internal/stores/data_style/model/blocks/polyhedron.ts +362 -0
  236. package/internal/stores/data_style/model/blocks/vertex.ts +348 -0
  237. package/internal/stores/data_style/model/blocks/visibility.ts +37 -0
  238. package/internal/stores/data_style/model/color.ts +348 -0
  239. package/internal/stores/data_style/model/common.ts +262 -0
  240. package/internal/stores/data_style/model/corners/{color.js → color.ts} +45 -9
  241. package/internal/stores/data_style/model/corners/common.ts +71 -0
  242. package/internal/stores/data_style/model/corners/{index.js → index.ts} +86 -47
  243. package/internal/stores/data_style/model/corners/vertex.ts +314 -0
  244. package/internal/stores/data_style/model/corners/visibility.ts +39 -0
  245. package/internal/stores/data_style/model/edges/common.ts +29 -0
  246. package/internal/stores/data_style/model/edges/{index.js → index.ts} +2 -7
  247. package/internal/stores/data_style/model/edges/visibility.ts +55 -0
  248. package/internal/stores/data_style/model/{index.js → index.ts} +24 -11
  249. package/internal/stores/data_style/model/lines/{color.js → color.ts} +43 -9
  250. package/internal/stores/data_style/model/lines/common.ts +63 -0
  251. package/internal/stores/data_style/model/lines/edge.ts +342 -0
  252. package/internal/stores/data_style/model/lines/{index.js → index.ts} +108 -66
  253. package/internal/stores/data_style/model/lines/vertex.ts +343 -0
  254. package/internal/stores/data_style/model/lines/visibility.ts +37 -0
  255. package/internal/stores/data_style/model/points/common.ts +25 -0
  256. package/internal/stores/data_style/model/points/index.ts +35 -0
  257. package/internal/stores/data_style/model/points/size.ts +44 -0
  258. package/internal/stores/data_style/model/points/visibility.ts +46 -0
  259. package/internal/stores/data_style/model/selection.ts +138 -0
  260. package/internal/stores/data_style/model/surfaces/{color.js → color.ts} +43 -9
  261. package/internal/stores/data_style/model/surfaces/common.ts +69 -0
  262. package/internal/stores/data_style/model/surfaces/{index.js → index.ts} +113 -66
  263. package/internal/stores/data_style/model/surfaces/polygon.ts +346 -0
  264. package/internal/stores/data_style/model/surfaces/vertex.ts +350 -0
  265. package/internal/stores/data_style/model/surfaces/visibility.ts +37 -0
  266. package/internal/stores/data_style/model/{visibility.js → visibility.ts} +112 -32
  267. package/internal/stores/data_style/state.ts +284 -0
  268. package/internal/stores/data_style/types.ts +30 -0
  269. package/internal/stores/hybrid_viewer/brightness.ts +131 -0
  270. package/internal/stores/hybrid_viewer/camera.ts +318 -0
  271. package/internal/stores/hybrid_viewer/{camera_animation.js → camera_animation.ts} +30 -12
  272. package/internal/stores/hybrid_viewer/{constants.js → constants.ts} +2 -2
  273. package/internal/stores/hybrid_viewer/core.ts +64 -0
  274. package/internal/stores/hybrid_viewer/{filters.js → filters.ts} +11 -8
  275. package/internal/stores/hybrid_viewer/highlight.ts +183 -0
  276. package/internal/stores/hybrid_viewer/{ruler.js → ruler.ts} +50 -22
  277. package/internal/stores/hybrid_viewer/scene.ts +125 -0
  278. package/internal/stores/hybrid_viewer/viewport.ts +183 -0
  279. package/internal/stores/hybrid_viewer/vtk_types.ts +58 -0
  280. package/internal/utils/api_fetch.ts +127 -0
  281. package/internal/utils/upload_file.ts +101 -0
  282. package/internal/utils/viewer_call.ts +98 -0
  283. package/internal/utils/ws_client.ts +54 -0
  284. package/nuxt.config.ts +168 -0
  285. package/opengeodeweb_front_schemas.json +2 -2
  286. package/package.json +49 -13
  287. package/server/api/cloud/extensions/{run.post.js → run.post.ts} +16 -12
  288. package/server/api/local/app/project_folder_path.post.ts +33 -0
  289. package/server/api/local/app/run_back.post.ts +39 -0
  290. package/server/api/local/app/run_viewer.post.ts +39 -0
  291. package/server/api/local/extensions/{kill.post.js → kill.post.ts} +15 -8
  292. package/server/api/local/extensions/{run.post.js → run.post.ts} +17 -12
  293. package/server/api/local/extensions/{upload.put.js → upload.put.ts} +38 -12
  294. package/server/api/microservice/app/{get_is_app_ready.get.js → get_is_app_ready.get.ts} +5 -5
  295. package/server/api/microservice/app/schemas/get_is_app_ready.json +1 -1
  296. package/server/api/microservice/app/set_app_base_url.post.ts +29 -0
  297. package/server/api/microservice/app/set_back_base_url.post.ts +26 -0
  298. package/server/api/microservice/app/set_is_app_ready.post.ts +29 -0
  299. package/server/api/microservice/app/set_viewer_base_url.post.ts +26 -0
  300. package/server/api/microservice/extensions/{download.post.js → download.post.ts} +13 -6
  301. package/server/api/serverless/run_cloud.post.ts +92 -0
  302. package/server/utils/{app_config.js → app_config.ts} +40 -18
  303. package/server/utils/{cleanup.js → cleanup.ts} +78 -29
  304. package/server/utils/{cloud.js → cloud.ts} +33 -17
  305. package/server/utils/{extension.js → extension.ts} +31 -4
  306. package/server/utils/{microservices.js → microservices.ts} +71 -27
  307. package/server/utils/{path.js → path.ts} +36 -17
  308. package/server/utils/{scripts.js → scripts.ts} +49 -33
  309. package/server/utils/{server.js → server.ts} +13 -6
  310. package/server/utils/server_config.ts +74 -0
  311. package/server/utils/stream.ts +6 -0
  312. package/server/utils/ws_client.ts +169 -0
  313. package/shared/{scripts.js → scripts.ts} +15 -10
  314. package/shared/utils/call_raw.ts +84 -0
  315. package/shared/utils/{call_schema.js → call_schema.ts} +15 -6
  316. package/shared/utils/fetch_raw.ts +125 -0
  317. package/shared/utils/{fetch_schema.js → fetch_schema.ts} +23 -7
  318. package/shared/utils/{file.js → file.ts} +2 -2
  319. package/shared/utils/{parse_boolean.js → parse_boolean.ts} +1 -1
  320. package/shared/utils/response_handlers/load.ts +109 -0
  321. package/shared/utils/types.ts +27 -0
  322. package/shared/utils/{validate_schema.js → validate_schema.ts} +6 -1
  323. package/.github/workflows/config.json +0 -5
  324. package/.github/workflows/deploy.yml +0 -15
  325. package/.github/workflows/manual_release.yml +0 -11
  326. package/.github/workflows/merge_request.yml +0 -9
  327. package/.github/workflows/pr_update.yml +0 -11
  328. package/.github/workflows/prepare_deploy.yml +0 -9
  329. package/.github/workflows/schedule.yml +0 -18
  330. package/.github/workflows/test.yml +0 -14
  331. package/.github/workflows/test_pr.yml +0 -12
  332. package/.oxlintrc.json +0 -150
  333. package/.releaserc +0 -11
  334. package/app/composables/clipping_planes_widget.js +0 -249
  335. package/app/composables/global_attribute_style.js +0 -181
  336. package/app/composables/hover_highlight.js +0 -91
  337. package/app/composables/responsive_middle_truncate.js +0 -34
  338. package/app/composables/stepper_tree.js +0 -56
  339. package/app/composables/tree_filter.js +0 -138
  340. package/app/composables/use_adaptive_styles.js +0 -120
  341. package/app/composables/use_overlapping_picker.js +0 -169
  342. package/app/composables/use_quick_colormap.js +0 -32
  343. package/app/composables/virtual_tree.js +0 -191
  344. package/app/stores/app.js +0 -326
  345. package/app/stores/camera_manager.js +0 -57
  346. package/app/stores/data.js +0 -278
  347. package/app/stores/data_helpers/collections.js +0 -96
  348. package/app/stores/data_helpers/mesh.js +0 -122
  349. package/app/stores/data_style.js +0 -116
  350. package/app/stores/infra.js +0 -95
  351. package/app/stores/treeview.js +0 -290
  352. package/app/utils/attributes.js +0 -23
  353. package/app/utils/clipping_planes.js +0 -110
  354. package/app/utils/colormap.js +0 -64
  355. package/app/utils/default_styles/meshes.js +0 -191
  356. package/app/utils/status.js +0 -10
  357. package/commitlint.config.js +0 -20
  358. package/internal/database/database.js +0 -80
  359. package/internal/database/tables/camera_positions.js +0 -4
  360. package/internal/database/tables/data_style.js +0 -4
  361. package/internal/database/tables/model_component_datastyle.js +0 -4
  362. package/internal/database/tables/model_component_type_datastyle.js +0 -4
  363. package/internal/database/tables/model_components.js +0 -4
  364. package/internal/database/tables/model_components_relation.js +0 -4
  365. package/internal/stores/data_style/mesh/cells/cell.js +0 -166
  366. package/internal/stores/data_style/mesh/cells/common.js +0 -39
  367. package/internal/stores/data_style/mesh/cells/index.js +0 -81
  368. package/internal/stores/data_style/mesh/cells/vertex.js +0 -167
  369. package/internal/stores/data_style/mesh/cells/visibility.js +0 -35
  370. package/internal/stores/data_style/mesh/edges/common.js +0 -32
  371. package/internal/stores/data_style/mesh/edges/edge.js +0 -169
  372. package/internal/stores/data_style/mesh/edges/index.js +0 -81
  373. package/internal/stores/data_style/mesh/edges/vertex.js +0 -170
  374. package/internal/stores/data_style/mesh/edges/visibility.js +0 -34
  375. package/internal/stores/data_style/mesh/edges/width.js +0 -34
  376. package/internal/stores/data_style/mesh/points/common.js +0 -37
  377. package/internal/stores/data_style/mesh/points/index.js +0 -82
  378. package/internal/stores/data_style/mesh/points/size.js +0 -35
  379. package/internal/stores/data_style/mesh/points/vertex.js +0 -167
  380. package/internal/stores/data_style/mesh/points/visibility.js +0 -37
  381. package/internal/stores/data_style/mesh/polygons/common.js +0 -32
  382. package/internal/stores/data_style/mesh/polygons/index.js +0 -107
  383. package/internal/stores/data_style/mesh/polygons/polygon.js +0 -170
  384. package/internal/stores/data_style/mesh/polygons/vertex.js +0 -170
  385. package/internal/stores/data_style/mesh/polygons/visibility.js +0 -38
  386. package/internal/stores/data_style/mesh/polyhedra/common.js +0 -32
  387. package/internal/stores/data_style/mesh/polyhedra/index.js +0 -98
  388. package/internal/stores/data_style/mesh/polyhedra/polyhedron.js +0 -170
  389. package/internal/stores/data_style/mesh/polyhedra/vertex.js +0 -170
  390. package/internal/stores/data_style/mesh/polyhedra/visibility.js +0 -38
  391. package/internal/stores/data_style/model/blocks/common.js +0 -51
  392. package/internal/stores/data_style/model/blocks/polyhedron.js +0 -187
  393. package/internal/stores/data_style/model/blocks/vertex.js +0 -181
  394. package/internal/stores/data_style/model/blocks/visibility.js +0 -20
  395. package/internal/stores/data_style/model/color.js +0 -218
  396. package/internal/stores/data_style/model/common.js +0 -141
  397. package/internal/stores/data_style/model/corners/common.js +0 -51
  398. package/internal/stores/data_style/model/corners/vertex.js +0 -181
  399. package/internal/stores/data_style/model/corners/visibility.js +0 -20
  400. package/internal/stores/data_style/model/edges/common.js +0 -20
  401. package/internal/stores/data_style/model/edges/visibility.js +0 -38
  402. package/internal/stores/data_style/model/lines/common.js +0 -51
  403. package/internal/stores/data_style/model/lines/edge.js +0 -180
  404. package/internal/stores/data_style/model/lines/vertex.js +0 -181
  405. package/internal/stores/data_style/model/lines/visibility.js +0 -20
  406. package/internal/stores/data_style/model/points/common.js +0 -20
  407. package/internal/stores/data_style/model/points/index.js +0 -25
  408. package/internal/stores/data_style/model/points/size.js +0 -36
  409. package/internal/stores/data_style/model/points/visibility.js +0 -36
  410. package/internal/stores/data_style/model/selection.js +0 -89
  411. package/internal/stores/data_style/model/surfaces/common.js +0 -51
  412. package/internal/stores/data_style/model/surfaces/polygon.js +0 -187
  413. package/internal/stores/data_style/model/surfaces/vertex.js +0 -187
  414. package/internal/stores/data_style/model/surfaces/visibility.js +0 -20
  415. package/internal/stores/data_style/state.js +0 -197
  416. package/internal/stores/hybrid_viewer/brightness.js +0 -82
  417. package/internal/stores/hybrid_viewer/camera.js +0 -274
  418. package/internal/stores/hybrid_viewer/highlight.js +0 -170
  419. package/internal/stores/hybrid_viewer/scene.js +0 -136
  420. package/internal/stores/hybrid_viewer/viewport.js +0 -140
  421. package/internal/utils/api_fetch.js +0 -52
  422. package/internal/utils/upload_file.js +0 -57
  423. package/internal/utils/viewer_call.js +0 -49
  424. package/internal/utils/ws_client.js +0 -29
  425. package/nuxt.config.js +0 -106
  426. package/scripts/generate_geode_objects.js +0 -24
  427. package/server/api/local/app/project_folder_path.post.js +0 -29
  428. package/server/api/local/app/run_back.post.js +0 -33
  429. package/server/api/local/app/run_viewer.post.js +0 -33
  430. package/server/api/microservice/app/set_app_base_url.post.js +0 -25
  431. package/server/api/microservice/app/set_back_base_url.post.js +0 -22
  432. package/server/api/microservice/app/set_is_app_ready.post.js +0 -25
  433. package/server/api/microservice/app/set_viewer_base_url.post.js +0 -22
  434. package/server/api/serverless/run_cloud.post.js +0 -44
  435. package/server/utils/server_config.js +0 -58
  436. package/server/utils/ws_client.js +0 -112
  437. package/shared/utils/call_raw.js +0 -46
  438. package/shared/utils/fetch_raw.js +0 -61
  439. package/shared/utils/response_handlers/load.js +0 -74
  440. package/tests/integration/data/uploads/test.og_brep +0 -0
  441. package/tests/integration/data/uploads/test.og_edc2d +0 -0
  442. package/tests/integration/data/uploads/test.og_edc3d +0 -0
  443. package/tests/integration/data/uploads/test.og_psf3d +0 -0
  444. package/tests/integration/data/uploads/test.og_rgd2d +0 -0
  445. package/tests/integration/data/uploads/test.og_rgd3d +0 -0
  446. package/tests/integration/data/uploads/test.vtu +0 -22
  447. package/tests/integration/setup.js +0 -92
  448. package/tests/integration/stores/data_style/mesh/cells.nuxt.test.js +0 -341
  449. package/tests/integration/stores/data_style/mesh/edges.nuxt.test.js +0 -251
  450. package/tests/integration/stores/data_style/mesh/index.nuxt.test.js +0 -62
  451. package/tests/integration/stores/data_style/mesh/points.nuxt.test.js +0 -199
  452. package/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js +0 -257
  453. package/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js +0 -264
  454. package/tests/integration/stores/data_style/model/blocks.nuxt.test.js +0 -394
  455. package/tests/integration/stores/data_style/model/corners.nuxt.test.js +0 -262
  456. package/tests/integration/stores/data_style/model/edges.nuxt.test.js +0 -71
  457. package/tests/integration/stores/data_style/model/index.nuxt.test.js +0 -92
  458. package/tests/integration/stores/data_style/model/lines.nuxt.test.js +0 -376
  459. package/tests/integration/stores/data_style/model/points.nuxt.test.js +0 -95
  460. package/tests/integration/stores/data_style/model/surfaces.nuxt.test.js +0 -571
  461. package/tests/integration/stores/viewer.nuxt.test.js +0 -69
  462. package/tests/setup_indexeddb.js +0 -4
  463. package/tests/unit/components/CrsSelector.nuxt.test.js +0 -55
  464. package/tests/unit/components/DragAndDrop.nuxt.test.js +0 -89
  465. package/tests/unit/components/ExtensionSelector.nuxt.test.js +0 -65
  466. package/tests/unit/components/FeedBack/ErrorsBanner.nuxt.test.js +0 -41
  467. package/tests/unit/components/FeedBack/Snackers.nuxt.test.js +0 -49
  468. package/tests/unit/components/FileSelector.nuxt.test.js +0 -124
  469. package/tests/unit/components/FileUploader.nuxt.test.js +0 -69
  470. package/tests/unit/components/MissingFilesSelector.nuxt.test.js +0 -77
  471. package/tests/unit/components/ObjectSelector.nuxt.test.js +0 -118
  472. package/tests/unit/components/PackagesVersions.nuxt.test.js +0 -42
  473. package/tests/unit/components/Step.nuxt.test.js +0 -51
  474. package/tests/unit/components/Stepper.nuxt.test.js +0 -41
  475. package/tests/unit/components/ToolPanel.nuxt.test.js +0 -66
  476. package/tests/unit/composables/api_fetch.nuxt.test.js +0 -75
  477. package/tests/unit/composables/project_manager.nuxt.test.js +0 -299
  478. package/tests/unit/composables/run_function_when_microservices_connected.nuxt.test.js +0 -57
  479. package/tests/unit/composables/upload_file.nuxt.test.js +0 -45
  480. package/tests/unit/composables/virtual_tree.nuxt.test.js +0 -63
  481. package/tests/unit/plugins/project_load.nuxt.test.js +0 -98
  482. package/tests/unit/stores/app.nuxt.test.js +0 -189
  483. package/tests/unit/stores/back.nuxt.test.js +0 -147
  484. package/tests/unit/stores/cloud.nuxt.test.js +0 -90
  485. package/tests/unit/stores/data.nuxt.test.js +0 -162
  486. package/tests/unit/stores/feedback.nuxt.test.js +0 -90
  487. package/tests/unit/stores/infra.nuxt.test.js +0 -313
  488. package/tests/unit/stores/treeview.nuxt.test.js +0 -63
  489. package/tests/unit/stores/viewer.nuxt.test.js +0 -161
  490. package/tests/unit/utils/validate_schema.nuxt.test.js +0 -38
  491. package/tests/utils.js +0 -20
  492. package/tests/vitest.config.js +0 -67
  493. /package/server/api/local/app/{kill.post.js → kill.post.ts} +0 -0
  494. /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 };