@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
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { appMode } from "../../shared/app_mode.js";
|
|
2
|
+
import { commandExistsSync } from "./scripts.js";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import { setTimeout } from "node:timers/promises";
|
|
6
|
+
import os from "node:os";
|
|
7
|
+
import { v4 } from "uuid";
|
|
8
|
+
//#region server/utils/path.ts
|
|
9
|
+
function executableName(execName) {
|
|
10
|
+
if (process.platform === "win32") return `${execName}.exe`;
|
|
11
|
+
return execName;
|
|
12
|
+
}
|
|
13
|
+
function findExecutableInDir(baseDir, execName, osExecutableName) {
|
|
14
|
+
const oneFilePath = path.join(baseDir, osExecutableName);
|
|
15
|
+
if (fs.existsSync(oneFilePath) && fs.statSync(oneFilePath).isFile()) {
|
|
16
|
+
console.log(`[executablePath] Found OneFile executable: ${oneFilePath}`);
|
|
17
|
+
return oneFilePath;
|
|
18
|
+
}
|
|
19
|
+
const oneDirPath = path.join(baseDir, execName, osExecutableName);
|
|
20
|
+
if (fs.existsSync(oneDirPath) && fs.statSync(oneDirPath).isFile()) {
|
|
21
|
+
console.log(`[executablePath] Found OneDir executable: ${oneDirPath}`);
|
|
22
|
+
return oneDirPath;
|
|
23
|
+
}
|
|
24
|
+
console.log(`[executablePath] Executable not found in ${baseDir} (tried OneFile and OneDir): ${execName}`);
|
|
25
|
+
}
|
|
26
|
+
function executablePath(execPath, execName) {
|
|
27
|
+
const osExecutableName = executableName(execName);
|
|
28
|
+
const resourcesPath = process.env.RESOURCES_PATH;
|
|
29
|
+
const mode = process.env.MODE;
|
|
30
|
+
const nodeEnv = process.env.NODE_ENV;
|
|
31
|
+
console.log("[executablePath]", {
|
|
32
|
+
execPath,
|
|
33
|
+
execName,
|
|
34
|
+
mode,
|
|
35
|
+
nodeEnv,
|
|
36
|
+
resourcesPath
|
|
37
|
+
});
|
|
38
|
+
if (commandExistsSync(osExecutableName)) {
|
|
39
|
+
console.log(`[executablePath] Found executable in PATH: ${osExecutableName}`);
|
|
40
|
+
return osExecutableName;
|
|
41
|
+
}
|
|
42
|
+
const foundAtExecPath = findExecutableInDir(execPath, execName, osExecutableName);
|
|
43
|
+
if (foundAtExecPath !== void 0 && foundAtExecPath !== "") return foundAtExecPath;
|
|
44
|
+
if (mode === appMode.DESKTOP && nodeEnv === "production") {
|
|
45
|
+
if (resourcesPath !== void 0 && resourcesPath !== "") {
|
|
46
|
+
const foundInResources = findExecutableInDir(resourcesPath, execName, osExecutableName);
|
|
47
|
+
if (foundInResources !== void 0 && foundInResources !== "") return foundInResources;
|
|
48
|
+
}
|
|
49
|
+
throw new Error(`Executable not found in execPath (${execPath}) or resourcesPath (${resourcesPath}): ${osExecutableName}`);
|
|
50
|
+
}
|
|
51
|
+
throw new Error(`Executable not found: ${osExecutableName}`);
|
|
52
|
+
}
|
|
53
|
+
function createPath(dirPath) {
|
|
54
|
+
if (!fs.existsSync(dirPath)) {
|
|
55
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
56
|
+
console.log(`${dirPath} directory created successfully!`);
|
|
57
|
+
}
|
|
58
|
+
return dirPath;
|
|
59
|
+
}
|
|
60
|
+
function generateProjectFolderPath(projectName) {
|
|
61
|
+
return path.join(os.tmpdir(), projectName.replaceAll("/", "_"), v4());
|
|
62
|
+
}
|
|
63
|
+
function extensionFolderPath(projectFolderPath, extensionId) {
|
|
64
|
+
return path.join(projectFolderPath, "extensions", extensionId);
|
|
65
|
+
}
|
|
66
|
+
async function lookForLocalExtensionDistPath(rootPath, extentionRepoName, frontendFile) {
|
|
67
|
+
const localExtensionPath = path.join(rootPath, "..", extentionRepoName);
|
|
68
|
+
const localExtensionDistPath = path.join(localExtensionPath, "dist");
|
|
69
|
+
if (!fs.existsSync(localExtensionDistPath)) return;
|
|
70
|
+
console.log(`[extensionFrontendPath] Found existing folder: ${localExtensionDistPath}, deleting it...`);
|
|
71
|
+
fs.rmSync(localExtensionDistPath, {
|
|
72
|
+
recursive: true,
|
|
73
|
+
force: true
|
|
74
|
+
});
|
|
75
|
+
const now = /* @__PURE__ */ new Date();
|
|
76
|
+
fs.utimesSync(path.join(localExtensionPath, "package.json"), now, now);
|
|
77
|
+
const rebuiltFilePath = path.join(localExtensionDistPath, frontendFile);
|
|
78
|
+
const MAX_DELETE_FOLDER_RETRIES = 10;
|
|
79
|
+
const MILLISECONDS_PER_RETRY = 1e3;
|
|
80
|
+
for (let i = 0; i <= MAX_DELETE_FOLDER_RETRIES; i += 1) {
|
|
81
|
+
if (fs.existsSync(rebuiltFilePath)) {
|
|
82
|
+
console.log(`Found rebuilt file: ${rebuiltFilePath}`);
|
|
83
|
+
return rebuiltFilePath;
|
|
84
|
+
}
|
|
85
|
+
console.log(`Waiting for rebuild... attempt ${i}/${MAX_DELETE_FOLDER_RETRIES}`);
|
|
86
|
+
await setTimeout(MILLISECONDS_PER_RETRY);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function extensionFrontendPath(unzippedExtensionPath, frontendFile, rootPath, extensionId) {
|
|
90
|
+
console.log("[extensionFrontendPath]", {
|
|
91
|
+
unzippedExtensionPath,
|
|
92
|
+
frontendFile,
|
|
93
|
+
rootPath,
|
|
94
|
+
extensionId
|
|
95
|
+
});
|
|
96
|
+
const localFilePath = await lookForLocalExtensionDistPath(rootPath, extensionId.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join("-"), frontendFile);
|
|
97
|
+
if (localFilePath !== void 0 && localFilePath !== "") return localFilePath;
|
|
98
|
+
const unzippedfrontendFilePath = path.join(unzippedExtensionPath, frontendFile);
|
|
99
|
+
if (fs.existsSync(unzippedfrontendFilePath)) return unzippedfrontendFilePath;
|
|
100
|
+
throw new Error(`Failed to find ${unzippedfrontendFilePath}`);
|
|
101
|
+
}
|
|
102
|
+
function extensionBackendPath(unzippedExtensionPath, backendExecutableName) {
|
|
103
|
+
const backendExecutablePath = path.join(unzippedExtensionPath, executableName(backendExecutableName));
|
|
104
|
+
console.log("runExtensions", { backendExecutablePath });
|
|
105
|
+
return backendExecutablePath;
|
|
106
|
+
}
|
|
107
|
+
//#endregion
|
|
108
|
+
export { createPath, executableName, executablePath, extensionBackendPath, extensionFolderPath, extensionFrontendPath, generateProjectFolderPath };
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { appMode } from "../../shared/app_mode.js";
|
|
2
|
+
import { setAppBaseUrl } from "../../shared/scripts.js";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import child_process from "node:child_process";
|
|
6
|
+
import { on } from "node:events";
|
|
7
|
+
import readline from "node:readline";
|
|
8
|
+
import { getPort } from "get-port-please";
|
|
9
|
+
//#region server/utils/scripts.ts
|
|
10
|
+
const MAX_ERROR_BUFFER_BYTES = 65536;
|
|
11
|
+
async function getAvailablePort() {
|
|
12
|
+
return await getPort({
|
|
13
|
+
host: "localhost",
|
|
14
|
+
random: true
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function commandExistsSync(execName) {
|
|
18
|
+
return (process.env.PATH ?? "").split(path.delimiter).some((directory) => {
|
|
19
|
+
const filePath = path.join(directory, execName);
|
|
20
|
+
return fs.existsSync(filePath) && fs.statSync(filePath).isFile();
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
const encoder = new TextEncoder();
|
|
24
|
+
function byteLength(str) {
|
|
25
|
+
return encoder.encode(str).byteLength;
|
|
26
|
+
}
|
|
27
|
+
async function waitForReady(child, expectedResponse, signal) {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const readlineStdout = readline.createInterface({ input: child.stdout });
|
|
30
|
+
const readlineStderr = readline.createInterface({ input: child.stderr });
|
|
31
|
+
let recentOutput = "";
|
|
32
|
+
function recordOutput(lineOutput) {
|
|
33
|
+
const safeLine = byteLength(lineOutput) > MAX_ERROR_BUFFER_BYTES / 2 ? `${lineOutput.slice(0, MAX_ERROR_BUFFER_BYTES / 2)}…[truncated]` : lineOutput;
|
|
34
|
+
recentOutput = `${recentOutput} ${safeLine}\n`;
|
|
35
|
+
while (byteLength(recentOutput) > MAX_ERROR_BUFFER_BYTES) {
|
|
36
|
+
const newline = recentOutput.indexOf("\n");
|
|
37
|
+
if (newline === -1) {
|
|
38
|
+
recentOutput = "";
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
recentOutput = recentOutput.slice(newline + 1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
let onLine = void 0;
|
|
45
|
+
let onErrLine = void 0;
|
|
46
|
+
let onError = void 0;
|
|
47
|
+
let onClose = void 0;
|
|
48
|
+
let onAbort = void 0;
|
|
49
|
+
function cleanup() {
|
|
50
|
+
if (onLine) readlineStdout.removeListener("line", onLine);
|
|
51
|
+
if (onErrLine) readlineStderr.removeListener("line", onErrLine);
|
|
52
|
+
if (onError) child.removeListener("error", onError);
|
|
53
|
+
if (onClose) child.removeListener("close", onClose);
|
|
54
|
+
if (signal && onAbort) signal.removeEventListener("abort", onAbort);
|
|
55
|
+
}
|
|
56
|
+
function becomeReady() {
|
|
57
|
+
cleanup();
|
|
58
|
+
readlineStdout.on("line", (line) => {
|
|
59
|
+
console.log(`[${child.name}] ${line}`);
|
|
60
|
+
});
|
|
61
|
+
readlineStderr.on("line", (line) => {
|
|
62
|
+
console.log(`[${child.name}] ${line}`);
|
|
63
|
+
});
|
|
64
|
+
child.once("close", (code) => {
|
|
65
|
+
console.log(`[${child.name}] exited with code ${code}`);
|
|
66
|
+
});
|
|
67
|
+
resolve(child);
|
|
68
|
+
}
|
|
69
|
+
onLine = (lineOutput) => {
|
|
70
|
+
console.log(`[${child.name}] ${lineOutput}`);
|
|
71
|
+
recordOutput(lineOutput);
|
|
72
|
+
if (lineOutput.includes(expectedResponse)) becomeReady();
|
|
73
|
+
};
|
|
74
|
+
onErrLine = (line) => {
|
|
75
|
+
console.log(`[${child.name}] ${line}`);
|
|
76
|
+
recordOutput(line);
|
|
77
|
+
if (line.includes(expectedResponse)) becomeReady();
|
|
78
|
+
};
|
|
79
|
+
onError = (err) => {
|
|
80
|
+
cleanup();
|
|
81
|
+
reject(err);
|
|
82
|
+
};
|
|
83
|
+
onClose = (code) => {
|
|
84
|
+
console.log(`[${child.name}] exited with code ${code}`);
|
|
85
|
+
cleanup();
|
|
86
|
+
reject(/* @__PURE__ */ new Error(`[${child.name}] exited with code ${code} before becoming ready.${recentOutput ? `\nRecent output:\n${recentOutput}` : ""}`));
|
|
87
|
+
};
|
|
88
|
+
onAbort = () => {
|
|
89
|
+
cleanup();
|
|
90
|
+
reject(/* @__PURE__ */ new Error(`[${child.name}] timed out waiting for "${expectedResponse}"`));
|
|
91
|
+
};
|
|
92
|
+
readlineStdout.on("line", onLine);
|
|
93
|
+
readlineStderr.on("line", onErrLine);
|
|
94
|
+
child.once("error", onError);
|
|
95
|
+
child.once("close", onClose);
|
|
96
|
+
if (signal) signal.addEventListener("abort", onAbort, { once: true });
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
async function waitNuxt(nuxtProcess) {
|
|
100
|
+
nuxtProcess.stderr.on("data", (data) => {
|
|
101
|
+
console.log("Nuxt STDERR:", data.toString().trim());
|
|
102
|
+
});
|
|
103
|
+
nuxtProcess.on("close", (code) => {
|
|
104
|
+
console.log(`Nuxt process closed with code ${code}`);
|
|
105
|
+
});
|
|
106
|
+
for await (const [data] of on(nuxtProcess.stdout, "data")) {
|
|
107
|
+
const output = String(data);
|
|
108
|
+
console.log("Nuxt STDOUT:", output.trim());
|
|
109
|
+
const port = /Listening on http:\/\/\[::\]:(?<port>\d+)/u.exec(output)?.groups?.port;
|
|
110
|
+
if (port !== void 0) {
|
|
111
|
+
console.log("Nuxt listening on port", port);
|
|
112
|
+
nuxtProcess.stdout.on("data", (newData) => {
|
|
113
|
+
console.log("Nuxt STDOUT:", newData.toString().trim());
|
|
114
|
+
});
|
|
115
|
+
return port;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
throw new Error("Nuxt process closed");
|
|
119
|
+
}
|
|
120
|
+
async function runBrowser(scriptName) {
|
|
121
|
+
process.env.MODE = appMode.BROWSER;
|
|
122
|
+
const port = await getAvailablePort();
|
|
123
|
+
await waitNuxt(child_process.spawn("npm", ["run", scriptName], {
|
|
124
|
+
shell: true,
|
|
125
|
+
env: {
|
|
126
|
+
...process.env,
|
|
127
|
+
PORT: String(port)
|
|
128
|
+
}
|
|
129
|
+
}));
|
|
130
|
+
await setAppBaseUrl(`http://localhost:${port}`);
|
|
131
|
+
return port;
|
|
132
|
+
}
|
|
133
|
+
//#endregion
|
|
134
|
+
export { commandExistsSync, getAvailablePort, runBrowser, waitForReady };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import JSZip from "jszip";
|
|
4
|
+
import { extract } from "tar";
|
|
5
|
+
//#region server/utils/server.ts
|
|
6
|
+
const TAR_ARCHIVE_PATTERN = /\.(?<ext>tar\.gz|tgz|tar)$/u;
|
|
7
|
+
async function extractZipArchive(zipFilePath, outputDir) {
|
|
8
|
+
const data = await fs.promises.readFile(zipFilePath);
|
|
9
|
+
const zip = await JSZip.loadAsync(data);
|
|
10
|
+
const promises = [];
|
|
11
|
+
for (const [relativePath, zipEntry] of Object.entries(zip.files)) {
|
|
12
|
+
const outputPath = path.join(outputDir, relativePath);
|
|
13
|
+
if (zipEntry.dir) promises.push((async () => {
|
|
14
|
+
await fs.promises.mkdir(outputPath, { recursive: true });
|
|
15
|
+
})());
|
|
16
|
+
else promises.push((async () => {
|
|
17
|
+
const content = await zipEntry.async("nodebuffer");
|
|
18
|
+
await fs.promises.mkdir(path.dirname(outputPath), { recursive: true });
|
|
19
|
+
await fs.promises.writeFile(outputPath, content);
|
|
20
|
+
})());
|
|
21
|
+
}
|
|
22
|
+
await Promise.all(promises);
|
|
23
|
+
}
|
|
24
|
+
async function extractTarArchive(archivePath, outputDir) {
|
|
25
|
+
await extract({
|
|
26
|
+
file: archivePath,
|
|
27
|
+
cwd: outputDir
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async function unzipFile(zipFilePath, outputDir = zipFilePath.replace(/\.[^/.]+$/u, "")) {
|
|
31
|
+
console.log("Unzipping file...", zipFilePath, outputDir);
|
|
32
|
+
try {
|
|
33
|
+
await fs.promises.mkdir(outputDir, { recursive: true });
|
|
34
|
+
if (TAR_ARCHIVE_PATTERN.test(zipFilePath)) await extractTarArchive(zipFilePath, outputDir);
|
|
35
|
+
else await extractZipArchive(zipFilePath, outputDir);
|
|
36
|
+
console.log("Extraction complete!");
|
|
37
|
+
return outputDir;
|
|
38
|
+
} catch (error) {
|
|
39
|
+
console.error("Error unzipping file:", error);
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { unzipFile };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { createServerWsRpcClient } from "./ws_client.js";
|
|
2
|
+
//#region server/utils/server_config.ts
|
|
3
|
+
const stringStorage = /* @__PURE__ */ new Map();
|
|
4
|
+
const booleanStorage = /* @__PURE__ */ new Map();
|
|
5
|
+
const clientStorage = /* @__PURE__ */ new Map();
|
|
6
|
+
function getAppBaseUrl() {
|
|
7
|
+
const value = stringStorage.get("APP_BASE_URL");
|
|
8
|
+
if (value === void 0) throw new Error("APP_BASE_URL is not set");
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function setAppBaseUrl(baseUrl) {
|
|
12
|
+
stringStorage.set("APP_BASE_URL", baseUrl);
|
|
13
|
+
}
|
|
14
|
+
function getBackBaseUrl() {
|
|
15
|
+
const value = stringStorage.get("BACK_BASE_URL");
|
|
16
|
+
if (value === void 0) throw new Error("BACK_BASE_URL is not set");
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
function setBackBaseUrl(baseUrl) {
|
|
20
|
+
stringStorage.set("BACK_BASE_URL", baseUrl);
|
|
21
|
+
}
|
|
22
|
+
function getViewerBaseUrl() {
|
|
23
|
+
const value = stringStorage.get("VIEWER_BASE_URL");
|
|
24
|
+
if (value === void 0) throw new Error("VIEWER_BASE_URL is not set");
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
function setViewerBaseUrl(baseUrl) {
|
|
28
|
+
stringStorage.set("VIEWER_BASE_URL", baseUrl);
|
|
29
|
+
}
|
|
30
|
+
function getIsAppReady() {
|
|
31
|
+
return booleanStorage.get("IS_APP_READY") ?? false;
|
|
32
|
+
}
|
|
33
|
+
function setIsAppReady(isAppReady) {
|
|
34
|
+
booleanStorage.set("IS_APP_READY", isAppReady);
|
|
35
|
+
}
|
|
36
|
+
async function setViewerWebSocketClient(baseUrl) {
|
|
37
|
+
const client = createServerWsRpcClient(baseUrl);
|
|
38
|
+
client.onConnectionClose(() => {
|
|
39
|
+
if (clientStorage.get("VIEWER_CLIENT") === client) clientStorage.delete("VIEWER_CLIENT");
|
|
40
|
+
});
|
|
41
|
+
await client.ready;
|
|
42
|
+
clientStorage.set("VIEWER_CLIENT", client);
|
|
43
|
+
return client;
|
|
44
|
+
}
|
|
45
|
+
async function getViewerWebSocketClient() {
|
|
46
|
+
const viewerClient = clientStorage.get("VIEWER_CLIENT");
|
|
47
|
+
if (viewerClient !== void 0 && viewerClient.isOpen()) return viewerClient;
|
|
48
|
+
return await setViewerWebSocketClient(getViewerBaseUrl());
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
export { getAppBaseUrl, getBackBaseUrl, getIsAppReady, getViewerBaseUrl, getViewerWebSocketClient, setAppBaseUrl, setBackBaseUrl, setIsAppReady, setViewerBaseUrl, setViewerWebSocketClient };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { WebSocket } from "ws";
|
|
2
|
+
import { v4 } from "uuid";
|
|
3
|
+
//#region server/utils/ws_client.ts
|
|
4
|
+
const HELLO_ID = "system:hello";
|
|
5
|
+
const HELLO_SECRET = "wslink-secret";
|
|
6
|
+
function isWsRpcMessage(value) {
|
|
7
|
+
return typeof value === "object" && value !== null;
|
|
8
|
+
}
|
|
9
|
+
function rawDataToString(raw) {
|
|
10
|
+
if (Buffer.isBuffer(raw)) return raw.toString();
|
|
11
|
+
if (Array.isArray(raw)) return Buffer.concat(raw).toString();
|
|
12
|
+
return Buffer.from(raw).toString();
|
|
13
|
+
}
|
|
14
|
+
function createServerWsRpcClient(baseUrl) {
|
|
15
|
+
const socket = new WebSocket(baseUrl);
|
|
16
|
+
const pending = /* @__PURE__ */ new Map();
|
|
17
|
+
let onCloseCallback = void 0;
|
|
18
|
+
let onErrorCallback = void 0;
|
|
19
|
+
const ready = new Promise((resolve, reject) => {
|
|
20
|
+
socket.on("open", () => {
|
|
21
|
+
socket.send(JSON.stringify({
|
|
22
|
+
id: HELLO_ID,
|
|
23
|
+
method: "wslink.hello",
|
|
24
|
+
args: [{ secret: HELLO_SECRET }]
|
|
25
|
+
}));
|
|
26
|
+
});
|
|
27
|
+
socket.on("message", (raw) => {
|
|
28
|
+
let message = void 0;
|
|
29
|
+
try {
|
|
30
|
+
const parsed = JSON.parse(rawDataToString(raw));
|
|
31
|
+
if (!isWsRpcMessage(parsed)) return;
|
|
32
|
+
message = parsed;
|
|
33
|
+
} catch {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (message.id === HELLO_ID) {
|
|
37
|
+
resolve();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (typeof message.id === "string" && message.id.startsWith("publish:")) return;
|
|
41
|
+
const entry = message.id === void 0 ? void 0 : pending.get(message.id);
|
|
42
|
+
if (!entry || message.id === void 0) return;
|
|
43
|
+
pending.delete(message.id);
|
|
44
|
+
if (message.error) entry.reject(new Error(message.error.message ?? "wslink RPC error"));
|
|
45
|
+
else entry.resolve(message.result);
|
|
46
|
+
});
|
|
47
|
+
socket.on("error", (error) => {
|
|
48
|
+
onErrorCallback?.(error);
|
|
49
|
+
reject(error);
|
|
50
|
+
});
|
|
51
|
+
socket.on("close", () => {
|
|
52
|
+
onCloseCallback?.();
|
|
53
|
+
for (const { reject: rejectPending } of pending.values()) rejectPending(/* @__PURE__ */ new Error("WebSocket closed"));
|
|
54
|
+
pending.clear();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
async function call(rpc, params = {}) {
|
|
58
|
+
await ready;
|
|
59
|
+
const id = v4();
|
|
60
|
+
return new Promise((resolve, reject) => {
|
|
61
|
+
pending.set(id, {
|
|
62
|
+
resolve,
|
|
63
|
+
reject
|
|
64
|
+
});
|
|
65
|
+
socket.send(JSON.stringify({
|
|
66
|
+
wslink: "1.0",
|
|
67
|
+
id,
|
|
68
|
+
method: rpc,
|
|
69
|
+
args: [params],
|
|
70
|
+
kwargs: { stream: true }
|
|
71
|
+
}));
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function close() {
|
|
75
|
+
socket.close();
|
|
76
|
+
}
|
|
77
|
+
function getConnection() {
|
|
78
|
+
return { getSession: () => ({ call: (rpc, [params]) => call(rpc, params) }) };
|
|
79
|
+
}
|
|
80
|
+
function isOpen() {
|
|
81
|
+
return socket.readyState === WebSocket.OPEN;
|
|
82
|
+
}
|
|
83
|
+
function onConnectionClose(callback) {
|
|
84
|
+
onCloseCallback = callback;
|
|
85
|
+
}
|
|
86
|
+
function onConnectionError(callback) {
|
|
87
|
+
onErrorCallback = callback;
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
call,
|
|
91
|
+
close,
|
|
92
|
+
getConnection,
|
|
93
|
+
isOpen,
|
|
94
|
+
onConnectionClose,
|
|
95
|
+
onConnectionError,
|
|
96
|
+
ready
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//#endregion
|
|
100
|
+
export { createServerWsRpcClient };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { fetchSchema } from "./utils/fetch_schema.js";
|
|
2
|
+
import { api } from "../opengeodeweb_front_schemas.js";
|
|
3
|
+
//#region shared/scripts.ts
|
|
4
|
+
async function setAppBaseUrl(appBaseUrl) {
|
|
5
|
+
console.log("[API] setAppBaseUrl", appBaseUrl);
|
|
6
|
+
const schema = api.microservice.app.set_app_base_url;
|
|
7
|
+
return await fetchSchema({
|
|
8
|
+
schema,
|
|
9
|
+
params: { baseUrl: appBaseUrl },
|
|
10
|
+
baseURL: appBaseUrl
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
async function setBackBaseUrl(appBaseUrl, backBaseUrl) {
|
|
14
|
+
console.log("[API] setBackBaseUrl", appBaseUrl, backBaseUrl);
|
|
15
|
+
const schema = api.microservice.app.set_back_base_url;
|
|
16
|
+
return await fetchSchema({
|
|
17
|
+
schema,
|
|
18
|
+
params: { baseUrl: backBaseUrl },
|
|
19
|
+
baseURL: appBaseUrl
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function setViewerBaseUrl(appBaseUrl, viewerBaseUrl) {
|
|
23
|
+
console.log("[API] setViewerBaseUrl", appBaseUrl, viewerBaseUrl);
|
|
24
|
+
const schema = api.microservice.app.set_viewer_base_url;
|
|
25
|
+
return await fetchSchema({
|
|
26
|
+
schema,
|
|
27
|
+
params: { baseUrl: viewerBaseUrl },
|
|
28
|
+
baseURL: appBaseUrl
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
async function setIsAppReady(appBaseUrl, isReady) {
|
|
32
|
+
console.log("[API] setIsAppReady", isReady);
|
|
33
|
+
const schema = api.microservice.app.set_is_app_ready;
|
|
34
|
+
return await fetchSchema({
|
|
35
|
+
schema,
|
|
36
|
+
params: { isReady },
|
|
37
|
+
baseURL: appBaseUrl
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async function getIsAppReady(appBaseUrl) {
|
|
41
|
+
console.log("[API] getIsAppReady");
|
|
42
|
+
const schema = api.microservice.app.get_is_app_ready;
|
|
43
|
+
return await fetchSchema({
|
|
44
|
+
schema,
|
|
45
|
+
baseURL: appBaseUrl
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { getIsAppReady, setAppBaseUrl, setBackBaseUrl, setIsAppReady, setViewerBaseUrl };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import pTimeout from "p-timeout";
|
|
2
|
+
import "lodash";
|
|
3
|
+
//#region shared/utils/call_raw.ts
|
|
4
|
+
async function callClient({ rpc, params = {}, client }) {
|
|
5
|
+
if (globalThis.window !== void 0) return await client.getConnection().getSession().call(rpc, [params]);
|
|
6
|
+
return await client.call(rpc, params);
|
|
7
|
+
}
|
|
8
|
+
async function callRaw({ rpc, params = {}, client, timeout }, { request_error_function, response_function, response_error_function } = {}) {
|
|
9
|
+
async function performCall() {
|
|
10
|
+
try {
|
|
11
|
+
const response = await callClient({
|
|
12
|
+
rpc,
|
|
13
|
+
params,
|
|
14
|
+
client
|
|
15
|
+
});
|
|
16
|
+
if (response_function) await response_function(response);
|
|
17
|
+
return response;
|
|
18
|
+
} catch (error) {
|
|
19
|
+
if (request_error_function) request_error_function(error);
|
|
20
|
+
if (response_error_function) response_error_function(error);
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (timeout !== void 0 && timeout > 0) return await pTimeout(performCall(), {
|
|
25
|
+
milliseconds: timeout,
|
|
26
|
+
message: `${rpc}: Timed out after ${timeout}ms`
|
|
27
|
+
});
|
|
28
|
+
return await performCall();
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { callRaw };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { validateSchema } from "./validate_schema.js";
|
|
2
|
+
import { callRaw } from "./call_raw.js";
|
|
3
|
+
//#region shared/utils/call_schema.ts
|
|
4
|
+
const ERROR_400 = 400;
|
|
5
|
+
async function callSchema({ schema, params = {}, client, timeout }, { request_error_function, response_function, response_error_function, validation_error_function } = {}) {
|
|
6
|
+
const { valid, error: schema_error } = validateSchema(schema, params);
|
|
7
|
+
if (!valid) {
|
|
8
|
+
if (process.env.NODE_ENV !== "production") console.log("Bad request", schema_error, schema, params);
|
|
9
|
+
if (validation_error_function) validation_error_function({
|
|
10
|
+
code: ERROR_400,
|
|
11
|
+
name: "Bad request",
|
|
12
|
+
error: schema_error
|
|
13
|
+
});
|
|
14
|
+
throw new Error(`${schema.$id}: ${schema_error}`);
|
|
15
|
+
}
|
|
16
|
+
return await callRaw({
|
|
17
|
+
rpc: schema.$id,
|
|
18
|
+
params,
|
|
19
|
+
client,
|
|
20
|
+
timeout
|
|
21
|
+
}, {
|
|
22
|
+
request_error_function,
|
|
23
|
+
response_function,
|
|
24
|
+
response_error_function
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { callSchema };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { hasBody } from "./file.js";
|
|
2
|
+
import pTimeout from "p-timeout";
|
|
3
|
+
import { $fetch } from "ofetch";
|
|
4
|
+
import _ from "lodash";
|
|
5
|
+
//#region shared/utils/fetch_raw.ts
|
|
6
|
+
function resolveHeaders(headers, expectEvent) {
|
|
7
|
+
const resolvedHeaders = { ...headers };
|
|
8
|
+
if (expectEvent) {
|
|
9
|
+
const value = "text/event-stream";
|
|
10
|
+
if (_.isEmpty(resolvedHeaders)) resolvedHeaders.Accept = value;
|
|
11
|
+
else resolvedHeaders.Accept = `${resolvedHeaders.Accept}, ${value}`;
|
|
12
|
+
}
|
|
13
|
+
return resolvedHeaders;
|
|
14
|
+
}
|
|
15
|
+
async function performFetch({ route, method, params, baseURL, headers, max_retry, request_error_function, response_function, response_error_function }) {
|
|
16
|
+
return await $fetch(route, {
|
|
17
|
+
baseURL,
|
|
18
|
+
method,
|
|
19
|
+
headers,
|
|
20
|
+
...hasBody(params) ? { body: params } : {},
|
|
21
|
+
...max_retry === void 0 ? {} : { retry: max_retry },
|
|
22
|
+
async onRequestError({ error }) {
|
|
23
|
+
if (request_error_function) await request_error_function(error);
|
|
24
|
+
},
|
|
25
|
+
async onResponse({ response }) {
|
|
26
|
+
if (response.ok && response_function) await response_function(response._data);
|
|
27
|
+
},
|
|
28
|
+
async onResponseError({ response }) {
|
|
29
|
+
if (response_error_function) await response_error_function(response);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async function fetchRaw({ route, method, params = {}, baseURL, headers = {}, max_retry, timeout, expectEvent = false }, { request_error_function, response_function, response_error_function } = {}) {
|
|
34
|
+
const fetchOptions = {
|
|
35
|
+
route,
|
|
36
|
+
method,
|
|
37
|
+
params,
|
|
38
|
+
baseURL,
|
|
39
|
+
headers: resolveHeaders(headers, expectEvent),
|
|
40
|
+
max_retry,
|
|
41
|
+
request_error_function,
|
|
42
|
+
response_function,
|
|
43
|
+
response_error_function
|
|
44
|
+
};
|
|
45
|
+
if (timeout !== void 0 && timeout > 0) return await pTimeout(performFetch(fetchOptions), {
|
|
46
|
+
milliseconds: timeout,
|
|
47
|
+
message: `${route}: Timed out after ${timeout}ms`
|
|
48
|
+
});
|
|
49
|
+
return await performFetch(fetchOptions);
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
export { fetchRaw };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { fetchRaw } from "./fetch_raw.js";
|
|
2
|
+
import { validateSchema } from "./validate_schema.js";
|
|
3
|
+
//#region shared/utils/fetch_schema.ts
|
|
4
|
+
const ERROR_400 = 400;
|
|
5
|
+
async function fetchSchema({ schema, params = {}, baseURL, headers, timeout, expectEvent = false }, { request_error_function, response_function, response_error_function, validation_error_function } = {}) {
|
|
6
|
+
const { valid, error: schema_error } = validateSchema(schema, params);
|
|
7
|
+
if (!valid) {
|
|
8
|
+
if (process.env.NODE_ENV !== "production") console.log("Bad request", schema_error, schema, params);
|
|
9
|
+
if (validation_error_function) validation_error_function({
|
|
10
|
+
code: ERROR_400,
|
|
11
|
+
name: "Bad request",
|
|
12
|
+
error: schema_error
|
|
13
|
+
});
|
|
14
|
+
throw new Error(`${schema.$id}: ${schema_error}`);
|
|
15
|
+
}
|
|
16
|
+
return await fetchRaw({
|
|
17
|
+
route: schema.$id,
|
|
18
|
+
method: schema.methods.find((method) => method !== "OPTIONS"),
|
|
19
|
+
params,
|
|
20
|
+
baseURL,
|
|
21
|
+
headers,
|
|
22
|
+
max_retry: schema.max_retry,
|
|
23
|
+
timeout,
|
|
24
|
+
expectEvent
|
|
25
|
+
}, {
|
|
26
|
+
request_error_function,
|
|
27
|
+
response_function,
|
|
28
|
+
response_error_function
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { fetchSchema };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import _ from "lodash";
|
|
2
|
+
//#region shared/utils/file.ts
|
|
3
|
+
const BYTES_PER_KIBIBYTE = 1024;
|
|
4
|
+
const CHUNK_SIZE_BYTES = 8192 * BYTES_PER_KIBIBYTE;
|
|
5
|
+
function assertFile(file) {
|
|
6
|
+
console.log("[ASSERT_FILE] Asserting file", { file });
|
|
7
|
+
if (!(file instanceof File)) throw new Error("file must be an instance of File");
|
|
8
|
+
}
|
|
9
|
+
function hasBody(params) {
|
|
10
|
+
if (params instanceof FormData || params instanceof Blob) return true;
|
|
11
|
+
return !_.isEmpty(params);
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { BYTES_PER_KIBIBYTE, CHUNK_SIZE_BYTES, assertFile, hasBody };
|