From 8aaa3db9a86883208126f2a5f6cc383e268a4ca4 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Sat, 6 Jan 2024 20:48:21 -0800 Subject: [PATCH] Rename src/neuroglancer/ -> src/ and reformat prettier is now used for formatting, and biome is now used for linting. --- .editorconfig | 1 + .eslintrc | 8 +- .gitattributes | 12 + .github/actions/setup-firefox/action.yml | 26 +- .github/workflows/build.yml | 395 +- .gitignore | 4 + .prettierignore | 4 + .../nggraph/backend.ts => .prettierrc.yml | 0 CONTRIBUTING.md | 27 +- README.md | 92 +- biome.json | 64 + config/bundle-config.js | 228 +- config/esbuild-cli.js | 215 +- config/esbuild-dev-server.js | 57 +- config/esbuild.js | 208 +- config/esbuild_svg_inline_loader.js | 12 +- config/generate_code.js | 104 +- config/karma-entry-points.js | 62 +- config/karma-esbuild.js | 94 - config/karma.benchmark.js | 31 +- config/karma.conf.js | 32 +- config/resolve_real.js | 6 +- config/static-site-live-server.js | 256 +- examples/dependent-project/.gitignore | 3 - examples/dependent-project/README.md | 49 - .../config/webpack.config.js | 25 - .../config/webpack_helpers.js | 45 - examples/dependent-project/package.json | 22 - examples/dependent-project/src/main.ts | 26 - .../extra_key_bindings.ts | 21 - .../navigate_to_origin.ts | 25 - .../third_party/neuroglancer | 1 - examples/dependent-project/tsconfig.json | 15 - examples/dependent-project/tslint.json | 86 - examples/dependent-project/typings/index.d.ts | 1 - gulpfile.js | 45 - ngauth_server/README.md | 107 +- package-lock.json | 16668 +++------------- package.json | 21 +- python/examples/example_add_cube.py | 1 - src/annotation/annotation_layer_state.ts | 242 + src/annotation/backend.ts | 588 + src/annotation/base.ts | 165 + src/annotation/bounding_box.ts | 704 + .../annotation/ellipsoid.ts | 215 +- .../annotation/frontend_source.spec.ts | 96 +- .../annotation/frontend_source.ts | 576 +- src/annotation/index.ts | 1460 ++ src/{neuroglancer => }/annotation/line.ts | 168 +- src/{neuroglancer => }/annotation/point.ts | 112 +- .../annotation/rendering.md | 41 +- src/annotation/renderlayer.ts | 1156 ++ .../annotation/selection.ts | 10 +- .../annotation/type_handler.ts | 564 +- .../annotation/user_layer.css | 1 - src/annotation/user_layer.ts | 835 + .../async_computation/decode_blosc.ts | 14 +- .../async_computation/decode_blosc_request.ts | 5 +- .../async_computation/decode_compresso.ts | 16 +- .../decode_compresso_request.ts | 5 +- .../async_computation/decode_gzip.ts | 10 +- .../async_computation/decode_gzip_request.ts | 5 +- src/async_computation/decode_jpeg.ts | 87 + .../async_computation/decode_jpeg_request.ts | 17 +- src/async_computation/decode_png.ts | 41 + .../async_computation/decode_png_request.ts | 26 +- .../async_computation/decode_zstd.ts | 14 +- .../async_computation/decode_zstd_request.ts | 5 +- .../encode_compressed_segmentation.ts | 44 + .../encode_compressed_segmentation_request.ts | 18 +- .../async_computation/handler.ts | 34 +- .../async_computation/index.ts | 7 +- src/async_computation/obj_mesh.ts | 78 + .../async_computation/obj_mesh_request.ts | 13 +- .../async_computation/request.ts | 71 +- src/async_computation/vtk_mesh.ts | 35 + src/async_computation/vtk_mesh_request.ts | 25 + src/{neuroglancer => }/axes_lines.ts | 123 +- .../chunk_manager/README.md | 42 +- .../chunk_manager/backend.ts | 738 +- src/{neuroglancer => }/chunk_manager/base.ts | 41 +- .../chunk_manager/frontend.ts | 256 +- src/chunk_manager/generic_file_source.ts | 355 + src/coordinate_transform.spec.ts | 438 + .../coordinate_transform.ts | 969 +- .../chunk_source_frontend.ts | 66 +- .../credentials_provider/default_manager.ts | 5 +- .../credentials_provider/http_request.ts | 54 +- src/credentials_provider/index.ts | 231 + src/credentials_provider/oauth2.ts | 79 + src/credentials_provider/shared.ts | 75 + .../credentials_provider/shared_common.ts | 6 +- .../shared_counterpart.ts | 67 + src/{neuroglancer => }/data_panel_layout.css | 0 src/data_panel_layout.ts | 855 + src/{neuroglancer => }/datasource/boss/api.ts | 51 +- src/datasource/boss/backend.ts | 140 + .../datasource/boss/base.ts | 12 +- src/datasource/boss/bossauth.html | 23 + .../datasource/boss/credentials_provider.ts | 122 +- src/datasource/boss/frontend.ts | 944 + .../boss/register_credentials_provider.ts | 10 +- .../datasource/boss/register_default.ts | 9 +- .../datasource/brainmaps/api.ts | 60 +- src/datasource/brainmaps/backend.ts | 1290 ++ .../datasource/brainmaps/base.ts | 40 +- .../brainmaps/credentials_provider.ts | 10 +- src/datasource/brainmaps/frontend.ts | 1219 ++ .../register_credentials_provider.ts} | 12 +- src/datasource/brainmaps/register_default.ts | 50 + .../datasource/deepzoom/README.md | 10 +- src/datasource/deepzoom/backend.ts | 159 + .../datasource/deepzoom/base.ts | 8 +- src/datasource/deepzoom/frontend.ts | 347 + .../datasource/deepzoom/register_default.ts | 6 +- .../datasource/default_provider.ts | 10 +- src/datasource/dvid/api.ts | 192 + src/datasource/dvid/backend.ts | 217 + .../datasource/dvid/base.ts | 14 +- src/datasource/dvid/credentials_provider.ts | 134 + src/datasource/dvid/frontend.ts | 771 + .../dvid/register_credentials_provider.ts | 13 +- src/datasource/dvid/register_default.ts | 23 + .../datasource/file_protocols.md | 26 +- src/datasource/graphene/backend.ts | 586 + .../datasource/graphene/base.ts | 77 +- src/datasource/graphene/frontend.ts | 2575 +++ .../datasource/graphene/graphene.css | 14 +- .../datasource/graphene/register_default.ts | 6 +- src/{neuroglancer => }/datasource/index.ts | 241 +- .../middleauth/credentials_provider.ts | 136 +- .../register_credentials_provider.ts | 21 +- .../datasource/n5/README.md | 23 +- src/datasource/n5/backend.ts | 121 + src/{neuroglancer => }/datasource/n5/base.ts | 8 +- src/datasource/n5/frontend.ts | 576 + .../datasource/n5/register_default.ts | 6 +- .../datasource/ngauth/README.md | 0 src/datasource/ngauth/credentials_provider.ts | 147 + .../ngauth/register_credentials_provider.ts | 43 + src/datasource/nggraph/backend.ts | 0 .../nggraph/credentials_provider.ts | 53 +- src/datasource/nggraph/frontend.ts | 823 + .../nggraph}/register_default.ts | 6 +- src/datasource/nifti/backend.ts | 359 + .../datasource/nifti/base.ts | 6 +- src/datasource/nifti/frontend.ts | 227 + .../datasource/nifti/register_default.ts | 6 +- .../datasource/obj/backend.ts | 39 +- .../datasource/obj/frontend.ts | 46 +- .../obj}/register_default.ts | 6 +- .../datasource/precomputed/README.md | 9 +- .../datasource/precomputed/annotations.md | 75 +- src/datasource/precomputed/backend.ts | 1201 ++ .../datasource/precomputed/base.ts | 49 +- src/datasource/precomputed/frontend.ts | 1441 ++ .../datasource/precomputed/meshes.md | 51 +- .../precomputed/register_default.ts | 6 +- .../precomputed/segment_properties.md | 43 + .../datasource/precomputed/sharded.md | 48 +- .../datasource/precomputed/skeletons.md | 19 +- .../datasource/precomputed/volume.md | 313 +- src/datasource/python/backend.ts | 140 + .../datasource/python/base.ts | 14 +- .../datasource/python/frontend.spec.ts | 33 +- src/datasource/python/frontend.ts | 651 + src/datasource/render/backend.ts | 130 + .../datasource/render/base.ts | 12 +- src/datasource/render/frontend.ts | 702 + .../datasource/render/register_default.ts | 6 +- src/datasource/state_share.ts | 129 + src/datasource/vtk/backend.ts | 74 + .../datasource/vtk/frontend.ts | 46 +- .../datasource/vtk/parse.ts | 158 +- .../datasource/vtk/register_default.ts | 6 +- .../datasource/zarr/README.md | 7 +- src/datasource/zarr/backend.ts | 104 + .../datasource/zarr/base.ts | 4 +- src/datasource/zarr/codec/blosc/decode.ts | 40 + .../zarr/codec/blosc}/resolve.ts | 14 +- .../datasource/zarr/codec/bytes/decode.ts | 36 +- src/datasource/zarr/codec/bytes/resolve.ts | 71 + src/datasource/zarr/codec/crc32c/decode.ts | 42 + .../datasource/zarr/codec/crc32c/resolve.ts | 28 +- .../datasource/zarr/codec/decode.ts | 142 +- src/datasource/zarr/codec/gzip/decode.ts | 40 + .../datasource/zarr/codec/gzip/resolve.ts | 14 +- .../datasource/zarr/codec/index.ts | 10 +- src/datasource/zarr/codec/resolve.ts | 226 + .../zarr/codec/sharding_indexed/decode.ts | 169 + .../zarr/codec/sharding_indexed/resolve.ts | 106 + .../datasource/zarr/codec/transpose/decode.ts | 17 +- .../zarr/codec/transpose/resolve.ts | 113 + src/datasource/zarr/codec/zstd/decode.ts | 40 + .../zarr/codec/zstd}/resolve.ts | 14 +- src/datasource/zarr/frontend.ts | 564 + .../datasource/zarr/metadata/index.ts | 30 +- src/datasource/zarr/metadata/parse.ts | 466 + src/datasource/zarr/ome.ts | 295 + .../datasource/zarr/register_default.ts | 10 +- src/{neuroglancer => }/display_context.ts | 373 +- src/{neuroglancer => }/gpu_hash/README.md | 11 +- .../gpu_hash/hash_function.ts | 2 +- .../gpu_hash/hash_table.benchmark.ts | 16 +- .../gpu_hash/hash_table.spec.ts | 97 +- src/{neuroglancer => }/gpu_hash/hash_table.ts | 139 +- src/gpu_hash/shader.spec.ts | 192 + src/{neuroglancer => }/gpu_hash/shader.ts | 107 +- .../help/input_event_bindings.css | 0 .../help/input_event_bindings.ts | 129 +- src/{neuroglancer => }/image_user_layer.css | 0 src/image_user_layer.ts | 553 + src/{neuroglancer => }/kvstore/index.ts | 41 +- src/kvstore/special/index.ts | 177 + src/{neuroglancer => }/layer.ts | 1169 +- src/layer_data_source.ts | 491 + src/{neuroglancer => }/layer_group_viewer.css | 0 src/layer_group_viewer.ts | 625 + .../layer_groups_layout.css | 7 +- src/layer_groups_layout.ts | 819 + src/{neuroglancer => }/layout.ts | 10 +- src/main.ts | 4 +- src/main_module.ts | 48 +- src/main_python.ts | 215 +- src/{neuroglancer => }/maximize_button.css | 0 src/{neuroglancer => }/mesh/backend.ts | 525 +- src/{neuroglancer => }/mesh/base.ts | 19 +- src/{neuroglancer => }/mesh/draco/Dockerfile | 0 src/{neuroglancer => }/mesh/draco/README.md | 0 src/{neuroglancer => }/mesh/draco/build.sh | 0 .../mesh/draco/build_wasm.py | 0 .../draco_overlay/draco/draco_features.h | 0 .../mesh/draco/generate_first_bit_table.py | 0 src/{neuroglancer => }/mesh/draco/index.ts | 75 +- .../mesh/draco/neuroglancer_draco.cc | 0 .../mesh/draco/neuroglancer_draco.wasm | Bin src/{neuroglancer => }/mesh/draco/stub.js | 4 +- src/mesh/frontend.ts | 1084 + src/mesh/multiscale.spec.ts | 1047 + src/{neuroglancer => }/mesh/multiscale.ts | 288 +- .../mesh/triangle_strips.spec.ts | 225 +- .../mesh/triangle_strips.ts | 110 +- src/{neuroglancer => }/navigation_state.ts | 1181 +- .../annotation/annotation_layer_state.ts | 180 - src/neuroglancer/annotation/backend.ts | 434 - src/neuroglancer/annotation/base.ts | 120 - src/neuroglancer/annotation/bounding_box.ts | 541 - src/neuroglancer/annotation/index.ts | 1134 -- src/neuroglancer/annotation/renderlayer.ts | 820 - src/neuroglancer/annotation/user_layer.ts | 648 - .../async_computation/decode_jpeg.ts | 66 - .../async_computation/decode_png.ts | 33 - .../encode_compressed_segmentation.ts | 37 - .../async_computation/obj_mesh.ts | 66 - .../async_computation/vtk_mesh.ts | 31 - .../async_computation/vtk_mesh_request.ts | 22 - .../chunk_manager/generic_file_source.ts | 268 - src/neuroglancer/coordinate_transform.spec.ts | 288 - .../credentials_provider/index.ts | 176 - .../credentials_provider/oauth2.ts | 62 - .../credentials_provider/shared.ts | 51 - .../shared_counterpart.ts | 53 - src/neuroglancer/data_panel_layout.ts | 669 - src/neuroglancer/datasource/boss/backend.ts | 105 - .../datasource/boss/bossauth.html | 20 - src/neuroglancer/datasource/boss/frontend.ts | 680 - .../datasource/brainmaps/backend.ts | 957 - .../datasource/brainmaps/frontend.ts | 935 - .../register_credentials_provider.ts | 23 - .../datasource/brainmaps/register_default.ts | 35 - .../datasource/deepzoom/backend.ts | 114 - .../datasource/deepzoom/frontend.ts | 238 - src/neuroglancer/datasource/dvid/api.ts | 150 - src/neuroglancer/datasource/dvid/backend.ts | 147 - .../datasource/dvid/credentials_provider.ts | 106 - src/neuroglancer/datasource/dvid/frontend.ts | 577 - .../datasource/graphene/backend.ts | 443 - .../datasource/graphene/frontend.ts | 1978 -- src/neuroglancer/datasource/n5/backend.ts | 85 - src/neuroglancer/datasource/n5/frontend.ts | 440 - .../datasource/ngauth/credentials_provider.ts | 120 - .../ngauth/register_credentials_provider.ts | 28 - .../datasource/nggraph/frontend.ts | 621 - src/neuroglancer/datasource/nifti/backend.ts | 239 - src/neuroglancer/datasource/nifti/frontend.ts | 151 - .../datasource/precomputed/backend.ts | 822 - .../datasource/precomputed/frontend.ts | 987 - .../precomputed/segment_properties.md | 43 - src/neuroglancer/datasource/python/backend.ts | 96 - .../datasource/python/frontend.ts | 491 - src/neuroglancer/datasource/render/backend.ts | 106 - .../datasource/render/frontend.ts | 554 - src/neuroglancer/datasource/state_share.ts | 97 - src/neuroglancer/datasource/vtk/backend.ts | 58 - src/neuroglancer/datasource/zarr/backend.ts | 83 - .../datasource/zarr/codec/blosc/decode.ts | 32 - .../datasource/zarr/codec/bytes/resolve.ts | 60 - .../datasource/zarr/codec/crc32c/decode.ts | 39 - .../datasource/zarr/codec/gzip/decode.ts | 32 - .../datasource/zarr/codec/resolve.ts | 167 - .../zarr/codec/sharding_indexed/decode.ts | 120 - .../zarr/codec/sharding_indexed/resolve.ts | 69 - .../zarr/codec/transpose/resolve.ts | 82 - .../datasource/zarr/codec/zstd/decode.ts | 32 - src/neuroglancer/datasource/zarr/frontend.ts | 401 - .../datasource/zarr/metadata/parse.ts | 359 - src/neuroglancer/datasource/zarr/ome.ts | 219 - src/neuroglancer/gpu_hash/shader.spec.ts | 158 - src/neuroglancer/image_user_layer.ts | 412 - src/neuroglancer/kvstore/special/index.ts | 124 - src/neuroglancer/layer_data_source.ts | 378 - src/neuroglancer/layer_group_viewer.ts | 497 - src/neuroglancer/layer_groups_layout.ts | 650 - src/neuroglancer/mesh/frontend.ts | 825 - src/neuroglancer/mesh/multiscale.spec.ts | 514 - .../credentials_provider.ts | 72 - .../python_integration/prefetch.ts | 105 - .../python_integration/screenshots.ts | 153 - src/neuroglancer/python_integration/volume.ts | 444 - src/neuroglancer/renderlayer.ts | 222 - src/neuroglancer/segment_color.spec.ts | 60 - .../segmentation_display_state/backend.ts | 78 - .../segmentation_display_state/frontend.ts | 847 - src/neuroglancer/segmentation_graph/source.ts | 122 - src/neuroglancer/segmentation_user_layer.ts | 1023 - src/neuroglancer/single_mesh/backend.ts | 209 - src/neuroglancer/single_mesh/frontend.spec.ts | 88 - src/neuroglancer/single_mesh/frontend.ts | 493 - src/neuroglancer/single_mesh_user_layer.ts | 211 - .../skeleton/decode_swc_skeleton.spec.ts | 31 - src/neuroglancer/skeleton/frontend.ts | 664 - src/neuroglancer/sliceview/README.md | 33 - src/neuroglancer/sliceview/backend.ts | 481 - .../backend_chunk_decoders/bossNpz.ts | 53 - .../sliceview/backend_chunk_decoders/png.ts | 40 - .../backend_chunk_decoders/postprocess.ts | 52 - .../sliceview/backend_chunk_decoders/raw.ts | 42 - src/neuroglancer/sliceview/base.spec.ts | 111 - .../sliceview/chunk_format_testing.ts | 133 - .../chunk_format.spec.ts | 97 - .../compressed_segmentation/encode_common.ts | 325 - .../encode_uint32.spec.ts | 233 - .../encode_uint64.spec.ts | 234 - src/neuroglancer/sliceview/frontend.ts | 825 - .../sliceview/single_texture_chunk_format.ts | 115 - .../uncompressed_chunk_format.spec.ts | 67 - .../sliceview/volume/renderlayer.ts | 504 - .../volume/segmentation_renderlayer.ts | 316 - src/neuroglancer/ui/annotations.ts | 1672 -- .../ui/default_clipboard_handling.spec.ts | 40 - .../ui/default_input_event_bindings.ts | 162 - src/neuroglancer/ui/default_viewer_setup.ts | 55 - src/neuroglancer/ui/layer_data_sources_tab.ts | 453 - src/neuroglancer/ui/layer_side_panel.ts | 395 - src/neuroglancer/ui/position_drag_and_drop.ts | 61 - src/neuroglancer/ui/segment_list.ts | 1291 -- .../ui/segment_split_merge_tools.ts | 401 - .../ui/segmentation_display_options_tab.ts | 108 - src/neuroglancer/ui/selection_details.ts | 168 - src/neuroglancer/ui/viewer_settings.ts | 109 - src/neuroglancer/util/color.spec.ts | 74 - src/neuroglancer/util/completion.ts | 117 - src/neuroglancer/util/gcs_bucket_listing.ts | 64 - src/neuroglancer/util/google_oauth2.ts | 272 - .../util/google_oauth2_redirect.html | 19 - src/neuroglancer/util/http_path_completion.ts | 138 - src/neuroglancer/util/matrix.spec.ts | 235 - src/neuroglancer/util/npy.spec.ts | 83 - src/neuroglancer/util/s3_bucket_listing.ts | 65 - src/neuroglancer/util/si_units.spec.ts | 60 - .../util/special_protocol_request.ts | 143 - src/neuroglancer/util/uint64.spec.ts | 103 - src/neuroglancer/viewer.ts | 825 - src/neuroglancer/volume_rendering/backend.ts | 146 - .../volume_rendering/volume_render_layer.ts | 490 - src/neuroglancer/webgl/buffer.ts | 89 - src/neuroglancer/webgl/lerp.spec.ts | 284 - src/neuroglancer/webgl/shader_lib.spec.ts | 167 - src/neuroglancer/webgl/shader_testing.spec.ts | 103 - .../webgl/shader_ui_controls.spec.ts | 478 - .../webgl/square_corners_buffer.ts | 56 - src/neuroglancer/webgl/texture.ts | 91 - src/neuroglancer/webgl/texture_access.spec.ts | 88 - src/neuroglancer/webgl/trivial_shaders.ts | 87 - .../widget/annotation_tool_status.ts | 132 - .../widget/channel_dimensions_widget.ts | 216 - .../widget/display_dimensions_widget.ts | 540 - src/neuroglancer/widget/invlerp.ts | 686 - src/neuroglancer/widget/layer_control.ts | 138 - .../widget/layer_control_channel_invlerp.ts | 85 - .../widget/layer_control_property_invlerp.ts | 98 - .../widget/layer_control_range.ts | 46 - src/neuroglancer/widget/position_plot.ts | 314 - src/neuroglancer/widget/position_widget.ts | 1321 -- .../widget/segmentation_color_mode.ts | 105 - src/neuroglancer/widget/shader_controls.ts | 197 - src/{neuroglancer => }/noselect.css | 0 src/{neuroglancer => }/object_picking.ts | 61 +- src/{neuroglancer => }/overlay.css | 0 src/{neuroglancer => }/overlay.ts | 20 +- .../perspective_view/backend.ts | 27 +- .../perspective_view/base.ts | 2 +- .../perspective_view/panel.css | 0 .../perspective_view/panel.ts | 734 +- .../perspective_view/render_layer.ts | 45 +- .../projection_parameters.ts | 30 +- .../python_integration/api.ts | 119 +- .../credentials_provider.ts | 97 + .../python_integration/event_action_map.ts | 12 +- src/python_integration/prefetch.ts | 116 + .../python_integration/remote_actions.ts | 43 +- .../remote_status_messages.ts | 20 +- src/python_integration/screenshots.ts | 192 + src/python_integration/volume.ts | 604 + .../render_coordinate_transform.ts | 544 +- .../render_layer_backend.ts | 62 +- src/{neuroglancer => }/render_layer_common.ts | 9 +- .../render_scale_statistics.ts | 73 +- .../rendered_data_panel.css | 2 +- src/{neuroglancer => }/rendered_data_panel.ts | 570 +- src/renderlayer.ts | 289 + src/segment_color.spec.ts | 63 + src/{neuroglancer => }/segment_color.ts | 49 +- src/segmentation_display_state/backend.ts | 97 + .../segmentation_display_state/base.ts | 94 +- src/segmentation_display_state/frontend.ts | 1087 + .../property_map.spec.ts | 36 +- .../property_map.ts | 766 +- .../segmentation_graph/local.spec.ts | 64 +- .../segmentation_graph/local.ts | 132 +- .../segmentation_graph/segment_id.ts | 5 +- src/segmentation_graph/source.ts | 148 + .../segmentation_user_layer.css | 19 +- src/segmentation_user_layer.ts | 1442 ++ .../shared_disjoint_sets.ts | 120 +- .../shared_watchable_value.ts | 59 +- src/single_mesh/backend.ts | 305 + src/{neuroglancer => }/single_mesh/base.ts | 10 +- src/single_mesh/frontend.spec.ts | 100 + src/single_mesh/frontend.ts | 694 + .../single_mesh_user_layer.css | 3 +- src/single_mesh_user_layer.ts | 263 + src/{neuroglancer => }/skeleton/backend.ts | 132 +- src/{neuroglancer => }/skeleton/base.ts | 4 +- .../skeleton/decode_precomputed_skeleton.ts | 38 +- src/skeleton/decode_swc_skeleton.spec.ts | 33 + .../skeleton/decode_swc_skeleton.ts | 48 +- src/skeleton/frontend.ts | 873 + src/sliceview/README.md | 34 + src/sliceview/backend.ts | 580 + .../backend_chunk_decoders/bossNpz.ts | 72 + .../compressed_segmentation.ts | 9 +- .../backend_chunk_decoders/compresso.ts | 25 +- .../sliceview/backend_chunk_decoders/index.ts | 12 +- .../sliceview/backend_chunk_decoders/jpeg.ts | 28 +- .../backend_chunk_decoders/ndstoreNpz.ts | 51 +- src/sliceview/backend_chunk_decoders/png.ts | 44 + .../backend_chunk_decoders/postprocess.ts | 75 + src/sliceview/backend_chunk_decoders/raw.ts | 52 + src/sliceview/base.spec.ts | 201 + src/{neuroglancer => }/sliceview/base.ts | 465 +- .../sliceview/bounding_box_shader_helper.ts | 328 +- .../sliceview/chunk_format_handlers.ts | 4 +- src/sliceview/chunk_format_testing.ts | 163 + .../sliceview/chunk_layout.ts | 23 +- .../compressed_segmentation/README.md | 78 +- .../chunk_format.spec.ts | 143 + .../compressed_segmentation/chunk_format.ts | 280 +- .../compressed_segmentation/decode_common.ts | 46 +- .../compressed_segmentation/decode_uint32.ts | 100 +- .../compressed_segmentation/decode_uint64.ts | 114 +- .../encode.benchmark.ts | 30 +- .../compressed_segmentation/encode_common.ts | 421 + .../encode_uint32.spec.ts | 357 + .../compressed_segmentation/encode_uint32.ts | 128 +- .../encode_uint64.spec.ts | 414 + .../compressed_segmentation/encode_uint64.ts | 149 +- .../compressed_segmentation/test_util.ts | 14 +- .../sliceview/compresso/Dockerfile | 0 .../sliceview/compresso/LICENSE | 0 .../sliceview/compresso/build.sh | 0 .../sliceview/compresso/build_wasm.sh | 0 .../sliceview/compresso/cc3d.hpp | 0 .../sliceview/compresso/compresso.hpp | 0 .../sliceview/compresso/compresso.wasm | Bin .../sliceview/compresso/compresso_wasm.cc | 0 .../sliceview/compresso/index.ts | 66 +- src/sliceview/frontend.ts | 1052 + .../sliceview/image_layer_rendering.md | 87 +- src/{neuroglancer => }/sliceview/panel.ts | 417 +- .../sliceview/png/Dockerfile | 0 src/{neuroglancer => }/sliceview/png/build.sh | 0 .../sliceview/png/build_wasm.sh | 0 src/{neuroglancer => }/sliceview/png/index.ts | 158 +- .../sliceview/png/libpng.wasm | Bin .../sliceview/png/png_wasm.c | 0 .../sliceview/renderlayer.ts | 179 +- src/sliceview/single_texture_chunk_format.ts | 153 + .../uncompressed_chunk_format.spec.ts | 85 + .../sliceview/uncompressed_chunk_format.ts | 251 +- .../sliceview/volume/backend.ts | 74 +- .../sliceview/volume/base.ts | 205 +- .../sliceview/volume/frontend.ts | 131 +- .../sliceview/volume/image_renderlayer.ts | 95 +- src/sliceview/volume/renderlayer.ts | 711 + .../volume/segmentation_renderlayer.ts | 454 + .../sliceview/wire_frame.ts | 143 +- src/{neuroglancer => }/status.css | 0 src/{neuroglancer => }/status.ts | 50 +- src/{neuroglancer => }/trackable_alpha.ts | 4 +- src/{neuroglancer => }/trackable_blend.ts | 10 +- src/{neuroglancer => }/trackable_boolean.ts | 72 +- .../trackable_finite_float.ts | 4 +- src/{neuroglancer => }/trackable_value.ts | 204 +- src/{neuroglancer => }/trackable_vec3.ts | 18 +- src/{neuroglancer => }/ui/annotations.css | 12 +- src/ui/annotations.ts | 2138 ++ src/{neuroglancer => }/ui/context_menu.css | 0 src/{neuroglancer => }/ui/context_menu.ts | 89 +- src/ui/default_clipboard_handling.spec.ts | 54 + .../ui/default_clipboard_handling.ts | 33 +- src/ui/default_input_event_bindings.ts | 200 + src/{neuroglancer => }/ui/default_viewer.css | 3 +- src/{neuroglancer => }/ui/default_viewer.ts | 8 +- src/ui/default_viewer_setup.ts | 66 + .../ui/disable_default_actions.ts | 19 +- src/{neuroglancer => }/ui/drag_and_drop.css | 0 src/{neuroglancer => }/ui/drag_and_drop.ts | 43 +- src/{neuroglancer => }/ui/layer_bar.css | 24 +- src/{neuroglancer => }/ui/layer_bar.ts | 309 +- .../ui/layer_data_sources_tab.css | 1 - src/ui/layer_data_sources_tab.ts | 525 + .../ui/layer_drag_and_drop.ts | 363 +- .../ui/layer_list_panel.css | 17 +- src/{neuroglancer => }/ui/layer_list_panel.ts | 270 +- .../ui/layer_side_panel.css | 8 +- src/ui/layer_side_panel.ts | 480 + .../ui/layer_side_panel_state.ts | 178 +- src/{neuroglancer => }/ui/minimal_viewer.ts | 15 +- src/ui/position_drag_and_drop.ts | 95 + src/{neuroglancer => }/ui/segment_list.css | 39 +- src/ui/segment_list.ts | 1676 ++ .../ui/segment_select_tools.ts | 103 +- .../ui/segment_split_merge_tools.css | 0 src/ui/segment_split_merge_tools.ts | 555 + src/ui/segmentation_display_options_tab.ts | 137 + .../ui/selection_details.css | 3 +- src/ui/selection_details.ts | 207 + src/{neuroglancer => }/ui/side_panel.css | 1 - src/{neuroglancer => }/ui/side_panel.ts | 521 +- .../ui/side_panel_location.ts | 102 +- src/{neuroglancer => }/ui/state_editor.css | 1 - src/{neuroglancer => }/ui/state_editor.ts | 104 +- src/{neuroglancer => }/ui/statistics.css | 0 src/{neuroglancer => }/ui/statistics.ts | 261 +- src/{neuroglancer => }/ui/title.ts | 8 +- src/{neuroglancer => }/ui/tool.css | 4 +- src/{neuroglancer => }/ui/tool.ts | 346 +- src/{neuroglancer => }/ui/url_hash_binding.ts | 106 +- src/{neuroglancer => }/ui/viewer_settings.css | 3 +- src/ui/viewer_settings.ts | 136 + src/{neuroglancer => }/uint64_map.spec.ts | 83 +- src/{neuroglancer => }/uint64_map.ts | 61 +- src/{neuroglancer => }/uint64_ordered_set.ts | 34 +- src/{neuroglancer => }/uint64_set.spec.ts | 44 +- src/{neuroglancer => }/uint64_set.ts | 77 +- .../util/animation_frame_debounce.ts | 23 +- src/{neuroglancer => }/util/array.spec.ts | 156 +- src/{neuroglancer => }/util/array.ts | 246 +- .../util/automatic_focus.ts | 87 +- src/{neuroglancer => }/util/base64.ts | 8 +- .../util/byte_range_http_requests.ts | 37 +- .../util/cancellation.spec.ts | 82 +- src/{neuroglancer => }/util/cancellation.ts | 51 +- src/{neuroglancer => }/util/clipboard.ts | 29 +- src/util/color.spec.ts | 93 + src/{neuroglancer => }/util/color.ts | 98 +- src/{neuroglancer => }/util/colorspace.ts | 74 +- src/{neuroglancer => }/util/compare.ts | 2 +- src/util/completion.ts | 139 + src/{neuroglancer => }/util/data_type.ts | 44 +- .../util/disjoint_sets.spec.ts | 76 +- src/{neuroglancer => }/util/disjoint_sets.ts | 86 +- src/{neuroglancer => }/util/disposable.ts | 43 +- src/{neuroglancer => }/util/dom.ts | 30 +- .../util/drag_and_drop.spec.ts | 18 +- src/{neuroglancer => }/util/drag_and_drop.ts | 23 +- src/{neuroglancer => }/util/dropdown.ts | 54 +- src/{neuroglancer => }/util/endian.spec.ts | 16 +- src/{neuroglancer => }/util/endian.ts | 34 +- src/{neuroglancer => }/util/erf.ts | 4 +- src/{neuroglancer => }/util/error.ts | 4 +- .../util/event_action_map.ts | 233 +- src/{neuroglancer => }/util/float.ts | 8 +- .../util/float32_to_string.spec.ts | 138 +- .../util/float32_to_string.ts | 3 +- .../util/float32array_builder.ts | 12 +- .../util/float64array_builder.ts | 12 +- src/util/gcs_bucket_listing.ts | 92 + src/{neuroglancer => }/util/geom.spec.ts | 12 +- src/{neuroglancer => }/util/geom.ts | 229 +- src/util/google_oauth2.ts | 315 + src/util/google_oauth2_redirect.html | 21 + src/{neuroglancer => }/util/gzip.ts | 8 +- src/{neuroglancer => }/util/hash.ts | 22 +- src/{neuroglancer => }/util/hex.ts | 6 +- .../util/hierarchical_map.ts | 50 +- src/util/http_path_completion.ts | 199 + src/{neuroglancer => }/util/http_request.ts | 93 +- .../util/int16array_builder.ts | 12 +- .../util/int32array_builder.ts | 12 +- .../util/int8array_builder.ts | 12 +- src/{neuroglancer => }/util/json.spec.ts | 64 +- src/{neuroglancer => }/util/json.ts | 410 +- .../util/keyboard_bindings.ts | 110 +- src/{neuroglancer => }/util/lerp.ts | 287 +- src/{neuroglancer => }/util/linked_list.0.ts | 20 +- src/{neuroglancer => }/util/linked_list.1.ts | 20 +- src/{neuroglancer => }/util/linked_list.ts | 0 .../util/longest_common_prefix.ts | 8 +- src/util/matrix.spec.ts | 380 + src/{neuroglancer => }/util/matrix.ts | 130 +- src/{neuroglancer => }/util/memoize.ts | 8 +- src/{neuroglancer => }/util/message_list.ts | 18 +- src/{neuroglancer => }/util/mixin.ts | 15 +- src/{neuroglancer => }/util/mouse_bindings.ts | 38 +- src/{neuroglancer => }/util/mouse_drag.ts | 27 +- src/util/npy.spec.ts | 92 + src/{neuroglancer => }/util/npy.ts | 69 +- .../util/number_to_string.spec.ts | 16 +- .../util/number_to_string.ts | 2 +- src/{neuroglancer => }/util/numpy_dtype.ts | 17 +- src/{neuroglancer => }/util/object_id.ts | 5 +- src/{neuroglancer => }/util/pairing_heap.0.ts | 49 +- src/{neuroglancer => }/util/pairing_heap.1.ts | 49 +- src/{neuroglancer => }/util/pairing_heap.ts | 12 +- src/{neuroglancer => }/util/random.ts | 16 +- src/{neuroglancer => }/util/s3.ts | 34 +- src/util/s3_bucket_listing.ts | 88 + .../util/scroll_into_view.ts | 6 +- src/util/si_units.spec.ts | 74 + src/{neuroglancer => }/util/si_units.ts | 120 +- src/{neuroglancer => }/util/signal.spec.ts | 77 +- src/{neuroglancer => }/util/signal.ts | 14 +- .../util/signal_binding_updater.ts | 16 +- src/{neuroglancer => }/util/spatial_units.ts | 34 +- src/util/special_protocol_request.ts | 195 + src/{neuroglancer => }/util/string.ts | 2 +- src/{neuroglancer => }/util/touch_bindings.ts | 162 +- src/{neuroglancer => }/util/trackable.ts | 52 +- src/{neuroglancer => }/util/trackable_enum.ts | 14 +- .../util/uint16array_builder.ts | 12 +- .../util/uint32array_builder.ts | 12 +- src/util/uint64.spec.ts | 127 + src/{neuroglancer => }/util/uint64.ts | 102 +- .../util/uint8array_builder.ts | 12 +- src/{neuroglancer => }/util/vector.ts | 57 +- .../util/velocity_estimation.ts | 19 +- src/{neuroglancer => }/util/watchable_map.ts | 20 +- src/{neuroglancer => }/util/wheel_zoom.ts | 2 +- src/{neuroglancer => }/util/zorder.spec.ts | 48 +- src/{neuroglancer => }/util/zorder.ts | 58 +- src/{neuroglancer => }/viewer.css | 0 src/viewer.ts | 1144 ++ src/{neuroglancer => }/viewer_state.ts | 19 +- .../visibility_priority/backend.ts | 33 +- .../visibility_priority/frontend.ts | 24 +- src/volume_rendering/backend.ts | 199 + .../volume_rendering/base.ts | 125 +- src/volume_rendering/volume_render_layer.ts | 675 + src/{neuroglancer => }/webgl/bounding_box.ts | 11 +- src/webgl/buffer.ts | 131 + src/{neuroglancer => }/webgl/circles.ts | 37 +- src/{neuroglancer => }/webgl/colormaps.ts | 15 +- src/{neuroglancer => }/webgl/context.ts | 33 +- .../webgl/dynamic_shader.ts | 187 +- src/{neuroglancer => }/webgl/ellipse.ts | 56 +- src/{neuroglancer => }/webgl/empirical_cdf.ts | 142 +- .../webgl/index_emulation.spec.ts | 36 +- .../webgl/index_emulation.ts | 48 +- src/webgl/lerp.spec.ts | 385 + src/{neuroglancer => }/webgl/lerp.ts | 140 +- src/{neuroglancer => }/webgl/lines.ts | 70 +- src/{neuroglancer => }/webgl/offscreen.ts | 241 +- src/{neuroglancer => }/webgl/quad.ts | 12 +- src/{neuroglancer => }/webgl/shader.ts | 321 +- src/webgl/shader_lib.spec.ts | 207 + src/{neuroglancer => }/webgl/shader_lib.ts | 186 +- src/webgl/shader_testing.spec.ts | 117 + .../webgl/shader_testing.ts | 246 +- src/webgl/shader_ui_controls.spec.ts | 564 + .../webgl/shader_ui_controls.ts | 997 +- src/{neuroglancer => }/webgl/spheres.ts | 83 +- src/webgl/square_corners_buffer.ts | 109 + src/{neuroglancer => }/webgl/testing.ts | 18 +- src/webgl/texture.ts | 151 + src/webgl/texture_access.spec.ts | 107 + .../webgl/texture_access.ts | 277 +- src/webgl/trivial_shaders.ts | 94 + src/{neuroglancer => }/webgl/vertex_id.ts | 26 +- src/{neuroglancer => }/widget/add_button.ts | 6 +- .../widget/annotation_tool_status.css | 9 +- src/widget/annotation_tool_status.ts | 153 + .../widget/associate_label.ts | 9 +- .../widget/channel_dimensions_widget.css | 1 - src/widget/channel_dimensions_widget.ts | 254 + .../widget/checkbox_icon.css | 0 .../widget/checkbox_icon.ts | 30 +- src/{neuroglancer => }/widget/close_button.ts | 6 +- src/{neuroglancer => }/widget/color.ts | 37 +- .../widget/coordinate_transform.css | 31 +- .../widget/coordinate_transform.ts | 836 +- src/{neuroglancer => }/widget/copy_button.ts | 6 +- .../widget/delete_button.ts | 8 +- .../widget/dependent_view_widget.ts | 50 +- .../widget/display_dimensions_widget.css | 21 +- src/widget/display_dimensions_widget.ts | 619 + src/{neuroglancer => }/widget/enum_widget.ts | 30 +- src/{neuroglancer => }/widget/eye_button.css | 0 src/{neuroglancer => }/widget/eye_button.ts | 10 +- .../widget/filter_button.ts | 6 +- src/{neuroglancer => }/widget/help_button.ts | 4 +- .../widget/hidden_submit_button.ts | 18 +- src/{neuroglancer => }/widget/icon.css | 0 src/{neuroglancer => }/widget/icon.ts | 22 +- src/{neuroglancer => }/widget/invlerp.css | 3 +- src/widget/invlerp.ts | 921 + .../widget/layer_control.css | 7 +- src/widget/layer_control.ts | 206 + src/widget/layer_control_channel_invlerp.ts | 106 + .../widget/layer_control_checkbox.ts | 18 +- .../widget/layer_control_color.ts | 38 +- .../widget/layer_control_enum.ts | 31 +- src/widget/layer_control_property_invlerp.ts | 136 + src/widget/layer_control_range.ts | 51 + .../widget/layer_reference.ts | 34 +- .../widget/linked_layer.css | 2 +- src/{neuroglancer => }/widget/linked_layer.ts | 86 +- .../widget/maximize_button.ts | 6 +- .../widget/move_to_button.ts | 4 +- .../widget/multiline_autocomplete.css | 11 +- .../widget/multiline_autocomplete.ts | 434 +- .../widget/number_input_widget.ts | 37 +- .../widget/position_plot.css | 21 +- src/widget/position_plot.ts | 389 + .../widget/position_widget.css | 23 +- src/widget/position_widget.ts | 1572 ++ src/{neuroglancer => }/widget/range.css | 6 +- src/{neuroglancer => }/widget/range.ts | 52 +- .../widget/render_scale_widget.css | 1 - .../widget/render_scale_widget.ts | 292 +- src/{neuroglancer => }/widget/scale_bar.ts | 220 +- .../widget/segmentation_color_mode.css | 0 src/widget/segmentation_color_mode.ts | 115 + .../widget/shader_code_widget.css | 0 .../widget/shader_code_widget.ts | 122 +- src/widget/shader_controls.ts | 261 + src/{neuroglancer => }/widget/star_button.css | 0 src/{neuroglancer => }/widget/star_button.ts | 10 +- src/{neuroglancer => }/widget/tab_view.css | 0 src/{neuroglancer => }/widget/tab_view.ts | 207 +- .../widget/text_icon_button.css | 0 .../widget/text_icon_button.ts | 8 +- src/{neuroglancer => }/widget/text_input.ts | 19 +- src/{neuroglancer => }/widget/tooltip.css | 0 src/{neuroglancer => }/widget/tooltip.ts | 22 +- src/{neuroglancer => }/widget/vec3.css | 2 +- .../widget/vec3_entry_widget.ts | 40 +- src/{neuroglancer => }/widget/virtual_list.ts | 273 +- src/{neuroglancer => }/worker_rpc.ts | 209 +- src/{neuroglancer => }/worker_rpc_context.ts | 4 +- .../decode.template.ts | 0 .../encode.template.ts | 0 .../encode_common.template.ts | 0 .../util/linked_list.template.ts | 0 .../util/pairing_heap.template.ts | 0 .../util/typedarray_builder.template.ts | 0 testdata/README.md | 5 +- tsconfig.json | 3 +- tslint.json | 51 +- typings/glsl-editor.d.ts | 4 +- typings/glsl.d.ts | 2 +- typings/index.d.ts | 2 +- typings/jpgjs.d.ts | 10 +- typings/nifti-reader-js.d.ts | 47 +- typings/svg.d.ts | 2 +- typings/url-loader.d.ts | 2 +- 787 files changed, 84349 insertions(+), 71222 deletions(-) create mode 100644 .gitattributes create mode 100644 .prettierignore rename src/neuroglancer/datasource/nggraph/backend.ts => .prettierrc.yml (100%) create mode 100644 biome.json delete mode 100644 config/karma-esbuild.js delete mode 100644 examples/dependent-project/.gitignore delete mode 100644 examples/dependent-project/README.md delete mode 100644 examples/dependent-project/config/webpack.config.js delete mode 100644 examples/dependent-project/config/webpack_helpers.js delete mode 100644 examples/dependent-project/package.json delete mode 100644 examples/dependent-project/src/main.ts delete mode 100644 examples/dependent-project/src/my-neuroglancer-project/extra_key_bindings.ts delete mode 100644 examples/dependent-project/src/my-neuroglancer-project/navigate_to_origin.ts delete mode 120000 examples/dependent-project/third_party/neuroglancer delete mode 100644 examples/dependent-project/tsconfig.json delete mode 100644 examples/dependent-project/tslint.json delete mode 100644 examples/dependent-project/typings/index.d.ts delete mode 100644 gulpfile.js create mode 100644 src/annotation/annotation_layer_state.ts create mode 100644 src/annotation/backend.ts create mode 100644 src/annotation/base.ts create mode 100644 src/annotation/bounding_box.ts rename src/{neuroglancer => }/annotation/ellipsoid.ts (57%) rename src/{neuroglancer => }/annotation/frontend_source.spec.ts (59%) rename src/{neuroglancer => }/annotation/frontend_source.ts (60%) create mode 100644 src/annotation/index.ts rename src/{neuroglancer => }/annotation/line.ts (64%) rename src/{neuroglancer => }/annotation/point.ts (68%) rename src/{neuroglancer => }/annotation/rendering.md (82%) create mode 100644 src/annotation/renderlayer.ts rename src/{neuroglancer => }/annotation/selection.ts (82%) rename src/{neuroglancer => }/annotation/type_handler.ts (53%) rename src/{neuroglancer => }/annotation/user_layer.css (99%) create mode 100644 src/annotation/user_layer.ts rename src/{neuroglancer => }/async_computation/decode_blosc.ts (60%) rename src/{neuroglancer => }/async_computation/decode_blosc_request.ts (79%) rename src/{neuroglancer => }/async_computation/decode_compresso.ts (57%) rename src/{neuroglancer => }/async_computation/decode_compresso_request.ts (78%) rename src/{neuroglancer => }/async_computation/decode_gzip.ts (67%) rename src/{neuroglancer => }/async_computation/decode_gzip_request.ts (79%) create mode 100644 src/async_computation/decode_jpeg.ts rename src/{neuroglancer => }/async_computation/decode_jpeg_request.ts (62%) create mode 100644 src/async_computation/decode_png.ts rename src/{neuroglancer => }/async_computation/decode_png_request.ts (60%) rename src/{neuroglancer => }/async_computation/decode_zstd.ts (60%) rename src/{neuroglancer => }/async_computation/decode_zstd_request.ts (79%) create mode 100644 src/async_computation/encode_compressed_segmentation.ts rename src/{neuroglancer => }/async_computation/encode_compressed_segmentation_request.ts (67%) rename src/{neuroglancer => }/async_computation/handler.ts (63%) rename src/{neuroglancer => }/async_computation/index.ts (85%) create mode 100644 src/async_computation/obj_mesh.ts rename src/{neuroglancer => }/async_computation/obj_mesh_request.ts (69%) rename src/{neuroglancer => }/async_computation/request.ts (56%) create mode 100644 src/async_computation/vtk_mesh.ts create mode 100644 src/async_computation/vtk_mesh_request.ts rename src/{neuroglancer => }/axes_lines.ts (51%) rename src/{neuroglancer => }/chunk_manager/README.md (70%) rename src/{neuroglancer => }/chunk_manager/backend.ts (61%) rename src/{neuroglancer => }/chunk_manager/base.ts (70%) rename src/{neuroglancer => }/chunk_manager/frontend.ts (62%) create mode 100644 src/chunk_manager/generic_file_source.ts create mode 100644 src/coordinate_transform.spec.ts rename src/{neuroglancer => }/coordinate_transform.ts (65%) rename src/{neuroglancer => }/credentials_provider/chunk_source_frontend.ts (55%) rename src/{neuroglancer => }/credentials_provider/default_manager.ts (80%) rename src/{neuroglancer => }/credentials_provider/http_request.ts (51%) create mode 100644 src/credentials_provider/index.ts create mode 100644 src/credentials_provider/oauth2.ts create mode 100644 src/credentials_provider/shared.ts rename src/{neuroglancer => }/credentials_provider/shared_common.ts (81%) create mode 100644 src/credentials_provider/shared_counterpart.ts rename src/{neuroglancer => }/data_panel_layout.css (100%) create mode 100644 src/data_panel_layout.ts rename src/{neuroglancer => }/datasource/boss/api.ts (52%) create mode 100644 src/datasource/boss/backend.ts rename src/{neuroglancer => }/datasource/boss/base.ts (80%) create mode 100644 src/datasource/boss/bossauth.html rename src/{neuroglancer => }/datasource/boss/credentials_provider.ts (63%) create mode 100644 src/datasource/boss/frontend.ts rename src/{neuroglancer => }/datasource/boss/register_credentials_provider.ts (66%) rename src/{neuroglancer => }/datasource/boss/register_default.ts (72%) rename src/{neuroglancer => }/datasource/brainmaps/api.ts (56%) create mode 100644 src/datasource/brainmaps/backend.ts rename src/{neuroglancer => }/datasource/brainmaps/base.ts (75%) rename src/{neuroglancer => }/datasource/brainmaps/credentials_provider.ts (81%) create mode 100644 src/datasource/brainmaps/frontend.ts rename src/{neuroglancer/datasource/dvid/register_default.ts => datasource/brainmaps/register_credentials_provider.ts} (60%) create mode 100644 src/datasource/brainmaps/register_default.ts rename src/{neuroglancer => }/datasource/deepzoom/README.md (83%) create mode 100644 src/datasource/deepzoom/backend.ts rename src/{neuroglancer => }/datasource/deepzoom/base.ts (91%) create mode 100644 src/datasource/deepzoom/frontend.ts rename src/{neuroglancer => }/datasource/deepzoom/register_default.ts (74%) rename src/{neuroglancer => }/datasource/default_provider.ts (80%) create mode 100644 src/datasource/dvid/api.ts create mode 100644 src/datasource/dvid/backend.ts rename src/{neuroglancer => }/datasource/dvid/base.ts (83%) create mode 100644 src/datasource/dvid/credentials_provider.ts create mode 100644 src/datasource/dvid/frontend.ts rename src/{neuroglancer => }/datasource/dvid/register_credentials_provider.ts (65%) create mode 100644 src/datasource/dvid/register_default.ts rename src/{neuroglancer => }/datasource/file_protocols.md (87%) create mode 100644 src/datasource/graphene/backend.ts rename src/{neuroglancer => }/datasource/graphene/base.ts (56%) create mode 100644 src/datasource/graphene/frontend.ts rename src/{neuroglancer => }/datasource/graphene/graphene.css (76%) rename src/{neuroglancer => }/datasource/graphene/register_default.ts (74%) rename src/{neuroglancer => }/datasource/index.ts (65%) rename src/{neuroglancer => }/datasource/middleauth/credentials_provider.ts (57%) rename src/{neuroglancer => }/datasource/middleauth/register_credentials_provider.ts (55%) rename src/{neuroglancer => }/datasource/n5/README.md (76%) create mode 100644 src/datasource/n5/backend.ts rename src/{neuroglancer => }/datasource/n5/base.ts (90%) create mode 100644 src/datasource/n5/frontend.ts rename src/{neuroglancer => }/datasource/n5/register_default.ts (76%) rename src/{neuroglancer => }/datasource/ngauth/README.md (100%) create mode 100644 src/datasource/ngauth/credentials_provider.ts create mode 100644 src/datasource/ngauth/register_credentials_provider.ts create mode 100644 src/datasource/nggraph/backend.ts rename src/{neuroglancer => }/datasource/nggraph/credentials_provider.ts (59%) create mode 100644 src/datasource/nggraph/frontend.ts rename src/{neuroglancer/datasource/obj => datasource/nggraph}/register_default.ts (75%) create mode 100644 src/datasource/nifti/backend.ts rename src/{neuroglancer => }/datasource/nifti/base.ts (84%) create mode 100644 src/datasource/nifti/frontend.ts rename src/{neuroglancer => }/datasource/nifti/register_default.ts (74%) rename src/{neuroglancer => }/datasource/obj/backend.ts (50%) rename src/{neuroglancer => }/datasource/obj/frontend.ts (57%) rename src/{neuroglancer/datasource/nggraph => datasource/obj}/register_default.ts (74%) rename src/{neuroglancer => }/datasource/precomputed/README.md (91%) rename src/{neuroglancer => }/datasource/precomputed/annotations.md (82%) create mode 100644 src/datasource/precomputed/backend.ts rename src/{neuroglancer => }/datasource/precomputed/base.ts (64%) create mode 100644 src/datasource/precomputed/frontend.ts rename src/{neuroglancer => }/datasource/precomputed/meshes.md (82%) rename src/{neuroglancer => }/datasource/precomputed/register_default.ts (73%) create mode 100644 src/datasource/precomputed/segment_properties.md rename src/{neuroglancer => }/datasource/precomputed/sharded.md (77%) rename src/{neuroglancer => }/datasource/precomputed/skeletons.md (81%) rename src/{neuroglancer => }/datasource/precomputed/volume.md (64%) create mode 100644 src/datasource/python/backend.ts rename src/{neuroglancer => }/datasource/python/base.ts (82%) rename src/{neuroglancer => }/datasource/python/frontend.spec.ts (57%) create mode 100644 src/datasource/python/frontend.ts create mode 100644 src/datasource/render/backend.ts rename src/{neuroglancer => }/datasource/render/base.ts (80%) create mode 100644 src/datasource/render/frontend.ts rename src/{neuroglancer => }/datasource/render/register_default.ts (74%) create mode 100644 src/datasource/state_share.ts create mode 100644 src/datasource/vtk/backend.ts rename src/{neuroglancer => }/datasource/vtk/frontend.ts (57%) rename src/{neuroglancer => }/datasource/vtk/parse.ts (58%) rename src/{neuroglancer => }/datasource/vtk/register_default.ts (75%) rename src/{neuroglancer => }/datasource/zarr/README.md (94%) create mode 100644 src/datasource/zarr/backend.ts rename src/{neuroglancer => }/datasource/zarr/base.ts (86%) create mode 100644 src/datasource/zarr/codec/blosc/decode.ts rename src/{neuroglancer/datasource/zarr/codec/zstd => datasource/zarr/codec/blosc}/resolve.ts (67%) rename src/{neuroglancer => }/datasource/zarr/codec/bytes/decode.ts (55%) create mode 100644 src/datasource/zarr/codec/bytes/resolve.ts create mode 100644 src/datasource/zarr/codec/crc32c/decode.ts rename src/{neuroglancer => }/datasource/zarr/codec/crc32c/resolve.ts (54%) rename src/{neuroglancer => }/datasource/zarr/codec/decode.ts (52%) create mode 100644 src/datasource/zarr/codec/gzip/decode.ts rename src/{neuroglancer => }/datasource/zarr/codec/gzip/resolve.ts (65%) rename src/{neuroglancer => }/datasource/zarr/codec/index.ts (93%) create mode 100644 src/datasource/zarr/codec/resolve.ts create mode 100644 src/datasource/zarr/codec/sharding_indexed/decode.ts create mode 100644 src/datasource/zarr/codec/sharding_indexed/resolve.ts rename src/{neuroglancer => }/datasource/zarr/codec/transpose/decode.ts (60%) create mode 100644 src/datasource/zarr/codec/transpose/resolve.ts create mode 100644 src/datasource/zarr/codec/zstd/decode.ts rename src/{neuroglancer/datasource/zarr/codec/blosc => datasource/zarr/codec/zstd}/resolve.ts (67%) create mode 100644 src/datasource/zarr/frontend.ts rename src/{neuroglancer => }/datasource/zarr/metadata/index.ts (66%) create mode 100644 src/datasource/zarr/metadata/parse.ts create mode 100644 src/datasource/zarr/ome.ts rename src/{neuroglancer => }/datasource/zarr/register_default.ts (66%) rename src/{neuroglancer => }/display_context.ts (59%) rename src/{neuroglancer => }/gpu_hash/README.md (73%) rename src/{neuroglancer => }/gpu_hash/hash_function.ts (95%) rename src/{neuroglancer => }/gpu_hash/hash_table.benchmark.ts (70%) rename src/{neuroglancer => }/gpu_hash/hash_table.spec.ts (53%) rename src/{neuroglancer => }/gpu_hash/hash_table.ts (80%) create mode 100644 src/gpu_hash/shader.spec.ts rename src/{neuroglancer => }/gpu_hash/shader.ts (64%) rename src/{neuroglancer => }/help/input_event_bindings.css (100%) rename src/{neuroglancer => }/help/input_event_bindings.ts (59%) rename src/{neuroglancer => }/image_user_layer.css (100%) create mode 100644 src/image_user_layer.ts rename src/{neuroglancer => }/kvstore/index.ts (63%) create mode 100644 src/kvstore/special/index.ts rename src/{neuroglancer => }/layer.ts (64%) create mode 100644 src/layer_data_source.ts rename src/{neuroglancer => }/layer_group_viewer.css (100%) create mode 100644 src/layer_group_viewer.ts rename src/{neuroglancer => }/layer_groups_layout.css (86%) create mode 100644 src/layer_groups_layout.ts rename src/{neuroglancer => }/layout.ts (86%) rename src/{neuroglancer => }/maximize_button.css (100%) rename src/{neuroglancer => }/mesh/backend.ts (59%) rename src/{neuroglancer => }/mesh/base.ts (73%) rename src/{neuroglancer => }/mesh/draco/Dockerfile (100%) rename src/{neuroglancer => }/mesh/draco/README.md (100%) rename src/{neuroglancer => }/mesh/draco/build.sh (100%) rename src/{neuroglancer => }/mesh/draco/build_wasm.py (100%) rename src/{neuroglancer => }/mesh/draco/draco_overlay/draco/draco_features.h (100%) rename src/{neuroglancer => }/mesh/draco/generate_first_bit_table.py (100%) rename src/{neuroglancer => }/mesh/draco/index.ts (60%) rename src/{neuroglancer => }/mesh/draco/neuroglancer_draco.cc (100%) rename src/{neuroglancer => }/mesh/draco/neuroglancer_draco.wasm (100%) rename src/{neuroglancer => }/mesh/draco/stub.js (50%) create mode 100644 src/mesh/frontend.ts create mode 100644 src/mesh/multiscale.spec.ts rename src/{neuroglancer => }/mesh/multiscale.ts (52%) rename src/{neuroglancer => }/mesh/triangle_strips.spec.ts (55%) rename src/{neuroglancer => }/mesh/triangle_strips.ts (78%) rename src/{neuroglancer => }/navigation_state.ts (63%) delete mode 100644 src/neuroglancer/annotation/annotation_layer_state.ts delete mode 100644 src/neuroglancer/annotation/backend.ts delete mode 100644 src/neuroglancer/annotation/base.ts delete mode 100644 src/neuroglancer/annotation/bounding_box.ts delete mode 100644 src/neuroglancer/annotation/index.ts delete mode 100644 src/neuroglancer/annotation/renderlayer.ts delete mode 100644 src/neuroglancer/annotation/user_layer.ts delete mode 100644 src/neuroglancer/async_computation/decode_jpeg.ts delete mode 100644 src/neuroglancer/async_computation/decode_png.ts delete mode 100644 src/neuroglancer/async_computation/encode_compressed_segmentation.ts delete mode 100644 src/neuroglancer/async_computation/obj_mesh.ts delete mode 100644 src/neuroglancer/async_computation/vtk_mesh.ts delete mode 100644 src/neuroglancer/async_computation/vtk_mesh_request.ts delete mode 100644 src/neuroglancer/chunk_manager/generic_file_source.ts delete mode 100644 src/neuroglancer/coordinate_transform.spec.ts delete mode 100644 src/neuroglancer/credentials_provider/index.ts delete mode 100644 src/neuroglancer/credentials_provider/oauth2.ts delete mode 100644 src/neuroglancer/credentials_provider/shared.ts delete mode 100644 src/neuroglancer/credentials_provider/shared_counterpart.ts delete mode 100644 src/neuroglancer/data_panel_layout.ts delete mode 100644 src/neuroglancer/datasource/boss/backend.ts delete mode 100644 src/neuroglancer/datasource/boss/bossauth.html delete mode 100644 src/neuroglancer/datasource/boss/frontend.ts delete mode 100644 src/neuroglancer/datasource/brainmaps/backend.ts delete mode 100644 src/neuroglancer/datasource/brainmaps/frontend.ts delete mode 100644 src/neuroglancer/datasource/brainmaps/register_credentials_provider.ts delete mode 100644 src/neuroglancer/datasource/brainmaps/register_default.ts delete mode 100644 src/neuroglancer/datasource/deepzoom/backend.ts delete mode 100644 src/neuroglancer/datasource/deepzoom/frontend.ts delete mode 100644 src/neuroglancer/datasource/dvid/api.ts delete mode 100644 src/neuroglancer/datasource/dvid/backend.ts delete mode 100644 src/neuroglancer/datasource/dvid/credentials_provider.ts delete mode 100644 src/neuroglancer/datasource/dvid/frontend.ts delete mode 100644 src/neuroglancer/datasource/graphene/backend.ts delete mode 100644 src/neuroglancer/datasource/graphene/frontend.ts delete mode 100644 src/neuroglancer/datasource/n5/backend.ts delete mode 100644 src/neuroglancer/datasource/n5/frontend.ts delete mode 100644 src/neuroglancer/datasource/ngauth/credentials_provider.ts delete mode 100644 src/neuroglancer/datasource/ngauth/register_credentials_provider.ts delete mode 100644 src/neuroglancer/datasource/nggraph/frontend.ts delete mode 100644 src/neuroglancer/datasource/nifti/backend.ts delete mode 100644 src/neuroglancer/datasource/nifti/frontend.ts delete mode 100644 src/neuroglancer/datasource/precomputed/backend.ts delete mode 100644 src/neuroglancer/datasource/precomputed/frontend.ts delete mode 100644 src/neuroglancer/datasource/precomputed/segment_properties.md delete mode 100644 src/neuroglancer/datasource/python/backend.ts delete mode 100644 src/neuroglancer/datasource/python/frontend.ts delete mode 100644 src/neuroglancer/datasource/render/backend.ts delete mode 100644 src/neuroglancer/datasource/render/frontend.ts delete mode 100644 src/neuroglancer/datasource/state_share.ts delete mode 100644 src/neuroglancer/datasource/vtk/backend.ts delete mode 100644 src/neuroglancer/datasource/zarr/backend.ts delete mode 100644 src/neuroglancer/datasource/zarr/codec/blosc/decode.ts delete mode 100644 src/neuroglancer/datasource/zarr/codec/bytes/resolve.ts delete mode 100644 src/neuroglancer/datasource/zarr/codec/crc32c/decode.ts delete mode 100644 src/neuroglancer/datasource/zarr/codec/gzip/decode.ts delete mode 100644 src/neuroglancer/datasource/zarr/codec/resolve.ts delete mode 100644 src/neuroglancer/datasource/zarr/codec/sharding_indexed/decode.ts delete mode 100644 src/neuroglancer/datasource/zarr/codec/sharding_indexed/resolve.ts delete mode 100644 src/neuroglancer/datasource/zarr/codec/transpose/resolve.ts delete mode 100644 src/neuroglancer/datasource/zarr/codec/zstd/decode.ts delete mode 100644 src/neuroglancer/datasource/zarr/frontend.ts delete mode 100644 src/neuroglancer/datasource/zarr/metadata/parse.ts delete mode 100644 src/neuroglancer/datasource/zarr/ome.ts delete mode 100644 src/neuroglancer/gpu_hash/shader.spec.ts delete mode 100644 src/neuroglancer/image_user_layer.ts delete mode 100644 src/neuroglancer/kvstore/special/index.ts delete mode 100644 src/neuroglancer/layer_data_source.ts delete mode 100644 src/neuroglancer/layer_group_viewer.ts delete mode 100644 src/neuroglancer/layer_groups_layout.ts delete mode 100644 src/neuroglancer/mesh/frontend.ts delete mode 100644 src/neuroglancer/mesh/multiscale.spec.ts delete mode 100644 src/neuroglancer/python_integration/credentials_provider.ts delete mode 100644 src/neuroglancer/python_integration/prefetch.ts delete mode 100644 src/neuroglancer/python_integration/screenshots.ts delete mode 100644 src/neuroglancer/python_integration/volume.ts delete mode 100644 src/neuroglancer/renderlayer.ts delete mode 100644 src/neuroglancer/segment_color.spec.ts delete mode 100644 src/neuroglancer/segmentation_display_state/backend.ts delete mode 100644 src/neuroglancer/segmentation_display_state/frontend.ts delete mode 100644 src/neuroglancer/segmentation_graph/source.ts delete mode 100644 src/neuroglancer/segmentation_user_layer.ts delete mode 100644 src/neuroglancer/single_mesh/backend.ts delete mode 100644 src/neuroglancer/single_mesh/frontend.spec.ts delete mode 100644 src/neuroglancer/single_mesh/frontend.ts delete mode 100644 src/neuroglancer/single_mesh_user_layer.ts delete mode 100644 src/neuroglancer/skeleton/decode_swc_skeleton.spec.ts delete mode 100644 src/neuroglancer/skeleton/frontend.ts delete mode 100644 src/neuroglancer/sliceview/README.md delete mode 100644 src/neuroglancer/sliceview/backend.ts delete mode 100644 src/neuroglancer/sliceview/backend_chunk_decoders/bossNpz.ts delete mode 100644 src/neuroglancer/sliceview/backend_chunk_decoders/png.ts delete mode 100644 src/neuroglancer/sliceview/backend_chunk_decoders/postprocess.ts delete mode 100644 src/neuroglancer/sliceview/backend_chunk_decoders/raw.ts delete mode 100644 src/neuroglancer/sliceview/base.spec.ts delete mode 100644 src/neuroglancer/sliceview/chunk_format_testing.ts delete mode 100644 src/neuroglancer/sliceview/compressed_segmentation/chunk_format.spec.ts delete mode 100644 src/neuroglancer/sliceview/compressed_segmentation/encode_common.ts delete mode 100644 src/neuroglancer/sliceview/compressed_segmentation/encode_uint32.spec.ts delete mode 100644 src/neuroglancer/sliceview/compressed_segmentation/encode_uint64.spec.ts delete mode 100644 src/neuroglancer/sliceview/frontend.ts delete mode 100644 src/neuroglancer/sliceview/single_texture_chunk_format.ts delete mode 100644 src/neuroglancer/sliceview/uncompressed_chunk_format.spec.ts delete mode 100644 src/neuroglancer/sliceview/volume/renderlayer.ts delete mode 100644 src/neuroglancer/sliceview/volume/segmentation_renderlayer.ts delete mode 100644 src/neuroglancer/ui/annotations.ts delete mode 100644 src/neuroglancer/ui/default_clipboard_handling.spec.ts delete mode 100644 src/neuroglancer/ui/default_input_event_bindings.ts delete mode 100644 src/neuroglancer/ui/default_viewer_setup.ts delete mode 100644 src/neuroglancer/ui/layer_data_sources_tab.ts delete mode 100644 src/neuroglancer/ui/layer_side_panel.ts delete mode 100644 src/neuroglancer/ui/position_drag_and_drop.ts delete mode 100644 src/neuroglancer/ui/segment_list.ts delete mode 100644 src/neuroglancer/ui/segment_split_merge_tools.ts delete mode 100644 src/neuroglancer/ui/segmentation_display_options_tab.ts delete mode 100644 src/neuroglancer/ui/selection_details.ts delete mode 100644 src/neuroglancer/ui/viewer_settings.ts delete mode 100644 src/neuroglancer/util/color.spec.ts delete mode 100644 src/neuroglancer/util/completion.ts delete mode 100644 src/neuroglancer/util/gcs_bucket_listing.ts delete mode 100644 src/neuroglancer/util/google_oauth2.ts delete mode 100644 src/neuroglancer/util/google_oauth2_redirect.html delete mode 100644 src/neuroglancer/util/http_path_completion.ts delete mode 100644 src/neuroglancer/util/matrix.spec.ts delete mode 100644 src/neuroglancer/util/npy.spec.ts delete mode 100644 src/neuroglancer/util/s3_bucket_listing.ts delete mode 100644 src/neuroglancer/util/si_units.spec.ts delete mode 100644 src/neuroglancer/util/special_protocol_request.ts delete mode 100644 src/neuroglancer/util/uint64.spec.ts delete mode 100644 src/neuroglancer/viewer.ts delete mode 100644 src/neuroglancer/volume_rendering/backend.ts delete mode 100644 src/neuroglancer/volume_rendering/volume_render_layer.ts delete mode 100644 src/neuroglancer/webgl/buffer.ts delete mode 100644 src/neuroglancer/webgl/lerp.spec.ts delete mode 100644 src/neuroglancer/webgl/shader_lib.spec.ts delete mode 100644 src/neuroglancer/webgl/shader_testing.spec.ts delete mode 100644 src/neuroglancer/webgl/shader_ui_controls.spec.ts delete mode 100644 src/neuroglancer/webgl/square_corners_buffer.ts delete mode 100644 src/neuroglancer/webgl/texture.ts delete mode 100644 src/neuroglancer/webgl/texture_access.spec.ts delete mode 100644 src/neuroglancer/webgl/trivial_shaders.ts delete mode 100644 src/neuroglancer/widget/annotation_tool_status.ts delete mode 100644 src/neuroglancer/widget/channel_dimensions_widget.ts delete mode 100644 src/neuroglancer/widget/display_dimensions_widget.ts delete mode 100644 src/neuroglancer/widget/invlerp.ts delete mode 100644 src/neuroglancer/widget/layer_control.ts delete mode 100644 src/neuroglancer/widget/layer_control_channel_invlerp.ts delete mode 100644 src/neuroglancer/widget/layer_control_property_invlerp.ts delete mode 100644 src/neuroglancer/widget/layer_control_range.ts delete mode 100644 src/neuroglancer/widget/position_plot.ts delete mode 100644 src/neuroglancer/widget/position_widget.ts delete mode 100644 src/neuroglancer/widget/segmentation_color_mode.ts delete mode 100644 src/neuroglancer/widget/shader_controls.ts rename src/{neuroglancer => }/noselect.css (100%) rename src/{neuroglancer => }/object_picking.ts (68%) rename src/{neuroglancer => }/overlay.css (100%) rename src/{neuroglancer => }/overlay.ts (71%) rename src/{neuroglancer => }/perspective_view/backend.ts (64%) rename src/{neuroglancer => }/perspective_view/base.ts (89%) rename src/{neuroglancer => }/perspective_view/panel.css (100%) rename src/{neuroglancer => }/perspective_view/panel.ts (53%) rename src/{neuroglancer => }/perspective_view/render_layer.ts (52%) rename src/{neuroglancer => }/projection_parameters.ts (68%) rename src/{neuroglancer => }/python_integration/api.ts (67%) create mode 100644 src/python_integration/credentials_provider.ts rename src/{neuroglancer => }/python_integration/event_action_map.ts (79%) create mode 100644 src/python_integration/prefetch.ts rename src/{neuroglancer => }/python_integration/remote_actions.ts (61%) rename src/{neuroglancer => }/python_integration/remote_status_messages.ts (83%) create mode 100644 src/python_integration/screenshots.ts create mode 100644 src/python_integration/volume.ts rename src/{neuroglancer => }/render_coordinate_transform.ts (57%) rename src/{neuroglancer => }/render_layer_backend.ts (56%) rename src/{neuroglancer => }/render_layer_common.ts (65%) rename src/{neuroglancer => }/render_scale_statistics.ts (68%) rename src/{neuroglancer => }/rendered_data_panel.css (97%) rename src/{neuroglancer => }/rendered_data_panel.ts (53%) create mode 100644 src/renderlayer.ts create mode 100644 src/segment_color.spec.ts rename src/{neuroglancer => }/segment_color.ts (77%) create mode 100644 src/segmentation_display_state/backend.ts rename src/{neuroglancer => }/segmentation_display_state/base.ts (53%) create mode 100644 src/segmentation_display_state/frontend.ts rename src/{neuroglancer => }/segmentation_display_state/property_map.spec.ts (64%) rename src/{neuroglancer => }/segmentation_display_state/property_map.ts (59%) rename src/{neuroglancer => }/segmentation_graph/local.spec.ts (50%) rename src/{neuroglancer => }/segmentation_graph/local.ts (69%) rename src/{neuroglancer => }/segmentation_graph/segment_id.ts (93%) create mode 100644 src/segmentation_graph/source.ts rename src/{neuroglancer => }/segmentation_user_layer.css (86%) create mode 100644 src/segmentation_user_layer.ts rename src/{neuroglancer => }/shared_disjoint_sets.ts (53%) rename src/{neuroglancer => }/shared_watchable_value.ts (58%) create mode 100644 src/single_mesh/backend.ts rename src/{neuroglancer => }/single_mesh/base.ts (81%) create mode 100644 src/single_mesh/frontend.spec.ts create mode 100644 src/single_mesh/frontend.ts rename src/{neuroglancer => }/single_mesh_user_layer.css (94%) create mode 100644 src/single_mesh_user_layer.ts rename src/{neuroglancer => }/skeleton/backend.ts (56%) rename src/{neuroglancer => }/skeleton/base.ts (85%) rename src/{neuroglancer => }/skeleton/decode_precomputed_skeleton.ts (62%) create mode 100644 src/skeleton/decode_swc_skeleton.spec.ts rename src/{neuroglancer => }/skeleton/decode_swc_skeleton.ts (71%) create mode 100644 src/skeleton/frontend.ts create mode 100644 src/sliceview/README.md create mode 100644 src/sliceview/backend.ts create mode 100644 src/sliceview/backend_chunk_decoders/bossNpz.ts rename src/{neuroglancer => }/sliceview/backend_chunk_decoders/compressed_segmentation.ts (76%) rename src/{neuroglancer => }/sliceview/backend_chunk_decoders/compresso.ts (52%) rename src/{neuroglancer => }/sliceview/backend_chunk_decoders/index.ts (73%) rename src/{neuroglancer => }/sliceview/backend_chunk_decoders/jpeg.ts (51%) rename src/{neuroglancer => }/sliceview/backend_chunk_decoders/ndstoreNpz.ts (50%) create mode 100644 src/sliceview/backend_chunk_decoders/png.ts create mode 100644 src/sliceview/backend_chunk_decoders/postprocess.ts create mode 100644 src/sliceview/backend_chunk_decoders/raw.ts create mode 100644 src/sliceview/base.spec.ts rename src/{neuroglancer => }/sliceview/base.ts (66%) rename src/{neuroglancer => }/sliceview/bounding_box_shader_helper.ts (58%) rename src/{neuroglancer => }/sliceview/chunk_format_handlers.ts (82%) create mode 100644 src/sliceview/chunk_format_testing.ts rename src/{neuroglancer => }/sliceview/chunk_layout.ts (82%) rename src/{neuroglancer => }/sliceview/compressed_segmentation/README.md (52%) create mode 100644 src/sliceview/compressed_segmentation/chunk_format.spec.ts rename src/{neuroglancer => }/sliceview/compressed_segmentation/chunk_format.ts (55%) rename src/{neuroglancer => }/sliceview/compressed_segmentation/decode_common.ts (59%) rename src/{neuroglancer => }/sliceview/compressed_segmentation/decode_uint32.ts (59%) rename src/{neuroglancer => }/sliceview/compressed_segmentation/decode_uint64.ts (59%) rename src/{neuroglancer => }/sliceview/compressed_segmentation/encode.benchmark.ts (63%) create mode 100644 src/sliceview/compressed_segmentation/encode_common.ts create mode 100644 src/sliceview/compressed_segmentation/encode_uint32.spec.ts rename src/{neuroglancer => }/sliceview/compressed_segmentation/encode_uint32.ts (53%) create mode 100644 src/sliceview/compressed_segmentation/encode_uint64.spec.ts rename src/{neuroglancer => }/sliceview/compressed_segmentation/encode_uint64.ts (50%) rename src/{neuroglancer => }/sliceview/compressed_segmentation/test_util.ts (78%) rename src/{neuroglancer => }/sliceview/compresso/Dockerfile (100%) rename src/{neuroglancer => }/sliceview/compresso/LICENSE (100%) rename src/{neuroglancer => }/sliceview/compresso/build.sh (100%) rename src/{neuroglancer => }/sliceview/compresso/build_wasm.sh (100%) rename src/{neuroglancer => }/sliceview/compresso/cc3d.hpp (100%) rename src/{neuroglancer => }/sliceview/compresso/compresso.hpp (100%) rename src/{neuroglancer => }/sliceview/compresso/compresso.wasm (100%) rename src/{neuroglancer => }/sliceview/compresso/compresso_wasm.cc (100%) rename src/{neuroglancer => }/sliceview/compresso/index.ts (65%) create mode 100644 src/sliceview/frontend.ts rename src/{neuroglancer => }/sliceview/image_layer_rendering.md (72%) rename src/{neuroglancer => }/sliceview/panel.ts (50%) rename src/{neuroglancer => }/sliceview/png/Dockerfile (100%) rename src/{neuroglancer => }/sliceview/png/build.sh (100%) rename src/{neuroglancer => }/sliceview/png/build_wasm.sh (100%) rename src/{neuroglancer => }/sliceview/png/index.ts (56%) rename src/{neuroglancer => }/sliceview/png/libpng.wasm (100%) rename src/{neuroglancer => }/sliceview/png/png_wasm.c (100%) rename src/{neuroglancer => }/sliceview/renderlayer.ts (54%) create mode 100644 src/sliceview/single_texture_chunk_format.ts create mode 100644 src/sliceview/uncompressed_chunk_format.spec.ts rename src/{neuroglancer => }/sliceview/uncompressed_chunk_format.ts (58%) rename src/{neuroglancer => }/sliceview/volume/backend.ts (68%) rename src/{neuroglancer => }/sliceview/volume/base.ts (54%) rename src/{neuroglancer => }/sliceview/volume/frontend.ts (67%) rename src/{neuroglancer => }/sliceview/volume/image_renderlayer.ts (57%) create mode 100644 src/sliceview/volume/renderlayer.ts create mode 100644 src/sliceview/volume/segmentation_renderlayer.ts rename src/{neuroglancer => }/sliceview/wire_frame.ts (52%) rename src/{neuroglancer => }/status.css (100%) rename src/{neuroglancer => }/status.ts (68%) rename src/{neuroglancer => }/trackable_alpha.ts (88%) rename src/{neuroglancer => }/trackable_blend.ts (92%) rename src/{neuroglancer => }/trackable_boolean.ts (57%) rename src/{neuroglancer => }/trackable_finite_float.ts (88%) rename src/{neuroglancer => }/trackable_value.ts (66%) rename src/{neuroglancer => }/trackable_vec3.ts (78%) rename src/{neuroglancer => }/ui/annotations.css (95%) create mode 100644 src/ui/annotations.ts rename src/{neuroglancer => }/ui/context_menu.css (100%) rename src/{neuroglancer => }/ui/context_menu.ts (61%) create mode 100644 src/ui/default_clipboard_handling.spec.ts rename src/{neuroglancer => }/ui/default_clipboard_handling.ts (72%) create mode 100644 src/ui/default_input_event_bindings.ts rename src/{neuroglancer => }/ui/default_viewer.css (98%) rename src/{neuroglancer => }/ui/default_viewer.ts (77%) create mode 100644 src/ui/default_viewer_setup.ts rename src/{neuroglancer => }/ui/disable_default_actions.ts (73%) rename src/{neuroglancer => }/ui/drag_and_drop.css (100%) rename src/{neuroglancer => }/ui/drag_and_drop.ts (63%) rename src/{neuroglancer => }/ui/layer_bar.css (81%) rename src/{neuroglancer => }/ui/layer_bar.ts (50%) rename src/{neuroglancer => }/ui/layer_data_sources_tab.css (99%) create mode 100644 src/ui/layer_data_sources_tab.ts rename src/{neuroglancer => }/ui/layer_drag_and_drop.ts (60%) rename src/{neuroglancer => }/ui/layer_list_panel.css (57%) rename src/{neuroglancer => }/ui/layer_list_panel.ts (50%) rename src/{neuroglancer => }/ui/layer_side_panel.css (87%) create mode 100644 src/ui/layer_side_panel.ts rename src/{neuroglancer => }/ui/layer_side_panel_state.ts (71%) rename src/{neuroglancer => }/ui/minimal_viewer.ts (65%) create mode 100644 src/ui/position_drag_and_drop.ts rename src/{neuroglancer => }/ui/segment_list.css (82%) create mode 100644 src/ui/segment_list.ts rename src/{neuroglancer => }/ui/segment_select_tools.ts (62%) rename src/{neuroglancer => }/ui/segment_split_merge_tools.css (100%) create mode 100644 src/ui/segment_split_merge_tools.ts create mode 100644 src/ui/segmentation_display_options_tab.ts rename src/{neuroglancer => }/ui/selection_details.css (93%) create mode 100644 src/ui/selection_details.ts rename src/{neuroglancer => }/ui/side_panel.css (99%) rename src/{neuroglancer => }/ui/side_panel.ts (51%) rename src/{neuroglancer => }/ui/side_panel_location.ts (59%) rename src/{neuroglancer => }/ui/state_editor.css (99%) rename src/{neuroglancer => }/ui/state_editor.ts (53%) rename src/{neuroglancer => }/ui/statistics.css (100%) rename src/{neuroglancer => }/ui/statistics.ts (52%) rename src/{neuroglancer => }/ui/title.ts (78%) rename src/{neuroglancer => }/ui/tool.css (95%) rename src/{neuroglancer => }/ui/tool.ts (58%) rename src/{neuroglancer => }/ui/url_hash_binding.ts (54%) rename src/{neuroglancer => }/ui/viewer_settings.css (93%) create mode 100644 src/ui/viewer_settings.ts rename src/{neuroglancer => }/uint64_map.spec.ts (60%) rename src/{neuroglancer => }/uint64_map.ts (63%) rename src/{neuroglancer => }/uint64_ordered_set.ts (76%) rename src/{neuroglancer => }/uint64_set.spec.ts (73%) rename src/{neuroglancer => }/uint64_set.ts (61%) rename src/{neuroglancer => }/util/animation_frame_debounce.ts (80%) rename src/{neuroglancer => }/util/array.spec.ts (50%) rename src/{neuroglancer => }/util/array.ts (62%) rename src/{neuroglancer => }/util/automatic_focus.ts (53%) rename src/{neuroglancer => }/util/base64.ts (80%) rename src/{neuroglancer => }/util/byte_range_http_requests.ts (54%) rename src/{neuroglancer => }/util/cancellation.spec.ts (69%) rename src/{neuroglancer => }/util/cancellation.ts (88%) rename src/{neuroglancer => }/util/clipboard.ts (58%) create mode 100644 src/util/color.spec.ts rename src/{neuroglancer => }/util/color.ts (67%) rename src/{neuroglancer => }/util/colorspace.ts (61%) rename src/{neuroglancer => }/util/compare.ts (90%) create mode 100644 src/util/completion.ts rename src/{neuroglancer => }/util/data_type.ts (74%) rename src/{neuroglancer => }/util/disjoint_sets.spec.ts (55%) rename src/{neuroglancer => }/util/disjoint_sets.ts (72%) rename src/{neuroglancer => }/util/disposable.ts (75%) rename src/{neuroglancer => }/util/dom.ts (73%) rename src/{neuroglancer => }/util/drag_and_drop.spec.ts (64%) rename src/{neuroglancer => }/util/drag_and_drop.ts (85%) rename src/{neuroglancer => }/util/dropdown.ts (54%) rename src/{neuroglancer => }/util/endian.spec.ts (69%) rename src/{neuroglancer => }/util/endian.ts (82%) rename src/{neuroglancer => }/util/erf.ts (92%) rename src/{neuroglancer => }/util/error.ts (87%) rename src/{neuroglancer => }/util/event_action_map.ts (71%) rename src/{neuroglancer => }/util/float.ts (94%) rename src/{neuroglancer => }/util/float32_to_string.spec.ts (55%) rename src/{neuroglancer => }/util/float32_to_string.ts (96%) rename src/{neuroglancer => }/util/float32array_builder.ts (86%) rename src/{neuroglancer => }/util/float64array_builder.ts (86%) create mode 100644 src/util/gcs_bucket_listing.ts rename src/{neuroglancer => }/util/geom.spec.ts (85%) rename src/{neuroglancer => }/util/geom.ts (69%) create mode 100644 src/util/google_oauth2.ts create mode 100644 src/util/google_oauth2_redirect.html rename src/{neuroglancer => }/util/gzip.ts (81%) rename src/{neuroglancer => }/util/hash.ts (90%) rename src/{neuroglancer => }/util/hex.ts (85%) rename src/{neuroglancer => }/util/hierarchical_map.ts (82%) create mode 100644 src/util/http_path_completion.ts rename src/{neuroglancer => }/util/http_request.ts (69%) rename src/{neuroglancer => }/util/int16array_builder.ts (86%) rename src/{neuroglancer => }/util/int32array_builder.ts (86%) rename src/{neuroglancer => }/util/int8array_builder.ts (86%) rename src/{neuroglancer => }/util/json.spec.ts (56%) rename src/{neuroglancer => }/util/json.ts (60%) rename src/{neuroglancer => }/util/keyboard_bindings.ts (57%) rename src/{neuroglancer => }/util/lerp.ts (51%) rename src/{neuroglancer => }/util/linked_list.0.ts (83%) rename src/{neuroglancer => }/util/linked_list.1.ts (83%) rename src/{neuroglancer => }/util/linked_list.ts (100%) rename src/{neuroglancer => }/util/longest_common_prefix.ts (88%) create mode 100644 src/util/matrix.spec.ts rename src/{neuroglancer => }/util/matrix.ts (77%) rename src/{neuroglancer => }/util/memoize.ts (88%) rename src/{neuroglancer => }/util/message_list.ts (84%) rename src/{neuroglancer => }/util/mixin.ts (69%) rename src/{neuroglancer => }/util/mouse_bindings.ts (75%) rename src/{neuroglancer => }/util/mouse_drag.ts (65%) create mode 100644 src/util/npy.spec.ts rename src/{neuroglancer => }/util/npy.ts (55%) rename src/{neuroglancer => }/util/number_to_string.spec.ts (58%) rename src/{neuroglancer => }/util/number_to_string.ts (98%) rename src/{neuroglancer => }/util/numpy_dtype.ts (84%) rename src/{neuroglancer => }/util/object_id.ts (91%) rename src/{neuroglancer => }/util/pairing_heap.0.ts (78%) rename src/{neuroglancer => }/util/pairing_heap.1.ts (78%) rename src/{neuroglancer => }/util/pairing_heap.ts (75%) rename src/{neuroglancer => }/util/random.ts (79%) rename src/{neuroglancer => }/util/s3.ts (53%) create mode 100644 src/util/s3_bucket_listing.ts rename src/{neuroglancer => }/util/scroll_into_view.ts (87%) create mode 100644 src/util/si_units.spec.ts rename src/{neuroglancer => }/util/si_units.ts (56%) rename src/{neuroglancer => }/util/signal.spec.ts (63%) rename src/{neuroglancer => }/util/signal.ts (93%) rename src/{neuroglancer => }/util/signal_binding_updater.ts (66%) rename src/{neuroglancer => }/util/spatial_units.ts (73%) create mode 100644 src/util/special_protocol_request.ts rename src/{neuroglancer => }/util/string.ts (93%) rename src/{neuroglancer => }/util/touch_bindings.ts (66%) rename src/{neuroglancer => }/util/trackable.ts (76%) rename src/{neuroglancer => }/util/trackable_enum.ts (79%) rename src/{neuroglancer => }/util/uint16array_builder.ts (86%) rename src/{neuroglancer => }/util/uint32array_builder.ts (86%) create mode 100644 src/util/uint64.spec.ts rename src/{neuroglancer => }/util/uint64.ts (76%) rename src/{neuroglancer => }/util/uint8array_builder.ts (86%) rename src/{neuroglancer => }/util/vector.ts (68%) rename src/{neuroglancer => }/util/velocity_estimation.ts (83%) rename src/{neuroglancer => }/util/watchable_map.ts (84%) rename src/{neuroglancer => }/util/wheel_zoom.ts (97%) rename src/{neuroglancer => }/util/zorder.spec.ts (58%) rename src/{neuroglancer => }/util/zorder.ts (81%) rename src/{neuroglancer => }/viewer.css (100%) create mode 100644 src/viewer.ts rename src/{neuroglancer => }/viewer_state.ts (65%) rename src/{neuroglancer => }/visibility_priority/backend.ts (67%) rename src/{neuroglancer => }/visibility_priority/frontend.ts (81%) create mode 100644 src/volume_rendering/backend.ts rename src/{neuroglancer => }/volume_rendering/base.ts (61%) create mode 100644 src/volume_rendering/volume_render_layer.ts rename src/{neuroglancer => }/webgl/bounding_box.ts (91%) create mode 100644 src/webgl/buffer.ts rename src/{neuroglancer => }/webgl/circles.ts (77%) rename src/{neuroglancer => }/webgl/colormaps.ts (84%) rename src/{neuroglancer => }/webgl/context.ts (67%) rename src/{neuroglancer => }/webgl/dynamic_shader.ts (53%) rename src/{neuroglancer => }/webgl/ellipse.ts (82%) rename src/{neuroglancer => }/webgl/empirical_cdf.ts (58%) rename src/{neuroglancer => }/webgl/index_emulation.spec.ts (52%) rename src/{neuroglancer => }/webgl/index_emulation.ts (72%) create mode 100644 src/webgl/lerp.spec.ts rename src/{neuroglancer => }/webgl/lerp.ts (74%) rename src/{neuroglancer => }/webgl/lines.ts (70%) rename src/{neuroglancer => }/webgl/offscreen.ts (55%) rename src/{neuroglancer => }/webgl/quad.ts (84%) rename src/{neuroglancer => }/webgl/shader.ts (63%) create mode 100644 src/webgl/shader_lib.spec.ts rename src/{neuroglancer => }/webgl/shader_lib.ts (84%) create mode 100644 src/webgl/shader_testing.spec.ts rename src/{neuroglancer => }/webgl/shader_testing.ts (53%) create mode 100644 src/webgl/shader_ui_controls.spec.ts rename src/{neuroglancer => }/webgl/shader_ui_controls.ts (50%) rename src/{neuroglancer => }/webgl/spheres.ts (61%) create mode 100644 src/webgl/square_corners_buffer.ts rename src/{neuroglancer => }/webgl/testing.ts (69%) create mode 100644 src/webgl/texture.ts create mode 100644 src/webgl/texture_access.spec.ts rename src/{neuroglancer => }/webgl/texture_access.ts (65%) create mode 100644 src/webgl/trivial_shaders.ts rename src/{neuroglancer => }/webgl/vertex_id.ts (75%) rename src/{neuroglancer => }/widget/add_button.ts (80%) rename src/{neuroglancer => }/widget/annotation_tool_status.css (84%) create mode 100644 src/widget/annotation_tool_status.ts rename src/{neuroglancer => }/widget/associate_label.ts (80%) rename src/{neuroglancer => }/widget/channel_dimensions_widget.css (99%) create mode 100644 src/widget/channel_dimensions_widget.ts rename src/{neuroglancer => }/widget/checkbox_icon.css (100%) rename src/{neuroglancer => }/widget/checkbox_icon.ts (58%) rename src/{neuroglancer => }/widget/close_button.ts (80%) rename src/{neuroglancer => }/widget/color.ts (60%) rename src/{neuroglancer => }/widget/coordinate_transform.css (84%) rename src/{neuroglancer => }/widget/coordinate_transform.ts (53%) rename src/{neuroglancer => }/widget/copy_button.ts (80%) rename src/{neuroglancer => }/widget/delete_button.ts (79%) rename src/{neuroglancer => }/widget/dependent_view_widget.ts (57%) rename src/{neuroglancer => }/widget/display_dimensions_widget.css (88%) create mode 100644 src/widget/display_dimensions_widget.ts rename src/{neuroglancer => }/widget/enum_widget.ts (68%) rename src/{neuroglancer => }/widget/eye_button.css (100%) rename src/{neuroglancer => }/widget/eye_button.ts (72%) rename src/{neuroglancer => }/widget/filter_button.ts (80%) rename src/{neuroglancer => }/widget/help_button.ts (85%) rename src/{neuroglancer => }/widget/hidden_submit_button.ts (75%) rename src/{neuroglancer => }/widget/icon.css (100%) rename src/{neuroglancer => }/widget/icon.ts (77%) rename src/{neuroglancer => }/widget/invlerp.css (94%) create mode 100644 src/widget/invlerp.ts rename src/{neuroglancer => }/widget/layer_control.css (85%) create mode 100644 src/widget/layer_control.ts create mode 100644 src/widget/layer_control_channel_invlerp.ts rename src/{neuroglancer => }/widget/layer_control_checkbox.ts (62%) rename src/{neuroglancer => }/widget/layer_control_color.ts (51%) rename src/{neuroglancer => }/widget/layer_control_enum.ts (57%) create mode 100644 src/widget/layer_control_property_invlerp.ts create mode 100644 src/widget/layer_control_range.ts rename src/{neuroglancer => }/widget/layer_reference.ts (61%) rename src/{neuroglancer => }/widget/linked_layer.css (93%) rename src/{neuroglancer => }/widget/linked_layer.ts (54%) rename src/{neuroglancer => }/widget/maximize_button.ts (79%) rename src/{neuroglancer => }/widget/move_to_button.ts (85%) rename src/{neuroglancer => }/widget/multiline_autocomplete.css (86%) rename src/{neuroglancer => }/widget/multiline_autocomplete.ts (61%) rename src/{neuroglancer => }/widget/number_input_widget.ts (66%) rename src/{neuroglancer => }/widget/position_plot.css (69%) create mode 100644 src/widget/position_plot.ts rename src/{neuroglancer => }/widget/position_widget.css (88%) create mode 100644 src/widget/position_widget.ts rename src/{neuroglancer => }/widget/range.css (87%) rename src/{neuroglancer => }/widget/range.ts (59%) rename src/{neuroglancer => }/widget/render_scale_widget.css (99%) rename src/{neuroglancer => }/widget/render_scale_widget.ts (53%) rename src/{neuroglancer => }/widget/scale_bar.ts (65%) rename src/{neuroglancer => }/widget/segmentation_color_mode.css (100%) create mode 100644 src/widget/segmentation_color_mode.ts rename src/{neuroglancer => }/widget/shader_code_widget.css (100%) rename src/{neuroglancer => }/widget/shader_code_widget.ts (58%) create mode 100644 src/widget/shader_controls.ts rename src/{neuroglancer => }/widget/star_button.css (100%) rename src/{neuroglancer => }/widget/star_button.ts (73%) rename src/{neuroglancer => }/widget/tab_view.css (100%) rename src/{neuroglancer => }/widget/tab_view.ts (60%) rename src/{neuroglancer => }/widget/text_icon_button.css (100%) rename src/{neuroglancer => }/widget/text_icon_button.ts (81%) rename src/{neuroglancer => }/widget/text_input.ts (71%) rename src/{neuroglancer => }/widget/tooltip.css (100%) rename src/{neuroglancer => }/widget/tooltip.ts (67%) rename src/{neuroglancer => }/widget/vec3.css (96%) rename src/{neuroglancer => }/widget/vec3_entry_widget.ts (66%) rename src/{neuroglancer => }/widget/virtual_list.ts (65%) rename src/{neuroglancer => }/worker_rpc.ts (58%) rename src/{neuroglancer => }/worker_rpc_context.ts (89%) rename templates/{neuroglancer => }/sliceview/compressed_segmentation/decode.template.ts (100%) rename templates/{neuroglancer => }/sliceview/compressed_segmentation/encode.template.ts (100%) rename templates/{neuroglancer => }/sliceview/compressed_segmentation/encode_common.template.ts (100%) rename templates/{neuroglancer => }/util/linked_list.template.ts (100%) rename templates/{neuroglancer => }/util/pairing_heap.template.ts (100%) rename templates/{neuroglancer => }/util/typedarray_builder.template.ts (100%) diff --git a/.editorconfig b/.editorconfig index 23291bc39b..c5e48689ea 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,6 +7,7 @@ end_of_line = lf charset = utf-8 trim_leading_whitespace = true insert_final_newline = true +max_line_length = 80 [*.py] indent_style = space diff --git a/.eslintrc b/.eslintrc index cd56dcb8fd..b5f5d90037 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,9 +1,7 @@ { "root": true, "parser": "@typescript-eslint/parser", - "plugins": [ - "@typescript-eslint" - ], + "plugins": ["@typescript-eslint"], "extends": [ "eslint:recommended", "plugin:@typescript-eslint/eslint-recommended", @@ -16,6 +14,6 @@ "@typescript-eslint/no-inferrable-types": "off", "@typescript-eslint/no-this-alias": "off", "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-empty-interface": "off", - }, + "@typescript-eslint/no-empty-interface": "off" + } } diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..f5fd057559 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,12 @@ +# Prevent line ending conversions by default to avoid problems with binary files. +* -text + +# Known text files should have LF line endings. +*.py text eol=lf +*.ts text eol=lf +*.js text eol=lf +*.css text eol=lf +*.json text eol=lf +*.html text eol=lf +*.svg text eol=lf +*.md text eol=lf diff --git a/.github/actions/setup-firefox/action.yml b/.github/actions/setup-firefox/action.yml index 34de08ac36..c1e5d1cc65 100644 --- a/.github/actions/setup-firefox/action.yml +++ b/.github/actions/setup-firefox/action.yml @@ -3,17 +3,17 @@ description: "Sets up firefox on Linux" runs: using: "composite" steps: - - run: | - sudo add-apt-repository ppa:mozillateam/ppa - echo ' - Package: * - Pin: release o=LP-PPA-mozillateam - Pin-Priority: 1001 + - run: | + sudo add-apt-repository ppa:mozillateam/ppa + echo ' + Package: * + Pin: release o=LP-PPA-mozillateam + Pin-Priority: 1001 - Package: firefox - Pin: version 1:1snap1-0ubuntu2 - Pin-Priority: -1 - ' | sudo tee /etc/apt/preferences.d/mozilla-firefox - sudo apt-get install firefox xvfb - if: startsWith(runner.os, 'Linux') - shell: bash + Package: firefox + Pin: version 1:1snap1-0ubuntu2 + Pin-Priority: -1 + ' | sudo tee /etc/apt/preferences.d/mozilla-firefox + sudo apt-get install firefox xvfb + if: startsWith(runner.os, 'Linux') + shell: bash diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ea403100de..eb1c1d5b36 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,45 +7,49 @@ jobs: strategy: matrix: node-version: - - '16.x' + - "20.x" os: - - 'ubuntu-latest' - - 'windows-latest' - - 'macos-latest' + - "ubuntu-latest" + - "windows-latest" + - "macos-latest" runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - uses: actions/cache@v2 - with: - path: "**/node_modules" - key: ${{ runner.os }}-${{ matrix.node-version }}-node_modules-${{ hashFiles('**/package-lock.json') }} - - run: npm install - - name: Typecheck with TypeScript - run: npm run typecheck - - name: Build client bundles - run: npm run build -- --no-typecheck - - name: Build JavaScript module - run: npm run build-module -- --no-typecheck - - name: Build Python client bundles - run: npm run build-python -- --no-typecheck - - uses: ./.github/actions/setup-firefox - - name: Run JavaScript tests (including WebGL) - # Swiftshader, used by Chrome headless, crashes when running Neuroglancer - # tests. - # - # The only reliable headless configuration is Firefox on Linux under - # xvfb-run, which uses Mesa software rendering. - if: startsWith(runner.os, 'Linux') - run: xvfb-run --auto-servernum --server-args='-screen 0 1024x768x24' npm run test -- --browsers Firefox - - name: Run JavaScript tests (excluding WebGL) - if: ${{ !startsWith(runner.os, 'Linux') }} - run: npm run test -- --browsers ChromeHeadless --define=NEUROGLANCER_SKIP_WEBGL_TESTS - - name: Run JavaScript benchmarks - run: npm run benchmark + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - uses: actions/cache@v2 + with: + path: "**/node_modules" + key: ${{ runner.os }}-${{ matrix.node-version }}-node_modules-${{ hashFiles('**/package-lock.json') }} + - run: npm install + - run: npm run format:fix + - name: Check for dirty working directory + run: git diff --exit-code + - run: npm run lint:check + - name: Typecheck with TypeScript + run: npm run typecheck + - name: Build client bundles + run: npm run build -- --no-typecheck + - name: Build JavaScript module + run: npm run build-module -- --no-typecheck + - name: Build Python client bundles + run: npm run build-python -- --no-typecheck + - uses: ./.github/actions/setup-firefox + - name: Run JavaScript tests (including WebGL) + # Swiftshader, used by Chrome headless, crashes when running Neuroglancer + # tests. + # + # The only reliable headless configuration is Firefox on Linux under + # xvfb-run, which uses Mesa software rendering. + if: startsWith(runner.os, 'Linux') + run: xvfb-run --auto-servernum --server-args='-screen 0 1024x768x24' npm run test -- --browsers Firefox + - name: Run JavaScript tests (excluding WebGL) + if: ${{ !startsWith(runner.os, 'Linux') }} + run: npm run test -- --browsers ChromeHeadless --define=NEUROGLANCER_SKIP_WEBGL_TESTS + - name: Run JavaScript benchmarks + run: npm run benchmark # Builds Python package and runs Python tests # @@ -56,184 +60,185 @@ jobs: strategy: matrix: python-version: - - '3.9' - - '3.10' - - '3.11' + - "3.9" + - "3.10" + - "3.11" node-version: - - '16.x' + - "16.x" os: - - 'ubuntu-latest' - - 'windows-latest' - - 'macos-latest' + - "ubuntu-latest" + - "windows-latest" + - "macos-latest" runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 - with: - # Need full history to determine version number. - fetch-depth: 0 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - uses: actions/cache@v2 - with: - path: "**/node_modules" - key: ${{ runner.os }}-${{ matrix.node-version }}-node_modules-${{ hashFiles('**/package-lock.json') }} - - name: Get pip cache dir - id: pip-cache - run: | - echo "::set-output name=dir::$(pip cache dir)" - - uses: actions/cache@v2 - with: - path: ${{ steps.pip-cache.outputs.dir }} - key: ${{ runner.os }}-${{ matrix.python-version }}-pip-${{ hashFiles('setup.py') }} - # Uncomment the action below for an interactive shell - # - name: Setup tmate session - # uses: mxschmitt/action-tmate@v3 - - name: Install Python packaging/test tools - run: python -m pip install --upgrade pip tox wheel numpy pytest - - uses: ./.github/actions/setup-firefox - - name: Test with tox - run: tox -e ${{ fromJSON('["skip-browser-tests","firefox-xvfb"]')[runner.os == 'Linux'] }} - # Verify that editable install works - - name: Install in editable form - run: pip install -e . --config-settings editable_mode=strict - - name: Run Python tests against editable install (excluding WebGL) - working-directory: python/tests - run: pytest -vv --skip-browser-tests + - uses: actions/checkout@v2 + with: + # Need full history to determine version number. + fetch-depth: 0 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - uses: actions/cache@v2 + with: + path: "**/node_modules" + key: ${{ runner.os }}-${{ matrix.node-version }}-node_modules-${{ hashFiles('**/package-lock.json') }} + - name: Get pip cache dir + id: pip-cache + run: | + echo "::set-output name=dir::$(pip cache dir)" + - uses: actions/cache@v2 + with: + path: ${{ steps.pip-cache.outputs.dir }} + key: ${{ runner.os }}-${{ matrix.python-version }}-pip-${{ hashFiles('setup.py') }} + # Uncomment the action below for an interactive shell + # - name: Setup tmate session + # uses: mxschmitt/action-tmate@v3 + - name: Install Python packaging/test tools + run: python -m pip install --upgrade pip tox nox wheel numpy pytest + - uses: ./.github/actions/setup-firefox + - run: nox -s lint format mypy + - name: Test with tox + run: tox -e ${{ fromJSON('["skip-browser-tests","firefox-xvfb"]')[runner.os == 'Linux'] }} + # Verify that editable install works + - name: Install in editable form + run: pip install -e . --config-settings editable_mode=strict + - name: Run Python tests against editable install (excluding WebGL) + working-directory: python/tests + run: pytest -vv --skip-browser-tests python-build-package: strategy: matrix: include: - - os: 'ubuntu-latest' - cibw_build: '*' - wheel_identifier: 'linux' - node-version: '16.x' - - os: 'windows-latest' - cibw_build: '*' - wheel_identifier: 'windows' - node-version: '16.x' - - os: 'macos-latest' - cibw_build: '*_x86_64' - wheel_identifier: 'macos_x86_64' - node-version: '16.x' - - os: 'macos-latest' - cibw_build: '*_arm64' - wheel_identifier: 'macos_arm64' - node-version: '16.x' + - os: "ubuntu-latest" + cibw_build: "*" + wheel_identifier: "linux" + node-version: "16.x" + - os: "windows-latest" + cibw_build: "*" + wheel_identifier: "windows" + node-version: "16.x" + - os: "macos-latest" + cibw_build: "*_x86_64" + wheel_identifier: "macos_x86_64" + node-version: "16.x" + - os: "macos-latest" + cibw_build: "*_arm64" + wheel_identifier: "macos_arm64" + node-version: "16.x" runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 - with: - # Need full history to determine version number. - fetch-depth: 0 - - name: Use Node.js - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.x - - uses: actions/cache@v2 - with: - path: "**/node_modules" - key: ${{ runner.os }}-${{ matrix.node-version }}-node_modules-${{ hashFiles('**/package-lock.json') }} - - name: Get pip cache dir - id: pip-cache - run: | - echo "::set-output name=dir::$(pip cache dir)" - - uses: actions/cache@v2 - with: - path: ${{ steps.pip-cache.outputs.dir }} - key: ${{ runner.os }}-buildwheel-${{ hashFiles('setup.py') }} - - run: npm install - - run: | - build_info="{'tag':'$(git describe --always --tags)', 'url':'https://github.com/google/neuroglancer/commit/$(git rev-parse HEAD)', 'timestamp':'$(date)'}" - npm run build-python -- --no-typecheck --define NEUROGLANCER_BUILD_INFO="${build_info}" - shell: bash - - name: Check for dirty working directory - run: git diff --exit-code - - name: Install setuptools - run: pip install setuptools - - name: Build Python source distribution (sdist) - run: python setup.py sdist --format gztar - if: ${{ runner.os == 'Linux' }} - - name: Install cibuildwheel - run: pip install cibuildwheel - - name: Build Python wheels - run: bash -xve ./python/build_tools/cibuildwheel.sh - env: - # On Linux, share pip cache with manylinux docker containers - CIBW_ENVIRONMENT_LINUX: PIP_CACHE_DIR=/host${{ steps.pip-cache.outputs.dir }} - CIBW_BEFORE_ALL_LINUX: /project/python/build_tools/cibuildwheel_linux_cache_setup.sh /host${{ steps.pip-cache.outputs.dir }} - CIBW_BUILD: ${{ matrix.cibw_build }} - - name: Upload wheels as artifacts - uses: actions/upload-artifact@v2 - with: - name: python-wheels-${{ matrix.wheel_identifier }} - path: | - dist/*.whl - dist/*.tar.gz + - uses: actions/checkout@v2 + with: + # Need full history to determine version number. + fetch-depth: 0 + - name: Use Node.js + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: 3.x + - uses: actions/cache@v2 + with: + path: "**/node_modules" + key: ${{ runner.os }}-${{ matrix.node-version }}-node_modules-${{ hashFiles('**/package-lock.json') }} + - name: Get pip cache dir + id: pip-cache + run: | + echo "::set-output name=dir::$(pip cache dir)" + - uses: actions/cache@v2 + with: + path: ${{ steps.pip-cache.outputs.dir }} + key: ${{ runner.os }}-buildwheel-${{ hashFiles('setup.py') }} + - run: npm install + - run: | + build_info="{'tag':'$(git describe --always --tags)', 'url':'https://github.com/google/neuroglancer/commit/$(git rev-parse HEAD)', 'timestamp':'$(date)'}" + npm run build-python -- --no-typecheck --define NEUROGLANCER_BUILD_INFO="${build_info}" + shell: bash + - name: Check for dirty working directory + run: git diff --exit-code + - name: Install setuptools + run: pip install setuptools + - name: Build Python source distribution (sdist) + run: python setup.py sdist --format gztar + if: ${{ runner.os == 'Linux' }} + - name: Install cibuildwheel + run: pip install cibuildwheel + - name: Build Python wheels + run: bash -xve ./python/build_tools/cibuildwheel.sh + env: + # On Linux, share pip cache with manylinux docker containers + CIBW_ENVIRONMENT_LINUX: PIP_CACHE_DIR=/host${{ steps.pip-cache.outputs.dir }} + CIBW_BEFORE_ALL_LINUX: /project/python/build_tools/cibuildwheel_linux_cache_setup.sh /host${{ steps.pip-cache.outputs.dir }} + CIBW_BUILD: ${{ matrix.cibw_build }} + - name: Upload wheels as artifacts + uses: actions/upload-artifact@v2 + with: + name: python-wheels-${{ matrix.wheel_identifier }} + path: | + dist/*.whl + dist/*.tar.gz python-publish-package: # Only publish package on push to tag or default branch. if: ${{ github.event_name == 'push' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/master') }} runs-on: ubuntu-latest needs: - - 'python-build-package' + - "python-build-package" steps: - - uses: actions/download-artifact@v2 - with: - name: python-wheels-linux - path: dist - - uses: actions/download-artifact@v2 - with: - name: python-wheels-macos_x86_64 - path: dist - - uses: actions/download-artifact@v2 - with: - name: python-wheels-macos_arm64 - path: dist - - uses: actions/download-artifact@v2 - with: - name: python-wheels-windows - path: dist - # - name: Publish to PyPI (test server) - # uses: pypa/gh-action-pypi-publish@54b39fb9371c0b3a6f9f14bb8a67394defc7a806 # 2020-09-25 - # with: - # user: __token__ - # password: ${{ secrets.pypi_test_token }} - - name: Publish to PyPI (main server) - uses: pypa/gh-action-pypi-publish@54b39fb9371c0b3a6f9f14bb8a67394defc7a806 # 2020-09-25 - with: - user: __token__ - password: ${{ secrets.pypi_token }} - if: ${{ startsWith(github.ref, 'refs/tags/v') }} + - uses: actions/download-artifact@v2 + with: + name: python-wheels-linux + path: dist + - uses: actions/download-artifact@v2 + with: + name: python-wheels-macos_x86_64 + path: dist + - uses: actions/download-artifact@v2 + with: + name: python-wheels-macos_arm64 + path: dist + - uses: actions/download-artifact@v2 + with: + name: python-wheels-windows + path: dist + # - name: Publish to PyPI (test server) + # uses: pypa/gh-action-pypi-publish@54b39fb9371c0b3a6f9f14bb8a67394defc7a806 # 2020-09-25 + # with: + # user: __token__ + # password: ${{ secrets.pypi_test_token }} + - name: Publish to PyPI (main server) + uses: pypa/gh-action-pypi-publish@54b39fb9371c0b3a6f9f14bb8a67394defc7a806 # 2020-09-25 + with: + user: __token__ + password: ${{ secrets.pypi_token }} + if: ${{ startsWith(github.ref, 'refs/tags/v') }} ngauth: strategy: matrix: - go-version: ['1.19'] + go-version: ["1.19"] os: - ubuntu-latest runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 - - name: Setup go ${{ matrix.go-version }} - uses: actions/setup-go@v1 - with: - go-version: ${{ matrix.go-version }} - - uses: actions/cache@v2 - with: - path: ~/go/pkg/mod - key: ${{ runner.os }}-${{ matrix.go-version }}-go-${{ hashFiles('**/go.sum') }} - - run: go build . - working-directory: ngauth_server + - uses: actions/checkout@v2 + - name: Setup go ${{ matrix.go-version }} + uses: actions/setup-go@v1 + with: + go-version: ${{ matrix.go-version }} + - uses: actions/cache@v2 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-${{ matrix.go-version }}-go-${{ hashFiles('**/go.sum') }} + - run: go build . + working-directory: ngauth_server wasm: # Ensures that .wasm files are reproducible. strategy: @@ -242,9 +247,9 @@ jobs: - ubuntu-latest runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 - - run: ./src/neuroglancer/mesh/draco/build.sh - - run: ./src/neuroglancer/sliceview/compresso/build.sh - - run: ./src/neuroglancer/sliceview/png/build.sh - # Check that there are no differences. - - run: git diff --exit-code + - uses: actions/checkout@v2 + - run: ./src/mesh/draco/build.sh + - run: ./src/sliceview/compresso/build.sh + - run: ./src/sliceview/png/build.sh + # Check that there are no differences. + - run: git diff --exit-code diff --git a/.gitignore b/.gitignore index 4ba9556155..47161fcf76 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,7 @@ tsconfig.tsbuildinfo /.log *.so *.egg-info +.mypy_cache +.nox +.pytest_cache +/ngauth_server/secrets/ diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000000..9ad83dc42d --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +/templates/ +/python/ +/third_party/jpgjs/jpg.js +/testdata/*.json diff --git a/src/neuroglancer/datasource/nggraph/backend.ts b/.prettierrc.yml similarity index 100% rename from src/neuroglancer/datasource/nggraph/backend.ts rename to .prettierrc.yml diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 395a39080c..fbbb00cd77 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,7 @@ Want to contribute? Great! First, read this page (including the small print at the end). ### Before you contribute + Before we can use your code, you must sign the [Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual) (CLA), which you can do online. The CLA is necessary mainly because you own the @@ -16,25 +17,36 @@ possibly guide you. Coordinating up front makes it much easier to avoid frustration later on. ### Code reviews + All submissions, including submissions by project members, require review. ### Coding Style + For consistency, please ensure that all TypeScript/JavaScript files -are formatted by `clang-format` using the -[.clang-format](.clang-format) style file. You can verify this by -running: +are linted with Biome and formatted by `prettier`. + +You can check for lint/format issues with: ```shell -npm run gulp check-format +npm run lint:check +npm run format:check ``` -To reformat all TypeScript/JavaScript source files, run: + +To reformat run: + ```shell -npm run gulp format +npm run format:fix +``` + +To automatically apply safe lint fixes, run: + +```shell +npm run lint:fix ``` Python code is linted and formatted using [ruff](https://github.com/astral-sh/ruff) and typechecked using -[mypy](https://mypy-lang.org/). To verify, run: +[mypy](https://mypy-lang.org/). To verify, run: ```shell pip install nox @@ -42,6 +54,7 @@ nox -s lint format mypy ``` ### The small print + Contributions made by corporations are covered by a different agreement than the one above, the [Software Grant and Corporate Contributor License Agreement](https://cla.developers.google.com/about/google-corporate). diff --git a/README.md b/README.md index 83c607fb3f..9d0ba55550 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,31 @@ -Neuroglancer: Web-based volumetric data visualization ------------------------------------------------------ +## Neuroglancer: Web-based volumetric data visualization [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![PyPI](https://img.shields.io/pypi/v/neuroglancer)](https://pypi.org/project/neuroglancer) ![Build](https://github.com/google/neuroglancer/workflows/Build/badge.svg) [![DOI](https://zenodo.org/badge/59798355.svg)](https://zenodo.org/badge/latestdoi/59798355) -Neuroglancer is a WebGL-based viewer for volumetric data. It is capable of displaying arbitrary (non axis-aligned) cross-sectional views of volumetric data, as well as 3-D meshes and line-segment based models (skeletons). +Neuroglancer is a WebGL-based viewer for volumetric data. It is capable of displaying arbitrary (non axis-aligned) cross-sectional views of volumetric data, as well as 3-D meshes and line-segment based models (skeletons). This is not an official Google product. # Examples -A live demo is hosted at . (The prior link opens the viewer without any preloaded dataset.) Use the viewer links below to open the viewer preloaded with an example dataset. +A live demo is hosted at . (The prior link opens the viewer without any preloaded dataset.) Use the viewer links below to open the viewer preloaded with an example dataset. -The four-pane view consists of 3 orthogonal cross-sectional views as well as a 3-D view (with independent orientation) that displays 3-D models (if available) for the selected objects. All four views maintain the same center position. The orientation of the 3 cross-sectional views can also be adjusted, although they maintain a fixed orientation relative to each other. (Try holding the shift key and either dragging with the left mouse button or pressing an arrow key.) +The four-pane view consists of 3 orthogonal cross-sectional views as well as a 3-D view (with independent orientation) that displays 3-D models (if available) for the selected objects. All four views maintain the same center position. The orientation of the 3 cross-sectional views can also be adjusted, although they maintain a fixed orientation relative to each other. (Try holding the shift key and either dragging with the left mouse button or pressing an arrow key.) - [FlyEM Hemibrain](https://www.janelia.org/project-team/flyem/hemibrain) (8x8x8 cubic nanometer resolution). Open viewer -- [FAFB-FFN1 Full Adult Fly Brain Automated Segmentation](https://fafb-ffn1.storage.googleapis.com/landing.html) (4x4x40 cubic nanometer resolution). Open viewer +- [FAFB-FFN1 Full Adult Fly Brain Automated Segmentation](https://fafb-ffn1.storage.googleapis.com/landing.html) (4x4x40 cubic nanometer resolution). Open viewer -- Kasthuri et al., 2014. Mouse somatosensory cortex (6x6x30 cubic nanometer resolution). Open viewer. +- Kasthuri et al., 2014. Mouse somatosensory cortex (6x6x30 cubic nanometer resolution). Open viewer. - This dataset was copied from and is made available under the [Open Data Common Attribution License](http://opendatacommons.org/licenses/by/1.0/). Paper: Kasthuri, Narayanan, et al. "Saturated reconstruction of a volume of neocortex." Cell 162.3 (2015): 648-661. - -- Janelia FlyEM FIB-25. 7-column Drosophila medulla (8x8x8 cubic nanometer resolution). Open viewer. + This dataset was copied from and is made available under the [Open Data Common Attribution License](http://opendatacommons.org/licenses/by/1.0/). Paper: Kasthuri, Narayanan, et al. "Saturated reconstruction of a volume of neocortex." Cell 162.3 (2015): 648-661. - This dataset was copied from , and is made available under the [Open Data Common Attribution License](http://opendatacommons.org/licenses/by/1.0/). Paper: Takemura, Shin-ya et al. "Synaptic Circuits and Their Variations within Different Columns in the Visual System of Drosophila." Proceedings of the National Academy of Sciences of the United States of America 112.44 (2015): 13711-13716. +- Janelia FlyEM FIB-25. 7-column Drosophila medulla (8x8x8 cubic nanometer resolution). Open viewer. + + This dataset was copied from , and is made available under the [Open Data Common Attribution License](http://opendatacommons.org/licenses/by/1.0/). Paper: Takemura, Shin-ya et al. "Synaptic Circuits and Their Variations within Different Columns in the Visual System of Drosophila." Proceedings of the National Academy of Sciences of the United States of America 112.44 (2015): 13711-13716. - Example of viewing 2D microscopy (coronal section of rat brain at 325 nanometer resolution). Open viewer. (Use Ctrl+MouseWheel to zoom out) @@ -35,7 +34,7 @@ The four-pane view consists of 3 orthogonal cross-sectional views as well as a 3 # Supported data sources -Neuroglancer itself is purely a client-side program, but it depends on data being accessible via HTTP in a suitable format. It is designed to easily support many different data sources, and there is existing support for the following data APIs/formats: +Neuroglancer itself is purely a client-side program, but it depends on data being accessible via HTTP in a suitable format. It is designed to easily support many different data sources, and there is existing support for the following data APIs/formats: - [Neuroglancer precomputed format](src/neuroglancer/datasource/precomputed) - [N5](src/neuroglancer/datasource/n5) @@ -72,39 +71,41 @@ or within Neuroglancer, press `h` or click on the button labeled `?` in the uppe - Neuroglancer doesn't appear to load properly. Neuroglancer requires WebGL (2.0) and the `EXT_color_buffer_float` extension. - - To troubleshoot, check the developer console, which is accessed by the keyboard shortcut `control-shift-i` in Firefox and Chrome. If there is a message regarding failure to initialize WebGL, you can take the following steps: - + + To troubleshoot, check the developer console, which is accessed by the keyboard shortcut `control-shift-i` in Firefox and Chrome. If there is a message regarding failure to initialize WebGL, you can take the following steps: + - Chrome - - Check `chrome://gpu` to see if your GPU is blacklisted. There may be a flag you can enable to make it work. - + + Check `chrome://gpu` to see if your GPU is blacklisted. There may be a flag you can enable to make it work. + - Firefox - Check `about:support`. There may be webgl-related properties in `about:config` that you can change to make it work. Possible settings: + Check `about:support`. There may be webgl-related properties in `about:config` that you can change to make it work. Possible settings: + - `webgl.disable-fail-if-major-performance-caveat = true` - `webgl.force-enabled = true` - `webgl.msaa-force = true` - + - Failure to access a data source. - As a security measure, browsers will in many prevent a webpage from accessing the true error code associated with a failed HTTP request. It is therefore often necessary to check the developer tools to see the true cause of any HTTP request error. + As a security measure, browsers will in many prevent a webpage from accessing the true error code associated with a failed HTTP request. It is therefore often necessary to check the developer tools to see the true cause of any HTTP request error. There are several likely causes: - + - [Cross-origin resource sharing (CORS)](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) - - Neuroglancer relies on cross-origin requests to retrieve data from third-party servers. As a security measure, if an appropriate `Access-Control-Allow-Origin` response header is not sent by the server, browsers prevent webpages from accessing any information about the response from a cross-origin request. In order to make the data accessible to Neuroglancer, you may need to change the cross-origin request sharing (CORS) configuration of the HTTP server. - + + Neuroglancer relies on cross-origin requests to retrieve data from third-party servers. As a security measure, if an appropriate `Access-Control-Allow-Origin` response header is not sent by the server, browsers prevent webpages from accessing any information about the response from a cross-origin request. In order to make the data accessible to Neuroglancer, you may need to change the cross-origin request sharing (CORS) configuration of the HTTP server. + - Accessing an `http://` resource from a Neuroglancer client hosted at an `https://` URL - - As a security measure, recent versions of Chrome and Firefox prohibit webpages hosted at `https://` URLs from issuing requests to `http://` URLs. As a workaround, you can use a Neuroglancer client hosted at a `http://` URL, e.g. the demo client running at http://neuroglancer-demo.appspot.com, or one running on localhost. Alternatively, you can start Chrome with the `--disable-web-security` flag, but that should be done only with extreme caution. (Make sure to use a separate profile, and do not access any untrusted webpages when running with that flag enabled.) - + + As a security measure, recent versions of Chrome and Firefox prohibit webpages hosted at `https://` URLs from issuing requests to `http://` URLs. As a workaround, you can use a Neuroglancer client hosted at a `http://` URL, e.g. the demo client running at http://neuroglancer-demo.appspot.com, or one running on localhost. Alternatively, you can start Chrome with the `--disable-web-security` flag, but that should be done only with extreme caution. (Make sure to use a separate profile, and do not access any untrusted webpages when running with that flag enabled.) + # Multi-threaded architecture -In order to maintain a responsive UI and data display even during rapid navigation, work is split between the main UI thread (referred to as the "frontend") and a separate WebWorker thread (referred to as the "backend"). This introduces some complexity due to the fact that current browsers: - - do not support any form of *shared* memory or standard synchronization mechanism (although they do support relatively efficient *transfers* of typed arrays between threads); - - require that all manipulation of the DOM and the WebGL context happens on the main UI thread. +In order to maintain a responsive UI and data display even during rapid navigation, work is split between the main UI thread (referred to as the "frontend") and a separate WebWorker thread (referred to as the "backend"). This introduces some complexity due to the fact that current browsers: + +- do not support any form of _shared_ memory or standard synchronization mechanism (although they do support relatively efficient _transfers_ of typed arrays between threads); +- require that all manipulation of the DOM and the WebGL context happens on the main UI thread. The "frontend" UI thread handles user actions and rendering, while the "backend" WebWorker thread handle all queuing, downloading, and preprocessing of data needed for rendering. @@ -122,12 +123,12 @@ node.js is required to build the viewer. 1. First install NVM (node version manager) per the instructions here: - https://github.com/creationix/nvm +https://github.com/creationix/nvm 2. Install a recent version of Node.js if you haven't already done so: - `nvm install stable` - + `nvm install stable` + 3. Install the dependencies required by this project: (From within this directory) @@ -140,33 +141,30 @@ node.js is required to build the viewer. 4. To run a local server for development purposes: `npm run dev-server` - + This will start a server on . - + 5. To run the unit test suite on Chrome: - + `npm test` - + To run only tests in files matching a given glob pattern: - + `npm test -- --pattern=''` - + For example, - + `npm test -- --pattern='src/neuroglancer/util/uint64*'` 6. See [package.json](package.json) for other commands available. -# Creating a dependent project - -See [examples/dependent-project](examples/dependent-project). - # Discussion Group There is a Google Group/mailing list for discussion related to Neuroglancer: . # Related Projects + - [TensorStore](https://github.com/google/tensorstore) - C++ and Python library for efficiently reading and writing multi-dimensional arrays in formats supported by Neuroglancer. - [4Quant/neuroglancer-docker](https://github.com/4Quant/neuroglancer-docker) - Example setup for @@ -182,12 +180,12 @@ There is a Google Group/mailing list for discussion related to Neuroglancer: # Contributing -Want to contribute? Great! First, read [CONTRIBUTING.md](CONTRIBUTING.md). +Want to contribute? Great! First, read [CONTRIBUTING.md](CONTRIBUTING.md). # License Copyright 2016 Google Inc. - + Licensed under the Apache License, Version 2.0 (the "License"); you may not use this software except in compliance with the License. You may obtain a copy of the License at . diff --git a/biome.json b/biome.json new file mode 100644 index 0000000000..7144655640 --- /dev/null +++ b/biome.json @@ -0,0 +1,64 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.4.1/schema.json", + "vcs": { + "clientKind": "git", + "enabled": true, + "useIgnoreFile": true + }, + "files": { + "include": [ + "src/**/*.ts", + "src/**/*.js", + "config/**/*.ts", + "config/**/*.js" + ], + "ignore": [ + "python/**", + "templates/**", + "testdata/*.json", + "third_party/jpgjs/jpg.js", + "dist/**", + ".tox/**", + ".nox/**", + "build/**" + ] + }, + "organizeImports": { + "enabled": true + }, + "formatter": { + "enabled": false, + "indentStyle": "space" + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "suspicious": { + "noRedundantUseStrict": "off", + "noAssignInExpressions": "off", + "noExplicitAny": "off", + "noUnsafeDeclarationMerging": "off", + "noFallthroughSwitchClause": "off", + "noConfusingVoidType": "off" + }, + "complexity": { + "noForEach": "off", + "noBannedTypes": "off", + "noStaticOnlyClass": "off", + "noThisInStatic": "off" + }, + "style": { + "noNonNullAssertion": "off", + "noParameterAssign": "off", + "useTemplate": "off", + "useLiteralEnumMembers": "off", + "noArguments": "off" + }, + "correctness": { + "useYield": "off", + "noUnsafeFinally": "off" + } + } + } +} diff --git a/config/bundle-config.js b/config/bundle-config.js index 38e58d26b6..7847027610 100644 --- a/config/bundle-config.js +++ b/config/bundle-config.js @@ -14,139 +14,134 @@ * limitations under the License. */ -'use strict'; +"use strict"; -const resolveReal = require('./resolve_real'); +const resolveReal = require("./resolve_real"); -const DEFAULT_DATA_SOURCES = exports.DEFAULT_DATA_SOURCES = [ +const DEFAULT_DATA_SOURCES = (exports.DEFAULT_DATA_SOURCES = [ { - source: 'neuroglancer/datasource/brainmaps', - registerCredentials: 'neuroglancer/datasource/brainmaps/register_credentials_provider', - asyncComputation: [ - 'neuroglancer/async_computation/decode_jpeg', - ], + source: "#/datasource/brainmaps", + registerCredentials: "#/datasource/brainmaps/register_credentials_provider", + asyncComputation: ["#/async_computation/decode_jpeg"], }, { - source: 'neuroglancer/datasource/boss', - registerCredentials: 'neuroglancer/datasource/boss/register_credentials_provider', + source: "#/datasource/boss", + registerCredentials: "#/datasource/boss/register_credentials_provider", asyncComputation: [ - 'neuroglancer/async_computation/decode_jpeg', - 'neuroglancer/async_computation/decode_gzip', + "#/async_computation/decode_jpeg", + "#/async_computation/decode_gzip", ], }, { - source: 'neuroglancer/datasource/deepzoom', + source: "#/datasource/deepzoom", asyncComputation: [ - 'neuroglancer/async_computation/decode_jpeg', - 'neuroglancer/async_computation/decode_png', + "#/async_computation/decode_jpeg", + "#/async_computation/decode_png", ], }, { - source: 'neuroglancer/datasource/dvid', - registerCredentials: 'neuroglancer/datasource/dvid/register_credentials_provider', - asyncComputation: [ - 'neuroglancer/async_computation/decode_jpeg', - ], + source: "#/datasource/dvid", + registerCredentials: "#/datasource/dvid/register_credentials_provider", + asyncComputation: ["#/async_computation/decode_jpeg"], }, { - source: 'neuroglancer/datasource/render', - asyncComputation: [ - 'neuroglancer/async_computation/decode_jpeg', - ], + source: "#/datasource/render", + asyncComputation: ["#/async_computation/decode_jpeg"], }, { - source: 'neuroglancer/datasource/precomputed', + source: "#/datasource/precomputed", asyncComputation: [ - 'neuroglancer/async_computation/decode_jpeg', - 'neuroglancer/async_computation/decode_gzip', - 'neuroglancer/async_computation/decode_compresso', - 'neuroglancer/async_computation/decode_png', + "#/async_computation/decode_jpeg", + "#/async_computation/decode_gzip", + "#/async_computation/decode_compresso", + "#/async_computation/decode_png", ], }, { - source: 'neuroglancer/datasource/nifti', - asyncComputation: [ - 'neuroglancer/async_computation/decode_gzip', - ], + source: "#/datasource/nifti", + asyncComputation: ["#/async_computation/decode_gzip"], }, { - source: 'neuroglancer/datasource/n5', + source: "#/datasource/n5", asyncComputation: [ - 'neuroglancer/async_computation/decode_gzip', - 'neuroglancer/async_computation/decode_blosc', + "#/async_computation/decode_gzip", + "#/async_computation/decode_blosc", ], }, { - source: 'neuroglancer/datasource/zarr', + source: "#/datasource/zarr", asyncComputation: [ - 'neuroglancer/async_computation/decode_gzip', - 'neuroglancer/async_computation/decode_blosc', - 'neuroglancer/async_computation/decode_zstd', + "#/async_computation/decode_gzip", + "#/async_computation/decode_blosc", + "#/async_computation/decode_zstd", ], }, - // 'neuroglancer/datasource/computed', - // 'neuroglancer/datasource/computed/example', - // 'neuroglancer/datasource/computed/tensorflow', + // '#/datasource/computed', + // '#/datasource/computed/example', + // '#/datasource/computed/tensorflow', { - source: 'neuroglancer/datasource/vtk', - asyncComputation: [ - 'neuroglancer/async_computation/vtk_mesh', - ], + source: "#/datasource/vtk", + asyncComputation: ["#/async_computation/vtk_mesh"], }, { - source: 'neuroglancer/datasource/obj', - asyncComputation: [ - 'neuroglancer/async_computation/obj_mesh', - ], + source: "#/datasource/obj", + asyncComputation: ["#/async_computation/obj_mesh"], }, { - source: 'neuroglancer/datasource/ngauth', + source: "#/datasource/ngauth", frontend: null, backend: null, register: null, - registerCredentials: 'neuroglancer/datasource/ngauth/register_credentials_provider', + registerCredentials: "#/datasource/ngauth/register_credentials_provider", }, { - source: 'neuroglancer/datasource/middleauth', + source: "#/datasource/middleauth", frontend: null, backend: null, register: null, - registerCredentials: 'neuroglancer/datasource/middleauth/register_credentials_provider', + registerCredentials: + "#/datasource/middleauth/register_credentials_provider", }, { - source: 'neuroglancer/datasource/nggraph', + source: "#/datasource/nggraph", }, { - source: 'neuroglancer/datasource/graphene', + source: "#/datasource/graphene", asyncComputation: [ - 'neuroglancer/async_computation/decode_jpeg', - 'neuroglancer/async_computation/decode_gzip', + "#/async_computation/decode_jpeg", + "#/async_computation/decode_gzip", ], }, -]; +]); -const DEFAULT_SUPPORTED_LAYERS = exports.DEFAULT_SUPPORTED_LAYERS = [ - 'neuroglancer/image_user_layer', - 'neuroglancer/segmentation_user_layer', - 'neuroglancer/single_mesh_user_layer', - 'neuroglancer/annotation/user_layer', -]; +const DEFAULT_SUPPORTED_LAYERS = (exports.DEFAULT_SUPPORTED_LAYERS = [ + "#/image_user_layer", + "#/segmentation_user_layer", + "#/single_mesh_user_layer", + "#/annotation/user_layer", +]); function getBundleSources(options) { - let dataSources = - [...(options.dataSources || DEFAULT_DATA_SOURCES), ...(options.extraDataSources || [])]; - let supportedLayers = options.supportedLayers || DEFAULT_SUPPORTED_LAYERS; - let frontendDataSourceModules = []; - let backendDataSourceModules = []; - let asyncComputationDataSourceModules = new Set(); + const dataSources = [ + ...(options.dataSources || DEFAULT_DATA_SOURCES), + ...(options.extraDataSources || []), + ]; + const supportedLayers = options.supportedLayers || DEFAULT_SUPPORTED_LAYERS; + const frontendDataSourceModules = []; + const backendDataSourceModules = []; + const asyncComputationDataSourceModules = new Set(); const registerCredentials = - options.registerCredentials !== undefined ? options.registerCredentials : !options.python; + options.registerCredentials !== undefined + ? options.registerCredentials + : !options.python; for (let datasource of dataSources) { - if (typeof datasource === 'string') { - datasource = {source: datasource}; + if (typeof datasource === "string") { + datasource = { source: datasource }; } if (datasource.frontend !== null) { - frontendDataSourceModules.push(datasource.frontend || `${datasource.source}/frontend`); + frontendDataSourceModules.push( + datasource.frontend || `${datasource.source}/frontend`, + ); } if (registerCredentials && datasource.registerCredentials) { frontendDataSourceModules.push(datasource.registerCredentials); @@ -157,7 +152,9 @@ function getBundleSources(options) { frontendDataSourceModules.push(datasource.register); } if (datasource.backend !== null) { - backendDataSourceModules.push(datasource.backend || `${datasource.source}/backend`); + backendDataSourceModules.push( + datasource.backend || `${datasource.source}/backend`, + ); } if (datasource.asyncComputation !== undefined) { for (const m of datasource.asyncComputation) { @@ -165,7 +162,7 @@ function getBundleSources(options) { } } } - let defaultDefines = { + const defaultDefines = { // This is the default client ID used for the hosted neuroglancer. // In addition to the hosted neuroglancer origin, it is valid for // the origins: @@ -178,72 +175,83 @@ function getBundleSources(options) { // To deploy to a different origin, you will need to generate your // own client ID from on the Google Developer Console and substitute // it in. - 'BRAINMAPS_CLIENT_ID': - JSON.stringify('639403125587-4k5hgdfumtrvur8v48e3pr7oo91d765k.apps.googleusercontent.com'), + BRAINMAPS_CLIENT_ID: JSON.stringify( + "639403125587-4k5hgdfumtrvur8v48e3pr7oo91d765k.apps.googleusercontent.com", + ), - 'process.env.NODE_ENV': JSON.stringify('production'), + "process.env.NODE_ENV": JSON.stringify("production"), - 'global': 'window', + global: "window", }; - let extraDefines = options.defines || {}; - let srcDir = resolveReal(__dirname, '..', 'src'); - let extraChunkWorkerModules = options.chunkWorkerModules || []; - let extraAsyncComputationModules = options.asyncComputationModules || []; - let chunkWorkerModules = [ - 'neuroglancer/worker_rpc_context', - 'neuroglancer/chunk_manager/backend', - 'neuroglancer/sliceview/backend', - 'neuroglancer/perspective_view/backend', - 'neuroglancer/volume_rendering/backend', - 'neuroglancer/annotation/backend', + const extraDefines = options.defines || {}; + const srcDir = resolveReal(__dirname, "..", "src"); + const extraChunkWorkerModules = options.chunkWorkerModules || []; + const extraAsyncComputationModules = options.asyncComputationModules || []; + const chunkWorkerModules = [ + "#/worker_rpc_context", + "#/chunk_manager/backend", + "#/sliceview/backend", + "#/perspective_view/backend", + "#/volume_rendering/backend", + "#/annotation/backend", ...backendDataSourceModules, ...extraChunkWorkerModules, ]; - let asyncComputationModules = [ - 'neuroglancer/async_computation/handler', - 'neuroglancer/async_computation/encode_compressed_segmentation', + const asyncComputationModules = [ + "#/async_computation/handler", + "#/async_computation/encode_compressed_segmentation", ...asyncComputationDataSourceModules, ...extraAsyncComputationModules, ]; - let frontendModules = options.frontendModules || [resolveReal(srcDir, 'main.ts')]; - let frontendLayerModules = []; - for (let name of supportedLayers) { + const frontendModules = options.frontendModules || [ + resolveReal(srcDir, "main.ts"), + ]; + const frontendLayerModules = []; + for (const name of supportedLayers) { frontendLayerModules.push(name); } return { - main: [...frontendDataSourceModules, ...frontendLayerModules, ...frontendModules], + main: [ + ...frontendDataSourceModules, + ...frontendLayerModules, + ...frontendModules, + ], workers: { - 'chunk_worker': chunkWorkerModules, - 'async_computation': asyncComputationModules, + chunk_worker: chunkWorkerModules, + async_computation: asyncComputationModules, }, - defines: {...defaultDefines, ...extraDefines}, + defines: { ...defaultDefines, ...extraDefines }, }; } exports.getBundleSources = getBundleSources; function makePythonClientOptions(options) { - const srcDir = resolveReal(__dirname, '..', 'src'); + const srcDir = resolveReal(__dirname, "..", "src"); options = Object.assign({}, options); options.extraDataSources = [ ...(options.extraDataSources || []), - {source: 'neuroglancer/datasource/python', register: null}, + { source: "#/datasource/python", register: null }, + ]; + options.frontendModules = options.frontendModules || [ + resolveReal(srcDir, "main_python.ts"), ]; - options.frontendModules = options.frontendModules || [resolveReal(srcDir, 'main_python.ts')]; options.registerCredentials = false; - options.defines = Object.assign(options.defines || {}, {NEUROGLANCER_PYTHON_INTEGRATION: 'true'}); + options.defines = Object.assign(options.defines || {}, { + NEUROGLANCER_PYTHON_INTEGRATION: "true", + }); return options; } exports.makePythonClientOptions = makePythonClientOptions; -exports.getViewerOptions = function (baseConfig, options = {}) { +exports.getViewerOptions = (baseConfig, options = {}) => { if (options.python) { baseConfig = makePythonClientOptions(baseConfig); } if (options.module) { - const srcDir = resolveReal(__dirname, '..', 'src'); - baseConfig.frontendModules = [resolveReal(srcDir, 'main_module.ts')]; + const srcDir = resolveReal(__dirname, "..", "src"); + baseConfig.frontendModules = [resolveReal(srcDir, "main_module.ts")]; } return baseConfig; }; diff --git a/config/esbuild-cli.js b/config/esbuild-cli.js index 889c3c5265..475366b8ab 100644 --- a/config/esbuild-cli.js +++ b/config/esbuild-cli.js @@ -16,11 +16,11 @@ // Command-line interface for building Neuroglancer. -'use strict'; +"use strict"; -const {Builder} = require('./esbuild'); -const path = require('path'); -const fs = require('fs'); +const { Builder } = require("./esbuild"); +const path = require("path"); +const fs = require("fs"); // yargs strips quotes from string values in config objects // (https://github.com/yargs/yargs-parser/issues/385). As a workaround, we add @@ -29,14 +29,14 @@ function mungeConfig(config) { if (Array.isArray(config)) { return config.map(mungeConfig); } - if (typeof config === 'object') { + if (typeof config === "object") { const result = {}; for (const key of Object.keys(config)) { result[key] = mungeConfig(config[key]); } return result; } - if (typeof config !== 'string') { + if (typeof config !== "string") { return config; } return `"${config}"`; @@ -44,23 +44,24 @@ function mungeConfig(config) { function parseDefines(definesArg) { const defines = {}; - if (typeof definesArg === 'object' && !Array.isArray(definesArg)) { + if (typeof definesArg === "object" && !Array.isArray(definesArg)) { definesArg = [definesArg]; } let defineList = definesArg || []; - if (typeof defineList === 'string') { + if (typeof defineList === "string") { defineList = [defineList]; } for (const entry of defineList) { - if (typeof entry !== 'string') { + if (typeof entry !== "string") { Object.assign(defines, entry); continue; } - const splitPoint = entry.indexOf('='); - let key, value; + const splitPoint = entry.indexOf("="); + let key; + let value; if (splitPoint === -1) { key = entry; - value = 'true'; + value = "true"; } else { key = entry.substring(0, splitPoint); value = entry.substring(splitPoint + 1); @@ -69,7 +70,7 @@ function parseDefines(definesArg) { } for (const key of Object.keys(defines)) { const value = defines[key]; - if (typeof value !== 'string') { + if (typeof value !== "string") { defines[key] = JSON.stringify(value); } } @@ -82,27 +83,28 @@ async function main(argv) { let python = false; let moduleBuild = false; let outDir = argv.output; - let id = argv.config; - const pythonOutDir = argv.output !== undefined ? - argv.output : - path.resolve(__dirname, '..', 'python', 'neuroglancer', 'static'); + const id = argv.config; + const pythonOutDir = + argv.output !== undefined + ? argv.output + : path.resolve(__dirname, "..", "python", "neuroglancer", "static"); switch (id) { - case 'min': + case "min": break; - case 'dev': + case "dev": minify = false; break; - case 'python-min': + case "python-min": python = true; outDir = pythonOutDir; break; - case 'python-dev': + case "python-dev": python = true; minify = false; outDir = pythonOutDir; break; - case 'module': + case "module": minify = false; moduleBuild = true; break; @@ -124,7 +126,7 @@ async function main(argv) { if (moduleBuild && argv.output === undefined) { try { if ((await fs.promises.lstat(builder.outDir)).isDirectory()) { - await fs.promises.rmdir(builder.outDir, {recursive: true}); + await fs.promises.rm(builder.outDir, { recursive: true }); } } catch (e) { // Ignore errors. @@ -133,99 +135,98 @@ async function main(argv) { await builder.clearOutput(); } if (argv.watch) { - await require('./esbuild-dev-server')(builder, { + await require("./esbuild-dev-server")(builder, { serve: argv.serve, host: argv.host, port: argv.port, skipTypeCheck, }); } else { - await builder.buildOrExit({skipTypeCheck}); + await builder.buildOrExit({ skipTypeCheck }); } } if (require.main === module) { - const argv = - require('yargs') - .options({ - config: { - description: 'Build configuration identifier', - type: 'string', - nargs: 1, - choices: ['min', 'dev', 'python-min', 'python-dev', 'module'], - default: 'min', - }, - analyze: { - type: 'boolean', - default: false, - description: 'Print bundle analysis.', - }, - typecheck: { - type: 'boolean', - default: true, - description: 'Typecheck the TypeScript code.', - }, - define: { - type: 'array', - coerce: parseDefines, - default: [], - description: - 'JavaScript global identifiers to define when building. Usage: `--define VARIABLE=EXPR`.', - }, - inject: { - type: 'array', - default: [], - description: 'Additional modules to inject into global scope.', - }, - watch: { - type: 'boolean', - default: false, - description: 'Watch sources for changes and rebuild automatically.', - }, - serve: { - group: 'Development server options:', - type: 'boolean', - default: false, - description: 'Run a development server.', - }, - host: { - group: 'Development server options:', - type: 'string', - nargs: 1, - description: - 'Specifies bind address for development server, e.g. 0.0.0.0 or 127.0.0.1', - default: '127.0.0.1', - }, - port: { - group: 'Development server options:', - type: 'number', - nargs: 1, - default: 8080, - description: 'Port number for the development server', - }, - configfile: { - config: true, - description: 'Additional JSON/JavaScript config file to load.', - configParser: x => mungeConfig(require(x)), - }, - output: { - type: 'string', - nargs: 1, - description: 'Output directory.', - }, - ['google-tag-manager']: { - group: 'Customization', - type: 'string', - nargs: 1, - description: 'Google tag manager id to include in index.html', - }, - }) - .strict() - .config(mungeConfig(require('./config.js'))) - .demandCommand(0, 0) - .version(false) - .env('NEUROGLANCER') - .help() - .parse(); + const argv = require("yargs") + .options({ + config: { + description: "Build configuration identifier", + type: "string", + nargs: 1, + choices: ["min", "dev", "python-min", "python-dev", "module"], + default: "min", + }, + analyze: { + type: "boolean", + default: false, + description: "Print bundle analysis.", + }, + typecheck: { + type: "boolean", + default: true, + description: "Typecheck the TypeScript code.", + }, + define: { + type: "array", + coerce: parseDefines, + default: [], + description: + "JavaScript global identifiers to define when building. Usage: `--define VARIABLE=EXPR`.", + }, + inject: { + type: "array", + default: [], + description: "Additional modules to inject into global scope.", + }, + watch: { + type: "boolean", + default: false, + description: "Watch sources for changes and rebuild automatically.", + }, + serve: { + group: "Development server options:", + type: "boolean", + default: false, + description: "Run a development server.", + }, + host: { + group: "Development server options:", + type: "string", + nargs: 1, + description: + "Specifies bind address for development server, e.g. 0.0.0.0 or 127.0.0.1", + default: "127.0.0.1", + }, + port: { + group: "Development server options:", + type: "number", + nargs: 1, + default: 8080, + description: "Port number for the development server", + }, + configfile: { + config: true, + description: "Additional JSON/JavaScript config file to load.", + configParser: (x) => mungeConfig(require(x)), + }, + output: { + type: "string", + nargs: 1, + description: "Output directory.", + }, + "google-tag-manager": { + group: "Customization", + type: "string", + nargs: 1, + description: "Google tag manager id to include in index.html", + }, + }) + .strict() + .config(mungeConfig(require("./config.js"))) + .demandCommand(0, 0) + .version(false) + .env("NEUROGLANCER") + .help() + .parse(); if (argv.serve) { argv.watch = true; } diff --git a/config/esbuild-dev-server.js b/config/esbuild-dev-server.js index 23f24a678a..f6e8b123d0 100644 --- a/config/esbuild-dev-server.js +++ b/config/esbuild-dev-server.js @@ -16,11 +16,11 @@ // Live reload development server for static site bundled using esbuild -'use strict'; +"use strict"; -const chokidar = require('chokidar'); -const LiveServer = require('./static-site-live-server'); -const path = require('path'); +const chokidar = require("chokidar"); +const LiveServer = require("./static-site-live-server"); +const path = require("path"); async function tryBuild(builder) { try { @@ -38,43 +38,44 @@ async function main(builder, options) { } await tryBuild(builder); - const {serve = false} = options; + const { serve = false } = options; - var liveServer = undefined; + let liveServer = undefined; if (serve) { liveServer = new LiveServer(); liveServer.start({ host: options.host, port: options.port, root: builder.outDir, - file: 'index.html', + file: "index.html", }); } let building = false; let needBuild = false; - const sourceWatcher = - chokidar.watch(path.resolve(builder.srcDir, '**')).on('change', async function(filePath) { - if (building) { - needBuild = true; - return; - } - do { - needBuild = false; - try { - let result = await tryBuild(builder); - if (serve) { - if (result) { - liveServer.reload(); - } else { - console.log('Not reloading due to errors'); - } + const sourceWatcher = chokidar + .watch(path.resolve(builder.srcDir, "**")) + .on("change", async (filePath) => { + if (building) { + needBuild = true; + return; + } + do { + needBuild = false; + try { + const result = await tryBuild(builder); + if (serve) { + if (result) { + liveServer.reload(); + } else { + console.log("Not reloading due to errors"); } - } catch (e) { - console.log(`Error building: ${e.message}`); } - } while (needBuild); - building = false; - }); + } catch (e) { + console.log(`Error building: ${e.message}`); + } + } while (needBuild); + building = false; + }); } module.exports = main; diff --git a/config/esbuild.js b/config/esbuild.js index eb9423ea60..b9ce7063d8 100644 --- a/config/esbuild.js +++ b/config/esbuild.js @@ -16,55 +16,62 @@ // esbuild/typescript configuration and launcher for Neuroglancer. -'use strict'; +"use strict"; -const svgInlineLoader = require('./esbuild_svg_inline_loader'); +const svgInlineLoader = require("./esbuild_svg_inline_loader"); -const esbuild = require('esbuild'); -const path = require('path'); -const fs = require('fs'); -const bundleConfig = require('./bundle-config'); -const {spawn} = require('child_process'); +const esbuild = require("esbuild"); +const path = require("path"); +const fs = require("fs"); +const bundleConfig = require("./bundle-config"); +const { spawn } = require("child_process"); -function createEntryPointFile(cacheId, bundleName, sources) { - const tempEntryPointDir = - path.resolve(__dirname, '..', 'node_modules', '.cache', 'esbuild-entry-points', cacheId); - sources = sources.map(x => { - // Ensure all paths are relative and use forward slashes. - if (path.isAbsolute(x)) { - x = path.relative(tempEntryPointDir, x); - } - if (path.sep === '\\') { - x = x.replace(/\\/g, '/'); - } - return x; - }); - if (bundleName === undefined) { - sources = sources.slice(); - sources.sort(); - bundleName = - require('crypto').createHash('sha256').update(JSON.stringify(sources)).digest('hex') + - '.js'; - } - fs.mkdirSync(tempEntryPointDir, {recursive: true}); - const bundleInputPath = path.resolve(tempEntryPointDir, bundleName); - const source = sources.map(path => `import ${JSON.stringify(path)};\n`).join(''); - fs.writeFileSync(bundleInputPath, source); - return bundleInputPath; +function getEntryPointContents(sources) { + return sources.map((path) => `import ${JSON.stringify(path)};\n`).join(""); } -exports.createEntryPointFile = createEntryPointFile; +const getEntryPointPlugin = (entryPointSources) => { + const entryPointResolveDir = path.resolve(__dirname, ".."); + const plugin = { + name: "entrypoint", + setup(build) { + build.onResolve({ filter: /^neuroglancer_entrypoint\// }, (args) => ({ + path: args.path.substr("neuroglancer_entrypoint/".length), + namespace: "neuroglancer_entrypoint", + })); + build.onLoad( + { filter: /.*/, namespace: "neuroglancer_entrypoint" }, + (args) => { + const m = args.path.match(/(.*)\.bundle.js$/); + if (m === null) return undefined; + const entryPoint = m[1]; + const sources = entryPointSources[entryPoint]; + if (sources === undefined) return undefined; + return { + contents: getEntryPointContents(sources), + resolveDir: entryPointResolveDir, + }; + }, + ); + }, + }; + const entryPoints = Object.keys(entryPointSources).map( + (name) => `neuroglancer_entrypoint/${name}.bundle.js`, + ); + return { plugin, entryPoints }; +}; +exports.getEntryPointPlugin = getEntryPointPlugin; function getCommonPlugins() { - return [svgInlineLoader({removeSVGTagAttrs: false, removeTags: true})]; + return [svgInlineLoader({ removeSVGTagAttrs: false, removeTags: true })]; } exports.getCommonPlugins = getCommonPlugins; class Builder { constructor(options = {}) { - const {id = 'min'} = options; + const { id = "min" } = options; const { - outDir = path.resolve(__dirname, '..', 'dist', id), + outDir = path.resolve(__dirname, "..", "dist", id), python = false, module: moduleBuild = false, define = {}, @@ -75,15 +82,18 @@ class Builder { } = options; this.outDir = outDir; this.cacheId = id; - const viewerConfig = bundleConfig.getViewerOptions({}, { - python, - module: moduleBuild, - }); + const viewerConfig = bundleConfig.getViewerOptions( + {}, + { + python, + module: moduleBuild, + }, + ); this.module = options.module; this.bundleSources = bundleConfig.getBundleSources(viewerConfig); this.minify = minify; this.python = options.python; - this.srcDir = path.resolve(__dirname, '..', 'src'); + this.srcDir = path.resolve(__dirname, "..", "src"); this.plugins = getCommonPlugins(); this.define = define; this.inject = inject; @@ -106,7 +116,7 @@ class Builder { // Ignore errors removing output files } } - } catch { + } catch { // ignore errors listing output directory (e.g. if it does not already exist) } } @@ -120,14 +130,16 @@ class Builder { `; - const {googleTagManager} = this; + const { googleTagManager } = this; if (googleTagManager) { indexHtml += ` +})(window,document,'script','dataLayer',${JSON.stringify( + googleTagManager, + )}); `; } @@ -140,38 +152,43 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= `; - await fs.promises.writeFile(path.resolve(this.outDir, 'index.html'), indexHtml); + await fs.promises.writeFile( + path.resolve(this.outDir, "index.html"), + indexHtml, + ); } - getBaseEsbuildConfig() { + getBaseEsbuildConfig(entryPointSources) { + const { plugin: entryPointPlugin, entryPoints } = + getEntryPointPlugin(entryPointSources); return { outdir: this.outDir, - define: {...this.bundleSources.defines, ...this.define}, + define: { ...this.bundleSources.defines, ...this.define }, inject: this.inject, minify: this.minify, - target: 'es2019', - plugins: this.plugins, - loader: {'.wasm': 'dataurl'}, + target: "es2019", + plugins: [entryPointPlugin, ...this.plugins], + entryPoints, + loader: { ".wasm": "dataurl" }, // TODO(jbms): Remove this workaround once evanw/esbuild#1202 is fixed. banner: { - js: 'function require(x) { throw new Error(\'Cannot require \' + x) }', + js: "function require(x) { throw new Error('Cannot require ' + x) }", }, }; } getWorkerEntrypoints() { - return Object.entries(this.bundleSources.workers) - .map(([key, sources]) => createEntryPointFile(this.cacheId, key + '.bundle.js', sources)); + return this.bundleSources.workers; } - getMainEntrypoint(name = 'main.bundle.js') { - return createEntryPointFile(this.cacheId, name, this.bundleSources.main); + getMainEntrypoint() { + return { main: this.bundleSources.main }; } async build() { const startTime = Date.now(); try { - await fs.promises.mkdir(this.outDir, {recursive: true}); + await fs.promises.mkdir(this.outDir, { recursive: true }); if (this.module) { await this.buildModule(); } else { @@ -189,15 +206,19 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= await this.writeIndex(); if (!this.python) { await fs.promises.copyFile( - path.resolve(this.srcDir, 'neuroglancer/datasource/boss/bossauth.html'), - path.resolve(this.outDir, 'bossauth.html')); + path.resolve(this.srcDir, "datasource/boss/bossauth.html"), + path.resolve(this.outDir, "bossauth.html"), + ); await fs.promises.copyFile( - path.resolve(this.srcDir, 'neuroglancer/util/google_oauth2_redirect.html'), - path.resolve(this.outDir, 'google_oauth2_redirect.html')); + path.resolve(this.srcDir, "util/google_oauth2_redirect.html"), + path.resolve(this.outDir, "google_oauth2_redirect.html"), + ); } const result = await esbuild.build({ - ...this.getBaseEsbuildConfig(), - entryPoints: [this.getMainEntrypoint(), ...this.getWorkerEntrypoints()], + ...this.getBaseEsbuildConfig({ + ...this.getMainEntrypoint(), + ...this.getWorkerEntrypoints(), + }), bundle: true, sourcemap: true, metafile: true, @@ -208,40 +229,44 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= } async buildModule() { - await fs.promises.rmdir(this.outDir, {recursive: true}); - const {outDir} = this; + await fs.promises.rm(this.outDir, { recursive: true }); + const { outDir } = this; // Build workers and main bundle. The main bundle won't be saved, it is // just to analyze dependencies and to generate the CSS bundle. const [mainBuildResult, workerBuildResult] = await Promise.all([ esbuild.build({ - ...this.getBaseEsbuildConfig(), - entryPoints: [this.getMainEntrypoint('main.bundle.js')], + ...this.getBaseEsbuildConfig(this.getMainEntrypoint()), bundle: true, write: false, metafile: true, }), esbuild.build({ - ...this.getBaseEsbuildConfig(), - entryPoints: this.getWorkerEntrypoints(), + ...this.getBaseEsbuildConfig(this.getWorkerEntrypoints()), bundle: true, - }) + }), ]); const metaEntry = mainBuildResult.metafile; - const cssEntry = - mainBuildResult.outputFiles.find(entry => entry.path.endsWith('.css')).contents; - await fs.promises.writeFile(path.resolve(this.outDir, 'main.css'), cssEntry); + const cssEntry = mainBuildResult.outputFiles.find((entry) => + entry.path.endsWith(".css"), + ).contents; + await fs.promises.writeFile( + path.resolve(this.outDir, "main.css"), + cssEntry, + ); const srcDirPrefix = this.srcDir + path.sep; - const dependencies = Object.keys(metaEntry.inputs).filter(x => x.startsWith('src/')); + const dependencies = Object.keys(metaEntry.inputs).filter((x) => + x.startsWith("src/"), + ); const buildResult = await esbuild.build({ - ...this.getBaseEsbuildConfig(), + ...this.getBaseEsbuildConfig({}), entryPoints: dependencies, bundle: false, write: false, - format: 'esm', + format: "esm", }); for (const entry of buildResult.outputFiles) { - if (entry.path.endsWith('.css')) continue; - await fs.promises.mkdir(path.dirname(entry.path), {recursive: true}); + if (entry.path.endsWith(".css")) continue; + await fs.promises.mkdir(path.dirname(entry.path), { recursive: true }); await fs.promises.writeFile(entry.path, entry.contents); } } @@ -251,9 +276,11 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= try { await new Promise((resolve, reject) => { const child = spawn( - process.execPath, [require.resolve('typescript/lib/tsc.js'), '--noEmit'], - {stdio: 'inherit'}); - child.on('close', (code) => { + process.execPath, + [require.resolve("typescript/lib/tsc.js"), "--noEmit"], + { stdio: "inherit" }, + ); + child.on("close", (code) => { if (code === 0) { resolve(); } else { @@ -262,20 +289,23 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= }); }); } finally { - console.log(`Type checked in ${(Date.now() - startTime) / 1000.0} seconds`); + console.log( + `Type checked in ${(Date.now() - startTime) / 1000.0} seconds`, + ); } } typeCheckWatch() { const child = spawn( - process.execPath, - [ - require.resolve('typescript/lib/tsc.js'), - '--noEmit', - '--watch', - '--preserveWatchOutput', - ], - {stdio: 'inherit'}); + process.execPath, + [ + require.resolve("typescript/lib/tsc.js"), + "--noEmit", + "--watch", + "--preserveWatchOutput", + ], + { stdio: "inherit" }, + ); } async buildAndTypeCheck(options) { diff --git a/config/esbuild_svg_inline_loader.js b/config/esbuild_svg_inline_loader.js index 27b0ecc439..1f11732d8f 100644 --- a/config/esbuild_svg_inline_loader.js +++ b/config/esbuild_svg_inline_loader.js @@ -16,15 +16,15 @@ // esbuild equivalent of webpack's svg-inline-loader -const fs = require('fs'); +const fs = require("fs"); -module.exports = function(options) { - const getExtractedSVG = require('svg-inline-loader').getExtractedSVG; +module.exports = (options) => { + const getExtractedSVG = require("svg-inline-loader").getExtractedSVG; return { - name: 'svg-inline-loader', + name: "svg-inline-loader", setup(build) { - build.onLoad({filter: /.*\.svg$/, namespace: 'file'}, async (args) => { - const text = await fs.promises.readFile(args.path, 'utf8'); + build.onLoad({ filter: /.*\.svg$/, namespace: "file" }, async (args) => { + const text = await fs.promises.readFile(args.path, "utf8"); const converted = getExtractedSVG(text, options); return { contents: `export default ${JSON.stringify(converted)};`, diff --git a/config/generate_code.js b/config/generate_code.js index f51b8990b7..b3b2e2c200 100644 --- a/config/generate_code.js +++ b/config/generate_code.js @@ -14,68 +14,94 @@ * limitations under the License. */ -'use strict'; +"use strict"; -let nunjucks = require('nunjucks'); -let fs = require('fs'); -let path = require('path'); +const nunjucks = require("nunjucks"); +const fs = require("fs"); +const path = require("path"); -let rootDir = path.resolve(__dirname, '..'); -let srcDir = path.resolve(rootDir, 'src'); -let templatesDir = path.resolve(rootDir, 'templates'); +const rootDir = path.resolve(__dirname, ".."); +const srcDir = path.resolve(rootDir, "src"); +const templatesDir = path.resolve(rootDir, "templates"); -let env = nunjucks.configure(rootDir, { +const env = nunjucks.configure(rootDir, { autoescape: false, tags: { - blockStart: '/*%', - blockEnd: '%*/', - variableStart: '/*@', - variableEnd: '@*/', - } + blockStart: "/*%", + blockEnd: "%*/", + variableStart: "/*@", + variableEnd: "@*/", + }, }); function writeGenerated(sourcePath, outputPath, contents) { fs.writeFileSync( - path.resolve(rootDir, 'src', outputPath), - `// DO NOT EDIT. Generated from templates/${sourcePath}. -` + contents); + path.resolve(rootDir, "src", outputPath), + `// DO NOT EDIT. Generated from templates/${sourcePath}. +` + contents, + ); } function renderTemplate(sourcePath, outputPath, context) { writeGenerated( - sourcePath, outputPath, env.render(path.resolve(templatesDir, sourcePath), context)); + sourcePath, + outputPath, + env.render(path.resolve(templatesDir, sourcePath), context), + ); } function writeSegmentationCompression() { - let baseDir = 'neuroglancer/sliceview/compressed_segmentation'; + const baseDir = "sliceview/compressed_segmentation"; renderTemplate( - path.join(baseDir, 'encode_common.template.ts'), path.join(baseDir, 'encode_common.ts'), {}); - for (let dataType of ['uint64', 'uint32']) { - let context = {dataType, strideMultiplier: dataType === 'uint64' ? 2 : 1}; - for (let op of ['encode', 'decode']) { + path.join(baseDir, "encode_common.template.ts"), + path.join(baseDir, "encode_common.ts"), + {}, + ); + for (const dataType of ["uint64", "uint32"]) { + const context = { + dataType, + strideMultiplier: dataType === "uint64" ? 2 : 1, + }; + for (const op of ["encode", "decode"]) { renderTemplate( - path.join(baseDir, `${op}.template.ts`), path.join(baseDir, `${op}_${dataType}.ts`), - context); + path.join(baseDir, `${op}.template.ts`), + path.join(baseDir, `${op}_${dataType}.ts`), + context, + ); } } } function makeSubstitutions(inputPath, outputPath, replacements) { - let inputContents = fs.readFileSync(path.resolve(templatesDir, inputPath), {encoding: 'utf-8'}); - for (let patternAndReplacement of replacements) { - inputContents = inputContents.replace(patternAndReplacement[0], patternAndReplacement[1]); + let inputContents = fs.readFileSync(path.resolve(templatesDir, inputPath), { + encoding: "utf-8", + }); + for (const patternAndReplacement of replacements) { + inputContents = inputContents.replace( + patternAndReplacement[0], + patternAndReplacement[1], + ); } writeGenerated(inputPath, outputPath, inputContents); } function writeDataStructures() { - const baseDir = 'neuroglancer/util'; - for (let arrayType - of ['Uint8Array', 'Uint16Array', 'Float32Array', 'Uint32Array', 'Float64Array', - 'Int8Array', 'Int16Array', 'Int32Array']) { + const baseDir = "util"; + for (const arrayType of [ + "Uint8Array", + "Uint16Array", + "Float32Array", + "Uint32Array", + "Float64Array", + "Int8Array", + "Int16Array", + "Int32Array", + ]) { makeSubstitutions( - path.join(baseDir, 'typedarray_builder.template.ts'), - path.join(baseDir, `${arrayType.toLowerCase()}_builder.ts`), [[/\$TYPE\$/g, arrayType]]); + path.join(baseDir, "typedarray_builder.template.ts"), + path.join(baseDir, `${arrayType.toLowerCase()}_builder.ts`), + [[/\$TYPE\$/g, arrayType]], + ); } for (let i = 0; i < 2; ++i) { const nextPrevReplacements = [ @@ -83,12 +109,16 @@ function writeDataStructures() { [/PREV_PROPERTY/g, `prev${i}`], ]; makeSubstitutions( - path.join(baseDir, 'linked_list.template.ts'), path.join(baseDir, `linked_list.${i}.ts`), - nextPrevReplacements); + path.join(baseDir, "linked_list.template.ts"), + path.join(baseDir, `linked_list.${i}.ts`), + nextPrevReplacements, + ); makeSubstitutions( - path.join(baseDir, 'pairing_heap.template.ts'), path.join(baseDir, `pairing_heap.${i}.ts`), - [[/CHILD_PROPERTY/g, `child${i}`], ...nextPrevReplacements]); + path.join(baseDir, "pairing_heap.template.ts"), + path.join(baseDir, `pairing_heap.${i}.ts`), + [[/CHILD_PROPERTY/g, `child${i}`], ...nextPrevReplacements], + ); } } diff --git a/config/karma-entry-points.js b/config/karma-entry-points.js index a1e07d668a..42d2e4a13b 100644 --- a/config/karma-entry-points.js +++ b/config/karma-entry-points.js @@ -14,66 +14,62 @@ * limitations under the License. */ -'use strict'; +"use strict"; -const path = require('path'); -const yargs = require('yargs'); -const glob = require('glob'); -const {parseDefines} = require('./esbuild-cli'); -const {createEntryPointFile, getCommonPlugins} = require('./esbuild'); +const path = require("path"); +const yargs = require("yargs"); +const glob = require("glob"); +const { parseDefines } = require("./esbuild-cli"); +const { createEntryPointFile, getCommonPlugins } = require("./esbuild"); -const getEntryPoint = exports.getEntryPoint = (testPattern) => { - const {argv: {pattern: userPattern}} = yargs.options({ +const getTestSources = (exports.getTestSources = (testPattern) => { + const { + argv: { pattern: userPattern }, + } = yargs.options({ pattern: { - type: 'string', + type: "string", nargs: 1, }, }); let testPaths = glob.sync(testPattern); const userCwd = process.env.INIT_CWD || process.cwd(); if (userPattern !== undefined) { - console.log('Restricting test files by glob pattern: ' + JSON.stringify(userPattern)); + console.log( + "Restricting test files by glob pattern: " + JSON.stringify(userPattern), + ); const userPaths = new Set(glob.sync(path.resolve(userCwd, userPattern))); - testPaths = testPaths.filter(x => userPaths.has(x)); - console.log('Loading tests from: \n' + testPaths.join('\n')); + testPaths = testPaths.filter((x) => userPaths.has(x)); + console.log("Loading tests from: \n" + testPaths.join("\n")); } - return createEntryPointFile('test', undefined, testPaths); -}; + return testPaths; +}); exports.getEntryPointConfig = (testPattern, preprocessors = []) => { - const entryPoint = getEntryPoint(testPattern); + const sources = getTestSources(testPattern); return { - files: [{ - pattern: entryPoint, - watched: true, - type: 'js', - }], - preprocessors: { - [entryPoint]: ['esbuild', ...preprocessors], - }, + files: sources.map((name) => ({ pattern: name, watched: true })), + preprocessors: Object.fromEntries( + sources.map((name) => [name, ["esbuild", ...preprocessors]]), + ), }; }; exports.getEsbuildConfig = () => { - const {argv} = yargs.options({ + const { argv } = yargs.options({ define: { - type: 'array', + type: "array", coerce: parseDefines, default: [], }, }); return { - target: 'es2019', + target: "es2019", plugins: getCommonPlugins(), loader: { - '.json': 'json', - '.dat': 'binary', - '.npy': 'binary', + ".json": "json", + ".dat": "binary", + ".npy": "binary", }, define: argv.define, - // TODO(jbms): Remove this workaround once evanw/esbuild#1202 is fixed. - banner: { - js: 'function require(x) { throw new Error(\'Cannot require \' + x) }', - }, }; }; diff --git a/config/karma-esbuild.js b/config/karma-esbuild.js deleted file mode 100644 index 16a32c9474..0000000000 --- a/config/karma-esbuild.js +++ /dev/null @@ -1,94 +0,0 @@ -/** - * @license - * Copyright 2020 Google LLC - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// karma preprocessor that uses esbuild for bundling. -// -// Also watches dependencies for changes. - -'use strict'; - -const path = require('path'); -const esbuild = require('esbuild'); -const chokidar = require('chokidar'); - -function createPreprocessor(config, emitter, logger) { - const log = logger.create('preprocessor.esbuild'); - - // Maps each reference file to a Set of entry point files. - const reverseDependencies = new Map(); - - let registerDependencies = undefined; - - if (!config.singleRun && config.autoWatch) { - const watcher = chokidar.watch(); - watcher.on('change', changedPath => { - const entryPoints = reverseDependencies.get(changedPath); - if (entryPoints === undefined) return; - for (const entryPoint of entryPoints) { - if (path.sep !== '/') { - entryPoint = entryPoint.replace(/\\/g, '/'); - } - emitter._fileList.changeFile(entryPoint, true); - } - }); - registerDependencies = (entryPoint, dependencies) => { - for (const dep of dependencies) { - let revDeps = reverseDependencies.get(dep); - if (revDeps === undefined) { - watcher.add(dep); - revDeps = new Set(); - reverseDependencies.set(dep, revDeps); - } - revDeps.add(entryPoint); - } - }; - } - - const esbuildConfig = config.esbuild; - - return async function preprocess(original, file, done) { - const originalPath = file.originalPath; - const outFileKey = 'out.js'; - try { - log.info('Generating bundle for ./%s', originalPath); - const results = await esbuild.build({ - sourcemap: 'inline', - ...esbuildConfig, - entryPoints: [originalPath], - outfile: outFileKey, - bundle: true, - write: false, - metafile: true, - }); - const metaEntry = results.metafile; - const dependencies = Object.keys(metaEntry.inputs); - if (registerDependencies !== undefined) { - registerDependencies(originalPath, dependencies); - } - const outputEntry = results.outputFiles.find(entry => entry.path.endsWith(outFileKey)); - done(undefined, '\'use strict\';\n' + outputEntry.text); - } catch (error) { - log.error('Failed to process ./%s\n\n%s\n', originalPath, error.stack); - done(error, null); - } - }; -} - -createPreprocessor.$inject = ['config', 'emitter', 'logger']; - -module.exports = { - 'preprocessor:esbuild': ['factory', createPreprocessor], -}; diff --git a/config/karma.benchmark.js b/config/karma.benchmark.js index fd3b17ab10..09cdff4ac9 100644 --- a/config/karma.benchmark.js +++ b/config/karma.benchmark.js @@ -14,32 +14,37 @@ * limitations under the License. */ -'use strict'; +"use strict"; -const path = require('path'); -const {getEntryPointConfig, getEsbuildConfig} = require('./karma-entry-points'); +const path = require("path"); +const { + getEntryPointConfig, + getEsbuildConfig, +} = require("./karma-entry-points"); -module.exports = function(config) { +module.exports = (config) => { config.set({ - ...getEntryPointConfig(path.resolve(__dirname, '..', 'src', '**', '*.benchmark.ts')), + ...getEntryPointConfig( + path.resolve(__dirname, "..", "src", "**", "*.benchmark.ts"), + ), esbuild: getEsbuildConfig(), - frameworks: ['benchmark'], + frameworks: ["benchmark"], browsers: [ - 'ChromeHeadless', + "ChromeHeadless", // 'Chrome', // 'ChromeCanary', ], colors: true, browserNoActivityTimeout: 60000, - reporters: ['benchmark'], + reporters: ["benchmark"], // logLevel: config.LOG_DEBUG, singleRun: true, plugins: [ - 'karma-benchmark', - 'karma-benchmark-reporter', - 'karma-chrome-launcher', - 'karma-firefox-launcher', - require('./karma-esbuild'), + "karma-benchmark", + "karma-benchmark-reporter", + "karma-chrome-launcher", + "karma-firefox-launcher", + "karma-esbuild", ], }); }; diff --git a/config/karma.conf.js b/config/karma.conf.js index 869bd3d9bc..67ba143761 100644 --- a/config/karma.conf.js +++ b/config/karma.conf.js @@ -14,16 +14,22 @@ * limitations under the License. */ -'use strict'; +"use strict"; -const path = require('path'); -const {getEntryPointConfig, getEsbuildConfig} = require('./karma-entry-points'); +const path = require("path"); +const { + getEntryPointConfig, + getEsbuildConfig, +} = require("./karma-entry-points"); -module.exports = function(config) { +module.exports = (config) => { config.set({ - ...getEntryPointConfig(path.resolve(__dirname, '..', 'src', '**', '*.spec.ts'), ['sourcemap']), + ...getEntryPointConfig( + path.resolve(__dirname, "..", "src", "**", "*.spec.ts"), + ["sourcemap"], + ), esbuild: getEsbuildConfig(), - frameworks: ['jasmine'], + frameworks: ["jasmine"], browsers: [ // 'Firefox', // 'FirefoxHeadless', @@ -33,14 +39,14 @@ module.exports = function(config) { ], colors: true, browserNoActivityTimeout: 60000, - reporters: ['mocha'], + reporters: ["mocha"], plugins: [ - 'karma-sourcemap-loader', - 'karma-jasmine', - 'karma-mocha-reporter', - 'karma-chrome-launcher', - 'karma-firefox-launcher', - require('./karma-esbuild'), + "karma-sourcemap-loader", + "karma-jasmine", + "karma-mocha-reporter", + "karma-chrome-launcher", + "karma-firefox-launcher", + "karma-esbuild", ], }); }; diff --git a/config/resolve_real.js b/config/resolve_real.js index 94e4de39f7..a424a92d39 100644 --- a/config/resolve_real.js +++ b/config/resolve_real.js @@ -14,10 +14,10 @@ * limitations under the License. */ -'use strict'; +"use strict"; -const path = require('path'); -const fs = require('fs'); +const path = require("path"); +const fs = require("fs"); /** * Resolve a path to an absolute path, expanding all symbolic links. This is diff --git a/config/static-site-live-server.js b/config/static-site-live-server.js index 8b06028605..2fb42514db 100644 --- a/config/static-site-live-server.js +++ b/config/static-site-live-server.js @@ -14,8 +14,7 @@ * limitations under the License. */ -'use strict'; - +"use strict"; // Serves a directory of static files, with programmatic control to force a // browser reload. @@ -44,19 +43,21 @@ // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -var fs = require('fs'), - connect = require('connect'), - logger = require('morgan'), - WebSocket = require('faye-websocket'), - path = require('path'), - url = require('url'), - http = require('http'), - send = require('send'), - es = require("event-stream"), - os = require('os'); -require('colors'); - -const getInjectedCode = (initialGeneration) => ` +const fs = require("fs"); +const connect = require("connect"); +const logger = require("morgan"); +const WebSocket = require("faye-websocket"); +const path = require("path"); +const url = require("url"); +const http = require("http"); +const send = require("send"); +const es = require("event-stream"); +const os = require("os"); +require("colors"); + +const getInjectedCode = ( + initialGeneration, +) => `