@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.
- package/.build/opengeodeweb_front_schemas.js +175 -0
- package/.build/server/utils/app_config.js +57 -0
- package/.build/server/utils/cleanup.js +135 -0
- package/.build/server/utils/cloud.js +156 -0
- package/.build/server/utils/microservices.js +153 -0
- package/.build/server/utils/path.js +108 -0
- package/.build/server/utils/scripts.js +134 -0
- package/.build/server/utils/server.js +44 -0
- package/.build/server/utils/server_config.js +51 -0
- package/.build/server/utils/stream.js +6 -0
- package/.build/server/utils/ws_client.js +100 -0
- package/.build/shared/app_mode.js +8 -0
- package/.build/shared/scripts.js +49 -0
- package/.build/shared/utils/call_raw.js +31 -0
- package/.build/shared/utils/call_schema.js +28 -0
- package/.build/shared/utils/fetch_raw.js +52 -0
- package/.build/shared/utils/fetch_schema.js +32 -0
- package/.build/shared/utils/file.js +14 -0
- package/.build/shared/utils/parse_boolean.js +23 -0
- package/.build/shared/utils/response_handlers/load.js +50 -0
- package/.build/shared/utils/types.js +1 -0
- package/.build/shared/utils/validate_schema.js +17 -0
- package/README.md +8 -0
- package/app/assets/{geode_objects.js → geode_objects.ts} +8 -1
- package/app/components/ActionButton.vue +28 -12
- package/app/components/Basic/Slider.vue +2 -2
- package/app/components/Basic/Switch.vue +2 -2
- package/app/components/CameraManager/List.vue +11 -11
- package/app/components/CameraManager/Saver.vue +8 -4
- package/app/components/CameraManager.vue +24 -12
- package/app/components/CameraOrientation.vue +31 -17
- package/app/components/ClippingPlaneCard.vue +13 -12
- package/app/components/ClippingPlanes.vue +31 -21
- package/app/components/CrsSelector.vue +26 -18
- package/app/components/DeleteDialog.vue +18 -16
- package/app/components/DragAndDrop.vue +55 -37
- package/app/components/DragAndDropInternal/DragAndDropInline.vue +31 -16
- package/app/components/DragAndDropInternal/DragAndDropOverlay.vue +32 -19
- package/app/components/ExtensionSelector.vue +34 -18
- package/app/components/FeedBack/ErrorBanner.vue +4 -3
- package/app/components/FeedBack/Snackers.vue +6 -5
- package/app/components/FetchingData.vue +8 -12
- package/app/components/FileSelector.vue +27 -17
- package/app/components/FileUploader.vue +51 -30
- package/app/components/GlassCard.vue +17 -13
- package/app/components/HybridRenderingView.vue +25 -12
- package/app/components/HybridViewerTooltip.vue +28 -26
- package/app/components/InfraConnected.vue +1 -1
- package/app/components/Launcher.vue +12 -10
- package/app/components/Loading/EcoMessages.vue +24 -13
- package/app/components/Loading/Header.vue +6 -7
- package/app/components/Loading/Progress.vue +6 -7
- package/app/components/Loading.vue +10 -14
- package/app/components/MissingFilesSelector.vue +35 -19
- package/app/components/ObjectSelector.vue +37 -21
- package/app/components/PackagesVersions.vue +16 -8
- package/app/components/Recaptcha.vue +17 -23
- package/app/components/RemoteRenderingView.vue +21 -15
- package/app/components/Ruler.vue +11 -9
- package/app/components/Screenshot.vue +25 -19
- package/app/components/SearchBar.vue +12 -6
- package/app/components/ShrinkFilter.vue +19 -14
- package/app/components/Step.vue +32 -12
- package/app/components/Stepper.vue +19 -7
- package/app/components/ToolPanel.vue +29 -13
- package/app/components/ViewToolbar.vue +53 -44
- package/app/components/Viewer/ContextMenu/CenterButton.vue +16 -9
- package/app/components/Viewer/ContextMenu/CircularItems.vue +13 -10
- package/app/components/Viewer/ContextMenu/ContextMenu.vue +40 -32
- package/app/components/Viewer/ContextMenu/ContextMenuItem.vue +31 -17
- package/app/components/Viewer/ContextMenu/InfoCard.vue +38 -22
- package/app/components/Viewer/EdgedCurve/PointsOptions.vue +8 -5
- package/app/components/Viewer/EdgedCurve/SpecificEdgesOptions.vue +67 -48
- package/app/components/Viewer/Generic/Mesh/CellsOptions.vue +74 -50
- package/app/components/Viewer/Generic/Mesh/EdgesOptions.vue +69 -50
- package/app/components/Viewer/Generic/Mesh/PointsOptions.vue +47 -35
- package/app/components/Viewer/Generic/Mesh/PolygonsOptions.vue +91 -51
- package/app/components/Viewer/Generic/Mesh/PolyhedraOptions.vue +74 -49
- package/app/components/Viewer/Generic/Model/BlocksOptions.vue +115 -53
- package/app/components/Viewer/Generic/Model/CornersOptions.vue +75 -37
- package/app/components/Viewer/Generic/Model/EdgesOptions.vue +13 -9
- package/app/components/Viewer/Generic/Model/LinesOptions.vue +110 -61
- package/app/components/Viewer/Generic/Model/ModelStyleCard.vue +32 -21
- package/app/components/Viewer/Generic/Model/ModelStyleOptions.vue +9 -5
- package/app/components/Viewer/Generic/Model/PointsOptions.vue +19 -13
- package/app/components/Viewer/Generic/Model/SurfacesOptions.vue +119 -49
- package/app/components/Viewer/Grid/2D/CellsOptions.vue +8 -5
- package/app/components/Viewer/Grid/2D/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Grid/2D/PointsOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/CellsOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/FacetsOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/PointsOptions.vue +8 -5
- package/app/components/Viewer/ObjectTree/Base/CommonTreeView.vue +120 -76
- package/app/components/Viewer/ObjectTree/Base/Controls.vue +25 -10
- package/app/components/Viewer/ObjectTree/Base/ItemLabel.vue +42 -17
- package/app/components/Viewer/ObjectTree/Base/StickyHeader.vue +22 -9
- package/app/components/Viewer/ObjectTree/Base/TreeRow.vue +29 -14
- package/app/components/Viewer/ObjectTree/Box.vue +32 -15
- package/app/components/Viewer/ObjectTree/Layout.vue +55 -35
- package/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue +63 -34
- package/app/components/Viewer/ObjectTree/Views/{ModelCollections.vue → ModelTree.vue} +101 -39
- package/app/components/Viewer/Options/AttributeColorBar.vue +14 -6
- package/app/components/Viewer/Options/AttributeRangeSelector.vue +8 -4
- package/app/components/Viewer/Options/AttributeSelector.vue +64 -33
- package/app/components/Viewer/Options/ColorMapList.vue +52 -24
- package/app/components/Viewer/Options/ColorMapPicker.vue +15 -11
- package/app/components/Viewer/Options/ColorPicker.vue +239 -50
- package/app/components/Viewer/Options/ColoringTypeSelector.vue +87 -67
- package/app/components/Viewer/Options/ColormapQuickPicker.vue +16 -12
- package/app/components/Viewer/Options/OptionsSection.vue +7 -5
- package/app/components/Viewer/Options/Sliders/Size.vue +3 -3
- package/app/components/Viewer/Options/Sliders/Slider.vue +9 -6
- package/app/components/Viewer/Options/Sliders/Width.vue +3 -3
- package/app/components/Viewer/Options/TextureItem.vue +29 -22
- package/app/components/Viewer/Options/TexturesSelector.vue +23 -12
- package/app/components/Viewer/Options/VisibilitySwitch.vue +3 -3
- package/app/components/Viewer/OverlappingObjectsPicker.vue +27 -12
- package/app/components/Viewer/PointSet/SpecificPointsOptions.vue +38 -26
- package/app/components/Viewer/Solid/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Solid/PointsOptions.vue +8 -5
- package/app/components/Viewer/Solid/PolygonsOptions.vue +8 -5
- package/app/components/Viewer/Solid/SpecificPolyhedraOptions.vue +73 -48
- package/app/components/Viewer/Surface/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Surface/PointsOptions.vue +8 -5
- package/app/components/Viewer/Surface/PolygonsOptions.vue +79 -49
- package/app/components/Viewer/Surface/Triangulated/TrianglesOptions.vue +8 -5
- package/app/components/Viewer/TetrahedralSolid/TetrahedraOptions.vue +8 -5
- package/app/components/Viewer/TetrahedralSolid/TrianglesOptions.vue +8 -5
- package/app/components/Viewer/Ui.vue +19 -14
- package/app/components/Wrapper.vue +16 -10
- package/app/components/ZScaling.vue +18 -10
- package/app/components/csv-preview/CsvPreviewer.vue +72 -50
- package/app/components/csv-preview/CsvSettings.vue +30 -50
- package/app/components/csv-preview/CsvTable.vue +34 -14
- package/app/composables/{batch_style.js → batch_style.ts} +9 -7
- package/app/composables/clipping_planes_widget.ts +204 -0
- package/app/composables/clipping_planes_widget_entries.ts +189 -0
- package/app/composables/copy_to_clipboard.ts +7 -0
- package/app/composables/global_attribute_style.ts +303 -0
- package/app/composables/hover_highlight.ts +127 -0
- package/app/composables/{model_collections.js → model_collections.ts} +28 -9
- package/app/composables/{model_components.js → model_components.ts} +28 -9
- package/app/composables/{project_manager.js → project_manager.ts} +77 -20
- package/app/composables/responsive_middle_truncate.ts +48 -0
- package/app/composables/{run_function_when_microservices_connected.js → run_function_when_microservices_connected.ts} +1 -1
- package/app/composables/stepper_tree.ts +79 -0
- package/app/composables/tree_filter.ts +194 -0
- package/app/composables/{tree_keyboard_nav.js → tree_keyboard_nav.ts} +62 -20
- package/app/composables/{tree_scroll.js → tree_scroll.ts} +61 -12
- package/app/composables/use_adaptive_styles.ts +186 -0
- package/app/composables/use_overlapping_picker.ts +263 -0
- package/app/composables/use_quick_colormap.ts +55 -0
- package/app/composables/virtual_tree.ts +271 -0
- package/app/composables/vtk_implicit_plane_widget.d.ts +2 -0
- package/app/plugins/{auto_store_register.js → auto_store_register.ts} +3 -5
- package/app/plugins/click_outside_ignore_snackbars.client.ts +36 -0
- package/app/stores/app.ts +252 -0
- package/app/stores/app_helpers/extension.ts +179 -0
- package/app/stores/{back.js → back.ts} +54 -28
- package/app/stores/camera_manager.ts +80 -0
- package/app/stores/{cloud.js → cloud.ts} +18 -13
- package/app/stores/data.ts +392 -0
- package/app/stores/data_helpers/collections.ts +138 -0
- package/app/stores/data_helpers/mesh.ts +169 -0
- package/app/stores/data_style.ts +167 -0
- package/app/stores/{feedback.js → feedback.ts} +19 -8
- package/app/stores/{hybrid_viewer.js → hybrid_viewer.ts} +49 -45
- package/app/stores/infra.ts +106 -0
- package/app/stores/{menu.js → menu.ts} +67 -36
- package/app/stores/treeview.ts +383 -0
- package/app/stores/{viewer.js → viewer.ts} +75 -42
- package/app/utils/attributes.ts +40 -0
- package/app/utils/clipping_planes.ts +222 -0
- package/app/utils/color_picker.js +54 -0
- package/app/utils/colormap.ts +102 -0
- package/app/utils/default_styles/{constants.js → constants.ts} +25 -12
- package/app/utils/default_styles/{index.js → index.ts} +4 -3
- package/app/utils/default_styles/meshes.ts +264 -0
- package/app/utils/default_styles/{models.js → models.ts} +106 -52
- package/app/utils/{extension.js → extension.ts} +63 -19
- package/app/utils/{import_workflow.js → import_workflow.ts} +39 -22
- package/app/utils/{log.js → log.ts} +12 -2
- package/app/utils/{name_cleaner.js → name_cleaner.ts} +6 -6
- package/app/utils/status.ts +19 -0
- package/app/utils/{stores.js → stores.ts} +5 -5
- package/app/utils/{string.js → string.ts} +6 -6
- package/app/utils/{treeview.js → treeview.ts} +4 -1
- package/internal/database/{base_database.js → base_database.ts} +7 -3
- package/internal/database/database.ts +102 -0
- package/internal/database/{extended_database.js → extended_database.ts} +5 -1
- package/internal/database/tables/camera_positions.ts +6 -0
- package/internal/database/tables/{data.js → data.ts} +3 -1
- package/internal/database/tables/data_style.ts +6 -0
- package/internal/database/tables/model_component_datastyle.ts +6 -0
- package/internal/database/tables/model_component_type_datastyle.ts +6 -0
- package/internal/database/tables/model_components.ts +6 -0
- package/internal/database/tables/model_components_relation.ts +6 -0
- package/internal/database/tables/table_definition.ts +5 -0
- package/internal/stores/data_style/mesh/cells/cell.ts +279 -0
- package/internal/stores/data_style/mesh/cells/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/cells/common.ts +50 -0
- package/internal/stores/data_style/mesh/cells/index.ts +161 -0
- package/internal/stores/data_style/mesh/cells/{textures.js → textures.ts} +14 -8
- package/internal/stores/data_style/mesh/cells/vertex.ts +285 -0
- package/internal/stores/data_style/mesh/cells/visibility.ts +46 -0
- package/internal/stores/data_style/mesh/edges/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/edges/common.ts +41 -0
- package/internal/stores/data_style/mesh/edges/edge.ts +279 -0
- package/internal/stores/data_style/mesh/edges/index.ts +155 -0
- package/internal/stores/data_style/mesh/edges/vertex.ts +285 -0
- package/internal/stores/data_style/mesh/edges/visibility.ts +45 -0
- package/internal/stores/data_style/mesh/edges/width.ts +42 -0
- package/internal/stores/data_style/mesh/{index.js → index.ts} +34 -14
- package/internal/stores/data_style/mesh/points/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/points/common.ts +51 -0
- package/internal/stores/data_style/mesh/points/index.ts +133 -0
- package/internal/stores/data_style/mesh/points/size.ts +43 -0
- package/internal/stores/data_style/mesh/points/vertex.ts +285 -0
- package/internal/stores/data_style/mesh/points/visibility.ts +49 -0
- package/internal/stores/data_style/mesh/polygons/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/polygons/common.ts +50 -0
- package/internal/stores/data_style/mesh/polygons/index.ts +167 -0
- package/internal/stores/data_style/mesh/polygons/polygon.ts +282 -0
- package/internal/stores/data_style/mesh/polygons/{textures.js → textures.ts} +14 -8
- package/internal/stores/data_style/mesh/polygons/vertex.ts +288 -0
- package/internal/stores/data_style/mesh/polygons/visibility.ts +48 -0
- package/internal/stores/data_style/mesh/polyhedra/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/polyhedra/common.ts +41 -0
- package/internal/stores/data_style/mesh/polyhedra/index.ts +157 -0
- package/internal/stores/data_style/mesh/polyhedra/polyhedron.ts +294 -0
- package/internal/stores/data_style/mesh/polyhedra/vertex.ts +288 -0
- package/internal/stores/data_style/mesh/polyhedra/visibility.ts +48 -0
- package/internal/stores/data_style/model/blocks/{color.js → color.ts} +50 -13
- package/internal/stores/data_style/model/blocks/common.ts +67 -0
- package/internal/stores/data_style/model/blocks/{index.js → index.ts} +111 -66
- package/internal/stores/data_style/model/blocks/polyhedron.ts +363 -0
- package/internal/stores/data_style/model/blocks/vertex.ts +349 -0
- package/internal/stores/data_style/model/blocks/visibility.ts +37 -0
- package/internal/stores/data_style/model/color.ts +348 -0
- package/internal/stores/data_style/model/common.ts +262 -0
- package/internal/stores/data_style/model/corners/{color.js → color.ts} +49 -10
- package/internal/stores/data_style/model/corners/common.ts +71 -0
- package/internal/stores/data_style/model/corners/{index.js → index.ts} +86 -47
- package/internal/stores/data_style/model/corners/vertex.ts +315 -0
- package/internal/stores/data_style/model/corners/visibility.ts +39 -0
- package/internal/stores/data_style/model/edges/common.ts +29 -0
- package/internal/stores/data_style/model/edges/{index.js → index.ts} +2 -7
- package/internal/stores/data_style/model/edges/visibility.ts +55 -0
- package/internal/stores/data_style/model/{index.js → index.ts} +24 -11
- package/internal/stores/data_style/model/lines/{color.js → color.ts} +47 -10
- package/internal/stores/data_style/model/lines/common.ts +63 -0
- package/internal/stores/data_style/model/lines/edge.ts +343 -0
- package/internal/stores/data_style/model/lines/{index.js → index.ts} +108 -66
- package/internal/stores/data_style/model/lines/vertex.ts +344 -0
- package/internal/stores/data_style/model/lines/visibility.ts +37 -0
- package/internal/stores/data_style/model/points/common.ts +25 -0
- package/internal/stores/data_style/model/points/index.ts +35 -0
- package/internal/stores/data_style/model/points/size.ts +44 -0
- package/internal/stores/data_style/model/points/visibility.ts +46 -0
- package/internal/stores/data_style/model/selection.ts +138 -0
- package/internal/stores/data_style/model/surfaces/{color.js → color.ts} +47 -10
- package/internal/stores/data_style/model/surfaces/common.ts +69 -0
- package/internal/stores/data_style/model/surfaces/{index.js → index.ts} +113 -66
- package/internal/stores/data_style/model/surfaces/polygon.ts +347 -0
- package/internal/stores/data_style/model/surfaces/vertex.ts +351 -0
- package/internal/stores/data_style/model/surfaces/visibility.ts +37 -0
- package/internal/stores/data_style/model/{visibility.js → visibility.ts} +112 -32
- package/internal/stores/data_style/state.ts +281 -0
- package/internal/stores/data_style/types.ts +30 -0
- package/internal/stores/hybrid_viewer/brightness.ts +124 -0
- package/internal/stores/hybrid_viewer/camera.ts +326 -0
- package/internal/stores/hybrid_viewer/{camera_animation.js → camera_animation.ts} +30 -12
- package/internal/stores/hybrid_viewer/{constants.js → constants.ts} +2 -2
- package/internal/stores/hybrid_viewer/core.ts +64 -0
- package/internal/stores/hybrid_viewer/{filters.js → filters.ts} +10 -13
- package/internal/stores/hybrid_viewer/highlight.ts +183 -0
- package/internal/stores/hybrid_viewer/{ruler.js → ruler.ts} +50 -22
- package/internal/stores/hybrid_viewer/scene.ts +125 -0
- package/internal/stores/hybrid_viewer/viewport.ts +177 -0
- package/internal/stores/hybrid_viewer/vtk_types.ts +58 -0
- package/internal/utils/api_fetch.ts +133 -0
- package/internal/utils/upload_file.ts +115 -0
- package/internal/utils/viewer_call.ts +99 -0
- package/internal/utils/ws_client.ts +54 -0
- package/nuxt.config.ts +168 -0
- package/opengeodeweb_front_schemas.json +2 -2
- package/package.json +49 -13
- package/server/api/cloud/extensions/{run.post.js → run.post.ts} +16 -12
- package/server/api/local/app/project_folder_path.post.ts +33 -0
- package/server/api/local/app/run_back.post.ts +39 -0
- package/server/api/local/app/run_viewer.post.ts +39 -0
- package/server/api/local/extensions/{kill.post.js → kill.post.ts} +15 -8
- package/server/api/local/extensions/{run.post.js → run.post.ts} +17 -12
- package/server/api/local/extensions/upload.put.ts +71 -0
- package/server/api/microservice/app/{get_is_app_ready.get.js → get_is_app_ready.get.ts} +5 -5
- package/server/api/microservice/app/schemas/get_is_app_ready.json +1 -1
- package/server/api/microservice/app/set_app_base_url.post.ts +29 -0
- package/server/api/microservice/app/set_back_base_url.post.ts +26 -0
- package/server/api/microservice/app/set_is_app_ready.post.ts +29 -0
- package/server/api/microservice/app/set_viewer_base_url.post.ts +26 -0
- package/server/api/microservice/extensions/{download.post.js → download.post.ts} +13 -6
- package/server/api/serverless/run_cloud.post.ts +92 -0
- package/server/utils/{app_config.js → app_config.ts} +40 -18
- package/server/utils/{cleanup.js → cleanup.ts} +76 -29
- package/server/utils/{cloud.js → cloud.ts} +33 -17
- package/server/utils/{extension.js → extension.ts} +31 -4
- package/server/utils/{microservices.js → microservices.ts} +68 -27
- package/server/utils/{path.js → path.ts} +36 -17
- package/server/utils/{scripts.js → scripts.ts} +49 -33
- package/server/utils/{server.js → server.ts} +13 -6
- package/server/utils/server_config.ts +74 -0
- package/server/utils/stream.ts +6 -0
- package/server/utils/ws_client.ts +165 -0
- package/shared/{scripts.js → scripts.ts} +15 -10
- package/shared/utils/call_raw.ts +73 -0
- package/shared/utils/{call_schema.js → call_schema.ts} +15 -6
- package/shared/utils/fetch_raw.ts +125 -0
- package/shared/utils/{fetch_schema.js → fetch_schema.ts} +16 -7
- package/shared/utils/file.ts +22 -0
- package/shared/utils/{parse_boolean.js → parse_boolean.ts} +1 -1
- package/shared/utils/response_handlers/load.ts +109 -0
- package/shared/utils/types.ts +27 -0
- package/shared/utils/{validate_schema.js → validate_schema.ts} +3 -1
- package/.github/workflows/config.json +0 -5
- package/.github/workflows/deploy.yml +0 -15
- package/.github/workflows/manual_release.yml +0 -11
- package/.github/workflows/merge_request.yml +0 -9
- package/.github/workflows/pr_update.yml +0 -11
- package/.github/workflows/prepare_deploy.yml +0 -9
- package/.github/workflows/schedule.yml +0 -18
- package/.github/workflows/test.yml +0 -14
- package/.github/workflows/test_pr.yml +0 -12
- package/.oxlintrc.json +0 -150
- package/.releaserc +0 -11
- package/app/components/Viewer/ObjectTree/Views/ModelComponents.vue +0 -224
- package/app/composables/clipping_planes_widget.js +0 -249
- package/app/composables/global_attribute_style.js +0 -181
- package/app/composables/hover_highlight.js +0 -91
- package/app/composables/responsive_middle_truncate.js +0 -34
- package/app/composables/stepper_tree.js +0 -56
- package/app/composables/tree_filter.js +0 -138
- package/app/composables/use_adaptive_styles.js +0 -120
- package/app/composables/use_overlapping_picker.js +0 -169
- package/app/composables/use_quick_colormap.js +0 -32
- package/app/composables/virtual_tree.js +0 -191
- package/app/stores/app.js +0 -326
- package/app/stores/camera_manager.js +0 -57
- package/app/stores/data.js +0 -278
- package/app/stores/data_helpers/collections.js +0 -96
- package/app/stores/data_helpers/mesh.js +0 -122
- package/app/stores/data_style.js +0 -116
- package/app/stores/infra.js +0 -95
- package/app/stores/treeview.js +0 -290
- package/app/utils/attributes.js +0 -23
- package/app/utils/clipping_planes.js +0 -110
- package/app/utils/colormap.js +0 -64
- package/app/utils/default_styles/meshes.js +0 -191
- package/app/utils/status.js +0 -10
- package/commitlint.config.js +0 -20
- package/internal/database/database.js +0 -80
- package/internal/database/tables/camera_positions.js +0 -4
- package/internal/database/tables/data_style.js +0 -4
- package/internal/database/tables/model_component_datastyle.js +0 -4
- package/internal/database/tables/model_component_type_datastyle.js +0 -4
- package/internal/database/tables/model_components.js +0 -4
- package/internal/database/tables/model_components_relation.js +0 -4
- package/internal/stores/data_style/mesh/cells/cell.js +0 -196
- package/internal/stores/data_style/mesh/cells/common.js +0 -39
- package/internal/stores/data_style/mesh/cells/index.js +0 -81
- package/internal/stores/data_style/mesh/cells/vertex.js +0 -193
- package/internal/stores/data_style/mesh/cells/visibility.js +0 -35
- package/internal/stores/data_style/mesh/edges/common.js +0 -32
- package/internal/stores/data_style/mesh/edges/edge.js +0 -195
- package/internal/stores/data_style/mesh/edges/index.js +0 -81
- package/internal/stores/data_style/mesh/edges/vertex.js +0 -196
- package/internal/stores/data_style/mesh/edges/visibility.js +0 -34
- package/internal/stores/data_style/mesh/edges/width.js +0 -34
- package/internal/stores/data_style/mesh/points/common.js +0 -37
- package/internal/stores/data_style/mesh/points/index.js +0 -82
- package/internal/stores/data_style/mesh/points/size.js +0 -35
- package/internal/stores/data_style/mesh/points/vertex.js +0 -193
- package/internal/stores/data_style/mesh/points/visibility.js +0 -37
- package/internal/stores/data_style/mesh/polygons/common.js +0 -32
- package/internal/stores/data_style/mesh/polygons/index.js +0 -107
- package/internal/stores/data_style/mesh/polygons/polygon.js +0 -196
- package/internal/stores/data_style/mesh/polygons/vertex.js +0 -196
- package/internal/stores/data_style/mesh/polygons/visibility.js +0 -38
- package/internal/stores/data_style/mesh/polyhedra/common.js +0 -32
- package/internal/stores/data_style/mesh/polyhedra/index.js +0 -98
- package/internal/stores/data_style/mesh/polyhedra/polyhedron.js +0 -196
- package/internal/stores/data_style/mesh/polyhedra/vertex.js +0 -196
- package/internal/stores/data_style/mesh/polyhedra/visibility.js +0 -38
- package/internal/stores/data_style/model/blocks/common.js +0 -51
- package/internal/stores/data_style/model/blocks/polyhedron.js +0 -215
- package/internal/stores/data_style/model/blocks/vertex.js +0 -204
- package/internal/stores/data_style/model/blocks/visibility.js +0 -20
- package/internal/stores/data_style/model/color.js +0 -218
- package/internal/stores/data_style/model/common.js +0 -141
- package/internal/stores/data_style/model/corners/common.js +0 -51
- package/internal/stores/data_style/model/corners/vertex.js +0 -204
- package/internal/stores/data_style/model/corners/visibility.js +0 -20
- package/internal/stores/data_style/model/edges/common.js +0 -20
- package/internal/stores/data_style/model/edges/visibility.js +0 -38
- package/internal/stores/data_style/model/lines/common.js +0 -51
- package/internal/stores/data_style/model/lines/edge.js +0 -203
- package/internal/stores/data_style/model/lines/vertex.js +0 -204
- package/internal/stores/data_style/model/lines/visibility.js +0 -20
- package/internal/stores/data_style/model/points/common.js +0 -20
- package/internal/stores/data_style/model/points/index.js +0 -25
- package/internal/stores/data_style/model/points/size.js +0 -36
- package/internal/stores/data_style/model/points/visibility.js +0 -36
- package/internal/stores/data_style/model/selection.js +0 -89
- package/internal/stores/data_style/model/surfaces/common.js +0 -51
- package/internal/stores/data_style/model/surfaces/polygon.js +0 -215
- package/internal/stores/data_style/model/surfaces/vertex.js +0 -215
- package/internal/stores/data_style/model/surfaces/visibility.js +0 -20
- package/internal/stores/data_style/state.js +0 -197
- package/internal/stores/hybrid_viewer/brightness.js +0 -82
- package/internal/stores/hybrid_viewer/camera.js +0 -274
- package/internal/stores/hybrid_viewer/highlight.js +0 -170
- package/internal/stores/hybrid_viewer/scene.js +0 -136
- package/internal/stores/hybrid_viewer/viewport.js +0 -140
- package/internal/utils/api_fetch.js +0 -52
- package/internal/utils/upload_file.js +0 -57
- package/internal/utils/viewer_call.js +0 -49
- package/internal/utils/ws_client.js +0 -29
- package/nuxt.config.js +0 -106
- package/scripts/generate_geode_objects.js +0 -24
- package/server/api/local/app/project_folder_path.post.js +0 -29
- package/server/api/local/app/run_back.post.js +0 -33
- package/server/api/local/app/run_viewer.post.js +0 -33
- package/server/api/local/extensions/upload.put.js +0 -72
- package/server/api/microservice/app/set_app_base_url.post.js +0 -25
- package/server/api/microservice/app/set_back_base_url.post.js +0 -22
- package/server/api/microservice/app/set_is_app_ready.post.js +0 -25
- package/server/api/microservice/app/set_viewer_base_url.post.js +0 -22
- package/server/api/serverless/run_cloud.post.js +0 -44
- package/server/utils/server_config.js +0 -58
- package/server/utils/ws_client.js +0 -112
- package/shared/utils/call_raw.js +0 -46
- package/shared/utils/fetch_raw.js +0 -61
- package/shared/utils/file.js +0 -16
- package/shared/utils/response_handlers/load.js +0 -74
- package/tests/integration/data/uploads/test.og_brep +0 -0
- package/tests/integration/data/uploads/test.og_edc2d +0 -0
- package/tests/integration/data/uploads/test.og_edc3d +0 -0
- package/tests/integration/data/uploads/test.og_psf3d +0 -0
- package/tests/integration/data/uploads/test.og_rgd2d +0 -0
- package/tests/integration/data/uploads/test.og_rgd3d +0 -0
- package/tests/integration/data/uploads/test.vtu +0 -22
- package/tests/integration/setup.js +0 -92
- package/tests/integration/stores/data_style/mesh/cells.nuxt.test.js +0 -343
- package/tests/integration/stores/data_style/mesh/edges.nuxt.test.js +0 -254
- package/tests/integration/stores/data_style/mesh/index.nuxt.test.js +0 -62
- package/tests/integration/stores/data_style/mesh/points.nuxt.test.js +0 -201
- package/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js +0 -260
- package/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js +0 -267
- package/tests/integration/stores/data_style/model/blocks.nuxt.test.js +0 -397
- package/tests/integration/stores/data_style/model/corners.nuxt.test.js +0 -264
- package/tests/integration/stores/data_style/model/edges.nuxt.test.js +0 -71
- package/tests/integration/stores/data_style/model/index.nuxt.test.js +0 -92
- package/tests/integration/stores/data_style/model/lines.nuxt.test.js +0 -379
- package/tests/integration/stores/data_style/model/points.nuxt.test.js +0 -95
- package/tests/integration/stores/data_style/model/surfaces.nuxt.test.js +0 -574
- package/tests/integration/stores/viewer.nuxt.test.js +0 -69
- package/tests/setup_indexeddb.js +0 -4
- package/tests/unit/components/CrsSelector.nuxt.test.js +0 -55
- package/tests/unit/components/DragAndDrop.nuxt.test.js +0 -89
- package/tests/unit/components/ExtensionSelector.nuxt.test.js +0 -65
- package/tests/unit/components/FeedBack/ErrorsBanner.nuxt.test.js +0 -41
- package/tests/unit/components/FeedBack/Snackers.nuxt.test.js +0 -49
- package/tests/unit/components/FileSelector.nuxt.test.js +0 -124
- package/tests/unit/components/FileUploader.nuxt.test.js +0 -69
- package/tests/unit/components/MissingFilesSelector.nuxt.test.js +0 -77
- package/tests/unit/components/ObjectSelector.nuxt.test.js +0 -118
- package/tests/unit/components/PackagesVersions.nuxt.test.js +0 -42
- package/tests/unit/components/Step.nuxt.test.js +0 -51
- package/tests/unit/components/Stepper.nuxt.test.js +0 -41
- package/tests/unit/components/ToolPanel.nuxt.test.js +0 -66
- package/tests/unit/composables/api_fetch.nuxt.test.js +0 -75
- package/tests/unit/composables/project_manager.nuxt.test.js +0 -299
- package/tests/unit/composables/run_function_when_microservices_connected.nuxt.test.js +0 -57
- package/tests/unit/composables/upload_file.nuxt.test.js +0 -45
- package/tests/unit/composables/virtual_tree.nuxt.test.js +0 -63
- package/tests/unit/plugins/project_load.nuxt.test.js +0 -98
- package/tests/unit/stores/app.nuxt.test.js +0 -189
- package/tests/unit/stores/back.nuxt.test.js +0 -147
- package/tests/unit/stores/cloud.nuxt.test.js +0 -90
- package/tests/unit/stores/data.nuxt.test.js +0 -162
- package/tests/unit/stores/feedback.nuxt.test.js +0 -90
- package/tests/unit/stores/infra.nuxt.test.js +0 -313
- package/tests/unit/stores/treeview.nuxt.test.js +0 -63
- package/tests/unit/stores/viewer.nuxt.test.js +0 -161
- package/tests/unit/utils/validate_schema.nuxt.test.js +0 -38
- package/tests/utils.js +0 -20
- package/tests/vitest.config.js +0 -67
- /package/server/api/local/app/{kill.post.js → kill.post.ts} +0 -0
- /package/shared/{app_mode.js → app_mode.ts} +0 -0
|
@@ -7,32 +7,42 @@ import path from "node:path";
|
|
|
7
7
|
import back_schemas from "@geode/opengeodeweb-back/opengeodeweb_back_schemas.json" with { type: "json" };
|
|
8
8
|
|
|
9
9
|
// Local imports
|
|
10
|
+
import { type Microservice, microservicesMetadatasPath, projectMicroservices } from "./cleanup.js";
|
|
11
|
+
import { type NamedChildProcess, getAvailablePort, waitForReady } from "./scripts.js";
|
|
10
12
|
import { addNginxLocation, addSupervisorProgram } from "./cloud.js";
|
|
11
|
-
import { getAvailablePort, waitForReady } from "./scripts.js";
|
|
12
|
-
import { microservicesMetadatasPath, projectMicroservices } from "./cleanup.js";
|
|
13
13
|
import { executablePath } from "./path.js";
|
|
14
14
|
|
|
15
|
+
interface RunArgs {
|
|
16
|
+
projectFolderPath: string;
|
|
17
|
+
uploadFolderPath?: string;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
|
|
15
21
|
const MILLISECONDS_PER_SECOND = 1000;
|
|
16
22
|
const DEFAULT_TIMEOUT_SECONDS = 45;
|
|
17
23
|
const MAX_PORT_RETRIES = 1;
|
|
24
|
+
const DEFAULT_RUN_ARGS: RunArgs = { projectFolderPath: "" };
|
|
25
|
+
|
|
18
26
|
async function runScript(
|
|
19
|
-
execPath,
|
|
20
|
-
execName,
|
|
21
|
-
args,
|
|
22
|
-
expectedResponse,
|
|
27
|
+
execPath: string,
|
|
28
|
+
execName: string,
|
|
29
|
+
args: readonly string[],
|
|
30
|
+
expectedResponse: string,
|
|
23
31
|
timeoutSeconds = DEFAULT_TIMEOUT_SECONDS,
|
|
24
|
-
) {
|
|
32
|
+
): Promise<NamedChildProcess> {
|
|
25
33
|
const command = executablePath(execPath, execName);
|
|
26
34
|
console.log("runScript", command, args);
|
|
27
35
|
const child = child_process.spawn(command, args, {
|
|
28
36
|
stdio: ["ignore", "pipe", "pipe"],
|
|
29
|
-
});
|
|
37
|
+
}) as NamedChildProcess;
|
|
30
38
|
child.name = command.replace(/^.*[\\/]/u, "");
|
|
31
39
|
child.on("spawn", () => {
|
|
32
40
|
console.log(`[${child.name}] spawned, pid=${child.pid}`);
|
|
33
41
|
});
|
|
34
42
|
const controller = new AbortController();
|
|
35
|
-
const timer = setTimeout(() =>
|
|
43
|
+
const timer = setTimeout(() => {
|
|
44
|
+
controller.abort();
|
|
45
|
+
}, timeoutSeconds * MILLISECONDS_PER_SECOND);
|
|
36
46
|
if (typeof timer.unref === "function") {
|
|
37
47
|
timer.unref();
|
|
38
48
|
}
|
|
@@ -46,16 +56,20 @@ async function runScript(
|
|
|
46
56
|
throw error;
|
|
47
57
|
}
|
|
48
58
|
}
|
|
49
|
-
|
|
50
|
-
|
|
59
|
+
|
|
60
|
+
function isPortInUseError(error: unknown): boolean {
|
|
61
|
+
return /EADDRINUSE|address already in use|port already in use/iu.test(String(error));
|
|
51
62
|
}
|
|
52
63
|
|
|
53
|
-
function backArgs(args, port) {
|
|
64
|
+
function backArgs(args: RunArgs, port: number): string[] {
|
|
54
65
|
const { projectFolderPath } = args;
|
|
55
66
|
if (!projectFolderPath) {
|
|
56
67
|
throw new Error("projectFolderPath is required");
|
|
57
68
|
}
|
|
58
|
-
const uploadFolderPath =
|
|
69
|
+
const uploadFolderPath =
|
|
70
|
+
args.uploadFolderPath !== undefined && args.uploadFolderPath !== ""
|
|
71
|
+
? args.uploadFolderPath
|
|
72
|
+
: path.join(projectFolderPath, "uploads");
|
|
59
73
|
const executableArgs = [
|
|
60
74
|
"--port",
|
|
61
75
|
String(port),
|
|
@@ -68,14 +82,19 @@ function backArgs(args, port) {
|
|
|
68
82
|
"--timeout",
|
|
69
83
|
"0",
|
|
70
84
|
];
|
|
71
|
-
if (process.env.NODE_ENV ===
|
|
85
|
+
if (process.env.NODE_ENV === undefined || process.env.NODE_ENV === "development") {
|
|
72
86
|
executableArgs.push("--debug");
|
|
73
87
|
}
|
|
74
88
|
return executableArgs;
|
|
75
89
|
}
|
|
76
90
|
|
|
77
|
-
async function runBack(
|
|
78
|
-
|
|
91
|
+
async function runBack(
|
|
92
|
+
execName: string,
|
|
93
|
+
execPath: string,
|
|
94
|
+
args: RunArgs = DEFAULT_RUN_ARGS,
|
|
95
|
+
attempts = 0,
|
|
96
|
+
): Promise<number> {
|
|
97
|
+
let port: number | undefined = undefined;
|
|
79
98
|
try {
|
|
80
99
|
port = await getAvailablePort();
|
|
81
100
|
const executableArgs = backArgs(args, port);
|
|
@@ -93,14 +112,20 @@ async function runBack(execName, execPath, args = {}, attempts = 0) {
|
|
|
93
112
|
return newPort;
|
|
94
113
|
}
|
|
95
114
|
}
|
|
115
|
+
throw new Error(`runBack failed to run ${execName}`);
|
|
96
116
|
}
|
|
97
117
|
|
|
98
|
-
async function runViewer(
|
|
118
|
+
async function runViewer(
|
|
119
|
+
execName: string,
|
|
120
|
+
execPath: string,
|
|
121
|
+
args: RunArgs = DEFAULT_RUN_ARGS,
|
|
122
|
+
attempts = 0,
|
|
123
|
+
): Promise<number> {
|
|
99
124
|
const { projectFolderPath } = args;
|
|
100
125
|
if (!projectFolderPath) {
|
|
101
126
|
throw new Error("projectFolderPath is required");
|
|
102
127
|
}
|
|
103
|
-
let port = undefined;
|
|
128
|
+
let port: number | undefined = undefined;
|
|
104
129
|
try {
|
|
105
130
|
port = await getAvailablePort();
|
|
106
131
|
const viewerArgs = [
|
|
@@ -116,7 +141,7 @@ async function runViewer(execName, execPath, args = {}, attempts = 0) {
|
|
|
116
141
|
return port;
|
|
117
142
|
} catch (error) {
|
|
118
143
|
if (!isPortInUseError(error)) {
|
|
119
|
-
console.log("
|
|
144
|
+
console.log("runViewer error", error);
|
|
120
145
|
throw error;
|
|
121
146
|
}
|
|
122
147
|
if (attempts <= MAX_PORT_RETRIES) {
|
|
@@ -125,10 +150,17 @@ async function runViewer(execName, execPath, args = {}, attempts = 0) {
|
|
|
125
150
|
return newPort;
|
|
126
151
|
}
|
|
127
152
|
}
|
|
153
|
+
throw new Error(`runViewer failed to run ${execName}`);
|
|
128
154
|
}
|
|
129
155
|
|
|
130
|
-
async function runExtension(
|
|
131
|
-
|
|
156
|
+
async function runExtension(
|
|
157
|
+
extensionId: string,
|
|
158
|
+
execName: string,
|
|
159
|
+
execPath: string,
|
|
160
|
+
args: RunArgs = DEFAULT_RUN_ARGS,
|
|
161
|
+
attempts = 0,
|
|
162
|
+
): Promise<number> {
|
|
163
|
+
let port: number | undefined = undefined;
|
|
132
164
|
try {
|
|
133
165
|
port = await getAvailablePort();
|
|
134
166
|
const executableArgs = backArgs(args, port);
|
|
@@ -139,7 +171,7 @@ async function runExtension(extensionId, execName, execPath, args = {}, attempts
|
|
|
139
171
|
return port;
|
|
140
172
|
} catch (error) {
|
|
141
173
|
if (!isPortInUseError(error)) {
|
|
142
|
-
console.log("
|
|
174
|
+
console.log("runExtension error", error);
|
|
143
175
|
throw error;
|
|
144
176
|
}
|
|
145
177
|
if (attempts <= MAX_PORT_RETRIES) {
|
|
@@ -148,18 +180,26 @@ async function runExtension(extensionId, execName, execPath, args = {}, attempts
|
|
|
148
180
|
return newPort;
|
|
149
181
|
}
|
|
150
182
|
}
|
|
183
|
+
throw new Error(`runExtension failed to run ${extensionId}`);
|
|
151
184
|
}
|
|
152
|
-
function addMicroserviceMetadatas(projectFolderPath, serviceObj) {
|
|
185
|
+
function addMicroserviceMetadatas(projectFolderPath: string, serviceObj: Microservice): void {
|
|
153
186
|
const microservices = projectMicroservices(projectFolderPath);
|
|
187
|
+
let enriched: Microservice = { ...serviceObj };
|
|
154
188
|
if (serviceObj.type === "back") {
|
|
155
189
|
const schema = back_schemas.opengeodeweb_back.kill;
|
|
156
|
-
serviceObj.url = `http://localhost:${serviceObj.port}/${schema.$id}`;
|
|
157
190
|
const [method] = schema.methods;
|
|
158
|
-
|
|
191
|
+
enriched = {
|
|
192
|
+
...enriched,
|
|
193
|
+
url: `http://localhost:${serviceObj.port}/${schema.$id}`,
|
|
194
|
+
method,
|
|
195
|
+
};
|
|
159
196
|
} else if (serviceObj.type === "viewer") {
|
|
160
|
-
|
|
197
|
+
enriched = {
|
|
198
|
+
...enriched,
|
|
199
|
+
url: `ws://localhost:${serviceObj.port}/ws`,
|
|
200
|
+
};
|
|
161
201
|
}
|
|
162
|
-
microservices.push(
|
|
202
|
+
microservices.push(enriched);
|
|
163
203
|
fs.writeFileSync(
|
|
164
204
|
microservicesMetadatasPath(projectFolderPath),
|
|
165
205
|
JSON.stringify(
|
|
@@ -171,4 +211,5 @@ function addMicroserviceMetadatas(projectFolderPath, serviceObj) {
|
|
|
171
211
|
),
|
|
172
212
|
);
|
|
173
213
|
}
|
|
214
|
+
|
|
174
215
|
export { addMicroserviceMetadatas, runBack, runExtension, runViewer };
|
|
@@ -8,17 +8,21 @@ import { setTimeout } from "node:timers/promises";
|
|
|
8
8
|
import { v4 as uuidv4 } from "uuid";
|
|
9
9
|
|
|
10
10
|
// Local imports
|
|
11
|
-
import { appMode } from "@geode/opengeodeweb-front/shared/app_mode.
|
|
12
|
-
import { commandExistsSync } from "./scripts.
|
|
11
|
+
import { appMode } from "@geode/opengeodeweb-front/shared/app_mode.ts";
|
|
12
|
+
import { commandExistsSync } from "./scripts.ts";
|
|
13
13
|
|
|
14
|
-
function executableName(execName) {
|
|
14
|
+
function executableName(execName: string): string {
|
|
15
15
|
if (process.platform === "win32") {
|
|
16
16
|
return `${execName}.exe`;
|
|
17
17
|
}
|
|
18
18
|
return execName;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
function findExecutableInDir(
|
|
21
|
+
function findExecutableInDir(
|
|
22
|
+
baseDir: string,
|
|
23
|
+
execName: string,
|
|
24
|
+
osExecutableName: string,
|
|
25
|
+
): string | undefined {
|
|
22
26
|
const oneFilePath = path.join(baseDir, osExecutableName);
|
|
23
27
|
if (fs.existsSync(oneFilePath) && fs.statSync(oneFilePath).isFile()) {
|
|
24
28
|
console.log(`[executablePath] Found OneFile executable: ${oneFilePath}`);
|
|
@@ -35,7 +39,7 @@ function findExecutableInDir(baseDir, execName, osExecutableName) {
|
|
|
35
39
|
return undefined;
|
|
36
40
|
}
|
|
37
41
|
|
|
38
|
-
function executablePath(execPath, execName) {
|
|
42
|
+
function executablePath(execPath: string, execName: string): string {
|
|
39
43
|
const osExecutableName = executableName(execName);
|
|
40
44
|
const resourcesPath = process.env.RESOURCES_PATH;
|
|
41
45
|
const mode = process.env.MODE;
|
|
@@ -49,13 +53,15 @@ function executablePath(execPath, execName) {
|
|
|
49
53
|
}
|
|
50
54
|
|
|
51
55
|
const foundAtExecPath = findExecutableInDir(execPath, execName, osExecutableName);
|
|
52
|
-
if (foundAtExecPath) {
|
|
56
|
+
if (foundAtExecPath !== undefined && foundAtExecPath !== "") {
|
|
53
57
|
return foundAtExecPath;
|
|
54
58
|
}
|
|
55
59
|
if (mode === appMode.DESKTOP && nodeEnv === "production") {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
60
|
+
if (resourcesPath !== undefined && resourcesPath !== "") {
|
|
61
|
+
const foundInResources = findExecutableInDir(resourcesPath, execName, osExecutableName);
|
|
62
|
+
if (foundInResources !== undefined && foundInResources !== "") {
|
|
63
|
+
return foundInResources;
|
|
64
|
+
}
|
|
59
65
|
}
|
|
60
66
|
throw new Error(
|
|
61
67
|
`Executable not found in execPath (${execPath}) or resourcesPath (${resourcesPath}): ${osExecutableName}`,
|
|
@@ -65,7 +71,7 @@ function executablePath(execPath, execName) {
|
|
|
65
71
|
throw new Error(`Executable not found: ${osExecutableName}`);
|
|
66
72
|
}
|
|
67
73
|
|
|
68
|
-
function createPath(dirPath) {
|
|
74
|
+
function createPath(dirPath: string): string {
|
|
69
75
|
if (!fs.existsSync(dirPath)) {
|
|
70
76
|
fs.mkdirSync(dirPath, {
|
|
71
77
|
recursive: true,
|
|
@@ -74,17 +80,21 @@ function createPath(dirPath) {
|
|
|
74
80
|
}
|
|
75
81
|
return dirPath;
|
|
76
82
|
}
|
|
77
|
-
function generateProjectFolderPath(projectName) {
|
|
83
|
+
function generateProjectFolderPath(projectName: string): string {
|
|
78
84
|
return path.join(os.tmpdir(), projectName.replaceAll("/", "_"), uuidv4());
|
|
79
85
|
}
|
|
80
|
-
function extensionFolderPath(projectFolderPath, extensionId) {
|
|
86
|
+
function extensionFolderPath(projectFolderPath: string, extensionId: string): string {
|
|
81
87
|
return path.join(projectFolderPath, "extensions", extensionId);
|
|
82
88
|
}
|
|
83
|
-
async function lookForLocalExtensionDistPath(
|
|
89
|
+
async function lookForLocalExtensionDistPath(
|
|
90
|
+
rootPath: string,
|
|
91
|
+
extentionRepoName: string,
|
|
92
|
+
frontendFile: string,
|
|
93
|
+
): Promise<string | undefined> {
|
|
84
94
|
const localExtensionPath = path.join(rootPath, "..", extentionRepoName);
|
|
85
95
|
const localExtensionDistPath = path.join(localExtensionPath, "dist");
|
|
86
96
|
if (!fs.existsSync(localExtensionDistPath)) {
|
|
87
|
-
return;
|
|
97
|
+
return undefined;
|
|
88
98
|
}
|
|
89
99
|
console.log(
|
|
90
100
|
`[extensionFrontendPath] Found existing folder: ${localExtensionDistPath}, deleting it...`,
|
|
@@ -107,8 +117,14 @@ async function lookForLocalExtensionDistPath(rootPath, extentionRepoName, fronte
|
|
|
107
117
|
// oxlint-disable-next-line no-await-in-loop
|
|
108
118
|
await setTimeout(MILLISECONDS_PER_RETRY);
|
|
109
119
|
}
|
|
120
|
+
return undefined;
|
|
110
121
|
}
|
|
111
|
-
async function extensionFrontendPath(
|
|
122
|
+
async function extensionFrontendPath(
|
|
123
|
+
unzippedExtensionPath: string,
|
|
124
|
+
frontendFile: string,
|
|
125
|
+
rootPath: string,
|
|
126
|
+
extensionId: string,
|
|
127
|
+
): Promise<string> {
|
|
112
128
|
console.log("[extensionFrontendPath]", {
|
|
113
129
|
unzippedExtensionPath,
|
|
114
130
|
frontendFile,
|
|
@@ -124,7 +140,7 @@ async function extensionFrontendPath(unzippedExtensionPath, frontendFile, rootPa
|
|
|
124
140
|
extentionRepoName,
|
|
125
141
|
frontendFile,
|
|
126
142
|
);
|
|
127
|
-
if (localFilePath) {
|
|
143
|
+
if (localFilePath !== undefined && localFilePath !== "") {
|
|
128
144
|
return localFilePath;
|
|
129
145
|
}
|
|
130
146
|
const unzippedfrontendFilePath = path.join(unzippedExtensionPath, frontendFile);
|
|
@@ -133,7 +149,10 @@ async function extensionFrontendPath(unzippedExtensionPath, frontendFile, rootPa
|
|
|
133
149
|
}
|
|
134
150
|
throw new Error(`Failed to find ${unzippedfrontendFilePath}`);
|
|
135
151
|
}
|
|
136
|
-
function extensionBackendPath(
|
|
152
|
+
function extensionBackendPath(
|
|
153
|
+
unzippedExtensionPath: string,
|
|
154
|
+
backendExecutableName: string,
|
|
155
|
+
): string {
|
|
137
156
|
const backendExecutablePath = path.join(
|
|
138
157
|
unzippedExtensionPath,
|
|
139
158
|
executableName(backendExecutableName),
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Node imports
|
|
2
|
+
import type { Readable } from "node:stream";
|
|
2
3
|
import child_process from "node:child_process";
|
|
3
4
|
import fs from "node:fs";
|
|
4
5
|
import { on } from "node:events";
|
|
@@ -9,32 +10,44 @@ import readline from "node:readline";
|
|
|
9
10
|
import { getPort } from "get-port-please";
|
|
10
11
|
|
|
11
12
|
// Local imports
|
|
12
|
-
import { appMode } from "@geode/opengeodeweb-front/shared/app_mode.
|
|
13
|
-
import { setAppBaseUrl } from "@geode/opengeodeweb-front/shared/scripts.
|
|
13
|
+
import { appMode } from "@geode/opengeodeweb-front/shared/app_mode.ts";
|
|
14
|
+
import { setAppBaseUrl } from "@geode/opengeodeweb-front/shared/scripts.ts";
|
|
14
15
|
|
|
15
16
|
const BYTES_PER_KIBIBYTE = 1024;
|
|
16
17
|
const MAX_ERROR_BUFFER_KIBIBYTES = 64;
|
|
17
18
|
const MAX_ERROR_BUFFER_BYTES = MAX_ERROR_BUFFER_KIBIBYTES * BYTES_PER_KIBIBYTE;
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
|
|
20
|
+
async function getAvailablePort(): Promise<number> {
|
|
21
|
+
const port = await getPort({
|
|
20
22
|
host: "localhost",
|
|
21
23
|
random: true,
|
|
22
24
|
});
|
|
25
|
+
return port;
|
|
23
26
|
}
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
|
|
28
|
+
function commandExistsSync(execName: string): boolean {
|
|
29
|
+
const envPath = process.env.PATH ?? "";
|
|
26
30
|
return envPath.split(path.delimiter).some((directory) => {
|
|
27
31
|
const filePath = path.join(directory, execName);
|
|
28
32
|
return fs.existsSync(filePath) && fs.statSync(filePath).isFile();
|
|
29
33
|
});
|
|
30
34
|
}
|
|
35
|
+
|
|
31
36
|
const encoder = new TextEncoder();
|
|
32
|
-
function byteLength(str) {
|
|
37
|
+
function byteLength(str: string): number {
|
|
33
38
|
return encoder.encode(str).byteLength;
|
|
34
39
|
}
|
|
35
40
|
|
|
36
|
-
|
|
37
|
-
|
|
41
|
+
interface NamedChildProcess extends child_process.ChildProcessByStdio<null, Readable, Readable> {
|
|
42
|
+
name?: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// oxlint-disable-next-line max-lines-per-function typescript/prefer-readonly-parameter-types eslint/require-await
|
|
46
|
+
async function waitForReady(
|
|
47
|
+
child: NamedChildProcess,
|
|
48
|
+
expectedResponse: string,
|
|
49
|
+
signal?: AbortSignal,
|
|
50
|
+
): Promise<NamedChildProcess> {
|
|
38
51
|
// oxlint-disable-next-line promise/avoid-new
|
|
39
52
|
return new Promise((resolve, reject) => {
|
|
40
53
|
const readlineStdout = readline.createInterface({
|
|
@@ -44,7 +57,7 @@ function waitForReady(child, expectedResponse, signal) {
|
|
|
44
57
|
input: child.stderr,
|
|
45
58
|
});
|
|
46
59
|
let recentOutput = "";
|
|
47
|
-
function recordOutput(lineOutput) {
|
|
60
|
+
function recordOutput(lineOutput: string): void {
|
|
48
61
|
const safeLine =
|
|
49
62
|
byteLength(lineOutput) > MAX_ERROR_BUFFER_BYTES / 2
|
|
50
63
|
? `${lineOutput.slice(0, MAX_ERROR_BUFFER_BYTES / 2)}…[truncated]`
|
|
@@ -59,13 +72,13 @@ function waitForReady(child, expectedResponse, signal) {
|
|
|
59
72
|
recentOutput = recentOutput.slice(newline + 1);
|
|
60
73
|
}
|
|
61
74
|
}
|
|
62
|
-
let onLine = undefined;
|
|
63
|
-
let onErrLine = undefined;
|
|
64
|
-
let onError = undefined;
|
|
65
|
-
let onClose = undefined;
|
|
66
|
-
let onAbort = undefined;
|
|
75
|
+
let onLine: ((line: string) => void) | undefined = undefined;
|
|
76
|
+
let onErrLine: ((line: string) => void) | undefined = undefined;
|
|
77
|
+
let onError: ((err: Error) => void) | undefined = undefined;
|
|
78
|
+
let onClose: ((code: number | null) => void) | undefined = undefined;
|
|
79
|
+
let onAbort: (() => void) | undefined = undefined;
|
|
67
80
|
|
|
68
|
-
function cleanup() {
|
|
81
|
+
function cleanup(): void {
|
|
69
82
|
if (onLine) {
|
|
70
83
|
readlineStdout.removeListener("line", onLine);
|
|
71
84
|
}
|
|
@@ -83,7 +96,7 @@ function waitForReady(child, expectedResponse, signal) {
|
|
|
83
96
|
}
|
|
84
97
|
}
|
|
85
98
|
|
|
86
|
-
function becomeReady() {
|
|
99
|
+
function becomeReady(): void {
|
|
87
100
|
cleanup();
|
|
88
101
|
readlineStdout.on("line", (line) => {
|
|
89
102
|
console.log(`[${child.name}] ${line}`);
|
|
@@ -97,7 +110,7 @@ function waitForReady(child, expectedResponse, signal) {
|
|
|
97
110
|
resolve(child);
|
|
98
111
|
}
|
|
99
112
|
|
|
100
|
-
onLine = (lineOutput) => {
|
|
113
|
+
onLine = (lineOutput): void => {
|
|
101
114
|
console.log(`[${child.name}] ${lineOutput}`);
|
|
102
115
|
recordOutput(lineOutput);
|
|
103
116
|
if (lineOutput.includes(expectedResponse)) {
|
|
@@ -105,7 +118,7 @@ function waitForReady(child, expectedResponse, signal) {
|
|
|
105
118
|
}
|
|
106
119
|
};
|
|
107
120
|
|
|
108
|
-
onErrLine = (line) => {
|
|
121
|
+
onErrLine = (line): void => {
|
|
109
122
|
console.log(`[${child.name}] ${line}`);
|
|
110
123
|
recordOutput(line);
|
|
111
124
|
if (line.includes(expectedResponse)) {
|
|
@@ -113,12 +126,12 @@ function waitForReady(child, expectedResponse, signal) {
|
|
|
113
126
|
}
|
|
114
127
|
};
|
|
115
128
|
|
|
116
|
-
onError = (err) => {
|
|
129
|
+
onError = (err): void => {
|
|
117
130
|
cleanup();
|
|
118
131
|
reject(err);
|
|
119
132
|
};
|
|
120
133
|
|
|
121
|
-
onClose = (code) => {
|
|
134
|
+
onClose = (code): void => {
|
|
122
135
|
console.log(`[${child.name}] exited with code ${code}`);
|
|
123
136
|
cleanup();
|
|
124
137
|
reject(
|
|
@@ -128,7 +141,7 @@ function waitForReady(child, expectedResponse, signal) {
|
|
|
128
141
|
);
|
|
129
142
|
};
|
|
130
143
|
|
|
131
|
-
onAbort = () => {
|
|
144
|
+
onAbort = (): void => {
|
|
132
145
|
cleanup();
|
|
133
146
|
reject(new Error(`[${child.name}] timed out waiting for "${expectedResponse}"`));
|
|
134
147
|
};
|
|
@@ -143,36 +156,38 @@ function waitForReady(child, expectedResponse, signal) {
|
|
|
143
156
|
}
|
|
144
157
|
});
|
|
145
158
|
}
|
|
146
|
-
async function waitNuxt(
|
|
147
|
-
nuxtProcess.
|
|
159
|
+
async function waitNuxt(
|
|
160
|
+
nuxtProcess: child_process.ChildProcessWithoutNullStreams,
|
|
161
|
+
): Promise<string> {
|
|
162
|
+
nuxtProcess.stderr.on("data", (data: Buffer) => {
|
|
148
163
|
console.log("Nuxt STDERR:", data.toString().trim());
|
|
149
164
|
});
|
|
150
165
|
nuxtProcess.on("close", (code) => {
|
|
151
166
|
console.log(`Nuxt process closed with code ${code}`);
|
|
152
167
|
});
|
|
153
168
|
for await (const [data] of on(nuxtProcess.stdout, "data")) {
|
|
154
|
-
const output = data
|
|
169
|
+
const output = String(data);
|
|
155
170
|
console.log("Nuxt STDOUT:", output.trim());
|
|
156
|
-
const portMatch =
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
171
|
+
const portMatch = /Listening on http:\/\/\[::\]:(?<port>\d+)/u.exec(output);
|
|
172
|
+
const port = portMatch?.groups?.port;
|
|
173
|
+
if (port !== undefined) {
|
|
174
|
+
console.log("Nuxt listening on port", port);
|
|
175
|
+
nuxtProcess.stdout.on("data", (newData: Buffer) => {
|
|
160
176
|
console.log("Nuxt STDOUT:", newData.toString().trim());
|
|
161
177
|
});
|
|
162
|
-
return
|
|
178
|
+
return port;
|
|
163
179
|
}
|
|
164
180
|
}
|
|
165
181
|
throw new Error("Nuxt process closed");
|
|
166
182
|
}
|
|
167
|
-
async function runBrowser(scriptName) {
|
|
183
|
+
async function runBrowser(scriptName: string): Promise<number> {
|
|
168
184
|
process.env.MODE = appMode.BROWSER;
|
|
169
185
|
const port = await getAvailablePort();
|
|
170
186
|
const nuxtProcess = child_process.spawn("npm", ["run", scriptName], {
|
|
171
187
|
shell: true,
|
|
172
|
-
FORCE_COLOR: true,
|
|
173
188
|
env: {
|
|
174
189
|
...process.env,
|
|
175
|
-
PORT: port,
|
|
190
|
+
PORT: String(port),
|
|
176
191
|
},
|
|
177
192
|
});
|
|
178
193
|
await waitNuxt(nuxtProcess);
|
|
@@ -180,3 +195,4 @@ async function runBrowser(scriptName) {
|
|
|
180
195
|
return port;
|
|
181
196
|
}
|
|
182
197
|
export { commandExistsSync, getAvailablePort, runBrowser, waitForReady };
|
|
198
|
+
export type { NamedChildProcess };
|
|
@@ -8,19 +8,23 @@ import { extract as extractTar } from "tar";
|
|
|
8
8
|
|
|
9
9
|
const TAR_ARCHIVE_PATTERN = /\.(?<ext>tar\.gz|tgz|tar)$/u;
|
|
10
10
|
|
|
11
|
-
async function extractZipArchive(zipFilePath, outputDir) {
|
|
11
|
+
async function extractZipArchive(zipFilePath: string, outputDir: string): Promise<void> {
|
|
12
12
|
const data = await fs.promises.readFile(zipFilePath);
|
|
13
13
|
const zip = await JSZip.loadAsync(data);
|
|
14
|
-
const promises = [];
|
|
14
|
+
const promises: Promise<void>[] = [];
|
|
15
15
|
|
|
16
16
|
for (const [relativePath, zipEntry] of Object.entries(zip.files)) {
|
|
17
17
|
const outputPath = path.join(outputDir, relativePath);
|
|
18
18
|
|
|
19
19
|
if (zipEntry.dir) {
|
|
20
|
-
promises.push(
|
|
20
|
+
promises.push(
|
|
21
|
+
(async (): Promise<void> => {
|
|
22
|
+
await fs.promises.mkdir(outputPath, { recursive: true });
|
|
23
|
+
})(),
|
|
24
|
+
);
|
|
21
25
|
} else {
|
|
22
26
|
promises.push(
|
|
23
|
-
(async () => {
|
|
27
|
+
(async (): Promise<void> => {
|
|
24
28
|
const content = await zipEntry.async("nodebuffer");
|
|
25
29
|
await fs.promises.mkdir(path.dirname(outputPath), {
|
|
26
30
|
recursive: true,
|
|
@@ -34,11 +38,14 @@ async function extractZipArchive(zipFilePath, outputDir) {
|
|
|
34
38
|
await Promise.all(promises);
|
|
35
39
|
}
|
|
36
40
|
|
|
37
|
-
async function extractTarArchive(archivePath, outputDir) {
|
|
41
|
+
async function extractTarArchive(archivePath: string, outputDir: string): Promise<void> {
|
|
38
42
|
await extractTar({ file: archivePath, cwd: outputDir });
|
|
39
43
|
}
|
|
40
44
|
|
|
41
|
-
async function unzipFile(
|
|
45
|
+
async function unzipFile(
|
|
46
|
+
zipFilePath: string,
|
|
47
|
+
outputDir: string = zipFilePath.replace(/\.[^/.]+$/u, ""),
|
|
48
|
+
): Promise<string> {
|
|
42
49
|
console.log("Unzipping file...", zipFilePath, outputDir);
|
|
43
50
|
try {
|
|
44
51
|
await fs.promises.mkdir(outputDir, { recursive: true });
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type ServerWsRpcClient, createServerWsRpcClient } from "./ws_client.js";
|
|
2
|
+
|
|
3
|
+
const stringStorage = new Map<string, string>();
|
|
4
|
+
const booleanStorage = new Map<string, boolean>();
|
|
5
|
+
const clientStorage = new Map<string, ServerWsRpcClient>();
|
|
6
|
+
|
|
7
|
+
function getAppBaseUrl(): string {
|
|
8
|
+
const value = stringStorage.get("APP_BASE_URL");
|
|
9
|
+
if (value === undefined) {
|
|
10
|
+
throw new Error("APP_BASE_URL is not set");
|
|
11
|
+
}
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
function setAppBaseUrl(baseUrl: string): void {
|
|
15
|
+
stringStorage.set("APP_BASE_URL", baseUrl);
|
|
16
|
+
}
|
|
17
|
+
function getBackBaseUrl(): string {
|
|
18
|
+
const value = stringStorage.get("BACK_BASE_URL");
|
|
19
|
+
if (value === undefined) {
|
|
20
|
+
throw new Error("BACK_BASE_URL is not set");
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
function setBackBaseUrl(baseUrl: string): void {
|
|
25
|
+
stringStorage.set("BACK_BASE_URL", baseUrl);
|
|
26
|
+
}
|
|
27
|
+
function getViewerBaseUrl(): string {
|
|
28
|
+
const value = stringStorage.get("VIEWER_BASE_URL");
|
|
29
|
+
if (value === undefined) {
|
|
30
|
+
throw new Error("VIEWER_BASE_URL is not set");
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
function setViewerBaseUrl(baseUrl: string): void {
|
|
35
|
+
stringStorage.set("VIEWER_BASE_URL", baseUrl);
|
|
36
|
+
}
|
|
37
|
+
function getIsAppReady(): boolean {
|
|
38
|
+
return booleanStorage.get("IS_APP_READY") ?? false;
|
|
39
|
+
}
|
|
40
|
+
function setIsAppReady(isAppReady: boolean): void {
|
|
41
|
+
booleanStorage.set("IS_APP_READY", isAppReady);
|
|
42
|
+
}
|
|
43
|
+
async function setViewerWebSocketClient(baseUrl: string): Promise<ServerWsRpcClient> {
|
|
44
|
+
const client = createServerWsRpcClient(baseUrl);
|
|
45
|
+
client.onConnectionClose(() => {
|
|
46
|
+
if (clientStorage.get("VIEWER_CLIENT") === client) {
|
|
47
|
+
clientStorage.delete("VIEWER_CLIENT");
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
await client.ready;
|
|
51
|
+
clientStorage.set("VIEWER_CLIENT", client);
|
|
52
|
+
return client;
|
|
53
|
+
}
|
|
54
|
+
async function getViewerWebSocketClient(): Promise<ServerWsRpcClient> {
|
|
55
|
+
const viewerClient = clientStorage.get("VIEWER_CLIENT");
|
|
56
|
+
if (viewerClient !== undefined && viewerClient.isOpen()) {
|
|
57
|
+
return viewerClient;
|
|
58
|
+
}
|
|
59
|
+
const viewerBaseUrl = getViewerBaseUrl();
|
|
60
|
+
const client = await setViewerWebSocketClient(viewerBaseUrl);
|
|
61
|
+
return client;
|
|
62
|
+
}
|
|
63
|
+
export {
|
|
64
|
+
getAppBaseUrl,
|
|
65
|
+
getBackBaseUrl,
|
|
66
|
+
getIsAppReady,
|
|
67
|
+
getViewerBaseUrl,
|
|
68
|
+
getViewerWebSocketClient,
|
|
69
|
+
setAppBaseUrl,
|
|
70
|
+
setBackBaseUrl,
|
|
71
|
+
setIsAppReady,
|
|
72
|
+
setViewerBaseUrl,
|
|
73
|
+
setViewerWebSocketClient,
|
|
74
|
+
};
|